C语言:有5个学生,每个学生有3门课的成绩,从键盘输入学生数据,计算平均成绩

论坛 期权论坛 脚本     
匿名技术用户   2021-1-13 03:39   420   0

有5个学生,每个学生有3门课的成绩,从键盘输入学生数据(包括学生号、姓名、三门课成绩),计算平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”中

对于平均成绩的思路就是:把平均成绩当做结构体的一项

在输入3门课成绩以获得平均成绩时,要注意在c语言中,三门成绩要单独输入,不能和学号、姓名一起输入。如果这样输入,程序不会报错,但始终运行不出来。

struct student//定义结构体 
{
 int num;
 char name[10];
 int score[3];
 float ave;
 }stu[5];
int main(int argc, char *argv[]) {
 int i,j,sum,t;
 FILE *fp;
 struct student p,temp,re[6];
 for(i=0;i<5;i++)//结构体赋值 
 {
  printf("输入第%d条记录\n",i+1);
  scanf("%d,%s",&stu[i].num,stu[i].name);
  printf("请输入三门课成绩\n");
  scanf("%d,%d,%d",&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
  sum=0;
  sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
  stu[i].ave=sum/3.0;
 }
 if((fp=fopen("stud.txt","w"))==NULL)//写入文件 
 {
  printf("cannot open stud.txt\n");
  exit(0);
 }
 for(i=0;i<5;i++)
 fwrite(&stu[i],sizeof(struct student),1,fp);
 fclose(fp);
 if((fp=fopen("stud.txt","r"))==NULL)//读取文件 
 {
  printf("cannot open stud.txt\n");
  exit(0);
 }
 for(i=0;i<5;i++)
 {
  fread(&stu[i],sizeof(struct student),1,fp); 
        printf("%d,%s,%d,%d,%d,%6.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
 }
    fclose(fp);
    printf("\n");}

按照平均分进行排序

for(i=0;i<4;i++)//文件排序 
    for(j=i+1;j<5;j++)
    if(stu[i].ave>stu[j].ave)
    {
     temp=stu[i];
     stu[i]=stu[j];
     stu[j]=temp;
 }  
 if((fp=fopen("stu_sort.txt","w"))==NULL)
 {
  printf("cannot open stud.txt\n");
  exit(0);
 }
 for(i=0;i<5;i++)
  fwrite(&stu[i],sizeof(struct student),1,fp); 
    fclose(fp); 
 if((fp=fopen("stu_sort.txt","r"))==NULL)
 {
  printf("cannot open stud.txt\n");
  exit(0);
 }
  for(i=0;i<5;i++)
 {
  fread(&stu[i],sizeof(struct student),1,fp); 
        printf("%d,%s,%d,%d,%d,%6.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
 } 
    fclose(fp);

插入新的学生数据

printf("请输入插入学生数据:\n");
 scanf("%d,%s",&p.num,p.name);
 printf("请输入三门课成绩\n");
 scanf("%d,%d,%d",&p.score[0],&p.score[1],&p.score[2]);
 sum=0;
 sum=p.score[0]+p.score[1]+p.score[2];
 p.ave=sum/3.0;
 
 if((fp=fopen("stu_sort.txt","r"))==NULL)
 {
  printf("cannot open stud.txt\n");
  exit(0);
 }
 for(i=0;i<5;i++)
 {
  fread(&stu[i],sizeof(struct student),1,fp); 
   if(stu[i].ave>p.ave)
  {
   t=i;break;
  }
  else
  t=5;
 }
 fclose(fp);
 fp=fopen("sdent.txt","a");
 if(t==5)
 {
  for(i=0;i<5;i++)
     fwrite(&stu[i],sizeof(struct student),1,fp);
      fwrite(&p,sizeof(struct student),1,fp);
 }
 else if(t==0)
 {
  fwrite(&p,sizeof(struct student),1,fp);
  fwrite(&stu[i],sizeof(struct student),1,fp);
 }
 else
 {
  for(i=0;i<t;i++)
  fwrite(&stu[i],sizeof(struct student),1,fp);
  fwrite(&p,sizeof(struct student),1,fp);
  for(i=t;i<5;i++)
  fwrite(&stu[i],sizeof(struct student),1,fp);
 }
fclose(fp);

读取插入后新的学生数据

//读取插入后文件
 if((fp=fopen("sdent.txt","r"))==NULL)
 {
  printf("cannot open stud.txt\n");
  exit(0);
 }
  for(i=0;i<6;i++)
 {
  fread(&re[i],sizeof(struct student),1,fp); 
        printf("%d,%s,%d,%d,%d,%6.2f\n",re[i].num,re[i].name,re[i].score[0],re[i].score[1],re[i].score[2],re[i].ave);
 } 
    fclose(fp);

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP