数据结构课程设计论文--学生信息管理系统
1.学生成绩分析问题
(1)问题描述。录入并保存一个班级学生多门课程的成绩,并对成绩进行分析。
(2)基本要求。a)通过键盘输入各学生的多门课程的成绩,建立相应的文件input.dat。b)对文件input.dat中的数据进行处理,要求具有如下功能:按各门课程成绩排序,并生成相应的文件输出;计算每个人的平均成绩,按平均成绩排序,并生成文件;求出各门课程的平均成绩、最高分、最低分、不及格人数、60~69分人数、70~79分人数、80~89分人数、90分以上人数;根据姓名或学号查询某人的各门课成绩。c)使用Visual C++ 6. 0控制台应用程序开发,界面美观。
(3)测试数据,如下图所示。
学号 | 姓名 | 数学 | 英语 | 计算机 |
01 | 王芳 | 78 | 77 | 90 |
02 | 张强 | 89 | 67 | 88 |
03 | 李浩 | 56 | 66 | 78 |
04 | 黄鹏 | 89 | 86 | 85 |
05 | 尚校 | 67 | 88 | 76 |
06 | 赵鹏 | 45 | 54 | 67 |
07 | 蒋泽 | 78 | 76 | 70 |
2.程序结构及清单
1 程序结构及清单 2 2.1.1 头文件 3 #define NUM1 30 4 class Students 5 { 6 public: 7 Students(char *sNane, int cNumber,int sMath,int sEnglish,int sComputer); 8 Students() 9 {} 10 ~Students() 11 {} 12 char* GetName(); 13 void SetName(char* sName);//获取姓名 14 int GetNumber(); 15 void SetNumber(int sNumber);//获取学号 16 int GetMath(); 17 void SetMath(int sMath);//获取数学成绩 18 int GetEnglish(); 19 void SetEnglish(int sEnglish);//获取英语成绩 20 int GetComputer(); 21 void SetComputer(int sComputer);//获取计算机成绩 22 void disply(Students &st1); 23 //void WriterData(); 24 //void DeleteData(int icount); 25 //void GetStudentsFromFile(int icount);//数据库接口 26 protected: 27 char Name[NUM1]; 28 int Number; 29 int Math; 30 int English; 31 int Computer; 32 }; 33 2.1.2 公共函数 34 #include "stuends.h" 35 #include36 #include 37 #include 38 #include 39 using namespace std; 40 41 Students::Students(char *sName,int sNumber,int sMath,int sEnglish,int sComputer) 42 { 43 strncpy(Name,sName,NUM1); 44 Number=sNumber; 45 Math=sMath; 46 English=sEnglish; 47 Computer=sComputer; 48 } 49 char* Students::GetName() 50 { 51 return Name; 52 } 53 int Students::GetNumber() 54 { 55 return Number; 56 } 57 int Students::GetMath() 58 { 59 return Math; 60 } 61 int Students::GetEnglish() 62 { 63 return English; 64 } 65 int Students::GetComputer() 66 { 67 return Computer; 68 } 69 void Students::SetName(char* sName) 70 { 71 strncpy(Name,sName,NUM1); 72 } 73 void Students::SetNumber(int sNumber) 74 { 75 Number=sNumber; 76 } 77 void Students::SetMath(int sMath) 78 { 79 Math=sMath; 80 } 81 void Students::SetEnglish(int sEnglish) 82 { 83 English=sEnglish; 84 } 85 void Students::SetComputer(int sComputer) 86 { 87 Computer=sComputer; 88 } 89 void Students::disply(Students &st1) 90 { 91 cout< <<" "<<"0"< <<" "< <<" "< <<" "< < 97 #include 98 99 #include 100 #include 101 #include 102 #include 103 using namespace std;104 105 Students st1[20];106 int mm;107 int addmain()108 {109 cout<<"请输入要添加的学生成绩记录的个数"< >mm;111 for(int i=0;i >aName>>aNumber>>aMath>>aEnglish>>aComputer;121 Students st(aName,aNumber,aMath,aEnglish,aComputer);122 st1[i]=st;123 cout<<"添加的记录为:"< >num;135 for(int j=0;j >aName>>aNumber>>aMath>>aEnglish>>aComputer;148 Students st3(aName,aNumber,aMath,aEnglish,aComputer);149 st1[j]=st3;150 st1[j].disply(st1[j]);151 return;152 }153 }154 cout<<"未找到相应的学生的成绩"< >num;161 for(int j=0;j >num;190 for(int j=0;j max[i2])261 {262 int temp;263 temp=max[i];264 max[i]=max[i2];265 max[i2]=temp;266 }267 }268 }//总成绩排序269 void highall()270 {271 temp();272 cout<<"最高总分为:"< <<"分"< maxM[i2])287 {288 int temp;289 temp=maxM[i];290 maxM[i]=maxM[i2];291 maxM[i2]=temp;292 }293 }294 }//数学成绩排序295 void highallM()296 {297 tempM();298 cout<<"最高数学成绩为:"< <<"分"< maxE[i2])313 {314 int temp;315 temp=maxE[i];316 maxE[i]=maxE[i2];317 maxE[i2]=temp;318 }319 }320 }//英语成绩排序321 void highallE()322 {323 tempE();324 cout<<"最高英语成绩为:"< <<"分"< maxC[i2])339 {340 int temp;341 temp=maxC[i];342 maxC[i]=maxC[i2];343 maxC[i2]=temp;344 }345 }346 }//计算机成绩排序347 void highallC()348 {349 tempC();350 cout<<"最高计算级成绩为:"< <<"分"< st1[i2].GetNumber())363 {364 Students temp;365 temp=st1[i1];366 st1[i1]=st1[i2];367 st1[i2]=temp;368 }369 }370 cout<<"按学号排列为:"< 90)397 {398 count++;399 }400 }401 cout<<"数学成绩大于90分的有"< <<"人"< 79 &&st1[i].GetMath()<90)409 {410 count++;411 }412 }413 cout<<"数学成绩在80-89分的有"< <<"人"< 69 &&st1[i].GetMath()<80)421 {422 count++;423 }424 }425 cout<<"数学成绩在70-79分的有"< <<"人"< 59 &&st1[i].GetMath()<70)433 {434 count++;435 }436 }437 cout<<"数学成绩在60-69分的有"< <<"人"< 90)457 {458 count++;459 }460 }461 cout<<"计算机成绩大于90分的有"< <<"人"< 79 &&st1[i].GetComputer()<90)469 {470 count++;471 }472 }473 cout<<"计算机成绩在80-89分的有"< <<"人"< 69 &&st1[i].GetComputer()<80)481 {482 count++;483 }484 }485 cout<<"计算机成绩在70-79分的有"< <<"人"< 59 &&st1[i].GetComputer()<70)493 {494 count++;495 }496 }497 cout<<"计算机成绩在60-69分的有"< <<"人"< 90)517 {518 count++;519 }520 }521 cout<<"英语成绩大于90分的有"< <<"人"< 79 &&st1[i].GetEnglish()<90)529 {530 count++;531 }532 }533 cout<<"英语成绩在80-89分的有"< <<"人"< 69 &&st1[i].GetEnglish()<80)541 {542 count++;543 }544 }545 cout<<"英语成绩在70-79分的有"< <<"人"< 59 &&st1[i].GetEnglish()<70)553 {554 count++;555 }556 }557 cout<<"英语成绩在60-69分的有"< <<"人"< 90)577 {578 count++;579 }580 }581 cout<<"平均成绩大于90分的有"< <<"人"< 79 &&aa<90)590 {591 count++;592 }593 }594 cout<<"平均成绩在80-89分的有"< <<"人"< 69 && aa<80)603 {604 count++;605 }606 }607 cout<<"平均成绩在70-79分的有"< <<"人"< 59 && aa<70)616 {617 count++;618 }619 }620 cout<<"平均成绩在60-69分的有"< <<"人"< >xun;641 if(xun==1)642 {643 displayall();644 }645 else if(xun==2)646 {647 chaxun();648 }649 system("pause");650 }651 void mainloop2()652 {653 addmain();654 system("pause");655 }656 void mainloop3()657 {658 miodefy();659 system("pause");660 }661 void mainloop4()662 {663 deletea();664 system("pause");665 }666 void mainloop5()667 {668 avgs();669 system("pause");670 }671 void mainloop6()672 {673 cout<<"输入 1:查看数学平均成绩"< >m;679 if(m==1)680 {681 avgcm();682 }683 else if(m==2)684 {685 avgcE();686 }687 else if(m==3)688 {689 avgcc();690 }691 else if(m==4)692 {693 avgca();694 }695 system("pause");696 }697 void mainloop7()698 {699 cout<<"输入 1:查看数学最高成绩"< >m;705 if(m==1)706 {707 highallM();708 }709 else if(m==2)710 {711 highallE();712 }713 else if(m==3)714 {715 highallC();716 }717 else if(m==4)718 {719 highall();720 }721 system("pause");722 }723 void mainloop8()724 {725 cout<<"输入 1:查看数学最低成绩"< >m;731 if(m==1)732 {733 lowallM();734 }735 else if(m==2)736 {737 lowallE();738 }739 else if(m==3)740 {741 lowallC();742 }743 else if(m==4)744 {745 lowall();746 }747 system("pause");748 }749 void mainloop9()750 {751 cout<<"输入 1:查看不及格人数"< >i1;758 if(i1==1)759 {760 cout<<"输入 1:查看数学在此范围内人数"< >jj;766 if(jj==1)767 {768 coun1M();769 }770 else if(jj==2)771 {772 coun1E();773 }774 else if(jj==3)775 {776 coun1C();777 }778 else if(jj==4)779 {780 coun1Z();781 }782 }783 else if(i1==2)784 {785 cout<<"输入 1:查看数学在此范围内人数"< >jj;791 if(jj==1)792 {793 coun2M();794 }795 else if(jj==2)796 {797 coun2E();798 }799 else if(jj==3)800 {801 coun2C();802 }803 else if(jj==4)804 {805 coun2Z();806 }807 }808 else if(i1==3)809 {810 cout<<"输入 1:查看数学在此范围内人数"< >jj;816 if(jj==1)817 {818 coun3M();819 }820 else if(jj==2)821 {822 coun3E();823 }824 else if(jj==3)825 {826 coun3C();827 }828 else if(jj==4)829 {830 coun3Z();831 }832 }833 else if(i1==4)834 {835 cout<<"输入 1:查看数学在此范围内人数"< >jj;841 if(jj==1)842 {843 coun4M();844 }845 else if(jj==2)846 {847 coun4E();848 }849 else if(jj==3)850 {851 coun4C();852 }853 else if(jj==4)854 {855 coun4Z();856 }857 }858 else if(i1==5)859 {860 cout<<"输入 1:查看数学在此范围内人数"< >jj;866 if(jj==1)867 {868 coun5M();869 }870 else if(jj==2)871 {872 coun5E();873 }874 else if(jj==3)875 {876 coun5C();877 }878 else if(jj==4)879 {880 coun5Z();881 }882 }883 system("pause");884 }885 void mainloop10()886 {887 sortchengji();888 system("pause");889 }890 2.1.5 主窗体设计及主函数891 void SetScreenGrid()892 {893 //char sysSetBuf[80];894 //sprintf(sysSetBuf,"mode con cols=%d line=%d " ,CMD_COLS,CMD_LINES);895 //system(sysSetBuf);896 system("color 5");897 }//设置显示信息的行数,列数和背景颜色等信息898 int mainlook()899 {900 SetScreenGrid();901 int c;902 do 903 { 904 //设置字体为绿色905 system("cls");906 cout< >c;923 switch(c) 924 { 925 case 1: system("cls");mainloop1(); break; 926 case 2:system("cls");mainloop2();break; 927 case 3: system("cls");mainloop3();break; 928 case 4: system("cls");mainloop4(); break; 929 case 5: system("cls");mainloop5(); break;930 case 6: system("cls");mainloop6(); break;931 case 7: system("cls");mainloop7(); break;932 case 8: system("cls");mainloop8(); break;933 case 9:system("cls");mainloop9();break;934 case 10:system("cls");mainloop10();break;935 default: break;936 } 937 }while(c!=0); 938 return 0;939 }940 int main()941 {942 mainlook();943 return 0;944 }
3.程序功能展示
4.算法描述
1. 设置公共类students,设置姓名Name,学号Number,数学成绩Math,英语成绩English,计算机成绩Computer,四个属性来存储学生成绩记录。
2.公共类设置15个函数来获取信息与成绩及初始化。
1) Students(char *sNane, int cNumber,int sMath,int sEnglish,int sComputer);
2) Students()
3) {}
4) ~Students()
5) {}
6) char* GetName();
7) void SetName(char* sName);//获取姓名
8) int GetNumber();
9) void SetNumber(int sNumber);//获取学号
10) int GetMath();
11) void SetMath(int sMath);//获取数学成绩
12) int GetEnglish();
13) void SetEnglish(int sEnglish);//获取英语成绩
14) int GetComputer();
15) void SetComputer(int sComputer);//获取计算机成绩
3.功能函数。
1) 添加修改成绩功能。
2) 初始化一个对象数组,采用带参数的构造函数初始化记录,完成学生信息的添加,修改功能。
3) 2,删除学生成绩功能。
4) 设置计数器,与学号关联,查询到要删去的学号,去掉该学生的成绩,其他的成绩依次向前移动一位,学生成绩总数减一位。
5) 排序,最低最高成绩功能。
6) 进行学生成绩的排序,对象数组下标为0的是最低成绩,为计数器数字减一的是最高成绩。
7) 各个分数段人数。
8) 进行简单的筛选,外加计数器。
4.排序采用简单的冒泡排序,时间复杂度为O(n)。
5.菜单设计。
函数工能组合后,为mainloop1-10,为了能进行多次功能选择,采用永真的while(1)循环,只有当判断条件(c==0)满足时退出系统。
循环中采用switch,case结构方便进行选择。
6.主窗体设计。
采用system(“cls”)函数调动DOS下的清屏功能,system("color 5")进行文字背景颜色选择功能,使界面看起来美观。
使用system("pause")函数,是程序暂停,给使用者以选择的时间。
5.界面展示
6. 开发难点及解决技巧
1.使各个功能能够持续不断地进行,而不丢失已经录入的数据。
设置一个全局变量的对象数组,每个函数对数组进行操作。
2.菜单设置每次单个功能完成后能再次回到菜单继续执行命令,以及程 序的退出。
为了能进行多次功能选择,采用永真的while(1)循环,只有当判断 条件(c==0)满足时退出系统。
循环中采用switch,case结构方便进行选择。
3.功能执行时,没有给以选择时间,程序闪退。
使用system("pause")函数,是程序暂停,给使用者以选择的时间。
4.快速设置改变背景色,样式,标题,等格式。
采用system(“cls”)系列的函数,调用系统命令,快速改变样式。
例如:
sprintf(sysSetBuf,"mode con cols=%d line=%d " ,CMD_COLS,CMD_LINES);
system(sysSetBuf);
system("color 5");
7.小节
实验过程中学到了不少的知识,例如如何设置菜单,改界面,完一个简单的数据的增删改查的功能,以及简单的从文件中读取 数据的操作,对文件中的数据进行操作。
了解了做一个项目的大致的流程。感觉总体功能做的可以了,也设 置了一个简单的界面。
从文件中读入,写入数据可以采用文件的输入输出流。例如:
#include#include using namespace std;int main(){ofstream fout;fout.open("output.txt");fout << "Here is a number: " << "/n";fout << "Now here is a string: " << "/n";fout << flush;fout.close();ifstream fin("input.txt");return 0;}
时间紧急没有来的及完成。