《c语言课程设计》
程序设计说明书
院 系: 信息系
专业班级: 计算机二班
学 号: 140713041
学生姓名: 董丁锐
指导教师: 刘红梅
内容摘要
摘要:本次课程设计的课题是学生成绩管理系统,本文介绍课程设计课题的选题意义,说明了本系统提供的主要功能,对设计思路、功能模块、流程图、功能模块、中心算法进行了详细的说明,并画出流程框图。本文提供了完整的源程序代码,并展示了系统使用和运行效果。最后给出了在小学期高级语言程序设计过程中的总结,其中包含本程序独特设计,作者的设计收获、设计中遇到的困难和问题,以及作者对设计题目及功能的改进意见,查阅的参考文献等方面的内容。
索引关键字
关键词:源程序代码,学生成绩管理,流程框图
内容目录
1 题目要求------------------------------------4
1.1 内容要求--------------------------------------------------4
1.2 设计要求--------------------------------------------------4
2 设计思想------------------------------------5
3 功能模块及流程图----------------------------5
4 数据结构------------------------------------7
5 中心算法代码说明----------------------------7
6 系统实现------------------------------------8
6.1 程序代码-------------------------------------------------8
6.2 系统使用-------------------------------------------------21
6.3 运行效果说明---------------------------------------------21
7 总结---------------------------------------24
8 致谢词-------------------------------------25
9 参考文献-----------------------------------25
.正文
1题目要求
1.1内容要求
要求能够实现输入记录、查询记录、更新记录、统计记录、输出记录等功能。
1. 输入记录。对每个学生的学号、姓名、班级、数学、英语、计算机成绩进行输入并存储,在程序的运行过程中,数据的存储可以采用结构体数组或者链表,但是最终应该存储在文件中。
2. 维护记录。能够实现添加、删除、修改学生记录,但是一定要将最终数据存储到文件中。
3. 查询记录。根据班级、学号、科目等查询学生的成绩。如果查询时学生数据并没有读入到结构体数组或者链表中,则应该先从文件中读出数据并存储在结构体数组或者链表中,然后在结构体数组或者链表中查询满足条件的数据。
4. 统计记录。完成对各门功课最高分和不及格人数的统计。
1.2设计要求
①各级菜单及功能间必须建立必要的联系,要定义参照完整性规则。
②使用二进制文件方式存储数据。
③要求有菜单界面,结果显示时应达到界面友好。
④将完成的全部内容连编成一个.exe文件。
。
2设计思想
1.在设计时考虑以下几个方面:
操作简单。因为使用者多为非计算机专业人员,所以该系统要求设计的界面美观,操作方便。要充分考软件界面友好和操作方便,便愈使用人员快速上手。
易于维护。一个软件的好坏,关键在于产品的可靠,稳定,便于维护。
2.开发语言的选择
针对世界上流行的大量软件和开发工具,经过认真分析其优缺点,结合目前的软硬件开发环境,选用微软WINDOWS平台下的Visual C++作为软件开发工具。选用工具有几下几方面优点:
① C语言简洁、紧凑、使用方便、灵活。有32个关键字。C语言程序比其他许多高级语言简练,源程序短,因此输入程序时工作量小。
② 运算符丰富。
③ 数据类型丰富,具有现代语言的各种数据结构。
④ C语言是完全模块化和结构化的语言。用函数作为程序的模块单位,便于实现程序的模块化。
⑤ 语法限制不太严格,程序设计自由度大。
⑥ 生成目标代码质量高,程序执行效率高。
⑦ 用C语言编写的程序可移植性好。
综上所述,Visual C++可以满足学生成绩管理的要求,所以用来开发学生成绩管理系统是非常合适的。
3功能模块及流程图
学生成绩管理系统对学校加强学生基本情况及学生成绩管理有着重要的作用。为了能使该系统具有更为广泛的功能:应该将该系统细分为学生操作系统、教师操作系统、教务处操作系统,以满足不同身份的人的需求。总体来说,该系统应分为输入模块、维护模块、查询模块以及统计模块。
由于本软件为学校中多个身份的人的定制开发的。我们经过反复论证,最终确定了学生成绩管理系统的设计方案,主要流程图如下所示:
通过系统主菜单,可以使学校中不同身份的人选择不同的操作系统,从而合理的使用不同的功能。
4数据结构
结构体 :
程序设计中用到的结构体类型:
学生信息结构体类型:
struct student
{
int num;
char nam[20];
char clas[20];
float math;
float english;
float computer;
}stu[SIZE];
5中心算法代码说明说明
1. void save()
{
FILE *fp;
int j;
if((fp=fopen("stu_list","wb"))==NULL)
{
printf("cannot open file\n");
return;
}
for(j=0;j<SIZE;j++)
if(fwrite(&stu[j],sizeof(struct student),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
以上代码将数据存入文件中,操作起来避免了直接对内存进行操作,可对文件进行操作。
2. for(i=0;i<SIZE;i++)
for(j=0;j<SIZE-i;j++)
{ if(stu[i].math>stu[i+1].math)
{
t=stu[i].math;
stu[i].math=stu[i+1].math;
stu[i+1].math=t;
}
}
for(j=0,i=0;i<SIZE;i++)
{ if(stu[i].math<60)
j=j+1;
}
统计函数中使用起泡法排序再统计的方法
6.系统实现
6.1 程序代码
代码如下:
#include <stdio.h>
#include <string.h>
#define SIZE 34
struct student
{
int num;
char nam[20];
char clas[20];
float math;
float english;
float computer;
}stu[SIZE];
void save() /*将数据储存于文件*/
{
FILE *fp;
int j;
if((fp=fopen("stu_list","wb"))==NULL)
{
printf("cannot open file\n");
return;
}
for(j=0;j<SIZE;j++)
if(fwrite(&stu[j],sizeof(struct student),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
search(int n) /*查询学号函数*/
{ int j;
for(j=0;j<SIZE;j++)
if(n==stu[j].num)
return j; /*将j的值返回,通过search带回调用处*/
if(j>SIZE)
return -1;
}
void function1() /*添加记录*/
{
void xt2();
int i;
char k;
printf(" ****************************添加学生信息********************************\n");
for(i=0;i<SIZE;i++)
{
printf("请输入该生学号:\n");
scanf("%d",&stu[i].num);
printf("请输入该生姓名:\n");
scanf("%s",&stu[i].nam);
printf("请输入该生所在班级:\n");
scanf("%s",&stu[i].clas);
printf("请输入该生数学成绩:\n");
scanf("%f",&stu[i].math);
printf("请输入该生英语成绩:\n");
scanf("%f",&stu[i].english);
printf("请输入该生计算机成绩:\n");
scanf("%f",&stu[i].computer);
getchar();
printf("完成本次操作!!!\n");
printf("是否返回上一菜单?y/n:\n");
k=getchar();
if(k=='n')
continue; /*判断*/
else
break;
}
save();
xt2();
}
void function2() /*删除学生记录*/
{
void xt2();
int i,j;
char a,k;
printf(" ****************************删除学生信息******************************\n");
printf("请输入要删除学生的学号:\n");
scanf("%d",&i);
j=search(i);
if(j==-1)
{loop:printf("该学生不存在,请重新输入!\n");
printf("输入0退出\n");
for(j=0;j<SIZE;j++)
{
if(j==-1)
goto loop;
else break;
}
}
else
{for(i=0;i<SIZE;i++)
{printf("原数据为:\n");
printf("学号%d,姓名%s,班级%s,数学成绩%4.1f,英语成绩%4.1f,计算机成绩%4.1f\n",stu[j].num,stu[j].nam,stu[j].clas,stu[j].math,stu[j].english,stu[j].computer);
stu[j].num=0;
stu[j].nam[20]=0;
stu[j].clas[20]=0;
stu[j].math=0;
stu[j].english=0;
stu[j].computer=0;
printf("删除结果为\n");
printf("学号%d,姓名%s,班级%s,数学成绩%4.1f,英语成绩%4.1f,计算机成绩%4.1f\n",stu[j].num,stu[j].nam,stu[j].clas,stu[j].math,stu[j].english,stu[j].computer);
save();
printf("完成本次操作!!!\n");
k=getchar();
if(k=='y')
continue; /*判断*/
else
break;}
}
printf("是否返回主菜单y/n:\n");
scanf("%c",&a);
if(a=='y')
xt2();
else
function2();
}
void function3() /*修改*/
{ char name[20],phy[10];
void xt2();
printf("请输入要修改的学生姓名:");
scanf("%s",name);
printf("\n");
int i;
float t;
for(i=0;i<SIZE;i++)
change:if(strcmp(stu[i].nam,name)==0)
{
printf("请输入要修改的科目:");
scanf("%s",phy);
if(strcmp("math",phy)==0)
{
printf("输入成绩:");
scanf("%f",&t);
stu[i].math=t;
printf("成绩为:%4.2f\n",stu[i].math);
}
else if(strcmp("english",phy)==0)
{
printf("输入成绩:");
scanf("%f",&t);
stu[i].english=t;
printf("成绩为:%4.2f\n",stu[i].english);
}
else if(strcmp("computer",phy)==0)
{
printf("输入成绩:");
scanf("%f",&t);
stu[i].computer=t;
printf("成绩为:%4.2f\n",stu[i].computer);
}
else
{
printf("错误,请重新输入:");
goto change;}
}
save();
printf("完成本次操作!!!\n");
xt2();
}
void way1() /*按班级查询*/
{
void function4();
int i;
char clas[20];
char a;
loop:printf("请输入要查询学生的班级:\n");
scanf("%s",clas);
for(i=0;i<SIZE;i++)
{
if(strcmp(clas,stu[i].clas)==0)
printf("学号%d,姓名%s,班级%s,数学成绩%f,英语成绩%f,计算机成绩%f\n",stu[i].num,stu[i].nam,stu[i].clas,stu[i].math,stu[i].english,stu[i].computer);
if(i==SIZE)
{printf("您所查询的信息不存在,请重新输入");
goto loop;}
}
printf("完成本次操作!!!\n");
scanf("%c",&a);
if(a=='y')
way1();
else
function4();
}
void way2() /*按学号查询*/
{
void function4();
int i;
int number;
char a;
loop:printf("请输入要查询学生的学号:\n");
scanf("%d",&number);
for(i=0;i<SIZE;i++)
{
if(number==stu[i].num)
printf("学号%d,姓名%s,班级%s,数学成绩%f,英语成绩%f,计算机成绩%f\n",stu[i].num,stu[i].nam,stu[i].clas,stu[i].math,stu[i].english,stu[i].computer);
if(i==SIZE)
{printf("您所查询的信息不存在,请重新输入\n");
goto loop;}
}
printf("完成本次操作!!!\n");
scanf("%c",&a);
if(a=='y')
way2();
else
function4();
}
void check1() /*按学生数学成绩查询*/
{
void way3();
int i;
char a;
char name[20];
loop:printf("请输入要查询的学生姓名\n");
scanf("%s",name);
for(i=0;i<SIZE;i++)
{if(strcmp(name,stu[i].nam)==0)
printf("%s的数学成绩是%f\n",name,stu[i].math);
}
printf("完成本次操作!!!\n");
scanf("%c",&a);
if(a=='y')
goto loop;
else
way3();
}
void check2() /*按学生英语成绩查询*/
{
void way3();
int i;
char a;
char name[20];
loop:printf("请输入要查询的学生姓名\n");
scanf("%s",name);
for(i=0;i<SIZE;i++)
{if(strcmp(name,stu[i].nam)==0)
printf("%s的英语成绩是%f\n",name,stu[i].english);
}
printf("完成本次操作!!!\n");
scanf("%c",&a);
if(a=='y')
goto loop;
else
way3();
}
void check3() /*按学生计算机成绩查询*/
{
void way3();
int i;
char a;
char name[20];
printf("请输入要查询的学生姓名\n");
scanf("%s",name);
for(i=0;i<SIZE;i++)
{if(strcmp(name,stu[i].nam)==0)
printf("%s的计算机成绩是%f\n",name,stu[i].computer);
}
printf("完成本次操作!!!\n");
scanf("%c",&a);
if(a=='y')
check3();
else
way3();
}
void way3() /*按科目查询*/
{
void function4();
int check;
printf(" ***************************请输入要查询的科目:**********************\n");
printf(" 1按学生数学成绩查询\n");
printf(" 2按学生英语成绩查询\n");
printf(" 3按学生计算机成绩查询\n");
printf(" 4.返回上一菜单\n");
printf("请选择:\n");
scanf("%d",&check);
switch(check)
{
case 1:check1();break;
case 2:check2();break;
case 3:check3();break;
case 4:function4();break;}
}
void function4() /*查询记录*/
{
void main();
int way;
printf(" **************************查询学生成绩********************************\n");
printf(" 1按班级查询\n");
printf(" 2按学号查询\n");
printf(" 3按科目查询\n");
printf(" 4返回主菜单\n");
printf(" **********************************************************************\n");
printf("请选择:\n");
scanf("%d",&way);
switch(way)
{
case 1:way1();break;
case 2:way2();break;
case 3:way3();break;
case 4:main();break;}
}
void function5() /*统计*/
{
void main();
char phy[10];
int a;
printf("请输入要统计的科目:");
shuru:scanf("%s",phy);
if(strcmp("math",phy)==0)
{
int i,j;
float t;
for(i=0;i<SIZE;i++)
for(j=0;j<SIZE-i;j++)
{ if(stu[i].math>stu[i+1].math)
{
t=stu[i].math;
stu[i].math=stu[i+1].math;
stu[i+1].math=t;
}
}
for(j=0,i=0;i<SIZE;i++)
{{ if(stu[i].math<60)
j=j+1;
}}
printf("数学最高分为%4.1f,不及格人数为%d\n",stu[SIZE].math,j);
}
if(strcmp("english",phy)==0)
{
int i,j;
float t;
for(i=0;i<SIZE;i++)
for(j=0;j<SIZE-i;j++)
{ if(stu[i].english>stu[i+1].english)
{
t=stu[i].english;
stu[i].english=stu[i+1].english;
stu[i+1].english=t;
}
}
for(j=0,i=0;i<SIZE;i++)
{ if(stu[i].english<60)
{
j=j+1;
}
}
printf("英语最高分为%4.1f,不及格人数为%d\n",stu[SIZE].english,j);
}
if(strcmp("computer",phy)==0)
{
int i,j;
float t;
for(i=0;i<SIZE;i++)
for(j=0;j<SIZE-i;j++)
{ if(stu[i].computer>stu[i+1].computer)
{
t=stu[i].computer;
stu[i].computer=stu[i+1].computer;
stu[i+1].computer=t;
}
}
for(j=0,i=0;i<SIZE;i++)
if(stu[i].computer<60)
{
j=j+1;
}
printf("计算机最高分为%4.1f,不及格人数为%d\n",stu[SIZE].computer,j);
}
printf("1,继续统计\n");
printf("2,返回主菜单\n");
printf("请选择:\n");
scanf("%d",&a);
switch(a)
{
case 1:function5();break;
case 2:main();break;
}
}
void xt1()
{
void main();
printf(" ************************学生操作系统**********************************\n");
printf(" 1.查询记录\n");
printf(" 2.返回上一菜单\n");
printf(" **********************************************************************\n");
printf("\n");
int function;
printf("请输入要选择的功能:");
scanf("%d",&function);
switch(function)
{
case 1:function4();break;
case 2:main();break;}
}
void xt2()
{
void main();
printf(" *************************教师操作系统**********************************\n");
printf(" 1.添加记录\n");
printf(" 2.删除记录\n");
printf(" 3.修改记录\n");
printf(" 4.查询记录\n");
printf(" 5.统计记录\n");
printf(" 6.返回上一菜单\n");
printf(" ***********************************************************************\n");
printf("\n");
int function;
printf("请输入要选择的功能:");
scanf("%d",&function);
switch(function)
{
case 1:function1();break;
case 2:function2();break;
case 3:function3();break;
case 4:function4();break;
case 5:function5();break;
case 6:main();break;
}
}
void xt3()
{
void main();
printf(" **************************教务处操作系统*********************************\n");
printf(" 1.查询记录\n");
printf(" 2.统计记录\n");
printf(" 3.返回上一菜单\n");
printf(" *************************************************************************\n");
printf("\n");
int function;
printf("请输入要选择的功能:");
scanf("%d",&function);
switch(function)
{
case 1:function4();break;
case 2:function5();break;
case 3:main();break;
}
}
void main()
{
int a;
printf(" ************************学生成绩管理系统***********************************\n");
printf("1.学生 2.教师 3.教务处\n");
printf(" ***************************************************************************\n");
printf("请选择运行身份:");
scanf("%d",&a);
if(a==1)
{xt1();}
if(a==2)
{xt2();}
if(a==3)
{xt3();}
}
6.2系统使用
①录入信息时,每一个项目都必须输入相应的内容,输入错误时,系统自动提供输入错误提示,可以根据提示重新输入。
②修改、增加、删除,查找记录前必须先打开一个文件修改完后必须记得保存信息。
6.3运行效果说明
主菜单:供使用人选择身份,进入相应的管理系统。
添加学生信息:是教师能够录入添加学生信息。
查询功能:使使用人可以根据班级、学号、科目查询成绩。
删除功能:教师能够删除学生信息并储存。
修改功能:使教师能够根据学生姓名修改学生不同科目的成绩。
统计功能:用来统计某科目在班级中最高分以及不及格人数。
7.总结
通过本次C程序课程设计,我觉得对自己提高很大:克服了懒惰,这在我以后的学习和工作中的心理定位与调节有很大的帮助。我感受到了编程是一项非常烦琐周密的活动,他不但需要一个人周密的思考问题的能力,处理问题的能力,还需要有足够的耐心和严谨治学的作风,来不得半点马虎。
通过本次课程设计,我初步学会了程序设计的基本方法,学会了怎样去借鉴别人的方法和经验,知道如何去查找资料和整合处理这些资料的能力,这为以后的大学毕业设计论文打下了一个初步的基础使我收益最大的是享受到了一种成功的喜悦,在这九天之中从开始的确定课程设计题目,然后是上网和上图书馆查找资料,编写C语言原程序,然后是进行编译,这个环节是一个非常痛苦和艰难的,常常会因为一小点的错误而在编译失败与再次修改的漫漫循环之路中,但失败的越多,对人的考验就越多,在编译运行成功之后的享受成功的喜悦也就越多,另外在调试程序的过程中不断的思考和运用已经学到的知识,这对于自己是有很大的提高的。
由于所学的知识不多,自己的编程经验不足,遇到了一些问题。例如:多个数据存储问题,返回上一菜单问题,未接受回车符而造成的后面程序无法运行等问题,经过查询资料,小组讨论以及向指导老师求助,我们顺利地解决了上述问题,从而积累了一些编程经验。
通过这几天地实践,发现该管理系统存在升级的空间,界面不是十分友好,这些方面有待完善。
8致谢辞
经过几天的课程设计,我学会了很多东西。这次课程设计的成功完成离不开同学和老师的帮助。当自己在编程中遇到困难的时候,有同学们共同商量,相互协助,献计献策,使我能够比较分析各种方案,找出解决问题的方法;当在课程设计过程中遇到模棱两可的问题,同学们能过各抒己见,尊重他人见解,使我能够综合各种观点,取长补短,虚心借鉴,是程序做得更尽人意;当遇到我们都无法解决的问题时,有辅导老师耐心讲解,详细地指出了程序中的错误,不仅帮我解决了当前编程中的问题,而且使我加深了对C语言的认识,为以后的学习铺平了道路。感谢他们,他们不仅是我收获了更多的知识,丰富了学习经验,而且使我养成了“严谨治学”的学习态度,使我拥有了面对困难的勇气,并且体会到了浓浓的师生情,体会到了同窗之间难以忘怀的友谊。这必定是我人生中一笔宝贵的财富,再次感谢他们!
7.参考文献
【1】 C语言程序设计实例精粹
【2】 C语言课程设计案例精编
【3】 C语言实战105例
【4】 《C程序设计(第三版)》 谭浩强 著 清华大学出版
【5】 《C语言程序设计——实验指导 课程设计 习题解答》 高涛 陆丽娜 著 西安交通大学出版