练习题之打印图案

前言

本次的练习题,相信大家在第一次遇到打印图案时,总是会摸不着头脑,不知道如何去操作

笔者也一样,我真诚的希望通过这么一篇博客可以让大家在遇到打印图案这类题目时,有自己的应

对方法,所以本次博客文字居多并且由浅入深,请大家耐心看完

我们从最简单的开始吧

题目一

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

输入:

10
2

输出 **********

        **

1分析 为什么要有这么简单的题目呢,为的是能够循序渐进,让初学者也能够入门,首先它的输入可以

通过while(scanf()==1)通过scanf的返回值来重复输入 那输出也同样是简单了只要根据输入的值通过for循环来打印即可

2代码实现

#include<stdio.h>
int main()
{
int a;
while(scanf("%d",&a)!=EOF)
{
int i=0;
for(i=0;i<a;i++)
printf("*");
printf("\n");
}
return 0;
}

题目二

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

多组输入,一个整数(1~20),表示正方形的长度,也表示输出行数。

针对每行输入,输出用“*”组成的对应边长的正方形,每个“*”后面有一个空格。

输入:

4

输出:

* * * *
* * * *
* * * *
* * * *

1分析,哎呀就是两个for循环嵌套,没有难度,两个循环控制的数 j i 都等于输入的数

内层代码就直接打印* 就行

2代码实现

#include <stdio.h>
int main() {
    int a;
    while (scanf("%d", &a) != EOF) { 
int i=0;
for(i=0;i<a;i++)
{
    int j=0;
    for(j=0;j<a;j++)
    {
        printf("* ");
    }
    printf("\n");
}
    }
    return 0;
}

题目三

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

多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数。

针对每行输入,输出用“*”组成的对应长度的直角三角形,每个“*”后面有一个空格。

输入:

4

输出:

*
* *
* * *
* * * *

1分析,首先他同样是两个for循环,只是两个控制的数 i j  看 第一行打印一个

第二行打印两个 等等    i j 一个控制行 一个控制列数 

我们以4为例   那么就应该打印4行,每行的 * 多少取决于下一个操作数 j

我们让i一开始为0,让它小于4

i的取值范围为0~3 共有4个数字 分别对应每一行

刚好,当i等于0时打印一个 *  我们让j一开始为0让它小于等于i 然后让 j++

正好可以一 一对应

2代码实现

#include <stdio.h>
int main() {
    int a;
    while (scanf("%d", &a) != EOF) {
int i=0;
for(i=0;i<a;i++)
{
    int j=0;
    for(j=0;j<=i;j++)
    {
        printf("* ");
    }
    printf("\n");
}
    }
    return 0;
}

3复盘 这个代码固然简单但它的思路很重要,打印图案的终极诀窍在于找到

输入数与循环控制数 i j 的关系

题目四

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

多组输入,一个整数(2~20),表示翻转直角三角形直角边的长度,即“*”的数量,也表示输出行数。

针对每行输入,输出用“*”组成的对应长度的翻转直角三角形,每个“*”后面有一个空格。

输入:

5

输出:

* * * * *
* * * *
* * *
* *
*

1分析 这个题目和上个题目是一样的,只是第二层循环的控制关系发生了改变

以5为例

我们其实仍然可以是使 i 的范围为0-4 他仍然是执行五次

但是j与i的关系要发生改变

我们完全可以使j一开始就为输入的数5,但是我们得要每一行少打印一个符号

那我们可以看到 i是在递增的呀,是不是 所以关系不就来了

只要      j-i>0不就行了

当i为0时  j一开始就为5(输入的数)那么此时 j的可执行语句的值为 5 4 3 2 1 打印5个

当i为1时  j一开始就为5(输入的数)那么此时 j的可执行语句的值为 5 4 3 2  打印4个

等等·······

这就是 i 与 j 与我们要得到的东西之间的关系

但还有一种思路

你看 我们难道不可以先让我们的i 的值为输入值 5(还是以5为例)

i 决定行数 那么i的取值就应该为 5 4 3 2 1

那么i的结束条件应该为i>0

第一层循环就决定了   重点还是在第二层循环

我们得让j 和i和输出打印图案构建关系

当 i为5时  我们要打印5个符号 诶这是不是非常的对应吗 这时只需

让j 为5,让j至少大于0   j--  j的值可以为5 4 3 2 1

那么j就可以被i赋值,完成图案打印

2代码实现

#include <stdio.h>
int main() {
    int a;
    while(scanf("%d",&a)!=EOF)
    {
int i=a;
for(i=a;i>0;i--)
{
    int j=0;
    for(j=0;j<i;j++)
    {
        printf("* ");
    }
    printf("\n");
}
    }
    return 0;
}

3复盘我们这个代码是第二种思路,第一种思路大家可以自行尝试

这个代码就更加体现了 数字无所谓,主要是上下限以及循环与打印内容之间的对应关系

从这题开始我们就不那么详细的讲解了

题目五

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的带空格直角三角形图案。

多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数

针对每行输入,输出用“*”组成的对应长度的直角三角形,每个“*”后面有一个空格。

输入:

5

输出:

        * 
      * * 
    * * * 
  * * * * 
* * * * *

1分析 这个题目有两种字符需要打印,咱们可以通过三目操作符来打印

看嘛,随便来

以5为例

直接让我们的 i 初始化为 1   i<=5(输入数)  i++呗

第一行4个空格一个*

第二行3个空格两个*

等等·········

那么此时要打印的内容是一样多的 只是什么时候打印空格什么时候打印*

直接看,我们让j的取值从1到5,也就是 j一开始为1   j++

那么中间的判断为 j<=5

这时只需要在内层循环中printf  再加上一个三目操作符

当i>=j时 打印* 否则打印空格,至此思路已经很清晰了

#include<stdio.h>
int main()
{
int a;
while(scanf("%d",&a)!=EOF)
{
int i=0;
for(i=1;i<=a;i++)
{
int j=1;
for(j=1;j<=a;j++)
{
printf(i-j>=0?"*":" ");
}
printf("\n");
}
}
return 0;
}

让我们看看结果

题目六

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

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

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

输入:

4

输出:

   * 
  * * 
 * * * 
* * * * 

1分析 首先这个图案里有空格

我们以4为例 第一行3个空格 第二行2个空格 第三行1个空格 第四行没有空格

我们不妨将 i从大到小 也就是 i=4(输入数) i>0 i--

那接下来就是 j 此时j可以作为两个分别的for循环

一个打印空格 一个打印 * 

1空格 如果让j开始为1  那么第一行要打印(输入数-1)的空格

 怎么办 我们完全可以 让 j<i  然后j++

此时可以看到 第一行 j的取值为 1 2 3刚好3次

然后随着i的减少打印的次数也减少

2*  打完空格后 怎么来打印*  随着i的减少*打印的越多

所以j与i可以构建关系  我们让j一开始为1

j<n-i+2  j++

那么此题目就解决了,大家其实可以多换几个数字来做题,结果也可以是一样的

2代码实现

#include <stdio.h>
int main() {
	int a;
	while (scanf("%d", &a) != EOF) {
		int i = a;
		for (i = a; i > 0; i--)
		{
			int j = 1;
			for (j = 1; j <i; j++)
				printf(" ");
			for (j = 1; j < a - i + 2; j++)
			{
				printf("* ");
			}
			printf("\n");
		}
	}
	return 0;
}

看看结果

题目七

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

多组输入,一个整数(2~20)

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

1分析我不想解释了,下半部分思路是一样的

2代码实现

#include <stdio.h>
int main() {
    int a;
    while (scanf("%d", &a) != EOF) { 
int i=a;
//第一部分
for(i=a;i>0;i--)
{
    int j=1;
    for(j=i;j>0;j--)
    {
        printf(" ");
    }
    for(j=a;j>=i;j--)
    {
        printf("* ");
    }
    printf("\n");

}
//第二部分
for(i=a+1;i>0;i--)
{
    printf("* ");
}
printf("\n");
//第三部分
for(i=1;i<=a;i++)
{
    int j=1;
    for(j=i;j>0;j--)
    {
        printf(" ");
    }
    for(j=a;j>=i;j--)
    {
        printf("* ");
    }
    printf("\n");
}
    }
    return 0;
}

看结果

扩展题目

C语言必打代码 爱心代码
1.加上f是为节省步骤,因为浮点数是会默认为double类型 加上f直接不用转化
2.(x * x + y * y - 1)的三次方 - x * x * y * y * y = 0为公式
3.x y 的改变不同这是由于 x y轴 在控制台里不是等距的

直接看代码,最后一个了,祝大家天天开心

int main()
{
	printf("祝你每天都开心呦\n");
	system("color 0e");
	float x, y, a;	
	for (y = 1.5f; y > -1.5; y -= 0.1f)
	{
		for (x = -1.5f; x < 1.5f; x += .05f)//x轴走的比y轴少,所以打印的多
		{
			a = x * x + y * y - 1;
			printf(a * a * a - x * x * y * y*y< 0.0f ? "x" : " ");//笛卡尔心形线公式
		}
		Sleep(200);
		printf("\n");
	}
	return 0;
}

看结果

所以通过数学的解析几何,我们理论上是可以打印出任何一种用表达式表示的图案

最后我们可以试一试打印圆形

看代码

int main()
{
	float a, b;
	system("color 0e");
	for (a = 0.0f; a < 2.0f; a += 0.05f)
	{
		for (b = 0.0f; b < 2.0f; b += 0.025f)
		{
			printf((a - 1) * (a - 1) + (b - 1) * (b - 1) < 1.0f ? "*" : " ");
		}
		printf("\n");
	}
	return 0;
}

看结果

是不是很奇妙,大家可自行去打印其他的图案,但要注意的是横轴的密集程度一般比纵轴多一倍

是他的两倍,因为 在小黑窗上一个字符是一个立起来的长方形 高比长大

ok 也算是敲完了 希望大家在遇到一般的图案题目时能够轻松解决,祝大家开心

  • 44
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 题目描述: 编写一个程序,打印出如下所示的菱形图案。 * *** ***** ******* ********* ******* ***** *** * 输入格式: 本题无输入。 输出格式: 按照下列格式输出菱形图案: * *** ***** ******* ********* ******* ***** *** * 输出样例: * *** ***** ******* ********* ******* ***** *** * 提示: 1. 要打印出菱形图案,需要使用嵌套循环。 2. 菱形的上半部分和下半部分是对称的,可以分别打印出来。 3. 菱形的每一行的空格数和星号数都是有规律的,可以根据行数来计算。 ### 回答2: 习题4-9是要求打印出一个菱形图案。首先,我们需要了解菱形的特点:它由一串奇数个*组成,上半部分是由空格和*组成的的等边三角形,下半部分是对称的。根据这个特点,我们可以使用循环和条件语句来实现。 首先,我们定义一个变量n,表示菱形的行数。然后我们可以将菱形拆分成两部分来打印:上半部分和下半部分。 上半部分的打印可以分为两个步骤:打印空格和打印*号。首先,我们设定一个变量k,表示当前行的空格数。根据菱形的对称性,空格数逐行递减,从n-1开始,步长为-1,直到0。在每一行的开始,我们使用一个for循环打印k个空格。然后,我们设定一个变量m,表示当前行的*号数。*号数逐行递增,从1开始,步长为2,直到2*n-1为止。在每一行的结尾,我们使用一个for循环打印m个*号。 下半部分的打印与上半部分类似,不同的是,空格数逐行递增,而*号数逐行递减。 下面是完整的代码实现: ```python n = int(input("请输入菱形的行数:")) # 打印上半部分 for i in range(n): k = n - 1 - i for j in range(k): print(" ", end="") m = 2 * i + 1 for j in range(m): print("*", end="") print() # 打印下半部分 for i in range(n-2, -1, -1): k = n - 1 - i for j in range(k): print(" ", end="") m = 2 * i + 1 for j in range(m): print("*", end="") print() ``` 通过以上代码,我们可以根据输入的行数打印出相应的菱形图案。 ### 回答3: 习题4-9 要求打印一个菱形图案,可以用以下程序实现: ```python rows = int(input("请输入菱形的行数:")) # 输入菱形的行数 for i in range(1, rows+1): # 打印上半部分菱形 for j in range(1, rows-i+1): print(" ", end="") for j in range(1, 2*i): print("*", end="") print() for i in range(rows-1, 0, -1): # 打印下半部分菱形 for j in range(1, rows-i+1): print(" ", end="") for j in range(1, 2*i): print("*", end="") print() ``` 程序首先读取用户输入的菱形行数,然后进行上半部分和下半部分的循环打印。上半部分的每一行,先打印一定数量的空格,然后打印一定数量的星号字符。下半部分的每一行,也是先打印一定数量的空格,然后打印一定数量的星号字符,不过星号数量递减。整体效果就是打印出一个菱形图案。 比如,输入行数为5时,程序的输出如下: ``` * *** ***** ******* ********* ******* ***** *** * ``` 这样就完成了习题4-9的要求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值