目录
一、运行环境说明
操作系统: Windows系列
编译软件: Visual Studio Code
开发语言: C语言
二、主题题目要求
汇总报表
按照不同条件,汇总不同的信息,汇总的信息以列表形式显示,至少包括以下的内容:
- 通过对athlete.dat 、match.dat文件的读操作,按比赛项目汇总运动员信息;
- 通过对athlete.dat、score.dat文件的读操作,按学院汇总参赛成绩的统计结果。
三、流程图
四、程序代码
struct Temp
{
char ba[10];
};
struct newf
{
char newmatch[10];//比赛项目名称
char newsex[10];
int newath;//运动员编号,参赛编号
// int newnum;//项目编号
char newname[10];
char newcollege[10];
};
void newhan()
{
FILE *f1,*f2,*f3;
struct athleteData athlete={0,"","",0,"",""};
struct matchData match={0,"","","","",""};
struct scoreData score={0,0,"",0.0,0};
struct newf a={"","",0,"",""};
if((f2=fopen("match.dat","rb"))==NULL)
{
printf("不能打开文件 \n");
exit(0);
}
if((f1=fopen("athlete.dat","rb"))==NULL)
{
printf("不能打开文件 \n");
exit(0);
}
if((f3=fopen("score.dat","rb"))==NULL)
{
printf("不能打开文件 \n");
exit(0);
}
printf("%-13s%-13s%-13s%-13s%-13s%-13s\n","比赛项目","项目性别","参赛编号","姓名","性别","学院");
while((fread(&match,sizeof(struct matchData),1,f2))!=(int)NULL)
{
strcpy(a.newmatch,match.matName);
strcpy(a.newsex,match.matsex);
// a.newnum=match.matNum;
rewind(f3);
while((fread(&score,sizeof(struct scoreData),1,f3))!=(int)NULL)
{
//printf("111111111");
if(match.matNum==score.scomatch)
{
a.newath=score.scoathlete;
rewind(f1);
while((fread(&athlete,sizeof(struct athleteData),1,f1))!=(int)NULL)
{
if(a.newath==athlete.athNum)
{
strcpy(a.newname,athlete.athName);
strcpy(a.newcollege,athlete.athcollege);
printf("%-13s%-13s%-13d%-13s%-13s%-13s\n",a.newmatch,a.newsex,a.newath,a.newname,a.newsex,a.newcollege);
printf("\n");
//break;
}
}
}
}
//printf("%s\n",a.newmatch);
}
}
void summarycollege()
{
printf("*****************************************************\n");
FILE* fp;
struct scoreData score = { 0,0,"",0.0,0 };
struct Linkscore* head, * p, * q;
struct Temp b[100];
//char b[100];
int flag = 0;
int fir = 0;
int sec = 0;
int thi = 0;
head = creadscoreList();
p = head;
int i = 0, j = 0;
double sum = 0;
if ((fp = fopen("score.dat", "rb")) == NULL)
{
printf("不能打开文件\n");
exit(0);
}
printf("%-13s%-13s%-10s%-10s%-0s\n", "学院", "比赛项目编号", "第一名:", "第二名:", "第三名:");
while ((fread(&score, sizeof(struct scoreData), 1, fp)) != (int)NULL)//逐一查询
{
flag = 0;
j = i;
sum = 0;
while (j > 0)
{
if (strcmp(score.scocollege, b[j-1].ba) == 0)
{
flag = 1;
}
j--;
}
if (flag == 0)
{
fir = 0;
sec = 0;
thi = 0;
p = head;
while (p != NULL)
{
if (strcmp(score.scocollege, p->scocollege) == 0)
{
int scorank = p->scorank; // 获取成绩的名次
if (scorank == 1)
{
fir = fir + 1;
}
if (scorank == 2)
{
sec = sec + 1;
}
if (scorank == 3)
{
thi = thi + 1;
}
printf("%-13s%-13d%-10d%-10d%-10d\n", p->scocollege, p->scomatch, fir, sec, thi);//出错地方,项目编号修改
}
p=p->next;
}
printf(" 合计 ");
printf("%-10d%-10d%-10d\n", fir, sec, thi);
strcpy(b[i].ba,score.scocollege);
i++;
}
}
fclose(fp);
}
//按比赛项目汇总运动员信息
void summaryinformation()
{
int choice;
printf("*****************************************************\n");
printf("按比赛项目汇总运动员信息:1 ;学院汇总参赛成绩的总结结果: 2 ;返回上一级:其他\n");
printf("*****************************************************\n");
scanf("%d",&choice);
if (choice==1)
{
newhan();
}
else if (choice==2)
{
summarycollege();
}
}
五、代码分析
按比赛项目输出运动员信息的函数名为newhan。该函数的作用是从三个文件中读取数据,分别是运动员数据文件athlete.dat、比赛项目数据文件match.dat和成绩数据文件score.dat。然后根据比赛项目和成绩数据文件中的比赛编号,以及运动员数据文件中的运动员编号,将相关信息输出到屏幕上。
1、定义了三个文件指针f1、f2、f3,以及三个结构体变量athlete、match、score和一个新的结构体变量a。
2、打开三个数据文件,如果打开失败则输出错误信息并退出程序。
3、输出表头信息。
4、从比赛项目数据文件中读取比赛项目的信息,将比赛项目名称和项目性别存储到新的结构体变量a,并初始化了它的成员变量。结构体的类型是"newf",其中包含了五个成员变量。
5、从成绩数据文件中读取成绩信息,如果比赛项目编号和成绩数据文件中的比赛编号相同,则将成绩数据文件中的运动员编号存储到新的结构体变量a中。
6、从运动员数据文件中读取运动员信息,如果新的结构体变量a中的运动员编号和运动员数据文件中的运动员编号相同,则将运动员的姓名和学院信息存储到新的结构体变量a中,并将所有信息输出到屏幕上。
7、循环执行步骤4~6,直到比赛项目数据文件中的所有比赛项目信息都被处理完毕。
8、关闭三个数据文件。
按学院汇总参赛成绩输出的函数名为summarycollege。该函数的作用是从成绩数据文件score.dat中读取数据,统计每个学院在每个比赛项目中的前三名成绩,并将结果输出到屏幕上。
- 定义了一个文件指针fp,一个scoreData类型的结构体变量score,一个Linkscore类型的链表头指针head,以及其他辅助变量。
- 打开成绩数据文件score.dat,如果打开失败则输出错误信息并退出程序。
- 输出表头信息。
- 通过调用creadscoreList函数创建一个成绩链表,并将返回的链表头指针赋值给head。
- 循环读取成绩数据文件中的数据,直到文件结束。
- 判断当前读取的学院是否已经统计过,如果没有统计过,则进行统计操作。
- 在链表中查找与当前学院相同的学院信息,并统计该学院在每个比赛项目中的前三名成绩。
- 输出当前学院在每个比赛项目中的前三名成绩,并统计该学院的总成绩。
- 将当前学院的信息存储到一个临时数组b中,用于判断下一个学院是否已经统计过。
- 关闭成绩数据文件。
- 函数执行完毕。