To my CSDN

打印图形输出三角形 *

题目要求:

  • 输入数字打印三角形排列的*图案
  • 实现可以多组输入
  • 实现输出菱形图案

如图:

写在前面:题目要求输出 * 三角形图案,一般题目如果不做特殊要求直接用打印函数输出题设要求即可。

分析:n为用户输入

第一行:n-1个空格      1个*
第二行:n-2个空格      3个*(2×2-1)
.
.
第n行:n-n个空格        2×n-1(2×行-1)

总结:空格的数量和*的数量只于行有关

 根据这一特性我们可写出两个函数,分别打印向上的三角形图案和向下的三角形图案。

#include <stdio.h>

void PrintUp(int n)//给出行数打印上三角
{
    for(int i = 1; i <= n; i++)//i表示当前行号
    {
        for(int j = 0; j < n - i; j++)//打印空格
        {
            printf(" ");
        }
        for(int j = 0; j < 2*i-1; j++)//打印*
        {
            printf("*");
        }
        printf("\n");
    }
}

void PrintDown(int n)//给出行数打印下三角
{
    for(int i = n; i >= 0; i--)//i表示当前行号
    {
        for(int j = 0; j < n - i; j++)//打印空格
        {
            printf(" ");
        }
        for(int j = 0; j < 2*i-1; j++)//打印*
        {
            printf("*");
        }
        printf("\n");
    }
}

运行程序测试:

#include <stdio.h>
int main()
{

    int n;      //用户输入
  
    while(scanf("%d",&n) != EOF)//多组输入
    {
        PrintUp(n);
        PrintDown(n);
    }
    
    return 0;
}

运行结果:

可是结果并非我们设想的那样输出菱形,而是输出了两个底边贴靠在一起的三角形图案。(这里提供一种方法,可以通过移动打印函数的光标,把PrintUp(n);函数打印过后的光标向上移动一行,使PrintDown(n);的第一行与上一个函数的最后一行重合即可)说明我们在设计函数的时候设计的不够完整,功能太过单一,实用性不强。因此我们需要重新设计函数以实现题目要求输出菱形。

用两个三角形拼接是肯定不行了,那么就设计一个通用性强一点的,设计一个能输出制定的某行的函数。只需要提取之前函数的代码重新封装即可。

void RowPrint(int n,int i)//给出行数打印一行
{
    for(int j = 0; j < n - i; j++)//打印空格
    {
        printf(" ");
    }
    for(int j = 0; j < 2*i-1; j++)//打印*
    {
        printf("*");
    }
    printf("\n");
}

RowPrint(int n,int i) 函数提供两个参数,ni 表示输出一个n行三角形的地 行,写入主函数测试。

#include <stdio.h>
int main()
{

    while(scanf("%d",&n) != EOF)
    {
        for(int i = 1; i <= n; i++)//第一行到第n行
        {
            RowPrint(n,i);
        }
        for(int i = n-1; i > 0; i--)//第n-1行到第一行
        {
            RowPrint(n,i);
        }
    }

    return 0;
}

最后运行通过。

posted @ 2019-10-30 21:06  我叫RT  阅读(775)  评论(0编辑  收藏  举报