《C语言大学教程(第八版)》第四章 课后习题 4.31 - 4.32 参考答案

前言
  最近在学习《C语言大学教程(第八版)》第四章课后习题4.31-4.32时,遇到了一个问题,题目中要求用printf语句每次打印一个星(*)或一个空格,最少的使用printf语句,结合这两点,最少的使用次数为2次。

  一般情况下,大都可以想到,使用4次printf语句,完成本道题目的打印,即先打印上半部分再打印下半部分。为此,想挑战一下,既然能想到最少使用printf语句的次数为2次,那要如何实现呢,思考了许久,后来查阅了chatgpt,给到了一种解法。

  可能你会问,问了chatgpt,那还有啥可说的呢。乍一看,此话当真如此。可实际的情况是,根据chatgpt给到的解法,对for循环语句的使用玩法有了更进一步的了解,打开了思路,有一种豁然开朗的感觉,得到了一种启发。因此,决定写一篇心得体会。还是老话长谈,一方面做一下记录,一方面希望可以帮到有需要的同学。

在这里插入图片描述
在这里插入图片描述

  这道题,有如下几个要求:

  1.用printf语句每次打印一个星(*)或一个空格。

  2.尽可能多地使用循环(通过嵌套的for语句)来最少地使用printf语句。

  真正的难点在于最少地使用printf语句,根据上述两点的要求,最少是两次,一次是printf(“%s”, " “);打印空格,一次是printf(”%s", “*”);打印星号。

思考
  需要解决的关键是如何找到合适的for循环控制条件,根据书中以往的知识,我们知道不要在循环体内,去修改for语句头里面的变量,不然会导致一个隐蔽的问题,经测试会导致无限循环。
在这里插入图片描述

在这里插入图片描述

解决
  解题的关键在于,虽然不要在循环体内修改for语句头里的变量,但是可以修改循环的条件,代码如下:

#include <stdio.h>

int main(void)
{
	int a;
    int b;
    int c;
    int d;
    int e;

    e = 1;

    printf("Enter a integer: ");
    scanf("%d", &a);

    b = a / 2;

    for (c = 1; c <= a; c++)
    {
        for (d = 1; d <= b; d++)
        {
            printf(" ");
        }

        for (d = 1; d <= e; d++)
        {
            printf("*");
        }

        puts("");

        if (c <= a / 2)
        {
            b--;
            e += 2;
        }
        else
        {
            b++;
            e -= 2;
        }
    }
}

  运行代码,验证正确与否,结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值