如何在C ++中打印学生的成绩(班级学生)

时间:2019-11-03 12:50:09

标签: c++

我有一个班级学生

字符串姓氏; unsigned int number_of_gradebook; 静态整数大小; unsigned int * p =新的unsigned int [大小];

但是似乎没有输出一系列成绩。

我的代码:

#include <iostream>
#include <conio.h>
#include <string>
using namespace std;

class Student {
private:
    string surname;
    unsigned int number_of_gradebook;
    static int size;
    unsigned int *p = new unsigned int[size];
public:
    Student(string s, unsigned int n, static int size, unsigned int *q):surname(s) {
        number_of_gradebook = n;
        //unsigned int *p = new unsigned int[size];
        for (int i = 0; i++; i < size) {
            p[i]=q[i];
        }
    }
    Student() {}
    ~Student() { delete[]p; }

    //friend std::ostream& operator<<(std::ostream&, const Student);
    string GetSurname() const { return surname; }
    unsigned int GetNumOfGrdb() const { return number_of_gradebook;  }
    unsigned int GetMarks() const { return *p; }
    void Print_Student();

};

int Student::size=0;

void Student :: Print_Student() {
    cout << "Student: " << surname << "\t" << number_of_gradebook << endl;
    if (size) {
        for (int i = 0; i++; i < size) {
            cout << p[i] << "\t";
        }
    }
}

class Group {
    Student *s;
    int count;
public:
    Group(int n=0) {
        s = new Student[count = n];
    }
    ~Group() { delete[]s; }
    friend void AddStudent();
    friend void DeleteStudent();
    friend void FindAveragePoint();
    friend void PrintFiveBest();
    void output() {
        cout << s << endl;
    }
};

int main() {
    Student A("Ivanov", 45368400, 5, new unsigned int[5] {3,4,4,5,3});
    A.Print_Student();
    cout << A.GetMarks();
    system("pause");
}

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

假设这是一些工作,并且您不允许使用STL。如果允许您使用STL,则放弃所有的手动内存管理,而使用std::vector。如果没有,请继续阅读。

成员size始终为0。size的设计存在问题。如果它是静态的(对于Student的所有实例都是静态的),那么为什么构造函数中没有执行任何操作的参数size?我认为size应该是普通成员,而不是静态成员。

Student(string s, unsigned int n, int size, unsigned int *q) : 
    surname(s),
    number_of_gradebook(n),
    size(size),
    p(new unsigned int[size])
{
    ...
}


另一个问题是这个混乱的循环:for (int i = 0; i++; i < size)
应该是for (int i = 0; i < size; i++)

请注意,您会在代码中进一步重复此错误。


这行代码:s = new Student[count = n];可能有用,但是却行不通,您可能认为行得通,很难阅读,应该在初始化列表中分成两行,甚至更好:

Group(int n) : 
    count(n),
    s(new Student[count])
{...}

请记住,new X[0]无效。因此,最好删除默认值或使用非0的值! 甚至更好:使用向量。

答案 1 :(得分:1)

我修改了您的一些代码。但是让我告诉你你的错误。

  1. 您不必要在构造函数的参数中编写static。
  2. 了解for循环的语法。它是为(init,cond,increment){}
  3. 您的打印尺寸为零。因此,如果条件为假,它将永远不会执行代码。 看到这个,让我知道您是否没有任何参与。
class Student {
private:
    string surname;
    int number_of_gradebook;
    int size;
    int *p;
public:
    Student(string s,int n,int siz, int *q):surname(s) {
        size = siz;
        number_of_gradebook = n;
        p = new int[siz];
        for (int i = 0; i < size;i++) {
            p[i]= q[i];

        }
    }
    Student() {}
    void GetMarks() const {
        for(int i=0;i<size;++i)
        {
            cout<<p[i]<<endl;
        }
    }
    void Print_Student();
};
void Student :: Print_Student() {
    cout << "Student: " << surname << "\t" << number_of_gradebook << endl;
    for(int i=0;i<size;++i)
    {
        cout<<p[i]<<endl;
    }
}
int main() {
    int arr[] = {1,2,3,4,5};
    Student A("Ivanov", 69, 5, arr);
    A.Print_Student();
     A.GetMarks();
   system("pause");
}