【问题标题】:strings with the arrays带有数组的字符串
【发布时间】:2011-10-12 11:25:40
【问题描述】:

你好,我有一个这样的结构:

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 函数中)

字母等级为 A:85-100,B:75-84,C:65-74,D:50-64,F:0-49 超过 100 分。

谁能知道这个问题?

编辑:

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'|

        }
    }

}

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

【问题讨论】:

  • 到目前为止你的代码是什么?您在哪里遇到问题?
  • “我必须做”这是作业吗?他们不是已经告诉过你一些可以选择的工具了吗?
  • 当然让我们以不具建设性的方式结束它。 @WhoCares 你能用std::vector吗?
  • 另外,getdata 应该如何返回数据?
  • C++ 没有可变长度数组,因此 Student k[stdnumber]; 不是有效的 C++。这是新手常见的错误。

标签: c++ arrays string char


【解决方案1】:

在您的代码中,kStudent 的数组,而不是 Student* 的数组。所以你需要使用. 而不是-&gt;。这就是为什么你得到那个错误。该代码的另一个问题是您对数组大小使用了非常量值,这在 C++ 中是不允许的。

对于动态分配,最简单的解决方案是使用std::vector。这会同时处理分配和释放,无需额外注意。

鉴于这是作业,如果由于某种原因不允许您使用std::vector,您将需要使用new[]delete[]

如果由于某些非常愚蠢的原因您不能使用new[]delete[],则需要使用mallocfree

【讨论】:

  • 还应该补充一点,C++ 还不允许变长数组。
  • 我认为它不在标准中,但大多数编译器都支持。它在 C99 中
  • @balki:C++ 中没有。尝试在 C++ 模式下编译。
  • 它在 GCC 中,但不在其他主要编译器中,例如 Visual Studio。
  • 即使在 GCC 中,如果您在 C++ 模式下编译,它也会给出“ISO C++ 禁止可变长度数组 'v' [-Wvla]”。
【解决方案2】:

你不必分配任何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 ) );

所有必要的东西都将被分配。或者,你 使用push_back 将向量初始化为空,并循环输入 添加完全初始化的学生。 (这个其实好多了 解决方案,因为它可以防止任何学生在不存在的情况下存在 正确初始化。)

如果您的教授试图教授其他解决方案,请使用指针 (这个程序中应该没有指针),那么我推荐你 更换教授(如果可能的话,解雇这个人 无能)。然而,在那之前,你总是可以做到的

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

当然,getData 必须返回某种 struct,因为 它必须返回指向Students 的指针,加上studentCountexamCount。在某个地方,您必须编写代码才能删除 所有这些记忆。 (如果你真的想正确地做到这一点,你会 必须将大多数代码包装在很多 try ... catch 块中,才能正确 如果有异常释放内存。 std::vector 照顾 分配、删除和所有异常处理。)

【讨论】:

    猜你喜欢
    • 2015-09-11
    • 2020-03-30
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    相关资源
    最近更新 更多