打印菱形

题目描述:

输出N(N为奇数)行由字母组成的菱形,第一行是字母A,第二行是BCDCB,第三行是CDEFGFEDC,以此类推,菱形上下对称。

输入:

一个奇数N。0<N<16。

输出:

N行字母组成的菱形图案。

输入示例:

5

输出示例:

    A
  BCDCB
CDEFGFEDC
  BCDCB
    A

题解:

本题相对于普通的打印菱形的‘ * ’形加入了字符的变更。难点在于对字符的处理。
具体思路如下:
对于整个菱形,分上上半部分三角形和下半部分倒三角形两部分输出。难点在于空格数量与字符个数的输出,以及对字符顺序的处理。

  1. 首先对于空格个数:第一行为在正中间的一个字符,故空格个数为(n-1)/2,尔后每一行相对于上一行前端多了两个字符,即空格数量每一行一次-2,即可得第i行空格个数:(n-1)/2-2(i-1)*。
  2. 其次对于字符数:由于字符的输出的特殊性(前半部分递增,后半部分递减),故分为前后两部分输出。第一行有一个字符,其下每一行前半部分相对于上一行多了两个字符,即可得第i行前半部分字符个数为1+2*(i-1),即为2*i-1。而对于后半部分字符,仅比前半部分少1,故为2*i-2
  3. 最后对于字符的处理:可按照以下步骤:
    初始定义字符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");
	}
	
	
	
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值