无聊时,看到的字母金字塔编程题

题目:

    让程序要求用户输入的一个大写字母,使用嵌套循环产生像下面这样的金子塔图案:


        A

      ABA

   ABCBA

ABCDCBA

这种图案要扩展到用户输入的字符。例如,前面的图案是在输入D时需要产生的。提示:使用一个外部循环来处理行,在每一行中使用三个内部循环,一个处理空格,一个以升序打印字母,一个以降序打印字母。如果您的系统不使用ASCII或类似的以严格数字循序表示字母的编码。


ps:题目提示和下面不完全相同,但也是个不错的方法.


自我检讨:编程这么长时间了,看见这种题目,觉得很easy啦。所以也就没看提示,自己在那搞。虽然最后写出来,但是暴露了自己很多的问题,编程的不成熟,以及思维方式的不科学。


分析:要求输出这个图。首先找规律,我们发现每一行最大的字母是从'A'逐渐变大的,而且每一行的最大字母的位置是一定的。那么我们就可以以每一行最大字母为核心,打印出两边的字母。现在还有一个问题,就是每次输入的值不同,对应的输出位置也不同。这时,我们先将图补全看:

000A000

00ABA00

0ABCBA0

ABCDCBA

看图很容易知道,每一行的最大字母为位置是(输入字母 — ‘A’)的下标,这样每行的最大字母得到,最大字母位置得到,那么相应的图也就出来了。

代码:

#include <stdio.h>
#include <string.h>

int Display(char value)
{
	char pch[60];			//每行显示的字母
	int count  = 0;			//个数
	char ch = 'A';			//每行最大的字母
	int num = 0;			//pch下标
	//pch数组初始化
	memset(pch , ' ', sizeof(pch));		//''是为让用户看不到,为空
	pch[60] = '\0';						//字符串必须以‘\0’结尾

	printf("\nDisplay:\n");
	
	//判断value值得合法性
	if ( value < 'A' || value > 'Z')
	{
		printf("\n%c is illegal\n",value);
		return -1;
	}
	count = value - 'A' + 1;		//获得行数

	for (int i = 0; i < count; i++)   //控制每一行
	{
		
		num = count - 1;			//下标,初始为最大子母
		for(int j = i + 1 ; j > 0 ; j--) //控制每一行最大字母(包含)左边
		{
			pch[num] = ch + j -i -1;   //往左逐渐减小
			num--;
			
		}
		 num = count ;				//下标,初始为最大子母右边第一个
		for (int k = i; k > 0; k--)  //控制每一行最大字母(不包含)右边
		{
			 pch[num] = ch + k - i -1; //往左逐渐减小
			 num++;
		}
		//pch数组初始化
		printf("%s\n",pch);
		memset(pch , ' ',sizeof(pch));
		pch[60] = '\0';
		ch++;		//每行最大字母,逐渐加1
	}
	return 0;
}
int main()
{
	char input ;
	while(1)
	{
		fflush(stdin); //清空缓存,防止scanf 的'\n',残留
		printf("\nplease input(A~Z):");
		if(!scanf("%c",&input))    //输入合法值判断
		{		
			printf("\nError!you input error!\n");
			continue;
		}
		Display(input);   //调用显示函数
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值