修改程序,求改错!!!
编程实现录入成绩并统计个人平均分后存入文件studengdata.txt,程序每次运行均从文件中提取数据存入内存结构体数组中(指定文件不存在则新建)。某班30个学生,4门课分别为微积分、通信原理、英语和C语言,按学号从小到大的顺序依次输入学生的姓名、性别(用’m’表示男,’f’表示女)和4门课的成绩(一次最大录入人数为30-studengdata.txt内记录数,录入已经存在的学生信息时提示“覆盖”或“放弃”,以学号为-1结束录入),计算每个学生的平均分,并以清晰的打印格式按平均分从高分到低分的顺序打印平均分高于全班总平均成绩且单科没有挂科的男生成绩单(打印信息含学号、姓名、性别、总排名、平均分、4门课单科分)(平均分相同则按姓名升序打印)。
我编的程序,还差些内容,求大神帮忙修改一下。。
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<math.h>
#define N 30 //学生数
struct student //定义学生结构体
{
char number[N]; //学号
char name[N]; //姓名
char sex; //性别,‘m’(男)或‘f’(女)
float score[4]; //各科成绩
float aver; //平均成绩
}stu[N];
//自定义函数原型声明
void input(struct student *p,int n);
void save();
void read();
float average(struct student *p,int n);
void output(struct student *p,int n);
void sort(struct student *p,int n);
void search(struct student *p,int n,float t);
void main()
{
struct student stu[N];
float t_aver; //总平均成绩
input(stu,N); //输入学生信息及成绩,计算每人平均成绩
sort(stu,N); //按平均成绩排序
t_aver=average(stu,N);//计算总平均成绩
output(stu,N,t_aver);//输出平均分高于全班总平均成绩且单科没有挂科的男生信息
return;
}
//输入学生信息及成绩,计算每人平均成绩
void input(struct student *p,int n)
{
int i,j;
float per_aver;
float temp;
for(i=0;i<n;i++,p++)//循环一次,录入一个学生信息
{
printf("\t%d\n",i+1);//录入次数
printf("please input student's name:\n");
fflush(stdin); //清空缓冲区
gets(p->name); //录入学生姓名
printf("please input student's number:\n");
gets(p->number); //录入学生学号
printf("please input student's sex:\n");
fflush(stdin); //清空缓冲区
scanf("%c",&p->sex); //录入学生性别
printf("please input student's math score:\n");
scanf("%lf",&p->score[0]);
printf("please input student's communication score:\n");
scanf("%lf",&p->score[1]);
printf("please input student's english score:\n");
scanf("%lf",&p->score[2]);
printf("please input student's c_word score:\n");
scanf("%lf",&p->score[3]);
p->aver=(p->score[0]+p->score[1]+p->score[2]+p->score[3])/4;
}
}
//按平均分排序成绩
void sort(struct student *p,int n)
{
struct student temp; //中间变量,用于交换
int i,j;
for(i=1;i<n-1;i++)
{
for(j=1;j<=n-1-i;j++)
{
if((*(p+i)).aver<(*(p+i+1)).aver)
{
temp=*(p+i);
*(p+i)=*(p+i+1);
*(p+i+1)=temp;
}
else if((*(p+i)).aver==(*(p+i-1)).aver)
{
if(strcmp((*(p+j)).name,(*(p+j+1)).name)>0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
}
return *p;
}
float average(struct student *p,int n)
{
float sum=0;
int i;
for(i=0;i<n;i++)
{
sum+=p[i].aver; //累加平均成绩
}
return (sum/n); //计算并返回总平均成绩
}
void output(struct student *p,int n,float t_aver)
{
int i,j;
printf("boy whose average is bigger than total average and every subject doesn't fail\n");//输出提示信息
printf("name number sex math communication english c_word average\n");
for(i=0;i<n;i++) //查找符合条件的学生并输出其信息
{
if(p[i].sex=='m')
{
if(p[i].aver>t_aver)
{
if((p[i].score[0]>60&&p[i].score[1]>60&&p[i].score[1]>60&&p[i].score[2]>60&&p[i].score[3]>60)==1)
printf("%-8s%-8s%-8c%8.2f%8.2f%8.2f%8.2f%8.2f\n",p[i].name,p[i].number,p[i].sex,p[i].score[0],p[i].score[1],p[i].score[2],p[i].score[3],p[i].aver);
}
}
}
}
void save() //保存到文件
{
FILE *fp;
int i;
if((fp=fopen("studengdata.txt","wt"))==NULL)
{
printf("cannot open file\n");
return;
}
for(i=0;i<N;i++)
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
void read()//实现从文件studengdata.txt读出数据
{
FILE *fp;
int i;
if((fp=fopen("studengdata.txt","rt"))==NULL)
{
printf("cannot open file\n");
return;
}
for(i=0;i<N;i++)
if(fread(&stu[i],sizeof(struct student),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}