2015-11-12 4 views
-5

У меня есть осмысление, и я немного потерян. В массиве из 10 (или менее) номеров, которые пользователь вводит (у меня есть эта часть), мне нужно найти второе наименьшее число. Мой друг прислал мне этот код, но мне трудно понять его и написать его в C#:Сортировка чисел массивов в C#

Решил! :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int vnesena; 
      int? min1 = null; 
      int? min2 = null; 
      for(int i=1; i<11; i=i+1) 
      { 
       Console.WriteLine("Vpiši " + i +"." + " število: "); 
       vnesena = Convert.ToInt32(Console.ReadLine()); 

       if (vnesena == 0) 
       { 
        break; 

       } 
       if (min1 == null || vnesena < min1) 
       { 
        min2 = min1; 
        min1 = vnesena; 
       } 
       else if (vnesena != min1 && (min2==null || vnesena<min2)) 
       { 
        min2 = vnesena; 
       } 



      } 


      if (min1 == null || min2 == null) 
      { 
       Console.WriteLine("Opozorilo o napaki"); 
      } 
      else 
      { 
       Console.WriteLine("Izhod: " + min2); 
      } 


      Console.ReadKey(); 


     } 
    } 
} 
+1

Это не C# - это псевдокод. – Tim

+6

Если вы попросили вашего друга помочь с C#, и он вас отправил, он не ваш друг! – Jamiec

+2

Покажите нам C#, который вы написали до сих пор. –

ответ

3

Этот код является слишком сложным, поэтому попробуйте что-нибудь подобное.

int[] numbers = new int[10]; 
for (int i = 0; i < 10; i++) 
{ 
    numbers[i] = int.Parse(Console.ReadLine()); 
} 
Array.Sort(numbers); 
Console.WriteLine("Second smallest number: " + numbers[1]); 

Если код не слишком очевиден, позволь мне объяснить:

  1. Объявить массив из 10 целых чисел
  2. Loop 10 десять раз, и каждый раз, попросите пользовательский ввод ввода & места как целое число с массивом
  3. Сортируйте массив таким образом, чтобы каждое число находилось в порядке количества (наименьшее число, самое большое последнее).
  4. Первое целое число наименьшее (ввод с индексом 0, поэтому числа [0]), а второе наименьшее - это числа [1].

Конечно, для того, чтобы этот кусок кода работал, вы должны использовать этот код в консольной программе.

Как вы не отметили, если вам разрешено использовать встроенные функции сортировки и т. Д., Я предполагаю, что Array.Sort() действителен.

EDIT: Вы обновили свою тему, чтобы изменить свой код в соответствии с критериями.

int[] numbers = new int[10]; 
bool tooShortInput = false; 
for (int i = 0; i < 10; i++) 
{ 
    int input = int.Parse(Console.ReadLine()); 
    if (input != 0) 
    { 
     numbers[i] = input; 
    } 
    else 
    { 
     if (i == 2) 
     { 
      Console.WriteLine("You only entered two numbers!"); 
      tooShortInput = true; 
      break; 
     } 
     else 
     { 
      for (int j = 0; j < 10; j++) 
      { 
       if (numbers[j] == 0) 
       { 
        numbers[j] = 2147483647; 
       } 
      } 
      break; 
     } 
    } 
} 
// Sort the array  
int temp = 0; 

for (int write = 0; write < numbers.Length; write++) { 
    for (int sort = 0; sort < numbers.Length - 1; sort++) { 
     if (numbers[sort] > numbers[sort + 1]) { 
     temp = numbers[sort + 1]; 
     numbers[sort + 1] = numbers[sort]; 
     numbers[sort] = temp; 
     } 
    } 
} 

if (!tooShortInput) 
{ 
    Console.WriteLine("Second smallest number: " + numbers[1]); 
} 

Если вы не поняли обновленный код, сообщите мне, я объясню.

ПРИМЕЧАНИЕ. Это быстро закодировано и протестировано с помощью телефона Android, поэтому, очевидно, этот код не имеет 5-звездочного качества, даже не закрывается, но он имеет право :-).

С уважением, TuukkaX.

+0

обновил мою тему, не разрешил использовать сортировку –

+1

@ReneVucko Обновлен мой код. Не использует встроенные функции сортировки и отлично работает. Кодекс очень низок, если не сказать больше, но он работает. Механизм сортировки в коде называется «сортировка пузырьков». – TuukkaX

2

Перефразируя код заданного:

  1. Set 2 переменные ни к чему. (Это так, что может быть проверка сделано позже. int? может быть использована, если вы хотите использовать null для одной идеи здесь.
  2. Начало цикла через значения.
  3. Получить следующее значение.
  4. Если минимальный ISN» t set или новое значение ниже минимального, замените второй самый низкий с прежним наименьшим и самым низким с новым значением, которое было введено.
  5. В противном случае проверьте, не отличается ли новое значение от минимума, и если минимум не установлен или введенное значение ниже второго наименьшего, а затем заменяет второе низшее на это новое значение.
  6. После того, как loo p выполняется, если либо минимальное значение не заполняется, а затем выводится, то нет такого значения, иначе выводится второе наименьшее значение.

Представьте, что вам нужно было сделать это вручную. Вероятно, вы будете отслеживать наименьшее значение и второе наименьшее значение при прохождении через массив, и программа просто автоматизирует этот процесс. В чем проблема?

Это грубый перевод того, что дал вам ваш друг, что не так сложно перевести на мой взгляд.

 int enteredValue; 
     int? smallest = null, secondSmallest = null; 

     for (int i = 0; i < 10; i = i + 1) 
     { 
      Console.WriteLine("Vpiši " + i+1 + " število: "); 
      enteredValue = Convert.ToInt32(Console.ReadLine()); 
      if (smallest==null || enteredValue<smallest) { 
        secondSmallest=smallest; 
        smallest = enteredValue; 
      } else if (enteredValue!=smallest && enteredValue<secondSmallest) { 
        secondSmallest= enteredValue; 
      } 
     } 
+0

Боковое примечание. Объяснения правильных алгоритмов можно найти по https://www.bing.com/search?q=c%23+select+kth+min как [Как найти k-й наибольший элемент в несортированном массиве длины n в O (n)?] (http://stackoverflow.com/questions/251781/how-to-find-the-kth-largest-element-in-an-unsorted-array-of-length-n-in -on) –

+0

Все еще не знаю, как это решить –

+1

Как близко к тому, чтобы быть ложкой ответа, вы ожидаете здесь? Есть ли какая-то часть, которую вы хотите разработать? Я даже перевел алгоритм друга. Если вы хотите больше, я бы предложил нанять частных преподавателей, чтобы сделать для вас работу, поскольку это приближается к этому, ИМО. –

0

Зачем использовать цикл и не использовать метод Array.Sort?

 int[] numbers = new int[4] { 4, 2, 6, 8 }; 

     Array.Sort(numbers); 

     int secondSmallestNumber = numbers[1]; 
+0

обновил мою тему, не разрешил использовать сортировку –

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