啊哈c语言——逻辑挑战5:奔跑的字母

之前我们已经学习了如何通过while循环,并结合暂停命令Sleep和 清屏幕命令system("cls")来实现"倒计时",本节我们将通过这些命令编写一个"奔跑的字母"的程序。 首先我们想一下,如果希望一个字母(假设这个字母是H)从屏幕的左边往右边跑,即第一秒时字母H在屏幕的第一行的最左边(也就是第一行第一列),第二秒时字母H在屏幕第一行的第二列,第三秒时字母H在屏幕第一行的第三列,以此类推,该怎么实现呢? 我们知道,如果直接使用printf("H");字母H就会出现在屏幕的 第一行第一列,即最靠近左上角的位置。那如何让字母H在屏幕的第一行第二列呢?我们可以用"空格"来占位。也就是说,在输出时先输出一个空格,再输出字母H,即printf(" H");(在H左边加一个空格来填充第一列,这样H就会出现在第二列)。同样,如果希望字母H在第一行第三列的话,只需在输出时,在H左边多加两个空格就可以了,即 printf(" H");好了,我们来尝试一下。

怎么样?字母H是不是从左边向右边移动了3步。用这种方法,我们也可以让字母移动50步,但是如果像上面这样写,是不是太麻烦了, 我们需要复制粘贴50次,然后每一次都要修改printf语句中字母H前面空格的个数,真是太麻烦了。

我们仔细分析一下上面这段代码,有3个部分基本上相同,只有 printf语句中字母H前面的"空格"的个数不同,在第1部分字母H前面有0 个空格,在第2部分字母H前面有1个空格,在第3部分字母H前面有2个空格。我们便想到了用while循环解决这个问题。

首先,仔细观察之前的代码你就会发现,其中有3段代码是差不多的。我们可以用while循环3次来解决重复的问题,代码如下:

运行一下你会发现,字母H并没有向右移动。这是为什么呢?因为 在上面的while循环中,虽然循环了3遍,但是每次循环输出的都是 printf("H");,字母H的左边并没有空格,所以字母H并没有向右边跑。把printf("H");改为printf(" H");也不行,那样每次输出的都 是字母H在第一行第二列的位置,字母H会一直停留在第一行第二列, 不会往右边跑。需要解决的是,在循环第1次时H在第一列,即H前面有 0个空格;循环第2次时H在第二列,即H前面有1个空格;循环第3次时H 在第三列,即H前面有2个空格。

我们发现每次循环空格的变换规律是0、1、2,这恰好和变量a的变 化规律是一样的。第1次循环时变量a的值为0,第2次循环时变量a的值 为1,第3次循环时变量a的值为2。也就是说每次循环时,在打印字母"H"前,打印a个空格就可以了。可是如何使每次循环输出a个空格呢?这里我们需要用到while循环的嵌套。代码如下:

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
    int a, b;
    a=0;
    while(a<=2)
    {
        system("cls");
        b=1;
        while(b<=a)
        {
            printf(" ");
            b=b+1;
        }
        printf("H");
        Sleep(1000);
        a=a+1;
    }
    system("pause");
    return 0;
}

在上面这段代码中,我们利用while a循环来控制字母H一共需要走多少步,利用while b循环来控制字母H每走一步需要在字母H前面打印多少个空格。

下面我们来仔细分析一下上面这段代码。

计算机自顶向下一步步执行:

相关推荐
m0_748257185 分钟前
Spring Boot FileUpLoad and Interceptor(文件上传和拦截器,Web入门知识)
前端·spring boot·后端
桃园码工23 分钟前
15_HTML5 表单属性 --[HTML5 API 学习之旅]
前端·html5·表单属性
Yan.love39 分钟前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶42 分钟前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥42 分钟前
java提高正则处理效率
java·开发语言
stm 学习ing42 分钟前
HDLBits训练5
c语言·fpga开发·fpga·eda·hdlbits·pld·hdl语言
百万蹄蹄向前冲1 小时前
2024不一样的VUE3期末考查
前端·javascript·程序员
智慧老师1 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
lxyzcm1 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
轻口味1 小时前
【每日学点鸿蒙知识】AVCodec、SmartPerf工具、web组件加载、监听键盘的显示隐藏、Asset Store Kit
前端·华为·harmonyos