gpt4 book ai didi

c++ - 我如何阻止这些 if else 语句复合?

转载 作者:行者123 更新时间:2023-11-28 01:47:01 29 4
gpt4 key购买 nike

我正在尝试编写一个 C++ 程序,该程序从文本文件中读取输入并使用 10 分评分等级分配等级,然后在屏幕上打印结果。我认为我的问题可能与函数 deriveGrade 中的 if else 语句有关,而不是递增枚举,它们似乎是对增量求和。任何帮助将不胜感激,谢谢。

#include <iostream>
#include <string>
#include <iomanip>
#include <cmath>
#include <fstream>

using namespace std;
int deriveGrade(double avarage);
enum letter_grade { A, B, C, D, F };

namespace tenPoint
{
letter_grade deriveGrade(double avarage);
char grade;
}

using namespace tenPoint;

int main()
{
string name;
double average;

ifstream inData; // Is the variable for input data from the file.

inData.open("student_status.txt", ios::in);

while (!inData.eof())
{

getline(inData, name);
inData >> average;
inData.ignore();
grade = ::deriveGrade(average);

cout << name << " " << average << " " << char(grade) << endl;

}

inData.close();

return 0;
}


int deriveGrade(double average)
{


if (average >= 90)
{
grade = static_cast<letter_grade>(grade + 65);
}
else if (average >= 80 && average < 90)
{
grade = static_cast<letter_grade>(grade + 1);
}
else if (average >= 70 && average < 80)
{
grade = static_cast<letter_grade>(grade + 2);
}
else if (average >= 60 && average < 70)
{
grade = static_cast<letter_grade>(grade + 3);
}
else if (average <= 50)
{
grade = static_cast<letter_grade>(grade + 4);
}
else
{
cout << "Invalid entry." << endl;
}

return grade;
}

从文件输入:

Doe, John K.

93.2

Andrews, Susan S.

84.7

Monroe, Marylin

75.1

Gaston, Arthur C.

62.8

Harpo, Joanie Y.

42.7

Ginger, Fred T.

95.8

程序输出:

Doe, John K. 93.2 A

Andrews, Susan S. 84.7 B

Monroe, Marylin 75.1 D

Gaston, Arthur C. 62.8 G

Harpo, Joanie Y. 42.7 K

Ginger, Fred T. 95.8 î

Press any key to continue . . .

最佳答案

你的程序逻辑比较奇怪,但可以在不深入你的任务的情况下给出一些常见的评论。

注意,当你使用 if... else 时像这样一一陈述

if (average >= 90)
{
grade = static_cast<letter_grade>(grade + 65);
}
else if (average >= 80 && average < 90)
{
grade = static_cast<letter_grade>(grade + 1);
}
...

不需要检查average < 90elseaverage >= 90之后分支发现假的。所以至少代码可以更短:

int deriveGrade(double average)
{
if (average >= 90)
{
grade = static_cast<letter_grade>(grade + 65);
}
else if (average >= 80)
{
grade = static_cast<letter_grade>(grade + 1);
}
else if (average >= 70)
{
grade = static_cast<letter_grade>(grade + 2);
}
else if (average >= 60)
{
grade = static_cast<letter_grade>(grade + 3);
}
else if (average <= 50)
{
grade = static_cast<letter_grade>(grade + 4);
}
else // check here! Invalid interval is for values between 50 and 60?
{
cout << "Invalid entry." << endl;
}

return grade;
}

但这并不是显着的改进....制作一个公式并使用赋值给grade = ...的单个语句要好得多

更新:

还有一条评论。如果您知道 Not Acceptable 值的区间,请先检查它(在所有其他计算之前):

int deriveGrade(double average)
{
// check the correctness of argument first
if (average > 50 && average < 60)
{
cout << "Invalid entry." << endl; // notification
return grade; // previous value
// also consider returning special value for error case
}
// calculate value for grade
grade = ...
// return updated value
return grade;
}

“计算成绩的值(value)”部分适合您,在编写这部分代码时请记住:

  • 三元运算对于一种特殊情况很有用,例如grade = (average >= 90)? 65 : floor(100 - average) / 10;

  • 在函数中使用全局值(如 grade )是不好的做法,并且基于全局变量初始值正确的假设来制定逻辑

关于c++ - 我如何阻止这些 if else 语句复合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44643869/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com