分类: C/C++
2014-07-12 14:10:22
菜鸟一个,本着记录学习的过程做此笔记,高手见笑。
题目:让程序要求用户输入一个大写字母,使用嵌套循环产生像下面这样的金字塔图案:
这种图案要扩展到用户输入的字符。案例图案是输入E产生的图案。提示,可以使用一个外部循环管理行,每一行使用三个内部循环,第一个处理空格,第二个处理升序打印字母,第三个处理降序打印字母。
一开始死活也做不出来,后来网上看了一下别人的案例,睡了一觉起床后自己调试,得出源码如下:
点击(此处)折叠或打开
printf(" ");
因为设计的行数越多,那么第一行的空格越多,所以空格的数量和输入的值有关,spaces=enter-c,计数器的大小就是从最大开始,space--,然后每一行减少一个空格,当然根据行的控制,行数越大,那么空格就越少,因此spaces>=rows。第一个内部循环设计完成。
设计第二个内部循环,控制升序打印字母。此时,我将第一个内部循环注释掉,单独调试第二个循环,这样的模块化方法避免相互干扰,比较好。当然,显示的内容就从
变成了
A
AB
ABC
之后联合调试加上第一个内部循环就可以纠正。这里使用的是:
for(up=0;up<=rows;up++)
printf("%c",c+up);
这当然不是我一个菜鸟能一次性直接写出来了,也是一步步调试出来的。分析如下:
升序,所以计数器要逐渐增加,那么就应该用=,<或者<=,++的模式。这里因为涉及到字符ASCII码要逐渐增加的原因,因此变量从0开始计数以免输入A,加一个1就成了B(完成之前就是用的1,结果不方便,所以换成0)。up<=rows,行数越大,那么up就可以计数更多的循环,printf("%c",c+up);计数器每循环一次,那么打印的字符则增大一次。第二个内部循环设计完成。
设计第三个内部循环,控制降序打印字母,分析得出,第一行必须为空,那么计数器就得增大一号,每次开始的字符都要比上一行增加一个ASCII码,那么打印字符应该和行相关联,经过反复调试之后,得出:
for(down=rows;down>0;down--)
printf("%c",c+down-1);
因为是降序嘛,所以就用=,>,--的模式。行数越大,打印字符越多,因此计数器和行数相关联。printf("%c",c+down-1);打印的字符从最大开始,而且又要和计数器相互关联,因此就使用了c+down-1表达式,为什么要减1?因为每次开始的字符都是比输入字符的ASCII码小1的,所以才这样打印。
最后,取消注释,先联调前两个内部循环,无误后再联调三个,得出结果:
好了,希望我自己学习愉快。