如有漏洞,请批评指正!!!
一、总体介绍
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;
}