题目:
让程序要求用户输入的一个大写字母,使用嵌套循环产生像下面这样的金子塔图案:
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;
}