C课程设计报告书学生成绩管理系统.doc
C+课程设计报告书题目:学生成绩管理系统 专 业:信息与计算科学 班 级:0208403 学 号: 姓 名: 任课老师: 学生成绩管理系统课程设计报告摘要:本系统主要用于对学生的成绩进行管理。通过本系统,可以将各个学生的成绩记录输入到系统中,保存到文件,便于查阅和相关管理。此外,该系统还能实现对学生成绩记录的显示,查询以及插入或删除学生的成绩记录等功能。一、 问题描述编写一个简单的学生成绩管理系统。学生成绩管理系统有若干学生成绩记录组成,每个记录由学号、姓名、性别和成绩四部分组成,学号不超过11个字符,姓名不超过21个字符,性别为m(male)或f(female),成绩为double型数据。该系统具有以下功能:(1) 程序开始执行时显示如下版权信息和主菜单: *学生成绩管理系统*l *1.添加学生成绩记录 l *2.显示学生成绩记录 l *3.查找学生成绩记录l * 4.删除学生成绩记录 l * 5.保存学生成绩记录l * 6.加载学生成绩记录l * 7.退出学生成绩管理系统 *请输入(17): (2) 通过键盘输入数字17后,程序能够执行相应的功能,执行完后回到上述主菜单继续等待用户输入,输入数字7后退出程序。(3) 选择“添加学生成绩记录”后,输入要插入记录的位置。按程序提示依次输入学号,姓名,性别,成绩,插入记录成功。(4) 选择“显示学生成绩记录”,显示学生成绩表中已有的学生记录的个数,并显示出各个学生记录的相关信息。(5) 选择“查找学生成绩记录”,按提示输入要查找的学生的学号,输入学号,若该学号存在,则输出相应的学生记录,如该学号不存在,则按任意键返回主菜单。(6) 选择“删除学生成绩记录”,按提示输入要删除的学生的学号,输入学号,若改学号存在,则删除相应的学生记录,如果该学号不存在,则按任意键返回主菜单。(7) 选择“保存学生成绩记录”,系统会将已有的学生记录保存在默认的文件名为fname.txt的文件中。(8) 选择“加载学生成绩记录”,系统会提示输入文件名,输入默认的文件名为fname.txt,则可将文件中的相关信息导出。(9) 选择“退出学生成绩管理系统”,按任意键退出系统。二、 解决方案这是一个很实际的编程实例。编程要求很详细,内容也比较多,有一定难度。首先,学生成绩记录是一个复杂的数据结构,至少应包括学号,姓名,性别和成绩。所以,必须建立一个类student,用来记录学号,姓名,性别和成绩。此外还得建立一个类stuscore,用来记录多个学生的成绩记录。1、 建立类学生类student,它至少包括学号number,姓名name,性别sex,成绩chengji。具体如下: class studentpublic:char name21; /姓名char number11; /学号char sex; /性别double chengji; /成绩student *next; /类指针,用来指向下一个记录 student();void init(string &Name,string &Number,char Sex,double Chengji); /输入学生成绩记录virtual student();函数init(string &Name,string &Number,char Sex,double Chengji)用于输入学生记录,相当于一个注册。其具体实现如下:void student:init(string &Name,string &Number,char Sex,double Chengji)int len;len=Name.length();if(len>20)len=20; Name.copy(name,len,0); namelen=0;len=Number.length();if(len>10)len=10;Number.copy(number,len,0);numberlen=0;sex=(sex='m')?'m':'f');chengji=Chengji;2、 建立学生成绩记录类stuscore,该类是学生成绩记录的集合。其成员函数则是问题中要求的添加、显示、查找、删除、保存、导出等各种操作。改类具体如下: class stuscore student* head;public:bool add_record();/添加学生成绩记录void display_record();/显示学生成绩记录int length();/学生成绩记录个数bool delete_record();/删除学生成绩记录void save_record();/保存学生成绩记录void load_record();/加载学生成绩记录bool find_record();/查找学生成绩记录stuscore();virtual stuscore();现在就要编写各个功能的函数实体了: 添加学生成绩记录add_record(),建立一个链表:bool stuscore:add_record()int i;int j=1;string Name; string Number;char Sex;double Chengji;student *newnode,*current,*previous;current=previous=head;cout<<"请输入插入的位置:"cin>>i; if(i<=0|i>length()+1)cout<<"输入的位置不正确!" return false;cout<<"请输入学号:" cin>>Number;cout<<"请输入姓名:"cin>>Name; cout<<"请输入性别:"cin>>Sex;cout<<"请输入成绩:" cin>>Chengji;newnode=new student(); newnode->init(Name,Number,Sex,Chengji); newnode->next=null; if(!newnode)cout<<"内存已满!" return false;if(i=1) newnode->next=head;head=newnode;return true; elsewhile(current&&j<i)previous=current; current=current->next; j+;newnode->next=current;previous->next=newnode;return true; 显示学生成绩记录display_record(),具体实现如下:void stuscore:display_record()student*current;current=head;cout<<"表中有"<<length()<<"条记录!n"if(length()cout<<setiosflags(ios:left)<<setw(15)<<"学号"<<setw(15)<<"姓名"<<setw(12)<<"性别"<<setw(5)<<"成绩"<<endl; while(current) cout<<current; current=current->next; 另外,对<<运算符进行了重载,这样就可以直接用cout输出学生成绩记录,函数重载如下:ostream&operator<<(ostream&output,const student *addr)output<<setiosflags(ios:left)<<setw(15)<<addr->number<<setw(15)<<addr->name<<setw(12)<<addr->sex<<setw(5)<<addr->chengji<<endl;return output; 查找学生成绩记录find_record(),具体实现如下:bool stuscore:find_record()student *current,*previous;string Number;cout<<"请输入要查找的学生的学号:"cin>>Number;current=previous=head;while(current)if(current->number=Number)cout<<setiosflags(ios:left)<<setw(15)<<"学号"<<setw(15)<<"姓名"<<setw(12)<<"性别"<<setw(5)<<"成绩"<<endl;cout<<current; return true;elseprevious=current;current=current->next;if(!current)cout<<"没有找到该学生!"return false;return true; 删除学生记录delete_record(),具体实现如下:bool stuscore:delete_record()string s;student*current,*previous;current=previous=head;cout<<"成绩表中有"<<length()<<"个学生成绩记录"<<endl;if(!length()cout<<"学生成绩表已空!n"return false;else cout<<"请输入要删除的学生记录的学号:"cin>>s;while(current)if(current->number=s)if(current=head)head=head->next;delete current;cout<<"删除成功!"return true;elseprevious->next=current->next; delete current;cout<<"删除成功!" return true;elseprevious=current; current=current->next;if(!current)cout<<"没有找到该学号所对应的学生记录!" return false; return true; 保存学生成绩记录save_record(),具体实现如下:void stuscore:save_record()ofstream file;student*current=head;file.open("./fname.txt",ios:out);if(!file)cout<<"打开文件失败!"cin.get();elsewhile(current)if(file&&!file.eof()file.write(char*)current,sizeof(*current); current=current->next;cout<<"保存完成!"file.close(); 加载学生成绩记录load_record(),具体实现如下:void stuscore:load_record()ifstream file;char fname20;student *n;n=new student();cout<<"请输入要打开的文件名(fname.txt):"cin>>fname;file.open(fname,ios:in); if(!file) cout<<"文件打开失败!"cin.get();elsecout<<setiosflags(ios:left)<<setw(21)<<"姓名"<<setw(11)<<"学号"<<setw(5)<<"性别"<<setw(5)<<"成绩"<<endl;while(file&&file.peek()!=EOF)file.read(char*)n,sizeof(*n);cout<<n<<endl;file.close(); 计算学生成绩记录的个数length(),具体实现如下:int stuscore:length()int j=0;student*current;current=head;while(current)current=current->next;j+;return j;三、 程序运行结果: 主菜单界面 : 添加学生成绩记录: 显示学生成绩记录: 按照所示再添加几个学生成绩记录,显示结果为: 查找学生成绩记录: 删除学生成绩记录:删除记录后再显示学生成绩记录: 保存学生成绩记录: 加载学生成绩记录: 退出学生成绩系统:四、 课程设计总结这是一个综合性较强,很实际的一个编程实例。刚学C+时候,感觉类和对象还挺有意思的,刚接触到这个题目时,觉得应该没什么大问题吧,因为,我自认为一些基本知识点都已经掌握了。可是,真的当我动手编程的时候,才发现并没有想象中的那么简单。单个知识点是弄清了,但是,将所有的知识点综合起来运用时,就碰到了各种各样的问题了。有时候,一个错误得找好久,才能发现。本系统的重点就是要会建立两个类。一个是学生类student,用来存放一个学生的成绩记录,相当于一个结构体的功能吧。另一个类是学生成绩记录系统类stuscore,该类用来存放多个学生的成绩记录。难点就是stuscore类里的各个功能的实现。总的来说,添加,显示,查找,这三个功能比较容易,但是,删除,保存,加载这三个功能就需要花点心思了,可能是平时用的比较少吧,生疏了。可见只有通过平时多加练习,才能有助于自己巩固知识点。最后想说的是,调试程序真的很关键。调试程序需要较大的耐心。可能调试程序的时间比自己编写整个程序的时间还要长,下的工夫还要深,但这是一个程序员必须了解,也必须接受的事实。有好几次,几个错误让我很是头疼啊,很想删了,重新来过,可是最后发现,还是得有耐心去调试程序。通过这个实验的练习,我也学到了很多东西,特别是加深了对类和对象理解和应用方面,也很谢谢老师给我的帮助。参考文献:C+程序设计教程(第二版),罗建军等编著,高等教育出版社