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;
}
复制代码

 

posted @   渣渣纸  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示