Добавление способа получения минимального числа рядом с максимальным числом

#c

Вопрос:

Я пытаюсь найти минимальное число рядом с максимальным числом, проблема в том, что если я попытаюсь сделать это в другом операторе if, я получу 0 для всех чисел, есть ли правильный способ добавить способ получения минимального числа ?

 int main() {
  int a, b, c, max = 0, min = 0;
  printf("Enter 3 numbers please : ");
  scanf("%d%d%d", amp;a, amp;b, amp;c);
  if (b > max) {
    max = b;
  }
  if (c > max) {
    max = c;
  }
  printf("Max Num is : %d n", max);
  printf("Min Num is : %d n", min);
}
 

Комментарии:

1. Какова цель a этого ? Должно ли max = a; где-то быть такое место?

2. если бы я попытался сделать это в другом операторе if, я получил бы 0 по всем числам . Я не уверен, что вы имеете в виду под этим, не могли бы вы показать код, который вы пробовали?

3. Да, вы должны инициализировать свой int min = INT_MAX; или на какое-то другое очень большое число, которое, по крайней мере, равно вашему ожидаемому максимальному числу. Другой подход заключается в инициализации int min = a, max = a; после того, как вы прочитаете первый входной номер a .

4. обычно значение max всегда инициализируется как минимально возможное значение, и min предполагается, что оно должно быть инициализировано как максимально возможное значение.

5. Да, очевидно, я просто указывал на традиционный подход, здесь он может просто назначить их любой из трех переменных.

Ответ №1:

есть ли правильный способ добавить способ получения минимального номера ?

Есть много способов сделать это, и это основано на мнении, которое является лучшим.

Но одним из критериев является то, что он работает правильно. В настоящее время ваш код не таков, как он полностью игнорирует a

Чтобы сохранить стиль кодирования, используемый в вопросе, можно было бы сделать:

   max = a;
  if (b > max) {
    max = b;
  }
  if (c > max) {
    max = c;
  }
  min = a;
  if (b < min) {
    min = b;
  }
  if (c < min) {
    min = c;
  }
 

Другой способ

   max = (a > b) ? a : b;
  max = (c > max) ? c : max;
  min = (a < b) ? a : b;
  min = (c < min) ? c : min;
 

или

   max = (a > b) ? a : b;
  if(c > max) max = c;
  min = (a < b) ? a : b;
  if(c < min) min = c;
 

или

   int max_int(int x, int y)
  {
      if (x > y) return x;
      return y;
  }

  int min_int(int x, int y)
  {
      if (x < y) return x;
      return y;
  }

  max = max_int(max_int(a, b), c);
  min = min_int(min_int(a, b), c);
 

или

 #define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define MIN(x, y) (((x) < (y)) ? (x) : (y))

max = MAX(MAX(a, b), c);
min = MIN(MIN(a, b), c);
 

или … многими другими способами.

Вы также можете переписать программу и использовать цикл:

 #include <stdio.h>
#include <limits.h>

#define NUMBERS_TO_READ 3

int main(void )
{
    int number;
    int max = INT_MIN;
    int min = INT_MAX;
    for (int i=0; i < NUMBERS_TO_READ;   i)
    {
        if (scanf("%d", amp;number) != 1) exit(1);
        if (number > max) max = number;
        if (number < min) min = number;
    }
    printf("Max Num is : %d n", max);
    printf("Min Num is : %d n", min);
    
}
 

Ответ №2:

Вы инициализируете свое max значение, и это хорошо, но для того, чтобы сделать его полезным, вам, возможно, потребуется инициализировать его до более удобного значения.
Поэтому я думаю о наименьшей ценности max , которой даже не может быть. Как max int и , я думаю INT_MIN , это значение, определенное в уже существующем файле заголовка «limits.h», поэтому ваш код становится:

 #include <limits.h>
max = INT_MIN;
...
 

Для min , вы могли бы сделать то же самое, инициализируя INT_MAX .

Комментарии:

1. Инициализация max до INT_MAX — это действительно плохая идея

2. Ага. Вместо этого он может быть присвоен первому значению входных данных перед сравнением

3. @4386427: когда я прочитал ваш комментарий, я понял, насколько глупым был мой ответ, поэтому я обновил его.

4. @NeWi-SL: ты прав. У меня просто складывается впечатление, что автор просто изучает программирование, что означает: первая инициализация с нуля, вторая инициализация с более удобным значением, отсюда мое (обновленное, упс) предложение.

5. как вы и @Yunnosch предположили, ваше решение будет работать, если значения поменяются местами при инициализации. Например, min=INT_MAX и max=INT_MIN . Я не пробовал, но, думаю, это может сработать. Отличная идея

Ответ №3:

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

 #include <stdio.h>

int main ()
{
  int max = 0, min = 0, tmp = 0;

  printf ("Enter 3 numbers please : n");

  for (int i = 0; i < 3; i  )
  {
      printf ("%d:", (i   1));
      scanf ("%d", amp;tmp);

      if(i==0)
        max = min = tmp;

      min = (tmp < min) ? tmp : min;
      max = (tmp > max) ? tmp : max;
  }
  printf ("Max Num is : %d n", max);
  printf ("Min Num is : %d n", min);

  return 0;
}
 

[Обновление]
Я полагаю, что будет удобнее, если вы воспользуетесь способом, предложенным в решении Доминика. Вместо строки ниже,

       if(i==0)
        max = min = tmp;
 

Используйте его в самом начале.

Комментарии:

1. Извините, произошла ошибка, я ее исправлю.

2. @4386427 Я исправил это, теперь я получаю ожидаемые o/p. пожалуйста, посмотрите

3. @Yunnosch Я думаю, что теперь все исправлено, но я бы так не поступил. Лучшее решение IMO было бы int max = INT_MIN, min = INT_MAX

4. Есть и другие способы, возможно, более элегантные, но это должно сработать сейчас. (И я кое-что пропустил, когда писал свой предыдущий комментарий. ….. Прости.)

5. Просто для обучения (тоже не мое любимое решение) попробуйте поменять местами INT_MAX и INT_MIN для значений инициализации. Я думаю, что вы использовали «победитель» для init, вам нужно использовать другой, «проигравший». Дважды проверьте предлагаемый код в комментарии 438s для меня.