EOJ 2896. 随机排序 个人错误分析
/*错误笔记
本题为程序设计实践的练习例题,虽然看了ppt来写的,但是仍然出现了问题,卡了大半天,因此写点啥做个记录
question:
____________________________________________________________________________________________________
随机排序EOJ 2896
给定一组以一个空格分隔的只含大小写字母的字符串。
与普通字典序不同,按照给定的字母顺序对这组字符串排序。
设两个字符串的字母不会完全相同。如:Hat、hat、HAt等不会同时出现。
例如:字母顺序为:
QWERTYUIOPASDFGHJKLZXCVBNM
一组字符串 :hat cat bat book bookworm Dallas Austin Houston fire firefox fumble
排序结果为:
Austin Dallas fumble fire firefox Houston hat cat book bookworm bat
Input :每组数据由2行组成:
第1行为字母顺序(26个大写字母);
第2行是需要排序的一组字符串(只含大小写字母,长度不大于20)。
数据不多于100组。需要排序的一组字符串中包含的字符串个数至少1个,至多100个。
Output :
对于每一组数据,输出排序后的字符串。字符串之间输出一个空格,最后一个字符串后面没有空格,而是输出一个换行符。
----------------------------------------------------------------------------------------------------
解题思路:
1、输入数据||利用while(scanf(...)!=EOF))实现连续输入
2、编写比较函数
int cmp(const void *a,const void *b);
3、调用qsort函数对字符串排序
4、输出
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.输入第一行为字母顺序,可以用一个字符数组和一个int数组,来实现对字母优先级的赋值,字母的实际顺序作为int组的角标
值为输入时的编号
p[str[i]-"A"]=i;
之后的句子要对字符串进行切割操作,利用空格判断,装入二维数组a[100][50]中,用count对单词标号
while(str[i]!=' '&&s[i]) a[count][j++]=str[i++]
然后在单词后加空格,str[i]为空则退出;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2.比较函数编写
因为使用qsort所以要编写,注意参数为const void *a,函数内要强制类型转换
while(*s1&&*s2)
{
ch1=(*s1)>='a'?*s1-32:*s1; //转换为大写字母
ch2=(*s2)>='a'?*s2-32:*s2; //转换为大写字母
if(p[ch1-'A']!=p[ch2-'A']) //按字母顺序表比较字母
return p[ch1-'A']-p[ch2-'A'];
else {s1++;s2++;}
}
其它问题为我个人出的问题了
首先,外层循环没套完,导致输入出错
其次,编写退出切割条件时出错if(!str[i]),没写[i],此处要让指向为空区域时退出,不可疏忽
再次,最后输出打印时,写成了int i,搞成了循环内的本地变量,导致循环外打印cout<<a[i]<<endl时,i值不对,打不出来
for (i = 0; i < count - 1; i++)
cout << a[i] << " ";
cout << a[i] << endl;*/
最后通过的代码,因为其他知识还没学到,所以只能用现在的思路写
#include <iostream> #include <algorithm> using namespace std; int p[26]; int cmp(const void *a, const void *b) { char *s1 = (char *)a; char *s2 = (char *)b; char ch1, ch2; while (*s1 && *s2) { ch1 = (*s1) >= 'a' ? *s1 - 32 : *s1; ch2 = (*s2) >= 'a' ? *s2 - 32 : *s2; if (p[ch1 - 'A'] != p[ch2 - 'A']) return p[ch1 - 'A'] - p[ch2 - 'A']; else { s1++; s2++; } } if (*s1 == 0) return -1; else return 1; } int main() { char s[27]; int i, count, j; while (scanf("%s\n", s) != EOF) { for (i = 0; i < 26; i++) p[s[i] - 'A'] = i; char str[2100]; char a[100][50]; gets(str); count = 0; i = 0; while (1) { j = 0; while (str[i] != ' ' && str[i]) a[count][j++] = str[i++]; a[count][j] = '\0'; count++; if (!str[i]) break; else i++; } qsort(a, count, sizeof(a[0]), cmp); for (i = 0; i < count - 1; i++) cout << a[i] << " "; cout << a[i] << endl; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?