【问题标题】:Assistance with Basic C++ Based GPA calculator and cin usage协助基于基本 C++ 的 GPA 计算器和 cin 使用
【发布时间】:2023-04-02 00:22:01
【问题描述】:

我正在尝试创建一个简单的 GPA 计算器,它会提示用户输入课程数量(使用新的)。接下来是一个取决于课程数量的 for 循环,要求用户输入课程的成绩和学分数量。程序完成循环和错误。请帮忙。这是代码(我第一次使用这个论坛网站顺便说一句):

#include <iostream>
#include <conio.h>
using namespace std;

 int main(){
   cout<<"Welcome to the GPA calculator";
   cout <<endl;
   cout<<"Please enter the number of courses you wish to calculate : ";
  int*numberOfCourses = new int;
  cin>>*numberOfCourses; //must dereference as it is a pointer and I AM SETTING variable.
  char grade, *credits= new char; 
  int gradesOfPerson = 0;
  int*score = new int; 
  int j = 0;
  int i = 0; 
  int*cumulativeScore= new int; 

  while( i< *numberOfCourses){
  cout <<"Please enter the credits of your " <<(i+1) <<" course. " ;
  cin >>*credits;
  cin.get();
  cout << "Please enter your grade :";
  cin>>(grade); 
  cout <<endl;
  switch (grade){
   case 1: if (grade=='A'){
        *score = 4;
        break; }
   case 2: if (grade=='B'){
        *score = 3;
        break; }
   case 3: if (grade=='C'){
        *score = 2;
        break; }
   case 4: if (grade=='D'){
        *score = 1;
        break; }

   case 5: if (grade=='D'){
        *score = 1;
        break; }
   case 6: if (grade =='E'){
        *score = 0;
        break;
        }
        }
   gradesOfPerson = ((*score)*(*credits));
   cumulativeScore += gradesOfPerson;
   i++;
   }
 int gpa = (*cumulativeScore)/(*numberOfCourses); 
 cout <<"Your GPA is : " <<gpa;
 delete numberOfCourses, credits, score, cumulativeScore;
 }

抱歉缩进不佳(使用 Dev C++)

【问题讨论】:

  • 此项目不需要动态分配 (new)。如果您需要一次存储所有分数,则需要一个动态数组(尽管最好让std::vector 处理细节。但是要计算 GPA,您只需要运行总成绩和总学分。跳过newdelete

标签: c++ cin


【解决方案1】:

您的代码存在许多问题,但不要认为我指出这些问题会令人沮丧。假设你是一个相对初学者,这很好。

主要问题在于以下行:

cumulativeScore += gradesOfPerson;

。您已将累积分数声明为 指针;它保存您感兴趣的数据的地址,而不是数据本身。您应该将其更改为

*cumulativeScore += gradeOfPerson

或将累积分数设为整数变量(并更改所有将其用作指针的位置)。

另一个关键错误是您的 switch 语句。而不是这样的:

case 4: if (grade == 'D') {
 // logic to execute if grade is 'D'
}
break;

这样做:

case 'D':
 // logic to execute if grade is 'D'
break; 

接下来,您需要将*cumulativeScore 初始化为0,因为在执行开始时它可以包含任何内容。

最后,*score 应该是数字类型,而不是字符。字符'4' 的值,解释为数字,实际上不是4,这会导致错误,因为您将其视为这样。如需参考,请参阅此处的 ASCII 字符代码列表:http://www.asciitable.com/

至于其他问题(实际上不会导致您的程序失败,但不是最佳实践):

  • 您对指针的使用很奇怪——为什么不简单地分配普通变量呢?您使用gradegradesOfPersonij 完成了此操作,因此您清楚地知道如何操作。为什么选择将其余变量设为指针?
  • 不要包含conio.h。首先,您没有使用那里声明的任何函数。其次,它是非标准的,在大多数平台上都不可用。
  • 您应该做更多的错误处理:用户输入的等级字母是否合理?你确定他们进入的课程数量是正数吗?等等。

最后,请注意,您可以免费获得 Microsoft Visual C++ 的 Express 版本。它得到积极维护,比 Dev-C++ 早了几光年(一方面,它可以帮助您正确缩进代码!:D)

祝你好运!

【讨论】:

    【解决方案2】:

    在这一行:

    cumulativeScore += gradesOfPerson;
    

    cumulativeScore 是一个指针,所以这条线移动到它指向的地方。你可能想写:

    *cumulativeScore += gradesOfPerson;
    

    它崩溃的原因是因为您正在移动累积分数指向的位置,后来当您尝试取消引用它时,它指向了无效的内存。

    【讨论】:

      【解决方案3】:

      如果没有看到错误,很难说出了什么问题,但乍一看,如果 gpa 行 (int gpa = (*cumulativeScore)/(*numberOfCourses);) 现在没有抛出错误,那么它可能会在未来出现。 gpa 应该是 double

      【讨论】:

        【解决方案4】:

        顺便说一句,你的delete 声明被严重破坏了。你不能一次删除多个变量,这个

        delete numberOfCourses, credits, score, cumulativeScore;
        

        实际上是在使用 C++ 逗号运算符,它丢弃了它的左侧,所以只有 cumulativeScore 被释放。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-12
          • 1970-01-01
          • 2017-09-19
          • 1970-01-01
          相关资源
          最近更新 更多