当前课程知识点:C语言程序设计(上) > 循环结构的程序设计(二) > 4.7 循环的综合应用 > 4.7.5 循环综合应用——打印空心图案
下来再给大家一个打图形的题
大家看一下这个图形
跟我们前边讲过的图形
大体上的样子也还是有点像的
我们讲过一个打空心的三角形
看上去像这
上半边
只是说
我们当时给的那个不是打字符
直边上就是打
星号
打固定的字符
不是打这种
可变的
我们看到这个题目里边是
Z X Y
是X Y Z
那么从
下面往上数的话是
连着的
是一个排列有序的
一个字符
其实呢
你还可以是排列有序的数
比如说可以是
从上面
1 2 3 4 5
这样排
也可以是
a b c d
这样排
或者是说
其它的一个组合
有规律的一个组合
我们首先看宏观上
这道题目
是不是可以这样
我们从中间要插一下
一个横线的话
这个横线是插进来的
不是要的这个图案
是说我们可以
从思路上这样
你把这个
图案切割一下
切割成
上面是一个这样的
正的空心三角
下边是一个倒着的空心三角
那么这道题就可以变成
一个串形的
就跟两道题拼起来一样
就是说
上面
做按照我们
空心三角这个大环境
来构建
来考虑
下边是一个倒的
空心的三角
是这样
那么只要上边
我们的方法找对了
下边的方法呢
就是一个复制了
只是一个
终止表达式不同
其它方法都是一样的
这道题怎么考虑呢
我们看一下
它跟前边咱们构建的
那个打印图形的
所有的不同
我们刚才说除过这种切割看
我们这个
程序是这样
上面这个
for
这个循环
两重的循环
和下边的这两重循环
是对称的
那么就是说 显然
上半截是做的什么呢
这个
上边的
空心三角
而下边是对应下边的空心三角
我们先看
上边的这一块
上面的这个
外循环
我们说永远都是
打一行打一行
再打一行
那就是循环从
i从1开始
到
我们要几行呢
i n
到我们的n
这是外循环
行控制
那列控制这块呢
跟我们前面分析的一样
你怎么打这个Z呢
先打空
再打字符
所以呢
我们这一个for
说的是
从1
到
这是怎么得到的呢
是我们现在要
考虑
这个空
和后边的字符
以及
里边的这个空
所以呢
这一块我们是判断
给了这么一个表达式
这个表达式
就使得
我们上边的图案
没有像
我们前面讲过空心三角的时候说
打空
打字符
比如说
这一行
我们打空打字符
再打空
再打字符
是这样的思路
就是说在内循环里边
我们并列的有两个
内循环
for
先打空打字符
再for
打空打字符
这是我们前面
讲的一个算法
那么
我们现在在这道题里边是怎么呢
我们内循环就一个for
一个for
就是要把这个空
字符
空 字符
打完
那么要打完
这里边的
终止表达式
是什么呢
n+i
同样
是跟行
控制变量
相关的一个表达式
n是终值
n加上i再减上2
就是我们这个内循环的
循环终值
在这里边我们要判断一下
到底是打字符还是打空呢
是因为我们用一个循环来控制的
打空打字符
打空打字符
我们要去识别一下
如果j
等于
n-i+1
大家可以仔细算一下
这个对不对
如果
j
等于这个式子
这个式子一定是与
行号有关的
一个表达式
如果满足这个条件
我们就打字符
打这一块的字符
否则
就打空
也就是说
我根据这个判断
满足这个条件打字符
不满足这个条件就打空
凡是满足这个条件
无论是这块的字符还是
下面的字符
都是打字符
每打一个字符
我们看见了吗
字符是减减的
比如说Z
Z下来到
Y
那是
它的asc码值
减一个
再到下是减一个
W V都是减一个
所以这块的
c是减减的
那么c里放的是什么东西呢
我们来看c
在
最开始的时候
差了一个什么呢
给它赋了一个初值是Z
就是我们要打的
第一个字符
然后呢
往下依次类推
从Z开始减减
那么大家考虑一下
如果我把这个
c里边开始放的
初值是A
比如说是大写的A
大家想
A
到下减减
那A挨着的谁呢
那你一定要查一下asc码表里边
大写的A
比它的asc码值
小一个号的
是几
我们可以
可以说
比如说你这块是要打的数字0
那你0再减减
是谁呢
一定找0
下边挨着的那个
那我们如果说9的话
我一定知道它是8 它是7
它是6
它是5
这样子往下减减
所以呢
这块给的是Z
是往回退的
那下边的情况
是跟这上面非常像的
所不同的只是什么呢
大家注意看一下
内循环的
循环终止表达式
是不一样的
所以呢
打图形的这件事
内循环的
循环终止表达式
决定了这个图案
长得什么样子
我们把这个程序
运行一下看看
这是我们刚才看到的程序
这里边初值
我们给它赋值的是Z
然后呢
谁来控制它
打多少行呢
这scanf n
n控制它打多少行
我们现在要一个几行
给个6行
6行
那它指的是
上半边是6行
下边呢
往下数也是6行
中间这一行是被借用的
是Z
那咱要是把这块改一下
比如说
我改的这是一个9
我们看一下
这块我还给一个6
也打6行
大家看
0下来就是斜杠了
在原点了
这是在
asc码表里边
排序的是这样
所以呢
就是这个初始值
就是
你下边减减的
起点
要从这往下减减
这道题目我们
第一是想说什么呢
一个图案
可以是由
一个固定的字符构成的
也可以是由任何的数字字符
以及asc码表里边
凡是有编码表跟它对应的
所有的都可以
如果我们这块给的是一个
斜杠
比如说斜杠5
大家知道
这个斜杠里
是一个转义字符
那斜杠5
会出来是什么呢
之前我们见到过这个
还给6
大家看
上面是不是一个 梅花
那么梅花再下来是一个
菱形
不同的符号
就是我们平常从键盘上
敲不进去的符号
所以呢就这一块
起点是什么
后边按照什么样的一个规律
再变化
我们还把这复原回去
就是按照什么样的规律再变化
是决定了
是
哪里来决定的呢
是你这里边要打的
这个东西
你是减减还是加加
比如说
我们现在这个Z
这一块
我给的不是减减
是加加
你的程序出来
运行的结果出来的样子
还给6
你看
就成了这样子了
Z Y
你是往上加的
是因为Z是最后一个字母
Z下边的再是哪个字母
因为我们只变了这块
而这一块是没有变化的
这块
整体上你的变化要
协调起来
因为我
变了上边
下边的没有变化
所以呢
刚才出来的图案就会有一点问题
包括
我们
变了上半段
而下半段
没有变化
大家可以下去
我还把它复原成
这样的
减减的
这样的情况
大家可以
由这样的一个程序
来给它起始点不同
和它的算法不同
你可以得到
任何你想要的图案
假如说我给的不是7
给的是9
大家看
图形就会
行数就会
增加了
我们反复在这个
循环的嵌套里边用打图形来说
那是因为
我们数组还没有学
然后呢
前面只讨论循环
而循环在嵌套里边
对一个平面问题
正好是用一个双重循环解决它
是一个
比较方便的
程序解决的方法
所以我们拿
打图形
来说这件事
-1.1 计算机的问题求解方法
--讨论题:数学模型
-1.1 计算机的问题求解方法--作业
-1.2 C语言与C程序
--讨论题:运算符
-1.3 C语言处理系统与程序调试运行
--例程
-1.4 程序中的人机交互
--例程
--作业讨论区
-2.1 算术运算的C程序实现
--算术混合运算.c
-2.1 算术运算的C程序实现--作业
-2.2 关系运算的C程序实现
--bukao.c
--字符比较.c
--讨论题:比较大小
-2.2 关系运算的C程序实现--作业
-第二周作业--作业
-2.3 逻辑运算的C程序实现
--计算结合性
--闰年.c
--自动购票问题.c
-2.3 逻辑运算的C程序实现--作业
-2.4 位运算的C程序实现
--讨论题:位运算
-2.5 几种很个别的运算
--讨论题
--讨论题
-2.5 几种很个别的运算--作业
-2.6 混合运算及数据类型转换
--讨论题:数据类型
-2.7 顺序结构程序实例
--Video
--三角形面积.c
--讨论题:工业产值
-2.7 顺序结构程序实例--作业
-3.1 程序中的路径选择实现
--打印学生成绩.c
--一元二次方程.c
-3.1 程序中的路径选择实现--作业
-3.2 路径中的再选择——嵌套判断
--例程
--讨论题:程序改错
-3.2 路径中的再选择——嵌套判断--作业
-3.3 复杂判断问题的C程序设计
--3.3 多级选择
--银行存款.c
--讨论题:多级选择
-3.4 多分支问题的C程序设计
--加减乘除运算.c
-3.4 多分支问题的C程序设计--作业
-3.5 GOTO的适当使用
-3.6 选择结构的程序实例
--3.6 程序展示
--计算第几天.c
--讨论题:输出奇数
--讨论题:计算税金
-3.6 选择结构的程序实例--作业
-第四周作业--作业
-4.1 需要重复执行的程序
--求和.c
--打印学生成绩.c
--统计录入速度.c
--求平均数.c
-4.1 需要重复执行的程序--作业
-4.2 至少要执行一次的循环
--n的阶乘.c
--字符分类统计.c
-4.2 至少要执行一次的循环--作业
-4.3 已知循环次数用for语句
--求和问题.c
--数列求和.c
--讨论题:循环语句
-4.3 已知循环次数用for语句--作业
-4.4 循环控制——简单循环应用
--水仙花数.c
--讨论题:死循环
--讨论题:猜数字
-循环结构的程序设计(一)--4.4 循环控制——简单循环应用
-4.5 循环的嵌套
--讨论题:程序运行
-4.5 循环的嵌套--作业
-4.6 break与continue
--最大素数.c
-4.6 break与continue--作业
-4.7 循环的综合应用
--数的排列组合.c
--鸡兔同笼.c
--打印空心字符.c
--讨论题:打印图形
--讨论题:计算闰年
-第六周作业
-第六周作业--作业
-5.1 同类有序数据处理问题
-5.2 一维数组的定义和引用
--数组定义.c
--数组初始化.c
--反向输出.c
--讨论题:对称数
-5.2 一维数组的定义和引用--作业
-5.3 一维字符串数组
--讨论题:编程
-5.4 字符串处理函数
--字符串反向.c
--字符串函数
-5.5 二维数组的定义与使用
-5.6 二维数组的输入输出
-5.6 二维数组的输入输出--作业
-5.7 二维数组的应用
--转置矩阵.c
--讨论题:修改程序
-5.8 二维字符数组
--5.8 单词排序
--单词排序.c
-5.8 二维字符数组--作业
-5.9 数组综合应用
--统计成绩.c
--统计字符次数.c
--讨论题:洗牌
-本期课程结束语
--end
-第八周编程作业
-《C语言程序设计(上)》期末复习参考
--html
-《C语言程序设计(上)》期末复习参考答案
--html