C语言打印菱形

article/2025/9/27 12:53:38

打印菱形这道题对于初学编程者来说简直是噩梦,曾经我就是栽在这上面的,后来编程编多了之后对打印菱形也觉得不再那么难了,去年在公众号写了一篇推送是关于打印菱形的,觉得对一些师弟师妹还是有所帮助的,今天就把这道题分享出来。以下是我遇到的各种各样的菱形:
在这里插入图片描述
普通菱形,输入n,输出n行n列的菱形

难度系数:♥
在这里插入图片描述
n行空心菱形,输入n,输出n行空心菱形

难度系数:♥♥
在这里插入图片描述
n行挖空菱形,输入n,输出n行n列空格菱形

难度系数:♥♥♥

在这里插入图片描述
n行数字菱形,输入n,输入n行数字从外到内递增的数字菱形

难度系数:♥♥♥♥
在这里插入图片描述
有边框空心菱形,输入n,输出n行带有边框的空心菱形

难度系数:♥♥♥♥♥

首先我们要明确这是一个随着n的大小改变的菱形,所以我们肯定要用到循环,并且循环的次数与n有关。如果题目要求是输出n行,那我们的循环就是0(n-1)或者1n;如果要求是输出(2n+1)行,那我们的循环就0-2n或者1~(2n+1)即可。(后面以输出n行为例分析)
第一个是普通的实心菱形,循环n行大家都懂,问题就在列要怎样循环。难道是看出来的吗?不错,我就是通过看得出来的循环次数。具体怎么看呢?
根据图直接看有点难度,所以我们根据各行数据来看
在这里插入图片描述
我们需要将整个菱形分成四块来考虑,从上到下空格的个数先从n/2递减到0后递增到n/2,而行循环因子i又从0递增到n,故自然可联想到用i与n/2来表示空格个数。因为空格个数是非负数,所以我们引进绝对值|n/2-i|表示空格个数。打完空格之后,我们就要正式用 ’ * '打印菱形了。通过观察我们发现 * 号的个数为奇数,并且变化规律跟空格正好相反,所以
号个数即是-2*(空格个数)+1+C(常数)=-2*(空格个数)+C(常数),通过观察我们发现这个常数C正好是n/2。于是第一种菱形就可以顺利完成了!
在这里插入图片描述
第二个是空心菱形,与实心菱形相似,可看成在实心菱形上再打了一个空格菱形。由于每行的号数不多,并且可以看到号正好位于空格菱形的外围,所以我们可以将打印号放在打印空格菱形前后顺便打印,即在打印空格菱形之前打号,打印完空格菱形之后再打印号。同样,我们将相关数据列出来然后观察规律。号前空格与实习菱形一致,而我们发现n-2|n/2-i|-2的值除了首尾两行外,其他都与空格菱形的空格个数一致,而首尾两行是-1表示在该处不需打空格反而需要退一个格,但由于我们当前位置为号,而退格后依旧要打号,所以我们可以直接判断是否为第一行或最后一行,是则少打印一个号即可。
在这里插入图片描述
第三个是挖空菱形,该菱形是上述两个的合体,我们可以看成把一个实心菱形的各个字符替换成另一种字符,再插入一个空心菱形。所以我们把该菱形分成输出空心菱形前后号和输出空心菱形两部分。通过数据对比,我们不难发现,输出空心菱形前后号的数据与实心菱形输出号前空格个数一致,然后就是输出一个空心菱形,最后要记得在输出空心菱形之后输出空心菱形之后的号,根据对称可知,空心菱形后号个数与空心菱形前号一致。
在这里插入图片描述
第四个是数字菱形,该菱形的特点是数字从外到内逐层递增。我们发现该菱形中轴线数字的变化规律是先从1递增到(n+1)/2,然后再递减到1,并且每一行的数字也是从1递增到中轴线,再递减到1,因此我们要找到中轴线所在的位置(方便判断循环因子是否到达中轴线)。通过列数据我们发现中轴线所在位置(j从0开始循环)为n/2-|n/2-i|,所以在每一行中我们的数字加到“j==n/2-|n/2-i|”处时应该转成递减,所以我们引进要填充的数字k,在每一行开始时k为1,在j从0到n/2-|n/2-i|-1中,k逐次递增,在j从n/2-|n/2-i|到n-2*|n/2-i|-1中k递减。然后将打印星号改为打印数字即可。
在这里插入图片描述
第五个是边框空心菱形。从名字可知,该菱形由边框和空心菱形组成,我们可以将边框和空心菱形分开来考虑。第一行和最后一行为边框,可直接用从0到n-1打印号实现。左右边框在每一行的开头和结尾打印号即可实现。中间即是空心菱形的领域,基本上跟打印空心菱形一样,只是要注意被边框覆盖的地方空格和号要省略。
将打印空格和打印
号分开考虑,通过数字之间的关系特点,运用循环完成菱形的打印。

由于菱形是对称的,所以绝对值是最好的数据描述工具,要巧妙地运用绝对值,将对称部分的循环用同一个带有绝对值的表达式表示出来。

值得注意的是n/2为整数除,所以不会得到小数,也不是四舍五入。

中轴线所在位置(j从0开始循环)为n/2-|n/2-i|。

//挖空菱形for(i=0;i<n;i++){for(j=0;j<abs(n/2-i);j++)printf("*");printf("*");for(j=0;j<n-2*abs(n/2-i)-2;j++)printf(" ");if(j!=0)printf("*");for(j=0;j<abs(n/2-i);j++)printf("*");printf("\n");}printf("\n");//边框菱形for(i=0;i<n;i++){if(i==0||i==n-1){for(j=0;j<n;j++)printf("*");printf("\n");}else{printf("*");for(j=0;j<abs(n/2-i)-1;j++)printf(" ");if(j!=0)printf("*");for(j=0;j<n-2*abs(n/2-i)-1;j++)printf(" ");if(j!=0)printf("*");for(j=0;j<abs(n/2-i)-1;j++)printf(" ");if(j!=0)printf("*");printf("\n");}}//数字菱形for(i=0;i<n;i++){int k=1;for(j=0;j<abs(n/2-i);j++)printf(" ");for(j=0;j<n-2*abs(n/2-i);j++){printf("%d",k);if(j<n/2-abs(n/2-i))k++;elsek--;}printf("\n");}//实心菱形for(i=0;i<n;i++){for(j=0;j<abs(n/2-i);j++)printf(" ");for(j=0;j<n-2*abs(n/2-i);j++)printf("*");printf("\n");}printf("\n");//空心菱形for(i=0;i<n;i++){for(j=0;j<abs(n/2-i);j++)printf(" ");printf("*");for(j=0;j<n-2*abs(n/2-i)-2;j++)printf(" ");if(j!=0)printf("*");printf("\n");}

http://chatgpt.dhexx.cn/article/DTrt29Ng.shtml

相关文章

打印菱形图案的两种方法

打印菱形图案 本题要求编写程序&#xff0c;打印一个高度为n的、由“*”组成的正菱形图案。 输入格式: 输入在一行中给出一个正的奇数n。 输出格式: 输出由n行星号“*”组成的菱形&#xff0c;如样例所示。每个星号后跟一个空格。 输入样例: 7 输出样例: 方法一&#x…

C语言——打印菱形

输入上半部分的行数来打印出一个菱形&#xff0c;效果如图&#xff1a; 这里将他分为两部分来分析&#xff0c;主要就是找每一部分的空格个数与 * 个数的规律 分析上半部分&#xff1a; 代码如下&#xff1a; //上半部分&#xff1a;for (int i 1; i < n; i) { //行数做循…

打印菱形

各种各样的打印菱形 打印菱形 打印菱形打印挖空菱形打印数字菱形 打印菱形 1.初级版 Description 由键盘输入正数n&#xff08;n<30&#xff09;&#xff0c;要求输出如下2*n1行的菱形图案。 输入样例 2 输出样例 代码实现1&#xff1a; #include <stdio.h> #in…

打印菱形-c语言

分析&#xff1a;打印菱形&#xff0c;可以分上下两个部分来打印&#xff0c;因为上下两个部分是不一样的。 以打印7行的菱形为例&#xff1a; 上半部分&#xff1a;总共7行&#xff0c;一行一行的打印&#xff0c;先打印空格(空格控制缩进)&#xff0c;再打印*。 打印空格&am…

打印菱形(C语言)

打印菱形 首先&#xff0c;可以将菱形分成上下两部分 上部分&#xff1b; 总行数 line 1.先打印空格&#xff0c;从图中可以发现&#xff1a; 左侧空格数由(line -1)每次减少一个&#xff0c;到0为止。&#xff08;右侧同理&#xff09; 2.后打印*&#xff0c;从图中可以发现&…

如何打印菱形

方法一 拆分法 拆分法(将*和空格分开来考虑&#xff0c;简化问题)&#xff08;菱形大小无上限&#xff09; #include<stdio.h> int main() {int n 0;//输入上半行的行数scanf("%d",&n);int i 0;//打印上半行for (i 0; i < n; i){//打印空格int j 0…

详细讲解:打印菱形(随心所欲版)

C语言打印菱形--超详细讲解 文章目录 前言&#xff1a; 一、打印菱形的基本思路二、操作步骤 1.确定行数和每行中的元素个数2.打印空格和*总结 前言 在学习C语言的时候&#xff0c;会遇到打印菱形的题目。在开始时我也只是用printf函数直接打印&#xff0c;那样也可以&#xf…

C语言—打印菱形,过程分析非常详细

如何打印菱形&#xff0c;过程分析非常详细 思路&#xff1a; 要打印这个图形&#xff0c;我们应该一行行得去打印&#xff0c;每一行先打印空格&#xff0c;再打印星号&#xff0c;比如&#xff0c;第一行我们应该先打印3个空格再打印1个星号。 我们可以发现前四行空格数在减少…

【C语言练习——打印菱形及其变形】

菱形及其变形 前言1、打印菱形——中间对齐版2、打印菱形——上左下左对齐版3、打印菱形——上右下右对齐版4、打印菱形——上左下右对齐版5、打印菱形——上右下左对齐版总结 前言 菱形是一种特殊的平行四边形&#xff0c;定义见百度百科 本文主要是写关于菱形的练习题&#x…

VBA: 字典的介绍与实例

基本语句 Sub dictest() 字典简介字典对象相当于一种联合数组&#xff0c;它是由具有唯一性的关键字&#xff08;Key&#xff09;和它的项&#xff08;Item&#xff09;联合组成VBA字典有6个方法Add , Keys, Items, Exists, Remove, RemoveAllVBA字典有4个属性Count , Key, It…

VBA dictionary的用法

1.VBA中创建字典。 dictionary是保存数据键和项目对的对象。 下面代码示范如何创建 Dictionary 对象&#xff1a; Dim myd As Object Set myd CreateObject("Scripting.Dictionary") d.Add "a", "Athens" ’添加键和项目。 d.Add "b…

VBA字典对象操作技巧

VBA 中集合的功能比较弱&#xff0c;常见的有数组 (array) 、集合 (Collection&#xff09;和字典&#xff0c;其中字典是 Key-Value Pair 类型的数据结构&#xff0c;适合按 Key 存储和查找。本篇介绍字典的操作方法。 VBA 语法本身并没有字典这种数据结构&#xff0c;需要引…

VBA 二维数组和字典

数据源: 二维数组和字典的主要使用方法 Sub test()Dim dict As ObjectSet dict CreateObject("Scripting.Dictionary")Set sh Worksheets("Sheet3")Set Rng sh.Range("A1:E" & sh.Range("E1").End(xlDown).Row)sh.Range("…

【原创】VBA学习笔记(313)VBA字典相关:遍历字典,用key查item, 用item查key的方法

1 字典的遍历方法 即使是后期绑定&#xff0c;也可以用 for each i in dict1.keys() 这里用到的 dict1.keys() 但不是 dict1.keys(i) 是可以的 Sub test_dict11()Dim dict1 As Object Set dict1 CreateObject("scripting.dictionary")dict1.Add 1, "h&qu…

【Excel VBA和Python对照学习】创建字典

Excel VBA和Python双语对照学习 我们从小学习语文&#xff0c;都用过字典。查字典时可以从第一页开始&#xff0c;一页一页地往下找&#xff0c;直到找到为止。这样做明显效率低下&#xff0c;特别是字的位置比较靠后的时候。所以查字典时不这样做&#xff0c;而是根据目录直接…

vba中字典的用法

字典对象的方法有6个&#xff1a; Add 添加一条关键字与条目 Keys 返回所有关键字(形成1维数组) Items 返回所有条目(形成1维数组) Exists 关键字是否存在(TRUE/FALSE) Remove 移除关键字与对应的条目 RemoveAll 移除所有关键字与对应的条 注意&#xff1a; 字典对象的属性有4…

Excel VBA Dictionary excel vba 字典大全

Excel VBA Dictionary - A Complete Guide - Excel Macro Mastery A Quick Guide to the VBA Dictionary FunctionParamsEarly binding reference“Microsoft Scripting Runtime” (Add using Tools->References from the VB menu)Declare (early binding)Dim dict As Scr…

vba字典学习案例

一、案例概述&#xff1a; 本次案例主要讲解字典的学习和应用&#xff0c;通过使用字典的方式来将每一行不重复的数值进行汇总形成一个字符串&#xff0c;且将该字符串展示到指定单元格中。二、案例展示&#xff1a; &#xff08;1&#xff09;源数据&#xff1a; &#xff08;…

VBA字典(dictionary)

这是我看到的最简单明了的Excel VBA字典(dictionary)的教程&#xff0c;把字典的应用&#xff0c;用短短几百字&#xff0c;全部道尽&#xff0c;简&#xff01;但精彩&#xff01;原文如下&#xff1a; 当年我(原作者&#xff1a;彭希仁)向LDY版主求教字典的时候&#xff0c;他…

在Excel VBA中使用字典

序言 VBA的基础数据类型里面并没有字典类型&#xff0c;但字典其实在很多应用场景中都很有用&#xff0c;那么如何在VBA中使用字典&#xff0c;本文就用几个例子和大家交流探讨一下。 场景1 某个医院每天都会从不同的制造商那里进三种材料中的一种&#xff0c;每天的进价都有…