求助,中文姓名按照字典排序
学校的大作业就是学生管理系统其中,排序功能不太会写,要求把学生的中文姓名的第一个字(姓)按照拼音排序。不太懂该怎么去实现这个排序的过程。 >>> a = ["青出于蓝","twilight6","小甲鱼","不二如是","高山","小凯2013"]
>>> a.sort()
>>> a
['twilight6', '不二如是', '小凯2013', '小甲鱼', '青出于蓝', '高山']
不会 C语言,送上一段 python 代码参考
asky533 发表于 2022-10-8 15:49
不会 C语言,送上一段 python 代码参考
你这个大作业的关键点是通过汉字得到其汉语拼音,应该有现成的代码库。 本帖最后由 桃花飞舞 于 2022-10-8 17:24 编辑
你用 冒泡排序来做排序,strcmp(,);函数比较姓名先后,if(strcmp() > 0)冒泡排序里的判断条件, strcmp()函数交换姓名, 或者整体交换,姓名、学号、成绩, 就按冒泡排序里的交换方法 不行么 ? 你要不把具体要求写出来?我来做题? 桃花飞舞 发表于 2022-10-8 17:15
你用 冒泡排序来做排序,strcmp(,);函数比较姓名先后,if(strcmp() > 0)冒泡排序里的判断条件, strcmp() ...
谢谢啊!
我试了一下,可以使用strcmp()函数比较,但比较结果不符合拼音排序的要求。 asky533 发表于 2022-10-8 15:49
不会 C语言,送上一段 python 代码参考
感谢. tj_1 发表于 2022-10-8 17:52
谢谢啊!
我试了一下,可以使用strcmp()函数比较,但比较结果不符合拼音排序的要求。
怎么用的?你把代码发我试下?我看别人排序就是这样的,是可以的,https://fishc.com.cn/thread-173037-1-1.html 你看下这个的排序,就是用strcmp()是符合拼音顺序的排序要求 桃花飞舞 发表于 2022-10-8 20:39
怎么用的?你把代码发我试下?我看别人排序就是这样的,是可以的,https://fishc.com.cn/thread-173037 ...
我这个代码太多了不好发,具体来说就是我定义了一个结构体数组,
typedef struct Score
{
unsigned long id;
char name;
char gender; //定义变量gender用来存放学生的性别
int score; //score表示学生课程成绩
char grade; //grade表示课程的等级
int sum; //存放总成绩
}Student;
Student student;
用来存放学生的信息,其中的name数组存放姓名,例如"张三","李四".
然后设计了一个按各个字段排序的功能,分数和学号都好排序用的qsort()函数,问题在于姓名它是中文字符按照拼音顺序排的话就不知道用什么方法了。
为什么我说strcmp()不行,因为我用几个姓名作测试发现排序结果和拼音顺序不一样,所以我说不符合要求。 本帖最后由 桃花飞舞 于 2022-10-8 22:04 编辑
。 本帖最后由 桃花飞舞 于 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
记录学号 姓名 语文 数学 英语总分 平均分
71006 刘亦菲 89.00 98.00 92.00 279.00 93.00
记录学号 姓名 语文 数学 英语总分 平均分
8 102青出于蓝 89.00 96.00 75.00 260.00 86.67
记录学号 姓名 语文 数学 英语总分 平均分
91004 王五 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
记录学号 姓名 语文 数学 英语总分 平均分
121008 张三 89.00 98.00 23.00 210.00 70.00
-----成功保存信息!-----
请按任意键继续. . .
下面是我百度出来的排序,你改成函数就可以了
#include <stdio.h>
#include <string.h>
int main()
{
char a,t;
int i,j;
printf("请输入五个的名字:\n");
for(i=0;i<5;i++)
{
scanf("%s",a);
}
for(i=0;i<4;i++)
{
for(j=i+1;j<5;j++)
{
if(strcmp(a,a)>0)
{
strcpy(t,a);
strcpy(a,a);
strcpy(a,t);
}
}
}
printf("\n姓名排序后为:");
for(i=0;i<5;i++)
{
printf("%s\n",a);
}
return 0;
}
桃花飞舞 发表于 2022-10-8 22:04
不能发图,
第一:你把测试结果,和排序代码 发出来。是要下来这样的效果么或者楼上python的代 ...
这个结果就符合要求了,姓名确实是按字典顺序了。
我自己的问题,我没有直接使用结构体数组中的name进行比较,而是另外写了一个数组预先写了一些A~z的中文字符用strcmp()进行测试,发现存在A以后的中文字符比A大的情况,同时也存在比A小的情况.
结合我之前查的资料告诉我,用strcmp()比较中文字符是按GB2312比较的大小,然后也一直没有找到汉字排序的例子,所以我的出的结论是用strcmp()比较中文字符的出的结果不是按照拼音排序的.
受教了,目前还在学习过程中掌握的东西太少,感谢大佬指点。
这个排序的代码可以发一下吗?我想研究一下
桃花飞舞 发表于 2022-10-8 22:04
不能发图,
第一:你把测试结果,和排序代码 发出来。是要下来这样的效果么或者楼上python的代 ...
ok,看见了。
感谢细心解答,感激不尽。{:5_109:} 本帖最后由 阿奇_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");
}
桃花飞舞 发表于 2022-10-8 22:04
不能发图,
第一:你把测试结果,和排序代码 发出来。是要下来这样的效果么或者楼上python的代 ...
好了,我知道原因了。编译器问题,百度的这段代码我再之前的IDE上运行,顺序还是不对。我换了一个IDE就是按拼音排的了,神奇。
再次感谢,百忙之中抽空解答。 tj_1 发表于 2022-10-8 23:42
好了,我知道原因了。编译器问题,百度的这段代码我再之前的IDE上运行,顺序还是不对。我换了一个IDE就是 ...
哦,是这样,我没研究那么深入,GB2312编码我也了解的不多,也不知道是不是可以直接比较汉字,我没写过比较汉字的拼音顺序的函数,你有兴趣可以搞清楚它的原理写一个按字典比较汉字顺序的函数,我用的code block 的IDE ,就单纯的试了一下,再不行就按楼上的思路,先找出学生姓名对应的拼音字符串,再用strcmp()比较拼音字符串。
页:
[1]