带数组的字符串
strings with the arrays
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'|
}
}
}
我想告诉你的是我的问题是指针。我不知道如何分配足够的内存空间来显示考试成绩?
在您的代码中,k
是Student
的数组,而不是Student*
的数组。所以你需要用.
代替->
。这就是为什么会出现错误。这段代码的另一个问题是,你使用了一个非常量值作为数组大小,这在c++中是不允许的。
std::vector
。这样可以同时处理分配和回收,而不需要额外的注意。
考虑到这是家庭作业,如果由于某种原因你不允许使用std::vector
,你将需要使用new[]
和delete[]
。
如果因为一些令人难以置信的愚蠢的原因你不能使用new[]
和delete[]
,你需要使用malloc
和free
。
您不必分配任何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的指针,加上studentCount
和examCount
。在某个地方,你必须编写代码来删除所有这些记忆。(如果你真的想做正确的事,你会的必须在许多try ... catch
块中包装大多数代码,才能正确使用如果出现异常,则释放内存。std::vector
负责分配、删除和所有的异常处理。)
- 将C#字符串数组传递给C++
- 如何为 C 型字符串数组编写 getter 和 setter?
- 有没有办法使用 strcpy 将字符串数组复制到另一个字符串或其他数组中?
- 尝试将 c 字符串数组与分隔符连接起来
- 将字符串数组传递给接受常量字符**的函数
- 返回 C++ 中的字符串数组
- 如何从COM模块中的函数返回字符串数组?
- 无法将字符串数组声明为类成员而不是字符 (C++)
- 删除字符串数组
- 如何将字符串数组返回到 java JNI
- 将字符串数组作为函数参数传递
- C++将字符串数组的元素存储到变量中
- 循环访问还包含未使用元素的字符串数组
- 字符串数组上的 sizeof 运算符以 C++ 为单位给出不同的输出
- 乘以字符串/数组和全局数组
- 递归二进制搜索与字符串数组
- 如何初始化一个标准::字符串数组?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++字符串数组的动态向量
- 给定一个等长字符串数组