返回:贺老师课程教学链接
【项目2-用文本文件保存的学生名单】
文件score.dat中保存的是若干名学生的姓名和C语言课、高数和英语成绩。
(1)定义学生结构体,其中包含姓名、C++课、高数和英语成绩及总分数据成员。
//定义学生结构体
typedef struct
{
string name;
double cpp;
double math;
double english;
double total;
}Student
(2)用对象数组进行存储学生的成绩,读入成绩并计算总分;将总分高于平均总分且没挂科的同学的信息保存到文件pass_score.dat中。
int main( ){
Student stud[200],t; //stud[200]为保存数据的对象数组
//从文件score.dat中读入数据,保存到对象数组中
//总分高于平均总分且没挂科的同学的信息保存到文件pass_score.dat中
return 0;
}
[参考解答]
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char num[13];
char name[10];
double c;
double math;
double english;
double total;
} Student;
int pass(Student); //判断一个学生的各门课是否通过
int main( )
{
Student stud[200]; //stud[200]为保存数据的对象数组
int stu_num=0, total_sum=0, i=0;
//从文件score.dat中读入数据,保存到对象数组中
FILE *fp;
if((fp=fopen("score.dat","r"))==NULL)
{
printf("数据文件不存在!\n");
exit(1);
}
while(!feof(fp))
{
fscanf(fp, "%s %s", stud[i].num, stud[i].name);
fscanf(fp, "%lf %lf %lf", &stud[i].c,&stud[i].math, &stud[i].english);
stud[i].total=stud[i].c+stud[i].math+stud[i].english;
stu_num++; //在读入数据过程中,记录下来具体的学生人数和总分和
total_sum+=stud[i].total;
i++;
}
fclose(fp);
//总分高于平均总分且没挂科的同学的信息保存到文件pass_score.dat中
if(stu_num>0)
{
double total_avg = total_sum / stu_num;
fp=fopen("pass_score.dat","w");
if(!fp)
{
printf("无法输出到文件!\n");
exit(1);
}
for(i=0; i<stu_num; i++)
{
if(stud[i].total>total_avg&&pass(stud[i]))
{
fprintf(fp, "%s\t%s\t", stud[i].num, stud[i].name);
fprintf(fp, "%.2lf\t%.2lf\t%.2lf\t", stud[i].c,stud[i].math, stud[i].english);
fprintf(fp, "%.2lf\n", stud[i].total);
}
}
fclose(fp);
printf("请到文件pass_score.dat中查看名单\n");
}
return 0;
}
int pass(Student s) //判断一个学生的各门课是否通过
{
int p=0;
if(s.c>=60 &&s.english>=60&&s.math>=60)
p=1;
return p;
}