對題目的需求分析得出:管理系統對學生的成績信息進行管理,學生信息包括:學號、姓名、學期、每門課程的成績、平均成績、名次。實現:學生信息的錄入;修改;刪除和查詢,按學期、學號、姓名等查詢。
而對輸入的學生成績正確的計算了平均分、最高分、最低分、統計了不及格情況及各分數段的人數。並按要求的格式正確打印.
功能函數設計
這個程序比較煩瑣,要求計算平均分,還要算最高分、最低分、統計不及格人數和按不同科目的分數順序輸出,如果每壹個都寫壹個函數,程序會非常的大,同時效率也不是很高。在此用的應該是壹種比較好的方法,此處用到了以下幾個函數:
輸入函數:
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 <stdio.h>
#include <malloc.h>
#include <string.h>
#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<N;i++,p++)
{
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<N;i++,s++)
printf("%s %s %.1f %.1f %.1f %.1f\n", s->num,s->name,s->math,s->english,s->comput,s->average);
}
void den(mark *p,mark *q,int *m)/*該函數的功能是將第壹個的記錄賦給第二個*/
{
int i; /*m中存放學生的位序號(按成績排序)*/
for(i=0;i<N;i++)
{ strcpy((q+i)->num,(p+*(m+i))->num);
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<N;i++,p++)
{ p->n=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<N;j++)
{ temp=*((q+j)->fen+i); x=j;/*初始化中間變量*/
for(k=j+1;k<N;k++)
if( *((q+k)->fen+i)<temp )
{ x=k; temp=*((q+k)->fen+i);}
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<N;i++)
{ ave[0]+=(s+i)->math;
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<N;i++)
if(strcmp(a,(s+i)->num)==0 || strcmp(a,(s+i)->name)==0 )
{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();
}