C语言中中文排序的问题请教!

Python09

C语言中中文排序的问题请教!,第1张

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<ctype.h>

int number

char key[100]

const char * ErrorInputInfo = "输入错误,请重新输入:"

int caidan(int a, int b, const char * str = ErrorInputInfo)

{

    int n, m, i, len

    while(1)

    {    

        m = 1

len = strlen(key)

        for(i = 0 i < len 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("%s\n", str)

scanf("%s", key)

}

            else break

        }

    }

    return n

}

struct worker  /*定义员工结构体*/

{

    int   nub

    char  name[20]

    char  sex[8]

    float gz

    char  beizhu[10]

} yg[100], ls

void add()  // 添加员工

{

    FILE *fp

    printf("请输入员工信息:姓名,性别,工资,备注,工号将自动生成\n")

    scanf("%s %s %f %s", yg[number].name, yg[number].sex, &yg[number].gz, yg[number].beizhu)

    yg[number].nub = number + 1

    fp = fopen("员工数据库.txt","a+")

if(fp)

{

fprintf(fp, "%d\t%s\t%s\t%f\t%s\n", yg[number].nub, yg[number].name, yg[number].sex, yg[number].gz, yg[number].beizhu)

fclose(fp)

++number

}

else

{

printf("打开文件错误,添加记录失败!\n")

}

}

int zairu()    // 载入历史数据

{

int i

FILE *fp = fopen("员工数据库.txt", "r")

if(fp)

{

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)

--i

printf("成功读取%d条记录!\n", i)

return i

}

else

{

printf("打开文件错误,读取失败!\n")

return 0

}

}

void chakan(int n = 500)  //查看员工列表

{   

    int i

if(0 > n || n > number)

{

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 printf("%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)

}

void baocun()

{

int i

    FILE * fp = fopen("员工数据库.txt", "w")

if(fp)

{

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)

}

else printf("打开文件错误!保存文件失败!\n")

}

void xiugai()   //修改员工信息

{

    int n, m

    printf("请输入要修改的员工工号 : ")

    scanf("%s", key)

n = caidan(1, number, "员工工号不存在,请重新输入:") - 1

    chakan(n)

    printf("请输入要修改的项目:1姓名 2性别 3工资 4备注 : ")

    scanf("%s", key)

m = caidan(1, 4)

    switch(m)

    {

    case 1:

        printf("输入新的姓名:")

        scanf("%s", yg[n].name)

break

    case 2:

        printf("输入新的性别:")

        scanf("%s", yg[n].sex)

break

    case 3:

        printf("输入新的工资:")

        scanf("%f", &yg[n].gz)

break

    case 4:

        printf("输入新的备注:")

        scanf("%s", yg[n].beizhu)

break

    }

baocun()

}

void chazhao()  //按关键字查找员工

{

    int n, m, i, t=0

    float min,max

    printf("请选择查找类型:1工号 2姓名 3性别 4工资 5备注\n")

    scanf("%s",key)

    n = caidan(1,5)

    switch(n)

    {

    case 1:

        printf("请输入要查找的工号:\n")

        scanf("%s",key)

m = caidan(0, 100, "员工号应小于100,请重新输入:")

        for(i = 0 i < number i++)

        {

            if(m == yg[i].nub)

{

chakan(i)

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))

{

chakan(i)

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))

{

chakan(i)

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)

{

chakan(i)

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))

{

chakan(i)

t++

}

        }

        if(t == 0) printf("该备注信息不存在\n")

        else printf("共找到%d位符合条件的员工\n", t)

        break

    }

}

#define SORT(X) do{for(i=0 i<numberi++){pos=ifor(j=i+1j<numberj++)if(##X##)pos = jif(pos!=i)ls=yg[pos],yg[pos]=yg[i],yg[i]=ls}}while(0)

void paixu()

{

    int n, m, i, j, pos

    printf("请选择排序字段:1工号 2姓名 3性别 4工资 5备注 : ")

    scanf("%s",key)

    n = caidan(1,5)

    switch(n)

    {

    case 1:

        printf("请选择:1正序 2倒序 : ")

        scanf("%s", key)

m = caidan(1, 2)

        if(m == 1) SORT(yg[pos].nub > yg[j].nub)

        else SORT(yg[pos].nub < yg[j].nub)

        break

    case 2:

printf("请选择:1正序 2倒序 : ")

        scanf("%s", key)

        m = caidan(1, 2)

        if(m == 1) SORT(strcmp(yg[pos].name, yg[j].name) == 1)

        else SORT(strcmp(yg[pos].name, yg[j].name) == -1)

        break

    case 3:

break

    case 4:

        printf("请选择:1正序 2倒序 : ")

        scanf("%s", key)

        m = caidan(1, 2)

        if(m == 1) SORT(yg[pos].gz > yg[j].gz)

        else SORT(yg[pos].gz < yg[j].gz)

        break

    case 5:

        break

    }

chakan()

}

void main()

{   

    char key1[100]

int m = 0

    number = zairu()

    while(m != 6)

    {

printf("主菜单:1添加员工 2查看员工列表 3修改员工信息 4查找员工 5排序 6退出程序\n")

scanf("%s",key)

m = caidan(1, 6)

        switch(m)

        {

        case 1:

            do

{

add()

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

        }

    }

}

字典是按照拼音排序的,没有现成的拼音排序功能。

你可以自己做键值表对应啊。就是做数据,把百家姓和其拼音组合对应的表,可以用文件存储,也 可以用数据库存储,或者干脆直接写在代码了,用结构数组或链表加载。

然后需要排序的时候,直接用结构数组或链表排序啊。

如果你除了姓,连名字都要算在排序中,那你得把整个汉字字典的文字都做成键值表,别人起名字用什么字,谁能知道。那你这就纯粹是数据问题了。

我刚才试了一下百度搜索,百度文库里有现成的汉字拼音对照表,你可以试试,全不全我就不知道了。

1、冒泡排序(最常用)

冒泡排序是最简单的排序方法:原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。(注意每一轮都是从a[0]开始比较的)

以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。

2、鸡尾酒排序

鸡尾酒排序又称双向冒泡排序、鸡尾酒搅拌排序、搅拌排序、涟漪排序、来回排序或快乐小时排序, 是冒泡排序的一种变形。该算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。

原理:数组中的数字本是无规律的排放,先找到最小的数字,把他放到第一位,然后找到最大的数字放到最后一位。然后再找到第二小的数字放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。

3、选择排序

思路是设有10个元素a[1]-a[10],将a[1]与a[2]-a[10]比较,若a[1]比a[2]-a[10]都小,则不进行交换。若a[2]-a[10]中有一个以上比a[1]小,则将其中最大的一个与a[1]交换,此时a[1]就存放了10个数中最小的一个。同理,第二轮拿a[2]与a[3]-a[10]比较,a[2]存放a[2]-a[10]中最小的数,以此类推。

4、插入排序

插入排序是在一个已经有序的小序列的基础上,一次插入一个元素*

一般来说,插入排序都采用in-place在数组上实现。

具体算法描述如下:

⒈ 从第一个元素开始,该元素可以认为已经被排序

⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描

⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置

⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

⒌ 将新元素插入到下一位置中

⒍ 重复步骤2~5