【问题标题】:C++ Grading System [duplicate]C ++评分系统[重复]
【发布时间】:2013-04-20 14:20:46
【问题描述】:

所以我尝试用 C++ 做一个评分系统。例如,A+ 给出 4.0,A 给出 4.0,A- 给出 3.7。对于每个 + - 有 0.3 的差异。这是我的代码:

        char grade_letter[3];
float value; 
bool input = true;

do{
    cout << "Enter letter grade : ";
    cin>>grade_letter;

    switch(grade_letter[0])
    {
    case 'A' : value = 4;
        break;
    case 'B' : value = 3;
        break;
    case 'C' : value = 2;
        break;
    case 'D' : value = 1;
        break;
    case 'E' : value = 0;
        break;
    }

    if(grade_letter[1]=='+'){
        value += 0.3;
    }
    else if (grade_letter[1]=='-'){
        value -= 0.3;
    }

    if (input == true){
        if(value > 4.0){
            cout << "The numeric value is " << floor(value + 0.5) << endl;
        }else if (value < 0.0){
            cout << "Grade out of range. " << endl;
        }else{
            cout<< "The numeric value is " << value <<  endl;
        }
    }else {
        cout << "Invalid input." << endl;
    }
}while(input == false);

当我尝试使用 A+ A 和 A- 时它可以工作。但是,我尝试使用 A=、A/、A*,结果仍然显示每个等级的默认值。验证有问题。

如果我将布尔输入默认值设置为 false,它只适用于 A+ A- 等等,只要输入中有 + 和 - 即可。我正在考虑使用字符串和子字符串来读取输入,但如果是这样,我必须重新编码所有内容。

那么,有人可以帮我验证一下吗?我尝试使用 charAt 检查 chargrade_letter 的长度,但出现错误。

提前致谢。

【问题讨论】:

  • @DanielDaranas 我猜这是上一步。
  • @sftrabbit 可能,但在这两种情况下,标题都没有说明真正的问题,这会导致混淆。
  • 呀呀那个未经验证的。我今天上课,我的老师要求验证。我已经尝试过了,但它无法正常工作

标签: c++ if-statement while-loop


【解决方案1】:

您需要进行以下更改:(1) 为您的开关添加一个默认值以将输入设置为 false,(2) 在检查 + 或 - 的 if 语句系列中添加一个 else,以便如果存在除了字符串结尾之外的某个字符,输入将被设置为假,并且 (3) 将 + 或 - 号上的检查移到检查输入是否为真之后。

char grade_letter[3];
float value; 
bool input = true;

do{
    cout << "Enter letter grade : ";
    cin>>grade_letter;

    switch(grade_letter[0])
    {
    case 'A' : value = 4;
        break;
    case 'B' : value = 3;
        break;
    case 'C' : value = 2;
        break;
    case 'D' : value = 1;
        break;
    case 'E' : value = 0;
        break;
    default:
        input = false;
        break;
    }

    if (input == true){
        if(grade_letter[1]=='+'){
            value += 0.3;
        }
        else if (grade_letter[1]=='-'){
            value -= 0.3;
        } else if (grade_letter[1]){
            // something other than end of string so bad input
            input = false;
        }
        if (input) {
            if(value > 4.0){
                cout << "The numeric value is " << floor(value + 0.5) << endl;
            }else if (value < 0.0){
                cout << "Grade out of range. " << endl;
            }else{
                cout<< "The numeric value is " << value <<  endl;
            }
        }
    }
    if (! input) {
        // at some point we have bad input so let user know.
        cout << "Invalid input." << endl;
    }
}while(input == false);

【讨论】:

  • 完美运行。非常感谢
【解决方案2】:

因此,您在验证中遗漏了两个地方。

一、等级字母:

switch(grade_letter[0])
{
case 'A' : value = 4;
    break;
case 'B' : value = 3;
    break;
case 'C' : value = 2;
    break;
case 'D' : value = 1;
    break;
case 'E' : value = 0;
    break;
default: 
    valid = false;  // What we don't recognize is invalid
    break;
}

然后是第二部分验证:

if (valid)  // continue verification only if valid
{
    switch(grade_letter[1])
    {
    case '+': value += 0.3; break;
    case '-': value -= 0.3; break;
    case ' ': 
    case '\0': break; // we assume space and EOL is OK
    default: valid = false; break;
    }
}

【讨论】:

  • 谢谢,我已经修好了
【解决方案3】:

检查'+''-' 后,您需要添加一个检查以确保没有其他字符:

if(grade_letter[1]=='+'){
    value += 0.3;
}
else if (grade_letter[1]=='-'){
    value -= 0.3;
} else if (grade_letter[1]!='\0'){
    /* Error */
}

【讨论】:

  • 它有效。简单明了。非常感谢。
【解决方案4】:

您从未将input 设置为false。在检查第二个字符是否为- 之后,您可能想要另一个else 来执行input = false

if(grade_letter[1]=='+'){
    value += 0.3;
}
else if (grade_letter[1]=='-'){
    value -= 0.3;
}
else {
    input = false;
}

【讨论】:

  • 谢谢。我已经修好了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
相关资源
最近更新 更多