10.《C语言》——【牛客网BC104 — BC109练习题讲解】


在这里插入图片描述


前言

本章节主要讲解牛客网练习题BC104翻转金字塔图案 — BC109 正斜线形图案


练习题

BC104 翻转金字塔图案

题目要求:

描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的翻转金字塔图案。

输入描述:
多组输入,一个整数(2~20),表示翻转金字塔边的长度,即“*”的数量,也表示输出行数。

输出描述:
针对每行输入,输出用“”组成的金字塔,每个“”后面有一个空格。

示例1

在这里插入图片描述


解答:

代码如下:


#include<stdio.h>
int main()
{
	//BC104 翻转金字塔图案 
	int n = 0;
	//多组输入
	while (scanf("%d", &n) != EOF) 
	{
		//行的控制
		for (int i = 0; i < n; i++)
		{
			//打印空格
			for (int j = 0; j < i; j++)
			{
				printf(" ");
			}
			//打印*号
			for (int j = 0; j < n - i; j++)
			{
				printf("* ");
			}
			//换行
			printf("\n");
		}
	}
	return 0;
}

运行结果:

在这里插入图片描述

在这里插入图片描述

分析:

  1. 题目要求多组输入,我们使用while循环,当scanf返回值不等于EOF(-1)时,能实现多次输入。
  2. 行的控制,比如要打印4行,就直接初始化 int i = 0; i < n; i++,就可以完成,打印的行数。
  3. 看下图,我们需要使用一个for循环打印出空格,那么可以看到空格是上到下循环递增的,所以for循环的表达式是 int j = 0; j < i; j++ 。
    在这里插入图片描述
  4. 当我们完成了空格的打印,那么对于* 号的打印就没问题了,我们需要一个for循环来完成,可以看到图形星号是从上到下递减的,那么for循环的表达式为 int j = 0; j < n - i; j++
  5. 最后打印完一行的图形,需要换行到下一行

BC105 菱形图案

题目要求:
描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的菱形图案。

输入描述:
多组输入,一个整数(2~20)。

输出描述:
针对每行输入,输出用“”组成的菱形,每个“”后面有一个空格。

示例1

在这里插入图片描述


解答:

代码如下:


#include<stdio.h>
int main()
{
	//BC105 菱形图案 
	int n = 0; 
	//多组输入
	while (scanf("%d", &n) != EOF)
	{
		//打印上半行
		for (int i = 0; i < n + 1; i++)
		{
			for (int j = 0; j < n - i; j++)
			{
				printf(" ");
			}
			for (int j = 0; j <= i; j++)
			{
				printf("* "); 
			}
			printf("\n");
		}
		//打印下半行
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j <= i; j++)
			{
				printf(" "); 
			}
			for (int j = 0; j < n - i; j++)
			{
				printf("* "); 
			}
			printf("\n");
		}
	}
	return 0;
}

运行结果:

在这里插入图片描述

在这里插入图片描述

分析:

  1. 一样的要求多组输入,使用while循环,当scanf的返回值不等于EOF(-1)时,就能够进行多组的输入 。

上半行打印:

在这里插入图片描述

  1. 先进行打印上半行的图形,如下图,我们可以看到其实就是打印一个三角形。对于行的控制,我们输入2时,输出其实是多了一行,所以我们需要n+1,(int i = 0; i < n + 1; i++) 。
  2. 对于图形的打印,我们先打印空格,发现空格是依次递减的,我们使用for循环,表达式为,(int j = 0; j < n - i; j++)

在这里插入图片描述

  1. 然后是图形的打印,图形是依次递增的,我们用for循环,表达式为 (int j = 0; j <= i; j++) ,就能够完成上半行的图形打印,每当打印完一行就换行。

在这里插入图片描述

下半行打印:

在这里插入图片描述

  1. 下半行的打印其实就是一个倒三角图形,也是一样对于行的控制,for循环,表达式为 (int i = 0; i < n; i++)

  2. 对于空格的打印,空格是依次递增,依然需要for循环,表达式为(int j = 0; j <= i; j++)

  3. 对于图形的打印,图形是依次递减的,也是需要for循环,表达为(int j = 0; j < n - i; j++),我们可以看到图形之间是存在空格的,所以在打印时,需要在*后面加一个空格键,最后打印完一行进行换行。


BC106 K形图案

题目要求:

描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的K形图案。

输入描述:
多组输入,一个整数(2~20)。

输出描述:
针对每行输入,输出用“”组成的K形,每个“”后面有一个空格。

示例1

在这里插入图片描述


解答:

代码如下:


#include<stdio.h>
int main()
{
	//BC106 K形图案 
	int n = 0; 
	while (scanf("%d", &n) != EOF)
	{
		//打印上半行
		for (int i = 0; i < n + 1; i++)
		{
			for (int j = 0; j < n - i + 1; j++)
			{
				printf("* "); 
			}
			printf("\n");  	
		}
		//打印下半行
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j <= i + 1; j++)
			{
				printf("* ");
			}
			printf("\n"); 
		}
	}
	return 0; 
}

运行结果:

在这里插入图片描述

在这里插入图片描述

分析:

  1. 一样的要求多组输入,使用while循环,当scanf的返回值不等于EOF(-1)时,就能够进行多组的输入。

打印上半行 :

在这里插入图片描述

  1. 对于行的控制,当我输入2时,输出的是3行,所以需要n+1,for循环表达式为:int i = 0; i < n + 1; i++
  2. 星号的打印,发现是依次递减的,中间存在空格,所以要加上空格,for循环表达式为: int j = 0; j < n - i + 1; j++
  3. 每打印完一行,需要换行

打印下半行:

在这里插入图片描述

  1. 行的控制,没问题,输入几,就输出几行
  2. 图形的打印,也是需要for循环,表达式为:int j = 0; j <= i + 1; j++,每次打印完一行需要进行换行。

BC107 箭形图案

题目要求:

描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的箭形图案。

输入描述:
本题多组输入,每行一个整数(2~20)。

输出描述:
针对每行输入,输出用“*”组成的箭形。

示例1

在这里插入图片描述


解答:

代码如下:


#include<stdio.h>
int main()
{
	//BC107 箭形图案 
	int n = 0; 
	while (scanf("%d", &n) != EOF)
	{
		//打印上半行
		for (int i = 0; i < n + 1; i++)
		{
			for (int j = 0; j < n - i; j++)
			{
				printf("  "); 
			}
			for (int j = 0; j <= i; j++)
			{
				printf("*"); 
			}
			printf("\n"); 
		}
		//打印下半行
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j <= i; j++)
			{
				printf("  "); 
			}
			for (int j = 0; j < n - i; j++)
			{
				printf("*"); 
			}
			printf("\n"); 
		}
	}
	return 0; 
}

运行结果:

在这里插入图片描述

在这里插入图片描述

分析:

  1. 一样的要求多组输入,使用while循环,当scanf的返回值不等于EOF(-1)时,就能够进行多组的输入。

打印上半行:

在这里插入图片描述

  1. 行的控制,发现输入5,输出是6行,那么n+1,for循环表达式为:int i = 0; i < n + 1; i++。
  2. 空格的打印,可以看到是依次递减的,我们用for循环,表达式为:int j = 0; j < n - i; j++ , 注意,这里的空格是2个空格键的距离。
  3. 星号的打印,可以看到星号是依次递增的,并且星号之间不存在空格,我们使用for循环,表达式为:int j = 0; j <= i; j++ ,
  4. 最后,每次打印完一行,需要进行换行

打印下半行:

在这里插入图片描述

  1. 行的控制,可以看到输入几行,输出几行,使用for循环,表达式为:int i = 0; i < n; i++ 。
  2. 空格的打印,空格打印是2个空格键的距离,我们发现是依次递增的,我们使用for循环,表达式:int j = 0; j <= i; j++。
  3. 星号的打印,星号的打印之间不存在空格,并且,我们发现星号是依次递减的,也是一样使用for循环,表达式为:int j = 0; j < n - i; j++。
  4. 最后,每次打印完一行,需要进行换行。

BC108 反斜线形图案

题目要求:

描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的反斜线形图案。

输入描述:
多组输入,一个整数(2~20),表示输出的行数,也表示组成反斜线的“*”的数量。

输出描述:
针对每行输入,输出用“*”组成的反斜线。

示例1

在这里插入图片描述


解答:

代码如下:


#include<stdio.h>
int main()
{
	//BC108 反斜线形图案 
	int n = 0; 
	while (scanf("%d", &n) != EOF)
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if (i == j)
				{
					printf("*"); 
				}
				else
				{
					printf(" "); 
				}
			}
			printf("\n"); 
		}
	}
	return 0; 
}
 

运行结果:

在这里插入图片描述

在这里插入图片描述

分析:

  1. 一样的要求多组输入,使用while循环,当scanf的返回值不等于EOF(-1)时,就能够进行多组的输入。
  2. 行的控制,输入几,输出几行,使用for循环,表达式为:int i = 0; i < n; i++
  3. 列的控制,需要使用for循环,然后使用 if 判断,我们发现,每次打印进行换行,是依次靠近右边的,那么,表达式:如果 i == j ,打印星号,否则走else,打印空格。
  4. 每次打印完一行,需要进行换行

在这里插入图片描述


BC109 正斜线形图案

题目要求:

描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的正斜线形图案。

输入描述:
多组输入,一个整数(2~20),表示输出的行数,也表示组成正斜线的“*”的数量。

输出描述:
针对每行输入,输出用“*”组成的正斜线。

示例1

在这里插入图片描述


解答:

代码如下:


#include<stdio.h>
int main()
{
	//BC109 正斜线形图案
	int n = 0;
	while (scanf("%d", &n) != EOF)
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if (j == n - i - 1)
				{
					printf("*");
				}
				else
				{
					printf(" ");
				}
			}
			printf("\n"); 
		}
	}
	return 0; 
}

运行结果:

在这里插入图片描述

在这里插入图片描述

分析:

  1. 一样的要求多组输入,使用while循环,当scanf的返回值不等于EOF(-1)时,就能够进行多组的输入。
  2. 行的控制,输入几,输出几行,使用for循环,表达式为:int i = 0; i < n; i++。
  3. 图形的打印,需要使用for循环,然后 if 判断,看星号打印的起始点,每次打印换行依次靠近左边,那么,判断表达式为:j == n - i - 1 , 满足打印星号,否则走else,打印空格。
  4. 每次打印完一行,需要进行换行。
    在这里插入图片描述

总结

以上就是今天要讲的内容,感谢大家的阅读,希望能够给个大拇哥,感谢老板们~

在这里插入图片描述

  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值