题目描述:
输出N(N为奇数)行由字母组成的菱形,第一行是字母A,第二行是BCDCB,第三行是CDEFGFEDC,以此类推,菱形上下对称。
输入:
一个奇数N。0<N<16。
输出:
N行字母组成的菱形图案。
输入示例:
5
输出示例:
A
BCDCB
CDEFGFEDC
BCDCB
A
题解:
本题相对于普通的打印菱形的‘ * ’形加入了字符的变更。难点在于对字符的处理。
具体思路如下:
对于整个菱形,分上上半部分三角形和下半部分倒三角形两部分输出。难点在于空格数量与字符个数的输出,以及对字符顺序的处理。
- 首先对于空格个数:第一行为在正中间的一个字符,故空格个数为(n-1)/2,尔后每一行相对于上一行前端多了两个字符,即空格数量每一行一次-2,即可得第i行空格个数:(n-1)/2-2(i-1)*。
- 其次对于字符数:由于字符的输出的特殊性(前半部分递增,后半部分递减),故分为前后两部分输出。第一行有一个字符,其下每一行前半部分相对于上一行多了两个字符,即可得第i行前半部分字符个数为1+2*(i-1),即为2*i-1。而对于后半部分字符,仅比前半部分少1,故为2*i-2。
- 最后对于字符的处理:可按照以下步骤:
初始定义字符a=‘ A ’,在前半端的每一次输出后a++,在后半段每一次输出后a–。但对应有三个特殊点需要处理:
1.每一个前半段的字符输出完成后,进行后半段字符输出时抵消掉前半段最后一个字符的++
2.进行下一行的前半段输出时,抵消掉上一行后半段最后一个字符输出的–
3.除了第一行以外,每一行首字母的都比上一行最后一个+1
对于下半部分的输出,对称上半方面即可。
具体代码如下:
#include<stdio.h>
int main()
{
char a='A';//输出字符
int n;//行数
scanf("%d",&n);
//输出分为两方面,对上半个三角形与下半个三角形分别输出
for(int i=1;i<=(n+1)/2;i++)//输出上三角,行数为(n+1)/2
{
for(int j=1;j<=n-2*i+1;j++)//输出空格,每行的空格为(n-1)-2*(i-1)个
printf(" ");
//对字符的输出分两方面,一个循环用于输出递增字符,另一个输出递减字符
for(int j=1;j<=2*i-1;j++) // 1+2*(i-1)个字符
{
printf("%c",a);
a++;//每输出一个,字符分别+1
}
for(int j=1;j<=2*i-2;j++)//后半段字符比前半段少一个
{
if(j==1)//进行完成中间的字符输出时,单独进行字符-1 ,抵消输出最后一个字符后的+1
a--;
a--;//每输出一个字符前,进行字符-1
printf("%c",a);
}
//字符输出结束,单独处理除去第一行以外的输出,用以抵消输出最后一个字符后的-1
if(i!=1)
a++;
printf("\n");//字符输出结束,换行
}
//进行下三角的输出 ,与上半段类似,差别在于字符的输出,以及行数-1
for(int i=(n-1)/2;i>=1;i--) //从(n-1)/2行开始进行行输出
{
a--;//下行首字母比上行最后一个少1
if(i==(n-1)/2)//单独抵消掉上三角输出结束时的字符+1
a--;
for(int j=1;j<=n-2*i+1;j++)//空格的输出
printf(" ");
for(int j=1;j<=2*i-1;j++)//前半段字符输出
{
printf("%c",a);
a++;
}
for(int j=1;j<=2*i-2;j++)//后半段字符输出
{
if(j==1)//单独抵消前半段最后一个输出的+1
a--;
a--;
printf("%c",a);
}
printf("\n");
}
}