题目:写一个程序实现输入一个大写字母,计算机输出从A到这个大写字母的字母金字塔。(两种方法)
比如:输入C,则会输出
目录: 1)、思路1分析(非数组)、代码讲解、2)思路2分析、代码讲解及展示
非数组的方法比数组的方法要简单一些,而且电脑执行得快一些。
1、非数组类思路分享:
非数组类的方法就是直接定义一个循环,然后在外循环里面再建立两个循环,一个用来输出空格,一个用来输出大写字母。比如输入一个C,那么答案如图:
可见A之前有两个空格,B之前有一个空格,而C前没有空格。由此推出不同行空格数与输入的字母数的关系就是:第i行空格数=(输入字母的ASCII码-A的ASCII码)-i-1;再看字母的输出部分,输出的个数依次是1,3,5……成等差数列的关系,所以,输出的字母数与输出字母的数量的关系:最多输出数=1+(输入字母的ASCII码-A的ASCII码)*2。明白这些关系后就可以写代码。
1)第一个代码讲解:
需要确定的两个数:输出行数、每行的空格和字母数。
首先用getchar()得到一个大写的字母(假设是D),然后算出外层循环需要循环的次数(也就是68-64=4),用for循环从第一行开始输出,进入内循环:先输出空格,确定要输出的空格数,注意空格数随行数变大而变小,所以用减法(也就是第一行要用4-1个空格),使用b-i是为了可以实现行数减一,空格数减一。接下来是第二个循环,确定字母的输出数量,定义一个变量k,在k的范围内可以输出k个字母,k+2可以实现每增加一行就增加两个字母数。最后输出字母后再进行ASCII码值加一,跳转到下一个字母。
2)代码如下:
结果:
2)利用数组的方式
首先,定义两个数组,一个用来装载空格,一个用来装载字母,需要确定数组的最大长度:利用等差数列可知(sz=1+(26-1)*2=51)
利用循环可以将空格和字母都放入数组中。
然后要利用输入的字母计算数组的长度与数组中间数,其公式为:数组长度=1+(输入字母的ASCII码-A的ASCII码)*2。由此得出数组中间数为(长度-1)/2。
外层循环与非数组像似,行数就是循环的次数,内层循环先对输出的空格数进行循环,由上面的图可知输出的空格数会随着行数的增加而减少,与外循环有关,所以不妨设每一次的空格数等于上一次的空格数减去行数的循环次数。
内层的第二个循环就是输出的字母及其数量输出的字母数是单数的,所以我们可以用中间值来控制输出,第一行只输出中间值这一个字母,后随着行数的增加,字母数就增加两个,所以中间值mid-1,比如输入C,数组长度就是5,中间值是2,第一行在arr[2]处输出A,也就是前面有两个空格,然后mid-1,就在arr[1]处开始输出B,直到a[3]后结束
下一步就是把数组中的字母都替换为下一个字母,可以利用ASCII码值进行替换。
然后循环结束就可以得出结果。
3)代码展示:
结果: