提问者:小点点

在疯狂的节中声明变量


我在用C++做一个代码来计算一个学生的CGPA。 我决定使用3个科目,并通过一个不同的功能收集每一个科目的绩点。 我已经把代码看了好几遍了,我也弄不明白为什么这个数字错得这么厉害。

#include <iostream>
using namespace std;

void grade(int mark){
int gradepoint;
if (mark >= 81) {
gradepoint = 10;
}

if (mark >= 61 && mark <= 80) {
gradepoint = 8;
}

if (mark >= 41 && mark<= 60) {
gradepoint = 6;
}

if (mark <= 40){
 gradepoint = 0;
}
}

void grade1(int mark1){
int gradepoint1;
if (mark1 >= 81) {
gradepoint1 = 10;
}

if (mark1 >= 61 && mark1 <= 80) {
gradepoint1 = 8;
}

if (mark1 >= 41 && mark1 <= 60) {
gradepoint1 = 6;
}

if (mark1 <= 40){
 gradepoint1 = 0;
}
}

void grade2(int mark2){
int gradepoint2;
if (mark2 >= 81) {
gradepoint2 = 10;
}

if (mark2 >= 61 && mark2 <= 80) {
gradepoint2 = 8;
}

if (mark2 >= 41 && mark2 <= 60) {
gradepoint2 = 6;
}

if (mark2 <= 40){
gradepoint2 = 0;
}
}


int main(){
int mark, mark1, mark2;
int gradepoint, gradepoint1, gradepoint2;
cout <<"Please enter your marks for English. ";
cin >> mark;
grade(mark);
cout <<"Please enter your marks for Maths. ";
cin >> mark1;
grade1(mark1);
cout <<"Please enter your marks for Science. ";
cin >> mark2;
grade2(mark2);
cout << gradepoint + gradepoint1 + gradepoint2;
return 0;
}

然而,我所得到的所有三个科目的绩点是完全错误的。 有人能告诉我我做错了什么吗?


共1个答案

匿名用户

下面是您的代码的工作版本,只需进行最少的编辑:

#include <iostream>
using namespace std;

int grade(int mark){
  int gradepoint;
  if (mark >= 81) {
    gradepoint = 10;
  }

  if (mark >= 61 && mark <= 80) {
    gradepoint = 8;
  }

  if (mark >= 41 && mark<= 60) {
    gradepoint = 6;
  }

  if (mark <= 40){
     gradepoint = 0;
  }

  return gradepoint; 
}

int grade1(int mark1){
  int gradepoint1;
  if (mark1 >= 81) {
    gradepoint1 = 10;
  }

  if (mark1 >= 61 && mark1 <= 80) {
    gradepoint1 = 8;
  }

  if (mark1 >= 41 && mark1 <= 60) {
    gradepoint1 = 6;
  }

  if (mark1 <= 40){
     gradepoint1 = 0;
  }

  return gradepoint1; 
}

int grade2(int mark2){
  int gradepoint2;
  if (mark2 >= 81) {
    gradepoint2 = 10;
  }

  if (mark2 >= 61 && mark2 <= 80) {
    gradepoint2 = 8;
  }

  if (mark2 >= 41 && mark2 <= 60) {
    gradepoint2 = 6;
  }

  if (mark2 <= 40){
    gradepoint2 = 0;
  }

  return gradepoint2;
}


int main(){
  int mark, mark1, mark2;
  cout <<"Please enter your marks for English. ";
  cin >> mark;
  cout <<"Please enter your marks for Maths. ";
  cin >> mark1;
  cout <<"Please enter your marks for Science. ";
  cin >> mark2;
  cout << grade(mark1) + grade1(mark1) + grade2(mark2);
  return 0;
}

所以这是一次学习的经历,而不是复制/粘贴,下面是你做错的和/或可以做得更好的地方:

  1. 作用域--gradepoint1,2和3在所有方法中都在局部作用域中。 您错误地认为编译器自动识别相似的变量名意味着相同的基础对象。 在此处阅读有关本地作用域的信息。
  2. 您有同一个方法的多个副本--int grade()是一个配方。 您可以向它传递任何变量,并基于该配方检索输出。 这样做的目的是不要为传递给它的每个变量创建函数的完整副本。
  3. 如果您想编写C++,这就不太符合C++-Y。 它是带有一些iostream的C。 实验类,重载等,以了解如何在C++中做得更好。 例如,您可以向名为GPaccalculator的类添加不同的功能,例如打印成绩,存储成绩,将GPA计算移到类内等等。

下面是经过大量编辑的代码的工作版本:

#include <iostream>
using namespace std;

int grade(int mark){
  int gradepoint;
  if (mark >= 81) {
    gradepoint = 10;
  }

  if (mark >= 61 && mark <= 80) {
    gradepoint = 8;
  }

  if (mark >= 41 && mark<= 60) {
    gradepoint = 6;
  }

  if (mark <= 40){
     gradepoint = 0;
  }

  return gradepoint; 
}


int main(){
  int mark, mark1, mark2;
  cout <<"Please enter your marks for English. ";
  cin >> mark;
  cout <<"Please enter your marks for Maths. ";
  cin >> mark1;
  cout <<"Please enter your marks for Science. ";
  cin >> mark2;
  cout << grade(mark) + grade(mark1) + grade(mark2);
  return 0;
}