学籍管理系统C语言课程设计华丽版 详细注释.docx
《学籍管理系统C语言课程设计华丽版 详细注释.docx》由会员分享,可在线阅读,更多相关《学籍管理系统C语言课程设计华丽版 详细注释.docx(33页珍藏版)》请在冰豆网上搜索。
学籍管理系统C语言课程设计华丽版详细注释
实验题目:
学籍管理系统
一、实验目的
综合应用所学的C语言程序设计知识,自行设计并实现一个较为完整的小型管理信息系统。
通过系统分析、系统设计、编程实现,写实验报告等环节,初步掌握软件系统的设计方法和步骤,提高灵活运用程序语言进行软件开发的技能,提高程序设计水平和分析问题、解决问题的能力。
二、实验内容
1):
熟悉C语言的开发环境,按照给定的上机步骤练习完成;
2):
熟悉C程序的编辑,编译,链接和运行的过程。
3):
编译一个应用系统程序,形成一个软件系统。
三、详细设计及运行结果
1、算法设计
学籍管理系统程序采用了结构化程序设计的思想,将程序分解成许多模块,再由主函数调用这些模块,实现不同的功能。
1、学生信息结构体:
储存学生信息。
2、主菜单模块:
通过利用输出函数显示输出主菜单信息。
3、提示错误信息模块:
通过利用输出函数输出提示错误信息。
4、提示没有找到模块:
通过利用输出函数输出提示没有找到该学生。
5、输出中文、英文模块:
通过利用输出函数输出中文提示及学生数据。
6、定位模块:
定位连表中符要求合的接点,并返回该指针。
7、增加学生信息模块:
通过指针的不断后移逐个接受学生信息并将学生信息付给相应变量。
8、查询学生信息模块:
根据用户选择按学号或按姓名查询,分别按学号或姓名逐个比较输入的数据与结构体中的数据,有匹配的则输出,没有则提示没有找到。
9、删除信息模块:
根据用户选择按学号或按姓名删除,分别比对输入数据和结构体中的数据,有匹配的则删除,没有则提示无信息可删。
10、修改信息模块:
通过用户输入的学号找到相应学生,然后逐项修改学生信息,否则提示无此学生。
11、显示信息模块:
将学生信息输出。
12、保存信息模块:
将接受的结构体信息利用指针存入文件中。
13、排序模块:
按照学生的最高分进行排序,输出。
14、统计学生信息模块:
逐项比较相邻两项的成绩信息,得到每项最大值,并输出统计结果。
15、主函数:
通过调用各模块来实现学生信息的管理。
2、模块图设计
总分
3、流程图设计
1、主函数
2、增加学生信息模块:
3删除学生信息
4.查询学生信息
4、修改学生信息
6、显示学生信息
7、保存学生信息
8.按总分排序
9、统计学生最高分
四、调试情况,设计技巧及体会
1、本系统在VC6下编译调试通过,可顺利运行,各项功能达到设计要求
本系统采用分模块调试的方法进行编译,即完成一个函数功能模块就编译一个功能模块,最后再进行整体编译并生成可执行文件honest.exe。
在调试过程中主要碰到以下问题:
(1)输入函数中的取地址符即“&”不能正确使用,导致程序在输入数据时发生错误。
(2)在比较两个字符串时不能正确使用“strcmp”函数,导致比较结果不能输出。
(3)在应用指针时没有注意头结点中的数据域中是不存放数据,导致指针指向错误。
2、在这次课程设计中我充分体会到C语言作为一门编程的基本语言它的精妙。
通过这次课程设计使我了解到我有很多的不足,在程序调试的时候常常会因为几个错误而弄得心烦,这说明我对知识的掌握还不够牢,在程序设计的过程中也暴露出了我的诸多弊端,借这次课程设计的机会我会认真的加以改正,多多看书多去图书馆学习,同时应该增强自己的实践能力,为以后的学习打下坚实的基础。
五、源程序清单(略,详见电子版实验报告)
#include"stdio.h"
#include"conio.h"
#include"stdlib.h"/*包含后面使用的exit等函数*/
#include"string.h"/*包含号面使用的strcmp等函数*/
inthavesave=0;/*全集变量*/
structstudent
{
charnum[10];/*学号*/
charname[18];
charsex[3];
intclanguage;
intmath;
intenglish;
inttotle;
intaverage;
};
typedefstructnode/*使用typedef语句,简化程序后续声明定义的键盘输入*/
{
structstudentdata;
structnode*next;
}Node,*Link;
voidmenu()
{
printf("㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣\n");
printf("◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎\n");
printf("◎◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◎\n");
printf("◎◆◇◎\n");
printf("◎◆◇◎\n");
printf("◎◆\t1添加学生资料\t\t\t\t\t2删除学生资料◇◎\n");
printf("◎◆◇◎\n");
printf("◎◆\t3查询学生资料\t\t\t\t\t4修改学生资料◇◎\n");
printf("◎◆◇◎\n");
printf("◎◆\t5保存学生资料\t\t\t\t\t6统计最高分◇◎\n");
printf("◎◆◇◎\n");
printf("◎◆\t7按总分排名\t\t\t\t\t8打印学生成绩◇◎\n");
printf("◎◆◇◎\n");
printf("◎◆\t9帮助信息\t\t\t\t\t0退出系统◇◎\n");
printf("◎◆◇◎\n");
printf("◎◆◇◎\n");
printf("◎◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◎\n");
printf("◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎\n");
printf("\n");
printf("㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣㊣\n");
}
voidprint_san()
{
printf("---------------------------------------------------------------------------\n");
}
voidWrong()
{
printf("\n=====>提示:
输入错误!
\n");
}
voidNofind()
{
printf("\n=====>提示:
没有找到该学生!
\n");
}
voidprintchinese()/*本函数用于输出中文*/
{
printf("\t学号\t姓名性别英语成绩数学成绩C语言成绩总分平均分\n");
}
voidprintenglish(Node*p)/*本函数用于输出英文*/
{
printf("\t%-9s%s\t%s\t%d\t%d\t%d\t%d\t%d\n",p->data.num,p->data.name,p->data.sex,p->data.english,p->data.math,p->data.clanguage,p->data.totle,p->data.average);
}
voidprinthelp()
{
printf("该程序为用C语言编写的学生管理程序,第一次进入该程序需要创建学生数据\n");
printf("以后进入可根据菜单栏显示实现各项功能,系统默认保存文件位置为D:
/学生管理\n");
printf("按任意键返回");
printf("\n");
getch();
}
Node*Locate(Linkl,charfindmess[],charnameornum[])/*该函数用于定位链表中符合要求的结点,并返回该指针*/
{
Node*r;
if(strcmp(nameornum,"num")==0)/*按学号查询*/
{
r=l->next;
while(r!
=NULL)
{
if(strcmp(r->data.num,findmess)==0)
returnr;
r=r->next;
}
}
elseif(strcmp(nameornum,"name")==0)/*按姓名查询*/
{
r=l->next;
while(r!
=NULL)
{
if(strcmp(r->data.name,findmess)==0)
returnr;
r=r->next;
}
}
return0;
}
voidAdd(Linkl)/*增加学生*/
{
Node*p,*r,*s;
charnum[10];
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);
print_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);
getchar();
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;
}
}
voidSeek(Linkl)/*查询学生*/
{
intsel;
charfindmess[20];
Node*p;
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)
{
printf("\t\t\t\t查找结果\n");
print_san();
printf("\n");
printchinese();
printenglish(p);
printf("\n");
print_san();
printf("按任意键返回");
getch();
}
else
Nofind();
}
elseif(sel==2)/*姓名*/
{
printf("请您输入要查找的姓名:
");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)
{
printf("\t\t\t\t查找结果\n");
print_san();
printf("\n");
printchinese();
printenglish(p);
printf("\n");
print_san();
printf("按任意键返回");
getch();
}
else
Nofind();
}
else
Wrong();
}
voidDel(Linkl)/*删除*/
{
intsel;
Node*p,*r;
charfindmess[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();
}
elseif(sel==2)
{
printf("请你输入要删除的姓名:
");
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();
}
voidModify(Linkl)
{
Node*p;
charfindmess[20];
if(!
l->next)
{
printf("\n=====>提示:
没有资料可以修改!
\n");
return;
}
printf("请您输入要修改的学生学号:
");
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);
scanf("%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");
havesave=1;
}
else
Nofind();
}
voidScoreone(Linkl)
{
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;
if(r->data.totle>=pt->data.totle)
pt=r;
if(r->data.average>=pa->data.average)
pa=r;
r=r->next;
}
printf("------------------------------统计结果--------------------------------\n");
printf("总分最高者:
\t%s\t%s\t%d分\n",pt->data.num,pt->data.name,pt->data.totle);
printf("平均分最高者:
\t%s\t%s\t%d分\n",pa->data.num,pa->data.name,pa->data.average);
printf("英语最高者:
\t%s\t%s\t%d分\n",pe->data.num,pe->data.name,pe->data.english);
printf("数学最高者:
\t%s\t%s\t%d分\n",pm->data.num,pm->data.name,pm->data.math);
printf("c语言最高者:
\t%s\t%s\t%d分\n",pc->data.num,pc->data.name,pc->data.clanguage);
print_san();
printf("按任意键返回\n");
getch();
}
voidScoretow(Linkl)
{
Linkll;
Node*p,*rr,*s;
ll=(Link)malloc(sizeof(Node));/*用于做新的连表*/
ll->next=NULL;
if(l->next==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->next;
printf("\n=====>提示:
排序已经完成!
\n");
}
voidprintscore(Linkl)//打印成绩信息
{
Node*p;
p=l;
if(l!
=NULL)
{
printf("\n全部成绩为:
\n\n");
printf("学号\t姓名\t数学\t英语\tC语言\t平均分\t总分\n\n");
p=p->next;
do
{
printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\n",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);
printf("\n");
printf("按任意键返回");
printf("\n");
getch();
}
else
printf("\n目前数据为空,还没有任何信息,请先创建成绩信息!
\n\n");
}
voidSave(Linkl)
{
FILE*fp;
Node*p;
intflag=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;
break;
}
}
if(flag)
{
printf("\n=====>提示:
文件保存成功.(有%d条记录已经保存.)\n",count);
havesave=0;
}
fclose(fp);
}
voidmain()
{
Linkl;/*连表*/
FILE*fp;/*文件指针*/
intsel;
charc;
charchji;
intcount=0;
Node*p,*r;
printf("\t\t\t\t学生成绩管理系统\n\t\t\t\t------西安邮电学院微电子0901李欢(17号)\n");
l=(Node*)malloc(sizeof(Node));
l->next=NULL;