说明:刚学完C++,这个是老师布置的实验。
目录
一、实验目的
1、掌握类的定义和使用;掌握对象的声明和使用。
2、掌握类的静态成员的使用。
3、综合应用继承、抽象类、虚函数、虚基类、多态和文件的输入/输出等内容。
二、实验设备和环境
奔腾以上计算机,装有Visual C++ 6.0编程环境。
三、要求
1、问题描述
学生信息包括:学号、姓名、性别、年龄、班级等信息。
小学生除了包括学生所有信息外,还包括英语、数学和语文成绩。
大学生除了包括学生所有信息外,还包括专业、英语、程序设计和高等数学等课程。
设计一程序能够对学生成绩进行管理,应用到继承、抽象类、虚函数、虚基类、多态和文件的输入/输出等内容。
2、功能要求
(1)添加功能:程序能够添加不同学生的记录,提供选择界面供用户选择所要添加的类别,要求学号要唯一,如果添加了重复学号的记录时,则提示数据添加重复并取消添加。
(2)显示功能:可显示当前系统中所有学生的记录,每条记录占据一行。
(3)删除功能:主要实现对已添加的学生记录进行删除。如果当前系统中没有相应的记录,则提示“记录为空!”并返回操作。
(4)求小学生、大学生各自的平均成绩。
(注:本程序中没有用到文件流(因为当时我们老师没有要求),所以输入的学生信息在程序结束后不会保存)
四、程序源码
#include <iostream>
#include <cstring>
using namespace std;
class Pupil;
class UniversityStu;
Pupil *pupil_group[10000];
UniversityStu *univer_stu_group[10000];
//基类声明
class Student
{
public:
Student(char *stu_num="empty",char *nam="empty",char* se=NULL,int ag=0,char *clas="empty")
{
num++;
strcpy(student_num,stu_num);
strcpy(name,nam);
strcpy(sex,se);
age=ag;
strcpy(class_,clas);
}
virtual ~Student() //虚析构函数
{
num--;
}
void AcquireStudentNum(char *p)
{
strcpy(p,student_num);
}
virtual void display()=0; //纯虚函数
protected:
static unsigned int num;
char student_num[13];
char name[10];
char sex[3];
int age;
char class_[20];
};
unsigned int Student::num=0; //静态变量初始化
//派生类声明
class Pupil: public Student
{
public:
Pupil(char *stu_num,char *nam,char *se,int ag,char *clas,int CHINESE=0,int mat=0,int englis=0):
Student(stu_num,nam,se,ag,clas)
{
Pupil_num++;
Chinese=CHINESE;
math=mat;
english=englis;
}
~Pupil()
{
Pupil_num--;
}
void set(int CHINESE,int mat,int englis) //修改所有科目
{
Chinese=CHINESE;
mat=math;
english=englis;
}
void set(char *type,int score) //修改单个科目
{
if(!strcmp("语文",type))
{
Chinese=score;
}
else if(!strcmp("数学",type))
{
math=score;
}
else if(!strcmp("英语",type))
{
english=score;
}
else
cout<<"科目输入错误,请重试\n";
}
void display()
{
cout<<"|学号| "<<student_num<<" |姓名| "<<name<<" |性别| "<<sex<<" |年龄| "<<age<<" |班级| "<<class_<<" |语文成绩| "<<Chinese<<" |数学成绩| "<<math<<" |英语成绩| "<<english<<endl;
}
int Take_score(char type)
{
if(type==1)
return Chinese;
else if(type==2)
return english;
else if(type==3)
return math;
}
static unsigned int Take_the_num_of_stu()
{
return Pupil_num;
}
protected:
static unsigned int Pupil_num;
int Chinese;
int math;
int english;
};
unsigned int Pupil::Pupil_num=0;
//派生类声明
class UniversityStu: public Student
{
public:
UniversityStu(char *stu_num,char *nam,char *se,int ag,char *clas,int professio=0,int mat=0,int progra=0,int englis=0):
Student(stu_num,nam,se,ag,clas)
{
univer_stu_num++;
profession=professio;
math=mat;
english=englis;
program=progra;
}
~UniversityStu()
{
univer_stu_num--;
}
void display()
{
cout<<"|学号|"<<student_num<<" |姓名| "<<name<<" |性别| "<<sex<<" |年龄| "<<age<<" |班级| "<<class_<<" |专业课成绩| "<<profession<<" |数学成绩| "<<math<<" |程序设计成绩| "<<program<<" |英语成绩| "<<english<<endl;
}
int Take_score(char type)
{
if(type==1)
return profession;
else if(type==2)
return english;
else if(type==3)
return math;
else if(type==4)
return program;
}
static int Take_the_num_of_stu()
{
return univer_stu_num;
}
protected:
static int univer_stu_num;
int profession,english,math,program;
};
int UniversityStu::univer_stu_num=0;
//添加学生信息函数
char add()
{
static unsigned int i=0,i3=0;
unsigned int i2,i4;
int type;
static bool pupil_overflow_flag=false,univer_overflow_flag=false;
char stu_num[13],name[10],sex[3],clas[20];
int age;
int Chinese,math,english;
cout<<"请选择要添加的学生类型(1:小学生,2:大学生)\n"<<">";
cin>>type;
if(type==1)
{
//数组指针若到上限,重新搜索已经删除空间的空指针
a: if(i>=10000)
{
pupil_overflow_flag=true;
}
if(pupil_overflow_flag)
{
bool empty_flag=0;
for(i=0;i<10000;i++)
{
if(pupil_group[i]==NULL)
{
empty_flag=1;
break;
}
}
if(!empty_flag)
{
cout<<"小学生存储空间已达上限(10000人)\n";
return 3;
}
}
cout<<"请输入小学生信息(学号,姓名,性别,年龄,班级,语文成绩,数学成绩,英语成绩\n"<<">";
cin>>stu_num>>name>>sex>>age>>clas>>Chinese>>math>>english;
//检测学号是否重复
for(i2=0;i2<10000;i2++) //遍历分组
{
if(pupil_group[i2]!=NULL) //判断指针是否有效
{
char *buf=(char*)malloc(13);
pupil_group[i2]->AcquireStudentNum(buf);
if(!strcmp(buf,stu_num)) //检查学号是否重复
{
free(buf);
cout<<"输入的学号系统中已存在,请重试\n";
return 2;
}
free(buf);
}
}
while(pupil_group[i]!=NULL) //判断指针是否可用
{
i++;
if(i>=10000)
goto a;
}
pupil_group[i]=new Pupil(stu_num,name,sex,age,clas,Chinese,math,english);
cout<<"新添加的小学生信息为:\n";
pupil_group[i]->display();
if(!pupil_overflow_flag)
i++;
}
else if(type==2)
{
//数组指针若到上限,重新搜索已经删除空间的空指针
b:if(i3>=10000)
{
univer_overflow_flag=true;
}
if(univer_overflow_flag)
{
bool empty_flag=0;
for(i3=0;i3<10000;i3++)
{
if(univer_stu_group[i3]==NULL)
{
empty_flag=1;
break;
}
}
if(!empty_flag)
{
cout<<"大学生存储空间已达上限(10000人)\n";
return 3;
}
}
cout<<"请输入大学生信息(学号,姓名,性别,年龄,班级,专业课成绩,数学成绩,程序设计成绩,英语成绩\n"<<">";
int profession,program;
cin>>stu_num>>name>>sex>>age>>clas>>profession>>math>>program>>english;
//检测学号是否重复
for(i4=0;i4<10000;i4++) //遍历分组
{
if(univer_stu_group[i4]!=NULL) //判断指针是否有效
{
char *buf=(char*)malloc(13);
univer_stu_group[i4]->AcquireStudentNum(buf);
if(!strcmp(buf,stu_num)) //检查学号是否重复
{
free(buf);
cout<<"输入的学号系统中已存在,请重试\n";
return 2;
}
free(buf);
}
}
while(pupil_group[i3]!=NULL)
{
i3++;
if(i3>=10000)
goto b;
}
univer_stu_group[i3]=new UniversityStu(stu_num,name,sex,age,clas,profession,math,program,english);
cout<<"新添加的大学生信息为:\n";
univer_stu_group[i3]->display();
if(!univer_overflow_flag)
i3++;
}
else
{
cout<<"选择的学生类型错误,请重试\n";
return 1;
}
return 0;
}
//显示系统中的小学生信息函数
char display_pupil(void)
{
unsigned int i;
cout<<"系统中小学生的信息:"<<"(总人数:"<<Pupil::Take_the_num_of_stu()<<")"<<endl;
for (i=0; i < 10000; i++)
{
if (pupil_group[i] != NULL)
{
pupil_group[i]->display();
}
}
return 0;
}
//显示系统中的大学生信息函数
char display_university_stu(void)
{
unsigned int i;
cout<<"系统中大学生的信息:"<<"(总人数:"<<UniversityStu::Take_the_num_of_stu()<<")"<<endl;
for (i=0; i < 10000; i++)
{
if (univer_stu_group[i] != NULL)
{
univer_stu_group[i]->display();
}
}
return 0;
}
//修改小学生成绩函数
char Set_pupil_score()
{
char temp_buf[13];
int i;
char find_flag=0;
cout<<"请输入学号\n"<<">";
cin>>temp_buf;
char *buf=(char*)malloc(13);
for(i=0;i<10000;i++) //遍历分组
{
if(pupil_group[i]!=NULL) //判断指针是否有效
{
pupil_group[i]->AcquireStudentNum(buf);
if(!strcmp(buf,temp_buf)) //检查学号是否匹配
{
free(buf);
find_flag=1;
cout<<"该学生信息如下:\n";
pupil_group[i]->display();
cout<<"输入要修改的科目、分数\n"<<">";
char class_[5];
int score;
cin>>class_>>score;
pupil_group[i]->set(class_,score);
cout<<"修改后的信息为:\n";
pupil_group[i]->display();
return 0;
}
}
}
free(buf);
if(!find_flag)
{
cout<<"没有该学生,请重试\n";
return 1;
}
}
//修改学生信息
char Set_info()
{
int type;
cout<<"请选择:1:修改小学生成绩 2:修改大学生成绩\n"<<">";
cin>>type;
if(type==1)
{
return (Set_pupil_score());
}
else if(type==2)
{
cout<<"暂未支持\n";
}
else
{
cout<<"类型选择错误,请重试\n";
return 1;
}
return 0;
}
//删除小学生信息函数
char delete_pupil(void)
{
char find_flag=0;
cout<<"请输要删除学生的学号\n"<<">";
char stu_num[13];
cin>>stu_num;
for(unsigned int i=0;i<10000;i++) //遍历分组
{
char buf[13];
if(pupil_group[i]!=NULL)
{
pupil_group[i]->AcquireStudentNum(buf);
if (!strcmp(stu_num, buf))
{
delete pupil_group[i]; //删除学生信息
pupil_group[i]=NULL;
find_flag=1;
cout<<"已删除\n";
break;
}
}
}
if (find_flag ==0)
{
cout << "输入的学号不存在,请重试\n";
return 1;
}
return 0;
}
//删除大学生信息函数
char delete_univer_stu(void)
{
char find_flag=0;
cout<<"请输要删除学生的学号\n"<<">";
char stu_num[13];
cin>>stu_num;
for(unsigned int i=0;i<10000;i++) //遍历分组
{
char buf[13];
if(univer_stu_group[i]!=NULL)
{
univer_stu_group[i]->AcquireStudentNum(buf);
if (!strcmp(stu_num, buf))
{
delete univer_stu_group[i]; //删除学生信息
univer_stu_group[i]=NULL; //清空指针(必须自己清空,不然会保存原来的地址)
find_flag=1;
cout<<"已删除\n";
break;
}
}
}
if (find_flag ==0)
{
cout << "输入的学号不存在,请重试\n";
return 1;
}
return 0;
}
//删除学生信息函数
char delete_()
{
int type;
cout<<"请选择: 1:删除小学生信息 2:删除大学生信息\n"<<">";
cin>>type;
if(type==1)
{
return (delete_pupil());
}
else if(type==2)
{
return (delete_univer_stu());
}
else
{
cout<<"选择错误,请重试\n";
return 1;
}
}
//计算小学生平均成绩
char take_pupil_average_score()
{
double n=0;
double math_score,english_score;
double Chinese_score;
double sum_math,sum_english;
double sum_Chinese;
for(unsigned int i=0;i<10000;i++) //遍历分组
{
if(pupil_group[i]!=NULL)
{
n++;
sum_Chinese=sum_Chinese+pupil_group[i]->Take_score(1);
sum_english=sum_english+pupil_group[i]->Take_score(2);
sum_math=sum_math+pupil_group[i]->Take_score(3);
}
}
Chinese_score=sum_Chinese/n;
math_score=sum_math/n;
english_score=sum_english/n;
cout<<"小学生的平均成绩:\n";
cout<<"|语文| "<<Chinese_score<<" |数学| "<<math_score<<" |英语| "<<english_score<<endl;
return 0;
}
//计算大学生平均成绩
char take_univer_average_score()
{
double n=0;
double math_score,english_score;
double profession_score,program_score;
double sum_math,sum_english;
double sum_profession,sum_program;
for(unsigned int i=0;i<10000;i++) //遍历分组
{
if(univer_stu_group[i]!=NULL)
{
n++;
sum_profession=sum_profession+univer_stu_group[i]->Take_score(1); //求总分
sum_english=sum_english+univer_stu_group[i]->Take_score(2);
sum_math=sum_math+univer_stu_group[i]->Take_score(3);
sum_program=sum_program+univer_stu_group[i]->Take_score(4);
}
}
profession_score=sum_profession/n; //获取平均分
math_score=sum_math/n;
english_score=sum_english/n;
program_score=sum_program/n;
cout<<"大学生的平均成绩:\n";
cout<<"|专业课| "<<profession_score<<" |数学| "<<math_score<<" |英语| "<<english_score<<" |程序设计| "<<program_score<<endl;
return 0;
}
//计算平均成绩
char take_average_score()
{
int type;
cout<<"请选择: 1:计算小学生平均成绩 2:计算大学生平均成绩\n"<<">";
cin>>type;
if(type==1)
{
take_pupil_average_score();
}
else if(type==2)
{
take_univer_average_score();
}
else
{
cout<<"选择错误,请重试\n";
return 1;
}
return 0;
}
int main()
{
int type=0;
char error=0;
//新建demo
// pupil_group[10]=new Pupil("2000","小明","男",12,"六一",91,92,93);
// pupil_group[11]=new Pupil("2001","小兰","女",13,"五三",89,88,87);
// univer_stu_group[11]=new UniversityStu("201721811040","张笑歌","女",17,"通信17-1",91,92,93,95);
while(1)
{
cout << "====================================================菜单=================================================\n";
cout << "* 1:添加学生信息 2:修改学生信息 3:显示学生信息 4:计算成绩 5:删除学生信息 (请输入对应数字,选择操作)*\n";
cout << "=========================================================================================================\n"<<">";
cin >> type;
switch (type)
{
case 1:
do
error = add();
while(error==1||error==2);
break;
case 2:
do
error = Set_info();
while(error);
break;
case 3:
display_pupil();
display_university_stu();
break;
case 4:
do
error = take_average_score();
while(error);
break;
case 5:
do
error = delete_();
while(error);
break;
default:
cout<<"选择错误,请重试\n";
}
}
return 1;
}