#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 для меня.