【问题标题】:finding the average of the largest numbers input out of 3 by the user in c++查找用户在 C++ 中输入的 3 个最大数字的平均值
【发布时间】:2014-09-12 19:09:26
【问题描述】:

所以设计问题是:

输入 3 个数字并显示最大的。继续输入 3 个数字的集合,直到用户想要退出。求所有最大数的平均值。

所以输入数字可以正常工作,但是当我尝试插入 SENTINEL 值以停止循环时,我需要为所有 3 个数字输入它,但它并没有给我过去输入的数字的正确平均值.

非常感谢您的帮助,感谢您的宝贵时间!

 #include <iostream>
 using namespace std;

int main()
{

    const int SENTINEL = -1;
    int num1;
    int num2 = 0;
    int num3 = 0;
    int largest;
    int sum;
    int count;
    float average;

    // initialize the count and sum
    count = 0;
    sum = 0;

    while (num1 != SENTINEL)
    {

        // Prompt user for the first number or to quit
        cout << "If you want to quit enter " << SENTINEL << " to stop\n " << endl;
        cout << "Enter first number  ";
        cin >> num1;

        // Prompt the user for the second number
        cout << "please enter second number                  ";
        cin >> num2;

        // Prompt the user for a third number
        cout << "please enter the third number               ";
        cin >> num3;

        // Compare numbers 1 and 2 for the largest number
        if (num1 > num2)
        {
            largest = num1;
        }
        else
        {
            largest = num2;
        }

        // Compare largest to last number input
        if (num3 > largest)
        {
            largest = num3;
        }

        // Display the largest number
        cout << "largest number is: " << largest << endl;

        // Increment the count
        count++;

    }



    if (count > 0)
    {
        average = sum / count;
        cout << "Average of the numbers is " << average;
    }

    return 0;
}

【问题讨论】:

  • 你在使用之前没有初始化num1,导致undefined behavior。你也不要增加总和。
  • 我将更改它以初始化 num1 谢谢我意识到我尚未添加以增加总和但代码不完整问题我正在分段执行并对其进行测试并卡在了这个部分..

标签: c++ average


【解决方案1】:

使用break; 指令是可能的,但通常被认为不雅且难以维护。

原因是你破坏了代码的流动,你的程序的读者(可能不是你在大程序中或者如果你共享它)期望你的循环代码一直持续到它的结尾.如果你的函数有一个或多个break;instructions,可能很难理解函数的意图,因为你必须记住在哪些情况下循环已经结束。

解决问题的基本原则是在获得 num1 的值之后在正确的位置开始循环。然后你的循环也必须以它结束。这样,您将始终在用户键入 num1 后立即检查退出条件。

// initialize the count and sum
count = 0;
sum = 0;

// Prompt user for the first number or to quit
cout << "If you want to quit enter " << SENTINEL << " to stop\n " << endl;
cout << "Enter first number  ";
cin >> num1;

while (num1 != SENTINEL)
{

    // Prompt the user for the second number
    cout << "please enter second number                  ";
    cin >> num2;

    // Prompt the user for a third number
    cout << "please enter the third number               ";
    cin >> num3;

    // Compare numbers 1 and 2 for the largest number
    if (num1 > num2)
    {
        largest = num1;
    }
    else
    {
        largest = num2;
    }

    // Compare largest to last number input
    if (num3 > largest)
    {
        largest = num3;
    }

    // Display the largest number
    cout << "largest number is: " << largest << endl;

    // Increment the count
    count++;

    // Prompt user for the first number or to quit
    cout << "If you want to quit enter " << SENTINEL << " to stop\n " << endl;
    cout << "Enter first number  ";
    cin >> num1;
}

if (count > 0)
{
    average = sum / count;
    cout << "Average of the numbers is " << average;
}

return 0;

注意:我没有解决这里的代码错误,如 cmets 中所述(未声明变量,未更新总和等)。

【讨论】:

  • 1.您正在复制代码(出现在循环之前和每次迭代结束时的那 3 行),这甚至不如 break 优雅(无论如何,break 有什么不优雅的地方?)。 2. 您忘记了该程序实际运行所需的一件小事(提示:sum 与此有关)。
  • 复制代码确实也不优雅,但我不会说少于break。 break 指令的问题在于它破坏了代码流。在一个小程序中,它可能不是很重要,但你期望一个循环从头到尾一直持续下去。必须寻找其他可能的循环终止使代码更难阅读,并且在许多公司中被禁止或真正不受欢迎。
  • 感谢您的帮助!
【解决方案2】:

在输入 num1 后立即有条件地中断循环。

cin >> num1;
if (SENTINEL == num1)
{
  break;
}

【讨论】:

  • 我不能使用 break 除非它是我尝试过的教练的 switch 语句,哈哈
  • 然后改用continue; :) 它跳转到下一个迭代,然后检查 SENTINEL
【解决方案3】:

之后

cin >> num1;

您可以检查它的 SENTIEL 编号并从循环中中断:

if (num1 == SENTIEL)
    break

这样它就不会执行另一个cin。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2012-09-27
    • 2011-11-09
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    相关资源
    最近更新 更多