2011-01-17 5 views
1

Я написал небольшую программу, которая берет 5 чисел от пользователя и сохраняет их в массиве целых чисел. Массив передается функции. Функция используется, чтобы найти наименьшее число в массиве и распечатать его. Искренне результат не правильный, и я не знаю, почему. Функция всегда печатает первый элемент массива, который должен быть наименьшим числом, но это не так.Поиск наименьшего числа в массиве целых чисел

#include <stdio.h> 

void smallestint (int intarray [], int n) 

{ 
    int i; 
    int temp1 = 0; 
    int temp2 = 0; 

    for(i = 0; i < n; i ++) 
    { 

     if (intarray [i] < temp1) 
     { 
      intarray [i-1] = intarray [i]; 
      temp2 = intarray[i]; 
      intarray[i] = temp1; 
      temp1 = temp2; 
     } 
     else 
      temp1 = intarray[i]; 
    } 

    printf("%d\n", intarray[0]); 
} 

int main() 

{ 
    const int n = 5; 
    int temp = 0; 
    int i; 
    int intarray [n]; 

    printf("Please type in your numbers!\n"); 

    for(i = 0; i < n; i ++) 
    { 
     printf(""); 
      scanf("%d", &temp);   
     intarray[i] = temp; 

    } 

    smallestint (intarray, n); 


    getchar(); 
    getchar(); 
    return 0; 
} 


Я обновил свой код. Теперь я инициализирую значения temp перед циклом for. Но он все еще не работает.

+0

Есть ли причина, почему вы сделали вещи более сложными, чем они должны быть, то есть перетасовки содержимое массива вокруг? Кроме того, использование нуля в качестве инициализатора не кажется очень хорошей идеей. См. Limits.h. –

+0

Я смущен вашим алгоритмом. Просто сравните каждое число с предыдущим, сохранив меньшее значение. Используйте 'INT_MAX' как начальное наименьшее значение. И не перетасовывайте массив! – chrisaycock

+0

Или используйте 'intarray [0]' в качестве вашего начального значения (но сначала убедитесь, что '(n> 0)'). –

ответ

8

Если вы просто хотите, чтобы распечатать наименьший элемент массива, речь идет о самых основных способа сделать это:

#include <limits.h> 
#include <stdio.h> 

int smallest(int* values, int count) 
{ 
     int smallest_value = INT_MAX; 
     int ii = 0; 
     for (; ii < count; ++ii) 
     { 
       if (values[ii] < smallest_value) 
       { 
         smallest_value = values[ii]; 
       } 
     } 
     return smallest_value; 
} 

int main() 
{ 
     int values[] = {13, -8, 237, 0, -3, -1, 15, 23, 42}; 
     printf("Smallest value: %d\n", smallest(values, sizeof(values)/sizeof(int))); 
     return 0; 
} 
+3

В значительной степени именно то, о чем я упоминал, минус часть INT_MAX. – sevenseacat

0

Вы повторно инициализируете свою временную переменную на каждой итерации цикла.

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

+0

Я думал, что это была единственная проблема, но перемещение инициализации вне цикла все равно не работает. – chrisaycock

+0

Это похоже на очень сложную работу со всеми элементами массива. Вам просто нужно циклически перебирать массив один раз, проверяя каждое значение на предопределенное значение «min», которое должно быть по умолчанию для intArray [0], а если оно меньше, установите min в intArray [i]. Мое синтаксис может быть немного выключен, прошло несколько лет с тех пор, как я сделал все C. – sevenseacat

0

temp1 переменная должна быть инициализирована ОЧЕНЬ большим значением (например, INT_MAX) внешним контуром.

0

, если вы хотите, чтобы вернуть наименьшее число - не заморачиваться сортировка массива.

во всяком случае,

  • в первой итерации вы поместите первый элемент массива в индекс -1 (который является «законным» в C - но это не то, что вы хотите сделать ...) : intarray [i-1] = intarray [i]. вы должны начать свой цикл с 1.

  • вы используете значение temp1 на каждой итерации (так как вы инициализируете его до 0 внутри цикла). Я предлагаю вам инициализировать его за пределами цикла.

Кстати, если вы будете инициализировать переменную temp1 перед циклом быть intarry [0] (вместо 0), вы будете в состоянии поддерживать отрицательные числа, а также.

1

Наименьшее количество кода придется использовать LINQ:

var example_arr = new [] {3,49, 12, 11, 78, 1}; 
var smallest = example_arr.Select(t=>t).Concat(new[]{INT_MAX}).Min(); 
Смежные вопросы