课后自主练习(排序)1021. 随机排序 medium《编程思维与实践》个人学习笔记

题目

在这里插入图片描述
在这里插入图片描述
输入
QWERTYUIOPASDFGHJKLZXCVBNM
hat cat bat book bookworm Dallas Austin Houston fire firefox fumble
QWERTYUIOPASDFGHJKLZXCVBNM
How are you
QAZWSXEDCRFVTGBYHNUJMIKOLP
How are you
ABCDEFGHIJKLMNOPQRSTUVWXYZ
How are you

思路

①输入问题:
首先没有给问题数量所以只能用while循环来解决,而且判定结束的条件是EOF,同时有 /n " " EOF 三个方面需要特殊考虑,所以最好使用getchar()函数来逐个处理并判断
②排序的标准:
这里的话看到输出点的要求排序是小写字母>大写字母
比如AB的顺序对应的就是A < a < B < b,所以可以使用字母表对应的方法来放逐渐增大的数值,前面的数值都相同的话就比较字符串长度,长度大的在后方。

代码

#include<iostream>
#include<cstring>

using namespace std;
int alpha[130];
struct s
{
    char str[100];
    s()
    {
        for(int i = 0; i < 100; i++)
        {str[i] = 0;}//初始化一下避免出现乱码
    }
};


int cmp(const void* q1, const void* q2)
{
    s * p1 = (s *) q1;
    s * p2 = (s *) q2;
    int len1 = strlen(p1->str);
    int len2 = strlen(p2->str);
    int len = (len1 > len2) ? len1 : len2;
    for(int i = 0; i < len; i++)
    {
        if(p1->str[i] != p2->str[i])
            return (alpha[p1->str[i]] - alpha[p2->str[i]]);
    }
    return(len1 - len2);
}


int main()
{
    char c = getchar();
    while(c != EOF)
    {
        //放
        s str[100];
        for(int i = 0; i < 52; i += 2)
        {
            alpha[c] = i;
            alpha[c + 'a' - 'A'] = i + 1;
            c = getchar();
            
        }
        
        
        c = getchar();
        
        
        int n = 0;
        int n_len = 0;
        while(c != '\n' && c != EOF)
        {   
            if(c == ' ')
            {
                c = getchar();
                n++;
                n_len = 0;
                continue;
            }
            if(c == '\n' || c == EOF)
            {
                continue;
            }

            str[n].str[n_len++] = c;
            c = getchar();//最后一个是/n或者eof
        }
        n++;//注意+1哦
        //排序
        qsort(str,n,sizeof(s),cmp);

        //输出
        for(int i = 0; i < n - 1; i++)
        {
            cout << str[i].str << " ";
        }
        cout << str[n - 1].str << endl;
        
        if(c == '\n')
        c = getchar();//注意+1哦

    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值