C++课程设计 张开有.docx
- 文档编号:17154599
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:26
- 大小:193.33KB
C++课程设计 张开有.docx
《C++课程设计 张开有.docx》由会员分享,可在线阅读,更多相关《C++课程设计 张开有.docx(26页珍藏版)》请在冰点文库上搜索。
C++课程设计张开有
C++课程设计报告
题目:
学生成绩管理系统
学生姓名:
张开友
学号:
200917010207
专业班级:
计科09102班
同组姓名:
周波廖鹏
指导教师:
易明
设计时间:
2010年下学期第1~2周
指导老师意见:
评定成绩:
签名:
日期:
1系统的结构设计
通过对学生成绩信息管理系统的功能分析,可以定义出系统的总体结构模块图,如图所示。
学生成绩管理系统总体结构设计
2.系统管理流程图
前面的分析中已经定义了系统各个模块,属于静态建模的范围。
在系统运行时刻的动态模型应该由系统的流程决定。
当用户运行该系统后可以来进行学生成绩信息插入管理、学生成绩信息查询管理、学生成绩信息删除管理、学生成绩信息修改管理及学生成绩信息输出等操作,具体的流程如图3.2所示。
系统流程图
3.系统详细设计
系统总体设计完成后,就可以根据需求对各个模块来进行实现了。
在本系统中需要编码实现的主要有学生成绩信息插入、学生成绩信息查询、学生成绩信息修改、学生成绩信息删除和学生成绩信息输出等5个模块。
(1)学生成绩插入模块
添加的信息包括学号(不允许重复)、姓名(不允许重复)、语文成绩、数学成绩和英语成绩。
流程图如下图4.1所示。
插入模块流程图
本程序采用的是尾插法,就是每次将新申请的结点插在终端结点的后面,其执行过程如图所示。
尾插法建立单链表操作示意图
(2)学生成绩查询模块
按姓名和学号查找学生成绩的流程图分别如下图所示。
按学号查找学生成绩信息流程图
在单链表中,即使知道被访问结点的位置i,也不能像顺序表那样直接按序号访问,而只能从头指针出发,设置一个工作指针p,顺next域逐个结点往下搜索。
当p指向某个结点时判断是否为第i个结点,若是则查找成功;否则,将工作指针p后移,即将p指向原来所指结点的后继结点。
直到p为NULL时查找失败。
单链表查找过程如图所示。
单链表查找过程的示意图
按学号查询学生成绩信息同按姓名查找学生成绩信息,此处不再详细列出。
(3)学生成绩修改模块
首先要查找与要修改数据相匹配的信息,若没有则返回失败。
否则把相应的信息输出,然后再重新输入新的数据并保存到单链表。
(4)学生成绩删除模块
当选择删除功能时,首先输入要删除的同学的姓名,然后输入要删除的同学的学号,如果该同学存在并且姓名与学号匹配的上,则进行删除操作,否则返回失败。
其流程图如下:
删除学生信息模块流程图
删除操作定义为将单链表的第i个结点删去。
因为在单链表中结点ai存储地址在其前驱结点ai-1的指针域,所以必须首先找到ai-1的存储地址p,然后令p的next域指向ai的后继结点,即把结点ai从链上摘下来,最后释放结点ai的存储空间,如图所示。
在单链表中删除结点指针的变化情况
(5)学生成绩输出模块
从单链表表头遍历整个单链表,将所有数据输出。
其部分代码如下:
voidFunction:
:
Show()
{charchoose;
Student*temp;
system("cls");
temp=Student_First->Next;
if(!
temp)
{cout<<"文件无数据\n\n"< cout<<"1.返回主菜单"< cin>>choose; while(choose! ='1') {cout<<"1.返回主菜单"< cin>>choose; } Menu(); } else {cout<<"姓名\t学号\t语文成绩\t数学成绩\t英语成绩\n"; while(temp! =NULL) {temp->Out(); temp=temp->Next; } } cout<<"1.返回主菜单"< cin>>choose; while(choose! ='1') {cout<<"1.返回主菜单"< cin>>choose; } Menu(); } 4.主程序 #include #include #include #include #include usingnamespacestd; typedefstructSTUDENT { charstudentNumber[10];/*学生学号*/ charstudentName[20];/*学生姓名*/ charclassName[20];/*班级名称*/ floatmark1;/*第1门成绩*/ floatmark2;/*第2门成绩*/ floatmark3;/*第3门成绩*/ structSTUDENT*next; }STUDENT; STUDENT*headLink;/*链表表头指针*/ voidReadInfoFormFile(void);/*以下是函数声明*/ voidDesplayMenu(void); voidCreateHeadLink(void); STUDENT*MallocNode(void); voidGetInformation(STUDENT*t); voidOutputInformation(void); voidDesplayInfoBystudentNumber(void); voidDesplayOneNode(STUDENT*t); voidInsertOneNode(STUDENT*t); voidDeleteNodeBystudentNumber(void); voidChangeMarkByNumber(void); voidSaveLinkToFile(void); voidDesplayMarkSegment(void); voidCompositorByTotalMark(void); intchoose;/*用于接受用户的选择*/ voidyonghudenglu(void); voidputong(void); voidpass(void); voidmain()/*主函数*/ { CreateHeadLink(); ReadInfoFormFile(); yonghudenglu(); DesplayMenu(); } voidyonghudenglu(void) { cout<<"****************MUNE***************\n\n"; cout<<"*用户登陆*\n"; cout<<"*1管理员登陆*\n"; cout<<"*2普通用户登陆*\n"; cout<<"*3退出*\n"; cout<<"****************END******************\n"; puts("pleaseinputyourchoose(1~3)"); cin>>choose; switch(choose) { case1: DesplayMenu(); getch(); break; case2: putong(); getch(); break; case3: SaveLinkToFile();/*保存数据后再退出*/ free(headLink); exit (1); break; default: break; } system("cls"); DesplayMenu();/*递归调用*/ } /************************************ 函数功能: 从文件中读学生信息到链表中 ************************************/ voidReadInfoFormFile(void) { FILE*fp; STUDENT*p; fp=fopen("c: \\snow.txt","rb"); if(! fp) { cout<<"文件不存在\n"; return; } p=MallocNode(); while(fscanf(fp,"%s%s%s%f%f%f",p->studentNumber,p->studentName,p->className,&(p->mark1),&(p->mark2),&(p->mark3))>0) { InsertOneNode(p); p=MallocNode(); } fclose(fp); } /************************************ 函数功能: 显示菜单,根据用户的输入 完成相应的功能 ************************************/ voidDesplayMenu(void) { STUDENT*p; cout<<"****************MUNE***************\n\n"; cout<<"*1显示所有学生的信息*\n"; cout<<"*2按学号查询*\n"; cout<<"*3增加学生*\n"; cout<<"*4删除学生*\n"; cout<<"*5按学号修改学生成绩*\n"; cout<<"*6保存所有学生信息*\n"; cout<<"*7显示优秀和不及格学生成绩*\n"; cout<<"*8排序结果并输出绩*\n"; cout<<"*0退出*\n"; puts("****************END******************\n"); puts("pleaseinputyourchoose(0~8)"); cin>>choose;/*取得用户的选择*/ switch(choose) { case1: OutputInformation();/*显示所有学生的信息*/ getch(); break; case2: DesplayInfoBystudentNumber();/*根据用户输入的学号显示该学生的信息*/ getch(); break; case3: p=MallocNode();/*先申请一个新结点*/ GetInformation(p);/*要求用户输入信息到新结点中*/ InsertOneNode(p);/*将新结点加到链表中*/ break; case4: DeleteNodeBystudentNumber();/*根据用户输入的学号删除该学生*/ getch(); break; case5: ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/ getch(); break; case6: SaveLinkToFile();/*保存数据*/ break; case7: DesplayMarkSegment();/*显示各分数段的学生成绩*/ getch(); break; case8: CompositorByTotalMark(); getch(); break; case0: SaveLinkToFile();/*保存数据后再退出*/ free(headLink); exit (1); break; default: break; } system("cls"); DesplayMenu();/*递归调用*/ } /************************************ 函数功能: 建立链表表头 ************************************/ voidputong(void) { cout<<"****************MUNE***************\n\n"; cout<<"*1显示所有学生的信息*\n"; cout<<"*2按学号查询*\n"; cout<<"*3按学号修改学生成绩*\n"; cout<<"*4显示优秀和不及格学生成绩*\n"; cout<<"*5排序结果并输出绩*\n"; cout<<"*0退出*\n"; puts("****************END******************\n"); puts("pleaseinputyourchoose(0~5)"); cin>>choose;/*取得用户的选择*/ switch(choose) { case1: OutputInformation();/*显示所有学生的信息*/ getch(); break; case2: DesplayInfoBystudentNumber();/*根据用户输入的学号显示该学生的信息*/ getch(); break; case3: ChangeMarkByNumber();/*根据用户输入的学号修改学生成绩*/ getch(); break; case4: DesplayMarkSegment();/*显示各分数段的学生成绩*/ getch(); break; case5: CompositorByTotalMark(); getch(); break; case0: SaveLinkToFile();/*保存数据后再退出*/ free(headLink); exit (1); break; default: break; } } voidCreateHeadLink(void) { STUDENT*p; p=(STUDENT*)malloc(sizeof(STUDENT)); headLink=p; p->next=NULL; } 5.系统实现 (主要负责模块的核心实现代码) /************************************ 管理员登录/密码修改 ************************************/ voidmanager: : enter()//修改密码 { } stringgetPW(charpwCh='*') { constintlength=18;//最大密码长度=18 charpass[length]={0}; for(inti=0;i { pass[i]=getch(); if(pass[i]=='\r') { pass[i]=0; cout< returnstring(pass); } cout< } cout< returnstring(pass); } //登录函数 intmanager: : pass() { stringpass1,pass2,pass3; inti=0; ifstreamfin("D: \\code.txt"); if(! fin) { system("cls"); do { system("cls"); stringpass("123"); cout< cout<<"\t\t"< cout< "< cout< "< cout< "; if(! pare(getPW())) { choose_face2(); return0; } else { cout< \n"< system("pause"); i++;////错误次数计数 } }while(i<3); if(i==3) { cout< "< exit(0); } } fin>>pass2;//从文件里读密码 pass3=pass2; do { system("cls"); cout< cout< "< cout< "< cout< "; if(! pare(getPW())) { choose_face2(); return0; } else { cout< \n"< system("pause"); i++;////错误次数计数 } }while(i<3); if(i==3) { cout< "< exit(0); } return0; } /************************************ 函数功能: 根据输入的学号修改成绩 ************************************/ voidChangeMarkByNumber(void) { STUDENT*p; charstudentNumber[20]; charflag=0; floatmark1,mark2,mark3; p=headLink->next; printf("请输入学生学号: \n"); scanf("%s",studentNumber); while(p) { if(strcmp(p->studentNumber,studentNumber)==0) { cout<<"请输入新的第1门成绩: \n"; cin>>mark1; cout<<"请输入新的第2门成绩: \n"; cin>>mark2; cout<<"请输入新的第3门成绩: \n"; cin>>mark3; p->mark1=mark1; p->mark2=mark2; p->mark3=mark3; flag=1; cout<<"修改成功\n"; break; } p=p->next; } if(! flag) printf("对不起,不存在学号为%s的学生\n",studentNumber); } /************************************ 函数功能: 显示优秀和不及格学生成绩 ************************************/ voidDesplayMarkSegment(void) { STUDENT*p; intcount=0; p=headLink->next; cout<<"有一门60分以下(不及格)的学生成绩如下: \n"; cout<<"学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"; while(p) { if((6>((int)(p->mark1/10)))||(6>((int)(p->mark2/10)))||(6>((int)(p->mark3/10))))/*只要有一科不及格就认为该生不及格*/ { count++; DesplayOneNode(p); } p=p->next; } cout<<"不及格的学生一共有%d人\n",count; p=headLink->next; cout<<"成绩优秀的学生成绩如下: "; cout<<"学号\t姓名\t班级\t成绩1\t成绩1\t成绩3\t总成绩\t平均成绩\n\n"; count=0; while(p) { if((8<=((int)(p->mark1/10)))&&(8<=((int)(p->mark2/10)))&&(8<=((int)(p->mark3/10)))) { count++; DesplayOneNode(p); } p=p->next; } cout<<"成绩优秀的学生一共有%d人\n",count; } /************************************ 函数功能: 按总成绩排序 ************************************/ voidCompositorByTotalMark(void) { STUDENTexchange,*r,*p,*q; r=headLink->next; if(r==NULL) { cout<<"现在还没学生信息,请先输入学生信息\n"; return; } while(r)/*两层while循环实现排序*/ { p=r; q=r->next; while(q) { if((q->mark1+q->mark2+q->mark3)>(p->mark1+p->mark2+p->mark3)) { strcpy(exchange.studentNumber,q->studentNumber);/*先复制q结点信息到exchange*/ strcpy(exchange.studentName,q->studentName); strcpy(exchange.className,q->className); exchange.mark1=q->mark1; exchange.mark2=q->mark2; exchange.mark3=q->mark3; strcpy(q->studentNumber,p->studentNumber);/*再复制p结点信息到q*/ strcpy(q->studentName,p->studentName); strcpy(q->class
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+课程设计 张开有 C+ 课程设计 张开