鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 2019212542

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

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

杀死了N个脑细胞后, 终于看懂了你的代码
主要你这个思路稍微有点复杂,循环嵌套还有冒泡法容易把人绕晕了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 23:06:33 | 显示全部楼层
本来今天晚上的时间是用来学习共用体那节课的,现在花在研究你们的代码上也是收获大大的有,发现课件里的那些知识终究还是太基础了,还是多多看大佬们的代码收获更大。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 23:09:37 | 显示全部楼层
竹逸 发表于 2022-10-20 23:06
本来今天晚上的时间是用来学习共用体那节课的,现在花在研究你们的代码上也是收获大大的有,发现课 ...

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

使用道具 举报

发表于 2022-10-20 23:14:12 | 显示全部楼层
本帖最后由 桃花飞舞 于 2022-10-20 23:24 编辑

这题也不是太简单,但自己也能想出来。可以先输入一行字符串,先排序再判断存储最后输出,然后再做多行的输入,先排序再判断存储最后输出。排序可能会出错,判断的时候可能出错。主要是字符串结束符'\0'的位置,这题自己做还是能提升的。数字字符在字母字符的前面而不是中间,可以先存储大写字符再存储数字字符,最后小写字符。思路就这样。我自己写也还是要2个小时才能写出来,不要着急,我想我是写的最慢的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 23:22:52 From FishC Mobile | 显示全部楼层
jackz007 发表于 2022-10-20 23:09
辛苦了

鱼c论坛真的是太伟大了,有疑问大佬们都给我们这些菜鸟们解答,分享的精神让我很感动
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-20 23:26:04 | 显示全部楼层
竹逸 发表于 2022-10-20 23:22
鱼c论坛真的是太伟大了,有疑问大佬们都给我们这些菜鸟们解答,分享的精神让我很感动


         俗话说,尺有所短,寸有所长,大家互相学习,共同进步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-21 00:17:25 | 显示全部楼层
jackz007 发表于 2022-10-20 22:17
有想法就把它实现出来。
        你也可以先无差别排序,然后,把数字段整体挪到大小写字符段之 ...
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
void choice_a_same_type(char*,int);
void process_string(char*,char*,char*,char*,int);
int main()
{
    int len=1024;
    char ch[len];
    cout<<"输入要处理的字符串:\n";
    cin>>ch;
    char AZ[len],az[len],zn[len];
    process_string(ch,AZ,az,zn,len);
    choice_a_same_type(AZ,len);
    choice_a_same_type(az,len);
    choice_a_same_type(zn,len);
cout<<"排序算法待坛友启发,个人能力实在有限,两两对比实在是不晓得原理"<<endl;
    return 0;
}

见谅啊.能不能请教一下22排序的算法啊.谢谢.
sshot-5.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-21 00:22:27 From FishC Mobile | 显示全部楼层
本帖最后由 竹逸 于 2022-10-21 00:24 编辑
傻眼貓咪 发表于 2022-10-20 21:22
ZZZZZZZZZZ


大佬的代码不得不让我惊为天作,得再吹一次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-21 01:07:21 | 显示全部楼层

看了你的代码,我深感迷惑,竟然直接人脑进到电脑里面去了...
getchar()的用法已经超神了:
一排字,直接在while1里面不停的取int吗?谢谢.
chars初始化为全0,是吗,谢谢.
++chars[ ch ] ;  这样的操作,代表已进读进ascii码中的ch,到了chars中,并向后偏移一个
了吗? ch是一个下标,这里怎么变成了元素? 个人觉得.看了又看.忘告之.谢谢.


输了负数,EOF还能直接跳出去吗?谢谢.

break倒是看清楚了,读到了回车,就结束.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-21 11:27:19 | 显示全部楼层
方法比较笨,个人觉得注释融入代码是一种好选择,也恳请各位学长们麻烦一下,引领我们新手更容地学习

图:

sshot-7.png


码:
#include <iostream>
using namespace std;
void choice_a_same_type(char*,int);
void process_string(char*,char*,char*,char*,int);
void char_swap(char*,char*);
void head_max_arr(char*,int);
void head_min_arr(char*,int);
int main()
{
    int len=1024;
    char ch[len];
    cout<<"输入要处理的字符串:\n";
    cin>>ch;
    char AZ[len],az[len],zn[len];

    process_string(ch,AZ,az,zn,len);
    choice_a_same_type(AZ,len);
    choice_a_same_type(az,len);
    choice_a_same_type(zn,len);

    head_min_arr(AZ,len);
    head_max_arr(AZ,len);

    head_min_arr(az,len);
    head_max_arr(az,len);

    head_min_arr(zn,len);
    head_max_arr(zn,len);

    return 0;
}


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

void head_max_arr(char*a,int b)
{
    int tlen=0;
    for(int i=0;i<b;i++)
    {
        tlen++;
        if(a[i]=='\0')
            break;
    }
    tlen--;
    for(int i=0;i<tlen;i++)
    {
        for(int j=0; j+1 < tlen; j++)
        {
            if( a[j] < a[j+1] )
            char_swap(&a[j],&a[j+1]);
        }
    }
    cout<<"大到小排序:   "<<a<<endl;
}

void head_min_arr(char*a,int b)
{
    int tlen=0;
    for(int i=0;i<b;i++)
    {
        tlen++;
        if(a[i]=='\0')
            break;
    }

    tlen--;

    for(int i=0;i<tlen;i++)
    {
        for(int j=0; j+1 < tlen; j++)
        {
            if( a[j] > a[j+1] )
            char_swap(&a[j],&a[j+1]);

        }
    }
    cout<<"小到大排序:   "<<a<<endl;
}

void process_string(char*a,char*b,char*c,char*d,int e)
{
    int i=0;
    while(a[i] != '\0')
    {
        if( a[i]>=65 && a[i]<= 90)
            b[i] = a[i];
        else
            b[i] = 32;

        if( a[i] >= 97 && a[i]<=122)
            c[i]= a[i];
        else
            c[i] = 32;

        if( a[i] >= 48 && a[i]<= 57 )
            d[i]=a[i];
        else
            d[i] = 32;
        i++;
    }
    b[i]='\0';
    c[i]='\0';
    d[i]='\0';
    cout<<a <<" 有 " << i <<"个字符"<<endl;
}





void choice_a_same_type(char *a,int b)
{
    char t[b];
    int j=0;
    for(int i=0;i<b;i++)
    {
        if(a[i]!=32)
        {
            t[j]=a[i];
            j++;
        }
    }
    t[j]='\0';
    if( t[0]>=65 && t[0]<= 90)
    cout<<"大写段字符串: "<<t<<endl;
    if( t[0]>=97 && t[0]<= 122)
    cout<<"小写段字符串: "<<t<<endl;
    if( t[0]>=48 && t[0]<= 57)
    cout<<"数字段字符串: "<<t<<endl;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-21 12:39:28 | 显示全部楼层
本帖最后由 howzyao 于 2022-10-21 12:44 编辑

完成了,方法未提练,献丑了:

图:


sshot-9.png




码:



#include <iostream>
#include <conio.h>
using namespace std;
void choice_a_same_type(char*,int);
void process_string(char*,char*,char*,char*,int);
void char_swap(char*,char*);
void head_max_arr(char*,int);
void head_min_arr(char*,int);
void collect_three_to_one(char*,char*,char*,char*,int);
void remove_space(char*,int);
int main()
{
    int len=1024;
    char ch[len];
    cout<<"输入要处理的字符串:\n";
    cin>>ch;
    char AZ[len],az[len],zn[len];

    process_string(ch,AZ,az,zn,len);
    choice_a_same_type(AZ,len);
    choice_a_same_type(az,len);
    choice_a_same_type(zn,len);

    remove_space(AZ,len);
    remove_space(az,len);
    remove_space(zn,len);
    remove_space(AZ,len);

    head_min_arr(AZ,len);
    //head_max_arr(AZ,len);

    head_min_arr(az,len);
    //head_max_arr(az,len);

    head_min_arr(zn,len);
    //head_max_arr(zn,len);

    collect_three_to_one(ch,AZ,zn,az,len);
    return 0;
}

void collect_three_to_one(char*a,char*b,char*c,char*d,int e)
{
    int bl=0;
    for(int i=0;i<e;i++)
    {
        bl++;
        if(b[i]=='\0')
            break;
    }
    bl--;

    int ai=0;

    for( ;ai<bl;ai++)
    {
        a[ ai ]=b[ ai ];
    }


    int cl=0;
    for(int i=0;i<e;i++)
    {
        cl++;
        if(c[i]=='\0')
            break;
    }
    cl--;

    int ci=0;

    for(;ci<cl;ci++)
    {
        a [ai+ci] = c[ci];
    }


    int dl=0;
    for(int i=0;i<e;i++)
    {
        dl++;
        if(d[i]=='\0')
            break;
    }
    dl--;

    int di=0;
    for(; di<dl; di++)
    {
        a [ ai+ci+di ] = d[di];
    }

    a[ai+ci+di]='\0';
    cout<<"完成字符串:  "<<a<<endl;
}


void remove_space(char*a,int b)
{
    int tlen=0;
    int space=0;
    for(int i=0;i<b;i++)
    {
        tlen++;
        if(a[i]=='\0')
            break;
        if(a[i]==32)
            space++;
    }
    tlen--;

    int word_i = tlen - space;

    char t[word_i+1];

    int ti=0;

    for( int i=0;i<b; i++)
    {
        if(a[i]!=32)
        {
            if(a[i]=='\0')
                break;

            t[ ti ] = a[i];

            ti++;
        }
    }
    t[ti]='\0';

    for(int i=0;i<b;i++)
    {
        a[i]=t[i];

        if(a[i]=='\0')
            break;
    }

    cout<<"排好的字符串: "<< a <<endl;
}



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

void head_max_arr(char*a,int b)
{
    int tlen=0;
    for(int i=0;i<b;i++)
    {
        tlen++;
        if(a[i]=='\0')
            break;
    }
    tlen--;

    for(int i=0;i<tlen;i++)
    {
        for(int j=0; j+1 < tlen; j++)
        {
            if( a[j] < a[j+1] )
            char_swap(&a[j],&a[j+1]);
        }
    }

    cout<<"大到小排序:   "<<a<<endl;
}

void head_min_arr(char*a,int b)
{
    int tlen=0;
    for(int i=0;i<b;i++)
    {
        tlen++;
        if(a[i]=='\0')
            break;
    }

    tlen--;

    for(int i=0;i<tlen;i++)
    {
        for(int j=0; j+1 < tlen; j++)
        {
            if( a[j] > a[j+1] )
            char_swap(&a[j],&a[j+1]);

        }
    }
    cout<<"小到大排序:   "<<a<<endl;
}

void process_string(char*a,char*b,char*c,char*d,int e)
{
    int i=0;
    while(a[i] != '\0')
    {
        if( a[i]>=65 && a[i]<= 90)
            b[i] = a[i];
        else
            b[i] = 32;

        if( a[i] >= 97 && a[i]<=122)
            c[i]= a[i];
        else
            c[i] = 32;

        if( a[i] >= 48 && a[i]<= 57 )
            d[i]=a[i];
        else
            d[i] = 32;
        i++;
    }
    b[i]='\0';
    c[i]='\0';
    d[i]='\0';
    cout<<a <<" 有 " << i <<"个字符"<<endl;
}





void choice_a_same_type(char *a,int b)
{
    char t[b];
    int j=0;
    for(int i=0;i<b;i++)
    {
        if(a[i]!=32)
        {
            t[j]=a[i];
            j++;
        }
    }
    t[j]='\0';
    if( t[0]>=65 && t[0]<= 90)
    cout<<"大写段字符串: "<<t<<endl;
    if( t[0]>=97 && t[0]<= 122)
    cout<<"小写段字符串: "<<t<<endl;
    if( t[0]>=48 && t[0]<= 57)
    cout<<"数字段字符串: "<<t<<endl;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-21 12:43:27 | 显示全部楼层
笨是笨得点,但方法直观,意外的好处是:
collect_three_to_one(ch,AZ,zn,az,len); //参数顺序决定你想排列(大写,小写,数字)的顺序

升降的话,也是可以用min 或 max来调整3段各段的顺序.可以给分我吗?谢谢.
head_min_arr(AZ,len);
    //head_max_arr(AZ,len);

    head_min_arr(az,len);
    //head_max_arr(az,len);

    head_min_arr(zn,len);
    //head_max_arr(zn,len);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-21 14:54:04 | 显示全部楼层
howzyao 发表于 2022-10-21 01:07
看了你的代码,我深感迷惑,竟然直接人脑进到电脑里面去了...
getchar()的用法已经超神了:
一排字,直接在 ...

一排字,直接在while1里面不停的取int吗?
这里是一直调用函数

chars初始化为全0,是吗
是的

++chars[ ch ] ;  这样的操作,代表已进读进ascii码中的ch,到了chars中,并向后偏移一个
了吗? ch是一个下标,这里怎么变成了元素?

把字符作为数字来用
例如,ch的值是 'x'
那就是把chars的第120个元素加1
如果ch的值是 '0'
那就是把chars的第48个元素加1

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

使用道具 举报

发表于 2022-10-21 15:36:46 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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