写一个程序,满足下列要求:
a.外部定义一个name结构模板,它含有两个成员:一个字符串用于存放名字,另一个字符串用于存放姓氏。
b.外部定义一个student结构模板,它含有3个成员:一个name结构,一个存放3个整数分数的grade数组,以及一个存放这3个分数的平均分的变量。
c.使main()函数声明一个具有CSIZE(CSIZE=3)个student结构的数组,使函数来执行d、e、f以及g部分所描述的任务。
d.请求用户输入学生姓名和分数,以交互地获取每个学生的成绩。将分数放到相应结构的grade数组成员中。您可以自主选择在main()或一个函数中实现这个循环。
e.为每个结构计算平均分,并把这个值赋给合适的成员。
f.输出每个结构中的信息。
g.输出结构的每个数值成员的班级平均分。
h.按平均分由大到小的顺序输出。
#include "stdio.h"
#define CSIZE 3
struct name {
char firstname[15];
char lastname[15];
};
//定义名字结构
struct student {
int num;
struct name n;
int grade[3];
float ave;
};
//定义学生信息结构
void sort(struct student stu[CSIZE],
struct student *pt[CSIZE],
int n);
//排序并输出
int main(void)
{
int i,j;
float sum;
struct student stu[CSIZE],*pt[CSIZE];
int sum1,sum2,sum3;
float ave1,ave2,ave3,sum_ave,ave_ave;
sum1=sum2=sum3=0;
sum_ave=0.0;
for(i=0;i<CSIZE;i++)
{
stu[i].num=i+1;
puts("Enter the first name: ");
scanf("%s",stu[i].n.firstname);
fflush(stdin);
puts("Enter the last name: ");
scanf("%s",stu[i].n.lastname);
fflush(stdin);
puts("Now enter the three grades: ");
for(sum=0,j=0;j<3;j++)
{
scanf("%d",&stu[i].grade[j]);
sum+=stu[i].grade[j];
}
stu[i].ave=sum/3;
//计算每个学生的平均分,任务e
sum1+=stu[i].grade[0];
sum2+=stu[i].grade[1];
sum3+=stu[i].grade[2];
sum_ave+=stu[i].ave;
if(i+1==CSIZE)continue;
//消除最后一个"Next student."
puts("Next student.");
}
//接受输入的学生成绩
ave1=(float)sum1/CSIZE;
ave2=(float)sum2/CSIZE;
ave3=(float)sum3/CSIZE;
ave_ave=sum_ave/CSIZE;
//计算班级平均分
puts("\nStudents' information:");
for(i=0;i<CSIZE;i++)
printf("%2d %-8s %-8s %-4d %-4d %-4d %-4.1f\n",
stu[i].num,stu[i].n.firstname,stu[i].n.lastname,
stu[i].grade[0],stu[i].grade[1],stu[i].grade[2],
stu[i].ave);
printf("Class Average: %-4.1f %-4.1f %-4.1f %-4.1f\n",
ave1,ave2,ave3,ave_ave);
//输出学生信息
puts("\nStudents' information sorted in order of average point:");
sort(stu,pt,CSIZE);
//输出处理过的学生信息
return 0;
}
void sort(struct student stu[CSIZE],
struct student *pt[CSIZE],
int n)
{
int i,j;
struct student *temp;
for(i=0;i<n;i++)
pt[i]=&stu[i];
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(pt[i]->ave<pt[j]->ave)
{
temp=pt[i];
pt[i]=pt[j];
pt[j]=temp;
}
}
//按平均分由大到小的顺序排序
for(i=0;i<n;i++)
printf("%2d %-8s %-8s %-4d %-4d %-4d %-4.1f\n",
i+1,pt[i]->n.firstname,pt[i]->n.lastname,
pt[i]->grade[0],pt[i]->grade[1],pt[i]->grade[2],
pt[i]->ave);
}
运行结果示例:
这是个功能很简单的程序,但是展示了基本的学生成绩管理系统的框架。一个不足之处是每次运行程序都要重新输入学生信息,因为没有文件存储的功能。鉴于来这里的兄弟新手比较多,加之本人是比较懒的那种,那也就算了。希望兄弟们多多指教。有疑问可以提,这里的高手也是很多的
[此贴子已经被作者于2007-7-30 17:50:34编辑过]