Проблема с поиском минимальных и максимальных значений в C - PullRequest
0 голосов
/ 20 июня 2019

У меня проблема с поиском максимального и минимального значения в массиве с 31 объектом.

Я попытался найти максимальное и минимальное значение, поместив оператор if в оператор for, как показано ниже. Кроме того, я хотел найти сумму всех значений массива, но ни одна из этих трех целей не была окончательно успешной

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {
    double july[30], a, b, c;
    a = 0;
    b = 0;
    c = 0;
    int i;
    for (i = 0; i < 31; i++) {
        scanf("%lf", &july[i]);
        a = a + july[i];
        if (july[i + 1] <= july[i]) {
            b = july[i + 1];
        } else
        if (july[i + 1] >= july[i]) {
            c = july[i + 1];
        }
    }
    printf("%lf\n%lf", a, b, c);
    return 0;
}

Когда я запускаю код, я записываю все значения в массив, но в итоге результат становится пустым и выводит: «Процесс завершен через 14,42 секунды с возвращаемым значением 3221225477» Нажмите любую клавишу для продолжения . , . "и ничего больше

Заранее благодарю за помощь

Ответы [ 3 ]

4 голосов
/ 20 июня 2019

Имея double july[30] допустимые индексы от 0 до 29, но имея for(i=0;i<31;i++) формы july[i] доступ к индексам до 30 и формы july[i+1] доступ к индексам до 31, с неопределеннымповедение.

Кроме того, внутри цикла могут быть установлены только записи от 0 до i , поэтому формы july[i+1] в лучшем случае получают доступ к неинициализированной записи массива.Из-за того, что

if(july[i+1]<=july[i]){
    b=july[i+1];
    }
else if(july[i+1]>=july[i]){
    c=july[i+1];

не позволяет найти мин / макс, вам нужно сравнить новую запись с b и c

Чуть выше я сказал, что может быть установлено , потому что вы не проверяете возвращаемое значение с помощью scanf , если не двойное представление, введите scanf останавливается окончательно, чтобы установить записи, в случае ошибки вам необходимо сбросить неверный ввод и повторить scanf .

В printf("%lf\n%lf",a,b,c); вы хотите напечатать 3 значения (сумма, мин и макс), поэтому % lf отсутствует в формате.


Предложение может быть:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {
  double july[30];
  double sum = 0;
  double min = INFINITY;
  double max = -INFINITY;

  for (size_t i = 0; i != (sizeof(july) / sizeof(july[0])); ++i) {
    printf("enter value #%zu : ", i);

    while (scanf("%lf", &july[i]) != 1) {
      fputs("invalid value, reenter it : ", stderr);
      /* flush all the line */
      int c;

      while ((c = getchar()) != '\n') {
        if (c == EOF) {
          fputs("end of file, abort\n", stderr);
          return -1;
        }
      }
    }

    sum += july[i];

    if(july[i] < min)
      min = july[i];
    if (july[i] > max)
      max = july[i];
  }

  printf("sum=%f\nmin=%f\nmax=%f\n", sum, min, max);

  return 0;
}

Компиляция и выполнение

pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out
enter value #0 : 1
enter value #1 : 4
enter value #2 : 2
enter value #3 : 5
enter value #4 : 88
enter value #5 : 78
enter value #6 : 12
enter value #7 : 11
enter value #8 : 3
enter value #9 : -5
enter value #10 : 12 
enter value #11 : 1
enter value #12 : 1
enter value #13 : 1
enter value #14 : 1
enter value #15 : 1
enter value #16 : 1
enter value #17 : 1
enter value #18 : 1
enter value #19 : 1
enter value #20 : 1
enter value #21 : 1
enter value #22 : 1
enter value #23 : 1
enter value #24 : aze
invalid value, reenter it : 1
enter value #25 : 1
enter value #26 : 1
enter value #27 : 1
enter value #28 : 1
enter value #29 : 1
sum=230.000000
min=-5.000000
max=88.000000
pi@raspberrypi:/tmp $ 

Как вы можете видеть

  • Я называю переменную из их поведения, делая код более понятным, в отличие от a, b и c
  • правильный тип для индекса: size_t
  • Я не использую буквенное целое число, но я использую sizeof в для следовать размеру of массив, даже если он изменен
  • Я использую INFINITY для инициализации min , потому что любой действительный double ниже, чем его, и -INFINITY для инициализации max потому что любое действительное double больше, чем оно
  • в случае неверного ввода на scanf Я сбрасываю всю строку перед тем, чтобы повторить, вытакже можно просто прочитать слово, если вы предпочитаете
  • в printf , вам не нужна буква 'l', потому что printf не может получить float чьи преобразуются в double (но 'l' необходим в scanf для чтения double )
0 голосов
/ 21 июня 2019
#include <stdio.h>
int main() {
  int i,min,max,num[10];

for(i=0;i<10;i++)
{
  printf("Enter the Numbers : ");
  scanf("%d", &num[i]);
}
max=num[0];

for(i=1;i<10;i++)
{
  if(max<num[i])
  max=num[i];
  else if(min>num[i])
  min=num[i];
}
printf("Smallest : %d\n", min);
printf("Largest : %d\n", max);
}

Для 10 значений (ввод пользователя). Вы можете изменить размер массива и его параметр в зависимости от ваших потребностей!

0 голосов
/ 20 июня 2019
for (i = 0;i<30;i++) {
    scanf("%lf", &july[i]);
    a = a + july[i];
    if (i == 0)
        b = july[i];
    if (july[i] <= b)
            b = july[i];
    if (july[i] > c)
            c = july[i];
    }

проверка scanf может быть добавлена, как описано выше, при желании

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...