c语言简单程序设计-----------打印菱形

发布于:2022-11-28 ⋅ 阅读:(260) ⋅ 点赞:(0)

 题目要求:设计一个程序,使其能够对输入的数字,打印出一个对应行数的菱形。输入的数字为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 后查看

网站公告

今日签到

点亮在社区的每一天
去签到