高级C语言课程设计说明书计算机等级考试管理系统.docx
《高级C语言课程设计说明书计算机等级考试管理系统.docx》由会员分享,可在线阅读,更多相关《高级C语言课程设计说明书计算机等级考试管理系统.docx(49页珍藏版)》请在冰豆网上搜索。
高级C语言课程设计说明书计算机等级考试管理系统
《高级C语言程序设计》课程设计
说明书
设计题目:
计算机等级考试管理系统
摘要
随着电子信息行业的快速发展以及科学技术的不断进步,各类工程的需求,社会各界的应用的需要,计算机作为高智能,全自动,高效率的工具,在现实社会中具有不可估量的价值。
本程序是基于Turbo.C2.0环境的计算机等级考试系统,主要用于系统管理考生的相关信息,为广大教育工作者提供了极大的方便,具有一定的实用价值。
设计任务
一.题目:
计算机等级考试管理系统
二.设计要求:
近年来,参加计算机考试的人员日益增多,用计算机来降低工作量成为了一种迫切需求,为此目的编写软件
基本功能:
报名信息维护
等级分类
等级查询
身份证号查询
姓名查询
学号查询
三.时间安排:
1>第一周,完成程序需求分析的报告,分析程序的使用价值,确定设计方向,明确设计目的,理清设计思路,完成程序框架的设计。
2>第二周,设计算法。
完成程序中相关算法的设计,分析算法的构成及设计思路,将方法具体化,完成相关模块程序的实现。
3>第三周,完成程序的实现,对已有的程序进行局部的调试,找出错误并改正。
将所有的模块集合,对整个程序系统进行测试,记录测试的结果,逐步将程序进行优化设计。
完成课程设计说明书的编写,并在附录里添加源程序,将说明书以文档的形式打印,并装订成册。
四.答辩演示:
每位同学,将自己的说明书和电子档源程序带上,于2011-11-23日在理科楼L-2413进行答辩演示,介绍自己软件的功能,操作方法,优点缺点,并能初步评估软件的实用价值。
在答辩完成以后,每位同学需要把自己的电子档源程序进行打包上传到相应的地址,以便调用。
第一章.
总体设计:
1.1模块划分……………………………………………………………1
1.2模块说明……………………………………………………………3
第二章.
详细设计:
2.1需求分析……………………………………………………………15
2.1.1系统简介…………………………………………15
2.1.2功能详述…………………………………………15
2.1.3开发环境…………………………………………15
2.1.4运行环境…………………………………………15
2.2函数说明……………………………………………………………16
2.3用户使用说明………………………………………………………16
2.4测试结果
2.4.1主控模块………………………………………17
2.4.2数据输入………………………………………18
第三章.
设计感悟:
3.1小结………………………………………………………………21
3.2参考文献…………………………………………………………22
第四章.
附录<源程序>:
4.1源程序……………………………………………………………22
第一章
1.1模块化分
本程序系统从大的方向分为数据模块和代码模块。
数据模块用一个单链表来存储数据,然后用一个指针域将链表中的数据存放到磁盘文件中进行保存。
代码模块主要用于程序相关功能的实现。
以下分模块介绍:
数据模块,单链表如下:
typedefstructstudent
{
charnum[9];
charname[13];
charrang[2];
charcollege[15];
intttscore;
intopscore;
charsex[2];
charID[19];
};
用typedef定义结构体类型数据,用以存放考生的相关信息。
其中,num[]存放考生的考号,name[]存放考生的姓名,rang[]存放考生的等级,college[]存放考生的学校名,ttscore存放考生的笔试成绩,opscore存放考生的机试成绩,sex[]存放考生的性别,ID[]存放考生的身份证号码。
typedefstructnode
{
structstudentdata;/*数据域*/
structnode*next;/*指针域*/
}NODE,*link;
该链表将上一个链表作为其元素,构成其数据域,然后定义自身机构提类型,作为指针域,以便下文查找链表的位置。
NODE为结构体类型变量,ling为结构体类型指针。
代码模块,用不同的函数完成不同的功能,并能通过函数的有机结合,完成复杂的输入,查询,删改等功能。
主要分为以下几个大块:
1>添加信息voidadd(),用于新增考生记录。
2>删除信息voiddel(),用于删除已有的考生记录。
3>查找信息voidqur(),用于在文件中查找相关字段的记录。
4>修改信息voidmodify(),用于修改文件中已有的记录。
5>保存信息voidsave(),用于存储新增加的记录。
6>显示信息voiddisp(),用于显示已有的考生记录。
7>显示错误voidwrong(),当输入的不是规定的字段时,或操作失败时,系统提示出错情况,以及出错原因,提示用户进行修改。
8>显示查找失败voidNofind(),当进行查找或者修改操作时,系统会根据用户输入的字段进行查找,确定相应的记录位置,当没有找到相应的记录时,输出查找失败信息,并提醒用户进行校正。
9>标准字符输入函数voidstringinput(char*t,intlens,char*notice),输入相应的字符串,并进行检验,如果输入有误,则输出错误原因,提示用户进行修改。
10>标准数字输入函数intnumberinput(char*choice),输入数字字符串,并进行检验,若果有错,则输出出错原因,提示用户进行修改。
11>输出数据函数voidprintdata(NODE*pp),将结构体数据进行整体输出。
12>输出表头函数voidprintheader(),将结构体数据,即考生记录按类似表格的形式进行整体规划分栏输出。
13>确定记录位置NODE*Locate(linkL,charfindmess[],charnameornum[],将用户输入的信息进行相应的处理,找到相应的位置,对指针进行定位查找。
14>主控函数voidmain(),用于对整个程序进行操作的控制。
以下是函数结构简图:
1.2模块说明
主控函数viodmain(),以下是其代码:
voidmain()
{
linkL;
FILE*fp;
intselect;
charch;
intcount=0;
NODE*p,*r;
L=(NODE*)malloc(sizeof(NODE));
if(!
L)
{
printf("\nAllocatememoryfailure");/*如果没有申请到,打印提示信息*/
return;
}
L->next=NULL;
r=L;
fp=fopen("e:
\\wintc\\student","ab+");/*以追加方式打开一个二进制文件,可读可写,若文件不存在,会创建此文件*/
if(fp==NULL)
{
printf("\n====>Cannotopenthisfile!
\n");
exit(0);
}
while(!
feof(fp))
{
p=(NODE*)malloc(sizeof(NODE));
if(!
p)
{
printf("Memorymallocfailure!
\n");
exit(0);
}
if(fread(p,sizeof(NODE),1,fp)==1)/*一次从文件中读取一个学生的信息*/
{
p->next=NULL;/*每次让动态指针指向0*/
r->next=p;/*连接节点*/
r=p;/*每次让r指向下一个文件头*/
count++;
}
fclose(fp);
printf("\n==>Openfilesuccess,thetotlenumberis:
%d\n",count);
menu();
while(L)
{
system("cls");
menu();
p=r;
printf("\n===>>Pleaseenteryourchoice(0-6):
");
scanf("%d",&select);
if(select==0)
{
if(saveflag==1)/*若对链表的数据有修改且未进行存盘,则标志为1*/
{getchar();
printf("\n===>Whethertosavethemodifiedrecordtofile?
(y/n)");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
save(L);
}
printf("===>Thankyouforusingthisprogram!
!
");
getchar();
exit(0);
}
switch(select)
{
case1:
add(L);break;/*增加学生信息*/
case2:
del(L);break;/*删除学生信息*/
case3:
qur(L);break;/*查询学生信息*/
case4:
modify(L);break;/*修改学生信息*/
case5:
save(L);break;/*保存学生信息*/
case6:
system("cls");disp(L);break;/*显示学生信息*/
default:
wrong();getchar();break;/*按键有误*/
}
}
}
}
首先,以计算机动态分配的方式,分配一个结构体类型的数据空间,然后,打开数据文件,将两个结构联系起来,并设置进入和退出方式。
进而,进入双while()主循环,首先,动态分配数据存储巍峨年结构体,然后,设置读取方式,,每次从文件中读取一个考生记录,并且计数,然后输出已有的考生记录。
下一步,进入内部while循环,显示菜单,提示用户进行合理的操作。
接着,用switch()开关设置菜单操作响应,并设置出错响应。
以下是六个功能函数的简介:
输入记录函数add()
voidadd(linkL)
{
NODE*p,*r,*s;
charch,num[9];intflag=0;
r=L;
s=L->next;
system("cls");
disp(L);
while(r->next!
=NULL)
r=r->next;/*将r移至表的最尾部,准备添加数据*/
while(L)
{
while(L)
{
stringinput(num,9,"Inputsortnumber(Press'0'toreturnmenu):
");
if(strcmp(num,"0")==0)/*输入为0则返回主界面*/
{return;}
s=L->next;
while(s)
{
if(strcmp(s->data.num,num)==0)
{flag=1;break;}
s=s->next;
}
if(flag==1)
{
printf("===>Thenumber%sisexisting,tryagain?
(y/n):
",num);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
continue;
elsereturn;
}
else{break;}
}
p=(NODE*)malloc(sizeof(NODE));
if(!
p)
{
printf("\nAllocatememoryfailure!
\n");
return;
}
strcpy(p->data.num,num);
stringinput(p->data.name,13,"Name:
");
stringinput(p->data.sex,2,"Sex:
");
stringinput(p->data.college,15,"college:
");
stringinput(p->data.ID,19,"IDnumber:
");
p->data.ttscore=numberinput("Textscorescore[0-100]:
");
p->data.opscore=numberinput("Operatescorescore[0-100]:
");
stringinput(p->data.rang,2,"Range:
");
p->next=NULL;/*表明这是链表的尾部节点*/
r->next=p;/*将新建节点加入链表尾部中*/
r=p;
saveflag=1;
}
return;
}
应用单链表结构,在内存空间动态存储数据。
首先对输入的数据进行检测,看是否已经存在,然后,进行数据的输入。
用结构体指针进行数据的存储操作,每次输入一个数据,将其用结构体元素的形态存入结构体,然后整体存入文件。
查找数据函数voidqur()
voidqur(linkL)
{
intselect;
charsearchinput[20];
NODE*p;
if(!
L->next)
{system("cls");
printf("\n==>Nostudentrecord!
\n");
getchar();
return;
}
system("cls");
printf("\n===>1按考号查找===>2按姓名查找\n");
printf("\n===>3按身份证号查找\n");
printf("pleasechoice:
");
scanf("%d",&select);
if(select==1)
{
stringinput(searchinput,9,"Inputtheexistingsortnumber:
");
p=Locate(L,searchinput,"num");
if(p)
{
printheader();
printdata(p);
printf(END);
printf("Pressanykeytoreturn");
getchar();
}
elseNofind();getchar();
}
elseif(select==2)
{
stringinput(searchinput,13,"Inputtheexistingname:
");
p=Locate(L,searchinput,"name");
if(p)
{
printheader();
printdata(p);
printf(END);
printf("Pressanykeytoreturn");
getchar();
}
elseNofind();getchar();
}
elseif(select==3)
{
stringinput(searchinput,19,"InputtheexistingID:
");
p=Locate(L,searchinput,"ID");
if(p)
{
printheader();
printdata(p);
printf(END);
printf("Pressanykeytoreturn");
getchar();
}
elseNofind();getchar();
}
elsewrong();getchar();
}
根据标准输入函数输入的数据,进行检测并设置不同的查询方式,用户可以根据喜好,进行相应的选择,分为考号查询,身份证号查询,姓名查询。
如果找到相应的记录,以表格的形式输出数据,没找到,则输出错误信息。
删除记录函数voiddel()
voiddel(linkL)
{
intsel;
NODE*p,*r;
charfindmess[20];
if(!
L->next)
{
system("cls");
printf("==>Nostudentrecord!
\n");
getchar();return;
}
system("cls");
disp(L);
printf("\n===>1按考号删除===>2按姓名删除\n");
printf("\n===>3按身份证号删除\n");
printf("Pleaseselect:
");
scanf("%d",&sel);
if(sel==1)
{
stringinput(findmess,9,"Inputthesortnumber:
");
p=Locate(L,findmess,"num");
if(p)
{
r=L;
while(r->next!
=p)
r=r->next;
r->next=p->next;/*将p所指的节点从链表中删除*/
free(p);
printf("\n===>Deletesuccess!
\n");
getchar();saveflag=1;
}
elseNofind();getchar();
}
elseif(sel==2)
{
stringinput(findmess,13,"Inputthestudentname:
");
p=Locate(L,findmess,"name");
if(p)
{
r=L;
while(r->next!
=p)
r=r->next;
r->next=p->next;/*将p所指的节点从链表中删除*/
free(p);
printf("\n===>Deletesuccess!
\n");
getchar();saveflag=1;
}
elseNofind();getchar();
}
if(sel==3)
{
stringinput(findmess,19,"InputthestudentIDnumber:
");
p=Locate(L,findmess,"ID");
if(p)
{
r=L;
while(r->next!
=p)
r=r->next;
r->next=p->next;/*将p所指的节点从链表中删除*/
free(p);
printf("\n===>Deletesuccess!
\n");
getchar();saveflag=1;
}
elseNofind();getchar();
}
elsewrong();getchar();
}
本函数与查找函数相似,提供了姓名,考号,身份证号三种查询方式,用户可自由选择。
系统将根据用户的选择进行不同的检测,找到记录后,提示用户确定后进行记录的删除操作。
修改记录函数voidmodify()
voidmodify(linkL)
{
NODE*p;
charfindmess[20];
if(!
L->next)
{
system("cls");
printf("\n==>Nostudentrecord!
\n");
getchar();
return;
}
system("cls");
printf("Modifystudentrecord");
disp(L);
stringinput(findmess,9,"===>Inputtheexistingstudentnumber:
");
p=Locate(L,findmess,"num");
if(!
p){printf("===>Thenumberyouputisnotexisting!
\n");getchar();return;}
if(p)
{
printf("Number:
%s,\n",p->data.num);
printf("Name:
%s,\n",p->data.name);
stringinput(p->data.name,13,"Inputnewname:
");
stringinput(p->data.num,9,"Inputsortnumber:
");
stringinput(p->data.rang,2,"Inputthefinallrang:
");
stringinput(p->data.ID,19,"InputtheIDnumber:
");
stringinput(p->data.college,15,"Inputthecollegename:
");
stringinput(p->data.sex,2,"Inputthesex:
");
printf("\nTheoriginaltextscorescore:
%d,",p->data.ttscore);
printf("\nTheoriginalOperatescorescore:
%d,\n",p->data.opscore);
p->data.ttscore=numberinput("Thethenewtextscoreis:
");
p->data.opscore=numberinput("Thethenewoperatescoreis:
");
printf("\n==>Modifysuccess!
\n");
disp(L);
saveflag=1;
}
else
Nofind();getchar();
}
修改记录操作被选中时,系统先提示用户输入相应的字段,系统根据用户提供的字段进行检测,找到记录后,输出原有的记录,然后让用户自行修改记录,完成后返回到菜单。
如果没找到相应的记录,则输出错误信息。
保存新纪录函数voidsave(linkL)
voidsave(linkL)
{
FILE*fp;NODE*p;
intcount=0;
fp=fopen("e:
\\wintc\\student","wb");
if(fp==NULL)
{
printf("==