【C】输出任意行的菱形,你真的理解吗

其实像这种菱形代码、爱心代码、水仙花数代码等本质上是循环嵌套的灵活运用、是代码与数学的结合。本质上是将代码作为工具,来解决数学问题。所以只需分析问题、想出解决方法,至于复杂的计算,交给计算机就好了

分析问题

要想输出任意行的菱形,就得写个模板,可以先定义一个变量n来表示这个任意数

#include<stdio.h>
int main()
{
    int n;
    return 0;
}

要写模板,得先找个例子,首先我们先分析这个行数为5的菱形。

这个菱形可以分为以上三个部分,只要分别打印出这三个部分的图案,那么这个菱形就成了!

解决方法

第一部分

 第一部分要打印两行,也就是5/2行,即n/2行。

第一行要打印三个字符(两个空格),第二行要打印四个字符(一个空格),即 n-本行空格数

所以可以把控制行的for循环,以递减的形式写,即

#include<stdio.h>
int main()
{
    int n = 5;
    for(int i = n/2;i>0;i--)
    return 0;
}

这样,打印第一行时,i==2,打印第二行时,i==1,正好是本行的空格数。

然后要再嵌套一个循环来打印本行的字符(空格 和 *)

#include<stdio.h>
int main()
{
    int n = 5;
    for(int i = n/2;i>0;i--){
        for(int j = 0;j < n-i;j++)
    }
    return 0;
}

如何判断时打印空格还是星号*?

第一行要打印两个空格,第二行要打印一个空格,正好等于i,所以,j<i时,打印空格,否则打印*

正好用三目运算符来实现,代码如下

#include<stdio.h>
int main()
{
    int n = 5;
    for(int i = n/2;i>0;i--){
        for(int j = 0;j < n-i;j++)
            printf(j < i?" ":"*");
        printf("\n");//每行打印完后,换行
    }
    return 0;
}

运行结果,成功!!!

万事开头难,写完了第一部分,剩下的两个部分就简单多了

第二部分

代码如下

#include<stdio.h>
int main()
{
    int n = 5;
    //第一部分
    for(int i = n/2;i>0;i--){
        for(int j = 0;j < n-i;j++)
            printf(j < i?" ":"*");
        printf("\n");//每行打印完后,换行
    }
    //第二部分
    for(int i = 0;i<n;i++)
        printf("*");
    printf("\n");
    return 0;
}

 第三部分

第三部分的思路和第一部分相同,只是打印出一个倒三角

 先写一个for循环控制行(i要代表空格数,所以循环要从1开始)

for(int i = 1;i<=n/2;i++)

然后再嵌套一个for循环,打印字符(空格 和 星号*),代码和第一部分是一样的

//第三部分
for(int i = 1;i<=n/2;i++){
    for(int j = 0;j < n-i;j++)
            printf(j < i?" ":"*");
        printf("\n");//每行打印完后,换行
}

至此,我们的模板就完成了(n=5)

#include<stdio.h>
int main()
{
    int n = 5;
    //第一部分
    for (int i = n / 2; i > 0; i--) {
        for (int j = 0; j < n - i; j++)
            printf(j < i ? " " : "*");
        printf("\n");//每行打印完后,换行
    }
    //第二部分
    for (int i = 0; i < n; i++)
        printf("*");
    printf("\n");
    //第三部分
    for (int i = 1; i <= n / 2; i++) {
        for (int j = 0; j < n - i; j++)
            printf(j < i ? " " : "*");
        printf("\n");//每行打印完后,换行
    }
    return 0;
}

下面我们只需加一点小小的修改,加上一个scanf函数(vs编译器中,用scanf_s),来接受用户输入的行数n。

完整代码

#include<stdio.h>
int main()
{
    int n = 5;
    printf("请输入菱形行高:");
    scanf_s("%d", &n);
    //第一部分
    for (int i = n / 2; i > 0; i--) {
        for (int j = 0; j < n - i; j++)
            printf(j < i ? " " : "*");
        printf("\n");//每行打印完后,换行
    }
    //第二部分
    for (int i = 0; i < n; i++)
        printf("*");
    printf("\n");
    //第三部分
    for (int i = 1; i <= n / 2; i++) {
        for (int j = 0; j < n - i; j++)
            printf(j < i ? " " : "*");
        printf("\n");//每行打印完后,换行
    }
    return 0;
}

运行结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值