前言:今天看到了一个实现字母金字塔的题目,这里做个小记录和分享!!!
一、实现要求
编写一个程序,在用户输入某个大写字母后,产生一个金字塔图案。
例如输入字母E,则产生如下图案:
可理解为,金字塔字母前为空字符,如图:
那么我们就可以直接简单粗暴点了,实现这种图案很简单,只需要先确定字母产生的最大行数,然后从第一行开始打印,依次打印顺序就是空格,升序字母,降序字母,就能形成这种对称的金字塔图形了;
二、程序简述
主函数:
int main()
{
char alp;
printf("请输入英文字母:");
scanf("%c", &alp);
alp_jinzita(alp); //产生字母金字塔图案
return 0;
}
这里主要通过alp_jinzita()函数实现图案生成;
void alp_jinzita(char alp)函数:
void alp_jinzita(char alp)
{
if(alp>='A'&& alp<='Z')
{
int line = alp - 'A' + 1; //计算字母间ASCII码的差值,加1,得到真正的行数
int i, j;
for(i = 1; i<=line; i++)
{
//打印每行的空格数,行数越小空格越多
for(j = 0; j<line-i; j++)
{
printf(" ");
}
//打印完空格后,接着打印升序字母,从小到大
for(j = 0; j<i; j++)
{
printf("%c",'A'+j);
}
//打印降序字母,从大到小
for(j-=2; j>=0; j--)//因在金字塔中间的字母的两边是对称的,减去2正好是从他的前一个开始
{
printf("%c", 'A'+j);
}
printf("\n");
}
}
这里以大写字母输入为例,首先判断输入的字母是否是大写字母,通过if(alp>='A'&& alp<='Z')判断是否在区间内,若是则进行下面操作,以下是一个简单的算法思路:
1.先计算出金字塔会生成的行数,因为每个字母对应的ASCII码值是连续的,可以通过计算其ASCII码的差值,得出行数,如输入E,对应的line=69-65=4,但是需要加上E自己本身的一行,所以还需要+1,即line=69-65+1=5;
2.随着字母依次叠加,每行前面需要用空格填充,随着行数增加,空字符减少,i为行数,j为字符数,每行的空格字符等于总行数减去行号数,即的到需要用空格占位的数量;
3.依次按照空格,升序字母,降序字母打印,在字符'A'的基础顺序递增,便的到连续的升序字母;
4.在打印完升序后,在j已经增加后的基础上,进行递减操作,不过这里要注意,因为递增的尾,和递减的头都是同一个字母,所以这里的算法就是跳过了这个重合的字母,直接从下一个开始,即需要从j-=2开始一次递减,当然当j--到小于0了证明已经回到最初的0位置了,此时跳出for循环;
---小写字母的输入也是同样的思路,这里不做赘述啦!!
三、完整代码:
#include <stdio.h>
#include <stdlib.h>
/*编写一个程序,在用户输入某个大写字母后,产生一个金字塔图案。
例如输入字母E,则产生如下图案:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
可理解为,金字塔字母前为空字符,如图:
____A
___ABA
__ABCBA
_ABCDCBA
ABCDEDCBA*/
void alp_jinzita(char alp)
{
if(alp>='A'&& alp<='Z')
{
int line = alp - 'A' + 1; //计算字母间ASCII码的差值,加1,得到真正的行数
int i, j;
for(i = 1; i<=line; i++)
{
//打印每行的空格数,行数越小空格越多
for(j = 0; j<line-i; j++)
{
printf(" ");
}
//打印完空格后,接着打印升序字母,从小到大
for(j = 0; j<i; j++)
{
printf("%c",'A'+j);
}
//打印降序字母,从大到小
for(j-=2; j>=0; j--) //因为在金字塔中中间的字母的两边是对称的,减去2正好是从他的前一个开始
{
printf("%c", 'A'+j);
}
printf("\n");
}
}
//小写字母,方法雷同
else if(alp>='a'&& alp<='z')
{
int line = alp - 'a' + 1; //计算字母间ASCII码的差值,加1,得到真正的行数
int i, j;
for(i = 1; i<=line; i++)
{
//打印每行的空格数,行数越小空格越多
for(j = 0; j<line-i; j++)
{
printf(" ");
}
//打印完空格后,接着打印升序字母,从小到大
for(j = 0; j<i; j++)
{
printf("%c",'a'+j);
}
//打印降序字母,从大到小
for(j-=2; j>=0; j--) //因为在金字塔中中间的字母的两边是对称的,减去2正好是从他的前一个开始
{
printf("%c", 'a'+j);
}
printf("\n");
}
}
}
int main()
{
char alp;
printf("请输入英文字母:");
scanf("%c", &alp);
alp_jinzita(alp); //产生字母金字塔图案
return 0;
}
以上是小编对这道题的一些实现思路,当然这是一个比较笨的方法,不过刚开始没什么好的思路,还没有进行太多优化,暂时写了这个,在这里做个记录和分享,大佬们有什么其他方法,多多指教,期待你们的分享,后续有更好的思路再和大家分享啦!小编菜鸡,望大佬们轻喷。