2015-04-02 3 views
1

C Программирование начинающих. Я не понимаю, почему этот код не работает. Числа, которые я получаю как ответы на min и max, - 2686672 и 4525824. Может кто-нибудь объяснить, пожалуйста? Спасибо.найти наименьшее число n целых чисел

#include <stdio.h> 

int main(void) { 
    int array[20], i, x, y; 
    int max, min; 

    printf("Please enter number of integers to be checked\n"); 
    scanf("%d", &x); 

    for (y = 0; y <= x; y++) { 
     printf("Please enter your numbers\n"); 
     scanf("%d", &i); 
    } 

    min = array[0]; 
    max = array[0]; 

    for (y = 0; y <= x; y++) { 
     if (array[i] < min) { 
      min = array[i]; 
     } else if (array[i] > max) { 
      max = array[i]; 
     } 
    } 

    printf("%d is the min and %d is the max", min, max); 
} 
+0

всегда проверяет возвращаемое значение из scanf() и семейство функций, чтобы гарантировать успешность операций ввода/преобразования. – user3629249

+0

Что произойдет, если количество целых чисел для проверки составляет> 20? Запись за конец буфера. И.Е. неопределенное поведение, которое может привести к чему угодно, включая событие сбоя seg. – user3629249

+0

номера вводятся в «i», они должны быть введены в массив [y] – user3629249

ответ

2

Ваш раздел в

for (y=0;y<=x;y++){ 
     printf ("Please enter your numbers\n"); 
     scanf ("%d",&i); 
     } 

Имеет несколько вопросов. Во-первых, вы каждый раз сохраняете значение в i; который будет перезаписан в следующий раз через цикл. Во-вторых, вы хотите < вместо < =, поскольку в противном случае вы запросите слишком много цифр. (Вы также должны проверить, что пользователь запросил < = 20 номеров).

Я думаю, что вы хотите:

for (y=0;y< x;y++){ 
     printf ("Please enter your numbers\n"); 
     scanf ("%d",&array[y]); 
     } 
+0

Незначительный: проверьте оба конца '1 <= x <= 20'. – chux

+0

ОК. это очень ясно. спасибо –

+0

@chux, это не сработает, потому что смещения массива начинаются с 0, а массив из 20 элементов имеет максимальное смещение 19, поэтому предлагаемый код верен. Хотя возвращаемое значение из scanf() необходимо проверить, чтобы убедиться, что действительное значение было успешно введено.(и если не удастся, отобразите сообщение об ошибке, уменьшите счетчик циклов, чтобы снова и снова вводить/преобразовать. – user3629249

2

Вы не хранить ценности, которые вы прочитали в I в массиве, когда у вас есть цикл с просьбой о числах для ввода.

Позже вы индексируете массив с i, но счетчик циклов y - так что я никогда не меняюсь (и это не обязательно действительный индекс, так как он содержит последнее значение, которое было прочитано через scanf).

Проверьте свой код еще раз, чтобы убедиться, что вы действительно храните значения, которые вы читаете в массиве, а затем проверьте, что вы используете для индексов массива при вычислении max и min.

+0

получил это. спасибо за ваше объяснение –

0

написать цикл, чтобы сбросить из массива после его вошел - только так вы можете быть уверены, что вы получите правильный материал

for(i = 0 ; i < x; i++) 
{ 
printf("%d\n", array[i]; 
} 

Кроме того (как уже говорили другие) ваши границы петли должны быть < не < знак равно 10-элементный массив имеет элементы с номерами 0 - 9

1

Вы никогда не храните цифры в массиве. Вы переписываете номер, который вводит пользователь на каждом проходе. Таким образом, вы заканчиваете с данными мусора в конце, независимо от того, что было инициализировано в max и min.

for (y=0;y<=x;y++){ 
     printf ("Please enter your numbers\n"); 
     scanf ("%d",&i); 
     array[y] = i; 
     } 

По крайней мере, таким образом в массиве будет что-то, что можно сравнить с вашим Max/Min Logic позже.

ура.

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