如何确定3个整数的最大和最小值

时间:2012-03-24 23:05:33

标签: c

我正在为大学工作,我必须确定,三个输入数字中的哪一个是最大的,最小的,一个是中间的。但是没有一些价值观(例如2 5 4),我真的不知道我正在经历什么。

我认为我错过了其他的一些情况。

#include<stdio.h>

int main()
{
    puts("Enter three numbers separated by a space to determine what is the greatest, what is the one in the middle and what is the lowest.\n");

    unsigned int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    char z[] = "The three numbers are equal.\n";
    char x1[] = "is greater than the two equal numbers you entered."; char x2[] = "Is less than the two equal numbers you entered.";
    char y1[] = "is the largest,"; char y2[] = "is in the middle"; char y3[] = "is the lowest.";

    if (a==b && b==c && c==a) printf("%s\n",z);
    else if (a>b && b==c) printf("%d %s (%d)\n",a,x1,b); else if (a<b && b==c) printf("%d %s (%d)\n",a,x2,b);
    else if (a>c && c==b) printf("%d %s (%d)\n",a,x1,c); else if (a<c && c==b) printf("%d %s (%d)\n",a,x2,c);
    else if (b>a && a==c) printf("%d %s (%d)\n",b,x1,a); else if (b<a && a==c) printf("%d %s (%d)\n",b,x2,a);
    else if (b>c && c==a) printf("%d %s (%d)\n",b,x1,c); else if (b<c && c==a) printf("%d %s (%d)\n",b,x2,c);
    else if (c>a && a==b) printf("%d %s (%d)\n",c,x1,a); else if (c<a && a==b) printf("%d %s (%d)\n",c,x2,a);
    else if (c>b && b==a) printf("%d %s (%d)\n",c,x1,b); else if (c<b && b==a) printf("%d %s (%d)\n",c,x2,b);

    else if (a>b>c) printf("%d %s %d %s %d %s\n",a,y1,b,y2,c,y3);
    else if (a<b<c) printf("%d %s %d %s %d %s\n",c,y1,b,y2,a,y3);
    else if (b>a>c) printf("%d %s %d %s %d %s\n",b,y1,a,y2,c,y3);
    else if (b<a<c) printf("%d %s %d %s %d %s\n",c,y1,a,y2,b,y3);
    else if (c>a>b) printf("%d %s %d %s %d %s\n",c,y1,a,y1,b,y3);
    else if (c>b>a) printf("%d %s %d %s %d %s\n",c,y1,b,y2,c,y3);
    else if (a<b>c && c<a) printf("%d %s %d %s %d %s\n",b,y1,a,y2,c,y3); // b a c
    else if (a<b>c && a<c && c<b) printf("%d %s %d %s %d %s\n",b,y1,c,y2,a,y3); // b c a
    else if (a<c>b && b<a) printf("%d %s %d %s %d %s\n",c,y1,a,y2,b,y3); // c a b
    else if (a<c>b && a<b) printf("%d %s %d %s %d %s\n",c,y1,b,y2,a,y3); // c b a
    else if (b<a>c && c<b) printf("%d %s %d %s %d %s\n",a,y1,b,y2,c,y3); // a b c
    else if (b<a>c && b<c) printf("%d %s %d %s %d %s\n",a,y1,c,y2,b,y3); // a c b



    else {
        printf("There's no valid data");}
}

我还想询问优化代码的建议。我们的想法是尽可能地优化它。

8 个答案:

答案 0 :(得分:7)

if (a>b>c)

这不符合你的想法。 C不支持“链式条件”(很少有常见语言)。您需要明确检查a > b && b > c。否则你正在比较a和b,如果它产生“真实”结果,在C中是1,你将比较1和c,否则0和c。那肯定不是你想要的。

编辑:至于优化,忘了。专注于让您的程序首先清晰简洁。所以你知道,没有正常的程序应该有像你现在这样的if / else子句这么棒的墙。我首先要做的就是这个,因为这就像拇指一样伸出来。

答案 1 :(得分:4)

你的代码错误的地方在于C ++不能做a < b < c之类的事情。这意味着(a < b) < c1 < c0 < c。你必须a < b && b < c

另外,你在那里做了太多的工作。我不认为我见过这么多else if

您可以定义两个函数来返回两个数字中较大和较小的数字:

int imax(int a, int b) {
    return a < b ? b : a;
}

int imin(int a, int b) {
    return a < b ? a : b;
}

然后在所有三个上使用它来获得高,中,低数字。

int high = imax(imax(a, b), c);
int mid  = imax(imin(imax(a, b), c), imin(a, imax(b, c)));
int low  = imin(imin(a, b), c);

然后进行两次检查,如果它们全部相等,则检查一次,如果两次相等则检查一次。如果这两个检查都不成立,那么它们都是不相等的,您可以给出低,高和中等数字,如下所示:

if (high == mid && mid == low)
    // all numbers are the same
else if (high == mid || high == low || mid == low)
    // two of the numbers are the same
else
    // the numbers are not the same, output high, mid, and low

答案 2 :(得分:2)

您可以使用嵌套ifs编写更简单的代码。我建议开始:

if (a > b) {
   if (b > c) { 
     ...

另外,你知道任何一个数字是否可以相等吗?这会产生很大的不同。

答案 3 :(得分:1)

一个优化建议是在决定输出内容之前对数字进行排序。那么你只有四种情况要处理(所有相等,一个更大,一个更小,都是不等)。

另外,我相信在C中如果你写a < b < c,它首先会将a < b评估为0或1,然后评估1 < c0 < c

答案 4 :(得分:1)

如果您确定哪个是最大的,那么您对其他2有什么了解?分而治之。

答案 5 :(得分:0)

#include<iostream>
using namespace std;`

int main()
{
int in1=0, in2=0, in3=0;
cout << "Enter 1st value: ";
cin >> in1;
cout << "Enter 2nd value: ";
cin >> in2;
cout << "Enter 3rd value: ";
cin >> in3;
//FINDING LARGEST VALUE
if(in1 > in2 && in1 > in3)
{
    cout << in1 << " is largest." << endl;
}
else if(in2 > in1 && in2 > in3)
{
    cout << in2 << " is largest." << endl;
}
else
{
    cout << in3 << " is largest." << endl;
}
 //FINDING MIDDLE VALUE
if((in1 < in2 && in1 > in3) || (in1 > in2 && in1 < in3))
{
    cout << in1 << " is middle." << endl;
}
else if((in2 < in1 && in2 > in3) || (in2 < in1 && in2 > in3))
{
    cout << in2 << " is middle." << endl;
}
else
{
    cout << in3 << " is middle." << endl;
}
//FINDING SMALLEST VALUE
if(in1 < in2 && in1 < in3)
{
    cout << in1 << " is smallest." << endl;
}
else if(in2 < in1 && in2 < in3)
{
    cout << in2 << " is smallest." << endl;
}
else
{
    cout << in3 << " is smallest." << endl;
}

return 0;
}

答案 6 :(得分:-1)

要以不同的方式回答您的问题,以下是您在shell上的数据文件中找到最小和最大数字的方法:

$ echo 2 12 8 > data.txt
$ cat data.txt | tr ' ' '\n' | sort -n | head -n 1
2
$ cat data.txt | tr ' ' '\n' | sort -n | tail -n 1
12

首先cat连接列出的文件的内容,这里只是data.txt(例如,它读取文件)。接下来,tr将空格字符' '转换为换行符'\n'。然后,sort以数字-n对每一行进行排序。最后,head从一开始就打印了一些行,这里是1(例如,最低的数字),而tail从末尾打印了多行(也就是1行)(例如,最高)数)。

答案 7 :(得分:-1)

由于您需要的是三个数字中最小和最大的数字,您可以创建两个函数,一个返回最小值,另一个返回最大值;然后你打印结果。

注意:划分代码是个好主意。具有小功能,一次完成一个小任务。您会发现以这种方式创建代码更容易,而其他人在阅读您的程序时会很感激。

#include <stdio.h>

int smallestVal(int val1, int val2, int val3);
int largestVal(int val1, int val2, int val3);

int main()
{
 //Assuming these are your numbers:
 int first=7;
 int second=4;
 int third=5;

 int smallest=0;  //These are what you aiming for
 int largest=0;

 smallest = smallestVal(first, second, third);
 largest = largestVal(first, second, third);

 printf("smallest=%d  largest=%d\n", smallest, largest);
 return 0;
}

int smallestVal(int val1, int val2, int val3)
{
 int smallest = val1;

 if (val2 <= smallest)
 smallest = val2;

 if(val3 <= smallest)
 smallest = val3;

 //continue adding more if... you need so.
 //but remember to add more arguments to your function.

 return smallest;
}

int largestVal(int val1, int val2, int val3)
{
    int largest = val1;

    if(val2 >=largest)
    largest = val2;

    if(val3 >= largest)
    largest = val3;

    //continue adding more if... you need so.
    //but remember to add more arguments to your function.

    return largest;
}