Bootstrap

C语言打印输出星号图形(三角形、菱形、漏斗)

1. 介绍

这个初学循环的时候,可能会被布置为作业。这里我们介绍的不是找规律,而是这一类问题的通解。

其实这个问题可以被抽象为高中的线性规划,只不过我们这里需要离散化直线和区域内的点。

2. 案例分析

我们以漏斗型星号为例来分析。

在这里插入图片描述
如图所示,我们把坐标系给放正,需要( n = 4 n = 4 n=4)输出星号的点就是上面标的那些。显然这些点必须为整点。

实际上需要输出星号的点就是

N = n − 1 { ( r − c ) ( r + c − 2 N ) ≥ 0 0 ≤ r ≤ 2 N 0 ≤ c ≤ 2 N N = n-1\\ \begin{align*} \begin{cases} (r-c)(r+c-2N) \ge 0 \\ 0 \le r \le 2N \\ 0 \le c \le 2N \end{cases} \\ \end{align*} N=n1 (rc)(r+c2N)00r2N0c2N

r r r是行号,从 0 0 0行开始。
c c c是列号,从 0 0 0行开始。
这里 n n n是漏斗中心到底部的距离加一,
N = n − 1 N=n-1 N=n1
r c r\quad c rc都需要是整数值。

3. 漏斗型

  • 形状
    在这里插入图片描述

  • 区域表达式
    N = n − 1 { ( r − c ) ( r + c − 2 N ) ≥ 0 0 ≤ r ≤ 2 N 0 ≤ c ≤ 2 N N = n-1\\ \begin{align*} \begin{cases} (r-c)(r+c-2N) \ge 0 \\ 0 \le r \le 2N \\ 0 \le c \le 2N \end{cases} \\ \end{align*} N=n1 (rc)(r+c2N)00r2N0c2N

  • 代码

#include <stdio.h>


void loudou_stars(int n) {


    int r ;
    int c ;

    int N = n - 1;


    for ( r = 0; r <= 2 * N; r++ ) {
        for ( c = 0; c <= 2 * N; c++ ) {
            if ((r - c) * (r + c - 2 * N) >= 0) {
                printf("*");
            }
            else {
                printf(" ");
            }
        }
        printf("\n");
    }
}


int main()
{

    int n = 4;
    
    loudou_stars( n );
    
    return 0;
}
  • 结果
    在这里插入图片描述

4. 直角三角形

4.1 左上直角三角形
  • 形式
    在这里插入图片描述

  • 区域表达式
    N = n − 1 { r + c − N ≤ 0 0 ≤ r ≤ N 0 ≤ c ≤ N N = n -1\\ \begin{align*} \begin{cases} r +c - N\le 0 \\ 0 \le r \le N \\ 0 \le c \le N \end{cases} \\ \end{align*} N=n1 r+cN00rN0cN

  • 代码

#include <stdio.h>


void lu_trianle(int n) {

    int r;
    int c;
    int N = n - 1;
    for ( r = 0; r <= N; r++) {
        for ( c = 0; c <= N; c++) {
            if ( r + c - N <= 0  ) {
                printf("*");
            }
            else {
                printf(" ");
            }
        }
        printf("\n");
    }
}
int main()
{

    lu_trianle(5);
    return 0;
}
4.2 右上直角三角形
  • 形式
    在这里插入图片描述
  • 区域表达式
    N = n − 1 { r − c ≤ 0 0 ≤ r ≤ N 0 ≤ c ≤ N N = n-1\\ \begin{align*} \begin{cases} r - c \le 0 \\ 0 \le r \le N \\ 0 \le c \le N \end{cases} \\ \end{align*} N=n1 rc00rN0cN
  • 代码
#include <stdio.h>


void ru_trianle(int n) {

    int r;
    int c;
    int N = n - 1;

    for ( r = 0; r <= N; r++) {
        for ( c = 0; c <= N; c++) {
            if ( r - c  <= 0  ) {
                printf("*");
            }
            else {
                printf(" ");
            }
        }
        printf("\n");
    }
}
int main()
{

    ru_trianle(5);
    return 0;
}
4.3 左下直角三角形

其实对右上的三角形代码符号变一下就可以了

  • 形式
    在这里插入图片描述

  • 区域表达式
    N = n − 1 { r − c ≥ 0 0 ≤ r ≤ N 0 ≤ c ≤ N N = n-1\\ \begin{align*} \begin{cases} r - c \ge 0 \\ 0 \le r \le N \\ 0 \le c \le N \end{cases} \\ \end{align*} N=n1 rc00rN0cN

  • 代码

#include <stdio.h>


void lb_trianle(int n) {

    int r;
    int c;
    int N = n - 1;
    for ( r = 0; r <= N; r++) {
        for ( c = 0; c <= N; c++) {
            if ( r - c  >= 0  ) {
                printf("*");
            }
            else {
                printf(" ");
            }
        }
        printf("\n");
    }
}
int main()
{

    lb_trianle(5);
    return 0;
}
4.4 右下直角三角形

将左上三角形换个符号就可以得到

  • 形状
    在这里插入图片描述
  • 区域表达式
    N = n − 1 { r + c − N ≥ 0 0 ≤ r ≤ N 0 ≤ c ≤ N N = n -1\\ \begin{align*} \begin{cases} r +c - N \ge 0 \\ 0 \le r \le N \\ 0 \le c \le N \end{cases} \\ \end{align*} N=n1 r+cN00rN0cN
  • 代码
#include <stdio.h>


void rb_trianle(int n) {

    int r;
    int c;
    int N = n - 1;

    for ( r = 0; r <= N; r++) {
        for ( c = 0; c <= N; c++) {
            if ( r + c - N >= 0  ) {
                printf("*");
            }
            else {
                printf(" ");
            }
        }
        printf("\n");
    }
}
int main()
{

    rb_trianle(5);
    return 0;
}

5. 等腰三角形

5.1 正等腰三角形
  • 形状
    在这里插入图片描述
  • 区域表达式

N = n − 1 { r + c − N ≥ 0 r − c + N ≥ 0 0 ≤ r ≤ N 0 ≤ c ≤ 2 N N = n-1\\ \begin{align*} \begin{cases} r+c-N \ge 0 \\ r-c+N \ge 0\\ 0 \le r \le N\\ 0 \le c \le 2N \end{cases} \\ \end{align*} N=n1 r+cN0rc+N00rN0c2N

  • 代码
#include <stdio.h>

void iso_trangle(int n) {


    int N = n - 1;
    int r;
    int c;
    for (r = 0; r <= N; r++) {
        for (c = 0; c <= 2 * N; c++) {
            if ((r + c  - N >= 0 ) && (r - c + N >= 0)) {
                printf("*");
            }
            else {
                printf(" ");
            }
        }
        printf("\n");
    }

}

int main() {

    iso_trangle(5);
    return 0;
}
5.2 倒等腰三角形
  • 形状
    在这里插入图片描述

  • 区域表达式
    N = n − 1 { r − c ≤ 0 r + c − 2 N ≤ 0 0 ≤ r ≤ N 0 ≤ c ≤ 2 N N = n-1\\ \begin{align*} \begin{cases} r - c \le 0 \\ r + c - 2N \le 0\\ 0 \le r \le N\\ 0 \le c \le 2N \end{cases} \\ \end{align*} N=n1 rc0r+c2N00rN0c2N

  • 代码

#include <stdio.h>

void iso_trangle_rev(int n) {


    int N = n - 1;
    int r;
    int c;
    for (r = 0; r <= N; r++) {
        for (c = 0; c <= 2 * N; c++) {
            if ((r - c <= 0 ) && (r + c - 2 * N <= 0)) {
                printf("*");
            }
            else {
                printf(" ");
            }
        }
        printf("\n");
    }

}

int main() {

    iso_trangle_rev(5);
    return 0;
}

6. 平行四边形

6.1 纵向左下平行四边形
  • 形状
    在这里插入图片描述
  • 区域表达式
    N = n − 1 { r + c − N ≥ 0 r + c − 2 N ≤ 0 0 ≤ r ≤ 2 N 0 ≤ c ≤ N N = n-1\\ \begin{align*} \begin{cases} r + c - N \ge 0\\ r + c - 2N \le 0 \\ 0 \le r \le 2N\\ 0 \le c \le N \end{cases} \\ \end{align*} N=n1 r+cN0r+c2N00r2N0cN
  • 代码
#include <stdio.h>


void lb_parall(int n) {

    int N = n - 1;
    int r;
    int c;


    for (r = 0; r <= 2 * N; r++) {
        for (c = 0; c <= N; c++) {
            if ((r + c - N >= 0) && (r + c - 2 * N <= 0)) {
                printf("*");
            }
            else {
                printf(" ");
            }
        }
        printf("\n");
    }

}

int main()
{

    lb_parall(5);


    return 0;
}
6.2 纵向左上平行四边形
  • 形状
    在这里插入图片描述
  • 区域表达式
    N = n − 1 { r − c ≥ 0 r − c − N ≤ 0 0 ≤ r ≤ 2 N 0 ≤ c ≤ N N = n-1\\ \begin{align*} \begin{cases} r - c \ge 0\\ r - c - N \le 0 \\ 0 \le r \le 2N\\ 0 \le c \le N \end{cases} \\ \end{align*} N=n1 rc0rcN00r2N0cN
  • 代码
#include <stdio.h>


void lu_parall(int n) {

    int N = n - 1;
    int r;
    int c;


    for (r = 0; r <= 2 * N; r++) {
        for (c = 0; c <= N; c++) {
            if ((r - c >= 0) && (r - c - N <= 0)) {
                printf("*");
            }
            else {
                printf(" ");
            }
        }
        printf("\n");
    }

}

int main()
{

    lu_parall(5);


    return 0;
}
6.3 横向左上平行四边形
  • 形状
    在这里插入图片描述

  • 区域表达式
    N = n − 1 { r − c ≤ 0 r − c + N ≥ 0 0 ≤ r ≤ N 0 ≤ c ≤ 2 N N = n-1\\ \begin{align*} \begin{cases} r - c \le 0\\ r - c + N \ge 0 \\ 0 \le r \le N\\ 0 \le c \le 2N \end{cases} \\ \end{align*} N=n1 rc0rc+N00rN0c2N

  • 代码

#include <stdio.h>


void lu_parall_h(int n) {

    int N = n - 1;
    int r;
    int c;


    for (r = 0; r <= N; r++) {
        for (c = 0; c <= 2 * N; c++) {
            if ((r - c  <= 0) && (r - c + N >= 0)) {
                printf("*");
            }
            else {
                printf(" ");
            }
        }
        printf("\n");
    }

}

int main()
{

    lu_parall_h(5);


    return 0;
}
6.4 横向左下平行四边形
  • 形状
    在这里插入图片描述

  • 区域表达式
    N = n − 1 { r + c − N ≥ 0 r + c − 2 N ≤ 0 0 ≤ r ≤ N 0 ≤ c ≤ 2 N N = n-1\\ \begin{align*} \begin{cases} r + c - N \ge 0\\ r + c - 2N \le 0 \\ 0 \le r \le N\\ 0 \le c \le 2N \end{cases} \\ \end{align*} N=n1 r+cN0r+c2N00rN0c2N

  • 代码

#include <stdio.h>


void lb_parall_h(int n) {

    int N = n - 1;
    int r;
    int c;


    for (r = 0; r <= N; r++) {
        for (c = 0; c <= 2 * N; c++) {
            if ((r + c - N >= 0) && (r + c - 2 * N <= 0)) {
                printf("*");
            }
            else {
                printf(" ");
            }
        }
        printf("\n");
    }

}

int main()
{

    lb_parall_h(5);


    return 0;
}

7. 菱形

  • 形状
    在这里插入图片描述

  • 区域表达式
    N = n − 1 { r + c − N ≥ 0 r + c − 3 N ≤ 0 r − c + N ≥ 0 r − c − N ≤ 0 0 ≤ r ≤ 2 N 0 ≤ c ≤ 2 N N = n-1\\ \begin{align*} \begin{cases} r + c - N \ge 0 \\ r + c - 3N \le 0 \\ r - c + N \ge 0 \\ r - c - N \le 0\\ 0 \le r \le 2N\\ 0 \le c \le 2N \end{cases} \\ \end{align*} N=n1 r+cN0r+c3N0rc+N0rcN00r2N0c2N

  • 代码

#include <stdio.h>

void rhom_stars(int n)
{

    int N = n - 1;
    int r;
    int c;


    for ( r = 0;r <= 2 * N; ++r) {
        for ( c = 0; c <= 2 * N; ++c) {
            if ( (r + c - N >= 0 && r + c - 3 * N <= 0) && (r - c + N >= 0 && r - c - N <= 0)) {
                printf("*");
            }
            else {
                printf(" ");
            }
        }
        printf("\n");
    }

}


int main()
{

    rhom_stars(3);

    return 0;
}
;