C++设计一个学生信息管理系统
- 提问者网友:霸气大叔
- 2021-02-18 09:20
1)Student类,即学生类;
基本信息包含:学生学号(唯一)、学生姓名、学生年龄、学生性别、学生班级等;
要求设置多个构造函数(缺省无参构造、带参数的构造);
2)Undergraduate类,即本科生类;Undergraduate类继承Student类,此外新增属性有:成绩1,成绩2,成绩3,成绩4,总分,平均分,班长等。
要求设置多个构造函数(缺省无参构造、带参数的构造);
其中:
班长为Student类的对象。
3)Graduate类,即研究生类;Graduate类继承Student类,此外新增属性有:成绩A,成绩B,班长,研究方向、研究导师、工资等。
要求设置多个构造函数(缺省无参构造、带参数的构造);
其中:
班长为Student类的对象。
2、基本功能
本科生成绩的键盘录入,磁盘导入,显示,删除,修改,添加,查询、计算个人成绩总分和平均分、排序等并磁盘保存;
研究生信息的键盘录入,磁盘导入,显示,删除,修改,添加,查询和磁盘保存;
(基本功能完成后可自行扩展其他功能)
其中:
显示:显示学生的信息(包括其班长信息);
删除:输入学生学号,可以删除该学生的信息;
修改:输入学生学号,可以编辑修改该学生的信息;
添加:可以追加新来的学生的信息并保存至磁盘
查询:输入学生学号,可以显示该学生的信息
排序:对本科生按照个人平均分排序;
4门课程平均分高于85分,并且单科成绩不低于80分的前3名本科生,保送研究生(即将其学号和姓名等信息录入研究生类中,并将其在本科生类中的信息删除)。必须要用对象数组,以上个别功能用到虚函数实现的可以加分。
将研究生按导师归类显示:即对同属于一个导师的研究生一起显示。
如显示为:
董方老师的研究生为:
姓名 年龄 性别 班级 成绩A 成绩B 班长 研究方向 研究导师 工资
张鹏 22 男 自动化2013-1 78 86 徐文 智能控制 董方 500
…… …… … …….. … ….. …. ………. ….. ……..
王跃老师的研究生为:
姓名 年龄 性别 班级 成绩A 成绩B 班长 研究方向 研究导师 工资
…… …… … …….. … ….. …. ………. ….. ……..
…… …… … …….. … ….. …. ………. ….. ……..
- 二级知识专家网友:安稳不如野
- 2021-02-18 09:38
#include<fstream>
#include<string>
#include<cstring>
using namespace std;
class Student{ //学生类
private:
string number; //学号
string name; //姓名
int age; //年龄
char sex; //性别
string grade; //班级
public:
Student(); //无参构造
Student(string Num,string Nam,int Age,char Sex,string Gra):number(Num),name(Nam),age(Age),sex(Sex),grade(Gra){}//有参构造
~Student(){} //析构
virtual void Display(); //显示学生信息
virtual void Add(); //声明新增学生对象的函数
virtual int FindRevise(string str) {if(str==number) return 1;else return 0;}
void Setname(string str) {name=str;} //修改姓名
void SetGrade(string str) {grade=str;} //修改班级
};
Student::Student(){ //定义学生类无参构造函数
number="001";
name="Zhangsan";
age=18;
sex='M';
grade="One";
}
void Student::Display(){ //定义显示学生信息函数
cout<<"学号:"<<number<<endl;
cout<<"姓名:"<<name<<endl;
cout<<"年龄:"<<age<<endl;
cout<<"性别:"<<sex<<endl;
cout<<"年级:"<<grade<<endl;
}
void Student::Add(){ //定义增加学生信息函数
cout<<"请输入"<<endl;
cout<<"学号:";cin>>number;
cout<<"姓名:";cin>>name;
cout<<"年龄:";cin>>age;
cout<<"性别:";cin>>sex;
cout<<"年级:";cin>>grade;
}
class Undergrade:public Student{ //本科生类,继承了学生类
private:
double score1; //成绩1
double score2; //成绩2
double score3; //成绩3
double score4; //成绩4
Student monitor; //班长(学生类)
public:
Undergrade(); //无参构造
Undergrade(string Num,string Nam,int Age,char Sex,string Gra,double s1,double s2,double s3,double s4,Student Mon):Student(Num,Nam,Age,Sex,Gra){
score1=s1;
score2=s2;
score3=s3;
score4=s4;
monitor=Mon;
}//有参构造
virtual void Display_monitor();//定义显示班长信息函数
~Undergrade(){} //析构
void Display();//声明显示本科生类学生信息函数
void Add(); //声明新增本科类学生的函数
virtual void AddMon();//声明增加班长信息的函数
int FindRevise(string str); //用于查找判断该学号是否为该学生 str为学号
void Revise(int n); //修改学生信息,n为需要修改的信息(详细见ReviseMenu)
};
Undergrade::Undergrade(){ //定义本科生类学生无参构造函数
score1=100;
score2=100;
score3=100;
score4=100;
Student t;
monitor=t;
}
void Undergrade::Display_monitor(){ //定义显示本科生信息函数
monitor.Display();
}
void Undergrade::Display(){ //定义显示本科生信息函数
Student::Display();
cout<<"成绩1:"<<score1<<endl;
cout<<"成绩2:"<<score2<<endl;
cout<<"成绩3:"<<score3<<endl;
cout<<"成绩4:"<<score4<<endl;
cout<<"班长:"<<endl;
Display_monitor();
}
void Undergrade::AddMon(){ //定义增加班长信息的函数
monitor.Add();
}
void Undergrade::Add(){ //定义增加本科生信息函数
Student::Add();
cout<<"成绩1:";cin>>score1;
cout<<"成绩2:";cin>>score2;
cout<<"成绩3:";cin>>score3;
cout<<"成绩4:";cin>>score4;
cout<<"班长:"<<endl;
AddMon();
}
int Undergrade::FindRevise(string str){//用于查找判断该学号是否为该学生 str为学号
if(Student::FindRevise(str)) return 1;
else return 0;
}
void Undergrade::Revise(int n){ //修改学生信息 n为修改的具体类型(详情见ReviseMenu)
string str;
switch(n){
case 1:{
cout<<"请输入新姓名:";cin>>str;
Student::Setname(str);
break;
}
case 2:{
cout<<"请输入新班级:";cin>>str;
Student::SetGrade(str);
break;
}
}
}
class Graduate:public Student{//研究生类
private:
double scoreA; //成绩a
double scoreB; //成绩b
Student monitor; //班长(学生类)
string res_direction;//研究方向
string res_teacher; //研究导师
double pay;//工资
public:
Graduate(); //无参构造
Graduate(string Num,string Nam,int Age,char Sex,string Gra,double A,double B,Student Mon,string Dir,string Tea,double Pay):Student(Num,Nam,Age,Sex,Gra){
scoreA=A;
scoreB=B;
monitor=Mon;
res_direction=Dir;
res_teacher=Tea;
pay=Pay;
}//有参构造
void Display_monitor();//声明显示班长信息函数
~Graduate(){} //析构
void Display();//声明显示研究生类学生信息函数
void Add();//新增学生信息
void AddMon();//新增班长信息
int FindRevise(string str);//用于查找判断该学号是否为该学生 str为学号
void Revise(int n);//修改学生信息 n为修改的具体类型(详情见ReviseMenu)
};
Graduate::Graduate(){ //定义研究生类学生无参构造函数
scoreA=100;
scoreB=100;
Student t;
monitor=t;
res_direction="Zhang";
res_teacher="Zhang";
pay=999;
}
void Graduate::Display_monitor(){ //定义显示班长信息函数
monitor.Display();
}
void Graduate::Display(){ //定义显示研究生信息函数
Student::Display();
cout<<"成绩A:"<<scoreA<<endl;
cout<<"成绩B:"<<scoreB<<endl;
cout<<"班长:"<<endl;
Display_monitor();
cout<<"研究方向:"<<res_direction<<endl;
cout<<"研究导师:"<<res_teacher<<endl;
cout<<"工资:"<<pay<<endl;
}
void Graduate::AddMon(){//定义增加班长信息的函数
monitor.Add();
}
void Graduate::Add(){ //定义增加研究生信息函数
Student::Add();
cout<<"成绩A:";cin>>scoreA;
cout<<"成绩B:";cin>>scoreB;
cout<<"班长:"<<endl;
AddMon();
cout<<"研究方向:";cin>>res_direction;
cout<<"研究导师:";cin>>res_teacher;
cout<<"工资:";cin>>pay;
}
int Graduate::FindRevise(string str){//用于查找判断该学号是否为该学生 str为学号
if(Student::FindRevise(str)) return 1;
else return 0;
}
void Graduate::Revise(int n){ //修改学生信息 n为修改的具体类型(详情见ReviseMenu)
string str;
switch(n){
case 1:{
cout<<"请输入新姓名:";cin>>str;
Student::Setname(str);
break;
}
case 2:{
cout<<"请输入新班级:";cin>>str;
Student::SetGrade(str);
break;
}
}
}
void MainMenu() //主菜单
{
cout<<"\n\t学 生 管 理 系 统";
cout<<"\n*******************************\n";
cout<<" \t1.添加新本科类学生\n";
cout<<" \t2.添加新研究生类学生\n";
cout<<" \t3.显示本科类学生信息\n";
cout<<" \t4.显示研究生类学生信息\n";
cout<<" \t5.修改本科类学生信息\n";
cout<<" \t6.修改研究生类学生信息\n";
cout<<" \t7.删除本科类学生信息\n";
cout<<" \t8.删除研究生类学生信息\n";
cout<<" \t9.\n";
cout<<" \t10.\n";
cout<<"\n*******************************\n";
cout<<"请选择:";
}
void ReviseMenu() //定义修改学生信息的函数
{
cout<<"\n***************************\n";
cout<<"1.修改姓名\n";
cout<<"2.修改班级";
cout<<"\n***************************\n";
cout<<"请选择:";
}
int main()
{
Undergrade UndGra[100]; //定义本科生对象数组
int UndGraVis[100];//用于判断本科生是否存在
Graduate Gra[100]; //定义研究生对象数组
int GraVis[100];//用于判断研究生是否存在
int i,UndGraPeo=1,GraPeo=1,a[2];
memset(UndGraVis,1,sizeof(UndGraVis));
memset(GraVis,1,sizeof(GraVis));
while(1)
{
MainMenu();
int c;
cin>>c;
cout<<endl;
switch(c)
{
case 1:{//新增本科生
UndGra[UndGraPeo].Add();
cout<<"已成功添加!"<<endl;
UndGraPeo++;
break;
}
case 2:{//新增研究生
Gra[GraPeo].Add();
cout<<"已成功添加!"<<endl;
GraPeo++;
break;
}
case 3:{//显示本科生
if(UndGraPeo==1) cout<<"无记录!\n";
else{
for(i=1;i<UndGraPeo;i++){
if(!UndGraVis[i]) continue;
UndGra[i].Display();
cout<<endl;
}
}
break;
}
case 4:{//显示研究生
if(GraPeo==1) cout<<"无记录!\n";
else{
for(i=1;i<GraPeo;i++){
if(!GraVis[i]) continue;
Gra[i].Display();
cout<<endl;
}
}
break;
}
case 5:{//修改本科生信息
ReviseMenu();
int n; cin>>n;
string str;
int num=0;
cout<<"请输入该学生学号:";cin>>str;
for(i=1;i<UndGraPeo;i++){
if(UndGra[i].FindRevise(str)) {num=i;break;}
}
if(num==0||!UndGraVis[num]) {cout<<"输入错误!"<<endl;break;} //未找到该学生
else UndGra[num].Revise(n);
cout<<"修改成功!"<<endl;
break;
}
case 6:{//修改研究生信息
ReviseMenu();
int n; cin>>n;
string str;
int num=0;
cout<<"请输入该学生学号:";cin>>str;
for(i=1;i<GraPeo;i++){
if(Gra[i].FindRevise(str)) {num=i;break;}
}
if(num==0||!GraVis[num]) {cout<<"输入错误!"<<endl;break;}
else Gra[num].Revise(n);
cout<<"修改成功!"<<endl;
break;
}
case 7:{//删除本科生信息
string str;
int num=0;
cout<<"请输入该学生学号:";cin>>str;
for(i=1;i<UndGraPeo;i++){
if(UndGra[i].FindRevise(str)) {num=i;break;}
}
if(num==0||!UndGraVis[num]) {cout<<"输入错误!"<<endl;break;} //未找到该学生
else UndGraVis[num]=0;
cout<<"已删除!"<<endl;
break;
}
case 8:{//删除研究生信息
string str;
int num=0;
cout<<"请输入该学生学号:";cin>>str;
for(i=1;i<GraPeo;i++){
if(Gra[i].FindRevise(str)) {num=i;break;}
}
if(num==0||!GraVis[num]) {cout<<"输入错误!"<<endl;break;} //未找到该学生
else GraVis[num]=0;
cout<<"已删除!"<<endl;
break;
}
default:cout<<"输入错误!\n";
}
}
return 0;
}
这可绝对可用 我们刚刚 做完这个
- 1楼网友:糜废丧逼
- 2021-02-18 12:13
- 2楼网友:duile
- 2021-02-18 11:41
- 3楼网友:迷人小乖乖
- 2021-02-18 10:21
- 4楼网友:青春如此荒謬
- 2021-02-18 09:51
这是我用c语言写的.执行前在当前目录创建一个1.txt的文件
希望对你有帮助
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <conio.h> #include <string.h> //————学生信息数据结构的定义 struct stu { int num; char name[20]; float score; }; //————数据结构的定义 struct snode { stu data; snode *pnext; };
//————头节点的定义 snode *pheader=null;
void menu();
void tabletodisk();
//————初始化链表 void initlist() { pheader=null; }
//———发现尾部节点: snode *findtail() { snode *p=pheader; if(p) while(p->pnext) p=p->pnext; return p; }
//————将磁盘数据存储到链表: void disktotable(char* name) { stu data; file *fp=fopen(name,"r"); initlist(); while(fread(&data,sizeof(stu),1,fp)>0) { //将数据插入到链表尾部: snode *p=findtail(); snode *pnew=(snode *)malloc(sizeof(snode)); pnew->data=data; pnew->pnext=null; if(p) p->pnext=pnew; else pheader=pnew; } }
//————打印链表: void printlist() { snode *p=pheader; while(p!=null) { printf("号码:%d\n姓名:%s\n分数:%f\n",p->data.num,p->data.name,p->data.score); printf("\n\n"); p=p->pnext; } }
//——————————子菜单1————————浏览学生信息 //——按学号进行排序: void list1() { printf("按照学号浏览学生信息\n"); snode *p,*q,*small; p=pheader; while(p) { small=p; q=p->pnext; while(q) { if(q->data.num<small->data.num) small=q; q=q->pnext; } if(small!=p) { stu temp=p->data; p->data=small->data; small->data=temp; } p=p->pnext; } printlist(); printf("请按任意键返回主菜单:"); getch(); system("cls"); menu();
} //——按英语成绩进行排序: void list2() { printf("按照英语成绩浏览学生信息\n"); snode *p,*q,*small; p=pheader; while(p) { small=p; q=p->pnext; while(q) { if(q->data.score<small->data.score) small=q; q=q->pnext; } if(small!=p) { stu temp=p->data; p->data=small->data; small->data=temp; } p=p->pnext; } printlist(); printf("请按任意键返回主菜单:"); getch(); system("cls"); menu(); }
//——子菜单——外观: int sub1() { printf("\n\n\n\t\t*************************\n"); printf("\t\t* 1.按学号浏览: *\n"); printf("\t\t* 2.按英语成绩浏览: *\n"); printf("\t\t*************************\n"); printf("\t\t请选择:"); int i=0; scanf("%d",&i); switch(i) { case 1: system("cls"); list1(); break; case 2: system("cls"); list2(); break; } return i; }
//————————————子菜单2——————————查询学生信息
//————按姓名进行查询: void search1() { printf("请输入要查询学生的学号:"); int num1; scanf("%d",&num1); snode *p=pheader; while(p!=null) { if(p->data.num==num1) printf("号码:%d\n姓名:%s\n分数:%f\n",p->data.num,p->data.name,p->data.score); p=p->pnext; }
printf("请按任意键返回主菜单:"); getch(); system("cls"); menu();
} //————按学号进行查询: void search2() { printf("请输入要查询学生的姓名:"); char name[20]; int result=0; scanf("%s",name); snode *p=pheader; while(p!=null) { result=strcmp(p->data.name,name); if(result==0) printf("号码:%d\n姓名:%s\n分数:%f\n",p->data.num,p->data.name,p->data.score); p=p->pnext; } printf("请按任意键返回主菜单:"); getch(); system("cls"); menu(); }
//————子菜单——外观: int sub2() { printf("\n\n\n\t\t*************************\n"); printf("\t\t* 1.按学号查询: *\n"); printf("\t\t* 2.按姓名查询: *\n"); printf("\t\t*************************\n"); printf("\t\t请选择:"); int i=0; scanf("%d",&i); switch(i) { case 1: system("cls"); search1(); break; case 2: system("cls"); search2(); break; } return i; }
//————————————子菜单3——————————删除学生信息
void sub3() { printf("请输入要删除的学生学号:"); int num=0; scanf("%d",&num); printf("是否真的删除该学生信息(y/n)?"); printf("\n"); char m; m=getch(); if(m=='y'||m=='y') { snode *p=pheader; snode *p1; while((p->data.num!=num)&&(p->pnext!=null)) { p1=p; p=p->pnext; } if(p==pheader) { pheader=p->pnext; } else p1->pnext=p->pnext; free(p); printf("剩余学生信息\n"); printlist(); tabletodisk(); printf("请按任意键退出以保存数据到文件,请重新启动启动程序:"); getch(); exit(0); }
if(m=='n'||m=='n') { system("cls"); menu(); } if((m!='y')&&(m!='y')&&(m!='n')&&(m!='y')) { printf("输入错误!!"); system("cls"); menu(); } }
//————————————子菜单4——————————添加学生信息
//学生信息加到链表尾部 void addtail(stu &data) { if(!pheader) { return; } printf("请输入号码:"); scanf("%d",&data.num); printf("请输入姓名:"); scanf("%s",&data.name); printf("请输入分数:"); scanf("%f",&data.score); snode *p=findtail(); snode *pnew=(snode *)malloc(sizeof(snode)); pnew->data=data; pnew->pnext=null; p->pnext=pnew; }
//将添加后的链表存入文件 void tabletodisk() { file *fp=fopen("1.txt","w"); snode *p=pheader; while(p) { fwrite(p,sizeof(stu),1,fp); p=p->pnext; } }
//——子菜单 int sub4() { printf("请输入学生信息:\n"); stu d5; addtail(d5); tabletodisk(); printf("请按任意键退出程序以确保文件更新成功\n"); getch(); exit(0); return 0;
}
//——————————主菜单———————— void menu() { printf("\n\n\n\t\t********************\n"); printf("\t\t* 1.浏览: *\n"); printf("\t\t* 2.查询: *\n"); printf("\t\t* 3.删除: *\n"); printf("\t\t* 4.添加: *\n"); printf("\t\t* 0.退出: *\n"); printf("\t\t********************\n"); printf("\t\t请选择:"); int i=0; scanf("%d",&i); switch(i) { case 0: exit(0); break; case 1: system("cls"); while(sub1()); break; case 2: system("cls"); while(sub2()); break; case 3: system("cls"); sub3(); break; case 4: system("cls"); sub4(); break; } }
int main(int argc, char* argv[]) {
char name[100]="1.txt"; disktotable(name); menu(); return 0; }