一道简单的字母循环金字塔问题

一道简单的字母循环金字塔问题

标签(空格分隔): 编程错题


【原题】
要求用户从键盘输入一个大写字母,使用嵌套循环产生像下面这样的金字塔图案:
A
ABA
ABCBA
ABCDCBA

程序运行结果示例1:
Please input a capital:
D↙
____A
___ABA
__ABCBA
_ABCDCBA

这道题很简单,思路一看就懂,但是花费了我几乎三个小时的时间。为什么?因为编程时我思维太乱了,而且因为我没有设置注释或者一眼就能看懂的变量名字,导致我断断续续编程时每次都忘了上一次的思路,所以耗费了大量的时间。
我的解法如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,n,m,p,q=0,t;
    char c;
    printf("Please input a capital:\n");
    scanf("%c",&c);
    n=c-64;
    for (i=0;i<n;i++)
    {
        for (m=0;m<n-i;m++)        //每一行控制空格数,i是第几行
        {
            printf(" ");
        }
        q=0;        //此时的m=n-i;
        while (q<=i)                //对每一行字母序列的处理
        {
            printf("%c",65+q);
            q++;                    //实现顺序,每次加1,保证顺序最后一个字符是最大值
        }
        t=i;
        while (t>0)
        {
            printf("%c",64+t);
            t--;
        }
            if (q==i+1)
            {
                /*q--;
                for (;q>0;q--)
                    printf("%c",65+q);
                */
                printf("\n");
            }


    }
    return 0;
}

显然,该程序用嵌套循环。行循环计数器变量i,每行向后循环计数器变量m,我从刚开始就没有明确决定要定义他们两个,最后我才发现他们的重要性。这说明:编写循环程序时,一定要重点注意计数器和计数器值,不要胡乱修改计数器的值,不要忘记嵌套循环中计数器值的归零;当需要计数器值做处理时,定义一个新变量,将计数器值赋给它,处理新变量,而不是直接处理计数器。我就在这里吃了个大亏,一开始就没明确计数器的重要性,所以瞎定义了一堆变量,后来都给我删了。
还有,要注意用字符型表示来简单化思考。如果你在程序里不写ASCII码,里面的65都用’A’代替,不是可视性更好吗?用人脑算起来更简单吗?你为什么非要用ASCII码?究其原因,还是因为你对字符型常量不熟啊,你还是缺乏练习。
最后,对这种格式化、结构化循环问题,一定要注意他们每次循环的计数器的量与输出格式之间的关系,这是一个很大的突破点,一定要注意。这道题里面就是,行数i,则最大输出到i+1个字母,在最大输出之后最多倒序输出i个字母,这些小规则,当时我都没想到,因此浪费的时间实在是太多了,在此引以为戒。

posted @ 2017-12-12 08:46  CF过2100就买ARCTERYX  阅读(423)  评论(0编辑  收藏  举报