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