写对称字母塔的时候一点感受,程序看起来都很复杂,但一步一步来,总是可以解决的!这个过程需要耐心!静下心来,一步一步的实验,打印结果,看是否是需要的。
程序乍一看都很复杂,也搞不到头绪。我觉得是自己还没有仔细思考过这个问题的解决办法。自己一步一步的想下解决办法,总能一步一步的得到你想要的。即使解决不了,再去看其他人的解决办法,都会很容易想明白,并记住!
刚看到题目的时候,没有任何思路,想着是不是可以两个循环把这个图案打印出来。想来想去好像不行,于是第一天就把这个放一边了。
隔了两天又想来把这题给搞定,就想着前面有打印字母递增的算法,还有递减的算法,是不是可以用这些思路去解决问题。
正好又看到网友的思路是把图案分三部分打印,一部分是前面空格,一部分是字母前半部分,最后是字母后半部分。所以设计一个外循环,然后三个内循环,一个循环打印前面的空格,一个打印字母前半部分,一个打印后半部分。扫了一样网友的算法,乱糟糟的感觉,就思路还记得,设计多个循环!其他的一闭上眼睛就忘了。
想来想去,自己去动手写下应该就能理解了,于是就来写吧。
1, 先搞一个递增的外循环,循环次数由输入字母减去‘A’来控制。
<span style="font-size:14px;">for(row=0 ; row<=ch-'A'; row++)
{
}
</span>
2,再搞一个递减内循环,做空格循环次数控制。初始化应该是和外循环成反向的。
<span style="font-size:14px;"> for(row=0 ; row<=ch-'A'; row++)
{
for(bl=(ch-'A'-row-1); bl>=0 ; bl--)
printf("_", bl );
printf("\n");
}</span>
测试打印,空格看不到,换成 ‘_’ 来试试。
打印结果正确。
3,再搞一个递增循环,做字母前半部分。
<span style="font-size:14px;">for(row=0 ; row<=ch-'A'; row++)
{
for(bl=(ch-'A'-row-1); bl>=0 ; bl--)
printf("_", bl );
for( line = 'A' ; line <='A'+row ; line++)
printf("%c", line );
printf("\n");
}</span>
测试打印,结果也还行。
4,最后搞一个递减循环,来控制反序字母打印。
此步骤刚开始搞不明白如何设计循环初始化条件,和循环界限设定。不断调试了有五六次,最终再把这项设定好。
<span style="font-size:14px;">for(row=0 ; row<=ch-'A'; row++)
{
for(bl=(ch-'A'-row-1); bl>=0 ; bl--)
printf("_", bl );
for( line = 'A' ; line <='A'+row ; line++)
printf("%c", line );
for(line='A'+row -1; line >= 'A' ; line--)
printf("%c", line );
printf("\n");
}</span>
完整代码:
我这个代码没有做输入条件筛选,应该是可以做 字母输入判定, 大小写判定,然后设计分支来处理不同情况,后面再来完善这些功能。
<span style="font-size:14px;">#include<stdio.h>
int main(void)
{
int row ,line ,bl;
char ch;
scanf("%c", &ch);
for(row=0 ; row<=ch-'A'; row++)
{
for(bl=(ch-'A'-row-1); bl>=0 ; bl--)
printf("_", bl );
for( line = 'A' ; line <='A'+row ; line++)
printf("%c", line );
for(line='A'+row -1; line >= 'A' ; line--)
printf("%c", line );
printf("\n");
}
return 0;
}</span>