题目要求:设计一个程序,使其能够对输入的数字,打印出一个对应行数的菱形。输入的数字为5的时候,打印的结果是
源代码如下:
#include<stdio.h>
int main()
{
int num=0;
printf("请输入层数(必须是奇数)\n");
scanf("%d",&num);
for(int i=1;i<=(num+1)/2;i++)
{
for(int j=1;j<=(num+1)/2-i;j++)
{
printf(" ");
}
for(int j=1;j<=2*i-1;j++)
{
printf("*");
}
printf("\n");
}
for(int i=1;i<=(num-1)/2;i++){
for(int j=1;j<=i;j++)
{
printf(" ");
}
for(int j=1;j<=(num-2*i);j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
具体分析过程:从示例可以看出,所需要的图形是由空格和星号*组成的。显然,我们并不能直接一次打印出所需的图形,其中必须要运用到循环结构,改变中间变量的数值,打印出不同数目的空格和星号*,使其组合形成非常对称的菱形。而且,我们可以把图形分成两部分,即两个等边三角形,所以现在我们先研究如何打印一个等边三角形。
我们先观察一下简单的等边三角形,
printf(" *\n");
printf(" ***\n");
printf(" *****\n");
printf(" *******\n");
printf(" *********\n");
printf(" ***********\n");
printf("*************\n");
不难发现每行星号和空格的数值如下表
从中可以看出,*号的数量随着行数的增加而每次加2,而空格数随着行数的增加而减1,打印符号的总数每次加1。如果我们记行数为i,那么每行的到*号前空格数为7-i,每行的*号数目为2i-1。而这个7就是我们输入的行数,那么我们可以写出下面的代码
for(int i=1;i<=n;i++){
//每次循环打印一行
//打印空格,空格数是n-i个
for(int j=1;j<=n-i;j++){
printf(" ");
}
//打印*,个数是2i-1
for(int j=1;j<=2*i-1;j++){
printf("*");
}
//打印换行符
printf("\n");
}
到现在,我们已经完成了一半的任务。接着打印一个下三角形,
printf("*************\n");
printf(" ***********\n");
printf(" *********\n");
printf(" *******\n");
printf(" *****\n");
printf(" ***\n");
printf(" *\n");
同样的,我们能归纳出下表
从中可以看出,*号的数量随着行数的增加而每次加2,而空格数随着行数的增加而加1,打印符号的总数每次减1。如果我们记行数为i,输入的总行数为num,那么每行的到*号前空格数为i-1,每行的*号数目为num*2-1-2(i-1)。那么我们可以写出下面的代码
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i-1; j++)
{
printf(" ");
}
for (int j = 1; j <= n*2+1-2*i; j++)
{
printf("*");
}
printf("\n");
}
接下来我们把代码写到一起,进行优化。用for循环结构进行连接
for(int i=1;i<=(num+1)/2;i++){
//每次循环打印一行
//打印空格,空格数是n-i个
for(int j=1;j<=(num+1)/2-i;j++){
printf(" ");
}
//打印*,个数是2i-1
for(int j=1;j<=2*i-1;j++){
printf("*");
}
//打印换行符
printf("\n");
}
for(int i=1;i<=(num-1)/2;i++){
for (int j = 1; j <= i; j++)
{
printf(" ");
}
for (int j = 1; j <= (num-1)/2*2+1-2*i; j++)
{
printf("*");
}
printf("\n");
}
当然了,连接过程中有几个问题:
1.分块的过程中,将最中间的那一行划在哪里,剩下的三角形第一行的空格数就不是0了,而是1。即原先的倒三角第一行的
for (int j = 1; j <= i-1; j++)
改为
for (int j = 1; j <= i; j++)
2.按我的划分,第一部分的行数为(num+1)/2,第二部分行数为(num-1)/2,用其替换原先的行数即
for(int j=1;j<=(num+1)/2-i;j++)
for (int j=1;j<=(num-1)/2*2+1-2*i;j++)
3.注意换行,否则打印出来的都在一行上
printf("\n");
在这里我再记录上最近写代码出现的问题,scanf中有\n
scanf(" %d",&num);
导致需要额外输入一个非空白字符作为结束,值得注意。
另外,大家也可以思考一下,如何打印中空的菱形?左对齐和右对齐的三角形?以及其组合成的各种图像?
本文含有隐藏内容,请 开通VIP 后查看