c语言课程设计报告学生证系统分解.docx
《c语言课程设计报告学生证系统分解.docx》由会员分享,可在线阅读,更多相关《c语言课程设计报告学生证系统分解.docx(33页珍藏版)》请在冰豆网上搜索。
c语言课程设计报告学生证系统分解
《高级语言程序设计》课程设计
题目:
学生证管理程序
班级:
学生学号:
学生姓名:
指导老师:
提交时间:
华南农业大学信息(软件)学院
学生证管理程序
1系统分析
1.1问题描述:
设计一个学生证的管理程序。
实现录入、修改、删除学生的学生证信息,并能根据输入的学生的学号,显示该学生的学生证信息或根据输入的班级的名称,显示该班所有学生的学生证信息,以及实现一些统计各类信息的功能。
1.2系统功能分析:
学生证管理程序是用来进行学生证管理的应用软件,不属于学生可使用的系统,个人认为进入该系统不需要进行相应的身份登录。
所以进入系统者应当可以使用所有功能;
使用者可行使基本功能有:
录入某位学生的学生证信息;根据给定学生的学号,修改、删除或显示该学生的学生证信息;根据输入的班级的编号,显示该班所有学生的学生证信息和一些统计功能。
另外,为了方便管理员操作,减少管理员重复工作的可能,另外加入额外功能:
批量录入学生的学生证信息和班级删除。
除此以外,亦另外添加操作台指令,方便管理员进行功能切换。
1.3开发平台及工具介绍:
根据所学知识及所要用到的相关操作,采用C语言进行开发。
开发平台:
CodeBlocks+MinGW+wxWidgets
2系统设计
2.1系统总体结构设计
在对学生证管理程序进行系统功能分析之后,我对整个系统进行总体设计。
首先,确定大致的开发和设计的思路,并在此基础上,用图表将系统总体的设计架构勾画出来,制定模块结构图,通过模块功能分析对每一个模块进行总体设计。
值得一提,总体的设计架构中,shell和kernel的设计应注意彼此的联系,这一方面设计的好坏对后面的设计有很大的影响。
然后,根据总体设计的需求,确定要首先那些函数。
学生证管理程序可视作一个简易身份证管理系统,开发设计的方向是方便管理员的操作,节省管理员的操作时间。
对于这个问题,可采用批量操作和指令操作的思路。
可以将所有的学生证信息存储在一个文件(txt格式)中,在对大量学生证数据的处理用到链表和文件处理等基本技术,并用两个函数实现文件读取和写入。
2.2系统各个功能模块详细设计
及功能模块之间关系设计(包括功能结构图等)
(1)添加模块(录入模块):
可以逐个录入学生信息,也可以设定录入人数,批量录入学生信息。
在输入学生信息时,可输入return返回,可随意输入指令进行功能切换。
其功能图如下图.
(2)搜索模块:
根据给出信息,可以是学号,名字或班级,搜索符合条件的某位学生或某些学生,并返回地址。
(3)修改模块:
通过地址找到该学生信息,然后进行修改。
(4)统计模块,统计学生总男女生人数;某班男生人数,女生人数;统计指定日子出生的学生;统计与指定名字相同的学生;
(5)显示模块,显示学生证信息。
分为针对单人的详细显示和针对集体的行显示两种模式。
(6)删除模块,本模块有2种删除方式,分别是按学号删除和按班级名删除。
(7)指令模块,本模块负责辨认输入的为指令还是操作序号,并根据输入选择操作。
2.3数据结构的设计(文件等)
(1)学生证信息结构
描述学生证信息,并作为一整条记录存放在文件中。
typedefstructstud
{
charname[20];
charsex[8];
charsnumber[14];
chartime[12];
charid[20];
charcollege[24];
charmajor[20];
charclasses[40];
structstud*next;
}LNode,*LinkList;
LinkListp,q,m,n,c;
(2)链表
存储学生证信息,并作为一整条记录在程序中进行操作。
p=(LinkList)malloc(sizeof(LNode));//头指针
q=p;
(3)文件
在程序开始前和结束后存储学生证信息
voidrewirte()//程序结束后将一切写进文件
voidload()//文件内容装载至链表
2.4界面设计
遵循简洁美观、方便使用的原则。
(1)首页:
用printf语句构造简单的界面,注重界面的简洁性。
(2)、录入界面
(3)、修改界面:
(4)删除界面
(5)学号查询
(6)班级查询
(7)其他
(8)指令
(9)统计班级男女人数
(10)统计同名
(11)统计同年同日出生
流程图如下:
3系统实现
基于系统需求分析与系统总体设计的结果,本系统采用开发平台:
CodeBlocks+MinGW+wxWidgets实现各模块的功能,下面将展现某些模块的录入操作的详细设计和实现过程。
录入模块:
(1)
(2)代码段片段
相关函数
charconsole()//控制台
录入:
voidentry()//录入
{
system("cls");
char,op,i=1;
LinkListstd;
std=(LinkList)malloc(sizeof(LNode));
std->next=NULL;
printf("请分别输入学生的信息\n");
while(i<9)
{
switch(i)
{
case1:
printf("姓名(如:
王小明):
");break;
case2:
printf("性别(如:
男):
");break;
case3:
printf("学号(如:
):
");break;
case4:
printf("入学时间(如:
2013-09-01):
");break;
case5:
printf("身份证号码(如:
):
");break;
case6:
printf("学院(如:
):
");break;
case7:
printf("专业(如:
):
");break;
case8:
printf("班级(如:
):
");break;
}
op=console();
if(k==562||k==648||k==627||k==966||k==1164||k==1218||k==311||k==672||k==1189||k==735||k==840||k==839||k==836||k==1076||k==1161)
{
sw=1;free(std);return;
}
switch(i)
{
case1:
strcpy(std->name,cl);break;
case2:
strcpy(std->sex,cl);break;
case3:
strcpy(std->snumber,cl);break;
case4:
strcpy(std->time,cl);break;
case5:
strcpy(std->id,cl);break;
case6:
strcpy(std->college,cl);break;
case7:
strcpy(std->major,cl);break;
case8:
strcpy(std->classes,cl);break;
}
i++;
}
q->next=std;
q=q->next;
q->next=NULL;
printf("录入成功\n");
printf("输入任意键以退出\n");
a=getchar();
}
4系统测试
模块测试:
测试各模块的测试
显示模块:
(1)输出单个学生学生证信息。
1、输入学号
2、预期结果:
3、输出结果:
4、结论:
运行正常。
(2)显示班级学生证信息
1、输入2013软件工程1班
2、预期结果:
3、
4、结论:
运行正常。
系统测试:
系统功能的完整测试
(1)系统测试1:
1、输入流程:
批量录入信息batchentry输入3后输入信息
信息如下:
根据学号输出信息,
根据班级输出信息,
2、预测结果:
3、实际结果:
4、结论:
运行正常。
5系统运行界面
1、运行界面1:
统计同年同日生的学生
2、运行界面2:
指令实现
6总结
怎么说呢,这次设计的并不难,要是只完成基本功能的话其实不用什么力气。
但在这次设计中呢,却陆陆续续地遇到小问题。
这些问题都得归因于自己整体设计时不够用心,未曾仔细地思考,又盲目地想做点新意,结果有一阵子一直停滞不前。
结果,最后还是静下心来梳理了一遍思路,做好前期准备,情况才好起来。
然后,感觉做这种课题真的非常好,题目分析、整体设计、模块分析......一整套做下来实在令人兴奋。
Debug过程既是无聊的也是有趣的。
能在程序设计中找到快乐实在不错。
这次设计已经完结了,但是我的路还有很长,离成为一个合格的程序员实在还有很远,不过,还有几年时间可以抢救一下,我觉得我还有救的
7参考文献
《C语言程序设计(第二版)》
附录:
全代码:
#include
#include
#include
#include
#include
#defineTRUE1
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineSTACK_INIT_SIZE100
charneed='',ne='\n';
intk=0,sw=0;
charcl[80];
typedefstructstud
{
charname[20];
charsex[8];
charsnumber[14];
chartime[12];
charid[20];
charcollege[24];
charmajor[20];
charclasses[40];
structstud*next;
}LNode,*LinkList;
LinkListp,q,m,n,c;
charconsole()
{
inti=0;
k=0;
gets(cl);
if(cl[0]<='9'&&cl[0]>='1'&&!
cl[1])returncl[0];
else
while(cl[i])
{
k=k+cl[i];
i++;
}
return'0';
}
voidshell()
{
printf("学生证管理系统\n");
printf("==============================\n");
printf("1、学生证信息录入\n");
printf("2、学生证信息修改\n");
printf("3、学生证信息删除\n");
printf("4、显示学生的学生证信息\n");
printf("5、显示班级所有学生学生证信息\n");
printf("6、其他\n");
printf("7、说明书\n");
printf("8、结束\n");
printf("==============================\n");
printf("请输入操作序号或正确指令\n");
}
voidshell_II()
{
/*system("cls");*/
printf("请选择你想修改的信息\n");
printf("1、姓名\n");
printf("2、性别\n");
printf("3、学号\n");
printf("4、入学时间\n");
printf("5、身份证号码\n");
printf("6、学院\n");
printf("7、专业\n");
printf("8、班级\n");
printf("9、返回\n");
}
voidshell_III()
{
printf("请选择你想实现的统计功能\n");
printf("1、统计某个班的男女人数\n");
printf("2、统计已录入学生之间的男女人数\n");
printf("3、统计并显示已录入学生中同名的学生\n");
printf("4、统计同年同日出生同学\n");
printf("5、批量录入\n");
printf("6、班级删除\n");
}
voidrewirte()//罚抄
{//程序结束后将一切写进文件
FILE*fp;
fp=fopen("date.txt","w+");
q=p;
p=p->next;
while(p)
{
fputs(p->name,fp);
fputc(need,fp);
fputs(p->sex,fp);
fputc(need,fp);
fputs(p->snumber,fp);
fputc(need,fp);
fputs(p->time,fp);
fputc(need,fp);
fputs(p->id,fp);
fputc(need,fp);
fputs(p->college,fp);
fputc(need,fp);
fputs(p->major,fp);
fputc(need,fp);
fputs(p->classes,fp);
fputc(need,fp);
fputc(ne,fp);
q=p;
p=p->next;
free(q);
}
}
voidload()
{//文件内容装载至链表
FILE*fp;
charch,e[80];
LinkListone;
inti=1,l=0;
fp=fopen("date.txt","a+");
while(!
feof(fp))
{
i=1;l=0;
one=(LinkList)malloc(sizeof(LNode));
ch=fgetc(fp);
if(feof(fp))break;
while(ch!
=ne)
{
while(ch!
='')
{e[l++]=ch;
ch=fgetc(fp);}
ch=fgetc(fp);
e[l]='\0';
switch(i)
{
case1:
strcpy(one->name,e);break;
case2:
strcpy(one->sex,e);break;
case3:
strcpy(one->snumber,e);break;
case4:
strcpy(one->time,e);break;
case5:
strcpy(one->id,e);break;
case6:
strcpy(one->college,e);break;
case7:
strcpy(one->major,e);break;
case8:
strcpy(one->classes,e);break;
default:
break;
}
l=0;i++;
}
q->next=one;
q=q->next;
q->next=NULL;
}
fclose(fp);
}
voidpri(LinkListl)
{
printf("姓名:
");
puts(l->name);
printf("\n");
printf("性别:
");
puts(l->sex);
printf("\n");
printf("学号:
");
puts(l->snumber);
printf("\n");
printf("入学时间:
");
puts(l->time);
printf("\n");
printf("身份证号码:
");
puts(l->id);
printf("\n");
printf("学院:
");
puts(l->college);
printf("\n");
printf("专业:
");
puts(l->major);
printf("\n");
printf("班级:
");
puts(l->classes);
printf("\n");
}
voidpri_II(LinkListl)
{
printf("%s%s%s%s%s%s%s%s\n",l->name,l->sex,l->snumber,l->time,l->id,l->college,l->major,l->classes);
}
voidsearch()//根据学号找人
{
charop;
op=console();
if(k==562||k==648||k==627||k==966||k==1164||k==1218||k==311||k==672||k==1189||k==735||k==840||k==839||k==836||k==1076||k==1161)
{
sw=1;return;
}
m=n=p->next;
while(n)
{
if(strcmp(cl,n->snumber)==0)
{
break;
}
m=n;n=n->next;
}
}
voidsearch_II()//根据班级找人
{
system("cls");
charop;
inti=0;
printf("请输入要查询的班级(如2013软件工程1班):
\n");
op=console();
if(k==562||k==648||k==627||k==966||k==1164||k==1218||k==311||k==672||k==1189||k==735||k==840||k==839||k==836||k==1076||k==1161)
{
sw=1;return;
}
n=p->next;
while(n)
{
if(strcmp(cl,n->classes)==0)
{
pri_II(n);
i++;
}
n=n->next;
}
if(i==0)printf("找不到要查询的班级\n");
}
voidentry()//录入
{
system("cls");
char,op,i=1;
LinkListstd;
std=(LinkList)malloc(sizeof(LNode));
std->next=NULL;
printf("请分别输入学生的信息\n");
while(i<9)
{
switch(i)
{
case1:
printf("姓名(如:
王小明):
");break;
case2:
printf("性别(如:
男):
");break;
case3:
printf("学号(如:
):
");break;
case4:
printf("入学时间(如:
2013-09-01):
");break;
case5:
printf("身份证号码(如:
440781************):
");break;
case6:
printf("学院(如:
):
");break;
case7:
printf("专业(如:
):
");break;
case8:
printf("班级(如:
):
");break;
}
op=console();
if(k==562||k==648||k==627||k==966||k==1164||k==1218||k==311||k==672||k==1189||k==735||k==840||k==839||k==836||k==1076||k==1161)
{
sw=1;free(std);return;
}
switch(i)
{
case1:
strcpy(std->name,cl);break;
case2:
strcpy(std->sex,cl);break;
case3:
strcpy(std->snumber,cl);break;
case4:
strcpy(std->time,cl);break;
case5:
strcpy(std->id,cl);break;
case6:
strcpy(std->college,cl);break;
case7:
strcpy(std->major,cl);break;
case8:
strcpy(std->classes,cl);break;
}
i++;
}
q->next=std;
q=q->next;
q->next=NULL;
printf("录入成功\n");
printf("输入任意键以退出\n");
a=getchar();
}
voidbatchentry()//批量录入
{
system("cls");
inti=0,num=0;
charop;
printf("请输入录入人数\n");
op=console();
if(k==562||k==648||k==627||k==966||k==1164||k==1218||k==311||k==672||k==1189||k==735||k==840||k==839||k==836||k==1076||k==1161)
{
sw=1;return;
}
else
{
while(cl[i])
{
num+=cl[i]-'0';
i++;
}
}
i=1;
while(i<=num)
{
entry();
if(sw==1)return;
}
}
voidclassdelete()//班级删除
{
system("cls");
charop;
inti=0;
printf("请输入要删除的班级:
\n");
op=console();
if(k==562||k==648||k==627||k==966||k==1164||k==1218||k==311||k==672||k==1189||k==735||k==840||k==839||k==836||k==1076||k==1161||k==1161)
{
sw=1;return;
}
n=p->next;m=p;
while(n)
{
if(strcmp(cl,n->classes)==0)
{
m->next=n->next;
free(n);
n=m->next;
i++;
}
else{m=n;n=n->next;}
}
if(i==0)printf("找不到要查询的班级\n");
}
voidstatistical_I()//统计某个班的男女人数
{
inti=0,boy=0,girl=0,sum=0;
charop;
printf("请输入你所要查询的