题目描述:
布告,布告! 应老师要求,我们要做一道打印图形的题目,这是程序员最基本的能力。 那废话不多说,我们来说要求的图形 AAAAA ABBBA ABCBA ABBBA AAAAA 就是外到内,从A到Z。每一层都是一种字母,最里面的一层为一个,即最中心的一个。
输入格式:
一行,一个整数,即图形的层数
输出格式:
如上述图形
输入样例:
3
输出样例:
AAAAA
ABBBA
ABCBA
ABBBA
AAAAA
思路分析:
- 根据输入计算图形的行数和列数,创建一个二维数组。
- 由题可知,从外层往内层,字母逐层增加(从A >> Z)。
- 不妨通过两个for循环(i ,j)进行数组下标移动,先用字母A把最外一层数组元素覆盖。假设i,j初始值均为1,则最大值分别为m(2*n-1),所以在数组中,当条件为(i == 1 || j == 1 || i == m || j == m)均为A,以此类推。
代码:
#include <stdio.h>
int main()
{
int stat, i, j, n, m;
scanf("%d", &n);
m = 2 * n - 1;
int k = 1, z = m;
char ch = 'A';
char a[m+1][m+1]; //为了过程方便,这里把数组下标为0的空间浪费掉,数组从1开始,空间大小为m+1。
for(stat = 0; stat < 26; stat++) //这个循环是控制字母依次增大,stat值可以更大,只不过当stat大于字母数后,ch值会继续自加,不止为Z。
{
for(i = k; i <= z; i++) //i的初始值为k,最大值为z,对比图形可以看出,循环的范围在逐渐减小,即外层保留覆盖,内层字母增大继续往里覆盖。j同理。
for(j = k; j <= z; j++)
if(i == k || j == k || i == z || j == z)
a[i][j] = ch;
if(k == m) break; //这里break掉的是控制字母的循环,当k == m时,整个图形的数组已经被字母全部覆盖掉。
k++; //k控制覆盖从左上角向中间进行,对应的是上行和左列。
z--; //z控制覆盖从右下角向中间进行,对应的是下行和右列。
ch += 1;
}
for(i = 1; i <= m; i++) //将数列输出。
{
for(j = 1; j <= m; j++)
printf("%c", a[i][j]);
printf("\n");
}
return 0;
}