数据结构-运动会管理系统-学术工程实践-链表的汇总功能

目录

一、运行环境说明

二、主题题目要求

 三、流程图

四、程序代码

五、代码分析

六、界面实现​编辑


一、运行环境说明

操作系统:   Windows系列

编译软件:   Visual Studio Code

开发语言:   C语言

二、主题题目要求

汇总报表

按照不同条件,汇总不同的信息,汇总的信息以列表形式显示,至少包括以下的内容:

  1. 通过对athlete.dat match.dat文件的读操作,按比赛项目汇总运动员信息;
  2. 通过对athlete.datscore.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中读取数据,统计每个学院在每个比赛项目中的前三名成绩,并将结果输出到屏幕上。

  1. 定义了一个文件指针fp,一个scoreData类型的结构体变量score,一个Linkscore类型的链表头指针head,以及其他辅助变量。
  2. 打开成绩数据文件score.dat,如果打开失败则输出错误信息并退出程序。
  3. 输出表头信息。
  4. 通过调用creadscoreList函数创建一个成绩链表,并将返回的链表头指针赋值给head。
  5. 循环读取成绩数据文件中的数据,直到文件结束。
  6. 判断当前读取的学院是否已经统计过,如果没有统计过,则进行统计操作。
  7. 在链表中查找与当前学院相同的学院信息,并统计该学院在每个比赛项目中的前三名成绩。
  8. 输出当前学院在每个比赛项目中的前三名成绩,并统计该学院的总成绩。
  9. 将当前学院的信息存储到一个临时数组b中,用于判断下一个学院是否已经统计过。
  10. 关闭成绩数据文件。
  11. 函数执行完毕。

六、界面实现

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值