20

你看,我自学了 C++(不完全,我还在拖延 -_-)。所以,现在我开始上大学,他们在教 C,他们让我们做一个输入四个整数的程序,我们必须说出其中最大和最小的。很简单,不是吗?

问题是,我已经对函数和数组有了很好的理解。是的,我可以在数组中编程,没问题。但是由于这是第一个实验室,我们还没有“学习”到,所以我不能使用其中任何一个,这样会很简单。

这就是我在那里写的(不知何故感觉不对)。

#include<stdio.h>

int main(void)
{
    int first, second, third, fourth;
    printf("Enter four integers (separated by space): ");
    scanf("%d %d %d %d", &first, &second, &third, &fourth);

    if((first>second) && (first>third) && (first>fourth))
        printf("\nFirst number is largest");
    else if((second>first) && (second>third) && (second>fourth))
        printf("\nSecond number is largest");
    else if((third>second) && (third>first) && (third>fourth))
        printf("\nThird number is largest");
    else if((fourth>second) && (fourth>third) && (fourth>first))
        printf("\nFourth number is largest");

    if((first<second) && (first<third) && (first<fourth))
        printf("\nFirst number is smallest");
    else if((second<first) && (second<third) && (second<fourth))
        printf("\nSecond number is smallest");
    else if((third<second) && (third<first) && (third<fourth))
        printf("\nThird number is smallest");
    else if((fourth<second) && (fourth<third) && (fourth<first))
        printf("\nFourth number is smallest");

    printf("\n"); 
    return 0;
}

如您所见,它太长、太无聊和太复杂了。但是看到我们现在在课堂上讨论的只是循环决策语句。有没有更优雅的方式来做到这一点?一个使用更少if的 s?并不是说这有什么问题,但它可能会更好。

PS这不完全是“家庭作业”或任何东西。我做了一个程序,我只是想知道我可以做些什么来让它变得更好并学习更好的编程实践。

4

19 回答 19

28

根据OP的条件

但是看到我们现在在课堂上讨论的只是循环决策语句。有没有更优雅的方式来做到这一点?一个使用更少if的 s

只有一个if和一个else if语句和一个for循环可以完成这项任务。简单又简短!

#include <stdio.h>

int main()
{
    int num, max, min;

    printf ("Enter four numbers: ");
    scanf ("%d", &num);
    max = min = num;

    for (int i = 0; i < 3; i++)
    { 
        scanf ("%d", &num);
        if (max < num)
            max = num;
        else if (min > num)
            min = num;
    }

    printf ("The smallest and largest of given four numbers are %d and %d respectively.\n", min,  max);
    return 0;
}
于 2013-10-05T16:31:00.920 回答
13

做一个“手动”合并排序,或者好吧,只是它的第二位:

从概念上讲,合并排序的工作原理如下

  1. 将未排序的列表划分为 n 个子列表,每个子列表包含 1 个元素(1 个元素的列表被视为已排序)。
  2. 重复合并子列表以产生新的子列表,直到只剩下 1 个子列表。这将是排序列表。

合并排序合并步骤图

代码:

int a = 5, b=4, c=7, d=9;
int min_ab, min_cd, min;
min_ab = a < b ? a : b;
min_cd = c < d ? c : d;
min = min_ab < min_cd ? min_ab : min_cd;
printf("%d", min);

..同样适用于最大值。

如果您愿意,可以将三元运算符扩展为if (a < b) { min_ab = a; } else { min_ab = b; }(为了便于阅读,分散在多行中)。

合并排序的复杂度为O(n*log(n)),因此您最多应该需要O(n*log(n)) ifs(请参阅关于合并排序的维基百科文章)。根据维基百科,“......这些都是比较排序,因此在平均或最坏情况下不能比 O(n log n) 表现更好”(来源),所以我认为这在术语上应该不会太远s的最小数量if。尽管您可以尝试查看手动执行其他算法之一是否会导致更少if的 s ;-)。

于 2013-10-05T15:50:43.650 回答
10

尝试这样的事情

int main(void) {
    int a=-2,b=-3,c=-4,d=-5;
    int max=a,min=a;

    if(b>max){
        max=b;
    }else if(b<min){
        min=b;
    }
    if(c>max){
        max=c;
    }else if(c<min){
        min=c;
    }
    if(d>max){
        max=d;
    }else if(d<min){
        min=d;
    }
    printf("max: %d min : %d",max,min);
    return 0;
}

演示

于 2013-10-05T15:44:50.943 回答
9

要求同时找到最大和最小的课堂问题的重点是教你从每次比较中提取最大有价值的信息。

例如,如果您知道这a > b是真的,那么从那个单一的比较中,您应该意识到它a不再是最小的候选者,并且不应再参与任何专门寻找最小的比较。而且,与此同时,您应该意识到它b不再是最大的候选者。有 4 个数字,两次测试a > b,并且c > d已经清楚地将数字分为两个独立的类别:最大的两个候选人和最小的两个候选人。其余的很简单。

换句话说,整个想法是并行找到极值,使用每次比较提供的信息来进一步找到最小值和最大值的任务

if (first > second) { 
  int t = first; first = second; second = t; 
}

if (third > fourth) { 
  int t = third; third = fourth; fourth = t; 
}

/* Now 'first' and 'third' are candidates for the smallest,
   while 'second' and 'fourth' are candidates for the largest */

int min = first < third ? first : third;
int max = second > fourth ? second : fourth;

如您所见,这只需要四次比较即可找到这两个数字。

请注意,上面的代码为您提供了最小值和最大值的,但它没有告诉您提供每个值的数字的原始“索引”。目前尚不清楚是否真的有必要。您的问题文本对此一无所知,而您提供的代码示例实现了它。无论如何,更新上述代码以使其“跟踪”数字的来源并不难。

于 2013-10-05T16:03:02.890 回答
5

这太容易了,因为数字是 a,b,c,d:

#define min(a,b)  ((a) < (b) ? (a) : (b))
#define max(a,b)  ((a) > (b) ? (a) : (b))
biggest  = max (max(a,b), max(c,d))
smallest = min (min(a,b), min(c,d))

给你,没有 if 语句,没有函数(尽管后者是我听说过的最愚蠢和最有害于专家的要求)。

于 2013-10-05T15:42:54.653 回答
2

这是一个没有 if 或 elseif 或 function 或 macro的解决方案,而是使用位移和减法;仅使用单个for循环:

#include <stdio.h>
int main(){

  int num , max, min;

  printf("Enter four numbers: ");
  scanf("%d", &num);
  max = min = num;

  for(int i = 0; i < 3; i++)
  { 
    scanf("%d", &num);
    max = max * (1 - ( (max-num) >> 31) )
        + num *      ( (max-num) >> 31);
    min = min * (1 - ( (num-min) >> 31) )
        + num *      ( (num-min) >> 31);
  }

  printf("\n%d %d", max, min);
  return 0;
}

(max-num) >> 31)操作捕获差异的符号,当乘以第二个数字时,产生比较的最小值。

这来自一个旧的SQL编码技巧,该技巧在该语言中存在CASE WHEN构造之前的日子。

于 2013-10-05T23:47:35.747 回答
2

尝试这个

int max_of_four(int a,int b,int c,int d){
    int max=a;
    if(b>max) max=b;
    if(c>max) max=c;
    if(d>max) max=d;
    return max;
}

没有如果会是这样

int max_of_four(int a, int b, int c, int d) {
    return ((a > b && a > c && a > d) ? a: ((b > c && b > d) ? b : (c > d ? c : d)));
}
于 2018-12-28T20:25:08.133 回答
1

一个想法可能是计算前两个数字的最大值和最小值。然后,你成对比较其余的数字。将每对中较大的一个与当前最大值进行比较,将每对中较小的一个与当前最小值进行比较。这样,您每 2 个元素进行 3 次比较,这比 Arpit 的答案(每个元素进行 2 次比较)稍微高效一些。

在代码中:

#include <stdio.h>

int main(int argc, char **argv) {
    int a, b, c, d;
    printf("Enter four integers (separated by space): ");
    scanf("%d %d %d %d", &a, &b, &c, &d);

    int max, min;
    if (a > b) {
       max = a;
       min = b;
    }
    else {
       max = b;
       min = a;
    }

    if (c > d) {
       if (c > max) {
          max = c;
       }
       if (d < min) {
          min = d;
       }
    }
    else {
       if (d > max) {
          max = d;
       }
       if (c < min) {
          min = c;
       }
    }
    printf("max = %d, min = %d\n", max, min);
    return 0;
}
于 2013-10-05T16:19:11.500 回答
1

对于绝对性能,即。最少的比较和分配。

每个级别的注释显示minmax的候选值。这个想法是减少每个级别的集合,直到每个集合只有一个项目。这只能通过4 次比较和2 次分配来完成。

        // min = a b c d
        // max = a b c d
        if (a <= b)
        {
            // min = a c d
            // max = b c d
            if ( c <= d){
                // min = a c
                // max = b d
                min = a <= c ? a : c;
                max = b > d ? b : d;
            }else{
                // min = a d
                // max = b c
                min = a <= d ? a : d;
                max = b > c ? b : c;
            }
        }
        else
        {
            // min = b c d
            // max = a c d
            if ( c <= d){
                // min = b c
                // max = a d
                min = b < c ? b : c;
                max = a > d ? a : d;
            }else{
                // min = b d
                // max = a c
                min = b < d ? b : d;
                max = a > c ? a : c;
            }
        }
于 2017-06-20T07:07:07.087 回答
1
int max(int a, int b) {
    return a > b ? a : b;    
}

int max_of_four(int a, int b, int c, int d) {
    return max(a, max(b, max(c, d)));
}

int main() {
    int a, b, c, d;
    scanf("%d %d %d %d", &a, &b, &c, &d);
    int ans = max_of_four(a, b, c, d);
    printf("%d", ans);

    return 0;
}
于 2018-07-20T05:42:39.737 回答
0

我看到了这个用于循环和 if else 决策语句的答案,但是我将发布一个我认为运行速度更快并且只使用四个变量的解决方案。所以这里...

#include<stdio.h>
void main()
{
int a,b,c,d;
printf("Enter four numbers of your choice");
scanf("%d%d%d%d",&a,&b,&c,&d);
a>b&&a>c?a>d?printf("%d",a):printf("%d" ,d):(b>c&&b>d)?printf("%d",b):c>d?printf("%d", c):printf("%d",d);
}
于 2017-12-15T06:46:56.543 回答
0

这不使用任何循环,只有 4 个条件:

#include <stdio.h>

int main(void)
{
  int i, j, k, l, t, max, min;

  printf("Enter four integers: ");
  scanf("%d%d%d%d", &i, &j, &k, &l);

  if (i < j) {
    t = i;
    i = j;
    j = t;
  }
  if (k < l) {
    t = k;
    k = l;
    l = t;
  }
  max = (i >= k) ? i : k;
  min = (j <= l) ? j : l;

  printf("Largest: %d\n", max);
  printf("Smallest: %d", min);

  return 0;
}
  

  
于 2020-12-08T18:21:38.420 回答
0

我们可以在这里使用条件语句。

int max,max1,max2,min,min1,min2;
max = (max1 = a>b?a:b)>(max2 = c>d?c:d)?max1:max2 ;
min = (min1 = a<b?a:b)<(min2 = c<d?c:d)?min1:min2 ;
于 2020-05-30T00:01:22.830 回答
0
int max_of_four(int a, int b, int c, int d){
        int res=a;
        if(b/res)
            res=b;
        if(c/res)
            res=c;
        if(d/res)
            res=d;
        return res;
    }
int main() {
    int a, b, c, d;
    scanf("%d %d %d %d", &a, &b, &c, &d);
    int ans = max_of_four(a, b, c, d);
    printf("%d", ans);

    return 0;
}
于 2017-03-29T13:56:40.970 回答
0
 Please have at the following    

 private int GetLargerValue(int num1, int num2, int num3, int num4)
            {
                int largeValue = 0;
                if (num1 > num2)
                {
                    if (num1 > num3)
                        largeValue = (num1 > num4) ? num1 : num4;
                    else
                        largeValue = (num3 > num4) ? num3 : num4;

                }
                else if (num2 > num3)
                    largeValue = (num2 > num4) ? num2 : num4;
                else
                    largeValue = (num3 > num4) ? num3 : num4;

                return largeValue;
            }
于 2016-06-08T11:16:01.153 回答
0
#include <stdio.h>

诠释主要(无效){

int int_1, int_2, int_3, int_4;
int pair_1_largest = 0, pair_1_smallest = 0;
int pair_2_largest = 0, pair_2_smallest = 0;
int quartet_largest = 0, quartet_smallest = 0;

printf("Example: 15 38 8 21\n");

printf("\nEnter four integers: ");
scanf("%d %d %d %d", &int_1, &int_2, &int_3, &int_4);

if(int_1 > int_2)
{
    pair_1_largest = int_1;
    pair_1_smallest = int_2;
}
else
{
    pair_1_largest = int_2;
    pair_1_smallest = int_1;
}

if(int_3 > int_4)
{
    pair_2_largest = int_3;
    pair_2_smallest = int_4;
}
else
{
    pair_2_largest = int_4;
    pair_2_smallest = int_3;
}

if(pair_1_largest > pair_2_largest)
    quartet_largest = pair_1_largest;
else
    quartet_largest = pair_2_largest;

if(pair_1_smallest < pair_2_smallest)
    quartet_smallest = pair_1_smallest;
else
    quartet_smallest = pair_2_smallest;

printf("The largest number is: %d\n", quartet_largest);
printf("The smallest number is: %d\n", quartet_smallest);

return 0;

}

大家好!我是编程初学者,所以不要对我苛刻:) KN King 的“Native C Programming”很有帮助!

于 2018-08-07T09:00:39.437 回答
0
#include <stdio.h>

int max_of_four(int a, int b, int c, int d){
    int mx_A_B = (a > b) * a + (a <= b) * b;
    int mx_C_D = (c > d) * c + (c <= d) * d;

    return (mx_A_B > mx_C_D) * mx_A_B + (mx_A_B <= mx_C_D) * mx_C_D;
}


int main() {
    int a, b, c, d;
    scanf("%d %d %d %d", &a, &b, &c, &d);
    int ans = max_of_four(a, b, c, d);
    printf("%d", ans);
    
    return 0;
}
于 2020-07-31T20:19:24.063 回答
0

这是 C 代码只有 4 个 if 语句。它将最大数量移动到 d 位置,将最小数量移动到一个位置。值 b 和 c 未在序列中正确排列,但由于要求要求最小值和最大值,因此此代码完成了一项工作:

#include <stdio.h>


    int main() {
        int a, b, c, d, temp;
        printf("Enter four digits: ");
        scanf("%d %d %d %d", &a, &b, &c, &d);
        if ( a > b){
            temp = a; a = b ; b = temp;
        }
        if ( c > d){
            temp = c; c = d ; d = temp;
        }
        if ( b > d ){
            temp = b; b = d; d = temp;
        }
        if ( a > c){
            temp = a; a = c ; c = temp;
        }
        printf("Max %d\nMin %d\n", d, a);

        return 0;
    }
于 2016-02-18T05:09:35.417 回答
0
int n1, n2, n3, n4;
int max, min, max1, min1;

printf("Enter 4 integers: ");
scanf("%d %d %d %d", &n1, &n2, &n3, &n4);

max = min = n1;
max1 = min1 = n3;

if (n2 > max) max = n2;
else min = n2;

if (n4 > max1) max1 = n4;
else min1 = n4;

if (max1 > max) max = max1;
if (min1 < min) min = min1;


printf("%d, %d\n", max, min);
于 2021-10-06T19:12:43.587 回答