带数组的字符串

strings with the arrays

本文关键字:字符串 数组      更新时间:2023-10-16

hello我有一个这样的结构体:

struct Student
{
string name,lettergrade;
int stdnumber,*examgrades;
double  avarege;
};

我必须编写一个程序来计算学生的平均成绩和字母成绩。

我必须使用这个函数:

void getdata();
double calcgrades();
void show();
void erase();

我必须询问用户学生总数和考试总数。然后我必须分配必要的内存空间。(带动态分配)

输出屏幕必须是这样的:

Enter the number of students: 2
Enter the number of exams: 2
1. student's name: michael
1. student's school number: 5000
1. student's 1. exam grade: 50
1. student's 2. exam grade: 40
The avarege of this student is: 45 Letter grade: F
2. student's name: [b]mary[/b]
2. student's school number: 6000
2. student's 1. exam grade: 70
2. student's 2. exam grade: 80
The avarege of this student is: 75 Letter grade: B

我的问题是,我不能分配它的字符串变量,如学生的名字和字母等级…(在getdata函数中)

100分以上字母评分为A: 85-100, B:75-84, C:65-74, D:50-64,F:0-49。

有谁对这个问题有什么想法吗?编辑:

void getdata()
{
    int i,j;
    i=0;j=0;
    int stdnumber;
    int examnumber;
    cout<<"How many students..."<<endl;
    cin>>stdnumber;
    Student k[stdnumber];
    cout<<"How many exams...."<<endl;
    cin>>examnumber;
    for (i=0;i<stdnumber;i++)
    {
        cout<<i+1<<". student's name: "<<endl;
        cin>>k[i].name;
        cout<<i+1<<". student's school number: "<<endl;
        cin>>k[i].stdnumber;
        for (j=0;j<examnumber;j++)
        {
            cout<<i+1<<". student's "<<j+1<<". exam grade: "<<endl;
            cin>>k[i]->examgrades; //The error is here: base operand of '->' has non-pointer type 'Student'|
        }
    }
}

我想告诉你的是我的问题是指针。我不知道如何分配足够的内存空间来显示考试成绩?

在您的代码中,kStudent的数组,而不是Student*的数组。所以你需要用.代替->。这就是为什么会出现错误。这段代码的另一个问题是,你使用了一个非常量值作为数组大小,这在c++中是不允许的。

对于动态分配,最简单的解决方案是使用std::vector。这样可以同时处理分配和回收,而不需要额外的注意。

考虑到这是家庭作业,如果由于某种原因你不允许使用std::vector,你将需要使用new[]delete[]

如果因为一些令人难以置信的愚蠢的原因你不能使用new[]delete[],你需要使用mallocfree

您不必分配任何string(尽管没有)如果你这样做的话会有问题)。你必须分配Student。在c++中,分配Student数组的正常方式是:

std::vector <Student> students( studentCount );

类似地,分配int数组的正常方式是:

std::vector <int> examgrades( examCount );

这需要改变Student的结构如:

struct Student
{
    std::string         name;
    std::string         letterGrade;
    int                 studentNumber;
    std::vector <int>   examGrades;
    double              average;
    Student( int examCount ) : examGrades( examCount ) {}
};

如果您使用Student::examGrades的指针,则无法写入在不提供构造函数和函数的情况下,在c++中正确地编写代码Student的析构函数。如果您执行上述操作,一旦您输入学生人数和考试次数,你所要做的就是:

std::vector <Student> students( studentCount, Student( examCount ) );

和所有必需的都已分配。另外,您将vector初始化为空,并使用push_back遍历输入添加完全初始化的学生。(这实际上是一个更好的解决方案,因为它可以防止任何学生不存在正确地初始化。)

如果你的教授试图教其他解决方案,使用指针(这个程序中不应该有指针),那么我推荐你换一个教授(如果可能的话,把这个人开除)无能)。但是,在此之前,您始终可以执行

Student* students = new Student[studentCount];
for ( int i = 0; i != studentCount; ++ i )
    students[i].examGrades = new int[examCount];

当然,getData必须返回某种struct,因为它必须返回指向Student s的指针,加上studentCountexamCount。在某个地方,你必须编写代码来删除所有这些记忆。(如果你真的想做正确的事,你会的必须在许多try ... catch块中包装大多数代码,才能正确使用如果出现异常,则释放内存。std::vector负责分配、删除和所有的异常处理。)