5分钟学会:用文件和结构体实现三大学生成绩管理功能

某班有5个学生,三门课,分别编写3个函数实现以下要求:
1.求各门课的平均分
2.找出有两门以上不及格的学生,并输出其学号和不及格的课程的成绩
3.找出三门课平均成绩在85-90分的学生,并输出其学号和姓名,主程序输入5个学生的信息,然后调用上述函数输出结果在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
#define N 5//5个学生 
#define M 3//3门课程 
typedef struct student{
 int num;
 char name[20];
 int score[M];
}stu;
void WandR(char *filename,stu ss[],stu tt[]);
void CalAver(stu tt[],double aver[]);
void Findnopass(stu tt[]);
void FindGoodStu(stu tt[]);
int main(){
 int i;
 double aver[M];//各门课的平均分 
 stu ss[N],tt[N];//定义结构数组,数组中每一个元素都是结构类型 
 char filename[20];
 printf("请输入要存放的文件名:\n");
 scanf("%s",filename);
 printf("请输入学生信息:\n");
 for(i=0;i<N;i++){
  scanf("%d%s%d%d%d",&ss[i].num,ss[i].name,&ss[i].score[0],&ss[i].score[1],&ss[i].score[2]);
 } 
 WandR(filename,ss,tt);
 printf("各门课的平均成绩:\nscore1\tscore2\tscore3\t\n");
 CalAver(tt,aver); 
 printf("%.2lf\t%.2lf\t%.2lf\t",aver[0],aver[1],aver[2]);
 Findnopass(tt);
 FindGoodStu(tt);
 return 0;
}
void WandR(char *filename,stu ss[],stu tt[]){
 FILE *fp;
 if((fp=fopen(filename,"wb"))==NULL){
  printf("文件打开失败!\n");
  exit (0);
 }
 if(fwrite(ss,sizeof(stu),N,fp)!=N){
  printf("写入失败!\n");
  exit (0);
 }
 if(fclose(fp)){
  printf("不能关闭文件!\n");
  exit (0);
 }
 if((fp=fopen(filename,"rb"))==NULL){
  printf("文件打开失败2!\n");
  exit (0); 
 }
 if((fread(tt,sizeof(stu),N,fp))!=N){
  printf("文件读出失败!\n");
  exit (0); 
 }
 if(fclose(fp)){
  printf("不能关闭文件2!\n");
  exit (0);
 }
}
void CalAver(stu tt[],double aver[]){
 double sum;
 int i,j;
 for(i=0;i<M;i++){
  sum=0;
  for(j=0;j<N;j++){
   sum+=tt[j].score[i];
  }
  aver[i]=sum/N;
 }
} 
void Findnopass(stu tt[]){
 int i,j,n;
 printf("\n两门及以上挂科同学:\n");
 for(i=0;i<N;i++){
  n=0;
  for(j=0;j<M;j++){
   if(tt[i].score[j]<60){
    n++;
   }
   if(n>=2){/*显示挂科详情*/
    printf("%d\t",tt[i].num);
    for(j=0;j<M;j++){
     if(tt[i].score[j]<60){
      printf("%d\t",tt[i].score[j]);
     }
    }
    printf("\n");
   }
  } 
 }
}
void FindGoodStu(stu tt[]){
 int i,j; 
 double sum,aver;
 printf("\n平均成绩在85-90分的学生:\nnum\tname\t\n");
 for(i=0;i<N;i++){
  sum=0;
  for(j=0;j<M;j++){
    sum+=tt[i].score[j];
  }
  aver=sum/M;
  if(aver>=85&&aver<=90){
   printf("%d\t%s\n",tt[i].num,tt[i].name);
  }
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高达十几个

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值