C++综合实验例.docx
- 文档编号:23000624
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:22
- 大小:58.52KB
C++综合实验例.docx
《C++综合实验例.docx》由会员分享,可在线阅读,更多相关《C++综合实验例.docx(22页珍藏版)》请在冰豆网上搜索。
C++综合实验例
面向对象程序设计与语言实践(C++)
学院___
专业___
班级________
学生姓名
学号_____
指导教师
审批评分_______________
一、实验内容
用链表和文件实现学生成绩管理系统,要求系统有录入、查询、修改、插入、删除、统计、输出功能。
实验要求
(1)用面向对象的方法分析系统
(2)写出系统需求、功能分析
(3)数据结构表
成员名
数据类型
长度
含义
class_0
char
20
班级
num
int
学号
name
char
8
姓名
elec
flaot
电子技术
c_prog
float
C++程序设计
media
flaot
多媒体技术
eng
float
大学英语
math
float
高等数学
sport
float
大学体育
polity
float
马克思主义政治经济学
ave
float
平均成绩
order
int
名次
(4)给出数据测试表
(5)要求对“<<”和“>>”运算符进行重载
(6)使用多文件编程和菜单操作
二、设计思想
用StdNode类存放所需的学生数据,包括班级、学号、姓名,以及几门学科的分数。
用Llist作为链表,每个节点一个存放StdNode类里面的内容。
用Length记录学生人数。
编写计算平均分和排名的函数cal_ave()和cal_order(),每次对现有的学生数据进行添加、删除或修改后,都会自动显示所有学生的信息,包括平均分和排名。
编写菜单函数,menu(),并在main()函数中运用switch,进行录入list.append()、插入list.insert(index)、删除list.dele(index)、查询list.search(StdNum)、修改list.edit(index)、保存文件list.Save("Student.txt"),以及退出等功能的实现。
(注:
index为每输入一个学生时自动添加在最前面的一个编号,表示位置,这样在插入、删除、修改时,既直观又便于输入;查询时是输入学生的学号来查询的;文件默认保存到"Student.txt",在退出quit和保存save两个选项中都会调用。
)
三、代码
//Link.h
#if!
defined__LINK_H__
#define__LINK_H__
classLlist;
classStdNode
{
friendclassLlist;
friendistream&operator>>(istream&input,StdNode&SN);
friendostream&operator<<(ostream&output,constStdNode&SN);
public:
StdNode();
private:
charclass_0[20];
intnum;
charname[8];
floatelec;
floatc_prog;
floatmedia;
floateng;
floatmath;
floatsport;
floatpolity;
floatave;
intorder;
StdNode*next;
voidcal_ave();
};
classLlist
{
public:
Llist(){head=newStdNode,length=0;}
~Llist(){cout<<"TheLlisthasbeendestoried!
"< intgetLength(){returnlength;} voidInput(StdNode*); voidoutput()const; boolinsert(intindex); boolappend(); booldele(intindex); boolclear(); intsearch(intStdNum); booledit(intindex); voidSave(char*file); boolcal_order(); private: StdNode*head; intlength; }; #endif //Link.cpp #include"Link.h" #include #include usingnamespacestd; StdNode: : StdNode()//构造函数 { *class_0=0; num=0; *name=0; elec=0; c_prog=0; media=0; eng=0; math=0; sport=0; polity=0; ave=0; order=0; next=0; } istream&operator>>(istream&input,StdNode&SN)//输入重载 { cin>>SN.class_0>>SN.num>>SN.name>>SN.elec>>SN.c_prog>>SN.media>>SN.eng>>SN.math>>SN.sport>>SN.polity; SN.elec=(SN.elec>=0&&SN.elec<=100? SN.elec: 0); SN.c_prog=(SN.c_prog>=0&&SN.c_prog<=100? SN.c_prog: 0); SN.media=(SN.media>=0&&SN.media<=100? SN.media: 0); SN.eng=(SN.eng>=0&&SN.eng<=100? SN.eng: 0); SN.math=(SN.math>=0&&SN.math<=100? SN.math: 0); SN.sport=(SN.sport>=0&&SN.sport<=100? SN.sport: 0); SN.polity=(SN.polity>=0&&SN.polity<=100? SN.polity: 0); SN.cal_ave(); returninput; } ostream&operator<<(ostream&output,constStdNode&SN)//输出重载 { output.width(14); output.fill(''); output.setf(ios: : left,ios: : adjustfield);//左对齐 output< output.width(10);//赋予10位 output.setf(ios: : right,ios: : adjustfield);//右对齐 output< output.width(8); output< output.width(5); output.precision(3); output< output.width(5); output< output.width(5); output< output.width(5); output< output.width(5); output< output.width(5); output< output.width(5); output< output.width(6); output.precision(4); output< output.width(5); output< returnoutput; } voidStdNode: : cal_ave()//算平均分 { ave=(elec+c_prog+media+eng+math+sport+polity)/7; } voidLlist: : output()const//输出函数 { cout< StdNode*ptr=head->next; if(! ptr)//判断有无信息 { cout<<"ThereisnostudentInformation! "< return; } cout<<""; cout.width(14); cout.fill(''); cout.setf(ios: : left,ios: : adjustfield); cout<<"class_0"; cout.width(10); cout.setf(ios: : right,ios: : adjustfield); cout<<"num"; cout.width(8); cout<<"name"; cout.width(5); cout<<"elec"; cout.width(5); cout<<"c_pr"; cout.width(5); cout<<"med"; cout.width(5); cout<<"eng"; cout.width(5); cout<<"math"; cout.width(5); cout<<"Spor"; cout.width(5); cout<<"poli"; cout.width(6); cout<<"ave"; cout.width(5); cout<<"ord"< inti=1; while(ptr) { cout.width (2); cout.setf(ios: : left,ios: : adjustfield); cout< cout<<*ptr< ptr=ptr->next; } } voidLlist: : Input(StdNode*ptr)//输入函数 { cout.width(14); cout.fill(''); cout.setf(ios: : left,ios: : adjustfield); cout<<"class_0"; cout.width(10); cout<<"num"; cout.width(7); cout<<"name"; cout.width(7); cout<<"elec"; cout.width(7); cout<<"c_prog"; cout.width(7); cout<<"media"; cout.width(7); cout<<"eng"; cout.width(7); cout<<"math"; cout.width(7); cout<<"Sport"; cout.width(7); cout<<"polity"< cin>>*ptr;//用>>重载输入内容 } boolLlist: : insert(intindex)//插入函数(参数为所需插入的位置) { StdNode*ptr=head,*ptr1,*temp; if(index<=0||index>length+1) return0; ptr1=newStdNode; Input(ptr1); for(inti=1;i { if(ptr==NULL||ptr->next==NULL) return0; ptr=ptr->next; } temp=ptr->next; ptr->next=ptr1; ptr1->next=temp; length++; cal_order(); return1; } boolLlist: : append()//在链表最后的位置调用插入函数实现"录入" { returninsert(length+1); } boolLlist: : dele(intindex)//删除函数(参数为所需删除的位置) { StdNode*ptr=head,*temp; if(index<=0||index>length) return0; for(inti=1;i { if(ptr==NULL||ptr->next==NULL) return0; ptr=ptr->next; } temp=ptr->next->next; deleteptr->next; ptr->next=temp; length--; cal_order(); return1; } boolLlist: : clear() { boolk=1; while(k==1) { k=dele (1); } if(length==0) return1; else return0; } boolLlist: : cal_order()//排序函数 { StdNode*ptr=head->next,*ptr1; floataverage; intord; while(ptr) { average=ptr->ave; ptr1=head->next; ord=1; while(ptr1) { if(ptr1->ave>average) ord++; ptr1=ptr1->next; } ptr->order=ord; ptr=ptr->next; } return1; } intLlist: : search(intStdNum)//查询函数(参数为学号) { intindex=0; StdNode*ptr=head->next; for(inti=1;i<=length;i++) { if(ptr==NULL) return0; if(ptr->num==StdNum) { cout<<*ptr< index=i; } ptr=ptr->next; } returnindex; } boolLlist: : edit(intindex)//修改函数(参数为所需修改的位置) { boolk; k=dele(index);//先删除所需修改的位置 k=insert(index);//后插入所需修改的位置 returnk; } voidLlist: : Save(char*file)//保存函数 { ofstreamout(file,ios: : out); StdNode*ptr=head->next;//将数据在“Student.txt”中输出 if(! ptr) { out<<"ThereisnostudentInformation! "< return; } out<<""; out.width(14); out.fill(''); out.setf(ios: : left,ios: : adjustfield); out<<"class_0"; out.width(10); out.setf(ios: : right,ios: : adjustfield); out<<"num"; out.width(8); out<<"name"; out.width(5); out<<"elec"; out.width(5); out<<"c_pr"; out.width(5); out<<"med"; out.width(5); out<<"eng"; out.width(5); out<<"math"; out.width(5); out<<"Spor"; out.width(5); out<<"poli"; out.width(6); out<<"ave"; out.width(5); out<<"ord"< inti=1; while(ptr) { out.width (2); out.setf(ios: : left,ios: : adjustfield); out< out<<*ptr< ptr=ptr->next; } } //ex.cpp #include"Link.h" #include usingnamespacestd; voidmenu(); intmain() { Llistlist; boolend_mark=0,k; intindex,StdNum; charchoice; while(end_mark==0)//执行退出函数时end_mark=1 { cout< list.output();//每次都输出更新后的信息 menu(); cin>>choice; switch(choice) { case'1': list.append(); break; case'2': cout<<"Inputtheindexyouwanttoinsert(1~"<<(list.getLength()+1)<<"): "< cin>>index; k=list.insert(index); if(k==0)//k=0时,即执行不成功,输出用户输入错误信息 cout<<"! ! ! Youhaveinputawrongindex! ! ! "< break; case'3': if(list.getLength()==0) { cout<<"Thereisnoinformationtodelete! "< break; } else { cout<<"InputtheindexoftheStudent(1~"< "< cin>>index; k=list.dele(index); if(k==0) cout<<"! ! ! Youhaveinputawrongindex! ! ! "< break; } case'4': cout<<"InputtheStudentNumberyouwanttosearch: "< cin>>StdNum;//输入所需查询的学生学号 cout< index=list.search(StdNum); if(index==0) cout<<"! ! ! TheStudenthasnotbeenfoundinthelist! ! ! "< else cout<<"TheIndexoftheStudentis: "< break; case'5': cout<<"InputtheindexoftheStudent(1~"< "< cin>>index; k=list.edit(index); if(k==0) cout<<"! ! ! Youhaveinputawrongindex! ! ! "< break; case'6': list.Save("Student.txt"); cout<<"Thedatahasbeensavedto\"Student.txt\""< break; case'q': end_mark=1; list.Save("Student.txt");//退出前保存 cout< cout< cout<<"===StudentScoreSystem==="< } } return0; } voidmenu()//菜单函数 { cout< cout<<"********Menu********"< cout<<"1--Input"< cout<<"2--Insert"< cout<<"3--Delete"< cout<<"4--Search
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 综合 实验