Как найти максимальные и минимальные значения в цикле while - c - PullRequest
0 голосов
/ 07 октября 2018

Я знаю, что это очень простой вопрос для вас, но для меня, как для начинающего, очень сложный.Чтобы добраться до вещи.Я должен создать программу, которая будет принимать столько чисел, сколько я захочу, а затем писать из них max и min.Числа могут иметь десятичные дроби, поэтому удваиваются.Все идет отлично, пока я снимаю проблемы, пока не начнется цикл.Я всегда получаю 0 на выходе при минимальных и максимальных значениях.Кто-нибудь знает почему?Код:

 main() {
  int a = 0, b = 0, min = 1000, max = 0;
  printf("How many numbers do you want to enter\n");
  scanf("%d", & a);
  b = a;
  double n[b];
  printf("Write those numbers\n");
  for (b = 0; a > b; b++) {
    scanf("%lf", & n[b]);
  }
  b = 0;
  while (1) {
    if (n[b] < n[b + 1])
      max = n[b + 1];
    if (min > n[b])
      n[b] = min;
    b++;
    if (b == a)
      break;
  }
  printf("Minimum: %lf\nMaximum: %lf", min, max);
}

Ответы [ 3 ]

0 голосов
/ 07 октября 2018

Печать int с использованием спецификатора преобразования для double не очень хорошая идея, но вызывает печально известное неопределенное поведение.

Компилятор, возможно, заметил вас об этом.Если этого не произошло, увеличьте уровень предупреждения.Для GCC используйте -Wall -Wextra -pedantic.

. Чтобы исправить это, либо сделайте min и max be double

  int a = 0, b = 0;
  double min = 1000., max = 0.; /* Such initialisations limit your input. */

или оставьте их int (снижение точности)и распечатайте их как есть, а именно: int

  printf("Minimum: %d\nMaximum: %d\n", min, max);
0 голосов
/ 07 октября 2018

Я знаю, что опаздываю, но я думаю, что это лучший способ сделать эту программу

#include <stdio.h>

int main() {
    int a = 0;
    double min;
    double max;
    int counter = 1;
    printf("How many numbers do you want to enter\n");
    scanf("%d", & a);
    double n[a];
    double val;
    printf("Write those numbers\n");
    scanf("%lf", & val);
    min = val;
    max = val;
    while(counter < a)
    {  
        scanf("%lf", & val);
        if(val < min)
        {
            min = val;
        }
        if(val > max)
        {
            max = val;
        }
        counter++;
    }
    printf("Minimum: %lf\nMaximum: %lf\n", min, max);
    return 0;
}

это будет чтение значений, и оно не зависит от заданных минимума и максимума, так что вы можете иметьминус и минус минус и минус, если вы запускаете его, как вы определили minn и max, невозможно иметь минимум ниже 1000, и это, как правило, не очень хорошая идея, так как вы можете иметь min быть любым, а max быть любым. (в двойном диапазоне)

Я программист на С ++, а не программист, но это кажется лучшей идеей.

0 голосов
/ 07 октября 2018

Существует несколько проблем:

  1. Вы определили min как 1000, что если все введенные числа будут больше этого?
  2. min и max должныбыть также удваивается
  3. Используя n[b + 1], когда b == a вы достигнете границ массива

Самый оптимальный способ решить эту проблему - вычислить мин / макс в одном цикле, вот так:

main() {
    int i, len;
    double tmp, min = NAN, max = NAN; // its better to initialize values to NAN to cover case when len is 0
    printf("How many numbers do you want to enter\n");
    scanf("%d", & len);
    for (i = 0; i < len; ++i) {
        scanf("%lf", & tmp);
        if ((i == 0) || (tmp < min)) min = tmp;
        if ((i == 0) || (tmp > max)) max = tmp;
    }
    printf("Minimum: %lf\nMaximum: %lf\n", min, max);
}
...