在疯狂的部分中声明变量

Declared variable in sections going crazy

本文关键字:声明 变量 疯狂      更新时间:2023-10-16

我正在制作一个代码来计算一个学生在 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;
}

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

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

#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. 范围 -- 在所有方法中,绩点 1、2 和 3 都在局部范围内。您错误地认为编译器会自动识别相似的变量名称来表示相同的基础对象。在此处阅读有关本地范围的信息。
  2. 你有多个相同方法的副本 -int grade()是一个配方。您可以向它传递任何变量并根据该配方检索输出。这样做的重点是不要为您传递的每个变量创建函数的完整副本。
  3. 如果你想写C++,这不是很C++。它是带有一些iostream的C。尝试类、重载等,以了解如何在C++中做得更好。例如,您可以向名为GPACalculator的类添加不同的功能,例如打印成绩、存储成绩、将 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;
}

您的函数void grade1(int mark1)void grade3(int mark3)不返回gradepoint。相反,他们将变量的值设置为gradepoint。如果gradepoint是全局变量,那就好了,但事实并非如此。变量以maingrade1grade3本地共存,并且除了相同的名称外不共享任何内容(这很好,因为它们在不同的范围内定义(。

结果错误的原因是这些grade函数从未在主函数中实际设置这些gradepoint变量的值。因此,这些数字仍然是未定义的,这意味着它们的位是随机设置的(实际上不是随机的,只是未定义的行为(,因此它们可能非常大,总和可能只是看起来像一个随机的大数字。

最好和最干净的解决方案是让函数返回gradepoint。此外,您只需要一个功能。

#include <iostream>
using namespace std;
int calc_gradepoints(int mark){
if (mark >= 81) {
return 10;
}
if (mark >= 61) {
return 8;
}
if (mark >= 41) {
return 6;
}
return 0;
}
int main(){
int mark_english, mark_maths, mark_science;
cout <<"Please enter your marks for English. ";
cin >> mark_english;

cout <<"Please enter your marks for Maths. ";
cin >> mark_maths;
cout <<"Please enter your marks for Science. ";
cin >> mark_science;
int gradepoint_english = calc_gradepoints(mark_english);
int gradepoint_maths = calc_gradepoints(mark_maths);
int gradepoint_science = calc_gradepoints(mark_science);
cout << "Final result: " << gradepoint_english + gradepoint_maths + gradepoint_science;
}