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<#include
#include
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;
}
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<#include