【问题标题】:How can I improve this GPA calculation code?如何改进此 GPA 计算代码?
【发布时间】:2015-09-17 20:41:02
【问题描述】:

我为一个课程做这个作业,其中用户为每门课程输入 10 个成绩,将字母成绩转换为数值(例如“A”= 4)并将其乘以课程和课程的学分数将从那里计算GPA。它工作得很好,但我想改进这一点,所以当用户输入一个等级时,除了“A”、“B”、“C”、“D”和“F”之外,它不会是任何随机值。

有什么想法吗?我知道涉及一个循环,但我不知道从哪里开始。这是我的代码:

 #include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

int main() {
    //declare variables to store grades, credits, courses and numeric grades
    string letterGrade[10]; //this variable is used to store the user's grades so that we can turn them into numbers
    double numericGrade[10];
    string courses[10] = { "MATH100", "ENG100", "BIO250", "ITM100", "CIS250", "HIST101", "CALC100", "SCI201", "SOC110", "PHY100" };
    int creditForCourses[10] = { 5, 3, 4, 3, 3, 3, 4, 3, 3, 4 };
    double gpa = 0.00;
    int i;

    //this for loop asks the user to enter a grade for each of their courses
    for (i = 0; i < 10; i++) {
        cout << "Enter grade for: " << courses[i] << endl;
        cin >> letterGrade[i];
        }


        //the loop converts the letter grade into a numeric value
    for (i = 0; i < 10; i++) {
        if (letterGrade[i] == "A") {
            numericGrade[i] = 4; //for each if statement, turn a specific letter grade into a value and store it into numericGrade
            }
            else
            if (letterGrade[i] == "B") {
            numericGrade[i] = 3.5;
            }
            else
            if (letterGrade[i] == "C") {
            numericGrade[i] = 3;
            }
            else
            if (letterGrade[i] == "D") {
            numericGrade[i] = 2.5;
            }
            else
            if (letterGrade[i] == "F") {
            numericGrade[i] = 0;
            }
    }





        //calculate gpa by multipling each grade value and each credit from courses
        for (i = 0; i < 10; i++) {
            gpa += (numericGrade[i] * creditForCourses[i]);
        }

        //divide each numeric grade and credit and divide it by 35 (the total amount of credits)
        gpa /= 35;

        //print overall gpa for the student
        cout << "Your GPA is: " << gpa << endl;

    return 0;
}

【问题讨论】:

  • 您是否在询问如何验证和限制用户输入从“A”到“F”?
  • 是的。我很抱歉没有具体说明。

标签: c++


【解决方案1】:

在你的 for 循环中,要求用户为他们的每门课程输入一个成绩,你可以限制用户输入有效的成绩。这是可能有效的代码。

for (i = 0; i < 10; i++)
{
    cout << "Enter grade for: " << courses[i] << endl;
    char grd;
    cin>>grd;
    if(grd=='A'||grd=='B'||grd=='C'||grd=='D'||grd=='F')
      letterGrade[i] = grd;
    else
    {
        cout<<"Please enter valid grade(A, B, C, D, F)"<<endl;
        i--;
    }
}

【讨论】:

  • 一个问题,如果值无效,我是否会返回数组的元素?
  • 如果值无效,则重新要求输入同一课程的成绩。 i--实际上减少了 for 循环增量的影响,因为 i 保持不变。所以如果没有有效的成绩,你就不能走得更远。
  • 我注意到,如果你为第一个元素输入了一个无效的等级,就会出现错误,因为索引被更改为-1,而数组中不存在。
  • 但是当 i 变为 -1 时,它不会检查数组,因为它是最后一个语句。在该语句之后,控制流转到 for 循环的增量部分(i++),i 变为 0,这是有效的。
【解决方案2】:

紧接着

 else
      if (letterGrade[i] == "F") {
          numericGrade[i] = 0;
      }

添加

else {
    cout << "Enter a real grade (A, B, C, D, E, F)" << endl;
    return 1;
}

您可以改为循环,直到他们输入正确的成绩。那会是更好的设计,但这是留给读者的练习......

【讨论】:

  • 我想再给用户一次输入成绩的机会,而不是在他们一次输入错误成绩时结束程序。
  • 提示:在循环内部使用循环。 (while !answerValid)
【解决方案3】:

基本上,当输入无效值时,您需要使用条件循环来包装要求用户输入的代码。除了一个小的重构,试试这样:

for (i = 0; i < 10; i++) {
    cout << "Enter grade for: " << courses[i] << endl;
    for(int done = 0; !done;) {
        cin >> letterGrade[i];

        done = 1; // will be reset back to 0 if no "legal" character is entered

        //the loop converts the letter grade into a numeric value
        if (letterGrade[i] == "A") {
            numericGrade[i] = 4;
        }
        else if (letterGrade[i] == "B") {
            numericGrade[i] = 3.5;
        }
        else if (letterGrade[i] == "C") {
            numericGrade[i] = 3;
        }
        else if (letterGrade[i] == "D") {
            numericGrade[i] = 2.5;
        }
        else if (letterGrade[i] == "F") {
            numericGrade[i] = 0;
        }
        else {
            done = 0;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多