IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C语言】for循环打印菱形个人思路步骤+心得 -> 正文阅读

[C++知识库]【C语言】for循环打印菱形个人思路步骤+心得

注:本人CS系大学生。C之前有接触过但基本忘得差不多了,目前在重新学习C。

今天看到个题目,说是用C的for循环语句打印一个图示的实心菱形:

对别人来说很简单,但对于我这个刚刚认识完循环语句的新手来说很难。光是想就想了很久很久,终于想出来了。写这篇博客一是将自己的思路存档供日后查看,二是把我的思路分享给大家,希望对同样是学习路上的大家有所帮助。完整源码在文末。

题目要求打印的效果是菱形,但实际上我们可以构造一个7*7的正方形。只不过菱形的组成部分用星号来表示,而空白部分则用表示。这里以一个7*7的菱形为例:

空白效果:

实际效果:

第一步思路就清晰地出来了,使用两个for语句来生成空白的正方形:

#include<stdio.h>
int main() {
	int coloum = 7; // 定义菱形的宽(高)度
	// i代表行, j代表列
	for (int i = 0;i <= coloum;i++) {
		for (int j = 0;j <= coloum;j++) {

		}
	}
}

之后我们先让它们生成只有空格的7x7的正方形。为了方便识别,这里空格用"?"代替。

#include<stdio.h>
int main() {
	int coloum = 7; // 定义菱形的宽(高)度
	// i代表行, j代表列
	for (int i = 0;i <= coloum;i++) {
		printf("? ");
		for (int j = 0;j <= coloum;j++) {
			printf("? ");

		}
		printf("\n"); // 别忘了换行噢
	}
}

生成的效果如下:

成功生成正方形之后,接下来思考如何在这个正方形之中来画出所需要的实心菱形。

再来观察一下应该得到的图形的样子:

想要在这个正方形内画出菱形,就要确认组成菱形的每一个星号所在的位置。

你会发现每一行至少都会有一个星号,而且最中间的列一定会有一个星号。?那么其余的星号也一定与这个中间列的星号有关。我们将这个中间列的星号定义为int mid = coloum/2+1,即中位数。

(注意:在C中对整数进行除运算时会向下取整。想要获得之中位数的话,需要在原来的值上+1)

从第4行看起,第1、第2、第3、第4行的星号数量都是呈金字塔状递增的;而第5、第6、第7行的星号数量呈金字塔状递减。那么说明在不同行之间,星号的变化规律并不完全一样。所以我们需要把行数分割为上半部分和下半部分,也就是说,我们要对i的取值分别讨论。

#include<stdio.h>
int main() {
	int coloum = 7; // 定义菱形的宽(高)度
	int mid = coloum / 2 + 1; // 获取菱形行(列)的中位数,也就是最中间行(或列)的位置
	// i代表行, j代表列
	for (int i = 0;i <= coloum;i++) {
		if (i <= mid) { // 当行数处于上半区(包括最中间的行)时
			for (int j = 0;j <= coloum;j++) {
				printf("? ");
			}

		}else if (i > mid) { // 当行数处于下半区时
			for (int j = 0;j <= coloum;j++) {
				printf("? ");
			}
		
		}
		printf("\n"); // 别忘了换行噢
	}
}

我们将上半区单独分出来仔细观察:

?

在第一行中,星星所处的位置只有4。

在第二行中,星星所处的位置为3,4,5。即[3,5]这个区间。

在第三行中,星星所处的位置为2,3,4,5,6。即[2,6]这个区间。

在第四行中,星星所处的位置为1,2,3,4,5,6,7。即[1,7]这个区间。

不难发现,星星所处的位置为一个闭区间,分别为[4,4],[3,5],[2,6],[1,7]……即为4±0,4±1,4±2……

所以我们可以这样想:如果j(列数)处于这个区间内,那么输出“*”,否则输出空格。而且这些区间都是与菱形宽(高)度的中位数相关的。

即,星号的位置为一个区间。而对于上半区来说,这个区间为:[行的中位数(mid)-(当前行数-1),行的中位数(mid)+(当前行数-1)]。用代码实现便是:

for (int j = 0;j <= coloum;j++) {
				if (j >= mid - (i - 1) && j <= mid + (i - 1)) {
					printf("*");
				}
				else
					printf(" ");
			}

执行结果如下:

(因为还没处理下半部分代码,所以那里全是问号)?

接下来我们来看下半区:

?在第五行中,星号所处的位置为2,3,4,5,6,即[2,6]这个区间。

在第六行中,星号所处的位置为3,4,5,即[3,5]这个区间。

在第七行中,星号所处的位置只有4。

不难发现,星号所处的位置为一个闭区间,分别为[2,6],[3,5],[4,4]。即为4±2,4±1,4±0。星号的变化顺序刚好与前3行相反,为递减关系。

对于下半区来说,星号所处的区间规律为:[mid-(总行数-当前行数),mid+(总行数-当前行数)]。用代码实现就是:

for (int j = 0;j <= coloum;j++) {
				if (j >= mid - (coloum - i) && j <= mid + (coloum - i)) {
					printf("*");
				}
				else
					printf(" ");
			}

执行结果如下:

至此,代码已完成,可以实现题目要求的功能。可以自由改动column的值,生成任意大小的菱形。(注:coloum值必须为奇数,不然不能生成菱形)?

完整源码如下:

#include<stdio.h>
int main() {
	int column = 7; // 定义菱形的高度(宽度)
	int mid = column / 2 + 1; // 获取菱形高(宽)的中位数
	printf("%d\n", mid);
	// i是行数 j是列数
	for (int i = 1;i <= column;i++) { // 对行进行循环
		if (i <= mid) { // 判断行数是在上方还是下方。这里是上方的情况(包括中间一行
			for (int j = 1;j <= column;j++) { // 对列进行循环
				// 判断单个列的情况
				// 对上半区来说:
				// 星星的位置为一个区间 即[行的中位数-(行数-1),行的中位数+(行数-1)]
				if (j >= mid - (i - 1) && j <= mid + (i - 1)) {  
					printf("*"); // 输出星号
				}
				else
					printf(" "); // 输出空格
			}
		}
		else if (i > mid) { // 判断行数是否处于下方
			for (int j = 1;j <= column;j++) {
				// 判断单个列的情况
				// 对下半区来说:
				// 星星的位置为一个区间 即[行的中位数-(总行数-当前行数),行的中位数+(总行数-当前行数)]
				if (j>=mid-(column-i) && j<=mid+(column-i)) {  
					printf("*"); // 输出星号
				}
				else
					printf(" "); // 输出空格
			}

		}
		printf("\n");
	}
}

?感谢你的阅读!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 13:48:12  更:2022-01-08 13:49:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:52:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码