Как найти самое большое и наименьшее число в массиве в c - PullRequest
1 голос
/ 26 сентября 2010

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

Я все выяснил, кроме как отслеживать, какое значение является наибольшим и наименьшим.Я был бы признателен, если бы кто-то мог исправить мой код или показать мне. Другая проблема, с которой я сталкиваюсь, заключается в том, чтобы заставить цикл завершиться и выполнить вычисления 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

ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: Я РЕШЕН НА ЭТОМ СОБСТВЕННОМ.Я поставил проверку мин / макс за пределами основного цикла 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);

    }

Ответы [ 5 ]

2 голосов
/ 26 сентября 2010

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

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

в начале и забудьте о ваших scanf проблемах.

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

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

Моя песня говорит мне что-то:

test-numbers.c: 21: предупреждение: 'maxvalue' может быть использован неинициализирован в этом Функция test-numbers.c: 22: предупреждение: minvalue может использоваться неинициализированным в этой функции

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

2 голосов
/ 26 сентября 2010

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

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

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

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

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

2 голосов
/ 26 сентября 2010

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

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

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

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

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

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

0 голосов
/ 27 сентября 2010

Я переписал ваш код и заменил его на `/ * ... 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()?


Редактировать с примером выполнения

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

        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 голосов
/ 26 сентября 2010
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]);
...