在疯狂的部分中声明变量
Declared variable in sections going crazy
我正在制作一个代码来计算一个学生在 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、2 和 3 都在局部范围内。您错误地认为编译器会自动识别相似的变量名称来表示相同的基础对象。在此处阅读有关本地范围的信息。
- 你有多个相同方法的副本 -
int grade()
是一个配方。您可以向它传递任何变量并根据该配方检索输出。这样做的重点是不要为您传递的每个变量创建函数的完整副本。 - 如果你想写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
是全局变量,那就好了,但事实并非如此。变量以main
和grade1
grade3
本地共存,并且除了相同的名称外不共享任何内容(这很好,因为它们在不同的范围内定义(。
结果错误的原因是这些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;
}
相关文章:
- 在疯狂的部分中声明变量
- 如何在C++中为高分辨率时钟声明变量?
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- CUDA 的性能取决于声明变量
- 如何在不为其声明变量的情况下获取和使用常量值的地址?
- C++声明变量时自动类型推断而不初始化
- 在不同循环中多次声明变量的优点
- 奇怪的错误 C2131 与 constexpr 声明变量
- 是否可以在 "if" 语句中声明变量?
- 在python-ctypes中声明变量并传递给dll函数
- 在递归函数C++中声明变量
- 只有一个定义/声明时标头声明变量的多堆定义错误
- 奇怪的未声明变量编译器错误
- 我在C++程序中声明变量时遇到问题
- 在命名空间中声明变量
- C++ lambda 按值捕获,而无需更早声明变量
- 声明变量以保存字符串列表时的内存分配
- 如何声明C 变量应突变
- 为什么允许在开关语句中声明变量?但不是声明 初始化
- 在同一命名空间中声明变量和函数是否出错?[C++]