题目要求
现在需要录入一批学生的成绩(学号,成绩)。其中学号是正整数,并且录入时,后录入学生的学号会比前面的学号大;成绩分两等,通过(Pass,录入时用1代表),不通过(Fail,录入时用0代表)。
由于很多学号都是相邻的,并且学号相邻的学生成绩常常相同。所以在录入时,适当地加了速。如果当前学生的学号比前面的学号大1,且成绩与前面的成绩相同,则只输入0即可。
类定义:
完成Student类
裁判测试程序样例:
#include<iostream> using namespace std; /* 请在这里填写答案 */ int main(){ const int size=100; int i, N, no, score; Student *st[size]; cin>>N; for(i=0; i<N; i++){ cin>>no; if(no>0){ cin>>score; st[i]=new Student(no, score); } else st[i]=new Student(*st[i-1]); } cout<<Student::count<<" Students"<<endl; for(i=0;i<N;i++) st[i]->display(); for(i=0;i<N;i++) delete st[i]; return 0; }
输入样例:
5
3 0
0
7 1
0
12 1
输出样例:
5 Students
3 Fail
4 Fail
7 Pass
8 Pass
12 Pass
解题思路
定义一个叫做Student的类,包含学号和成绩两个数据成员,以及记录学生对象个数的静态数据成员count。
构造函数用于初始化学生对象。复制构造函数用于记录学生编号连续但成绩相同的情况。
成员函数display()用于输出学生信息。
代码
class Student{ // 定义Student类 int no; // 学号 int score; // 成绩,1表示通过,0表示未通过 public: static int count; // 记录学生对象个数的静态数据成员 // 构造函数,用于初始化学生对象 Student(int n, int s) { no = n; score = s; count++; // 每次创建学生对象时,静态数据成员count的值加1 } // 复制构造函数,用于记录学生编号连续但成绩相同的情况 Student(Student &p) { no = p.no + 1; // 学号自动加1 score = p.score; // 成绩不变 count++; // 每次创建学生对象时,静态数据成员count的值加1 } // 成员函数,用于输出学生信息 void display() { cout << no << " "; if (score) cout << "Pass" << endl; else cout << "Fail" << endl; } }; // 静态数据成员count的初始化 int Student::count = 0;
整体代码如下:
#include<iostream> using namespace std; class Student{ // 定义Student类 int no; // 学号 int score; // 成绩,1表示通过,0表示未通过 public: static int count; // 记录学生对象个数的静态数据成员 // 构造函数,用于初始化学生对象 Student(int n, int s) { no = n; score = s; count++; // 每次创建学生对象时,静态数据成员count的值加1 } // 复制构造函数,用于记录学生编号连续但成绩相同的情况 Student(Student &p) { no = p.no + 1; // 学号自动加1 score = p.score; // 成绩不变 count++; // 每次创建学生对象时,静态数据成员count的值加1 } // 成员函数,用于输出学生信息 void display() { cout << no << " "; if (score) cout << "Pass" << endl; else cout << "Fail" << endl; } }; // 静态数据成员count的初始化 int Student::count = 0; // 主函数 int main() { const int size = 100; int i, N, no, score; Student *st[size]; // 存放学生对象指针的数组 cin >> N; // 输入学生个数 for (i = 0; i < N; i++) { cin >> no; // 输入学号 if (no > 0) { // 如果学号大于0,输入成绩并创建新的学生对象 cin >> score; // 输入成绩 st[i] = new Student(no, score); // 创建新的学生对象 } else { // 如果学号等于0,创建与前一个学生相同但学号连续的新的学生对象 st[i] = new Student(*st[i - 1]); // 创建与前一个学生相同但学号连续的新的学生对象 } } cout << Student::count << " Students" << endl; // 输出学生对象的总数 for (i = 0; i < N; i++) st[i]->display(); // 输出每个学生对象的信息 for (i = 0; i < N; i++) delete st[i]; // 释放存放学生对象指针的数组 return 0; }
在main()函数中,定义一个存放学生对象指针的数组st,用于存放动态创建的学生对象的地址。输入学生个数,然后循环输入每位学生的学号和成绩。如果学号大于0,则创建新的学生对象并将其地址存放在st数组中;否则,创建与前一个学生相同但学号连续的新的学生对象并将其地址存放在st数组中。
循环输出每个学生对象的信息,然后释放存放学生对象指针的数组。
总结
程序的主要难点在于如何判断学生编号连续但成绩相同的情况。
可采用复制构造函数
来处理这种情况,即在复制构造函数中自动将学号加1,从而得到一个与前一个学生相同但学号连续的新的学生对象。
我是秋说,我们下次见。