目前,我正在为一个类编写一个程序,其中包含一个带有附加功能的分数平均值计算器的代码。我的代码一直在工作,直到我将最后一行代码添加到平均分数之和和随后的除法中。我觉得我在这里错过了一些显而易见的东西,但我现在很茫然。理想情况下,这个程序将在四个不同的点接受用户的输入,将输入加在一起,然后除以4(因为我目前的分数是4,但一旦我想出了解决这个问题的方法,我就计划增加这个数量)。
最初,我收到错误是因为我要求代码将double变量转换为char变量,然后返回到double变量(错误代码C4244)。我还更改了代码的结尾,将所有等级的和声明为一个单独的变量,因为将所有这些都包含在一个变量GPA中,会导致程序输出一个看似随机的数字。后来我更改了代码,使其流得更均匀,但是现在当我执行程序时,它要求一年级的初始输入,然后跳过二年级、三年级和四年级。
我对C++还是非常陌生的,所以我可能过于复杂我的代码,但我很困惑。
#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语句。以下是工作代码的一部分:
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;
}我对每个年级重复了这个过程,这是一个很好的选择!
发布于 2020-01-18 19:42:11
我早些时候评论过,但我想如果能有更多帮助的话,我会再详细阐述一下。
看起来,您已经知道了,您试图将一个字符存储在一个双变量中,这会破坏您的代码或产生一些严重的意外结果。与像Javascript这样的语言不同,C++中的变量有一个定义的类型,不能在double和string之间更改。在您编辑的代码中,您似乎已经解释了这一点,而且您的代码现在运行得更好了。
有一件重要的事情要注意,特别是当你看起来还在学习的时候,当你在编写与你已经写好的代码相同或非常相似的代码块时,应该有一个小小的内部警报在你作为程序员的头脑中发生。"DRY“或”请勿重复“的流行原因是有原因的,它可以帮助您的代码更容易读、写和编辑。
对于您的示例,主函数包含所有的逻辑,而且随着时间的延长,很难解释所编写的代码中正在发生的事情。您的代码大致如下:
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()应该是这样的:
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()应该是这样的:
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
}只需更改几行代码,您现在就可以拥有一个更加灵活的程序了!
发布于 2020-01-16 05:17:49
首先,你用变量A,B,C,D,F来做什么?其次,不能使用双类型变量来存储字符。只需使用char变量获得输入等级,并相应地设置分级变量。另外,如果您计划增加更多的这些等级,那么最好是将它写在一个函数中,然后一次又一次地调用它(或者将函数调用放在一个循环中),这样就避免了代码的重复,并且代码看起来更干净了。
https://stackoverflow.com/questions/59762221
复制相似问题