鱼C论坛

 找回密码
 立即注册
查看: 2407|回复: 14

[已解决]求助,中文姓名按照字典排序

[复制链接]
发表于 2022-10-8 15:39:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
学校的大作业就是学生管理系统其中,排序功能不太会写,要求把学生的中文姓名的第一个字(姓)按照拼音排序。
不太懂该怎么去实现这个排序的过程。
最佳答案
2022-10-8 22:04:11
本帖最后由 桃花飞舞 于 2022-10-8 22:38 编辑
tj_1 发表于 2022-10-8 21:19
我这个代码太多了不好发,具体来说就是我定义了一个结构体数组,
typedef struct Score
{


不能发图,
第一:你把测试结果,和排序代码 发出来。是要下来这样的效果么或者楼上python的代码的效果?别人代码是这样的效果,你把效果图截图出来要求么发出来,或者复制出来,我看看。从上到下是按a-z的顺序排列的,我觉的是拼音顺序了。
第二:这个思路实现的是下面的效果。你把你的排序的函数和结果发出来?又没说你要全部发,能找出问题就行了。

--这个链表中有7个学生--


记录  学号   姓  名       语文      数学      英语  总  分   平均分
    6   105      高山    92.00     76.00     81.00   249.00   83.00

记录  学号   姓  名       语文      数学      英语  总  分   平均分
    7  1006    刘亦菲    89.00     98.00     92.00   279.00   93.00

记录  学号   姓  名       语文      数学      英语  总  分   平均分
    8   102  青出于蓝    89.00     96.00     75.00   260.00   86.67

记录  学号   姓  名       语文      数学      英语  总  分   平均分
    9  1004      王五   100.00     89.00     99.00   288.00   96.00

记录  学号   姓  名       语文      数学      英语  总  分   平均分
   10   104    小甲鱼    85.00     86.00     78.00   249.00   83.00

记录  学号   姓  名       语文      数学      英语  总  分   平均分
   11   101  小凯2013    56.00     96.00     52.00   204.00   68.00

记录  学号   姓  名       语文      数学      英语  总  分   平均分
   12  1008      张三    89.00     98.00     23.00   210.00   70.00

-----成功保存信息!-----
请按任意键继续. . .

下面是我百度出来的排序,你改成函数就可以了
#include <stdio.h>
#include <string.h>
int main()
{
        char a[5][20],t[20];
        int i,j;
        printf("请输入五个的名字:\n");
        for(i=0;i<5;i++)
        {
                scanf("%s",a[i]);
        }
        for(i=0;i<4;i++)
        {
                for(j=i+1;j<5;j++)
                {
                        if(strcmp(a[j],a[i])>0)
                        {
                                strcpy(t,a[i]);
                                strcpy(a[i],a[j]);
                                strcpy(a[j],t);
                        }
                }
        }
        printf("\n姓名排序后为:");
        for(i=0;i<5;i++)
        {
        printf("%s\n",a[i]);        
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-8 15:49:49 | 显示全部楼层
>>> a = ["青出于蓝","twilight6","小甲鱼","不二如是","高山","小凯2013"]
>>> a.sort()
>>> a
['twilight6', '不二如是', '小凯2013', '小甲鱼', '青出于蓝', '高山']

不会 C语言,送上一段 python 代码参考
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-8 15:57:40 | 显示全部楼层
asky533 发表于 2022-10-8 15:49
不会 C语言,送上一段 python 代码参考

        你这个大作业的关键点是通过汉字得到其汉语拼音,应该有现成的代码库。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-8 17:15:05 | 显示全部楼层
本帖最后由 桃花飞舞 于 2022-10-8 17:24 编辑

你用 冒泡排序来做排序,strcmp(,);函数比较姓名先后,if(strcmp() > 0)冒泡排序里的判断条件, strcmp()函数交换姓名, 或者整体交换,姓名、学号、成绩, 就按冒泡排序里的交换方法 不行么 ? 你要不把具体要求写出来?我来做题?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-8 17:52:16 | 显示全部楼层
桃花飞舞 发表于 2022-10-8 17:15
你用 冒泡排序来做排序,strcmp(,);函数比较姓名先后,if(strcmp() > 0)冒泡排序里的判断条件, strcmp() ...

谢谢啊!
我试了一下,可以使用strcmp()函数比较,但比较结果不符合拼音排序的要求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-8 17:52:52 | 显示全部楼层
asky533 发表于 2022-10-8 15:49
不会 C语言,送上一段 python 代码参考

感谢.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-8 20:39:26 | 显示全部楼层
tj_1 发表于 2022-10-8 17:52
谢谢啊!
我试了一下,可以使用strcmp()函数比较,但比较结果不符合拼音排序的要求。


怎么用的?你把代码发我试下?我看别人排序就是这样的,是可以的,https://fishc.com.cn/thread-173037-1-1.html 你看下这个的排序,就是用strcmp()是符合拼音顺序的排序要求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-8 21:19:15 | 显示全部楼层
桃花飞舞 发表于 2022-10-8 20:39
怎么用的?你把代码发我试下?我看别人排序就是这样的,是可以的,https://fishc.com.cn/thread-173037 ...

我这个代码太多了不好发,具体来说就是我定义了一个结构体数组,
typedef struct Score
{
    unsigned long id;
    char name[15];
    char gender[3];                           //定义变量gender[3]用来存放学生的性别
    int score[ncourses];                     //score表示学生课程成绩
    char grade;                              //grade表示课程的等级
    int sum;                                 //存放总成绩
}Student;
Student student[30];
用来存放学生的信息,其中的name数组存放姓名,例如"张三","李四".
然后设计了一个按各个字段排序的功能,分数和学号都好排序用的qsort()函数,问题在于姓名它是中文字符按照拼音顺序排的话就不知道用什么方法了。
为什么我说strcmp()不行,因为我用几个姓名作测试发现排序结果和拼音顺序不一样,所以我说不符合要求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-8 22:02:53 | 显示全部楼层
本帖最后由 桃花飞舞 于 2022-10-8 22:04 编辑

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-8 22:04:11 | 显示全部楼层    本楼为最佳答案   
本帖最后由 桃花飞舞 于 2022-10-8 22:38 编辑
tj_1 发表于 2022-10-8 21:19
我这个代码太多了不好发,具体来说就是我定义了一个结构体数组,
typedef struct Score
{


不能发图,
第一:你把测试结果,和排序代码 发出来。是要下来这样的效果么或者楼上python的代码的效果?别人代码是这样的效果,你把效果图截图出来要求么发出来,或者复制出来,我看看。从上到下是按a-z的顺序排列的,我觉的是拼音顺序了。
第二:这个思路实现的是下面的效果。你把你的排序的函数和结果发出来?又没说你要全部发,能找出问题就行了。

--这个链表中有7个学生--


记录  学号   姓  名       语文      数学      英语  总  分   平均分
    6   105      高山    92.00     76.00     81.00   249.00   83.00

记录  学号   姓  名       语文      数学      英语  总  分   平均分
    7  1006    刘亦菲    89.00     98.00     92.00   279.00   93.00

记录  学号   姓  名       语文      数学      英语  总  分   平均分
    8   102  青出于蓝    89.00     96.00     75.00   260.00   86.67

记录  学号   姓  名       语文      数学      英语  总  分   平均分
    9  1004      王五   100.00     89.00     99.00   288.00   96.00

记录  学号   姓  名       语文      数学      英语  总  分   平均分
   10   104    小甲鱼    85.00     86.00     78.00   249.00   83.00

记录  学号   姓  名       语文      数学      英语  总  分   平均分
   11   101  小凯2013    56.00     96.00     52.00   204.00   68.00

记录  学号   姓  名       语文      数学      英语  总  分   平均分
   12  1008      张三    89.00     98.00     23.00   210.00   70.00

-----成功保存信息!-----
请按任意键继续. . .

下面是我百度出来的排序,你改成函数就可以了
#include <stdio.h>
#include <string.h>
int main()
{
        char a[5][20],t[20];
        int i,j;
        printf("请输入五个的名字:\n");
        for(i=0;i<5;i++)
        {
                scanf("%s",a[i]);
        }
        for(i=0;i<4;i++)
        {
                for(j=i+1;j<5;j++)
                {
                        if(strcmp(a[j],a[i])>0)
                        {
                                strcpy(t,a[i]);
                                strcpy(a[i],a[j]);
                                strcpy(a[j],t);
                        }
                }
        }
        printf("\n姓名排序后为:");
        for(i=0;i<5;i++)
        {
        printf("%s\n",a[i]);        
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-8 22:48:36 | 显示全部楼层
桃花飞舞 发表于 2022-10-8 22:04
不能发图,
第一:你把测试结果,和排序代码 发出来。是要下来这样的效果么或者楼上python的代 ...

这个结果就符合要求了,姓名确实是按字典顺序了。
我自己的问题,我没有直接使用结构体数组中的name进行比较,而是另外写了一个数组预先写了一些A~z的中文字符用strcmp()进行测试,发现存在A以后的中文字符比A大的情况,同时也存在比A小的情况.
结合我之前查的资料告诉我,用strcmp()比较中文字符是按GB2312比较的大小,然后也一直没有找到汉字排序的例子,所以我的出的结论是用strcmp()比较中文字符的出的结果不是按照拼音排序的.
受教了,目前还在学习过程中掌握的东西太少,感谢大佬指点。
这个排序的代码可以发一下吗?我想研究一下


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-8 23:03:50 | 显示全部楼层
桃花飞舞 发表于 2022-10-8 22:04
不能发图,
第一:你把测试结果,和排序代码 发出来。是要下来这样的效果么或者楼上python的代 ...

ok,看见了。
感谢细心解答,感激不尽。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-8 23:35:07 | 显示全部楼层
本帖最后由 阿奇_o 于 2022-10-8 23:39 编辑
tj_1 发表于 2022-10-8 21:19
我这个代码太多了不好发,具体来说就是我定义了一个结构体数组,
typedef struct Score
{


要搞拼音。。还是挺复杂的。。
对Python比较熟,对C不熟(小白),我研究了大概一个小时,似乎没有现成的转拼音的库可以使用。但,
倒是Python, Go,C++,等都有相关的拼音转换库。。 所以我研究了一下,其实就是要有一个 pinyin.txt 拼音数据文件,每个字都有其对应的拼音。该数据见:https://github.com/mozillazg/pinyin-data
所以,我的思路是:
     用C从pinyin.txt里查找出学生姓名的拼音,然后就可以用 strcmp(s1_pinyin, s2_pinyin) 来做比较了(已经验证过了)。
     但因我对C不熟,只是用 Linux的Bash命令来 简单验证一下:
   
# Bash
$ cat pinyin-data/pinyin.txt |grep 张 |awk '{print $2}'
zhāng
$ cat pinyin-data/pinyin.txt |grep 李 |awk '{print $2}'
lǐ

# C
    if (strcmp("zhāng", "lǐ") > 0) {
        printf("str1 > str2 \n");
    }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-8 23:42:06 | 显示全部楼层
桃花飞舞 发表于 2022-10-8 22:04
不能发图,
第一:你把测试结果,和排序代码 发出来。是要下来这样的效果么或者楼上python的代 ...

好了,我知道原因了。编译器问题,百度的这段代码我再之前的IDE上运行,顺序还是不对。我换了一个IDE就是按拼音排的了,神奇。
再次感谢,百忙之中抽空解答。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-8 23:58:24 | 显示全部楼层
tj_1 发表于 2022-10-8 23:42
好了,我知道原因了。编译器问题,百度的这段代码我再之前的IDE上运行,顺序还是不对。我换了一个IDE就是 ...

哦,是这样,我没研究那么深入,GB2312编码我也了解的不多,也不知道是不是可以直接比较汉字,我没写过比较汉字的拼音顺序的函数,你有兴趣可以搞清楚它的原理写一个按字典比较汉字顺序的函数,我用的code block 的IDE ,就单纯的试了一下,再不行就按楼上的思路,先找出学生姓名对应的拼音字符串,再用strcmp()比较拼音字符串。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 13:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表