2010-09-26 3 views
1

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

У меня все выяснено, кроме как отслеживать, что является самым большим и наименьшим значением. Я был бы признателен, если бы кто-то мог исправить мой код или показать мне. Другая проблема, с которой я столкнулась, заключается в том, чтобы завершить цикл и выполнить вычисления max/min в цикле while, когда вход равен 0.

/* 
============================================================================ 
Name  : test.c 
Author  : 
Version  : 
Copyright : Your copyright notice 
Description : Hello World in C, Ansi-style 
============================================================================ 
*/ 

#include <stdio.h> 
#include <stdlib.h> 
#define n 100 
int main(void){ 


int numbers[n]; 
int i = 1; 
int j; 
     int input; 
int maxvalue; 
int minvalue; 

    printf("Enter the next array element>"); 

input = scanf("%d", &numbers[100]); 



while (input != 0){ 

    numbers[i] = input; 
    i++; 
    printf("Enter the next array element, while loop>"); 
    input = scanf("%d", &numbers[n]); 
    if (input == 0){ 
printf("Enter the next array element, if loop"); 
    numbers[i] = 0; 

    for (j =2;j <= i; j++){ 
    minvalue = numbers[1]; 

    j++; 
    if (numbers[j] > minvalue){ 
    maxvalue = numbers[j] ; 
    } 
    else{ 
    minvalue = numbers[j] ; 
    } 

    } 


    } 
} 


printf("%f\t", maxvalue); 

printf("%f\n", minvalue); 
} 

РЕДАКТОР: Я принял все ваши предложения и отредактировал свой код. Это мой код ниже. Однако это не то, что я ожидаю.

#include <stdio.h> 
#include <stdlib.h> 
#define N 100 
int main(void){ 


    int numbers[N]; 
    int i = 0; 
    int j; 
     int input; 
    int maxvalue; 
    int minvalue; 

      printf("Enter the next array element>"); 

scanf("%d", &input); 



while (input != 0){ 

     numbers[i] = input; 
     i++; 

     if (input == 0){ 
        i++; 
      numbers[i] = 0; 
         minvalue = numbers[0]; 
         maxvalue = numbers[0]; 
         for (j=0;j<=i-1;j++){ 

          if (minvalue >= numbers[j]){ 
           minvalue = numbers[j]; 
          }else if (maxvalue <= numbers[j]){ 
           maxvalue = numbers[j]; 
          } 


         } 

/* min = value of first array element 
max = value of first array element 

begin loop for each array element, index = 0 to (n-1) 

--- if array element value is less than min, set min to this value 
--- if array element value is more than max, set max to this value 

increment index and repeat loop til last index is completed 

average = sum/number of elements (n). 
max and min will hold their correct values.*/ 




     } 
       printf("Enter the next array element, while loop>"); 
    scanf("%d", &input); 
    } 


printf("%d\t", maxvalue); 
printf("%d", minvalue); 
    } 

Это выход, я получаю! Может кто-то решить это для меня.

Enter the next array element>1 
Enter the next array element, while loop>2 
Enter the next array element, while loop>3 
Enter the next array element, while loop>0 
12190144 l6Press [Enter] to close the terminal 

ОКОНЧАТЕЛЬНЫЙ РЕДАКТОР: Я РЕШЕН ЭТО НА МОЕМ СОБСТВЕННОСТИ. Я установил проверку min/max вне основного цикла WHILE, это позволило ввести вход 0 в массив.

#include <stdio.h> 
#include <stdlib.h> 
#define N 100 
int main(void){ 


    int numbers[N]; 
    int i = 0; 
    int j; 
     int input; 
    int maxvalue =1; 
    int minvalue = 1; 
      printf("Enter the next array element>"); 

scanf("%d", &input); 
minvalue = input; 
maxvalue = input; 



while (input != 0){ 
    numbers[i] = input; 

    ++i; 
       printf("Enter the next array element>"); 
    scanf("%d", &input); 

if (input == 0){ 
numbers[i] = 0; 
    ++i; 

    } 

} 
for (j =0;j<i;j++){ 
if (numbers[j] >= maxvalue){ 
           maxvalue = numbers[j]; 
          } 
          if(numbers[j] < minvalue){ 
           minvalue = numbers[j]; 
          } 

} 

printf("%d\t", maxvalue); 
printf("%d\n", minvalue); 

    } 
+2

В C, индекс массива начинается с 0 Вы могли бы использовать 1 без каких-либо ошибок, потому что используете его локально, чтобы вы просто пропустили первый элемент все время, но он будет возиться с каждым программистом на C. – tia

+2

Попробуйте использовать прописные буквы для препроцессорных констант, таких как n, это показывает, что они отличаются от ваших переменных. – 2010-09-26 07:45:05

+0

Пожалуйста, пожалуйста, укажите код когерентно – pmg

ответ

2

Прежде всего, вы присваиваете input для возвращаемого значения scanf(). Это количество элементов, назначенных вызовом, и, поскольку вы говорите, что вход всегда будет правильным, это значение всегда будет 1.

Во-вторых, вы пишете мимо конца numbers[] массива с линией:.

input = scanf("%d", &numbers[100]); 

(вы должны сделать scanf("%d, &input) вместо этого, и назначить numbers[i] для ввода в цикле

Наконец, вам не нужно пересчитывать maxvalue и , итерации по numbers[] каждой итерации вашей петли. Вместо этого просто сравните их с input и назначьте их соответствующим образом.

Надеемся, это положит вас на правильный путь.

+0

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

+0

Редактировать: Я решил это сейчас. Благодарю. –

+0

Поздравляю :) Я рад, что вы это поняли. – 2010-09-27 05:29:54

-3
int cmp(const void *a,const void *b) 
{ 
    return *(const int*)a-*(const int*)b; 
} 
... 
qsort(numbers, 100, sizeof(numbers[0]), cmp); 
printf("\nmin: %d\nmax: %d",numbers[0],numbers[99]); 
+0

-1 Вход останавливается на 0. Нет уверенности, что в массиве будет 100 элементов.* И почему вы чувствуете, что 'qsort()' является хорошим выбором для OP? * – pmg

+2

Ничего себе, это должен быть самый неэффективный метод поиска минимума и максимума, не говоря уже обо всех других проблемах. (ОК, я немного преувеличиваю, но все же O (n log n) по сравнению с O (n) довольно сосут.) – Domenic

+0

@Domenic: хотя я согласен, что этот метод смехотворно неэффективен, «O (n log n) 'и' O (n) 'также может быть одинаковым, если' n' вписывается в машинное слово. 32 (или 64) - довольно маленькая константа. И если он не вписывается в машинное слово, то приращение счетчика позиции в данных для «линейного поиска» является операцией «O (log n)», что делает всю задачу «O (n log n)». . :-) –

2

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

Другая проблема: имеет смысл инициализировать minvalue из первого элемента, но не если вы делаете это в цикле. Это просто аннулирует все ваши предыдущие работы.

Вам также нужно выполнить инициализацию с maxvalue. Вы должны инициализировать это число до первого значения.

Вы также должны принять решение о вычислении min и max при накоплении данных или при прохождении данных по завершении. Однако, что вы не хотите делать, это цикл через прошлые элементы с каждым новым. Это дает вашей программе квадратичную временную сложность без какой-либо выгоды.

И, наконец, не терпите отвратительного форматирования. Отладка всегда включает в себя изучение кода, и вы хотите, чтобы он всегда был отлично отформатирован как для профессионалов, так и для облегчения чтения вашей собственной работы.

2

Вы задаете два вопроса, касающиеся стратегии вычисления min/max и цикла. Не делайте этого (для себя), но решайте одну проблему за раз. Так что первым поставить что-то вроде

signed int input[] = { 8, -5 , /* some more values */ }; 
size_t const n = sizeof input/ sizeof input[0]; 

в начале и забыть о своих проблемах scanf.

Затем заверните обнаружение мин/макс в соответствующей инструкции цикла.

Затем скомпилируйте свой код с предупреждениями: например, -Wall для gcc, но это может отличаться для вашего компилятора.

Минной говорит мне что-то:

тест-numbers.c: 21: предупреждение: 'MAXVALUE' могут быть использованы неинициализированным в этой функции тест-numbers.c: 22: предупреждение: ' MinValue»может быть использовано неинициализированным в этой функции

Это говорит вам, что вы делаете что-то очень неправильно в не считая начальную точку алгоритма хорошо.

0

Я отступы своего кода и заменить много его с `/ * ... PLACEHOLDER ... */

#include <stdio.h> 
#include <stdlib.h> 
#define N 100 
int main(void) { 
    int numbers[N]; 
    int i = 0; 
    int input; 
    int maxvalue; 
    int minvalue; 

    printf("Enter the next array element>"); 
    scanf("%d", &input); 

    while (input != 0) { 
     numbers[i] = input; 
     i++; 

     if (input == 0) { 
      /* ...PLACEHOLDER... */ 
     } 
     printf("Enter the next array element, while loop>"); 
     scanf("%d", &input); 
    } 
    printf("%d\t", maxvalue); 
    printf("%d", minvalue); 
} 

Надеется, вы можете увидеть, что происходит, когда вы вводите 1, или 2, или 3 и когда вы используете 0.

Подсказка: maxvalue и minvalue значения никогда не изменяются.

Еще один намек: сколько раз выполняется линия while()?


Edit с примером выполнения

Для этого примера перспективе, код находится на левой стороне, что происходит на левой стороне

 
     printf("Enter the next array element>"); | 
     scanf("%d", &input);      | Enter 42 
               | 
     while (input != 0) {      | input is 42, so you do the loop 
      numbers[i] = input;     | numbers[0] = 42 
      i++;         | i = 1 
               | 
      if (input == 0) {     | input != 0; skip placeholder 
       /* ...PLACEHOLDER... */   | 
      }         | 
      printf("Enter the next ...>");  | 
      scanf("%d", &input);     | enter 3 
     }          | 
     while (input != 0) {      | input is 3 
      numbers[i] = input;     | numbers[1] = 3 
      i++;         | i = 2 
               | 
      if (input == 0) {     | input != 0; skip placeholder 
       /* ...PLACEHOLDER... */   | 
      }         | 
      printf("Enter the next ...>");  | 
      scanf("%d", &input);     | enter 0 
     }          | 
     while (input != 0) {      | input is 0, skip while body 
      /* ...PLACEHOLDER... */    | 
     }          | 
     printf("%d\t", maxvalue);    | maxvalue hasn't been initialized 
     printf("%d", minvalue);     | minvalue hasn't been changed 
+0

Я не уверен, что вы пытаетесь мне показать. Как изменяется значение min/max? –

+0

См. Аннотированный пробег в моем редактировании – pmg

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