简单版:使用C语言,将输入的英文字母,产生一个字母金字塔图案

前言:今天看到了一个实现字母金字塔的题目,这里做个小记录和分享!!!

一、实现要求

编写一个程序,在用户输入某个大写字母后,产生一个金字塔图案。

例如输入字母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;
    }

以上是小编对这道题的一些实现思路,当然这是一个比较笨的方法,不过刚开始没什么好的思路,还没有进行太多优化,暂时写了这个,在这里做个记录和分享,大佬们有什么其他方法,多多指教,期待你们的分享,后续有更好的思路再和大家分享啦!小编菜鸡,望大佬们轻喷。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值