2013-09-02 3 views
1

Мне нужно найти наименьшее значение, которое больше 0 среди всех целых чисел, хранящихся в массиве. Я пробовал некоторые из способов сделать это в stackoverflow, но мое минимальное значение по-прежнему равно 0 во всех случаях. Что я должен изменить в своем коде, чтобы заставить его работать?Найти наименьшее значение в массиве

int[] userInput = new int[1000]; 
     int counter; 

     Console.WriteLine ("Please input some numbers"); 

     for (counter = 0; counter < userInput.Length; counter++) { 
      string line = Console.ReadLine(); 

      if (line == "" || line == "stop") { 
       break; 
      } else { 
       int.TryParse (line, out userInput [counter]); 
      } 
     } 
     int min = 0; 
     for(int i = 0; i < userInput.Length; i++) 
     { 
      if(userInput[i] > 0) 
      { 
       userInput[i] = min; 
       break; 
      } 
     } 
     for(int i = 0; i < userInput.Length; i++) 
     { 
      if(userInput[i] < min && userInput[i] > 0) 
      { 
       min = userInput [i]; 
      } 
     } 
     Console.WriteLine(min); 
    } 
} 

}

Я хотел бы сделать это без использования LINQ.

+2

Первый цикл переписывает все значения, которые больше, чем 0 с 0. После этого, это не удивительно, что вы получите 0 в качестве результата. .. –

+0

@DanielHilgarth есть перерыв там. Только первый элемент. – I4V

+0

Вы получаете правильные значения в своем массиве ввода? поскольку вы используете int.TryParse, и если при преобразовании «строки» произойдет исключение, массив будет заполнен 0. – wizzardz

ответ

0

Получение значения max/min среди набора значений является очень популярной (и в конечном итоге тривиальной) проблемой программирования.

Ваше сообщение является специализированным экземпляром той же проблемы. В вашем случае вы хотите получить минимальное положительное значение из набора целых чисел.

Ваш код почти правильный. Только замените следующую строку во втором for блоке:

min = userInput[i]; 
+0

Как насчет того, Первый элемент - '0'? – I4V

+0

@ I4V: второй цикл ищет первый элемент> 0. Ошибка в исходном коде - назначить min этому значению вместо другого пути. После коррекции min> 0, если в массиве существует значение> 0. Оставшаяся петля правильна. – TToni

+1

В качестве оптимизации я бы предложил ограничить второй и третий цикл 'counter' вместо' userInput.Length' (который всегда 1000). Кроме того, третий цикл может начинаться с остановки второго. – TToni

-1
array1.Min() 

См this

С помощью метода Min мы находим минимальный элемент или минимальное значение после трансформации.

+0

@anonymous downvoter: Есть комментарии? –

+1

Вопрос запрашивает наименьший элемент, превышающий 0 ... – TToni

+0

Сначала вы должны выбрать все значения выше 0, а затем использовать Min(). Так что это 'array1.Where (n => n> 0) .Min()' – Matthias

0

попробовать это:

int min; 
    int found_positive = 0; // 1 if there's positive element 
    for(int i = 0; i < userInput.Length; i++) 
    { 
     if(userInput[i]>0){ 
     if(found_positive==1){ 
      if(userInput[i]<min) min=userInput[i]; 
     }else{ 
      found_positive=1; 
      min = userInput[i]; 
     } 
     } 
    } 
0
int[] userInput = new int[1000]; 
    int counter; 

    Console.WriteLine ("Please input some numbers"); 

    for (counter = 0; counter < userInput.Length; counter++) { 
     string line = Console.ReadLine(); 

     if (line == "" || line == "stop") { 
      break; 
     } else { 
      int.TryParse (line, out userInput [counter]); 
     } 
    } 
    var min = userinput.Length>0?userInput[0]:0; 
    for(int i = 1; i < userInput.Length; i++) 
    { 
     if(userInput[i] < min && userInput[i] > 0) 
     { 
      min = userInput [i]; 
     } 
    } 

Это сколько должно хватить ...

2

Пример. Вы можете использовать ответ Правеена, но это всего лишь альтернатива.

int[] numbers = { -1, 0, 1, 2, 3, 4, 5 }; 

public int getMinimum(int[] array) 
{ 
    // Since you need larger than 0 
    int minimum = 1; 

    foreach (int elem in array) 
    { 
     minimum = Math.Min(minimum, elem); 
    } 

    return minimum; 
} 

Так вызов getMinimum(numbers) возвратит 1

Надеются, что это помогает.

0

В текущем решении изменить первый экземпляр, что это выше 0 до 0:

if(userInput[i] > 0) 
{ 
    userInput[i] = min; 
    break; 
} 

Вы должны изменить его

min = userInput[i]; 

Хотя этот цикл абсолютно не нужен (и добавляет сложности). Вы бы лучше установка мин до максимально возможного значения INT, используя int.MaxValue, так что в следующий цикл

if(userInput[i] < min && userInput[i] > 0) 
{ 
    min = userInput [i]; 
} 

первое значение будет меньше (или, по крайней мере, равно) мин;

0

Вы должны ограничить список для всех записей выше нуля, а затем искать минимальное минимальное значение, которое ближе всего к нулю, используя метод LINQ Min(). См. Версию, отличную от LINQ, в качестве второго примера ниже.

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Please input some numbers. Use SPACE as separator"); 
      string line = Console.ReadLine(); 
      var userInput = new List<int>(); 

      foreach (string entry in line.Split(' ')) 
      { 
       int number; 
       if (!string.IsNullOrEmpty(entry) && int.TryParse(entry, out number)) 
        userInput.Add(number); 
      } 

      const int lowest = 0; 

      Console.WriteLine("The lowest number above {0} is: {1}", lowest, userInput.Where(n => n > lowest).Min()); 

      Console.WriteLine("Press any key to finish."); 
      Console.ReadKey(); 
     } 
    } 
} 

Non-LINQ пример

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Please input some numbers. Use SPACE as separator"); 
      string line = Console.ReadLine(); 
      var userInput = new List<int>(); 

      int min = int.MaxValue; 

      if (!string.IsNullOrEmpty(line)) 
      { 
       foreach (string entry in line.Split(' ')) 
       { 
        int number; 
        if (!string.IsNullOrEmpty(entry) && int.TryParse(entry, out number)) 
         userInput.Add(number); 
       } 
      } 

      const int lowest = 0; 
      foreach(int number in userInput) 
      { 
       if (number > lowest) 
        min = Math.Min(number, min); 
      } 

      Console.WriteLine("The lowest number above {0} is: {1}", lowest, min); 

      Console.WriteLine("Press any key to finish."); 
      Console.ReadKey(); 
     } 
    } 
} 
1
int[] userInput = new int[1000]; 
int counter; 

Console.WriteLine("Please input some numbers"); 

for (counter = 0; counter < userInput.Length; counter++) 
{ 
    string line = Console.ReadLine(); 

    if (line == "" || line == "stop") 
    { 
     break; 
    } 
    else 
    { 
     int.TryParse(line, out userInput[counter]); 
    } 
} 
int min = 0; 
for (int i = 0; i < userInput.Length; i++) 
{ 
    if (userInput[i] < min && userInput[i] > 0) 
    { 
     min = userInput[i]; 
    } 
} 
Console.WriteLine(min); 

Это будет найти наименьшее число в массиве.

0

ли, что с помощью LINQ, в одной строке:

int[] userInput = new int[1000]; 

var result = userInput.OrderBy(i=>i).SkipWhile(i=>i<=0).First() 
+0

Вы читали эту часть: * Я хотел бы сделать это, не используя LINQ. * – I4V

+0

да, но только после отправки моего ответа :) –

+0

BTW: Зачем вам нужно сортировать вход? 'userInput.Where (x => x> 0) .DefaultIfEmpty(). Min()' – I4V

Смежные вопросы