L1-002 打印沙漏(方法启发与博主小白程序员丶钟同学)

 打印*来组成各种各样的形状题目中,这道题目真的对我这个萌新来说太要老命了,不过在看了一位大佬博主

小白程序员丶钟同学(非常非常感谢您的思想 但是这篇文章我会用自己的思路写一遍 如有抄袭文本内容我会删除的)的先用数学知识解决,再将代码开始编写,我的思路确实清晰了一点。下面我将这道题目每一步的代码,都在这里解释一下。

第一步 先将图像分开来

很明显,无论,无论用什么循环,都不如把这个图像变为两个图像。

 那么接下来就要简单了,我们只需要用两个大的for循环,把倒三角形的打法和三角形的打法打出来就行了。

第二步 分析上半部分形状

从1个*开始算,我们可以得出以下几个函数关系

空格数=所在行数-1

所在行数的*数量=2*(总行数-(所在行数-1))-1(总行数不算下半图片,以后所有的总行数都是这个意思)

我们得到了可以循环的公式,那么接下来就是简单的for循环的使用了

#include<stdio.h>
#include<math.h>
int main()
{
	int i;//所在行数
	int j;//空格数
	int k;//所在的行数的*数量
	int num;//*数量
	scanf("%d", &num);
	int hangshu;//总行数

	for (i = 1; i <= hangshu; i++)
	{
		for (j = 0; j < i-1 ; j++)
		{
			printf(" ");
		}
		for (k = 0; k < 2 * (hangshu - (i-1)) - 1;k++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
	}

 为什么是所在行数的大循环套了打出所在行数空格和*号的循环呢

这其实就是一种先后思想 无论是输出空格还是输出* 都是在所在行数的坏境下做的事情

所有写代码前就要分清楚for循环的主次之分

第三步 计算总行数的表达

我们输出的是num总*的数目,自然,总行数的表达式自然和num脱不开关系

所有上半部分代码变为了

#include<stdio.h>
#include<math.h>
int main()
{
	int i;//所在行数
	int j;//空格数
	int k;//所在的行数的*数量
	int num;//*数量
	scanf("%d", &num);
	int hangshu;//总行数
	hangshu = (int)(sqrt)((num + 1) / 2);
	for (i = 1; i <= hangshu; i++)
	{
		for (j = 0; j < i-1 ; j++)
		{
			printf(" ");
		}
		for (k = 0; k < 2 * (hangshu - (i-1)) - 1;k++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
	}

第四步 下半部分代码的编写

这个就相对于上半来说非常的简单了

#include<stdio.h>
#include<math.h>
int main()
{
	int i;//所在行数
	int j;//空格数
	int k;//所在的行数的*数量
	int num;//*数量
	scanf("%d", &num);
	int hangshu;//上半总行数
	hangshu = (int)(sqrt)((num + 1) / 2);
	for (i = 1; i <= hangshu; i++)
	{
		for (j = 0; j < i-1 ; j++)
		{
			printf(" ");
		}
		for (k = 0; k < 2 * (hangshu - (i-1)) - 1;k++)
		{
			printf("*");
		}
		printf("\n");
	}
	int underhangshu = hangshu - 1;// underhangshu为下半总行数
	for (i = 1; i <= underhangshu; i++)
	{
		for(j = 0; j <underhangshu-i; j++)
		{
			printf(" ");
		}
		for (k = 0; k <(i+1)*2-1; k++)
		{
			printf("*");
		}
		printf("\n");
	}

	return 0;
	}

当然 虽然此时代码基本成型 但是还是不符合题目的要求的 但是核心部分已经完成 本篇文章更侧重讲述代码是如何打出来的,再次感谢博主小白程序员丶钟同学提供的思路

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值