| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 478 人关注过本帖
标题:中文排序问题求指教
只看楼主 加入收藏
q0224100404
Rank: 2
等 级:论坛游民
帖 子:25
专家分:10
注 册:2015-11-24
结帖率:37.5%
收藏
已结贴  问题点数:20 回复次数:5 
中文排序问题求指教
学习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);
    }
}
搜索更多相关主题的帖子: 结构体 include number C语言 中文 
2015-12-06 15:50
q0224100404
Rank: 2
等 级:论坛游民
帖 子:25
专家分:10
注 册:2015-11-24
收藏
得分:0 
呵呵,半天没人回复,还好我自己改对了
2015-12-06 17:08
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
汉字也能排序啊?不懂
2015-12-06 18:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用ehszt在2015-12-6 18:12:15的发言:

汉字也能排序啊?不懂

你为什么觉得汉字不能排序?

授人以渔,不授人以鱼。
2015-12-06 19:55
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
以下是引用TonyDeng在2015-12-6 19:55:15的发言:


你为什么觉得汉字不能排序?

不明白汉字的编码方式,不能确定strcmp是否对汉字有效。
2015-12-06 21:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
一样,有效。

授人以渔,不授人以鱼。
2015-12-06 21:26
快速回复:中文排序问题求指教
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030578 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved