资源描述
课 程 设 计 报 告
课程名称 《C语言程序设计》
课题名称 班级成绩管理系统
专 业 信息管理与信息系统
班 级
学 号
姓 名
指导教师 赵锦元、李峰、罗敬
2011 年 6 月 22 日
湖南工程学院
课 程 设 计 任 务 书
课程名称 《C语言程序设》
课 题 班级成绩管理系统
专业班级
学生姓名
学 号
指导老师 赵锦元、李峰、罗敬
审 批
任务书下达日期 2011 年 6月4 日
任务完成日期 2011 年 6 月 22 日
一、设计内容与设计要求
1.课程设计目的
全面熟悉、掌握C语言基本知识,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,养成提供文档资料的习惯和规范编程的思想,为后继课程(数据结构和数据库等课程)的实验以及课程设计打下较扎实的基础。
2.课题题目
⑴班级成绩管理系统
⑵班级档案管理系统
⑶飞机订票系统
⑷猜数字游戏
⑸电子英汉词典设计
⑹通讯录管理系统
3.设计要求
(1)掌握结构化程序设计的主体思想,以自顶向下逐步求精的方法编制程序解决一些实际的中型问题,为将来开发软件积累一些典型的案例处理经验。具体要求如下:
设计课题题目:每位同学根据自己学号除以6所得的余数加一选择相应题号的课题。原则上不予换提,私自换题者不记成绩。
(2)根据自己对应的课题完成以下主要工作:①完成系统需求分析:包括系统设计目的与意义;系统功能需求;输入输出的要求。②完成系统概要设计:程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能;课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。③完成系统详细设计:包括采用C语言定义相关的数据类型;写出各模块的类C码算法;画出函数的调用关系图。④调试分析、设计体会、测试数据:准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果;程序调试中遇到的问题以及解决问题的方法;课程设计过程经验教训、心得体会。⑤关键源程序(带注释)
⑶ 按规定格式完成课程设计报告,将其打印稿(A4纸)上交给老师存档。
⑷不得抄袭他人程序、课程设计报告,每个人应体现自己的个性设计。
二、进度安排
第 17 周 星期一 8时:00分——11时:30分
星期二 8时:00分——11时:30分
星期四 8时:00分——11时:30分
星期五 8时:00分——11时:30分
第18周 星期一 8时:00分——11时:30分
第18周 星期二 14时:30分——18时:00分
目录
1.系统需求分析 1
1.1问题描述 1
1.2功能需求 1
1.3算法提示: 1
1.4测试数据: 2
1.5其它 2
2.概要设计 2
2.1程序的模块组成 2
2.2各模块的功能 2
3.详细设计 3
3 .1采用C语言定义相关的数据类型 3
3.2显示主界面的函数 4
3.3成绩录入函数 5
3.4成绩显示函数 5
3 .5成绩保存函数 5
3.6成绩排序函数 6
3.7成绩修改函数 6
3.8成绩统计函数 7
4.系统调试 8
4.1函数关系调用图 8
4.2 程序中出现的问题及解决方法 9
5.运行结果 10
5.1 主界面、成绩录入 10
5.2成绩显示 、保存 11
5.3成绩排序 12
5.4成绩修改以及修改后保存 13
5.5 成绩统计 14
6.心得体会 15
7.附录 16
7.1源代码 16
7.2参考文献 22
8 评分表 23
1.系统需求分析
1.1问题描述
对一个有N个学生的班级,每个学生有M门课程。该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。
1.2功能需求
(1)本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称。
(2)本系统显示这样的菜单:
请选择系统功能项:
a、 成绩录入
b、 成绩显示
c、 成绩保存
d、 成绩排序
e、 成绩修改(要求先输入密码)
f、 成绩统计
(1)显示每门课程成绩最高的学生的基本信息
(2)显示每门课程的平均成绩
(3)显示超过某门课程平均成绩的学生人数
g、 退出系统
(3)执行一个具体的功能之后,程序将重新显示菜单。
(4)将学生成绩保存到文件中。
1.3算法提示:
1、数据结构:结构体类型数组。
2、数据库结构:下表构成该系统的基本数据库。
姓名 学号 课程名称1 课程名称2 ●●●●●●
char Char float float
1.4测试数据:
学生人数N=10
课程门数M=4
课程名:数学、语文、英语、政治
1.5其它
对该系统有兴趣的同学可以在实现上述基本功能后,完善系统的其它功能。
2.概要设计
2.1程序的模块组成
整个系统除了主函数外,另外还有7个函数,实现七大功能:成绩录入功能、成绩显示功能、成绩保存功能、成绩排序功能、成绩修改功能、成绩统计功能、退出系统功能。
2.2各模块的功能
(1)主函数 main()
利用while()输出函数主界面和swithch()实现选择函数以及各函数的 调用,系统根据输入的数字选项来调用相应的函数。
a、主界面函数 利用while(xz)语句,只要输入的xz!=0,就会输出主界面。
b、菜单选择函数
用switch(XZ)开关语句,进入“功能选择”的界面,在这个界面里有显 示系统的七大功能,当XZ=?时,根据每个功能前面的序号(XZ=)进行选择。等执行完每一个函数功能后,返回菜单。
(2)成绩录入函数(xxlr)
void xxlr(struct student stu[],int n) 实现对每个学生学号,姓名,四门课程的成绩,总成绩,平均成绩的录入。
(3)成绩显示函数(xxxs)
void xxxs(struct student stu[],int n) 实现对每个学生的学生信息的输出。
(4)成绩保存函数(xxbc)
void xxbc(struct student stu[],int n) 实现对输入的信息保存在c\\student.txt中,并且能从中读取学生的信息。
(5)成绩排序函数(xxpx)
void xxpx(struct student stu[],int n) 实现对学生总成绩的从大到 小的排序。
(6)成绩修改函数(xxxg)
void xxxg(struct student stu[],int n) 实现对几个学生信息修改,再次选择xz=3,4可将修改的程序重新保存。
(7) 成绩统计函数(xxtj)
void xxtj(struct student stu[],int n) 实现以下三个分功能:
a、 每门课程成绩最高的学生信息;
b、 每门课程的平均成绩;
c、 显示超过某门课程平均成绩的人数。
(8)退出系统函数
用if语句表示 if(xz=0) break;即选择0时就表示退出系统了。
3.详细设计
3 .1采用C语言定义相关的数据类型
对要输入的学生信息采用结构体数组的形式,这样既方便又明了,而且也使我自己对这种方式的表达更加熟悉。
Struct student //结构体数组关于学生的信息
{ char num[11];
char name[10];
float score[4];
float total;
float aver;
} stu[11];
本程序对要定义的学生信息中不同的信息采用了不同的数据类型,例如:在对学生的学号和名称用字符型(char num[11]; char name[10];),在对学生的四门成绩,总成绩和平均成绩采用浮点型(float score[4]; float total; float aver;)。并且对后文程序中要定义的采用了相对应的类型(int i,j;)。
3.2显示主界面的函数
用while()语句实现,如:
while(1)
{ printf("***学生成绩管理系统***\n");
printf("======================\n");
printf(" 1.学生成绩录入 \n");
printf(" 2.学生成绩显示 \n");
printf(" 3.学生成绩保存 \n");
printf(" 4.学生成绩排序 \n");
printf(" 5.学生成绩修改 \n");
printf(" 6.学生成绩统计 \n");
printf(" 0.结束程序 \n");
printf("=======================\n");
printf("choose 1,2,3,4,5,6,0: \n");
}
只要括号中的数不为0,就输出主界面。
3.3成绩录入函数
int i;
for(i=0;i<n;i++)
{ printf("输入学号 姓名:\n");
scanf("%s%s",stu[i].num,stu[i].name);
printf("\n数学成绩,语文成绩,英语成绩,政治成绩\n");
scanf("%f,%f,%f,%f",&stu[i].score[0],&stu[i].score[1],&stu[i].score[2],&stu[i].score[3]);
}
利用循环语句,分别对每个学生的信息进行录入
3.4成绩显示函数
{ int i;
printf("\n学生信息:学号 姓名 数学成绩 语文成绩 英语成绩 政治成绩 总成绩 平均成绩\n");
for(i=0;i<n;i++) printf("\n%s,%s,%f,%f,%f,%f,%f,%f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].total,stu[i].aver);
printf("\n");
}
和3.3一样,只是让成绩整体输出,在屏幕上显现出来而已。
3 .5成绩保存函数
fp=fopen("c:\\student.txt","w");先定义一个文件fp,把要输入的信息保存在c:\\student.txt中。
for(i=0;i<n;i++)
{
fprintf(fp, "\n%s,%s,%f,%f,%f,%f,%f,%f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].total,stu[i].aver);
}
fclose(fp); 用fprintf语句使信息输入到文件中,并保存。
fp=fopen("c:\\student.txt","r");
for(i=0;i<n;i++)
{
fscanf(fp, "\n%[^,]%[^,]%f,%f,%f,%f,%f,%f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].total,stu[i].aver);}
再次用只读的形式打开文件,在fscanf语句后再用printf输出学生信息。
3.6成绩排序函数
struct student t; //定义结构体变量,用于下面的交换
for(i=0;i<n-1;i++) //第i个学生
{ for(j=i+1;j<n;j++) //第i+1个学生
if(stu[j].total>stu[i].total)
{ t=stu[j];
stu[j]=stu[i];
stu[i]=t;
}
} 用选择法的方式将总成绩最高的学生放在最前面,实现从大到小的排序。
3.7成绩修改函数
首先对密码的设置,用语句if(strcmp(pass,password)==0),如果正确就进行下步操作。输入要修改的学生学号,gets(no); 再次进行stu[i].num 和no的比较if(strcmp(stu[i].num,no)==0),就对此学生的成绩进行修改,并输出。
3.8成绩统计函数
此函数对三个进行统计:
(1) for(j=0;j<4;j++)
{ max=stu[0].score[j]; //先赋初值
k=0; // k表示第k +1个学生
for(i=0;i<n;i++)
if(stu[i].score[j]>max)
{ max=stu[i].score[j];
k=i;
}这样就得到了每门课成绩最高分的学生,然后在输出他的全部信息。
(2)for(j=0;j<4;j++)
{ sum=0;
for(i=0;i<n;i++)
sum=sum+stu[i].score[j];
aver_cour[j]=sum/n;
printf("第%d门课,课程的平均成绩为%f\n",j+1,aver_cour[j]);
} 对每门课程求取平均分。
(3)for(j=0;j<4;j++)
{ k=0; //k表示超过某门课平均成绩的人数
for(i=0;i<n;i++)
if(stu[i].score[j]>aver_cour[j])
k++;
printf("第%d门课有%d个同学超过平均分\n",j+1,k);
} 实现了计算超过某门课平均成绩的人数。
总之,在一个函数中,用三个循环语句就实现了所要求的。
4.系统调试
4.1函数关系调用图
开始
main函数
0、退出系统
xxtc
1、成绩录入函数
xxlr
2、成绩显示函数
xxxs
3、成绩保存函数
xxbc
4、成绩排序函数
xxpx
5、成绩修改函数
xxxg
6、成绩统计函数
xxtj
结束
4.2 程序中出现的问题及解决方法
(1)在信息保存在文件中的时候,未使用恰当的输入输出语句,应将printf语句改为fprintf语句,将scanf语句改为fscanf语句,才解决了学生信息可在我保存的c\\student.txt中显示出来,而不是一些乱码。
(2)在排序的时候,没有定义结构体变量(struct student t),而是定义为float型(float t),以至于成绩交换没有实现(t=stu[i].total;stu[i].total=stu[i+1].total;stu[i+1].total=t;)在我 改变这一个小小的地方后,这个子函数就可以正常运行了。
(3)在求平均成绩时,aver_cour[j]=sum/n;因for循环语句中n的值没弄清,一下就出现了错误。
(4)在if语句中,将数组的比较和值得比较弄混了:如:
char pass[10],password[10];
if(stracmp(pass,password)=0)
printf("请输入要修改的学生信息的学号");
只有用上面的if语句而不是if(pass=password)才能输出正确的结果。
(5)在下面的语句中,scanf("%s%s\n",stu[i].num,stu[i].name);这条语句是错误的。因为scanf语句是从电脑键盘上输入,不能直接输入换行符(\n)。scanf语句有严格的格式要求,你只能按照它的输出要求来办。另外,输入数据时,企图规定精度。 scanf("%7.2f",&a); 这样做是不合法的,输入数据时不能规定精度。再者,在不应加地址运算符&的位置加了地址运算符,scanf("%s",&str);
C语言编译系统对数组名的处理是:数组名代表该数组的起始地址,且scanf函数中的输入项是字符数组名,不必要再加地址符&。应改为:
scanf("%s",str);
(6)switch语句中,每一个case之后又应有一个berak;,但最后一个应没有。就是由于漏写了break语句,case只起标号的作用,而不起判断作用。
5.运行结果
5.1 主界面、成绩录入
5.1-主界面显示图
5.2成绩录入
5.1-成绩录入图
5.3成绩显示 、保存
5.3-成绩显示,保存显示图
在显示和保存界面中,出现的是一样的,只是保存的时候在c\\student.txt中可以体现出来。
5.4成绩排序
5.4-成绩排序显示图
5.5成绩修改以及修改后保存
5.5-成绩修改及保存后的显示图
5.6 成绩统计
5.6-成绩统计显示图
图中包括(1)每门课成绩最高分的学生信息;
(2)每门课的平均分;
(3)超过某门课程平均分的人数。
6.心得体会
回顾起此次课程设计,至今我仍感慨颇多,的确,从拿到题目到完成整个编程这短短的一个多星期内,从理论到实践的转变,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,而且更加锻炼了我的动手能力以及串联知识和思维的转换能力。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体……当然,在最后完成的程序中,有许多模块是借鉴的,毕竟我还是处于初学者阶段,离高手还有很多路要走,但是我不会灰心的。
通过这次课程设计之后,我了解到设计程序也并非想象中的那么复杂,只要多花点功夫就会有收获,其实很多内容都是老师上课时就讲了的,但我们就是没有用心,缺少了那么一点灵动,所以,我们除了要扎实的学好基础知识之外,那一点点小聪明还是必要的。此外,在不懂得的知识方面,应该及时向老师提出问题或者跟同学一起讨论,以求能得出结论,不要不懂装懂。
本次课程设计结束了,对于我的影响很大。我通过这次实践学到了许多知识,学到了设计一个简单的系统,要注意哪些方面,也使我知道自己哪些方面做得还不够。
但我出总结出了一点点的经验如下:
(1)要对系统的功能和要求做出详细的分析,并合理分解任务。
(2)把分解出来的子任务,做给一个相对独立的模块。
(3)在设计一个模块之前,要简单构想一下总界面的显视情况。
(4)针对构想出来的界面进行程序的编写。
(5)对整体和细节方面都要考虑全面,不忽视每一个小地方。
最后,感谢老师您对我的指导和从百忙中抽空看我的设计,谢谢!
7.附录
7.1源代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void lr(struct student stu[], int n); //成绩录入
void xs(struct student stu[], int n); //成绩显示
void bc(struct student stu[], int n); //成绩保存
void px(struct student stu[], int n); //成绩排序
void xg(struct student stu[], int n); //成绩修改
void tj(struct student stu[], int n); //成绩统计
void tc(struct student stu[], int n); //退出系统
struct student
{ char num[11];
char name[16];
float score[4];
float total;
float aver;
} stu[11];
void main()
{
int xz,n;
printf("输入学生数:");
scanf("%d",&n);
while(1)
{ printf("***学生成绩管理系统***\n");
printf("======================\n");
printf(" 1.学生成绩录入 \n");
printf(" 2.学生成绩显示 \n");
printf(" 3.学生成绩保存 \n");
printf(" 4.学生成绩排序 \n");
printf(" 5.学生成绩修改 \n");
printf(" 6.学生成绩统计 \n");
printf(" 0.结束程序 \n");
printf("=======================\n");
printf("choose 1,2,3,4,5,6,0: \n");
scanf("%d",&xz);
switch(xz)
{ case 1: lr(stu,n); break;
case 2: xs(stu,n); break;
case 3: bc(stu,n); break;
case 4: px(stu,n); break;
case 5: xg(stu,n); break;
case 6: tj(stu,n); break;
case 0: break;
default: printf("enter data error!\n");
}
if(xz==0) break;
}
}
//*1.学生成绩录入程序(xxlr.c)*//
void lr(struct student stu[],int n)
{ int i;
for(i=0;i<n;i++)
{ printf("输入学号 姓名:\n");
scanf("%s%s",stu[i].num,stu[i].name);
printf("\n数学成绩,语文成绩,英语成绩,政治成绩\n");
scanf("%f,%f,%f,%f",&stu[i].score[0],&stu[i].score[1],&stu[i].score[2],&stu[i].score[3]);
stu[i].total=stu[i].score[0]+stu[i].score[1]+stu[i].score[2]+stu[i].score[3];
stu[i].aver=stu[i].total/4;
}
}
//*2.学生成绩显示程序(xxxs.c)*//
void xs(struct student stu[], int n)
{ int i;
printf("\n学生信息:学号 姓名 数学成绩 语文成绩 英语成绩 政治成绩 总成绩 平均成绩\n");
for(i=0;i<n;i++)
printf("\n%s,%s,%f,%f,%f,%f,%f,%f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].total,stu[i].aver);
printf("\n");
}
//*3.学生成绩保存程序(xxbc.c)*//
void bc(struct student stu[], int n)
{ FILE *fp;
int i;
fp=fopen("c:\\student.txt","w");
for(i=0;i<n;i++)
// if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
{
fprintf(fp, "\n%s,%s,%f,%f,%f,%f,%f,%f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].total,stu[i].aver);
//printf("file write error!\n");
}
fclose(fp);
fp=fopen("c:\\student.txt","r");
for(i=0;i<n;i++)
{ //fread(&stu[i],sizeof(struct student),1,fp);
fscanf(fp, "\n%[^,]%[^,]%f,%f,%f,%f,%f,%f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].total,stu[i].aver);
printf("\n 学生信息:学号 姓名 数学成绩 语文成绩 英语成绩 政治成绩 总成绩 平均成绩\n");
printf("\n%s,%s,%f,%f,%f,%f,%f,%f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].total,stu[i].aver);
}
}
//*4.学生成绩排序程序(xxpx.c)*//
void px(struct student stu[], int n)
{ int i,j;
struct student t;
for(i=0;i<n-1;i++) //第i个学生
{ for(j=i+1;j<n;j++) //第i+1个学生
if(stu[j].total>stu[i].total)
{ t=stu[j];
stu[j]=stu[i];
stu[i]=t;
}
}
printf("the sorted numbers:\n");
for(i=0;i<n;i++)
{ printf("\n 学生信息:学号 姓名 数学成绩 语文成绩 英语成绩 政治成绩 总成绩 平均成绩\n");
printf("\n%s,%s,%f,%f,%f,%f,%f,%f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].total,stu[i].aver);
}
}
//*5.学生成绩修改程序(xxxg.c)*//
void xg(struct student stu[], int n)
{ char no[11];
int i;
char pass[10],password[10];
printf("请设置密码:\n");
scanf("%s",pass);
printf("请再次输入密码:\n");
scanf("%s",password);
if(strcmp(pass,password)==0)
{ printf("请输入要修改信息的学生学号:\n");
getchar();
gets(no); //输入学号
for(i=0;i<n;i++)
if(strcmp(stu[i].num,no)==0)
{ printf("\n%s,%s,%f,%f,%f,%f,%f,%f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].total,stu[i].aver);
printf("\n请输入最新成绩:数学成绩,语文成绩,英语成绩,政治成绩\n");
scanf("%f,%f,%f,%f",&stu[i].score[0],&stu[i].score[1],&stu[i].score[2],&stu[i].score[3]);
stu[i].total=stu[i].score[0]+stu[i].score[1]+stu[i].score[2]+stu[i].score[3];
stu[i].aver=stu[i].total/4;
break;
}
if(i>n)
printf("你要查找的学生没查到!\n");
}
}
//*6.学生成绩统计程序(xxtj.c)*//
void tj(struct student stu[], int n)
{ int i,j,k;
float max,sum,aver_cour[4];
for(j=0;j<4;j++)
{ max=stu[0].score[j];
k=0;
for(i=0;i<n;i++)
if(stu[i].score[j]>max)
{ max=stu[i].score[j];
k=i;
}
printf("第%d门课程,\n成绩最高的学生的信息 学号%s 姓名%s 数学%f 语文%f 英语%f 政治%f 总成绩%f 平均成绩%f\n",j+1,stu[k].num,stu[k].name,stu[k].score[0],stu[k].score[1],stu[k].score[2],stu[k].score[3],stu[k].total,stu[k].aver);
}
for(j=0;j<4;j++)
{ sum=0;
for(i=0;i<n;i++)
sum=sum+stu[i].score[j];
aver_cour[j]=sum/n;
printf("第%d门课,课程的平均成绩为%f\n",j+1,aver_cour[j]);
}
for(j=0;j<4;j++)
{ k=0; //k表示超过某门课平均成绩的人数
for(i=0;i<n;i++)
if(stu[i].score[j]>aver_cour[j])
k++;
printf("第%d门课有%d个同学超过平均分\n",j+1,k);
}
}
7.2参考文献
[1] 苏仕华、魏韦巍、王敬生、刘燕君 编著 数据结构 课程设计 第二版
[2] 谭浩强著C程序设计(第四版).北京:清华大学出版社.2010.6
[3] 谭浩强著C程序设计(第四版)学习辅导.北京:清华大学出版社.2010.6
[4] 谭浩强著C语言设计题解与上机指导(第三版).北京:清华大学出版社,2005
8 评分表
计算机与通信学院课程设计评分表
课程名称: C语言程序设计
项 目
评 价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成
展开阅读全文