功能:(1)查询成绩;(2)打印优秀人员(排名前20%,且没有不及格科目);(3)打印挂科人员
#include <stdio.h>
#include <string.h>
#define N 4
struct Stu
{
char name[10];
char sex;
char num[10];
float score[3];
float ave;
};
int in(struct Stu *p);
int average(struct Stu *p);
int rank(struct Stu *p);
int search(struct Stu *p);
int success(struct Stu *p);
int notpass(struct Stu *p);
int display(struct Stu *p);
int main(void)
{
struct Stu a[N];
int t,i;//t用来选择功能
// 输入信息并求出平均值
for (i=0; i<N; i++)
{
in(&a[i]);
average(&a[i]);
}
rank(a);
display(a);
while (1)
{
printf("search1,success2,notpass3,break0.\n");
scanf("%d",&t);
// 输入0跳出
if (t == 0)
{
break;
}
// 输入1学号查找
else if (t == 1)
{
search(a);
}
// 录取人员
else if (t == 2)
{
success(a);
}
// 输入3打出不及格信息
else if (t == 3)
{
notpass(a);
}
}
return 0;
}
//输入信息函数
int in(struct Stu *p)
{
int i;
printf("Input name.");
scanf("%s",p->name);
getchar();//接收错误输入
printf("Input sex.");
scanf("%c",&p->sex);
getchar();
printf("Input num.");
scanf("%s",p->num);
getchar();
for (i=0; i<3; i++)
{
printf("Input score%d.",i+1);
scanf("%f",&p->score[i]);
}
return 0;
}
//平均值函数
int average(struct Stu *p)
{
int i;
p->ave = 0;
for (i=0; i<3; i++)
{
p->ave += p->score[i];
}
p->ave /= 3;
return 0;
}
//平均分排序函数
int rank(struct Stu *p)
{
int i,j;
struct Stu temp;
for (i=0; i<N-1; i++)
{
for (j=0; j<N-i-1; j++)
{
if (p[j].ave < p[j+1].ave)
{
temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
}
}
}
return 0;
}
//学号查找函数
int search(struct Stu *p)
{
int i,t=0;
char b[10];
printf("Input the number.");
scanf("%s",b);
for (i=0; i<N; i++)
{
if (strcmp(b, p[i].num)==0)
{
printf("name sex num score1 score2 score3 average\n");
printf("--------------------------------------------------------------\n");
printf("%-11s%-8c%-6s%8.1f%9.1f%9.1f%9.1f\n"\
,p[i].name,p[i].sex,p[i].num,p[i].score[0],p[i].score[1],p[i].score[2],p[i].ave);
break;
}
else
t++;
}
if (t == N)
{
printf("NULL.\n");
}
return 0;
}
//显示录取前20%人员信息(有不及格则不过)
int success(struct Stu *p)
{
int i,j,n;//n为录取人数
n = N/2;
printf("name sex num score1 score2 score3 average\n");
printf("--------------------------------------------------------------\n");
for (i=0; i<n; i++)
{
for (j=0; j<3; j++)
{
if (p[i].score[i]<60)
{
break;
}
}
if (j == 3)
{
printf("%-11s%-8c%-6s%8.1f%9.1f%9.1f%9.1f\n"\
,p[i].name,p[i].sex,p[i].num,p[i].score[0],p[i].score[1],p[i].score[2],p[i].ave);
}
}
return 0;
}
//显示所有不及格信息
int notpass(struct Stu *p)
{
int i,j,t,n=0;//t为不及格科目数,n为不及格人数
for (i=0; i<N; i++)
{
t = 0;
for (j=0; j<3; j++)
{
if (p[i].score[j]<60)//判断是否及格
{
if (n == 0 && t == 0)//仅在第一个人处打表
{
printf("name sex num score1 score2 score3 average\n");
printf("--------------------------------------------------------------\n");
}
printf("%-11s%-8c%-6s%8.1f%9.1f%9.1f%9.1f\n"\
,p[i].name,p[i].sex,p[i].num,p[i].score[0],p[i].score[1],p[i].score[2],p[i].ave);
t++;
break;
}
}
if (t!=0)
{
n++;
}
}
if (n == 0)
{
printf("All pass!\n");
}
return 0;
}
//显示函数
int display(struct Stu *p)
{
int i;
printf("name sex num score1 score2 score3 average\n");
printf("--------------------------------------------------------------\n");
for (i = 0; i < N; i++,p++)
{
printf("%-11s%-8c%-6s%8.1f%9.1f%9.1f%9.1f\n",p->name,p->sex,p->num,p->score[0],p->score[1],p->score[2],p->ave);
}
return 0;
}