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 
#include 
#include 
#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=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=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;i0)
								{
									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;i0)
											{
												a=(*(q+i));
											(*(q+i))=(*(q+j));
												(*(q+j))=a;
											}
										}
								}
						}
					printf("排序成功!"); 	
					for(i=0;i0)
								{
									d=(*(q+i));
									(*(q+i))=(*(q+j));
									(*(q+j))=d;
								}
							}
						}
						printf("排序成功!\n"); 
						for(i=0;i

你可能感兴趣的:(c语言,算法,开发语言)