鱼C论坛

 找回密码
 立即注册
查看: 4035|回复: 33

[已解决]这道题没做过不会啊兄弟们,帮帮我(c语言)

[复制链接]
发表于 2022-10-20 10:48:31 | 显示全部楼层 |阅读模式
10鱼币
(用c语言)从键盘输入一个字符串(不含空格,长度小于1000),字符串里只包含大写字母,小写字母和0-9数字字符,现在
需要将其中的大写字母、0-9数字字符和小写字符按照升序排序后输出。输出顺序为:排序后的大写字母,排序后
的0-9数字,排序后的小写字母。
输入数据有多组!
(注意:提取的字符组成新的字符串后末尾要加'\0')
样例输入:
aaadc3429AFD
123ABCabc2
样例输出:
ADF2349aaacd
ABC1223abc
最佳答案
2022-10-20 10:48:32
本帖最后由 jackz007 于 2022-10-20 21:42 编辑
#include <stdio.h>

void swap(char * a , char * b)
{
        char t                                                                                                                ;
        t = * a ; * a = * b ; * b = t                                                                                         ;
}

int main(void)
{
        char ch , s[100][1000]                                                                                                ;
        int i , j , k , m , n                                                                                                 ;
        for(n = 0 , m = 1 ; m ; n ++) {
                gets(s[n])                                                                                                    ;
                for(m = 0 ; s[n][m] ; m ++) {
                        if(s[n][m] >= 'a' && s[n][m] <= 'z') s[n][m] += 4                                                     ;
                        else if(s[n][m] >= '0' && s[n][m] <= '9') s[n][m] += 43                                               ;
                }
                for(i = 0 ; i < m - 1 ; i ++) for(j = i + 1 ; j < m ; j ++) if(s[n][i] > s[n][j]) swap(& s[n][i] , & s[n][j]) ;
                for(i = 0 ; i < m ; i ++) {
                        if(s[n][i] >= 'a' + 4) s[n][i] -= 4                                                                   ;
                        else if(s[n][i] > 'Z' && s[n][i] < 'a' + 4) s[n][i] -= 43                                             ;
                }
        }
        for(i = 0 ; i < n ; i ++) printf("%s\n" , s[i])                                                                       ;
}
        编译、运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

aaadc3429AFD
123ABCabc2

ADF2349aaacd
ABC1223abc

D:\[00.Exerciese.2022]\C>

最佳答案

查看完整内容

编译、运行实况:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 10:48:32 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-10-20 21:42 编辑
#include <stdio.h>

void swap(char * a , char * b)
{
        char t                                                                                                                ;
        t = * a ; * a = * b ; * b = t                                                                                         ;
}

int main(void)
{
        char ch , s[100][1000]                                                                                                ;
        int i , j , k , m , n                                                                                                 ;
        for(n = 0 , m = 1 ; m ; n ++) {
                gets(s[n])                                                                                                    ;
                for(m = 0 ; s[n][m] ; m ++) {
                        if(s[n][m] >= 'a' && s[n][m] <= 'z') s[n][m] += 4                                                     ;
                        else if(s[n][m] >= '0' && s[n][m] <= '9') s[n][m] += 43                                               ;
                }
                for(i = 0 ; i < m - 1 ; i ++) for(j = i + 1 ; j < m ; j ++) if(s[n][i] > s[n][j]) swap(& s[n][i] , & s[n][j]) ;
                for(i = 0 ; i < m ; i ++) {
                        if(s[n][i] >= 'a' + 4) s[n][i] -= 4                                                                   ;
                        else if(s[n][i] > 'Z' && s[n][i] < 'a' + 4) s[n][i] -= 43                                             ;
                }
        }
        for(i = 0 ; i < n ; i ++) printf("%s\n" , s[i])                                                                       ;
}
        编译、运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

aaadc3429AFD
123ABCabc2

ADF2349aaacd
ABC1223abc

D:\[00.Exerciese.2022]\C>

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
竹逸 + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 11:04:36 | 显示全部楼层
本帖最后由 jhq999 于 2022-10-20 11:08 编辑
int  main( )
{
    char str[26+10+26][2]={0},ch=0;
    int len=0;
    while((ch=getchar())!='\n')
    {
        if(ch>='A'&&ch<='Z')
        {
            str[ch-'A'][0]+=1;
            str[ch-'A'][1]=ch;
        }
        else if(ch>='0'&&ch<='9')
        {
           str[ch-'0'+26][0]+=1;
           str[ch-'0'+26][1]=ch;
        }
        else
        {
            str[ch-'a'+36][0]+=1;
            str[ch-'a'+36][1]=ch;
        }
        len+=1;
    }
    char s[len+1];
    for(int i=0,k=0;i<62;i+=1)
    {
        for(int j=0;j<str[i][0];j+=1)
        {
            s[k++]=str[i][1];
        }
    }
    s[len]='\0';
    printf("%s",s);
    return 0;
}
aaadc3429AFD
ADF2349aaacd
Process returned 0 (0x0)   execution time : 1.693 s
Press any key to continue.

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
竹逸 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 11:17:25 | 显示全部楼层
我就很烦这种题目
输入输出没问题就行了,你还要求我怎么写程序么
需要把输出数据转为字符串然后一并输出吗?
#include <stdio.h>

int output_line(void) {
    size_t chars[256] = {0};
    while(1) {
        int ch = getchar();
        if(ch == EOF) return EOF;
        if(ch == '\n') break;
        ++chars[ch];
    }
    for(size_t i = 'A'; i <= 'Z'; ++i) {
        while(chars[i]--) putchar(i);
    }
    for(size_t i = '0'; i <= '9'; ++i) {
        while(chars[i]--) putchar(i);
    }
    for(size_t i = 'a'; i <= 'z'; ++i) {
        while(chars[i]--) putchar(i);
    }
    putchar('\n');
    return 0;
}

int main(void) {
    while(output_line() != EOF);
}

#include <stdio.h>

int output_line(void) {
    size_t chars[256] = {0};
    size_t count = 0;
    while(1) {
        int ch = getchar();
        if(ch == EOF) return EOF;
        if(ch == '\n') break;
        ++chars[ch]; ++count;
    }
    char str[count + 1]; str[count] = '\0';
    char *p = str;
    for(size_t i = 'A'; i <= 'Z'; ++i) {
        while(chars[i]--) *p++ = i;
    }
    for(size_t i = '0'; i <= '9'; ++i) {
        while(chars[i]--) *p++ = i;
    }
    for(size_t i = 'a'; i <= 'z'; ++i) {
        while(chars[i]--) *p++ = i;
    }
    printf("%s\n", str);
    return 0;
}

int main(void) {
    while(output_line() != EOF);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 11:21:33 | 显示全部楼层
忘了加return 0; 了
$ cat main.c{,~}
#include <stdio.h>

int output_line(void) {
    size_t chars[256] = {0};
    size_t count = 0;
    while(1) {
        int ch = getchar();
        if(ch == EOF) return EOF;
        if(ch == '\n') break;
        ++chars[ch]; ++count;
    }
    char str[count + 1]; str[count] = '\0';
    char *p = str;
    for(size_t i = 'A'; i <= 'Z'; ++i) {
        while(chars[i]--) *p++ = i;
    }
    for(size_t i = '0'; i <= '9'; ++i) {
        while(chars[i]--) *p++ = i;
    }
    for(size_t i = 'a'; i <= 'z'; ++i) {
        while(chars[i]--) *p++ = i;
    }
    printf("%s\n", str);
    return 0;
}

int main(void) {
    while(output_line() != EOF);
    return 0;
}
#include <stdio.h>

int output_line(void) {
    size_t chars[256] = {0};
    while(1) {
        int ch = getchar();
        if(ch == EOF) return EOF;
        if(ch == '\n') break;
        ++chars[ch];
    }
    for(size_t i = 'A'; i <= 'Z'; ++i) {
        while(chars[i]--) putchar(i);
    }
    for(size_t i = '0'; i <= '9'; ++i) {
        while(chars[i]--) putchar(i);
    }
    for(size_t i = 'a'; i <= 'z'; ++i) {
        while(chars[i]--) putchar(i);
    }
    putchar('\n');
    return 0;
}

int main(void) {
    while(output_line() != EOF);
    return 0;
}
$

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
竹逸 + 5 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 21:02:28 From FishC Mobile | 显示全部楼层
jhq999 发表于 2022-10-20 11:04

膜拜大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 21:04:34 From FishC Mobile | 显示全部楼层
人造人 发表于 2022-10-20 11:21
忘了加return 0; 了

膜拜大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 21:16:27 From FishC Mobile | 显示全部楼层
jackz007 发表于 2022-10-20 13:24
编译、运行实况:

自己功底浅,大神的代码看不太懂我再琢磨琢磨,给大神点赞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 21:22:35 | 显示全部楼层
ZZZZZZZZZZ
#include <stdio.h>

int main(void) {
        char c;
        int res[256] = { 0 };
        while ((c = getchar()) != '\n') res[c]++;
        for (int i = 'A'; i <= 'Z'; ++i) {
                for (int j = 0; j < res[i]; ++j) printf("%c", i);
                res[i] = 0;
        }
        for (int i = 0; i < 256; ++i) {
                for (int j = 0; j < res[i]; ++j) printf("%c", i);
        }
        return 0;
}

评分

参与人数 1荣誉 +4 鱼币 +4 贡献 +3 收起 理由
竹逸 + 4 + 4 + 3 大神,请收下我的膝盖

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 21:38:48 | 显示全部楼层
竹逸 发表于 2022-10-20 21:16
自己功底浅,大神的代码看不太懂我再琢磨琢磨,给大神点赞

        这题比较麻烦的是要求最后的排序结果要把数字放到大小写字母之间,我们知道,数字的 ASCII 编码比大小写字符都要小,如果按正常的 ASCII 码大小排序,那么,数字只能数字只能出现在字符串的两边,而不可能是中间,针对这个问题,排序前,人为修改数字的 ASCII 编码,使其位于大小写字母之间,但是,在 'Z' 和 'a' 之间只有 6 个字符的位置,无法容纳 10 个数字字符,于是,又把小写字符的编码整体向后移动了 4 个字符位置,这样,就形成了大写字母在前,数字在中,小写字母在后的格局,这样操作过后,直接排序操作,然后,逆序恢复字符串中各个字符的原始编码,事情就成了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 21:46:09 | 显示全部楼层
jackz007 发表于 2022-10-20 21:38
这题比较麻烦的是要求最后的排序结果要把数字放到大小写字母之间,我们知道,数字的 ASCII 编码 ...

看着你说的这个思路完全跟不上看你的代码.请教一下,这种双for使用如何练成的,话说到现在我还是最怕这种烧脑布局.有什么学习好它的决窍吗.谢谢.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 21:52:47 | 显示全部楼层
howzyao 发表于 2022-10-20 21:46
看着你说的这个思路完全跟不上看你的代码.请教一下,这种双for使用如何练成的,话说到现在我还是最怕这种烧 ...

把复杂的问题简单化,像我那样
如果不能简单化它,那就把它挂起,直到未来的自己找到了简单化它的方法,然后完成它
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 21:59:28 | 显示全部楼层
howzyao 发表于 2022-10-20 21:46
看着你说的这个思路完全跟不上看你的代码.请教一下,这种双for使用如何练成的,话说到现在我还是最怕这种烧 ...


            多层循环只为了执行一条语句,写到同一行节省空间。
            这样很难理解吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 22:01:56 | 显示全部楼层

你是牛A和牛C之间的人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 22:11:02 From FishC Mobile | 显示全部楼层
jackz007 发表于 2022-10-20 21:59
多层循环只为了执行一条语句,写到同一行节省空间。
            这样很难理解吗?

aaadc3429AFD
123ABCabc2
样例输出:
ADF2349aaacd
ABC1223abc

这个要求,我觉得要把A到A++直到Z这段,
放在首位
0-9放在二位
a....z放三位,
凡是满足阶段一的,放方法一中处理。方法二的放二,三放三。

然后三段相加。

这是我的思路。还没有具体代码,不过看了二位学长的代码后,我确实发觉自己太欠缺了,只能将心里想的说出来,不知道有没有可能实现。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 22:12:05 | 显示全部楼层

我觉得元素的个数定为123可能更好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 22:15:24 From FishC Mobile | 显示全部楼层
我基本上只会笨办法:
准备3个数组。用来放字符。
再弄一个数组长度是整个ascii的长度。
比如65时,有字符,就存之没有,就略过。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 22:17:55 | 显示全部楼层
howzyao 发表于 2022-10-20 22:11
aaadc3429AFD
123ABCabc2
样例输出:

        有想法就把它实现出来。
        你也可以先无差别排序,然后,把数字段整体挪到大小写字符段之间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 22:31:30 | 显示全部楼层
jackz007 发表于 2022-10-20 21:38
这题比较麻烦的是要求最后的排序结果要把数字放到大小写字母之间,我们知道,数字的 ASCII 编码 ...


怪不得我看不懂你那个+4是什么意思,原来是这样啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 22:46:15 | 显示全部楼层
竹逸 发表于 2022-10-20 21:16
自己功底浅,大神的代码看不太懂我再琢磨琢磨,给大神点赞

不是吧,没看懂?统计所有输入字符出现的次数,然后遍历 大写字母 , 数字,小写字母 ,并把字符出现次数大于0的字符,按'A'- 'Z'的顺序输出而且每个大写字符输出的个数为统计时的个数 。按'0'- '9'的顺序输出而且每个数字字符输出的个数为统计时的个数 ,按'a'- 'z'的顺序输出而且每个小写字符输出的个数为统计时的个数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 11:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表