资源描述
湖南工业大学
课程设计任务书
—第 一学期
计算机与通信 学院(系、部) 软件工程 专业 姓名:夏笑声 班级 1202
课程名称: 《面向过程程序设计》 课程设计
设计题目: 《学生信息管理系统 》
完毕期限:自 年 12 月 26 日至 年 12 月28日共 三天
内
容
及
任
务
用C语言设计一种学生信息管理系统软件,规定实现如下功能:
1.建立文献功能
Ø 可以使用默认文献名,或制定文献名将记录存储到文献
Ø 文献保留成功要有提醒
Ø 初次使用可以新建一种保留文献
2.录入学生信息功能
Ø 可以随时录入制定人数信息功能
3.查询功能
Ø 可以通过输入学号查询制定学生信息功能
Ø 可以通过输入姓名查询制定学生信息功能
4.删除记录功能
可以通过学生姓名或学号信息删除学生信息
5.修改记录功能
可以通过学生姓名或学号信息修改任意一项指定信息
6.按总分排序功能
可以按照学生总提成绩排好序将所有学生信息显示出来
7.退出
可以在程序运行时很以便地退出程序
进
度
安
排
起止日期
工作内容
第1天
程序基本设计思绪
第2天
编辑关键代码和程序模块,修改程序,增长部分功能
第3天
再次修改,调试;完毕设计文档和课程设计阐明书答辩
指导教师(签字): 12月28日
系教研室)主任(签字): 年 月 日
计算机与通信学院
《面过程程序设计》课程设计
题 目 《 学生信息管理系统 》
学 号
专业及班级 软件工程1202
姓 名 夏笑声
日 期 /12/28
目录
一、 试验目和规定..........................................................................................4
1、课程设计目……………………………………………………………4
2、课程设计规定……………………………………………………………4
二、设计方案.................................................................................................... 4
1、总体设计..........................................................................................................4
2、系统流程图……………………………………………………………......5
3、 程序阐明书...................................................................................................4 三、总结与体会.............................................................................................. 17
四、 参照资料 ......................................................................................... 18
一、 试验目和规定
1、课程设计目:
1、使学生巩固和加强“C语言程序设计”课程理论知识。
2、使学生掌握C语言程序设计措施及编程技巧。
3、深入理解和运用构造化程序设计思想和措施。、
5、 初步掌握开发一种小型实用系统基本措施:结合实际应用规定,使课程设计既覆盖知识点,又靠近工程实际需要。
6、培养学生良好程序设计风格。、
7、掌握书写程序设计开发文档能力,使学生学会撰写课程设计汇报。、
8、通过查阅手册和文献资料,。培养学生独立分析问题和处理问题能力。、
9、培养学生创新能力和创新思维。
2、基本规定:
(1)规定运用构造化程序设计措施及C语言编程思想来完毕系统设计。
(2)模块化程序设计:规定在设计过程中,按功能定义函数或书写多种文献,进行模块化设计,各个功能模块用函数形式来实现。
(3)学生所选课题必须上机通过,并获得满意成果。
(4)程序书写风格:锯齿型书写格式。
二、 设计方案
1、总体设计
该程序共有6 大模块构成,程序开头首先是一种欢迎界面,欢迎界面下方有提醒信息按回车键继续,这时按下回车键,界面跳转到程序主界面,各功能菜单项。此程序一共有六大功能,所有通过定义函数来实现功能。重要有如下几项基本功能:1.信息录入功能2.信息查询功能3.删除记录功能4.修改记录功能5.按总分排序输出所有信息功能,6.退出程序功能。
3、程序阐明书
此程序在实现功能时采用方式是编写函数,通过编写5个函数来实现该程序五大基本功能。重要功能有信息录入、信息查询、删除记录、修改指定记录、输出所有学生信息,以及退出程序功能。首先将一系列头文献包括进来以及定义文献指针和定义了一种构造数组用来存储学生所有信息,源代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<process.h>
struct node
{
char id[12];
char name[15];
char fale[4];
int score[3];
int all;
int _size;
}student[50];
struct node2
{
char id[12];
char name[15];
char fale[4];
char score[4][4];
char all[4];
};
FILE *fr;
struct node *p=student;
char _class[4][10]={"C语言","大机","高数","英语"};
int number;
void luru();
void chaxun();
void shanchu();
void paixu();
void xiugai();
void main()
打开程序,首先可以看到是一种精美欢迎界面,该界面由如下代码实现:
printf("\n\n\n\n\n\n\n\n\n\n\n\n");
printf(" &$&$&$&&$&$&$&$&$&$&$&$&$&&$&$&$&$&$&$&$$&\n");
printf(" &$&$&$&$&&$$&&$&$&$&$&$&$&$&$&$&$&&$&$&$&$\n");
printf(" && ** ** &$\n");
printf(" &$ ** ** ** ** &$\n");
printf(" &$ **欢迎使用学生管理系统** &$\n");
printf(" &$ &$\n");
printf(" &$ * * * 制作人:夏笑声 * * * * * * * * &$\n");
printf(" &&$&$&$&$&$&$&$&$&$&$&$&$&$&$&$$&$&$&$&$&$\n");
printf(" &$&$&$&$&$&$$&$&$&$&$&$&$&$&$&&$&$&$&$&$&$\n\n\n\n\n\n\n");
printf("\n\n\n\n\n按回车键继续...");
欢迎界面如下图所示:
同步,在屏幕左下方有按回车键继续提醒信息,这时按一下回车键,由欢迎界面跳转到程序主功能菜单界面,菜单由switch语句实现,如下:
printf("请选择功能:\n");
printf("信息录入请按1!\n");
printf("信息查询请按2!\n");
printf("删除记录请按3!\n");
printf("修改记录请按4!\n");
printf("按总分排序输出所有信息请按5!\n");
printf("按0或其他任意键退出...\n");
这时,我们在菜单最上方可以看到一条警示信息,“注意:在第一次使用本软件之前,必须先建立一种存储文献”,这是由于此程序需要一种文献来将所有学生各项信息存储在外存中,只有这样才能使已经记录信息可以永久保留。这项功能我采用是用“w+”方式打开文献,之因此这样设计,是由于用“w+” 方式打开文献使程序获得一种额外功能,当按下“8”键时候,可以将所有已经保留记录所有清晰掉,即初始化记录功能,这样就做到了一举两得了。
接下来简介是程序信息录入功能。在设计信息录入功能时,我也碰到了不少问题,其中最大一种问题就是有关怎样将要存储程序写入文献,很显然,假如将输入信息一股脑写入文献话,后果将是非常严重,由于写入信息一直是要读出来,而假如随意地写进去话,在读取信息时候,读取信息位置指针将无法定位,由于写入时候没有按照一定规律。对于这个问题,我采用处理措施将所有学生信息采用一定格式写入文献,学号统一采用11位数字格式,姓名统一采用占6各字节格式,性别采用两个字节也就是一种中文字符格式,背面是各科分数,所有采用占3个字节格式,这样采用一种统一格式将学生信息按照次序一种接着一种写入文献。源代码如下:
for(i=0;i<_n1;i++)
{
printf("请输入第%d位学生学号,按0退出本次录入!:\n",i+1);
scanf("%s",p[number].id);
getchar(); //用于吃掉回车符
if(!(strcmp(p[number].id,_cheshi5))) //设置中途退出功能(假如中途不想继续输入话)
{
fclose(fr); //此句用来控制当中途退出时能将已输入信息及时存到外存中
break;
}
if(strlen(p[number].id)!=11)
{
printf("输入学号有误!学号为原则11位数,请重新输入:\n");
i--;
continue;
}
else
{
fprintf(fr,"%s",p[number].id);
loop2: printf("请输入第%d位学生姓名(仅支持中文):\n",i+1);
gets(p[number].name);
if(strlen(p[number].name)==0||strlen(p[number].name)>6)
{
printf("姓名长度不符合规定,请重新输入!\n");
goto loop2;
}
fprintf(fr,"%s",p[number].name);
a1=strlen(p[number].name);
a2=3-(a1/2);
for(b2=1;b2<=a2;b2++)
fprintf(fr," "); //在姓名局限性三个字后用空格补齐
loop7: printf("请输入性别:\n");
gets(p[number].fale);
if(strlen(p[number].fale)!=2)
{
printf("性别输入有误,请重新输入!\n");
goto loop7;
}
else fprintf(fr,"%2s",p[number].fale);
p[number].all=0; //将总分初始化
for(j=0;j<4;j++)
{
printf("请输入第%d位学生%s成绩:\n",i+1,_class[j]);
scanf("%s",x[j]);
fprintf(fr,"%-3s",x[j]);
}
_x1=atoi(x[1]);
_x2=atoi(x[2]);
_x3=atoi(x[3]);
_x4=atoi(x[4]);
_x5=_x1+_x2+_x3+_x4;
fprintf(fr,"%-3d",_x5);
printf("第%d位学生信息输入成功!\n",i+1);
}
}
fclose(fr);
printf("录入结束,按回车回主菜单!\n");
getchar();
getchar();
system("cls");
}
else
{
printf("\a");
printf("超过最大人数,请重新输入!\n");
}
在读取文献时位置指针移动问题就处理啦。另一方面是,在信息存储过程中,我还考虑到了使用者在使用时也许碰到尽量多问题,如若输入学号不不小于11位,便会有输入错误提醒,尚有一种非常使用是当使用着在进行信息录入过程中,可以随时地退出该功能,在录入成功后会有录入成功提醒信息。并且,为了使程序在使用时不会显得过于呆板,我还在警示信息显示同步加入了声音警示功能,如学号输入错误不仅有文字提醒并且有声音提醒, printf("\a");这样使程序看起来显得愈加人性化。
程序第二个功能是信息查询功能。很显然,没有查询功能,写得再好录入功能也相称于白写。进入信息查询功能菜单键是2数字键,进入该功能后会有提醒输入要查询学生学号或姓名,在设计该查询功能时,我采用是strcmp函数来比较字符串方式,来将输入要查询字符与文献中目前有各信息一一匹配,当找到相似学号或姓名时,立即退出匹配循环。源代码如下:
for(i=0;i<50;i++) //将所有学生学生跟已经录入学号配对
{
fscanf(fr,"%11s",_id);
fscanf(fr,"%6s",_name);
if((!strcmp(shuru,_id))||(!strcmp(shuru,_name)))
{
printf("学号:%s\n",_id);
printf("姓名:%s\n",_name);
fscanf(fr,"%2s",_fale);
printf("性别:%2s\n",_fale);
for(j=0;j<4;j++)
{
fscanf(fr,"%3s",fen);
printf("%s成绩为:%s\n",_class[j],fen);
}
fscanf(fr,"%3s",_all);
printf("总分:%3s\n",_all);
zhuangtai=0;
//标识阐明已查找到记录
break;
}
else
{
fseek(fr,16,1);
//将光标移到下一次要配对前一种,以测定该信息与否为最终一条
cheshi=fgetc(fr);
if(cheshi==EOF)
break;
}
}
if(zhuangtai)
{
printf("\a");
printf("不存在该学号学生!\n");
}
fclose(fr);
printf("按回车键回主菜单...\n");
getchar();
getchar();
system("cls");
}
查询界面如下:
这样写有一种好处就是使查询所要提供信息不仅仅局限于姓名或着是学号,这样就更以便使用者需要。
若查到成果则在屏幕上显示已查到成果:
for(i=0;i<50;i++) //将所有学生学生跟已经录入学号配对
{
fscanf(fr,"%11s",_id);
fscanf(fr,"%6s",_name);
if((!strcmp(shuru,_id))||(!strcmp(shuru,_name)))
{
printf("学号:%s\n",_id);
printf("姓名:%s\n",_name);
fscanf(fr,"%2s",_fale);
printf("性别:%2s\n",_fale);
for(j=0;j<4;j++)
{
fscanf(fr,"%3s",fen);
printf("%s成绩为:%s\n",_class[j],fen);
}
fscanf(fr,"%3s",_all);
printf("总分:%3s\n",_all);
zhuangtai=0;
//标识阐明已查找到记录
break;
}
else
{
fseek(fr,16,1);
//将光标移到下一次要配对前一种,以测定该信息与否为最终一条
cheshi=fgetc(fr);
if(cheshi==EOF)
break;
}
}
同样,在设计此功能时,我也考虑到了查询信息不存在问题,当使用者输入要查询信息不存在时,会有文字和声音提醒“未找到要查询记录”,并且,在执行此功能过程中,也设置了随时退出查询功能。功能界面如下:
接下来简介是删除记录功能。同样,删除记录功能也是非常需要,当某个学生信息不再需要时,假如继续保留,将使学生信息管理变得越来越复杂,因此,删除多出记录是非常有必要。删除功能界面如下:
在查找要删除记录位置时,我采用方式是先将所有信息先存入一种构造数组,源代码如下:
for(i=0;i<50;i++) //先将所有信息读入一种构造数组
{
_cheshi4=fgetc(fr);
if(_cheshi4==EOF)
break;
else
fseek(fr,-1,1);
fscanf(fr,"%11s",student5[i].id);
fscanf(fr,"%6s",student5[i].name);
fscanf(fr,"%2s",student5[i].fale);
fscanf(fr,"%3s",&student5[i].score[0]);
fscanf(fr,"%3s",&student5[i].score[1]);
fscanf(fr,"%3s",&student5[i].score[2]);
fscanf(fr,"%3s",&student5[i].score[3]);
fscanf(fr,"%3s",&student5[i].all);
}
至于查找要删除信息位置跟信息查询功能查找方式是同样,即将所输入学号或姓名跟已存在信息一一匹配,当找到要删除记录时,立即退出匹配循环。源代码如下:
for(j2=0;j2<i;j2++)
{
if(!strcmp(_shuru2,student5[j2].id)||!strcmp(_shuru2,student5[j2].name))
_biaoji=j2;
}
并且还增长了删除记录未找到反应机制
if(_biaoji==51)
{
printf("\a");
printf("未找到要删除记录!\n");
}
程序第四大功能是修改记录功能。设计此功能目是考虑到当使用者只要修改某个学生某一项信息但又不想修改其他信息时就可以采用修改记录功能,此功能可以按照使用者意图选择性修改学生某项指定记录。这样就比将该学生记录所有删除然后又重新存进去要以便多了。首先要输入要删除学生姓名或学号,以确定操作对象,代码如下:
printf("请输入要修改信息学生姓名或学号!(按0取消修改)\n");
scanf("%s",_shuru2);
if(strcmp(_cheshi8,_shuru2)) //设置退出修改功能
{
fseek(fr,0,0);
for(i=0;i<50;i++)
{
_cheshi1=fgetc(fr);
if(_cheshi1==EOF)
{
printf("\a");
printf("未找到要修改记录!\n");
goto loop8;
}
fseek(fr,-1,1);
fscanf(fr,"%11s",student4.id);
fscanf(fr,"%6s",student4.name);
if((!strcmp(_shuru2,student4.id))||(!strcmp(_shuru2,student4.name)))
{
fseek(fr,17,1);
break;
}
else
fseek(fr,17,1);
}
在找到要修改对象后,就要选择要修改项目,使用者可以通过选择方式选择所要修改项,代码如下:
printf("请选择要修改项...\n");
printf("修改学号请按1\n");
printf("修改姓名请按2\n");
printf("修改性别请按3\n");
printf("修改分数请按4\n");
scanf("%s",_xiang);
xiang=atoi(_xiang);
switch(xiang)
{
case 1:
{
printf("请输入要修改学号:\n");
scanf("%s",_xin);
if(strlen(_xin)==11)
strcpy(student4.id,_xin);
else
{
printf("\a");
printf("输入学号有误,学号为11位数,请重新输入!\n");
goto loop3;
}
}
break;
case 2:
{
loop3: printf("请输入要修改姓名(仅支持3个字以内中文):\n");
scanf("%s",_xin);
if(strlen(_xin)==0||strlen(_xin)>6)
{
printf("输入姓名长度不符合规定,请重新输入!\n");
goto loop3;
}
strcpy(student4.name,_xin);
}
break;
case 3:
loop4: printf("请输入要修改性别...\n");
scanf("%s",_xin);
if(strlen(_xin)!=2)
{
printf("\a");
printf("性别输入有误,请重新输入!\n");
goto loop4;
}
else
strcpy(student4.fale,_xin);
break;
假如选择要修改分数,又会提醒让你选择要修改分数科目:
case 4:
printf("请选择要修改成绩:\n");
loop6: printf("C语言请按1\n大机请按2\n高数请按3\n英语请按4...\n");
scanf("%s",_xuanzhe);
xuanzhe=atoi(_xuanzhe);
switch(xuanzhe)
{
case 1: {
printf("请输入要修改学号:\n");
scanf("%s",_xin);
if(strlen(_xin)==11)
strcpy(student4.id,_xin);
else
{
printf("\a");
printf("输入学号有误,学号为11位数,请重新输入!\n");
goto loop3;
}
}
break;
case 2:
{
loop3: printf("请输入要修改姓名(仅支持3个字以内中文):\n");
scanf("%s",_xin);
if(strlen(_xin)==0||strlen(_xin)>6)
{
printf("输入姓名长度不符合规定,请重新输入!\n");
goto loop3;
}
strcpy(student4.name,_xin);
}
break;
接下来简介程序第五大功能——输出所有学生信息功能。当然杂乱地输出所有信息可以说是好无意义,因此,我在设计此功能时采用了一种冒泡排序,将所有学生信息按照总分从大到小依次输出。详细是先将所有学生信息先存储在一种构造数组中:
for(_n2=0;_n2<50;_n2++)
{
_cheshi4=fgetc(fr);
if(_cheshi4==EOF)
{
fseek(fr,-1,1);
break;
}
else ;
fseek(fr,-1,1);
fscanf(fr,"%11s",student6[_n2].id);
fscanf(fr,"%6s",student6[_n2].name);
fscanf(fr,"%2s",student6[_n2].fale);
fscanf(fr,"%3s",student6[_n2].score[0]);
fscanf(fr,"%3s",student6[_n2].score[1]);
fscanf(fr,"%3s",student6[_n2].score[2]);
fscanf(fr,"%3s",student6[_n2].score[3]);
fscanf(fr,"%3d",&_laji);
qiu[0]=atoi(student6[_n2].score[0]);
qiu[1]=atoi(student6[_n2].score[1]);
qiu[2]=atoi(student6[_n2].score[2]);
qiu[3]=atoi(student6[_n2].score[3]);
student6[_n2].all=qiu[0]+qiu[1]+qiu[2]+qiu[3];
}
然后用了一种冒泡排序:
for(i=0;i<_jilu+1;i++)
for(j=0;j<_jilu-1;j++)
{
if((student6[j].all)<(student6[j+1].all))
{
student4=student6[j];
student6[j]=student6[j+1];
student6[j+1]=student4;
}
}
按总分排好序之后就是输出信息了,输出信息时候,我采用是一种学生所有信息在一行输出,这样可以使使用者在查看时候显得愈加清晰明了。
最终就是退出功能。,退出功能在此程序中可以说无处不在,由于我在设计各项功能时都考虑到了退出问题,在执行各个功能时,随时都可以退出到主菜单。但这里所说退出功能是指退出程序功能,没有退出功能,有了该功能将可以使程序在运行时可以很以便地退出。
三.总结与体会
回忆起本次课程设计,至今我仍感慨颇多,确实,从从拿到题目到完毕整个编程,从理论到实践,在整整半个学期日子里,可以学到诸多诸多东西,同步不仅可以巩固了此前所学过知识,并且学到了诸多在书本上所没有学到过知识。通过这次课程设计使我懂得了理论与实际相结合是很重要,只有理论知识是远远不够,只有把所学理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己实际动手能力和独立思索能力。在设计过程中碰到问题,可以说得是困难重重,这毕竟第一次做,难免会碰到过多种各样问题,同步在设计过程中发现了自己局限性之处,对此前所学过知识理解得不够深刻,掌握得不够牢固,例如说构造体……通过这次课程设计之后,一定把此前所学过知识重新温故。这次课程设计终于顺利完毕了,在设计中碰到了诸多编程问题,最终在郭老师辛勤指导下,终于游逆而解。同步,在郭老师身上我学得到诸多实用知识,在次我表达感谢!同步,对给过我协助所有同学和各位指导老师再次表达忠心感谢在课程设计过程中,我学到了诸多人生哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上不良情绪,黑夜过去了,我们收获是黎明。在本次实践中,给我印象最为深刻是在文献删除程序编译过程中,先有我各个子程序都已经编辑成功,那么这最终程序就将是我成功关键。老天不会让我太过顺利,他在这最终时刻设置障碍,是要考验我能力,他要置我于死地?在这个问题处理上,我打了退堂鼓,我不能忍受长时间无功而反,时间正在消磨我意志。没有了柳暗花明一天,那么我怎么能说经受住了考验?谢谢老师那句话,她说:人力有所不能及,然而,人精神是不会败倒。我鼓起勇气,到处问,到处查资料,黄天不负有心人,在一篇文章上,终于看到了我所尤其规定函数,我实现了组合是关键理论。不得不说这是精神胜利,是永不言败精神让我程序重见天日。谢谢给我指点迷津老师。6月11日,我们课程设计结束了,不过它留给我印象是不可磨灭。无论我后来会不会波及到C语言程序编译研究,我想,我至少掌握了一种系统研究措施,我们学习目就在于运用,我们运用这种研究措施时候会诸多,我最终要感谢课程设计,它确实教会我诸多。
四、参照资料
1、李长云.《C语言程序设计》国防工业出版社、
2、百度文库(寻找C语言课程设计模版及某些实用功能函数)
展开阅读全文