C语言程序设计报告 学生成绩管理系统.docx
《C语言程序设计报告 学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《C语言程序设计报告 学生成绩管理系统.docx(25页珍藏版)》请在冰豆网上搜索。
![C语言程序设计报告 学生成绩管理系统.docx](https://file1.bdocx.com/fileroot1/2023-5/28/beb25ff5-ae96-4392-81b0-a4f39695c8a1/beb25ff5-ae96-4392-81b0-a4f39695c8a11.gif)
C语言程序设计报告学生成绩管理系统
**大学
物联网工程学院
课程设计报告
课程名称:
计算机综合实践
设计题目:
学生成绩管理系统
班级:
自动化1001班
姓名:
学号:
指导教师:
评分:
2011年11月15日
目录
一、设计目的和任务3
二、总体设计3
三、详细设计5
四、调试与测试5
五、源程序清单和执行结果6
六、体会与心得17
七、参考文献17
一、设计目的和任务
设计目的:
(1)基本掌握面向过程程序设计的基本思路和方法;
(2)达到熟练掌握C语言的基本知识和技能;
(3)能够利用所学的基本知识和技能,解决简单的程序设计问题。
程序功能:
(1)计算各个学生的总分及平均分,并按平均分排出名次。
(2)统计全班学生平均分成绩,输出60分以下、60~79、80~89、90分以上各分数人数。
(3)能按学号、姓名查询学生成绩,并能输出学生的成绩单。
(4)输出不及格科目及学生名单。
(5)在屏幕打印优等生名单(学号,三门课程成绩,平均成绩,名次),优等生必须满足下列条件:
1.平均成绩大于90分;或平均分大于85分且至少有一门功课为100分;或者平均分大于85分且至少两门课程成绩为95分以上;
2.名次在前三名;
3.每门功课及格以上。
二、总体设计
(1)程序设计组成框图:
(2)程序设计流程图:
5
4
3
2
1
三、详细设计
1)初始化结构体数组:
初始化学生的学号、姓名,数学、英语、计算机三科的成绩,暂定学生的排名、总分、平均分为0。
2)建立文本文件:
可用函数voidwenjian1()和voidwenjian2()来实现,将系统查询的结果全部写入文本文件中。
3)求总分和平均分:
可用函数voidmodify(structStudentstu[N])来实现,将计算的结果赋给结构体数组中的学生的总分和平均分。
4)按平均分排名:
先调用函数voidmodify(structStudentstu[N]),再用函数voidrank(structStudentstu[N])来实现,将计算的结果赋给结构体数组中的学生的排名。
调用函数voidprint(structStudentstu[N])按表格形式输出学生所有信息,调用函数voidwenjian1()将其写入文本文件。
5)统计各个分数段的人数:
在第(4)步基础上用函数voidgrade(structStudentstu[N])来实现,将统计的结果输出并调用函数voidwenjian2()写入文本文件中。
6)查找学生的信息:
在第(4)步基础上用函数voidsearch(structStudentstu[N])来实现,用switch语句读入用户的选择,若读入1,则按学号查找;若读入2,则按姓名查找。
调用函数voidwenjian2()将查找结果写入文本文件。
7)查找不及格科目及学生:
在第(4)步基础上用函数voidinsert(structStudentstu[N])来实现,依次输出数学、英语、计算机不及格的学生姓名和该科不及格成绩并调用函数voidwenjian2()写入文本文件中。
8)查找优等生:
在第(4)步基础上用函数voidexcellent(structStudentstu[N])来实现,找出同时满足优等生三个条件的学生即为优等生,输出他们的所有信息并调用函数voidwenjian2()写入文本文件。
9)系统的欢迎界面:
可用函数voidsystem(structStudentstu[N])来实现。
10)菜单选择:
可用函数voidmenu(structStudentstu[N])来实现,一共有5个功能,用switch语句读入用户的选择。
四、调试与测试
1)文件模块
问题:
这个系统总共有5个功能,也就是有5个结果,可是运行完了之后发现后一次的结果会覆盖前一次的结果,打开文本文件查看的时候发现里面的内容混乱。
解决办法:
设置两个子函数,一个是读入第一个结果的子函数voidwenjian1(),文件类型设置为“wb”型,另一个是读入后四个结果的子函数voidwenjian2(),文件类型设置为“ab+”型,实现为刚刚建立的文本文件续写的功能。
这样在下面的程序中只需要调用自己需要的子函数就可以将结果正确无误的保存到文本文件中。
2)排名模块
问题:
可用voidrank(structStudentstu[N])来实现。
可是在设计“若平均分相同则并列名次”这个算法的时候遇到了困难,试验了好几次都不成功。
解决办法:
1、最开始只是简单的以为用选择法对结构体里每名学生的平均分stu[i].aver从大到小排好序,然后再从一到十的赋给排名stu[i].rank就行,后来发现这解决不了名次并列的问题。
于是想到了用for循环将结构体里学生的成绩stu[i].aver与已排好名的数组average[m]从大到小一个一个比较,若遇到几个学生的分数与average[k]相同,则给stu[i].rank赋相同的值。
2、可是再次调试的时候问题又来了,因为当初排名的时候数组里average[m]也有相同的值,结果导致给stu[i].rank赋值出现了重复,后一次的排名会覆盖上一次的排名。
于是,我又想了一个办法,那就是在用选择法对average[m]进行排名的时候,若遇到几个值相同的元素,则只保留一个元素,这样在给stu[i].rank赋值的时候就不会出现重复了。
于是这个问题顺利解决。
五、源程序清单和执行结果
(1)源程序清单如下:
/*******************头文件*******************/
#include
#include
/*******************宏定义********************/
#defineN10
/****************全局指针变量*******************/
FILE*fp;
/***************定义结构体数组****************/
structStudent
{
intranking;
intnum;
charname[20];
floatscore[3];
floataver;
floattotal;
};
/**************初始化结构体数组****************/
structStudentstu[N]={{0,1001,"YangShengqian",{99,80,85},0,0},{0,1002,"XiangJing",{80,90,78},0,0},{0,1003,"WangMinghui",{60,70,59},0,0},
{0,1004,"DongQiang",{91,90,90},0,0},{0,1005,"ZhengKai",{85,76,90},0,0},{0,1006,"HeYunling",{90,91,90},0,0},{0,1007,"WangYao",{69,47,67},0,0},
{0,1008,"GouHuan",{45,76,56},0,0},{0,1009,"MaYuling",{89,78,67},0,0},{0,1010,"RanDongdu",{100,100,98},0,0}};
/*************子函数功能:
建立文本文件*********/
voidwenjian1()
{
if((fp=fopen("xscjglxt.txt","wb"))==NULL)/*****用“wb”建立一个二进制文件******/
{
printf("cannotopenfile\n");
return;
}
}
/*************子函数功能:
续写文本文件**********/
voidwenjian2()
{
if((fp=fopen("xscjglxt.txt","ab+"))==NULL)
/*****用“ab+”为刚刚建立的文件实现续写*******/
{
printf("cannotopenfile\n");
return;
}
}
/************子函数功能:
求总分和平均分**********/
voidmodify(structStudentstu[N])
{
inti;
for(i=0;i{
stu[i].total=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
/*******求总分********/
stu[i].aver=stu[i].total/3.0;/******求平均分*******/
}
}
/************子函数功能:
根据平均分排名***********/
voidrank(structStudentstu[N])
{
inti,j,k,m,n;
floataverage[N],t;
modify(stu);/******调用子函数modify()******/
for(i=0;iaverage[i]=stu[i].aver;
for(i=0;i{
k=i;
for(j=i+1;j{
if(average[j]==average[k])
average[k]=0;
if(average[j]>average[k])
k=j;
}
t=average[k];
average[k]=average[i];
average[i]=t;
}
for(m=0,n=1;mfor(i=0;iif(stu[i].aver==average[m])
stu[i].ranking=n;
}
/*********子函数功能:
统计各个分数段人数*************/
voidgrade(structStudentstu[N])
{
intA,B,C,D,E,i;
wenjian2();/*****打开文件*****/
A=B=C=D=E=0;
for(i=0;i{
if(stu[i].aver<60)/*****平均分低于60的人数******/
E++;
if(stu[i].aver>=60&&stu[i].aver<=69)/***平均分在60——69之间的人数***/
D++;
if(stu[i].aver>=70&&stu[i].aver<=79)/***平均分在70——79之间的人数***/
C++;
if(stu[i].aver>=80&&stu[i].aver<=89)/***平均分在80——89之间的人数***/
B++;
if(stu[i].aver>=90)/****平均分大于89的人数***/
A++;
}
printf(">90\t80-89\t70-79\t60-69\t<60\n");/****输出各分数段人数****/
fprintf(fp,"\r\n>90\t80-89\t70-79\t60-69\t<60\r\n");
/***在文件中输出各分数段人数***/
printf("%d\t%d\t%d\t%d\t%d\n",E,D,C,B,A);
fprintf(fp,"%d\t%d\t%d\t%d\t%d\r\n",E,D,C,B,A);
fclose(fp);/*********关闭文件*********/
}
/*******子函数功能:
用姓名或者学号查找学生信息*********/
voidsearch(structStudentstu[N])
{
intnum1,i,n;
charname1[20];
wenjian2();/******************打开文件*********************/
/********说明若是按学号查找,则输入1;若是按姓名查找,则输入2***********/
printf("ifyouwanttosearchbynumber,pleaseinput1.\nifyouwanttosearchbyname,pleaseinput2.\n\n");
printf("pleaseinputyourchoice:
");/*****提示用户输入自己的选择***/
scanf("%d",&n);/***********读入用户的选择*************/
printf("\n");
switch(n)
{
/********************用学号查找**********************/
case1:
printf("pleaseinputthenumber:
");
scanf("%d",&num1);
printf("\n");
for(i=0;i{
if(stu[i].num==num1)
{
printf("Rank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\n");
fprintf(fp,"\r\nRank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\r\n");
printf("%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\n",
stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver);
fprintf(fp,"%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\r\n",
stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver);
}
}
if(num1<1001||num1>1010)/********************如果用户输入不正确则提示出错********************/
printf("ERROR!
\n");
break;
/*******************用姓名查找********************/
case2:
printf("pleaseinputthename:
");
gets(name1);
gets(name1);
printf("\n");
for(i=0;i{
if(strcmp(stu[i].name,name1)==0)
{
printf("Rank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\n");
fprintf(fp,"\r\nRank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\r\n");
printf("%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\n",
stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver);
fprintf(fp,"%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\r\n",
stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].aver);
}
if(strcmp(stu[i].name,name1)==0)
break;
}
if(i==N&&strcmp(stu[i].name,name1)!
=0)
/*********如果用户输入不正确则提示出错********/
printf("ERROR!
");
break;
default:
printf("ERROR!
\n");/****如果用户输入选择键错误则提示出错***/
}
fclose(fp);/*****************关闭文件*******************/
}
/*****子函数功能:
输出不及格科目和学生及其不及格分数*****/
voidinsert(structStudentstu[N])
{
inti,j=0;
wenjian2();/*******************打开文件***********************/
printf("Math:
");
fprintf(fp,"\r\nMath:
");/******查找数学不及格的学生********/
for(i=0;iif(stu[i].score[0]<60)
{
printf("\t\t%s\t%5.2f\t",stu[i].name,stu[i].score[0]);
fprintf(fp,"\t\t%s\t%5.2f\t",stu[i].name,stu[i].score[0]);
}
printf("\nEnglish:
");/******查找英语不及格的学生*******/
fprintf(fp,"\r\nEnglish:
");
for(i=0;iif(stu[i].score[1]<60)
{
printf("\t%s\t%5.2f\t",stu[i].name,stu[i].score[1]);
fprintf(fp,"\t%s\t%5.2f\r",stu[i].name,stu[i].score[1]);
}
printf("\nComputer:
");/*****查找计算机不及格的学生******/
fprintf(fp,"\r\nComputer:
");
for(i=0;iif(stu[i].score[2]<60)
{
printf("\t%s\t%5.2f\n\t",stu[i].name,stu[i].score[2]);
fprintf(fp,"\t%s\t%5.2f\t",stu[i].name,stu[i].score[2]);
}
printf("\n");
fclose(fp);/**************关闭文件***************/
}
/************************输出优等生的信息**************************/
voidexcellent(structStudentstu[N])
{
inti,j,k,t,m,a,b,c;
j=k=t=m=a=b=c=0;
wenjian2();/*****************打开文件********************/
modify(stu);
rank(stu);
printf("Rank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\n");
fprintf(fp,"\r\n");
fprintf(fp,"\r\nRank\tNumber\tName\t\tMath\tEnglish\tComputer\tTotal\tAverage\r\n");
for(i=0;i{
if(stu[i].aver>90)
j=1;
if(stu[i].aver>85&&(stu[i].score[0]==100||stu[i].score[1]==100||stu[i].score[2]==100))
k=1;
if((stu[i].score[0]>95&&stu[i].score[1]>95)||(stu[i].score[0]>95&&stu[i].score[2]>95)||(stu[i].score[1]>95&&stu[i].score[2]>95))
t=1;
if(stu[i].aver>85&&t)
m=1;
if(j||k||m)/****优等生平均成绩大于90分;或平均分大于85分且至少有一门功课为100分;或平均分大于85分且至少两门课程成绩为95分以上****/
a=1;
if(stu[i].ranking<=3)
b=1;
if(stu[i].score[0]>60&&stu[i].score[1]>60&&stu[i].score[2]>60)
c=1;
if(a&&b&&c)/****************必须同时满足三个条件*****************/
{
printf("%-4d\t%-5d\t%s\t%5.2f\t%5.2f\t%5.2f\t%14.2f\t%5.2f\n",
stu[i].ranking,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].total,stu[i].ave