C语言课程设计论文及代码学生管理系统.docx
《C语言课程设计论文及代码学生管理系统.docx》由会员分享,可在线阅读,更多相关《C语言课程设计论文及代码学生管理系统.docx(53页珍藏版)》请在冰豆网上搜索。
C语言课程设计论文及代码学生管理系统
项目名称:
学生管理系统
学生姓名:
学号:
班级:
指导教师:
1实验目的和意义
1.1目的
(1)熟练掌握if、if…else、do-while语句和witch语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用do-while语句和switch语句实现菜单功能。
(2)熟练掌握while语句、do…while语句和for语句格式及使用方法,掌握三种循环控制语句的循环过程以及循环结构的嵌套,利用循环语句实现循环结构。
(3)掌握简单、常用的算法,并在编程过程中体验各种算法的编程技巧。
进一步学习调试程序,掌握语法错误和逻辑错误的检查方法。
(4)掌握三种程序设计结构的概念;掌握结构体数组的应用;掌握数组(一维和二维)的概念和应用;达到可灵活运用的状态。
1.2意义
(1)通过本次课程的设计,加深对信息系统基础理论和基本知识的理解,掌握使用信息系统分析、设计的基本方法,提高解决实际管理问题、开发信息系统的实践能力。
(2)通过这次课程设计,使我们更加熟悉掌握C语言的运用。
帮助我们熟悉更多C语言的功能,提高我们的动手能力,学到许多解决实际问题的宝贵经验.同时也挖掘出我们潜在的能力,使我们对自己更有自信,对编程也更有兴趣。
2系统功能描述及设计
2.1学生管理系统存储的信息
(1)学号(系统随机生成)
(2)姓名
(3)性别
(4)计算机成绩
(5)数学成绩
(6)英语成绩
(7)平均值
2.2学生管理系统能够完成的基本功能
(1)信息录入功能:
程序能够添加相应的信息,并且保存到相应的文件中;
(2)信息浏览功能:
程序能够输出相应的信息;
(3)信息查找功能:
程序能够根据学生姓名查看相应的学生信息;
(4)信息删除功能:
程序能够根据学生姓名删除相应的学生信息,并且保存到相应的文件中;
(5)信息排序功能:
程序能够根据用户要求完成按平均值,数学成绩,英语成绩,计算机成绩排序功能;
(6)信息统计功能:
程序能够根据用户要求统计指定科目的相应信息,包括(该科平均值,最大值,最小值,各分数段的人数比率以及及格率);
(7)信息插入功能:
程序能够根据用户需要将需要插入的学生信息插入到指定位置,并且保存到相应的文件中;
(8)信息修改功能:
程序能够根据用户需要将需要修改的学生的相应项目进行修改,并且保存到相应的文件中;
2.3系统功能描述及分析
程序运行以后就会显示菜单界面:
1、输入学生信息,2、浏览学生信息,3、按姓名查找学生信息,4、按指定学科统计学生成绩,5、按成绩排序,6、删除学生信息,7、插入学生信息,8、修改学生信息,0、退出。
(1)输入学生信息:
进入主菜单,选择输入功能所对应的数字,顺次依照提示录入一个学生姓名、年龄、性别、数学成绩、英语成绩、计算机成绩。
该学生的信息输入完毕后,会提示是否继续输入下一个学生的信息,同时提示返回主菜单。
(2)浏览学生信息:
进入主菜单,选择浏览功能所对应的数字,则整体学生信息输出,浏览完毕后,按照提示,按任意键返回主菜单。
(3)按姓名查找学生信息:
进入主菜单,选择查找功能所对应的数字,按照提示输入需要查询的学生姓名,采用for语句将改姓名与系统中已存储的姓名进行循环比较,若相同则输出该学生的位置与其个人信息,回车以后显示相应的学生信息,完毕后,按照提示,按任意键返回主菜单。
(4)按指定学科统计学生成绩:
进入主菜单,选择统计功能所对应的数字,在子菜单中选择需要统计的科目,再在子菜单选择统计的项目,
(1)平均值,采用for语句将所有学生的这门课的分数相加,再除以人数num,得到结果,
(2)最大最小值,先将第一个学生的成绩赋给min或是max,再采用for语句和if语句将以后的学生成绩进行比较,(3)及格率和各分数段人数比率,采用for语句num进行计数。
回车后显示相应信息,结束后,按照提示,按任意键返回。
(5)按成绩排序:
进入主菜单,选择排序功能所对应的数字,跳出子菜单,再根据需要输入数字选择按平均值或是哪门学科成绩进行排序,排序时采用冒泡法,定义一个中间变量进行交换,回车后输出排序后的结果,完毕后根据提示,按任意键结束后选择0返回主菜单。
(6)删除学生信息:
进入主菜单,选择排序功能所对应的数字,根据学生姓名进行删除删除需要删除的学生姓名,删除时,采用for语句,将改姓名与存储的姓名进行比较,定义一个变量保存其下标的值,将后一个的值赋给它,以此类推,回车后输出删除后的整体学生信息,按照提示按任意键结束返回主菜单,如果所输入的学生姓名不存在系统提示输入错误。
(7)插入学生信息:
进入主菜单,选择插入功能所对应的数字,按照提示依次输入需要插入的学生信息,以及插入的位置,回车后输出插入后的整体学生信息,按照提示按任意键结束返回主菜单。
(8)修改学生信息:
进入主菜单,选择修改功能所对应的数字,根据学生姓名进行修改,选择需要修改的学生姓名,回车后,跳出子菜单,根据需要选择需要修改的项目所对应的数字,回车后根据提示输入修改后的相应信息,返回子菜单如不需要修改选择0推出,退出后输出修改后的学生整体信息,按任意键结束,返回主菜单。
(9)退出:
根据菜单界面的提示,输入对应的数字“0”,则结束整个程序。
2.4系统功能模块图
(1)主菜单功能模块图
图2-4系统功能模块图
(2)统计功能模块图
图2-5系统功能模块图
(3)排序功能模块图
图2-6系统功能模块图
(4)修改功能模块图
图2-7系统功能模块图
3系统存储结构设计与描述
3.1全局变量存储
用全局变量人数表示已经定义的学生的人数,具体代码如下:
intnum;
3.2结构体类型存储
用结构体类型存储学生的各项信息,具体代码如下:
structstudent
{charnumber[N];
charname[N];
charxingbie;
floatmath;
floatenglish;
floatcomputer;
floatp;
};
学号为系统自动生成,定义为char型。
姓名长度M=20,用char型数组接收。
性别男为’m’,女为’f’,为char型。
计算机、数学、英语分数都是在0-100之间,用float型,平均值在输入子函数中计算。
用结构体structstudent保存单个学生的整体信息,定义结构体数组stu[N]表示可以最多存储500(N=500)个学生的信息。
4系统功能实现及算法描述
4.1main()函数的流程图
图4-1主函数流程图
进入学生管理系统主菜单,按照提示进行选择,采用do-while语句若输入为字母或小于0的数字,主菜单中采用do-while语句将菜单进行循环,菜单采用switch-case语句进行选择。
4.2save()函数的流程图
重要代码:
FILE*fp;
charfilename[20]="stu";
if((fp=fopen(filename,"ab+"))==NULL)
{
printf("\t无法打开文件!
\n");
system("pause");
return;
}
for(i=0;i{
if(fwrite(&stu[i],sizeof(structstudent),1,fp)!
=1);
}
fclose(fp);
流程图:
图4-2保存流程图
进入主菜单,选择输入功能所对应的数字,就可以进入输入函数、删除函数和修改函数,执行相应的程序与功能,完毕后,系统会执行成save函数,当文件存在时,就会逐条信息的写入文件,当文件不存在时,就会提示文件不存在,同时会退出程序。
4.3paixu()函数的流程图
重要代码:
structstudentpxy;
max=stu[0].english;
for(i=1;iif(max{max=stu[i].english;
y=i;}
for(i=0;ifor(j=0;jif(stu[j].english{pxy=stu[j];
stu[j]=stu[j+1];
stu[j+1]=pxy;}
图4-3排序函数流程图
进入排序函数后,选择排序科目与排序方式,排序采用从大到小排序,系统就会根据用户输入的数字进行相应的排序,排序时采用冒泡法,将结构体数组中两个相邻的两个元素进行比较,定义一个中间变量structstudentpxy;进行交换,将较大的那个元素掉到较小的元素之前,例如if(stu[j].english{pxy=stu[j];stu[j]=stu[j+1];stu[j+1]=pxy;}
系统中存储了n个学生,即有n个人需要排序,采用for语句,循环进行n-1次比较,而在第i次比较中,需要进行n-i次的两两比较。
完成后,采用二维数组进行从大到小的输出
4.4shc()函数的流程图
重要代码:
for(j=0;jif(strcmp(stu[j].name,xingm)==0)
{i=j;flag=1;
break;}
if(j>=n)
flag=0;
if(flag==1)
{for(j=i;jstu[j]=stu[j+1];
·
图4-4删除函数流程图
进入主菜单,选择数字6,进入删除模块。
首先输入要删除学生的姓名,定义intflag=0;利用顺序查找算法,采用for语句,将该姓名与存储在结构体数组中的学生姓名进行一一比较,比较相等时即查找成功。
第二步,查找成功后flag=1;定义一个变量j保存找到的数组元素下标,if(flag==1)利用一重循环以此用数组后一个元素的值覆盖前一个元素的值,例如stu[j]=stu[j+1];。
完成后结构体数组中人数减1(n--),同时输出删除后的整体学生信息,按照提示按任意键结束返回主菜单,如果查找失败系统执行if(i>=n)语句得到flag=0;if(flag==0),系统提示该学生不在其中如果所输入的学生姓名不存在系统提示输入错误。
执行相应的程序与功能。
4.5charu()函数的流程图
重要代码:
for(j=n+1;j>i-1;j--)
stu[j]=stu[j-1];
strcpy(stu[i-1].name,na);
strcpy(stu[i-1].number,xuehao);
stu[i-1].xingbie=sex;
stu[i-1].computer=computer1;
stu[i-1].math=math1;
stu[i-1].english=english1;
stu[i-1].p=(computer1+math1+english1)/3;
图4-5插入函数流程图
进入主菜单,选择数字7,就可以进入相应的函数,输入该学生的相应信息及插入的位置i,,将下标为i-1的元素的值覆盖下一个元素的值,利用一重循环以此用数组前一个元素的值覆盖后一个元素的值,,将插入的学生信息赋给下标为i-1的元素,同时人数n++。
4.6f()函数的流程图
图4-6查找函数流程图
进入主菜单,选择数字3,输入学生姓名。
采用for(i=0;i=n,则查找失败,输出该学生不在其中。
重要代码:
for(i=0;i{
printf("\t%s\t%c\t%s\t%.1f\t%.1f\t\t%.1f\t%.1f\n",stu[i].number,stu[i].xingbie,stu[i].name,stu[i].math,stu[i].computer,stu[i].english,stu[i].p);
}
5系统性能测试
5.1菜单函数的功能测试
调试好程序以后,系统自动会跳到出以下界面。
然后根据界面上的提示选择相应的系统功能所对应的数字,就会显示出你所需运行的子函数,在按界面提示出入信息。
图5-1菜单功能测试
5.2浏览函数的功能测试
图5-6浏览函数的功能测试
浏览时采用二维数组进行输出,数学,英语,计算机和平均值的小数位为1
5.3输入函数的功能测试
在主菜单选择数字1,跳出相应提示根据提示进行输入:
(1)采用do-while语句成绩输入不得大于100或小于0,输入错误即提示重新输入;
(2)性别输入不得出现f和m以外的字符,输入错误即提示重新输入;
图5-7录入函数的功能测试
输入完成后按任意键返回主菜单。
5.4排序函数的功能测试
图5-9排序函数的功能测试
平均值按从大到小的顺序输出,输出时采用二维数组进行输出
图5-10排序函数的功能测试
5.5统计函数的功能测试
在主菜单选择数字4,跳出子菜单,根据需要输入数字进行选择
图5-11统计函数的功能测试
图5-12统计函数的功能测试
5.6查询函数的功能测试
在主菜单选择数字3,就跳出相应提示语句,按照提示进行查询,显示如下:
图5-13查询函数的功能测试
5.7删除函数的功能测试
在主菜单选择数字6,就跳出相应提示语句,按照提示进行删除
(1)如果输入的姓名不在该系统中就会如下图显示
输入姓名进行删除
回车后显示如下
图5-14删除函数功能测试
5.8修改函数的功能测试
在主菜单选择数字6,就跳出相应提示语句,按照提示进行输入,如姓名不在其中显示如下
输入姓名,回车后显示如下:
选择所需项目进行修改,成绩不得大于100或小于0.
性别只能是m或是f,如果输入错误需重新输入。
图5-15修改函数功能测试
5.9插入函数的功能测试
在主菜单选择数字7,就跳出相应提示语句,按照提示进行输入,注意:
(1)成绩不得大于100或小于0.
(2)性别只能是m或是f,如果输入错误需重新输入。
输入完成后,按回车键
图5-16插入函数功能测试
6设计小结
课程设计可分为以下几个步骤:
(1)思考课程设计代码总体思路:
总体结构和各模块功能分配及设计方案。
思考要实现整个程序大体需要的几个模块和其中用到的C语言基本操作符、语句等。
(2)编写代码总体结构,构思出基本设计方案,采用do-while语句及switch语句写出main主函数框架,运用num全局变量。
(3)在主函数框架的基础上进行添加,同时思考子函数设计方案,着手子函数代码编写,在主函数中进行调用。
(4)编辑程序代码:
这是一个至关重要复杂而且需要反复修改的环节,在此环节中我发现总体设计和模块思想会存在很多问题,我会不断改进.如何实现各函数功能,达到预期效果。
(5)代码进行调试:
在C环境下输入代码并进行调试和正确运行。
在调试过程中会遇到很多需要精化的地方,需要十足的耐心与细心,不断改进完善程序。
(6)最后将程序进行美化:
程序可以正确运行之后,再不影响程序功能的情况下,运用各种辅助性符号,使界面更加美观漂亮,操作更人性化.增强程序的新意与可行性。
在实验过程中有时会遇到学习耐心与细心不足,如scanf(“%d”,&n);中的“&”经常忘记,有时还会犯一些小问题,很耽误时间
通过本次C语言上机实验,对计算机编程语言有了一定的体验。
其间开心过、郁闷过、无奈过、彷徨过……随着实验的胜利成功与实验报告的胜利完成,有点微微的自豪感使人难忘。
伴随着学习的深入,还有很多很多高深的东西,等待着我们自己去挖掘。
参考文献
[1]雷于生、胡成松.C语言课程设计.北京:
高等教育出版社.
[2]袁蒲佳.数据库及其运用,高等教育出版社
[3]杨薇薇.数据结构,高等教育出版社
[4]胡金柱.计算机科学与技术导论,高等教育出版社
附录1:
代码源
#include
#include
#include
#include
#include
#defineN100
structstudent
{charnumber[N];
charname[N];
charxingbie;
floatmath;
floatenglish;
floatcomputer;
floatp;
};
intn;
structstudentstu[N];
voidsave(intn)
{
inti=0;
FILE*fp;
charfilename[20]="stu";
if((fp=fopen(filename,"ab+"))==NULL)
{
printf("\t无法打开文件!
\n");
system("pause");
return;
}
for(i=0;i{
if(fwrite(&stu[i],sizeof(structstudent),1,fp)!
=1);
}
fclose(fp);
}
intread()
{
inti=0;
FILE*fp;
charfilename[20]="stu";
if((fp=fopen(filename,"rb+"))==NULL)
{
printf("无法打开文件!
\n");
system("pause");
}
while(!
feof(fp))
{
fread(&stu[i],sizeof(structstudent),1,fp);
i++;
}
fclose(fp);
returni-1;
}
voidwrite(intnum)
{
inti=0;
FILE*fp;
charfilename[20]="stu";
if((fp=fopen(filename,"wb+"))==NULL)
{
printf("\t\t\t无法打开文件!
\n");
system("pause");
return;
}
for(i=0;i{
fwrite(&stu[i],sizeof(structstudent),1,fp);
}
fclose(fp);
}
voidmenu()
{printf("\t\t欢迎进入学生信息管理系统\t\t\n");printf("\n");
printf("\t\t************************\t\t\n");
printf("\t\t1、输入学生信息\t\t\n");
printf("\t\t2、学生成绩浏览\t\t\n");
printf("\t\t3、按姓名查找学生信息\t\t\n");
printf("\t\t4、按指定学科统计学生成绩\t\t\n");
printf("\t\t5、按成绩排序\t\t\n");
printf("\t\t6、删除学生信息\t\t\n");
printf("\t\t7、插入学生信息\t\t\n");
printf("\t\t8、修改学生信息\t\t\n");
printf("\t\t0、退出\t\t\n");
printf("\t\t************************\t\t\n");printf("\n");}
voidzmenu()
{
printf("************************\n");
printf("1、该科平均值\n");
printf("2、该科最大值\n");
printf("3、该科最小值\n");
printf("4、该科([0,59],[60,69],[70,79],[80,89],[90,100])分数段的人数比例及及格率\n");
printf("0、退出\n");
printf("************************\n");
}
voidzimenu()
{
printf("************************\n");
printf("1、按三门课平均值从大到小排序\n");
printf("2、计算机成绩排序\n");
printf("3、数学成绩排序\n");
printf("4、英语成绩排序\n");
printf("0、退出\n");
printf("************************\n");
}
voidmenu1()
{
printf("************************\n");
printf("1、计算机\n");
printf("2、数学\n");
printf("3、英语\n");
printf("0、退出\n");
printf("************************\n");
}
voidmenu2()
{printf("************************\n");
printf("1、姓名\n");
printf("2、性别\n");
printf("3、数学成绩\n");
printf("4、英语成绩\n");
printf("5、计算机成绩\n");
printf("0、退出\n");
printf("************************\n");
}
voidinput()
{
inti,a;
charsex,b[10];
intrand(void);
voidsrand(unsignedintn);
floatmath1,english1,computer1;
printf("\t\t***请输入人数***:
");
do{
a=0;
scanf("%d",&n);
gets(b);
if(strlen(b)>0||n<=0)
{
printf("\t\t**输入错误,请输入数字:
");
a=1;}
}while(a!
=0);
for(i=0;i{printf("\n\t**请输入第%d个学生的学生信息:
\n",i+1);
itoa((rand()%(2011999-2011000))+2011000,stu[i].number,10);
printf("\t**请输入学生姓名:
");
scanf("%s",stu[i].name);
getchar();
printf("\t**请输入该学生的数学成绩,英语成绩,计算机成绩并用逗号分开\n\t");
scanf("%f,%f,%f",&ma