分析: 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;

最后运行通过。

public static void main(String[] args){ System.out.println(args“ *”); System.out.println(args“ ***”); System.out.println(args“ *****”... public class Test { public static void main(String[] args) { // System.out.println(args[0]); // System.out.println(args[1]); for(int i=0;i<4;i++)...