画一个字母组成的菱形

写在前面:

题解是对具体题目的编程实现,不会具体讲解C语言语法。请先大致学习好语法,自己敲敲代码后再看题解(上来就直接看题解的习惯不好哟~)。在每一题的题解之前,会列出本题涉及到的语法知识供参考,可以在教材或其他学习资源找到这些内容学习。😀


 本题的预备知识:

  • 变量的定义与赋值操作
  • 输入(scanf)输出(printf)语句 
  • for、while循环语句及其嵌套

画一个字母组成的菱形

成绩10开启时间2020年03月28日 星期六 05:50
折扣0.8折扣时间2020年04月20日 星期一 08:50
允许迟交关闭时间2020年04月30日 星期四 05:50

输入顶行字符和图形的高,输出如图所示图形。

例如顶行字符为 ' A ' ,图形的高为 5

              A

            B   B

          C     C

        D         D

       E            E

        D         D

          C    C

            B B

             A

 测试输入期待的输出时间限制内存限制额外进程
测试用例 1 
  1. A,3↵
 
  1.   A  ↵
  2.  B B ↵
  3. C   C↵
  4.  B B ↵
  5.   A  ↵
1秒64M0

题解

这种输出图形的题主要是分清楚图形的结构就好办了。

1、分析结构

首先,可以看到图形的第一行和最后一行与中间的行有一个本质的不同,就是它们只需要输出一个字母,而中间的行需要输出两个字母。那么我们在输出的时候肯定是需要对首尾两行单独特殊考虑的。其次,看字母的变化:在图形的上半部分(包含中间的一行)是每行递增的,而对于图形的下半部分是每行递减的。下图是对结构的完整分析:

考虑到对称的结构,我们这里巧妙地使用了循环遍历 i 来实现每行的变化。是不是很乖啊~


2、代码实现

结构分析清楚后,代码就很简单了。主要是注意:

  1. 上述结构没有表现字母的变化,在代码中是这样实现的:用一个flag标记当前输出的是上半部分还是下半部分,然后每次检测flag标记来确认我们应该将字母递增还是递减
  2. 最外层循环(对于行的循环),应该考虑用num来记录已经输出的行数目。整个图应该输出 2h-1 次行,那么就控制 while 循环执行 2h-1 次。

 直接上代码啦~

#include <stdio.h>   //导入stdio.h库,里面包含输入输出函数

int main() {
    int h;
    char c;
    scanf("%c,%d", &c, &h);

    int i = 1, num = 0;  //i记录我们在分析时指定的循环变量、num记录已经输出的行数
    int flag = 0;  //flag = 0 表示正在输出上半部分(包含最中间行)、否则表示正在输出下半部分

    /* 循环输出 2h - 1 行 */
    while (num < 2 * h - 1) {
        /* 输出首尾两行的情况 */
        if (i == 1) {
            for (int j = 0; j < h - i; j++) //输出 h-i 个空格
                printf(" ");
            printf("%c", c);
            for (int j = 0; j < h - i; j++) //输出 h-i 个空格
                printf(" ");
            printf("\n");//一定记得换行
        }
        /* 输出中间行的情况 */
        else {
            for (int j = 0; j < h - i; j++)  //输出 h-i 个空格
                printf(" ");
            printf("%c", c);
            for (int j = 0; j < 2 * i - 3; j++)  //输出 2i-3 个空格
                printf(" ");
            printf("%c", c);
            for (int j = 0; j < h - i; j++) //输出 h-i 个空格
                printf(" ");
            printf("\n");  //一定记得换行
        }
        if (i >= h)  //当已经输出了最中间的一行
            flag = 1; //将flag设置为1
        /* 在输出上半部分的时候 */
        if (flag == 0) {
            i++;
            c++;
        }
        /* 在输出下半部分的时候 */
        else {
            i--;
            c--;
        }
        num++;  //输出的行数增加
    }
}

关于scanf中的符号问题:

根据题意,此题的两个输入是用 ','(英)隔开的。平常在默认情况下,scanf在读取输入的时候,会默认在空格、换行处断开,然后一一读入,处理输出的时候只需要将相同数量的变量对应上即可。而这里scanf不再能自动分割,你需要告诉它在哪里分割、读入数据,所以在scanf语句中加入了 ',',以表示在读入数据时碰到 ',' 就将内容分割,分别存入安排的两个变量中。



有任何问题欢迎评论交流,如果本文对您有帮助不妨点点赞,嘻嘻~ 


end 

欢迎关注个人公众号 鸡翅编程 ”,这里是认真且乖巧的码农一枚。

---- 做最乖巧的博客er,做最扎实的程序员 ----

旨在用心写好每一篇文章,平常会把笔记汇总成推送更新~

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值