C语言结构体综合作业 跪求源代码 [email protected]

C语言综合训练程序设计要求
已知在磁盘上有一个文本文件(stuin.txt),此文件存放了一组学生的成绩信息,按照如下格式存放:
1001 stuname1 89
1002 stuname2 78
1003 stuname3 60
......
1100 stuname100 87
请按照如下要求编写程序:
a. 定义一个结构体类型数组,结构体类型含有学号、姓名和成绩三个域;
b. 将文本文件的内容读入到结构体数组中;
c. 显示成绩最高的人的学号、姓名和成绩(如果有相同的人要全部显示);
d. 显示平均成绩、高于、低于和等于平均成绩的人数;
e. 显示成绩为优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)的人数和所占百分比;
f. 将以上显示的信息存放到stuout.txt文件中;

#include<stdio.h>

struct student //结构体 定义
{
int num;//学号
char name[20];//姓名
int score;//分数

}stu[100];

int main()
{
float sum_grade = 0,sum=0;//所有人成绩之和

int i , num, grade, max = 0, above = 0, below = 0,equal = 0;

char name[10];//姓名

int a = 0,//90~100人数
b = 0,// 80~89人数
c = 0,// 70~79人数
d = 0,//60~69人数
e = 0;// 0~59人数
FILE *fp,*fq;

fp=fopen("E:\\1111\\stuin.dat","r");// 使用指针打开文件 stuin.txt
fq=fopen("E:\\1111\\stuout.txt","w");// 使用指针打开文件 stuout.txt

for(i=0;i<100;i++)
{
fscanf(fp,"%d%s%d",&stu[i].num,&stu[i].name,&stu[i].score);

switch(stu[i].score/10)//统计不同分数的人数 ,观察那人分数的十位部分
{
case 6: ++d;break;//60~69
case 7: ++c;break;// 70~79
case 8: ++b;break;// 80~89
case 9: ++a;break;//90~100
case 10: ++a;break;//90~100
default: ++e;break;// 0~59 其它皆为不及格
}

sum=sum+stu[i].score;
}
sum_grade =sum/100;//平均成绩

for(i = 0;i <100;i++)
{
if(stu[i].score > sum_grade)
++above;
else if(stu[i].score < sum_grade)
++below;
else
++equal;

if(stu[i].score > max)//顺便查找最大成绩者
max = stu[i].score;
}

printf("最高成绩者:\n");
for(i = 0;i <100;i++)//找最大成绩者
{
{ if(stu[i].score == max)
{ printf("%d %s %d\n",stu[i].num,stu[i].name,stu[i].score);

fprintf(fq,"考得最好的学生是:%d %s %d;\n",stu[i].num,stu[i].name,stu[i].score);}}
}
printf("\n");
printf("平均分为:%f\n",sum_grade);
printf("过平均分人数:%d\n",above);
printf("未过平均分人数:%d\n",below);
printf("等于平均分人数:%d\n",equal);
printf("优秀:%d,%3.1f%%\n",a,(float)a/(float)100 * 100);
printf("良好:%d,%3.1f%%\n",b,(float)b/(float)100 * 100);
printf("中等:%d,%3.1f%%\n",c,(float)c/(float)100 * 100);
printf("及格:%d,%3.1f%%\n",d,(float)d/(float)100 * 100);
printf("不及格:%d,%3.1f%%\n",e,(float)e/(float)100 * 100);
fprintf(fq,"平均分为:%f;\n过平均分的人数:%d;\n等于平均分的人数:%d;\n未过平均分的人数%d个;\n优秀:%d,%f%%;\n良好:%d,%f%%;\n中等:%d,%f%%;\n及格:%d,%f%%;\n不及格:%d,%f%%;\n",sum_grade,above,below,equal,a,(float)a/(float)100 * 100,b,(float)b/(float)100 * 100,c,(float)c/(float)100 * 100,d,(float)d/(float)100 * 100,e,(float)e/(float)100 * 100);
fclose(fp);//关闭文件
fclose(fq);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-09
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct strStudent{ /*学生信息—结构体*/
char strName[20];
int stuID;
int scoreA;
int scoreB;
int scoreC;
int scoreTot;
float avrScore;
}coStudent;

int maximum (int x,int y);
float average (int nscore1,int nscore2,int nscore3);
void input (coStudent fast);
int main (void)
{
coStudent strstu[10];
int i,p;
i = 0;
while (i < 10)
{
i++; /*循环次数*/
input(strstu[i]);
if (i > 1)
p = maximum(strstu[i].scoreTot,strstu[i - 1].scoreTot);
}
printf(" NO name score1 score2 score3 total average\n");
for (i = 0;i < 10;i++)
printf("%10d %10s %6d %6d %6d %5d %5.2f\n",strstu[i].stuID,strstu[i].strName,strstu[i].scoreA,strstu[i].scoreB,strstu[i].scoreC,strstu[i].scoreTot,strstu[i].avrScore);
printf("Totle score %5d\n",p);
system("pause");
return 0;
}

int maximum (int x,int y) /*最大值*/
{
return x >= y ? x : y;
}
float average (int nscore1,int nscore2,int nscore3) /*平均成绩*/
{
return (nscore1 + nscore2 + nscore3) / 3;
}
void input (coStudent fast)
{
printf("Please input Student ID:");
scanf("%d",&fast.stuID);
printf("Please input Student's Name:");
scanf("%s",&fast.strName);
printf("Please input score of A:");
scanf("%d",&fast.scoreA);
printf("Please input score of B:");
scanf("%d",&fast.scoreB);
printf("Please input score of C:");
scanf("%d",&fast.scoreC);
printf("\n");
fast.scoreTot = fast.scoreA + fast.scoreB + fast.scoreC;
fast.avrScore = average(fast.scoreA,fast.scoreB,fast.scoreC);
}本回答被网友采纳
第2个回答  2011-05-31
等下 已发送
相似回答
大家正在搜