BJFU||C语言课设

 如有漏洞,请批评指正!!!

一、总体介绍
1. 项目名称 围棋棋手管理系统
2. 项目简介
围棋是一种古老而极富智慧的策略游戏,棋手需要在 19*19 的棋盘上使用黑白两色
的棋子,通过布局、攻防、眼形等多方面的因素争夺领地,最终以总地盘面积的多少决
定胜负。围棋棋手是专业从事围棋比赛的选手,他们精通围棋规则,具备深厚的棋艺和
战术技能。
围棋棋手管理系统是一款专为围棋棋手设计的解决方案。该系统记录了棋手的信息,
并能跟踪其比赛表现。
该系统中棋手的信息包括:棋手编号,棋手姓名,棋手身份,棋手段位和等级分。
其中:
1 棋手编号 格式为大写英文字母 P 3 位正整数;如 P001 P999 等。棋手编
号唯一,无重复。
2 棋手身份 分为“职业”和“业余”。
3 棋手段位 分为职业段位和业余段位。职业段位从低到高依次是职业初段、职
业二段、……、职业八段、职业九段;业余段位分为级和段两个阶段,水平从低到高依
次是 10 级、…、 2 级、 1 级、业余 1 段、业余 2 段、…、业余 8 段。
4 )示例的棋手信息如下:
P001 连笑 职业 九段 8899
P002 柯洁 职业 九段 9442 P003 战鹰 职业 二段 216
P004 陈真 业余 2 80
二、具体要求
1. 系统功能要求
以菜单的方式完成以下功能,菜单形式如下。
【注意】 以下示例均只供参考。
******************* 欢迎使用围棋棋手管理系统 *******************
1. 从本地文件导入棋手信息
2. 保存棋手信息至本地文件
3. 显示棋手信息
4. 查询棋手信息
5. 增加棋手信息
6. 删除棋手信息
7. 修改棋手信息
8. 统计棋手信息
9. 对棋手信息进行排序
10. 退出系统
************************** 感谢使用 **************************
请选择功能( 1 - 10 ):
1 )从本地文件导入棋手信息
读取按一定格式存储在本地文件中的信息;本地文件格式可为文本文件或者二进
制文件,请你自己决定。可参考以下存储格式。(其中, 2 表示文件中存储的棋手总数)
2
P001 连笑 职业 九段 8899
P002 柯洁 职业 九段 9442
2 )保存棋手信息至本地文件
将棋手信息保存至本地文件,并提示保存是否成功。可以存储为文本文件或者二
进制文件,请你自己决定。
3 )显示棋手信息
显示所有棋手信息,并注意将各项数据对齐,若无信息,则给出相关提示。
4 )查询棋手信息
提示用户可分别按照棋手身份、棋手姓名、棋手段位进行信息查询,并根据用户提 供的选择进行查询结果显示。可以根据自身情况决定是否实现模糊查询功能。
A . 按棋手身份查询
B . 按棋手姓名查询
C . 按棋手段位查询
D . 退出当前功能
请选择( A - D ):
C
请输入棋手段位:
九段
查询结果如下:
2
棋手编号 棋手姓名 棋手身份 棋手段位 等级分
P001
连笑
职业
九段
8899
P002
柯洁
职业
九段
9442
【注意】 以下对棋手信息的增、删、改操作都要:
保存到对应的数据文件。
要有操作确认的提示和操作成功的提示。
操作成功后,显示所有棋手信息。
5 )增加棋手信息
提示用户按一定格式输入要增加的棋手信息,并提示是否添加成功。
6 )删除棋手信息
提示用户输入棋手编号、姓名,根据输入确定要删除的棋手信息,若没有该棋手信
息,则提示查无此人;若有,提示用户是否删除该数据,用户确认删除则删除棋手信息。
最后提示相应系统信息。
输入棋手编号、姓名: P004 陈真
完整信息: P004 陈真 业余 2 80
是否删除该数据 y / n ?: y
删除成功!
本地文件更新成功!
7 )修改棋手信息
提示用户输入棋手编号、姓名,根据输入确定要修改的修改信息。若没有该棋手信
息,则提示查无此人;若有,则先输出该棋手的全部信息,之后询问用户修改哪项信息。
用户选择修改项后,提示用户是否要修改。用户若确认修改则修改棋手信息,若放弃修 改则退出当前功能。最后提示相应系统信息。【注意:棋手编号不能更改!】
输入棋手编号、姓名: P001 连笑
完整信息: P001 连笑 职业 九段 8899
选择要修改数据项( 1 - 4 ): 4
是否修改该数据 y / n ?: y
输入修改信息: 8900
修改成功!
本地文件更新成功!
8 )统计棋手信息
提示用户可按照三种方式进行统计:统计某身份某段位棋手总数、统计职业二段以
上的棋手总数、统计业余棋手总数。根据输入,输出相应棋手数量和棋手信息。
A . 统计某身份某段位棋手总数
B . 统计职业二段以上的棋手总数
C . 统计业余棋手总数
D . 退出当前功能
请选择( A - D : A
输入棋手身份和段位: 职业 九段
当前棋手数量: 2
棋手编号 棋手姓名 棋手身份 棋手段位 等级分
P001
连笑
职业
九段
8900
P002
柯洁
职业
九段
9422
9 )对棋手信息进行排序
提示用户可按照两种方式进行排序:对所有棋手按等级分进行升序排序、对职业棋
手按段位进行降序排序(等级分或段位相同的棋手按照棋手编号后三位数字大小升序
排列)。根据输入信息进行排序,输出排序后的棋手信息。
A . 所有棋手按等级分进行降序排序
B . 职业棋手按段位进行降序排序
C . 退出当前功能
请选择( A - C : B
排序结果:
棋手编号 棋手姓名 棋手身份 棋手段位 等级分
P001
连笑
职业
九段
8900
P002
柯洁
职业
九段
9422
10 提示用户是否退出该系统。 2. 程序设计要求
1 )要合理使用数据结构,包括数组、枚举、结构体等。
2 )逻辑独立的功能定义在函数中,并利用指针进行参数传递。
3 )要有合理提示,例如修改、删除需提示确认。
4 )考虑程序鲁棒性,对不合法数据要有错误处理机制。
5 )所有数据保存在文件中。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 999

enum ID
{
	profession=0,
	amateur=1	
};

typedef struct
{
	char bh[100];//编号 
	char name[100];//姓名
	enum  ID sf;//身份
	char dw[100];//段位
	int s;//分数 
}QISHOU;//定义结构体 改名为QISHOU 

void print_menu()
{
 printf("*******************欢迎使用围棋棋手管理系统*******************\n");
 printf("1.录入围棋棋手信息\n");
 printf("2.保存围棋棋手信息\n");
 printf("3.浏览围棋棋手信息\n");
 printf("4.查询围棋棋手信息\n");
 printf("5.增加围棋棋手信息\n");
 printf("6.删除围棋棋手信息\n");
 printf("7.修改围棋棋手信息\n");
 printf("8.统计围棋棋手信息\n");
 printf("9.对围棋棋手信息进行排序\n");
 printf("10.退出\n");
 printf("**************************感谢使用!**************************\n");
}
//菜单

void EnterQishou(QISHOU *q,int *n)
{  
	int i;
	FILE *fp=fopen("qs.txt","r");
	if (!fp) 
	{
       printf("无法打开,请重试!\n");
       return;
    }
    rewind(fp);
    fscanf(fp,"%d\n",n);
	for(i=0;i<*n;i++)
	{
    	fscanf(fp,"%s ",(*(q+i)).bh);
    	fscanf(fp,"%s ",(*(q+i)).name);
    	fscanf(fp,"%d ",&(*(q+i)).sf);
    	fscanf(fp,"%s ",(*(q+i)).dw);
    	fscanf(fp,"%d\n",&(*(q+i)).s);
    }
	fclose(fp);
	printf("录入成功!");
}
//导入

void SaveQishou(QISHOU *q,int n)
{
	FILE *fp=fopen("qs.txt","w");
    if (!fp) 
	{
       printf("无法打开,请重试!\n");
       return;
    }
	int i;
    rewind(fp);
    fprintf(fp,"%d\n",n);
    for (i=0;i<n;i++) 
	{
        fprintf(fp,"%s ",(*(q+i)).bh);
    	fprintf(fp,"%s ",(*(q+i)).name);
    	fprintf(fp,"%d ",(*(q+i)).sf);
    	fprintf(fp,"%s ",(*(q+i)).dw);
    	fprintf(fp,"%d\n",(*(q+i)).s);
    }
	fclose(fp);
    printf("保存成功!");
}
//保存 
void print(QISHOU *q,int n)
{
	FILE *fp;
	int i;
	if(n==0)
	{
		printf("没有棋手信息!");
		return;
	}

	printf("\n棋手编号    棋手姓名     棋手身份     棋手段位     等级分\n");
	for(i=0;i<n;i++)
	{
		printf("%s      \t",(*(q+i)).bh);
		printf("%s \t",(*(q+i)).name);
		printf("   %s     ",((*(q+i)).sf==profession)?"职业":"业余");
		printf("      %s \t",(*(q+i)).dw);
		printf("      %d\n",(*(q+i)).s);
	}
}
//显示 

void Identity(QISHOU *q,int n)
{
	//EnterQishou(q,n);
		char d4;
		int i;
		int m=0;
		int count=0;
		int a;
		int sf_a;	
		printf("A.按身份查询\n");
		printf("B.按姓名查询");
		printf("\nC.按段位查询");
		printf("\nD.退出");
		printf("\n请选择(A~D):"); 
		getchar();		
		scanf("%c",&d4);
		if(d4!='A'&&d4!='a'&&d4!='C'&&d4!='c'&&d4!='B'&&d4!='b'&&d4!='D'&&d4!='d')
		{
			printf("输入有误!");
			getchar();
			return;
		}
		else
		{
			//查询身份 
		if(d4=='A'||d4=='a')
			{
				printf("请输入要查询的人员身份(0代表职业,1代表业余):");
				int a;
				getchar();
				scanf("%d",&sf_a);
				if(sf_a!=0&&sf_a!=1)
				{
					printf("输入错误!");
					return;
				}
				enum ID Identity_sf=(sf_a==0)?profession:amateur;
				printf("查询结果如下:\n") ;
				for(i=0;i<n;i++)
				{
					if((*(q+i)).sf==sf_a)
						{
							m=1;
							count++;
							printf("棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
							printf("%-8s\t",(*(q+i)).bh);
							printf("%-8s\t",(*(q+i)).name);
							printf("%-8s\t",((*(q+i)).sf==profession)?"职业":"业余");
							printf("%-8s\t",(*(q+i)).dw);
							printf("%-4d\n",(*(q+i)).s);
						
						}
					}
					printf("查询成功!\n");
					printf("共%d条结果",count);
				}
				//查询姓名 
			if(d4=='B'||d4=='b') 
				{
					printf("请输入要查询的人员姓名:");
					char name[100];
					getchar();
					scanf("%s",name);
					for(i=0;i<n;i++)
					{
						if(strcmp((*(q+i)).name,name)==0)
						{
							m=1;
							count++;
							printf("\n棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
							printf("%-8s\t",(*(q+i)).bh);
							printf("%-8s\t",(*(q+i)).name);
							printf("%-8s\t",((*(q+i)).sf==profession)?"职业":"业余");
							printf("%-8s\t",(*(q+i)).dw);
							printf("%-4d\n",(*(q+i)).s);
						}
					}
					printf("查询成功!\n");
					printf("共%d条结果",count);
				}
				//查询段位 
				if(d4=='C'||d4=='c')
				{
					int gg=0;
					printf("请输入要查询的段位:");
					char duanwei[100];
					char xx[30][30]={"初段","二段","三段","四段","五段","六段","七段","八段","九段","10级","9级","8级","7级","6级","5级","4级","3级","2级","1级","9段","8段","7段","6段","5段","4段","3段","2段","1段"};
					scanf("%s",duanwei);
					getchar();
					for(i=0;i<100;i++)
					{
						if(strcmp(duanwei,xx[i])==0)
						{
							gg++;
							
						}
					}
					if(gg==0)
					{
						printf("段位输入错误!");
						return;
					}
					for(i=0;i<n;i++)
					{
						if(strcmp((*(q+i)).dw,duanwei)==0)
						{
							m=1;
							count++;
							printf("棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
							printf("%-8s\t",(*(q+i)).bh);
							printf("%-8s\t",(*(q+i)).name);
							printf("%-8s\t",((*(q+i)).sf==profession)?"职业":"业余");
							printf("%-8s\t",(*(q+i)).dw);
							printf("%-4d\n",(*(q+i)).s);
						}
					}
					printf("查询成功!\n");
					printf("共%d条结果",count);
				}
				if(d4=='D'||d4=='d')
				{
					printf("退出查询成功!\n");
					return;
				}
		}
}
//查询

void AddQishou(QISHOU *q,int *n)
{
	//EnterQishou(q,n);
	if(*n>=1000)
	{
		printf("超出存储最大量,请更改存储量!");
		return;
	}
	else
	{
	printf("请输入增加人员个数:");
	int num;
	int i;
	int l=0;
	int gg=0;
	int sf_x;
	char w[100];
	scanf("%d",&num);
	(*(q+*n)).sf=(sf_x==0)?profession:amateur;	
	for(i=0;i<num;i++)
	{
		printf("请输入编号:"); 
		scanf("%s",(*(q+*n)).bh);
		for(i=0;i<*n;i++)
		{
			if(strcmp((*(q+*n)).bh,(*(q+i)).bh)==0)
			{
				printf("编号重复,请重新选择!\n");
				return;
			}
		}
		strcpy(w,(*(q+*n)).bh);
			if(w[0]!='P')
			{
				printf("输入错误!请看清要求(例如P001)");
				return;
			} 
			int bb=strlen((*(q+*n)).bh);
			if(bb!=4)
			{
				printf("长度不符!请看清要求(例如P001)");
				return;
			}
		printf("请输入名字:"); 
		scanf("%s",(*(q+*n)).name);
		printf("请输入身份(0-职业 1-业余):"); 
		scanf("%d",&(*(q+*n)).sf);
		if((*(q+*n)).sf!=1&&(*(q+*n)).sf!=0) 
		{
			printf("输入错误!");
			return;
		}
		printf("请输入段位(例如 职业时二段,业余时2段或2级):"); 
		scanf(" %s",(*(q+*n)).dw);
		char hh[20][20]={"初段","二段","三段","四段","五段","六段","七段","八段","九段"};
		char xx[20][20]={"10级","9级","8级","7级","6级","5级","4级","3级","2级","1级","9段","8段","7段","6段","5段","4段","3段","2段","1段"};			
		if((*(q+*n)).sf==0)
		{
			for(i=0;i<10;i++)
			{
				if(strcmp((*(q+*n)).dw,hh[i])==0)
					{
						gg++;					
					}
			}
			if(gg==0)
				{
				printf("段位输入错误!");
				return;
				}
		}
		else if((*(q+*n)).sf==1) 
		{	
			for(i=0;i<100;i++)
			{
				if(strcmp((*(q+*n)).dw,xx[i])==0)
					{
						l++;				
					}
			}
			if(l==0)
				{
				printf("段位输入错误!");
				return;
				}
		}
		printf("请输入分数:"); 
		scanf("%d",&(*(q+*n)).s);
		if((*(q+*n)).s<0) 
		{
			printf("分数错误!");
			return; 
		}
	}		
	char dd;
	printf("请确认是否增加y/n?");
	getchar(); 
	scanf("%c",&dd);
	if(dd=='Y'||dd=='y')
	{
		*n=*n+1;
		printf("增加数据成功!\n");
		SaveQishou(q,*n);
		printf("文本文件更新成功!");
		printf("棋手信息:\n"); 
		print(q,*n);
	}
	if(dd!='Y'&&dd!='y'&&dd!='N'&&dd!='n')
	{
		printf("输入有误,请重新输入!");
		getchar();
		return;
	}

	if(dd=='N'||dd=='n')
	{
		printf("增加取消!");
		return;
	}
	}
}
//增加

QISHOU* ModifyInformation(QISHOU *q,int *n)
{
	//EnterQishou(q,n);
	int m=0;
	int i;
	char ch;
	int sf_x=0;
	printf("输入棋手编号、姓名:");
	char Pname[100];//姓名
	char bih[100];//编号
	scanf("%s",bih);
	scanf("%s",Pname);
	for(i=0;i<*n;i++)
	{
		if((strcmp(bih,(*(q+i)).bh))==0&&(strcmp(Pname,(*(q+i)).name))==0)
		{
			m=i+1;
			break;	
		}
	}	
	if(m==0)
	{
		printf("系统没有该人员信息!"); 
	}
	else 
	{
		printf("棋手完整信息为:\n");
		printf("%-8s\t",(*(q+i)).bh);
		printf("%-8s\t",(*(q+i)).name);
		printf("%-8s\t",((*(q+i)).sf==profession)?"职业":"业余");
		printf("%-8s\t",(*(q+i)).dw);
		printf("%-4d\n",(*(q+i)).s);
	}
	if (m>=1)
	{
		getchar();
		printf("是否修改该数据y/n?:");
		scanf("%c",&ch);
			if(ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n')
				{
					printf("输入有误,请重新输入!");
					getchar();
					scanf("%c",&ch);
				}
			else
			{	
				if(ch=='Y'||ch=='y')
				{
					printf("修改哪项信息(1-名字 2-身份(0-职业,1-业余)3-段位 4-等级分):");
					int qq; 
					scanf("%d",&qq);
					if(qq!=1&&qq!=2&&qq!=3&&qq!=4)
						{
							printf("输入有误,请重输!");
							return 0;
						}
					printf("请输入修改信息:");
					//修改等级分 
					if(qq==4)
							{
								int mm;
								scanf("%d",&mm);
								if(mm<0)
								{
									printf("分数不能为负!");
									return; 
								}
								(*(q+i)).s=mm;
							}
					else
					{
						//修改名字 
							if(qq==1)
							{
								char a[100];
								getchar();
								scanf("%s",&a);
								int i;
								for (i=0;a[i]!='\0';i++)
									{
										q[m-1].name[i]=a[i];
									}
								q[m-1].name[i]='\0'; 
							}
							//修改身份 
							if(qq==2)
							{
								int sf_x;
								printf("(0-职业 1-业余):");
								scanf("%d",&q[i].sf);
								if(q[i].sf!=0&&q[i].sf!=1)
								{
									printf("输入错误!");
									return; 
								}
							}
							//修改段位 
							if(qq==3)
							{
								char a[100];
					   			getchar();
								scanf("%s",&a);
								int i;
								int gg=0;
								char hh[30][30]={"初段","二段","三段","四段","五段","六段","七段","八段","九段","10级","9级","8级","7级","6级","5级","4级","3级","2级","1级","9段","8段","7段","6段","5段","4段","3段","2段","1段"};		
								for(i=0;i<100;i++)
								{
									if(strcmp(a,hh[i])==0)
									{
										gg++;
									}
								}
								if(gg==0)
								{
									printf("输入错误!");
									return;
								}
								for (i=0;a[i]!='\0';i++)
									{
										q[m-1].dw[i]=a[i];
									}
								q[m-1].dw[i]='\0';
							}
					}
				}
				printf("修改成功!\n");
				SaveQishou(q,*n);
				printf("本地文件更新成功!\n");
				printf("棋手信息如下:\n");
				print(q,*n);
				return q;
			if(ch=='N'&&ch=='n')
			{
				printf("取消修改成功!");
				return 0;
			}
			}
	}
}
//修改 

void DeleteQishou(QISHOU *q,int*n)
{
	//EnterQishou(q,n);
	int m=0;
	int i;
	char ch;
	printf("输入棋手编号、姓名:");
	char Pname[100];//姓名
	char bih[100];//编号
	scanf("%s",bih);
	scanf("%s",Pname);
	for(i=0;i<*n;i++)
	{
		if((strcmp(bih,(*(q+i)).bh))==0&&(strcmp(Pname,(*(q+i)).name))==0)
		{
			m=i+1;
			break;	
		}
	}	
	if(m==0)
	{
		printf("系统没有该人员信息!"); 
	}
	else 
	{
		printf("棋手完整信息为:\n");
		printf("%-8s\t",(*(q+i)).bh);
		printf("%-8s\t",(*(q+i)).name);
		printf("%-8s\t",((*(q+i)).sf==profession)?"职业":"业余");
		printf("%-8s\t",(*(q+i)).dw);
		printf("%-4d\n",(*(q+i)).s);
	}
	if (m>=1)
	{	
			printf("是否删除该组数据y/n?:");
			getchar();
			scanf("%c",&ch);
				if(ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n')
				{
					printf("输入有误,请重新输入!");
					getchar();
					scanf("%c",&ch);
				}
				else
				{
				if(ch=='Y'||ch=='y')
					{
						for(i=m-1;i<*n-1;i++)
							{
								(*(q+i))=(*(q+i+1));
							}
						*n=*n-1;
						printf("删除成功!\n"); 
						SaveQishou(q,*n);
						printf("数据保存文件成功!\n"); 
						printf("完整棋手信息:\n");
						print(q,*n);
					}
				if(ch=='N'&&ch=='n')
					{
						print(q,*n);
						return ;
					}
				}
		}
}
//删除  

void StatisticsInformation(QISHOU *q,int num)
{
	//EnterQishou(q,n);
	printf("A. 统计某身份某段位棋手总数\n");
	printf("B. 统计职业二段以上的棋手总数\n");
	printf("C. 统计业余棋手总数\n");
	printf("D. 退出当前功能\n");
	printf("请选择(A-D):");
		char ch;
		int i;
		int count=0; 
		getchar();
		scanf("%c",&ch);
		if(ch!='A'&&ch!='a'&&ch!='B'&&ch!='b'&&ch!='C'&&ch!='c'&&ch!='D'&&ch!='d')
			{
				printf("输入有误,请重新输入!");
				getchar();
				scanf("%c",&ch);
			}
		else
		{
			//统计某身份某段位 
		 if(ch=='A'||ch=='a')
				{
					
					int  a;//身份 
					char b[100];//段位 
					int gg=0;
					int l=0;
					getchar();
					printf("请输入棋手身份(0-职业,1-业余):");
					scanf("%d",&a);
					if(a!=0&&a!=1)
					{
						printf("身份输入有误!");
						return;
					}
					printf("请输入段位:"); 
					scanf("%s",b);
				char hh[20][20]={"初段","二段","三段","四段","五段","六段","七段","八段","九段"};
				char xx[20][20]={"10级","9级","8级","7级","6级","5级","4级","3级","2级","1级","9段","8段","7段","6段","5段","4段","3段","2段","1段"};			
				if(a==0)
				{
					for(i=0;i<10;i++)
						{
							if(strcmp(b,hh[i])==0)
							{
								gg++;					
							}
				}
				if(gg==0)
					{
					printf("段位输入错误!");
					return;
					}
				}
				else if(a==1) 
				{	
					for(i=0;i<100;i++)
					{
						if(strcmp(b,xx[i])==0)
							{
								l++;				
							}
					}
				if(l==0)
				{
					printf("段位输入错误!");
					return;
				}
				}
					enum ID s_sf=(a==0)?profession:amateur; 
					for(i=0;i<num;i++)
					{
						if((*(q+i)).sf==s_sf&&strcmp((*(q+i)).dw,b)==0)
							{	
								count++;
								printf("\n棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
								printf("%-8s\t",(*(q+i)).bh);
								printf("%-8s\t",(*(q+i)).name);
								printf("%-8s\t",((*(q+i)).sf==profession)?"职业":"业余");
								printf("%-8s\t",(*(q+i)).dw);
								printf("%-4d\n",(*(q+i)).s);
							}
					}
					printf("统计成功!\n");
					printf("当前选手数量为%d",count);
				}
				//统计职业二段以上 
		if(ch=='B'||ch=='b')
				{
				
					char b[100]="二段";
					for(i=0;i<num;i++)
						{
							if((*(q+i)).sf==0)
							{
							if(strcmp((*(q+i)).dw,b)>0)
								{
									count++;
									printf("\n棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
									printf("%-8s\t",(*(q+i)).bh);
									printf("%-8s\t",(*(q+i)).name);
									printf("%-8s\t",((*(q+i)).sf==profession)?"职业":"业余");
									printf("%-8s\t",(*(q+i)).dw);
									printf("%-4d\n",(*(q+i)).s);
								}
							}
						}
							printf("统计成功!");
				printf("当前选手数量为%d",count);
			 
				}
				//统计职业棋手 
		if(ch=='C'||ch=='c')
				{
					for(i=0;i<num;i++)
						{
							if(q[i].sf==1)
								{
									count++;
									printf("\n棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
									printf("%-8s\t",(*(q+i)).bh);
									printf("%-8s\t",(*(q+i)).name);
									printf("%-8s\t",((*(q+i)).sf==profession)?"职业":"业余");
									printf("%-8s\t",(*(q+i)).dw);
									printf("%-4d\n",(*(q+i)).s);
								}
						}
						printf("统计成功!");
				printf("当前选手数量为%d",count);
				} 
		if(ch=='D'||ch=='d')
				{
					printf("退出统计功能成功!");
				return;
				}
				}

}
//统计 

void SortInformation(QISHOU *q,int num)
{
	//EnterQishou(q,n);
	printf("A. 所有棋手按等级分进行降序排序\n");
	printf("B. 职业棋手按段位进行降序排序\n");
	printf("C.退出\n");
	char ch;
	getchar();
	int i;
	int j;
	QISHOU temp;
	QISHOU a;
	QISHOU c;
	QISHOU d;
		printf("请选择(A-C):");
		scanf("%c",&ch);
		if(ch!='A'&&ch!='a'&&ch!='B'&&ch!='b'&&ch!='C'&&ch!='c'&&ch!='D'&&ch!='d')
				{
					printf("输入有误,请重新输入!");
					getchar();
					scanf("%c",&ch);
				}
				else
				{
				//	所有棋手按等级分进行降序排序,等级分或段位相同的棋手按照棋手编号后三位数字大小升序排列 	
		if(ch=='A'||ch=='a')
				{
					for(i=0;i<num-1;i++)
						{
							for(j=i+1;j<num;j++)
								{
									if((*(q+i)).s<(*(q+j)).s) 
										{
											temp=(*(q+i));
											(*(q+i))=(*(q+j));
											(*(q+j))=temp;
										}
									if((*(q+i)).s==(*(q+j)).s)
										{
											if(strcmp((*(q+i)).bh,(*(q+j)).bh)>0)
											{
												a=(*(q+i));
											(*(q+i))=(*(q+j));
												(*(q+j))=a;
											}
										}
								}
						}
					printf("排序成功!"); 	
					for(i=0;i<num;i++)
						{
							printf("\n棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
							printf("%-8s\t",(*(q+i)).bh);
							printf("%-8s\t",(*(q+i)).name);
							printf("%-8s\t",((*(q+i)).sf==profession)?"职业":"业余");
							printf("%-8s\t",(*(q+i)).dw);
							printf("%-4d\n",(*(q+i)).s);
						
						}			
				}
				// 职业棋手按段位进行降序排序,等级分或段位相同的棋手按照棋手编号后三位数字大小升序排列 
		if(ch=='B'||ch=='b')
				{
					for(i=0;i<num-1;i++)
						{
							for(j=i+1;j<num;j++)
							{
								if(strcmp((*(q+i)).bh,(*(q+j)).bh)>0)
								{
									d=(*(q+i));
									(*(q+i))=(*(q+j));
									(*(q+j))=d;
								}
							}
						}
						printf("排序成功!\n"); 
						for(i=0;i<num;i++)
							{
								if((*(q+i)).sf==0&&strcmp((*(q+i)).dw,"九段")==0)
									{
										printf("棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
										printf("%-8s    \t",(*(q+i)).bh);
										printf("%-8s    \t",(*(q+i)).name);
										printf("%-8s    \t",((*(q+i)).sf==profession)?"职业":"业余");
										printf("%-8s    \t",(*(q+i)).dw);
										printf("%-4d\n",(*(q+i)).s);
									}
							}				
						for(i=0;i<num;i++)
							{
								if((*(q+i)).sf==0&&strcmp((*(q+i)).dw,"八段")==0)
									{	
										printf("棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
										printf("%-8s    \t",(*(q+i)).bh);
										printf("%-8s    \t",(*(q+i)).name);
										printf("%-8s    \t",((*(q+i)).sf==profession)?"职业":"业余");
										printf("%-8s    \t",(*(q+i)).dw);
										printf("%-4d\n",(*(q+i)).s);
									}
								
							}
						for(i=0;i<num;i++)
							{
								if((*(q+i)).sf==0&&strcmp((*(q+i)).dw,"七段")==0)
									{	
										printf("棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
										printf("%-8s    \t",(*(q+i)).bh);
										printf("%-8s    \t",(*(q+i)).name);
										printf("%-8s    \t",((*(q+i)).sf==profession)?"职业":"业余");
										printf("%-8s    \t",(*(q+i)).dw);
										printf("%-4d\n",(*(q+i)).s);
									}
							}
						for(i=0;i<num;i++)
							{
								if((*(q+i)).sf==0&&strcmp((*(q+i)).dw,"六段")==0)
									{	
										printf("棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
										printf("%-8s    \t",(*(q+i)).bh);
										printf("%-8s    \t",(*(q+i)).name);
										printf("%-8s    \t",((*(q+i)).sf==profession)?"职业":"业余");
										printf("%-8s    \t",(*(q+i)).dw);
										printf("%-4d\n",(*(q+i)).s);
									}
							}
						for(i=0;i<num;i++)
							{
								if((*(q+i)).sf==0&&strcmp((*(q+i)).dw,"五段")==0)
									{	
										printf("棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
										printf("%-8s    \t",(*(q+i)).bh);
										printf("%-8s    \t",(*(q+i)).name);
										printf("%-8s    \t",((*(q+i)).sf==profession)?"职业":"业余");
										printf("%-8s    \t",(*(q+i)).dw);
										printf("%-4d\n",(*(q+i)).s);
									}
							}
						for(i=0;i<num;i++)
							{
								if((*(q+i)).sf==0&&strcmp((*(q+i)).dw,"四段")==0)
									{	
										printf("棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
										printf("%-8s    \t",(*(q+i)).bh);
										printf("%-8s    \t",(*(q+i)).name);
										printf("%-8s    \t",((*(q+i)).sf==profession)?"职业":"业余");
										printf("%-8s    \t",(*(q+i)).dw);
										printf("%-4d\n",(*(q+i)).s);
									}
							}
						for(i=0;i<num;i++)
							{
								if((*(q+i)).sf==0&&strcmp((*(q+i)).dw,"三段")==0)
									{	
										printf("棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
										printf("%-8s    \t",(*(q+i)).bh);
										printf("%-8s    \t",(*(q+i)).name);
										printf("%-8s    \t",((*(q+i)).sf==profession)?"职业":"业余");
										printf("%-8s    \t",(*(q+i)).dw);
										printf("%-4d\n",(*(q+i)).s);
									}
							}
						for(i=0;i<num;i++)
							{
								if((*(q+i)).sf==0&&strcmp((*(q+i)).dw,"二段")==0)
									{	
										printf("棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
										printf("%-8s    \t",(*(q+i)).bh);
										printf("%-8s    \t",(*(q+i)).name);
										printf("%-8s    \t",((*(q+i)).sf==profession)?"职业":"业余");
										printf("%-8s    \t",(*(q+i)).dw);
										printf("%-4d\n",(*(q+i)).s);
									}
							}
						for(i=0;i<num;i++)
							{
								if((*(q+i)).sf==0&&strcmp((*(q+i)).dw,"初段")==0)
									{	
										printf("棋手编号\t棋手姓名\t棋手身份\t棋手段位\t等级分\n");
										printf("%-8s    \t",(*(q+i)).bh);
										printf("%-8s    \t",(*(q+i)).name);
										printf("%-8s    \t",((*(q+i)).sf==profession)?"职业":"业余");
										printf("%-8s    \t",(*(q+i)).dw);
										printf("%-4d\n",(*(q+i)).s);
									}
							}				
				}
				if(ch=='C'||ch=='c')
					{
						printf("退出排序功能成功!");
						return;
					}
					}
}
//排序 

/*函数声明*/ 
void print_menu();//菜单 
void EnterQishou(QISHOU *q,int *n);//导入 
void SaveQishou(QISHOU *q,int n);//保存 
void print(QISHOU *q,int n);//显示 
void Identity(QISHOU *q,int n);//查询 
void AddQishou(QISHOU *q,int *n);//添加 
QISHOU* ModifyInformation(QISHOU *q,int *n);//修改 
void DeleteQishou(QISHOU *q,int*n);//删除 
void StatisticsInformation(QISHOU *q,int num);//统计 
void SortInformation(QISHOU *q,int num);//排序 
int main()
{ 
	print_menu();
	QISHOU ss[1000];
	QISHOU *q=ss;
	q=ss;
	int v=0;
	int *m=&v;
	int n=1,c;
	while(n)
	{
		printf("\n请选择(1-10):");
		scanf("%d",&c);
		switch(c)
		{
			case 1:
			{
				EnterQishou(q,m);
					break;
			}
			case 2:
			{
				SaveQishou(q,*m);
					break;
			}
			case 3:
			{
				print(q,*m);
					break;
			}
			case 4:
			{
				Identity(q,*m);
					break;
			}
			case 5:
			{
				AddQishou(q,m);
					break;
			}
			case 6:
			{
				DeleteQishou(q,m); 
					break;
			}
			case 7:
			{
				ModifyInformation(q,m);
					break;
			}
			case 8:
			{
				StatisticsInformation(q,*m);
					break;
			}
			case 9:
			{
				SortInformation(q,*m);
					break;
			}
			case 10:
			{
				char a;
				printf("请您确认是否要退出此系统,如果要退出,请输入y,不退出,请输入n:");
				getchar();
				scanf("%c",&a);
				if(a!='y'&&a!='Y'&&a!='n'&&a!='N') 
				{
					printf("输入有误!");
				}
				if(a=='y'||a=='Y')
				{
					printf("退出成功!");
					printf("感谢使用!");
					return 0;
				}
				if(a=='n'||a=='N')
				{
				continue;
				} 
				break;
			}
			default:
			{
				printf("输入错误,请重输!");
				break;
				return;	
			}
		}
	}
	return 0;	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值