《学籍管理系统(C语言课程设计)(华丽版+详细注释)(共27页).docx》由会员分享,可在线阅读,更多相关《学籍管理系统(C语言课程设计)(华丽版+详细注释)(共27页).docx(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上 实验题目:学籍管理系统一、实验目的 综合应用所学的C语言程序设计知识,自行设计并实现一个较为完整的小型管理信息系统。通过系统分析、系统设计、编程实现,写实验报告等环节,初步掌握软件系统的设计方法和步骤,提高灵活运用程序语言进行软件开发的技能,提高程序设计水平和分析问题、解决问题的能力。二、实验内容 1):熟悉C语言的开发环境,按照给定的上机步骤练习完成; 2):熟悉C程序的编辑,编译,链接和运行的过程。3):编译一个应用系统程序,形成一个软件系统。三、详细设计及运行结果1、算法设计学籍管理系统程序采用了结构化程序设计的思想,将程序分解成许多模块,再由主函数调用这些模
2、块,实现不同的功能。1、学生信息结构体:储存学生信息。2、主菜单模块:通过利用输出函数显示输出主菜单信息。3、提示错误信息模块:通过利用输出函数输出提示错误信息。4、提示没有找到模块:通过利用输出函数输出提示没有找到该学生。5、输出中文、英文模块:通过利用输出函数输出中文提示及学生数据。6、定位模块:定位连表中符要求合的接点,并返回该指针。7、增加学生信息模块:通过指针的不断后移逐个接受学生信息并将学生信息付给相应变量。8、查询学生信息模块:根据用户选择按学号或按姓名查询,分别按学号或姓名逐个比较输入的数据与结构体中的数据,有匹配的则输出,没有则提示没有找到。9、删除信息模块:根据用户选择按学
3、号或按姓名删除,分别比对输入数据和结构体中的数据,有匹配的则删除,没有则提示无信息可删。10、修改信息模块:通过用户输入的学号找到相应学生,然后逐项修改学生信息,否则提示无此学生。11、显示信息模块:将学生信息输出。12、保存信息模块:将接受的结构体信息利用指针存入文件中。13、排序模块:按照学生的最高分进行排序,输出。14、统计学生信息模块:逐项比较相邻两项的成绩信息,得到每项最大值,并输出统计结果。15、主函数:通过调用各模块来实现学生信息的管理。2、模块图设计总分主函数增加学生信息删除学生信息查询学生信息修改学生信息显示学生信息保存学生信息学生总分排序统计最高分按学号删除按总分排序按学号
4、查询按姓名删除按英语成绩排序按C语言成绩排序按数学成绩排序按平均分排序按姓名查询总分3、流程图设计1、主函数文件是否能打开提示文件已打开,正在导入提示文件不能打开能不能将文件内容放入节点中关闭文件输出菜单,请用户选择Choice1增加学生信息删除学生信息查询学生信息修改学生信息保存学生信息统计最高分按总分排名01234567按最高分打印8返回2、增加学生信息模块:输入信息提示学生已存在是否存在(Y/N)NY给相应变量返回3删除学生信息文件是否为空输出提示:1、按学号2、按姓名否是没有资料choice12提示输入学号提示输入姓名接收输入学号接收输入姓名是否找到是删除该生信息否有提示没有找到返回4
5、.查询学生信息文件是否为空输出提示:1、按学号2、按姓名否是提示无资料可查choice12提示输入学号提示输入姓名接收输入学号接收输入姓名是否找到是输出查询结果否有提示没有找到返回4、修改学生信息文件中是否有资料是否提示输入要修改的学号是否找到否是接收输入的学号写入新数据并给相应变量提示资料已修改完毕提示无资料可修改提示没有找到返回6、显示学生信息文件是否能打开依次显示学生信息是否提示无资料可查返回7、保存学生信息文件是否能打开是否提示文件打开错误将输入内容存入文件提示保存完成返回8.按总分排序资料知否存在提示无资料查否是依次比较总分得出最大值输出比较结果返回9、统计学生最高分资料知否存在提示
6、无资料可统计否是依次比较总分得出最大值依次比较平均分得出最大值依次比较数学成绩得出最大值依次比较英语成绩得出最大值依次比较C语言成绩得出最大值输出比较结果返回 四、调试情况,设计技巧及体会1、本系统在VC6下编译调试通过,可顺利运行,各项功能达到设计要求 本系统采用分模块调试的方法进行编译,即完成一个函数功能模块就编译一个功能模块,最后再进行整体编译并生成可执行文件honest.exe。在调试过程中主要碰到以下问题:(1)输入函数中的取地址符即“&”不能正确使用,导致程序在输入数据时发生错误。(2)在比较两个字符串时不能正确使用“strcmp”函数,导致比较结果不能输出。(3)在应用指针时没有
7、注意头结点中的数据域中是不存放数据,导致指针指向错误。 2、在这次课程设计中我充分体会到C语言作为一门编程的基本语言它的精妙。通过这次课程设计使我了解到我有很多的不足,在程序调试的时候常常会因为几个错误而弄得心烦,这说明我对知识的掌握还不够牢,在程序设计的过程中也暴露出了我的诸多弊端,借这次课程设计的机会我会认真的加以改正,多多看书 多去图书馆学习,同时应该增强自己的实践能力,为以后的学习打下坚实的基础。五、源程序清单(略,详见电子版实验报告)#include stdio.h #include conio.h#include stdlib.h /*包含后面使用的exit等函数*/#includ
8、e string.h/*包含号面使用的strcmp等函数*/ int havesave=0; /*全集变量*/ struct student char num10;/* 学号 */ char name18; char sex3; int clanguage; int math; int english; int totle; int average; ; typedef struct node /*使用typedef语句,简化程序后续声明定义的键盘输入*/ struct student data; struct node *next; Node,*Link; void menu() print
9、f(n);printf( n);printf( n);printf( n);printf( n); printf( t1添加学生资料ttttt2删除学生资料 n); printf( n); printf( t3查询学生资料ttttt4修改学生资料 n); printf( n); printf( t5保存学生资料ttttt6统计最高分 n); printf( n); printf( t7按总分排名ttttt8打印学生成绩 n);printf( n); printf( t9帮助信息ttttt0退出系统 n);printf( n);printf( n); printf( n);printf( n);
10、 printf(n);printf(n); void print_san() printf(-n); void Wrong() printf(n=提示:输入错误!n); void Nofind() printf(n=提示:没有找到该学生!n); void printchinese() /* 本函数用于输出中文 */ printf(t 学号t 姓名 性别 英语成绩 数学成绩 C语言成绩 总分 平均分n); void printenglish(Node *p)/* 本函数用于输出英文 */ printf(t%-9s%st%st%dt%dt%dt %dt %dn,p-data.num,p-data.
11、name,p-data.sex,p-data.english,p-data.math,p-data.clanguage,p-data.totle,p-data.average); void printhelp()printf(该程序为用C语言编写的学生管理程序,第一次进入该程序需要创建学生数据n);printf(以后进入可根据菜单栏显示实现各项功能,系统默认保存文件位置为D:/学生管理n);printf(按任意键返回);printf(n);getch();Node* Locate(Link l,char findmess,char nameornum) /* 该函数用于定位链表中符合要求的结点
12、,并返回该指针 */ Node *r; if(strcmp(nameornum,num)=0) /* 按学号查询 */ r=l-next; while(r!=NULL) if(strcmp(r-data.num,findmess)=0) return r; r=r-next; else if(strcmp(nameornum,name)=0) /* 按姓名查询 */ r=l-next; while(r!=NULL) if(strcmp(r-data.name,findmess)=0) return r; r=r-next; return 0; void Add(Link l) /* 增加学生
13、*/ Node *p,*r,*s; char num10; r=l; s=l-next; while(r-next!=NULL) r=r-next; /* 将指针置于最末尾 */ while(1) printf(请你输入学号(以0返回上一级菜单:); scanf(%s,num); if(strcmp(num,0)=0) break; while(s) if(strcmp(s-data.num,num)=0) printf(=提示:学号为%s的学生已经存在,若要修改请你选择4 修改!n,num); print_san(); printchinese(); printenglish(s); pri
14、nt_san(); printf(n); return; s=s-next; p=(Node *)malloc(sizeof(Node); strcpy(p-data.num,num); printf(请你输入姓名:); scanf(%s,p-data.name); getchar(); printf(请你输入性别:); scanf(%s,p-data.sex); getchar(); printf(请你输入c语言成绩:); scanf(%d,&p-data.clanguage); getchar(); printf(请你输入数学成绩:); scanf(%d,&p-data.math); ge
15、tchar(); printf(请你输入英语成绩:); scanf(%d,&p-data.english); getchar(); p-data.totle=p-data.english+p-data.clanguage+p-data.math; p-data.average=p-data.totle / 3; /* 信息输入已经完成 */ p-next=NULL; r-next=p; r=p; havesave=1; void Seek(Link l) /* 查询学生 */ int sel; char findmess20; Node *p; if(!l-next) printf(n=提示:
16、没有资料可以查询!n); return; printf(n=1按学号查找n=2按姓名查找n); scanf(%d,&sel); if(sel=1)/* 学号 */ printf(请你输入要查找的学号:); scanf(%s,findmess); p=Locate(l,findmess,num); if(p) printf(tttt查找结果n); print_san();printf(n); printchinese(); printenglish(p);printf(n); print_san();printf(按任意键返回);getch(); else Nofind(); else if(s
17、el=2) /* 姓名 */ printf(请您输入要查找的姓名:); scanf(%s,findmess); p=Locate(l,findmess,name); if(p) printf(tttt查找结果n); print_san();printf(n); printchinese(); printenglish(p);printf(n); print_san();printf(按任意键返回); getch(); else Nofind(); else Wrong(); void Del(Link l) /* 删除 */ int sel; Node *p,*r; char findmess
18、20; if(!l-next) printf(n=提示:没有资料可以删除!n); return; printf(n=1按学号删除n=2按姓名删除n); scanf(%d,&sel); if(sel=1) printf(请您输入要删除的学号:); scanf(%s,findmess); p=Locate(l,findmess,num); if(p) r=l; while(r-next!=p) r=r-next; r-next=p-next; free(p); printf(n=提示:该学生已经成功删除!n); havesave=1; else Nofind(); else if(sel=2) p
19、rintf(请你输入要删除的姓名:); scanf(%s,findmess); p=Locate(l,findmess,name); if(p) r=l; while(r-next!=p) r=r-next; r-next=p-next; free(p); printf(n=提示:该学生已经成功删除!n); havesave=1; else Nofind(); else Wrong(); void Modify(Link l) Node *p; char findmess20; if(!l-next) printf(n=提示:没有资料可以修改!n); return; printf(请您输入要修
20、改的学生学号:); scanf(%s,findmess); p=Locate(l,findmess,num); if(p) printf(请你输入新学号(原来是%s):,p-data.num); scanf(%s,p-data.num); printf(请你输入新姓名(原来是%s):,p-data.name); scanf(%s,p-data.name); getchar(); printf(请你输入新性别(原来是%s):,p-data.sex); scanf(%s,p-data.sex); printf(请你输入新的c语言成绩(原来是%d分):,p-data.clanguage); scan
21、f(%d,&p-data.clanguage); getchar(); printf(请你输入新的数学成绩(原来是%d分):,p-data.math); getchar(); scanf(%d,&p-data.math); printf(请你输入新的英语成绩(原来是%d分):,p-data.english); scanf(%d,&p-data.english); p-data.totle=p-data.english+p-data.clanguage+p-data.math; p-data.average=p-data.totle/3; printf(n=提示:资料修改成功!n); haves
22、ave=1; else Nofind(); void Scoreone(Link l) Node *pm,*pe,*pc,*pt,*pa; /* 用于指向分数最高的接点 */ Node *r=l-next; if(!r) printf(n=提示:没有资料可以统计!n); return ; pm=pe=pc=pt=pa=r; while(r!=NULL) if(r-data.clanguage=pc-data.clanguage) pc=r; if(r-data.math=pm-data.math) pm=r; if(r-data.english=pe-data.english) pe=r; i
23、f(r-data.totle=pt-data.totle) pt=r; if(r-data.average=pa-data.average) pa=r; r=r-next; printf(-统计结果-n); printf(总分最高者:t%st%st %d分n,pt-data.num,pt-data.name,pt-data.totle); printf(平均分最高者:t%st%st %d分n,pa-data.num,pa-data.name,pa-data.average); printf(英语最高者:t%st%st %d分n,pe-data.num,pe-data.name,pe-data.
24、english); printf(数学最高者:t%st%st %d分n,pm-data.num,pm-data.name,pm-data.math); printf(c语言最高者:t%st%st %d分n,pc-data.num,pc-data.name,pc-data.clanguage); print_san(); printf(按任意键返回n);getch(); void Scoretow(Link l) Link ll; Node *p,*rr,*s; ll=(Link)malloc(sizeof(Node); /* 用于做新的连表 */ ll-next=NULL; if(l-next
25、=NULL) printf(n=提示:没有资料可以排序!n); return ; p=l-next; while(p) s=(Node*)malloc(sizeof(Node); /* 新建接点用于保存信息 */ s-data=p-data; s-next=NULL; rr=ll; while(rr-next!=NULL & rr-next-data.totle=p-data.totle) rr=rr-next; if(rr-next=NULL) rr-next=s; else s-next=rr-next; rr-next=s; p=p-next; free(l); l-next=ll-ne
26、xt;printf(n=提示:排序已经完成!n); void printscore(Link l)/打印成绩信息 Node *p; p=l; if(l!=NULL) printf(n全部成绩为:nn); printf(学号t姓名t数学t英语tC语言t平均分t总分nn);p=p-next; do printf(%st%st%dt%dt%dt%dt%dn, p-data.num, p-data.name,p-data.math,p-data.english,p-data.clanguage,p-data.average,p-data.totle); p=p-next; while(p!=NULL)
27、; printf(n);printf(按任意键返回);printf(n);getch(); else printf(n目前数据为空,还没有任何信息,请先创建成绩信息!nn);void Save(Link l) FILE* fp; Node *p; int flag=1,count=0; fp=fopen(D:学生管理,wb); if(fp=NULL) printf(n=提示:重新打开文件时发生错误!n); exit(1); p=l-next; while(p) if(fwrite(p,sizeof(Node),1,fp)=1) p=p-next; count+; else flag=0; br
28、eak; if(flag) printf(n=提示:文件保存成功.(有%d条记录已经保存.)n,count); havesave=0; fclose(fp); void main() Link l;/* 连表 */ FILE *fp; /* 文件指针 */ int sel; char c; char chji; int count=0; Node *p,*r; printf(tttt学生成绩管理系统ntttt-西安邮电学院 微电子0901 李欢(17号)n); l=(Node*)malloc(sizeof(Node); l-next=NULL; r=l; fp=fopen(D:学生管理,rb)
29、; if(fp=NULL) printf(n=提示:文件还不存在,是否创建?(y/n)n); scanf(%c,&chji); if(chji=y|chji=Y) fp=fopen(D:学生管理,wb); printf(n=提示:文件已经打开,正在导入记录.n); fclose(fp); /* 关闭文件 */ printf(n=提示:记录导入完毕,共导入%d条记录.n,count); else exit(0); elsewhile(!feof(fp) p=(Node*)malloc(sizeof(Node); if(fread(p,sizeof(Node),1,fp) /* 将文件的内容放入接
30、点中 */ p-next=NULL; r-next=p; r=p; /* 将该接点挂入连中 */ count+; fclose(fp); /* 关闭文件 */ printf(n=提示:记录导入完毕,共导入%d条记录.n,count); while(1) menu(); printf(请你选择操作:); scanf(%d,&sel); if(sel=0) if(havesave=1) getchar(); printf(n=提示:资料已经改动,是否将改动保存到文件中(y/n)?n); scanf(%c,&c); if(c=y|c=Y) Save(l); printf(n=提示:您已经退出系统,再
31、见!n); break; switch(sel) case 1:Add(l);break; /* 增加学生 */ case 2:Del(l);break;/* 删除学生 */ case 3:Seek(l);break;/* 查询学生 */ case 4:Modify(l);break;/* 修改学生 */ case 5:Save(l);break;/* 保存学生 */case 6:Scoreone(l);break;/*统计最高分*/case 7:Scoretow(l);/*按总分排名*/case 8:printscore(l);break;/*按总分排名打印*/case 9:printf(ttt=帮助信息=n);printhelp();break; default: Wrong();getchar();break; 专心-专注-专业