首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果语句与cin语句一起工作,我如何做到这一点?

如果语句与cin语句一起工作,我如何做到这一点?
EN

Stack Overflow用户
提问于 2020-01-16 02:25:42
回答 2查看 156关注 0票数 1

目前,我正在为一个类编写一个程序,其中包含一个带有附加功能的分数平均值计算器的代码。我的代码一直在工作,直到我将最后一行代码添加到平均分数之和和随后的除法中。我觉得我在这里错过了一些显而易见的东西,但我现在很茫然。理想情况下,这个程序将在四个不同的点接受用户的输入,将输入加在一起,然后除以4(因为我目前的分数是4,但一旦我想出了解决这个问题的方法,我就计划增加这个数量)。

最初,我收到错误是因为我要求代码将double变量转换为char变量,然后返回到double变量(错误代码C4244)。我还更改了代码的结尾,将所有等级的和声明为一个单独的变量,因为将所有这些都包含在一个变量GPA中,会导致程序输出一个看似随机的数字。后来我更改了代码,使其流得更均匀,但是现在当我执行程序时,它要求一年级的初始输入,然后跳过二年级、三年级和四年级。

我对C++还是非常陌生的,所以我可能过于复杂我的代码,但我很困惑。

代码语言:javascript
复制
    #include <iostream>
using namespace std;

int GPAAndHonorsCalculator;

int main()
{
    //Declaring initial values
    double A = 4.0;
    double B = 3.0;
    double C = 2.0;
    double D = 1.0;
    double F = 0.0;
    double GPA = 0.0;

    //Created if else statements to handle user input and translation into data for the program to use.
    cout << "Please enter your first grade: " << endl;
    double gradeOne = 0.0;
    cin >> gradeOne;
    if (gradeOne == 'A') {
        gradeOne = 4.0;
    }
    else if (gradeOne == 'B') {
        gradeOne = 3.0;
    }
    else if (gradeOne == 'C') {
        gradeOne = 2.0;
    }
    else if (gradeOne == 'D') {
        gradeOne = 1.0;
    }
    else if (gradeOne == 'F') {
        gradeOne = 0.0;
    }

    cout << "Please enter your second grade: " << endl;
    double gradeTwo = 0.0;
    cin >> gradeTwo;
    if (gradeTwo == 'A') {
        gradeTwo = 4.0;
    }
    else if (gradeTwo == 'B') {
        gradeTwo = 3.0;
    }
    else if (gradeTwo == 'C') {
        gradeTwo = 2.0;
    }
    else if (gradeTwo == 'D') {
        gradeTwo = 1.0;
    }
    else if (gradeTwo == 'F') {
        gradeTwo = 0.0;
    }

    cout << "Please enter your third grade: " << endl;
    double gradeThree = 0.0;
    cin >> gradeThree;
    if (gradeThree == 'A') {
        gradeThree = 4.0;
    }
    else if (gradeThree == 'B') {
        gradeThree = 3.0;
    }
    else if (gradeThree == 'C') {
        gradeThree = 2.0;
    }
    else if (gradeThree == 'D') {
        gradeThree = 1.0;
    }
    else if (gradeThree == 'F') {
        gradeThree = 0.0;
    }

    cout << "Please enter your fourth grade: " << endl;
    double gradeFour = 0.0;
    cin >> gradeFour;
    if (gradeFour == 'A') {
        gradeFour = 4.0;
    }
    else if (gradeFour == 'B') {
        gradeFour = 3.0;
    }
    else if (gradeFour == 'C') {
        gradeFour = 2.0;
    }
    else if (gradeFour == 'D') {
        gradeFour = 1.0;
    }
    else if (gradeFour == 'F') {
        gradeFour = 0.0;
    }
    int gradeSum = gradeOne + gradeTwo + gradeThree + gradeFour;
    GPA = gradeSum / 4;
    cout << GPA;
}

在@LukeH的建议下,我清理了代码,并创建了一个嵌套的while语句。以下是工作代码的一部分:

代码语言:javascript
复制
int main() {

//Declaring initial values, as well as initializing a counter for later loop.
int gradeValue = 0;
int gradeCount = 0;
char userGrade = 0;
double GPA = 0.0;

//Creating while loop with switch statement nested inside to handle large amounts of repeating code.
while (gradeCount!= 4) {
    cout << "Please enter a grade (A, B, C, D, or F): ";
    cin >> userGrade;

    switch (userGrade) {
    case 'A': {
        gradeValue = gradeValue + 4;
        ++gradeCount;
        break;
    }

我对每个年级重复了这个过程,这是一个很好的选择!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-18 19:42:11

我早些时候评论过,但我想如果能有更多帮助的话,我会再详细阐述一下。

看起来,您已经知道了,您试图将一个字符存储在一个双变量中,这会破坏您的代码或产生一些严重的意外结果。与像Javascript这样的语言不同,C++中的变量有一个定义的类型,不能在doublestring之间更改。在您编辑的代码中,您似乎已经解释了这一点,而且您的代码现在运行得更好了。

有一件重要的事情要注意,特别是当你看起来还在学习的时候,当你在编写与你已经写好的代码相同或非常相似的代码块时,应该有一个小小的内部警报在你作为程序员的头脑中发生。"DRY“或”请勿重复“的流行原因是有原因的,它可以帮助您的代码更容易读、写和编辑。

对于您的示例,主函数包含所有的逻辑,而且随着时间的延长,很难解释所编写的代码中正在发生的事情。您的代码大致如下:

代码语言:javascript
复制
int main() {

//Declaring initial values, as well as initializing a counter for later loop.
int gradeValue = 0;
int gradeCount = 0;
char userGrade = 0;
double GPA = 0.0;

//Creating while loop with switch statement nested inside to handle large amounts of repeating code.
while (gradeCount!= 4) {
    cout << "Please enter a grade (A, B, C, D, or F): ";
    cin >> userGrade;

    switch (userGrade) {
        case 'A': {
            gradeValue = gradeValue + 4;
            ++gradeCount;
            break;
        }
        case 'B': {
            gradeValue = gradeValue + 3;
            ++gradeCount;
            break;
        }
        case 'C': {
            gradeValue = gradeValue + 2;
            ++gradeCount;
            break;
        }
        case 'D': {
            gradeValue = gradeValue + 1;
            ++gradeCount;
            break;
        }
        case 'F': { 
            ++gradeCount; // no need to add to value since F=0
            break;
        }
    }

    // logic to display GPA
    // TODO

如果您将用户输入逻辑放在它自己的函数中,您的main()将更加干净。另一个好处是,如果您需要更新获取输入的逻辑(就像您已经做过一次那样),那么您的main()函数根本不需要改变。

那么,您的main()应该是这样的:

代码语言:javascript
复制
int main() {
    // declare variables
    double gradeValue = 0.0;
    int gradeCount = 0;

    // get input
    while(gradeCount < 4) {
        gradeValue += getUserGrade(); // add grade to GPA
        gradecount++;
    }

    // logic to display GPA
    // TODO
}

更容易理解,对吧?在您的getUserGrade()函数中,您只需要有自己的开关语句逻辑,并返回它们输入的等级的双值。我忽略了显示GPA的逻辑,因为这是一项任务,这部分由您来完成。

有了这个更简单的框架,您可以轻松地调整代码,以便能够处理用户希望提供的任意多个级别的输入。如果您有一个选项,让用户键入“已完成”或其他重要的东西时,要求他们的分数,您可以返回一个特殊的值,您的代码在main()可以用来知道什么时候停止接受输入(-1.0将工作,因为这将不是一个有效的GPA)。那么,您的main()应该是这样的:

代码语言:javascript
复制
int main() {
    // declare variables
    double gradeValue = 0.0;
    int gradeCount = 0;

    // get input
    while(true) {
        double usrInput = getUserGrade();

        if(usrInput == -1.0) break; // exit loop if user is done

        gradeValue += usrInput;
        gradecount++;
    }

    // logic to display GPA
    // TODO
}

只需更改几行代码,您现在就可以拥有一个更加灵活的程序了!

票数 1
EN

Stack Overflow用户

发布于 2020-01-16 05:17:49

首先,你用变量A,B,C,D,F来做什么?其次,不能使用双类型变量来存储字符。只需使用char变量获得输入等级,并相应地设置分级变量。另外,如果您计划增加更多的这些等级,那么最好是将它写在一个函数中,然后一次又一次地调用它(或者将函数调用放在一个循环中),这样就避免了代码的重复,并且代码看起来更干净了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59762221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档