题目要求:
- 输入数字打印三角形排列的*图案
- 实现可以多组输入
- 实现输出菱形图案
如图:
写在前面:题目要求输出 * 三角形图案,一般题目如果不做特殊要求直接用打印函数输出题设要求即可。
分析: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("
");
}
}
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("
");
}
}
运行程序测试:
#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("
");
}
RowPrint(int n,int i) 函数提供两个参数,n、i 表示输出一个n行三角形的地 i 行,写入主函数测试。
#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;
}
最后运行通过。