Ответ 1
if (a > c)
swap(a, c)
if (a > b)
swap(a, b)
//Now the smallest element is the first one. Just check the 2-nd and 3-rd
if (b > c)
swap(b, c);
Примечание: своп изменяет значения двух переменные.
Есть ли более простой и лучший способ решить эту проблему, потому что
if else
Напишите программу, которая получает три целых числа в качестве входных данных и выводит числа в порядке возрастания.
Не используйте loop/array.
#include <stdio.h>
main(){
int no1;
int no2;
int no3;
int sto;
int hi;
int lo;
printf("Enter No. 1: ");
scanf("%d", &no1);
printf("Enter No. 2: ");
scanf("%d", &no2);
printf("Enter No. 3: ");
scanf("%d", &no3);
if (no1>no2) {
sto=no1;
lo=no2;
} else {
sto=no2;
lo=no1;
}
if (sto>no3) {
hi=sto;
if(lo>no3){
sto=lo;
lo=no3;
}else {
sto=no3;
}
}else hi=no3;
printf("LOWEST %d\n", lo);
printf("MIDDLE %d\n", sto);
printf("HIGHEST %d\n", hi);
getch();
}
if (a > c)
swap(a, c)
if (a > b)
swap(a, b)
//Now the smallest element is the first one. Just check the 2-nd and 3-rd
if (b > c)
swap(b, c);
Примечание: своп изменяет значения двух переменные.
Вызовите три переменные x
, y
и z
, затем:
if (x > y) swap(x, y);
if (y > z) swap(y, z)
if (x > y) swap(x, y);
Запись функции swap
оставлена в качестве упражнения для читателя. Подсказка: вам, возможно, придется использовать указатели.
#include <stdio.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
int main(){
int a, b, c;
int hi;
int lo;
printf("Enter No. 1: ");
scanf("%d", &a);
printf("Enter No. 2: ");
scanf("%d", &b);
printf("Enter No. 3: ");
scanf("%d", &c);
lo = min(min(a, b), c);
hi = max(max(a, b), c);
printf("LOWEST %d\n", lo);
printf("MIDDLE %d\n", a+b+c-lo-hi);
printf("HIGHEST %d\n", hi);
getchar();
}
Подсказка: если у вас есть 3 числа, a, b и c, min (a, min (b, c)) является наименьшим, max (a, max (b, c)) является наибольшим, и данный наименьшее и самое большое число, нужно будет найти третий.
Да, есть намного лучший способ, но вам нужно использовать циклы и массивы.
Возможно, для вводного класса ваш ответ - это ответ, который они ищут.
Есть способы получить цикл с for/while (рекурсия, goto и т.д.). И способы получить что-то вроде массива без индексации (int *ptr = malloc (3 * sizeof(int))
, а затем индексировать с помощью *(ptr+index)
). Но мне трудно думать, что это то, чего они хотят.
Чтобы найти минимальное, среднее и максимальное значения 3, вы можете использовать тернарный оператор. Вы можете либо выполнить всю свою работу в основной части вашего кода, либо вы можете разделить вычисления minof3
, midof3
и maxof3
на функции повторного использования.
В случае min и max вы просто делаете 2 из 3 возможных сравнений, а затем возвращаете сравнение результатов. В случае середины вы делаете то же самое, но вычисляете min и max из трех значений, а затем проверяете все 3 против min и max, чтобы найти значение, которое не является ни минимальным, ни макс. (вы можете сделать эту часть в основной части вашего кода без дополнительной функции, объявив значения min и max в качестве переменных и выполнив их там).
Объединяя фрагменты, вы можете сделать что-то похожее на следующее, которое принимает первые 3 аргумента в качестве значений для сортировки (или использует значения по умолчанию для 99, 231, 8
, если необходимое значение не указано)
#include <stdio.h>
#include <stdlib.h>
/** direct ternary comparison of 3 values */
long minof3 (long a, long b, long c) {
long x = a < b ? a : b,
y = a < c ? a : c;
return x < y ? x : y;
}
long maxof3 (long a, long b, long c) {
long x = a > b ? a : b,
y = a > c ? a : c;
return x > y ? x : y;
}
long midof3 (long a, long b, long c) {
long x = minof3 (a, b, c),
z = maxof3 (a, b, c),
y = a == x ? b : a;
return y == z ? c : y;
}
int main (int argc, char **argv) {
long x = argc > 1 ? strtol (argv[1], NULL, 10) : 99,
y = argc > 2 ? strtol (argv[2], NULL, 10) : 231,
z = argc > 3 ? strtol (argv[3], NULL, 10) : 8;
printf ("\n sorted values : %ld, %ld, %ld\n",
minof3 (x, y, z), midof3 (x, y, z), maxof3 (x, y, z));
return 0;
}
Пример использования/вывода
$ ./bin/sort3
sorted values : 8, 99, 231
$ ./bin/sort3 -23 -281 1031
sorted values : -281, -23, 1031
(да, я знаю, что это старый пост, но, учитывая недавний комментарий о коде, скрытый за функцией swap
, приведен полный пример).
Самый простой способ - сравнить и заменить swap.Order if, если условия важны.
if(a>b)
swap(a,b);
if(a>c)
swap(a,c);
if(b>c)
swap(b,c);
Если мы ищем минимальное количество сравнений в качестве наиболее эффективного решения для сортировки трех элементов, выполните нижеприведенную реализацию
public static void Sort3Elements(int a, int b, int c)
{
if (a <= b && a <= c) //a is lowest here
{
if (b<=c) //a <= b <= c
Console.WriteLine("{0}-{1}-{2}", a, b, c);
else //a <= c <= b
Console.WriteLine("{0}-{1}-{2}", a, c, b);
}
else if (b<=a && b<=c) //b is lowest here
{
if (a <= c) //b <= a <= c
Console.WriteLine("{0}-{1}-{2}", b, a, c);
else //b <= c <= a
Console.WriteLine("{0}-{1}-{2}", b, c, a);
}
else //c is lowest
{
if (a <= b) //c <= a <= b
Console.WriteLine("{0}-{1}-{2}", c, a, b);
else //c <= b <= a
Console.WriteLine("{0}-{1}-{2}", c, b, a);
}
}