c++ - 使用嵌套结构将结构作为引用传递的错误

标签 c++ function struct

#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() 的数学运算不起作用,因为它全部基于 switch 语句,该语句假定 local_classes[counter].grade 中有值.如果你运行我的代码,我已经添加了调试语句来帮助显示整个事情在哪里失败了。

最佳答案

您正在混合使用 cin >>getline。这会导致混淆行为,因为 cin >> 不会使用输入缓冲区中的尾随换行符,而 getline 不希望看到尾随换行符保留在缓冲区中。

对所有用户输入使用getline,这个问题可能会消失。如果需要读取数字,请使用 getline 以及 stoi 或其他数字转换函数。

关于c++ - 使用嵌套结构将结构作为引用传递的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30020894/

相关文章:

c - 在 ARM 上获取错误的 glibc 函数地址

c++ - Visual Studio 2017 Linux C++库

javascript - 将验证功能应用于所有文本字段和单选按钮

c++ - Qt 按钮出现问题,我在 UI 中找不到它

javascript - 获取 javascript 函数对象的参数计数(甚至名称)

C++ 结构访问冲突

c - 如何从 C 中的函数返回多个类型?

Swift 嵌套的可选值类型(结构)和修改属性

c++ - 在比较用 C++ 编写的两种不同算法时,您使用的优化级别 (g++) 是多少?

c++ - 如何在 XP 样式按钮上显示位图/图标