中文排序问题求指教
学习C语言一个月了,但是还没搞清楚一个结构体变量,其中有工号,姓名等,如何按照姓名排序,姓名是中文的,求教了,代码在下面,排序部分是红色的,按工号,和工资排序都正确了,但是按姓名还不对,请教一下了!程序是可以运行的,其他方面都对了,就是选择按姓名排序,会出错,跳出程序!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
int number;
char key[100];
int caidan(int a,int b)
{
int n,m,i;
while(1)
{
m=1;
for(i=0;i<strlen(key);i++)
{
if(isdigit(key[i])==0)
{
m=0;
break;
}
}
if(m==0)
{
printf("输入错误,请输入数字,请重新输入:\n");
scanf("%s",key);
}
else
{
n=atoi(key);
if(n>b||n<a)printf("输入错误,请重新输入:\n"),scanf("%s",key);
else break;
}
}
return n;
}
struct worker /*定义员工结构体*/
{
int nub;
char name[20];
char sex[3];
float gz;
char beizhu[10];
}yg[100],ls[100];
void add(int n) //添加员工
{
FILE *fp;
printf("请输入员工信息:姓名,性别,工资,备注,工号将自动生成\n");
scanf("%s %s %f %s",yg[n].name,yg[n].sex,&yg[n].gz,yg[n].beizhu);
yg[n].nub=number+1;
fp=fopen("员工数据库.txt","a+");
fprintf(fp,"%d\t%s\t%s\t%f\t%s\n",yg[n].nub,yg[n].name,yg[n].sex,yg[n].gz,yg[n].beizhu);
fclose(fp);
number++;
}
int zairu() //载入历史数据
{
FILE *fp;
int i;
fp=fopen("员工数据库.txt","a+");
for(i=0;!feof(fp);i++)
fscanf(fp,"%d %s %s %f %s",&yg[i].nub,yg[i].name,yg[i].sex,&yg[i].gz,yg[i].beizhu);
fclose(fp);
return i-1;
}
void chakan() //查看员工列表
{
int i;
for(i=0;i<number;i++)
{
if(i==0)printf("工号\t姓名\t性别\t工资\t\t备注\n");
printf("%d\t%s\t%s\t%f\t%s\n",yg[i].nub,yg[i].name,yg[i].sex,yg[i].gz,yg[i].beizhu);
}
}
void xiugai() //修改员工信息
{
int n,i,m;
FILE *fp;
printf("请输入要修改的员工工号\n");
scanf("%s",key);
while(1)
{
m=1;
for(i=0;i<strlen(key);i++)
{
if(isdigit(key[i])==0)
{
m=0;
break;
}
}
if(m==0)
{
printf("输入错误,请输入数字,请重新输入:\n");
scanf("%s",key);
}
else
{
n=atoi(key);
if(n>number||n<1)printf("员工工号不存在,请重新输入:\n"),scanf("%s",key);
else break;
}
}
printf("%d\t%s\t%s\t%f\t%s\n",yg[n-1].nub,yg[n-1].name,yg[n-1].sex,yg[n-1].gz,yg[n-1].beizhu);
printf("请输入要修改的项目:1姓名 2性别 3工资 4备注\n");
scanf("%s",key);
while(strlen(key)>1||key[0]<'1'||key[0]>'4')
{printf("输入错误,请重新输入!\n");
scanf("%s",key);}
fp=fopen("员工数据库.txt","w");
switch(key[0])
{
case '1':
printf("输入新的姓名:");
scanf("%s",yg[n-1].name);
break;
case '2':
printf("输入新的性别:");
scanf("%s",yg[n-1].sex);
break;
case '3':
printf("输入新的工资:");
scanf("%f",&yg[n-1].gz);
break;
case '4':
printf("输入新的备注:");
scanf("%s",yg[n-1].beizhu);
break;
}
for(i=0;i<number;i++)
{
fprintf(fp,"%d %s %s %f %s\n",yg[i].nub,yg[i].name,yg[i].sex,yg[i].gz,yg[i].beizhu);
}
fclose(fp);
}
void chazhao() //按关键字查找员工
{
int n,m,i,t=0;
float min,max;
printf("请选择查找类型:1工号 2姓名 3性别 4工资 5备注\n");
scanf("%s",key);
caidan(1,5);
n=caidan(1,5);
switch(n)
{
case 1:
printf("请输入要查找的工号:\n");
scanf("%s",key);
while(1)
{
m=1;
for(i=0;i<strlen(key);i++)
{
if(isdigit(key[i])==0)
{
m=0;
break;
}
}
if(m==0)
{
printf("输入错误,请输入数字,请重新输入:\n");
scanf("%s",key);
}
else
n=atoi(key);
break;
}
for(i=0;i<number;i++)
{
if(n==yg[i].nub)printf("%d\t%s\t%s\t%f\t%s\n",yg[i].nub,yg[i].name,yg[i].sex,yg[i].gz,yg[i].beizhu),t++;
}
if(t==0)printf("该工号不存在\n");
else printf("共找到%d位符合条件的员工\n",t);
break;
case 2:
printf("请输入要查找的姓名:\n");
scanf("%s",key);
for(i=0;i<number;i++)
{
if(!strcmp(key,yg[i].name))printf("%d\t%s\t%s\t%f\t%s\n",yg[i].nub,yg[i].name,yg[i].sex,yg[i].gz,yg[i].beizhu),t++;
}
if(t==0)printf("该姓名不存在\n");
else printf("共找到%d位符合条件的员工\n",t);
break;
case 3:
printf("请输入要查找的性别:\n");
scanf("%s",key);
for(i=0;i<number;i++)
{
if(!strcmp(key,yg[i].sex))printf("%d\t%s\t%s\t%f\t%s\n",yg[i].nub,yg[i].name,yg[i].sex,yg[i].gz,yg[i].beizhu),t++;
}
if(t==0)printf("该性别不存在\n");
else printf("共找到%d位符合条件的员工\n",t);
break;
case 4:
printf("请输入要查找的工资区间min~max:\n");
scanf("%f%f",&min,&max);
for(i=0;i<number;i++)
{
if(yg[i].gz>=min&&yg[i].gz<=max)printf("%d\t%s\t%s\t%f\t%s\n",yg[i].nub,yg[i].name,yg[i].sex,yg[i].gz,yg[i].beizhu),t++;
}
if(t==0)printf("该工资区间没有员工存在\n");
else printf("共找到%d位符合条件的员工\n",t);
break;
case 5:
printf("请输入要查找的备注信息:\n");
scanf("%s",key);
for(i=0;i<number;i++)
{
if(!strcmp(key,yg[i].beizhu))printf("%d\t%s\t%s\t%f\t%s\n",yg[i].nub,yg[i].name,yg[i].sex,yg[i].gz,yg[i].beizhu),t++;
}
if(t==0)printf("该备注信息不存在\n");
else printf("共找到%d位符合条件的员工\n",t);
break;
}
}
void paixu()
{
int n,m,i,j,min,max;
float min1,max1;
char mi[100];
printf("请选择排序字段:1工号 2姓名 3性别 4工资 5备注");
scanf("%s",key);
caidan(1,5);
n=caidan(1,5);
switch(n)
{
case 1:
printf("请选择:1正序 2倒序");
scanf("%s",key);
caidan(1,2);
if(caidan(1,2)==1)
{
for(i=0;i<number;i++)
{ min=yg[i].nub;
for(j=i;j<number;j++)
{
if(yg[j].nub<min)max=yg[j].nub,ls[0]=yg[j],yg[j]=yg[i],yg[i]=ls[0];
}
}
for(i=0;i<number;i++)
{
if(i==0)printf("工号\t姓名\t性别\t工资\t\t备注\n");
printf("%d\t%s\t%s\t%f\t%s\n",yg[i].nub,yg[i].name,yg[i].sex,yg[i].gz,yg[i].beizhu);
}
}
else
{
for(i=0;i<number;i++)
{ max=yg[i].nub;
for(j=i;j<number;j++)
{
if(yg[j].nub>max)max=yg[j].nub,ls[0]=yg[j],yg[j]=yg[i],yg[i]=ls[0];
}
}
for(i=0;i<number;i++)
{
if(i==0)printf("工号\t姓名\t性别\t工资\t\t备注\n");
printf("%d\t%s\t%s\t%f\t%s\n",yg[i].nub,yg[i].name,yg[i].sex,yg[i].gz,yg[i].beizhu);
}
}
break;
case 2:
printf("请选择:1正序 2倒序");
scanf("%s",key);
caidan(1,2);
if(caidan(1,2)==1)
{
for(i=0;i<number;i++)
{ strcpy(mi[100],yg[i].name);
for(j=i;j<number;j++)
{
if(strcmp(mi[100],yg[j].name)==-1)strcpy(mi[100],yg[j].name),ls[0]=yg[j],yg[j]=yg[i],yg[i]=ls[0];
}
}
for(i=0;i<number;i++)
{
if(i==0)printf("工号\t姓名\t性别\t工资\t\t备注\n");
printf("%d\t%s\t%s\t%f\t%s\n",yg[i].nub,yg[i].name,yg[i].sex,yg[i].gz,yg[i].beizhu);
}
}
else
{
for(i=0;i<number;i++)
{ strcpy(mi[100],yg[i].name);
for(j=i;j<number;j++)
{
if(strcmp(mi[100],yg[j].name)==1)strcpy(mi[100],yg[j].name),ls[0]=yg[j],yg[j]=yg[i],yg[i]=ls[0];
}
}
for(i=0;i<number;i++)
{
if(i==0)printf("工号\t姓名\t性别\t工资\t\t备注\n");
printf("%d\t%s\t%s\t%f\t%s\n",yg[i].nub,yg[i].name,yg[i].sex,yg[i].gz,yg[i].beizhu);
}
}
break;
case 3:
case 4:
printf("请选择:1正序 2倒序");
scanf("%s",key);
caidan(1,2);
if(caidan(1,2)==1)
{
for(i=0;i<number;i++)
{
min1=yg[i].gz;
for(j=i;j<number;j++)
{
if(yg[j].gz<min1)min1=yg[j].gz,ls[0]=yg[j],yg[j]=yg[i],yg[i]=ls[0];
}
}
}
else
{
for(i=0;i<number;i++)
{ max1=yg[i].gz;
for(j=i;j<number;j++)
{
if(yg[j].gz>max1)max1=yg[j].gz,ls[0]=yg[j],yg[j]=yg[i],yg[i]=ls[0];
}
}
}
for(i=0;i<number;i++)
{
if(i==0)printf("工号\t姓名\t性别\t工资\t\t备注\n");
printf("%d\t%s\t%s\t%f\t%s\n",yg[i].nub,yg[i].name,yg[i].sex,yg[i].gz,yg[i].beizhu);
}
break;
case 5:
break;
}
}
void main()
{
char key1[100];
zairu();
number=zairu();
printf("主菜单:1添加员工2查看员工列表3修改员工信息4查找员工5排序6退出程序\n");
scanf("%s",key);
caidan(1,6);
while(caidan(1,6)!=6)
{
switch(caidan(1,6))
{
case 1:
do{
add(number);
printf("添加员工成功,是否继续添加(y/n)\n");
scanf("%s",key1);
while(strlen(key1)>1||(key1[0]!='y'&&key1[0]!='n'))
{printf("输入错误,请重新输入!\n");
scanf("%s",key1);}
}while(key1[0]!='n');
break;
case 2:
chakan();
break;
case 3:
xiugai();
break;
case 4:
chazhao();
break;
case 5:
paixu();
break;
}
printf("主菜单:1添加员工2查看员工列表3修改员工信息4查找员工5排序6退出程序\n");
scanf("%s",key);
caidan(1,6);
}
}