使用嵌套结构将结构作为引用传递时出错
Errors from passing a structure as a reference, using nested structure
#include <iostream>
#include <string>
struct Class
{
std::string name;
int units;
char grade;
};
struct Student
{
std::string name;
int id;
int num;
double gpa;
Class classes[20];
};
int get_info(Student students[100],const int);
double get_gpa(Class local_classes[20],const int);
int main()
{
const int MAX_STUDENTS = 100;
int num_of_students;
Student students[MAX_STUDENTS];
num_of_students = get_info(students,MAX_STUDENTS);
for (int i = 0; i < num_of_students; i++)
{
int amount_classes = students[i].num;
std::cout << "n*******x2 = " << students[i].name;
std::cout << "n*******Units: " << students[i].classes[0].units;
students[i].gpa = get_gpa(students[i].classes,amount_classes);
std::cout << "nGPA of " << students[i].name << " is: " << students[i].gpa;
}
return 0;
}
int get_info(Student students[100],const int MAX)
{
int counter = 0, local_id;
while (counter < MAX && students[counter].id != -99)
{
std::cout << "Enter the Student's ID: ";
std::cin >> local_id;
std::cin.ignore();
if (local_id != -99)
{
students[counter].id = local_id;
students[counter].gpa = 0.0;
std::cout << "nEnter the Student's name: ";
std:getline(std::cin,students[counter].name);
std::cout << "nEnter the Student's number of classes: ";
std::cin >> students[counter].num;
std::cin.ignore();
for (int i = 0; i < students[counter].num; i++)
{
Class students_classes = students[counter].classes[i];
std::cout << "Enter the name of class #" << i << ": ";
std::getline(std::cin, students_classes.name);
std::cout << "Enter the units of " << students_classes.name << ": ";
std::cin >> students_classes.units;
std::cout << "Enter the grade recieved for " << students_classes.name << ": ";
std::cin >> students_classes.grade;
std::cout << "************* = " << students_classes.grade;
std::cin.ignore();
}
}
counter++;
return counter;
}
}
double get_gpa(Class local_classes[20],const int classNum)
{
int counter = 0;
char grade;
int intGrade = 0, intGradeTotal = 0, units = 0, unitsTotal = 0, numerator = 0;
double num = 0.0;
while (counter < classNum)
{
grade = local_classes[counter].grade;
std::cout << "nGrade for this class is: " << grade;
std::cout << "nGrade for this class is: " << local_classes[counter].grade;
units = local_classes[counter].units;
std::cout << "nUnits for this class is: " << units;
switch (grade)
{
case 'A':
intGrade = 4;
break;
case 'B':
intGrade = 3;
case 'C':
intGrade = 2;
break;
case 'D':
intGrade = 1;
break;
case 'F':
intGrade = 0;
break;
}
unitsTotal += units;
std::cout << "nAll units = " << unitsTotal;
num = intGrade * units;
std::cout << "nNum = " << num;
numerator += num;
counter++;
}
std::cout << numerator << "/" << unitsTotal;
std::cout << "nAnswer is: " << numerator / unitsTotal;
return 0.0;
}
你好。我正在为类做作业,我正在尝试在函数get_gpa()
中做一些数学运算,但我遇到了麻烦,因为由于某种原因我无法弄清楚Students
结构内嵌套结构中的信息在函数get_info()
完成后没有保存。例如,在get_info()
功能结束时,询问收到的成绩,如果用户输入"A",则在支票中打印出来。(紧接着),但是在功能完成后检查时它不再存在。这真的让我感到困惑,最大的问题是我不知道我到底做错了什么,否则我会试图修复它。由于这个错误,get_gpa()
的数学不起作用,因为它完全基于一个开关语句,该语句假设local_classes[counter].grade
中有值。如果你运行我的代码,我已经添加了调试语句来帮助显示整个事情的下水道。
您混合使用cin >>
和getline
。这会导致混淆行为,因为cin >>
不会使用输入缓冲区中的尾随换行符,而getline
不希望看到缓冲区中保留的尾随换行符。
对所有用户输入使用getline
,此问题可能会消失。如果需要读取数字,请使用getline
以及stoi
或其他数字转换功能。
当你这样做时:
Class students_classes = students[counter].classes[i];
您正在复制该对象...然后填充副本中的信息。这绝不会影响要填充的原始students[counter].classes[i]
对象。
您需要改为参考:
Class& students_classes = students[counter].classes[i];
^
相关文章:
- 为什么我在初始化带大括号的结构时出错?
- 尝试将指针与结构一起使用时出错
- PCL 出错:体系结构x86_64 @pcl的未定义符号
- 尝试初始化结构内的联合时出错
- 当使用 std::CIN 输入结构时,它会出错
- 在 boost::heap::p riority_queue 中推送结构对象时出错
- 确定输入"conscalc: calc"的类型时出错。不能联合编码器。具有不同字段集的结构类型
- 尝试将数据添加到结构内部的矢量时出错
- 使用提升库在队列和堆栈数据结构上保存和加载数据时出错
- 尝试将结构指针传递给类时出错
- 在旧的 c++ (<c++11) 中,初始化结构会出错
- 类中私有结构的构造函数出错
- 读取结构数组时出错
- 将模板参数传递到内部结构时出错
- 创建局部结构的 std::向量时出错
- 在 C++ 中访问泛型结构的成员会出错
- 使用映射<字符串,结构>类型的映射编译头文件时出错
- 使用单元测试 (cppunit) 中另一个文件中定义的结构时出错
- 初始化作为结构成员的函数指针时出错
- C++中的初始化结构出错