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

来源:互联网 发布:java中文乱码解决总结 编辑:程序博客网 时间:2024/06/05 12:04

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

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


【原题】
要求用户从键盘输入一个大写字母,使用嵌套循环产生像下面这样的金字塔图案:
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个字母,这些小规则,当时我都没想到,因此浪费的时间实在是太多了,在此引以为戒。

原创粉丝点击