KaQqi 发表于 2017-2-9 08:38

对某cpp排序题的思考过程记录

昨天十点有人在群中求助:如何用cpp实现下列效果呢
a
bc
def
ghij
很简单的冒出了一个思路:通过字符的ascii码做循环。为了防止逻辑混乱,我决定先实行这个效果。
1
23
456
7890
从1到9很简单,就是每次加上1。那么换行是个问题。如何考虑换行呢?
第一个思路就是把换行定义为变量i i每次加上一,也就是说每次循环的次数就是i的数值。
于是写出代码:
#include <stdio.h>
int main()
{
        int i, j=0;
       
        for(i = 1; i < 6; i++)
                {
                        for(j = 1; j <=i; j++)
                        {                               
                                printf("%d",j);
                        }
                        printf("\n");       

                }
        return 0;
}
乍一看很好。调试后出现运行错误。变成了
1
12
123
显然,这里只有换行了。而每次换行后开头都是1。那就说明,第二个循环的初始值有问题。
我发现了第二个循环的j总是为一。故把第二个循环第一个参数删去,在程序一开始就定义j为1。
于是出现下列代码。
#include <stdio.h>
int main()
{
        int i, j=0;
       
        for(i = 1; i < 6; i++)
                {
                        for(; j <=i; j++)
                        {                               
                                printf("%d",j);
                        }
                        printf("\n");       
                }

        return 0;
}
这样也不对。因为j值关系循环,而他又不能参与循环。每次循环他的值都被清零,不能保存。于是异想天开,用一个ret来保持j值。
#include <stdio.h>
int main()
{
        int i;
        int j;
        int ret = 1;
        for(i = 1; i < 6; i++)
                {
                        for(j=ret; j<=i; j++)
                        {                               
                                printf("%d",j);
                                ret = j;
                        }
                        printf("\n");       
                }
        return 0;
}
就是说,先把ret赋值为1,在循环一开始 ,赋值给j。j在参与完运算之后,再把值给ret。这样ret就能储存了。
结果出现这种效果
12
23
34
也就是说j值总是与上次相同。
(凌晨11点,大脑进入困倦状态)
手机的c4droid没有单步调试。我想看看哪地方出了问题。于是找到了天天能开电脑家长不管的枫叶飘零,求救,能否单步调试找到问题。
在他单步后,也发现了j值没有增加的问题。但是他也没有想出好的办法。
于是我想:既然通过i个数来判断逻辑麻烦,那我们是否可以通过数字的位数判断呢?就是%10。比如12就是两位数 234就是三位数,数字继续按照123456789排列,通过位数判断换行


正在我跟他聊天时,我睡着了。。。

早晨起来,按照思路,写了代码
#include <stdio.h>

int main()
{
        int i;
        int j = 1;
        int sum=1;
        int n;
        for(;j<=4;j++)
        {
                for(i= 1;i<=j;i++)
                {
                        sum=sum +1;
                        n=sum%10;
                        printf("%d",sum);
                }
                printf("\n");
        }
        return 0;
}

实验了一下,可以。
于是又回想到字母。a的ascii是41,十进制是65。z的ascii是5a,十进制是90。所以初始值为65,结束为90。
上了QQ,看见枫叶给我的留言:
#include <stdio.h>
#include <stdlib.h>
int main ()
{
        int i, count = 1, number = 1;
        for (; count <= 4; count++) {
                for (i = 1; i <= count; i++)
                        printf("%d",(number++) % 10);
                printf("\n ");
        }
       
    system("pause");
        return 0;

不知怎的,让我霎时间很感动。


通过这次思考 大家也可以明白编程的逻辑性与思路多样性 祝大家编程快乐

KaQqi 发表于 2017-2-9 08:41

本帖最后由 cqr2287 于 2017-2-9 08:46 编辑

@枫叶飘零 谢谢支持

bipyaw001 发表于 2017-2-9 09:39

#include <stdio.h>

int main()
{
        char* data="abcdefghij";
   int i=0,j=0;
        int n=0;
        for(int i=0;i<4;i++){
                for(int j=0;j<i+1;j++){
                        printf("%c",data);
                }
                printf("\n");
               
        }
   return 0;
}

神奇的人鱼 发表于 2017-9-9 20:20

#include<stdio.h>
int main()
{
        char test = 'a';//字母起始
        int row = 4;//定义长度
        for(int i=1;i<=row;i++)
        {
                for(int j=1;j<=i;j++)
                {
                        printf("%c",test);
                        test++;
                }
                if(i<row)
                {
                        printf("\n");
                }
        }
        return 0;
}
来自神奇的人鱼
页: [1]
查看完整版本: 对某cpp排序题的思考过程记录