程序设计的基本目标是用算法对问题的原始数据进行处理,从而获得所期望的效果。但这仅仅是程序设计的基本要求。要全面提高程序的质量,提高编程效率,使程序具有良好的可读性、可靠性、可维护性以及良好的结构,编制出好的程序来,应当是每位程序设计工作者追求的目标。而要做到这一点,就必须掌握正确的程序设计方法和技术。而C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。所以采用结构化程序设计方法,对管理系统进行自顶向下,逐步细化,模块化设计.
对题目的需求分析得出:管理系统对学生的成绩信息进行管理,学生信息包括:学号、姓名、学期、每门课程的成绩、平均成绩、名次。实现:学生信息的录入;修改;删除和查询,按学期、学号、姓名等查询。
而对输入的学生成绩正确的计算了平均分、最高分、最低分、统计了不及格情况及各分数段的人数。并按要求的格式正确打印.
【功能函数设计】
这个程序比较烦琐,要求计算平均分,还要算最高分、最低分、统计不及格人数和按不同科目的分数顺序输出,如果每一个都写一个函数,程序会非常的大,同时效率也不是很高。在此用的应该是一种比较好的方法,此处用到了以下几个函数:
输入函数:
void input (mark *s)/*数据输入函数*/
输出函数:
void print (mark *p)/*输出学生的记录的函数*/
void den(mark *p,mark *q,int *m)/*该函数的功能是将第一个的记录赋给第二个*/
此函数是为后面的sign函数的调用,把一个人的信息存在一个链表中,
void converse (mark *s,fsp *q)/*将学生的记录转放到中间变量q中*/
此函数实现的功能是把数学,英语,计算机的个作为一个链表存储在一起,为后面的过程更简便。
void sign(mark *s,mark *a,mark *b,mark *c,mark *d,fsp *q)
此函数的功能是对学生的各科成绩及平均分进行排序。
void count(mark *s) /*统计各科平均分 各科的最高(低)分及各分数段的人数*/
void found(mark *s)/*输入学生的学号查询学生的成绩情况*/
(1) 程序清单
#include
#include
#include
#define N 7 /*学生的人数*/
typedef struct
{
char num[5];
char name[10]; /*记录姓名和学号*/
float math,english,comput,average; /*各个科目及平均分*/
}mark; /*定义学生记录结构体类型*/
typedef struct
{
float fen[4];
int n;
}fsp;/*定义学生记录转化的中间变量*/
void input (mark *s)/*数据输入函数*/
{
int i;
mark *p;
printf("请输入每个学生的记录\n");
for(i=0,p=s;i
scanf("%s%s%f%f%f",p->num,p->name,&p->math,&p->english,&p->comput);
p->average=(p->math+p->english+p->comput)/3;
}
}
void print (mark *p)/*输出学生的记录的函数*/
{
int i;
mark *s;
for(i=0,s=p;i
}
void den(mark *p,mark *q,int *m)/*该函数的功能是将第一个的记录赋给第二个*/
{
int i; /*m中存放学生的位序号(按成绩排序)*/
for(i=0;i
strcpy((q+i)->name,(p+*(m+i))->name);
(q+i)->math=(p+*(m+i))->math;
(q+i)->english=(p+*(m+i))->english;
(q+i)->comput=(p+*(m+i))->comput;
(q+i)->average=(p+*(m+i))->average;
}
}
void converse (mark *s,fsp *q)/*将学生的记录转放到中间变量q中*/
{
fsp *p;
int i;
for(i=0,p=q;i
*(p->fen)=(s+i)->math;
*(p->fen+1)=(s+i)->english;
*(p->fen+2)=(s+i)->comput;
*(p->fen+3)=(s+i)->average;
}
}
void sign(mark *s,mark *a,mark *b,mark *c,mark *d,fsp *q)
{ /*对学生的各科成绩及平均分进行排序*/
int t[N],i,j,k,x,n;/*t中存放学生的位序号(按成绩排序)*/
float temp;/*排序过程中的中间变量 */
for(i=0;i<4;i++)/*i的不同指向不同的科目及平均成绩 */
{ for(j=0;j
for(k=j+1;k
if(x!=j)
{ temp=*((q+j)->fen+i);
*((q+j)->fen+i)=*((q+x)->fen+i);
*((q+x)->fen+i)=temp;
n=(q+j)->n; (q+j)->n=(q+x)->n; (q+x)->n=n;
}/*交换两变量 */
t[j]=(q+j)->n;
}
switch(i)
{ case 0: den(s,a,t);break;
case 1: den(s,b,t);break;
case 2: den(s,c,t);break;
case 3: den(s,d,t);break;
}
}
}
void count(mark *s)/*统计各科平均分 各科的最高(低)分及各分数段的人数*/
{
float ave[3]={0};/*存放各科平均分 */
float m[3][2] ;
int num[3][5]={0};/*存放各分数段的人数*/
int i;
m[0][1]=m[0][0]=s->math;
m[1][0]=m[1][1]=s->english;
m[2][0]=m[2][1]=s->comput;
for(i=0;i
ave[1]+=(s+i)->english;
ave[2]+=(s+i)->comput;
if( (s+i)->math > m[0][0] )
m[0][0]=(s+i)->math;
else if( (s+i)->math < m[0][1] )
m[0][1]=(s+i)->math;
if( (s+i)->english > m[1][0] )
m[1][0]=(s+i)->english;
else if( (s+i)->english < m[1][1] )
m[1][1]=(s+i)->english;
if( (s+i)->comput > m[2][0] )
m[2][0]=(s+i)->comput;
else if( (s+i)->comput < m[2][1] )
m[2][1]=(s+i)->comput;
/*统计各科的最高(低)分*/
if((s+i)->math<60.0)
num[0][0]++;
else if((s+i)->math<70.0)
num[0][1]++;
else if((s+i)->math<80.0)
num[0][2]++;
else if((s+i)->math<90.0)
num[0][3]++;
else num[0][4]++;
/*统计数学各分数段的人数*/
if((s+i)->english<60.0)
num[1][0]++;
else if((s+i)->english<70.0)
num[1][1]++;
else if((s+i)->english<80.0)
num[1][2]++;
else if((s+i)->english<90.0)
num[1][3]++;
else num[1][4]++;
/*统计英语各分数段的人数*/
if((s+i)->comput<60.0)
num[2][0]++;
else if((s+i)->comput<70.0)
num[2][1]++;
else if((s+i)->comput<80.0)
num[2][2]++;
else if((s+i)->comput<90.0)
num[2][3]++;
else num[2][4]++;
/*统计计算机各分数段的人数 */
}
for(i=0;i<3;i++)
ave[i]=ave[i]/N;
printf("三门科的平均分分别为:\n%.1f %.1f %.1f\n",ave[0],ave[1],ave[2]);
printf("三门科的最高分与最底分分别为:\n");
printf("%.1f %.1f\n%.1f %.1f\n%.1f %.1f\n",
m[0][0],m[0][1],m[1][0],m[1][1],m[2][0],m[2][1]);
printf("三门科不及格 60-69 70-79 80-89 90分以上的人数分别为:\n");
printf("数学: %3d%5d%6d%6d%4d\n",num[0][0],num[0][1],num[0][2],num[0][3],num[0][4]);
printf("英语: %3d%5d%6d%6d%4d\n",num[1][0],num[1][1],num[1][2],num[1][3],num[1][4]);
printf("计算机:%3d%5d%6d%6d%4d\n",num[2][0],num[2][1],num[2][2],num[2][3],num[2][4]);
}
void found(mark *s)/*输入学生的学号查询学生的成绩情况*/
{
char a[10];/*接受输入的学号*/
int flag,i;/*循环变量*/
char * b="exit";
do
{ flag=0;
printf("请输入所要查询的学生的学号或姓名\n");
getchar();
gets(a);
for(i=0;i
{printf("该生的学号,姓名,各门课程及平均成绩为:\n%s %s %.1f %.1f %.1f %.1f\n"
,(s+i)->num,(s+i)->name,(s+i)->math,(s+i)->english,(s+i)->comput,(s+i)->average);/*成绩打印*/
flag=1;}
if(flag==0) printf("查无此人\n");
}while(strcmp(a,b));
printf("查询结束");
}
main()
{
mark *s,*a,*b,*c,*d;
fsp *p;
s=(mark*)malloc(N*sizeof(mark));
a=(mark*)malloc(N*sizeof(mark));
b=(mark*)malloc(N*sizeof(mark));
c=(mark*)malloc(N*sizeof(mark));
d=(mark*)malloc(N*sizeof(mark));
p=(fsp*)malloc(N*sizeof(fsp));/*各变量空间开辟 */
input(s);
printf("初始化学生的记录为:\n");
print(s);
converse(s,p);
sign(s,a,b,c,d,p);
printf("按数学成绩排序学生的记录为:\n");
print(a);
printf("按英语成绩排序学生的记录为:\n");
print(b);
printf("按计算机成绩排序学生的记录为:\n");
print(c);
printf("按平均成绩排序学生的记录为:\n");
print(d);
count(s);
found(s);
getch();
}