Как найти наибольшее и наименьшее число в массиве в c
Вопрос
Мне нужно найти способ отобразить максимальное и минимальное число в массиве, размер массива равен 100 и не будет превышать его, и проверка ввода не требуется.Программа будет продолжать запрашивать ввод до тех пор, пока не встретится 0, и он тоже будет добавлен в массив.
Я все выяснил, кроме того, как отслеживать, какое значение является наибольшим и наименьшим.Я был бы признателен, если бы кто-нибудь исправил мой код или показал мне. Еще одна проблема, с которой я столкнулся, - это завершить цикл и выполнить расчет максимального/минимального значения внутри цикла 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);
}
Решение
Прежде всего, вы назначаете input
к возвращаемому значению scanf()
.Это количество элементов, назначенных вызовом, и, поскольку вы говорите, что ввод всегда будет правильным, это значение всегда будет 1
.
Во-вторых, вы пишете после конца numbers[]
массив со строкой:
input = scanf("%d", &numbers[100]);
(ты должен сделать scanf("%d, &input)
вместо этого и назначьте numbers[i]
для ввода в ваш цикл.
Наконец, вам не нужно пересчитывать maxvalue
и minvalue
путем итерации numbers[]
каждую итерацию вашего цикла.Вместо этого просто сравните их с input
и назначьте их соответственно.
Надеюсь, это направит вас на правильный путь.
Другие советы
Похоже, ваша главная проблема в том, что вы сравниваете каждое число только с minvalue
.Этого вполне достаточно для принятия решения о замене текущего minvalue
, но, очевидно, это ничего не говорит вам об отношении каждого элемента к maxvalue
.
Другая проблема:имеет смысл инициализировать minvalue из первого элемента, но не в том случае, если вы делаете это в цикле.Это просто сводит на нет всю вашу предыдущую работу.
Вам также необходимо выполнить ту же инициализацию с maxvalue.Вы должны инициализировать это число первым значением.
Вам также следует принять решение о вычислении минимального и максимального значений по мере накопления данных или при их прохождении после завершения.Однако вам не следует перебирать предыдущие элементы с каждым новым.Это приводит к квадратичной временной сложности вашей программы, но это не приносит никакой пользы.
Наконец, не терпите плохого форматирования.Отладка всегда предполагает изучение кода, и вам нужно, чтобы он всегда был идеально отформатирован как для профессионального подхода, так и для облегчения чтения вашей собственной работы.
Вы задаете два вопроса: о стратегии вычисления минимума/максимума и о цикле.Не делайте этого (себе), а решайте одну проблему за раз.Итак, сначала поместите что-то вроде
signed int input[] = { 8, -5 , /* some more values */ };
size_t const n = sizeof input/ sizeof input[0];
в начале и забудь о своем scanf
проблемы.
Затем оберните определение минимального/максимального значения в соответствующую инструкцию цикла.
Затем скомпилируйте свой код с предупреждениями:например -Wall
для gcc
, но это может отличаться в зависимости от вашего компилятора.
Мой мне что-то подсказывает:
тест-numbers.c:21:предупреждение:«maxvalue» может использоваться ненициализированным в этой функции Test-Numbers.c: 22:предупреждение:«MinValue» может использоваться ненициализированным в этой функции
Это говорит о том, что вы делаете что-то очень неправильное, плохо учитывая отправную точку вашего алгоритма.
Я изменил ваш код и заменил большую его часть на `/* ...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
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]);