《自己的成绩管理系统.docx》由会员分享,可在线阅读,更多相关《自己的成绩管理系统.docx(25页珍藏版)》请在三一文库上搜索。
1、.课程设计C+程序设计 题目: 学生成绩管理系统设计队人员: 胡金霞 200814350104 倪静 200814350109漆振华 200814350114阳林志 200814350133 2008级计算机系通信工程一班指导老师: 段筠完成日期:2010年1月3日目录需求分析. 3概要设计.4详细设计.5调试分析.7测试结果.8附录.14I 需求分析:【问题描述】 现有学生成绩信息,内容如下姓名 学号 语文 数学 英语 张明明
2、160; 01 67 78 82李成友 02 78 91 88张辉灿 03 68 82 &
3、#160; 56王露 04 56 45 77陈东明 05 67 38 47. .
4、0; . . 【基本需求】 进行成绩的录入、浏览和查询、排序。 【功能需求】系统以菜单方式工作成绩信息录入功能(成绩信息用文件保存)输入成绩信息浏览功能输出查询功能:(至少一种查询方式)算法按姓名查询按学号查询排序功能:(选择一种排序方式)- - 算法 按升序排序 按降序排序II 概要设计:1、系统总体结构学生成绩管理系统主菜单输入信息增加信息删除信息修改信息查询信息按成绩排序Main()SwitchCase*filejsi按学号按姓名删除g
5、oto按学号按姓名查询按语文按数学按英语排序系统分别由主菜单,学生成绩输入,增加学生信息,删除学生信息,查询学生信息,按成绩排序模块构成,通过主菜单可以选择进入各个功能模块,通过各个能模块实现每个功能.每个功能模块调用各函数完成相应的功能.其中:设计目的与内容由倪静完成;算法与源程序由漆振华、阳林志共同完成;最后的调试与测试数据由胡金霞完成。2、模块分析(1)输入、添加及保存信息在主函数的switch()中,用do-while循环进行信息的输入和添加,并按照相应的提示信息判别是否继续添加数据,再在头文件<fstream.h>目录下调用ofstream函数以文件的形式保存输入的信息。
6、(2)删除、修改信息用switch()结构调用相应的删除类型,选择1为按学号删除,2为按姓名删除,删除与输入信息一致的数据,并给出提示语句:您确实要删除该学生的记录吗?(y/n);在case3中进行信息的修改,给指定的学生赋以新的数据,如果指定的学生不存在,给出提示信息:您要修改的学生不存在!请重新输入!。(3)查询在case4、case5中分别进行按姓名、按学号查询的操作,输入学生的姓名或学号,输出对应的学生的信息,如果查询的信息不存在,指出:对不起!您要查询的学生不存在!,根据提示语句,确定是否继续查询。(4)按语文、英语、数学排序用switch()结构调用相应的排序类型,选择1为按语文排
7、序,2为按数学排序,3为按英语排序,根据不同的选择用表格的形式对应输出相应的内容,本程序提供两种方法:冒泡法和排序法。III 详细设计1、学生类#include<iostream.h>#include<string.h>#include<fstream.h>#include<ctime> #include<conio.h> #include<stdlib.h>#include<iomanip.h>class student private: public: student(); student(char sna
8、me20,long num,int chi,int mat,int eng) friend void main();2、输入、添加及保存信息switch(p) case '0': /输入信息case '1': /添加信息filej=new ofstream("E:程序设计.txt",ios:ate);*filej<<" 姓名 "<<name<<" 学号 "<<number<<" 语文成绩 "<<chinese&l
9、t;<" 数学成绩 "<<math<<" 英语成绩 "<<english<<endl;j+;si=new student(name, number,chinese,math,english);i+;3、删除、修改信息for(int j=t;j<=i-1;j+) /删除记录 sj=sj+1;i-;cout<<"该记录已删除!"<<endl;if(strcmp(name,sh->name)=0) /修改信息cout<<" 请输入
10、新的学号:"cin>>num;cout<<" 请输入语文成绩:"cin>>chi; cout<<" 请输入数学成绩:"cin>>mat;cout<<" 请输入英语成绩:"cin>>eng;sh->chinese=chi;sh->math=mat;sh->english=eng;sh->number=num;cout<<" 数据修改成功!"<<endl;4、查询if(strcm
11、p(n,(*sj).name)=0) /按姓名查询if(sj->number=n) /按学号查询cout<<" 您要查询的学生是:"<<(*sj).name<<endl; 5、按语文、英语、数学排序if(sk->chinese<sh->chinese) /利用选择法进行排序if(sh->chinese<sh+->chinese) /利用冒泡法进行排序6、输出与退出for(int j=0;j<i;j+) /输出cout<<setw(10)<<sj->name<
12、;<" | "<<sj->number<<" | "<<(*sj).chinese<<" | "<<(*sj).math<<" | "<<(*sj).english<<endl;cout<<" -The End-"<<endl;cout<<" !Bye bye!"<<endl;exit(0); /退出IV 调试分析错误1:
13、-Configuration:Cpp1-Win32 Debug -Compiling.Cpp1.cppE:程序设计新建文件夹Cpp1.cpp(26) : error C2065: 'time_t' : undeclared identifierE:程序设计新建文件夹Cpp1.cpp(26) : error C2146: syntax error : missing '' before identifier 't'E:程序设计新建文件夹Cpp1.cpp(26) : error C2065: 't' : undeclared iden
14、tifierE:程序设计新建文件夹Cpp1.cpp(27) : error C2065: 'time' : undeclared identifierE:程序设计新建文件夹Cpp1.cpp(31) : error C2065: 'ctime' : undeclared identifierE:程序设计新建文件夹Cpp1.cpp(54) : error C2065: 'x' : undeclared identifierE:程序设计新建文件夹Cpp1.cpp(421) : error C2065: 'setw' : undeclar
15、ed identifierE:程序设计新建文件夹Cpp1.cpp(482) : error C2228: left of '.chinese' must have class/struct/union type执行 cl.exe 时出错.Cpp1.exe - 4 error(s), 0 warning(s)错误分析:*Si是指针对象,调用形式错误;未包含时间控制的头文件<ctime>.错误2:-Configuration: Cpp1 - Win32 Debug-Compiling.Cpp1.cppE:程序设计新建文件夹Cpp1.cpp(54) : error C20
16、65: 'x' : undeclared identifierE:程序设计新建文件夹Cpp1.cpp(421) : error C2065: 'setw' : undeclared identify执行 cl.exe 时出错.:Cpp1.exe - 2 error(s), 0 warning(s)错误分析:程序中用到了setw()函数,但是并未包含头文件<iomanip.h>.错误3:-Configuration: Cpp1 - Win32 Debug-Compiling.Cpp1.cppe:程序设计新建文件夹cpp1.cpp(54) : error
17、 C2065: 'x' : undeclared identifier执行 cl.exe 时出错.Cpp1.exe - 1 error(s), 0 warning(s)错误分析:程序中用到了参数x,但是并未定义。修改以上错误后,调试程序:- Configuration: Cpp1 - Win32 Debug -Compiling.Cpp1.cppLinking.Cpp1.exe - 0 error(s), 0 warning(s)V 测试结果VI 附录:1、 程序源代码#include<iostream.h>#include<string.h>#incl
18、ude<fstream.h>#include<ctime> #include<conio.h>#include<iomanip.h> #include<stdlib.h>class student private:char name20; /姓名 int chinese,math,english; /课程 long number; /学号 public: student(); student(char sname20,long num,int chi,int mat,int eng) strcpy(name,sname);number
19、=num; chinese=chi;math=mat;english=eng; friend void main();void main()time_t t; time(&t); cout<<"*"<<endl; cout<<" * 学生成绩管理系统 *"<<endl;cout<<"*"<<endl; cout<<" 系统时间和日期:"<<'t'<<ctime(&t)<&
20、lt;endl; cout<<" *0、输入数据 *"<<endl;cout<<" *1、增加数据 *"<<endl;cout<<" *2、删除数据 *"<<endl;cout<<" *3、修改数据 *"<<endl;cout<<" *4、按姓名查询 *"<<endl;cout<<" *5、按学号查询 *"<<endl;cout<
21、;<" *6、按成绩排序 *"<<endl;cout<<" *7、输出所有学生的成绩 *"<<endl;cout<<" *8、退出系统 *"<<endl;cout<<" *"<<endl;cout<<" 选择0-8数字进行操作"<<endl;cout<<" =制作人:胡金霞、倪静、阳林志、漆振华="<<endl;char p;char w;
22、student *s50; /指针对象,最多存50个学生数据ofstream *file50; /负责对文件插入操作int i=0,j=0,x=0;do /x判断输入是否有效cin>>p;if(p>='0'&&p<='8')x=1;elsecout<<" 指令错误!请重新输入:"<<endl;while(x=0);doswitch(p) /接收功能选项case '0': /输入数据system("cls");char c;char name20
23、;long number;int chinese,math,english;docout<<"请输入姓名|学号|语文成绩| 数学成绩 | 英语成绩"<<endl;cin>>name>>number>>chinese>>math>>english;cout<<endl;filej=new ofstream("E:程序设计.txt",ios:ate);*filej<<"姓名"<<name<<"学号&
24、quot;<<number<<"语文成绩" <<chinese<<"数学成绩"<<math<<"英语成绩"<<english<<endl;j+;si=new student(name, number,chinese,math,english);i+;cout<<" 数据输入成功,想继续输入吗(y/n):"cin>>c;cout<<endl;do if(c!='y'&am
25、p;&c!='n') cout<<" 指令错误!请重新输入!"<<endl;cin>>c; else x=1; while(x=0); while(c='y'); break;case '1': /增加数据char name20,c; long number; int chinese,math,english; docout<<"请输入姓名 |学号|语文成绩|数学成绩|英语成绩"<<endl; cin>>name>>
26、number>>chinese>>math>>english; cout<<endl; filej=new ofstream("E:程序设计.txt",ios:ate);*filej<<"姓名"<<name<<"学号"<<number<<"语文成绩"<<chinese<<"数学成绩"<<math<<"英语成绩"<&l
27、t;english<<endl; j+; si=new student(name, number, chinese,math,english); i+; cout<<" 数据输入成功,想继续数入吗(y/n):" cin>>c; cout<<endl; if(c!='y'&&c!='n') cout<<" 指令错误!请重新输入!"<<endl;cin>>c; while(c='y'); break; case
28、'2': /删除数据char c;cout<<endl<<endl;if(i=0)cout<<" 管理系统中没有输入数据!"<<endl;break;cout<<" -删除一个学生-n"cout<<" 1. 按学号删除n"cout<<" 2. 按姓名删除n"cout<<" -n"cout<<" 您的选择:"cin>>c;switch(c) c
29、ase '1': int num,t=0; docout<<"请输入您要删除的学号:" cin>>num; while (num<100000|num>999999) cout<<"您输入的学号错误,请输入一个六位数的学号" <<endl; cin>>num; for(int t=0;t<i;t+) if(st->number=num) x=1; cout<<" 您要删除的学生是:"<<(*st).name<
30、;<endl;cout<<(*st).name<<"的成绩是:"<<"语文:"<<(*st).chinese<<"数学:"<<(*st).math<<" 英语:"<<(*st).english<<endl; cout<<"您确实要删除该学生的记录吗?(y/n)" cin>>c; if(c='y'|c='Y') for(int j
31、=t;j<=i-1;j+) /删除记录 sj=sj+1;i-;cout<<"该记录已删除!"<<endl; goto lab2; else cout<<"该记录未删除!"<<endl; x=1; goto lab2; if(c!='y'&&c!='n') cout<<" 指令错误!请重新输入!"<<endl;cin>>c; if(x=0) cout<<"很抱歉,没有找到您要找的
32、学号!"<<endl; break; while(c='y'); case '2': char name20; docout<<"请输入您要删除的学生的姓名:" cin>>name; for(int t=0;t<i;t+)if(strcmp(st->name,name)=0) x=1;cout<<" 您要删除的学生是:"<<(*st).name<<endl; cout<<(*st).name<<"
33、的成绩是:"<<"语文:"<<(*st).chinese<<"数学:"<<(*st).math<<"英语:"<<(*st).english<<endl;cout<<"您确实要删除该学生的记录吗?(y/n)" cin>>c; if(c='y'|c='Y') for(int j=t;j<=i-1;j+) /删除记录 sj=sj+1; i-; cout<<
34、"该记录已删除!"<<endl; goto lab2; else cout<<"该记录未删除!"<<endl; x=1; goto lab2; if(c!='y'&&c!='n')cout<<" 指令错误!请重新输入!"<<endl;cin>>c;goto lab2; if(x=0) cout<<"很抱歉,没有找到您要找的学生!"<<endl;break; while(c=
35、'y'); break;case '3': /修改数据char name20,c;long num;int chi,mat,eng;if(i=0)cout<<" 管理系统中没有输入数据!"<<endl;break; docout<<" 请输入您要修改的学生的姓名:"cin>>name;cout<<endl;for(int h=0;h<i;h+) /h纪录要修改学生的位置 if(strcmp(name,sh->name)=0) x=1; cout<
36、<" 请输入新的学号:"cin>>num; cout<<" 请输入语文成绩:"cin>>chi; cout<<" 请输入数学成绩:"cin>>mat; cout<<" 请输入英语成绩:"cin>>eng; cout<<endl; sh->chinese=chi;sh->math=mat; sh->english=eng;sh->number=num; cout<<" 数
37、据修改成功!"<<endl;break; if(x=0)cout<<" 您要修改的学生不存在!请重新输入!"<<endl;cout<<" 想继续修改吗(y/n):"cin>>c;cout<<endl;if(c!='y'&&c!='n')cout<<" 指令错误!请重新输入!"<<endl;cin>>c;while(c='y');break;case
38、9;4': /按姓名查询char n20,c;int j=0;if(i=0)cout<<" 管理系统中没有输入数据!"<<endl;break; doint x=0; cout<<" 请输入您要查询的学生姓名:"cin>>n; cout<<endl; for(int j=0;j<i;j+)if(strcmp(n,(*sj).name)=0) x=1; cout<<" 您要查询的学生是:"<<(*sj).name<<endl;
39、cout<<(*sj).name<<"的成绩是:"<<"语文:"<<(*sj).chinese<<"数学:"<<(*sj).math<<" 英语: "<<(*sj).english<<endl; if(x=0)cout<<" 对不起!您要查询的学生不存在!"<<endl;cout<<" 您想继续查询吗?(y/n):"cin>&g
40、t;c;cout<<endl;if(c!='y'&&c!='n')cout<<" 指令错误!请重新输入!"<<endl;cin>>c; while(c='y'); break; case '5': /按学号查询int n,j=0;char c;if(i=0)cout<<" 管理系统中没有输入数据!"<<endl;break; doint x=0; cout<<" 请输入您要查询的学生
41、的学号:"cin>>n; cout<<endl; for(int j=0;j<i;j+) if(sj->number=n)x=1;cout<<" 您要查询的学生是:"<<(*sj).name<<endl;cout<<(*sj).name<<"的成绩是: "<<"语文:"<<(*sj).chinese<<"数学:"<<(*sj).math<<"
42、英语:"<<(*sj).english<<endl; if(x=0)cout<<" 对不起!您要查询的学生不存在!"<<endl; cout<<" 您想继续查询吗?(y/n):"cin>>c; cout<<endl;if(c!='y'&&c!='n')cout<<"指令错误!请重新输入!"<<endl;cin>>c;while(c='y');b
43、reak;case '6': /排序模块char c;int k=0;if(i=0)cout<<" 管理系统中没有输入数据!"<<endl;break; lab1:cout<<" -按成绩排序-n"cout<<" 1. 按语文成绩n"cout<<" 2. 按数学成绩n"cout<<" 3. 按英语成绩n"cout<<" -n"cout<<" 你的选择:&q
44、uot;cin>>c;switch(c) case '1':char n20;int r; for(int k=0;k<i;k+) for(int h=0;h<i-k;h+) if(sk->chinese<sh->chinese) /选择法排序 strcpy(n,(*sh).name); strcpy(*sh).name,(*sk).name); strcpy(*sk).name,n);r=(*sh).number; (*sh).number=(*sk).number;(*sk).number=r; r=(*sh).chinese; (
45、*sh).chinese=(*sk).chinese; (*sk).chinese=r;r=(*sh).math; (*sh).math=(*sk).math; (*sk).math=r; r=(*sh).english; (*sh).english=(*sk).english; (*sk).english=r; /*if(sh->chinese<sh+->chinese) / 冒泡法排序 strcpy(n,(*sh+).name); strcpy(*sh+).name,(*sh).name); strcpy(*sh).name,n);r=(*sh+).number; (*s
46、h+).number=(*sh).number; (*sh).number=r;r=(*sh+).chinese; (*sh+).chinese=(*sh).chinese; (*sh).chinese=r;r=(*sh+).math; (*sh+).math=(*sh).math; (*sh).math=r;r=(*sh+).english; (*sh+).english=(*sh).english; (*sh).english=r;*/ cout<<" 姓名 |学号 | 语文 | 数学 | 英语 "<<endl; for(int j=0;j<
47、;i;j+) cout<<setw(10)<<sj->name<<"|"<<sj->number<<"|"<<(*sj).chinese<<"|"<<(*sj).math<<"|"<<(*sj).english<<endl;break;goto lab1; case '2': char n20; int r; for(int k=0;k<i;k+) f
48、or(int h=0;h<i-k;h+) if(sk->math<sh->math) /利用选择法进行排序 strcpy(n,(*sh).name); strcpy(*sh).name,(*sk).name); strcpy(*sk).name,n);r=(*sh).number; (*sh).number=(*sk).number;(*sk).number=r;r=(*sh).chinese; (*sh).chinese=(*sk).chinese; (*sk).chinese=r;r=(*sh).math; (*sh).math=(*sk).math; (*sk).
49、math=r;r=(*sh).english; (*sh).english=(*sk).english; (*sk).english=r; cout<<" 姓名 | 学号 | 语文 | 数学 | 英语 "<<endl; for(int j=0;j<i;j+) cout<<setw(10)<<sj->name<<"|"<<sj->number<<"|"<<(*sj).chinese<<"|"&
50、lt;<(*sj).math<<"|"<<(*sj).english<<endl;break;goto lab1; case '3': char n20; int r; for(int k=0;k<i;k+) for(int h=0;h<i-k;h+) if(sk->english<sh->english) /选择法排序 strcpy(n,(*sh).name); strcpy(*sh).name,(*sk).name); strcpy(*sk).name,n);r=(*sh).number; (*sh).number=(*sk).number;(*sk).number=r;r=(*sh).chinese; (*sh).chinese=(*sk).chinese; (*s