当前课程知识点:C语言程序设计(上) >  循环结构的程序设计(二) >  4.5 循环的嵌套 >  4.5.2 循环的嵌套——打印三角形

返回《C语言程序设计(上)》慕课在线视频课程列表

4.5.2 循环的嵌套——打印三角形在线视频

4.5.2 循环的嵌套——打印三角形

下一节:打印九九乘法表.c

返回《C语言程序设计(上)》慕课在线视频列表

4.5.2 循环的嵌套——打印三角形课程教案、知识点、字幕

我们前面看了打印乘法九九表的程序

实际上 循环的嵌套

尤其是

嵌套了一层的这样的一个情况

就说 双层循环的时候

这种应用比较多的

适合说打一个平面的图案

比如说我们现在给的这个

打一个 这个三角形

这个三角形里边呢

可以是* 可以是别的字符

其实呢

也可以说是一个复杂的图案

比如说是 打的是1...7往下排

或者ABCD往下排

或者是说这个图案里边是空心的

不是这样的实心的

我们先拿这个实心的

这个团来做一个例子

就说它是比较适合说

用双重循环

就是循环里边在套一层循环

来解决这样

打印一个平面图案的一个问题

那我们看一下这样的一个图形

它的思路就跟刚才我们说打这个

乘法九九表有点不同

它就是打字符

就是打空格或者打字符

那么它的思路应该是什么样子呢

我们看一下

大家看我们把这个三角形

三角形的图案我用圈

好画 用圈搁在这

我们看要把这么一个图案打印出来

跟我们前面讨论过的打印那个

乘法九九表有点相似

但是 就是相似的是说

它也是打一行 打一行 再打一行

所不同的是

我这一行里边打的数

就是打的不是一个数的乘积

就打的就是一个字符 所以它更简单

但是我们大家注意

这个图案跟乘法九九表不同的说

这是我们屏幕的边界

这是我图形的中点

那现在在这个打一行这件事情里里边

都打什么呢 比如说我们看这个第二行

第二行是打几个空

再打这三个圈

从宏观上来讲的话呢

没有关系 管你打什么

我都是打一行 打一行 再打一行

把这个行标出来

这是第一行 这是第二行

下来第3 第4 第5

我们一共画了五行

其实 你可以有n行

没有关系

我们现在是不是从外循环上很简单

你就给我打一行 打一行

那这个如果我们用i变量来做

外循环控制变量它一定是从1开始的

到谁 到n 就打n行

在这里边完成的是

每一个外循环

每循环一次就是打一行 就做这件事

那打一行这件事情呢

跟单层循环不同的是说

这里边不是打一个数

它是打 我们刚才说了

先打空 再打圈

那就说打一行这件事情怎么完成呢

是 总是在打空

再打圈

每一行都是这样 打空 打圈 打空 打圈

只是说它打的空不一样

那我们打的空到底是多少呢

那空肯定是从

如果我们这用for去做的话

也是 我们用j作为他的内循环

j一定是从1开始的 只是说

现在到多少

我们看 第一行是1 2 3 4

空了四个空

那第二行上呢

必然是空了三个空

第三行上空了两个空

空了一个空 第四行上

第五行上没有空

那现在 大家看 第一行上空了四个空

4 3 2 1 0

正好跟我们的行号 是什么呢

是一个相反的 我们打五行的话

那第一行是4

那是不是就是5减上这个谁呢

行号值 所以 我们这块是

从1开始到谁

到你的终值 你到底要打几行

减上行号

n-i这是你的终值

谁的终值 打空行的终值

打这个空

一个空 两个空

打几个空呢 第一行打4个

第二个 1个空2个空 打3个

好 依次这样 这是打空

那么 打完空

我们要打这个圈

到底打几个圈 我们看

打圈 我们把它写1个

第一行是打1个

第二行打了3个 第三行打了5个

第四行打了7

那下面是9个 我往下都不数了

写出来

那大家一看它与行之间的一个关系

是什么关系呢

两倍的行数减1

for 我们还用j控制

从1开始

2倍的i-1

大家看是不是 比如说我第四行

我打几个空 打几个圈呢

打7个圈 7怎么出来的 

2*4=8 减1就是这个7

那第五行从这个9怎么出来

2*5=10 减1

得这个9 那就说从第一个

对第五行来谁 从第一个开始打

就把这行圈打出来

这就是我们这个题的思路

就说外循环 这是外循环

外循环里边套的什么呢

套了两个并列的for

并列的内循环

这是一个循环

在这里边 你肯定要打印

printf 打什么

打你那个空格 打这空格

那这里边 你也要打印

打印你那圈

printf 打圈

所以 这里边这是一个循环

这也是一个循环

那相当于这个结构是说

我们在这个for里边

套了这样的一个循环

再套了这样的一个循环

循环里边嵌套了

两个并列的循环

我们把这个程序写出来 大家看一下

我们来看

根据刚才大家的分析

是打印个实心的三角

需要一个外循环

是打 控制打行的

从1到哪个行

到你给的行号

你打n行

我这个 外循环的控制终值就是n

那内循环里边完成了

打一行上的实质的内容

我们说现在咱要的内容就是

打空和打*

分别用两个循环来完成这件事

完成了打一行之后

这两个循环执行完了

那做什么 换行

准备打下一行

在跳出这个内循环

我们看这里边打空的时候

大家看 也是从第一个位置开始打

打到哪个位置 n-i

这n-i n是什么

你要的行数

i是什么 是外循环的控制变量

所以这就我们刚才说的

n-i

这个表达式构成了内循环的循环终值

打这么多空 那打多少个*呢

你的外循环的

就是内循环的界

界的终值是两个i

2*i-1

也是与外循环的控制变量i

相关的一个表达式

你内循环到底打的空格

和打的*的个数

都是与行相关的

在不同的行上

你打的这个空和*的个数是不同的

那这个程序我们大家运行一下看

如果我现在给一个要6行

要6行是这样的一个情况

如果我在运行一下

给一个奇数行 要9行

那如果我在运行一下

给它0行 大家看 就没打印

那这时候 刚才给0行

给一个偶数行 给一个奇数行

这是通常咱们对这类打图形的

问题的一个测试应用 都会是这样

你打奇数行 偶数行 或者0行

或者是平常会要再给你一个 比如说

我打1行

这一个*要打出来

那这个程序呢我们刚才分析完了

看这个运行在这一块呢

只要注意一个说

内循环的循环的终值

通常都是跟外循环的控制变量是相关的

我们讨论一下

如果把那个实心的三角换成这样的图案

大家看 换成这样的图案

你的程序会做什么样的变化呢

我们把它这个思路先看一下

大家看我这个过程

这是屏幕的边界

这是我们的终点

这是终点 那现在呢

你这个还符合我们刚才说的

我们刚才说的外循环是

i从1开始 到n

这是我们的行

到n是5

那现在每一行里边

要打的东西还是我们刚才说的那个

打空打圈 打空打圈

是这样的吗 我们分析一下

第一行没问题 打空

后边打一个圈

那我们再看任意一行 第三行上

打空 后边打一个圈

不是n多个圈 一个圈

那我们这个很简单

把这个圈和这个打空捆绑在一起

打n个空 接着打圈

那么看在后边

又是打空 打圈

那么循环体里边

是不我们可以变成这样的描述

我这个for变成了什么呢

然后呢

再打一个*

打一个圈

这是一个循环

那这个做完了以后 后边

我们会在有下一个

下一个写在这个循环体里边呢

还是写在另外起一个

是看

我们把它切过来

是看这里边打的空

和这个空一样多吗

当然不一样 这打的少 这里边就打的多

所以 他一定是

另外一个循环里要做的事

这里边仍然是打空

再打 打一个圈

这也是打一个圈

结构是不是还是这样

只不过这里边所不同的是什么呢

是说 这到底打几个空

这到底打几个空呢

我们看这打几个空跟刚才是一样的

第一行打4个

第二行打3个4 3 2 1 0

所以 这块的j

一定是从1开始

到谁呢

到你打几行

就是n终值减上行循环变量

这块是与行相关的一个数

你行是9

行是9 那我就是9-i

i比如说第三行 那9-3我就这行打6个空

是与行相关的一个表达式

就是他的终值

是与行相关的一个表达式

那现在打 打圈变得很简单

你打完这个空你就在这接着打圈

打1个圈

那下一个呢

我打几个空呢

我们看 咱写一下 第一行就打0个

第二行是1个

那我们把它标识一下是不是

大家看这个是不是还是刚才的那个看上去

还是刚才的2i-1

这不就是1 3 5 7

看上去是

它的终值是2i-1

看看这块呢

有区别吗

那如果我i是1的时候

那这一块我应该得到0啊

可是

我这块需要是0啊

也就说我的1是从i=2的时侯起点

所以大家看 这块是减1吗

我们把它换成这样

我们把它换成2i-3

试一下

当i是1的时候

2i-3是负的

那你那循环说

循环控制变量是前边说

你的j小于它吗

j是小于这个负的这个数吗

<=这个负的这个数吗

那当然不是了 那这循环就进不来

它必然就不打空了

等下一行

i=2的时候

那正好是打一个

i是5的时候

是我们现在要打的七个空

所以 这块

j从1开始 到谁呢

2i-3

就说终值表达式

我们现在看这个图案的长得样子

跟那个图案是差不多的

就说你分析的方法外循环是没有变化的

i从1开始到n行

从第一行到第n行

变化的是什么呢

内循环的初值有变化吗

永远没有变化

它总是从第一个字符开始打

不管是空格还是字符

从第一个开始 起点没有变

现在变化的是谁 是终值

就说 到底空格打几个呢

到底你这中间的空格打几个呢

那打几个构成的这个表达式

我们看了它的规律是什么呢

规律一定是说它们是

跟外循环的行号相关的一个表达式

一定说 你打的行数不同

你这终值就不同

所以这个终值里边一定有一个

外循环的循环控制变量i

在你这个终值表达式里边

这就是打图形的一般的规律

我们把这个程序也来写一下大家来看一下

大家看 这个程序里边

外循环没有变 跟我们刚才一样

而内循环里边

打空也没有变

因为我们前面的图案 前面是

一个倒的一个三角形

就是当行数小的时候空格多

这个没有变

但是变化的是什么呢

打完空处紧接着打一个*

那我们看

这个 打这个*

是在这个for循环的内部还是外部

我们看按照这样的结构是说

这个for循环里边 下边没有括弧了

那只有这一句话

只有这一个函数调用了打空

所以 这个for循环只有一句话

那只有这个for循环结束了的时候

才打一个*

 那底下的打空是一样的道理

只有这个for循环结束了的时候

才打一个*

重要的是我们刚才说的

打几个空才打这个*呢

当2i-3个是这样的一个情况

好了 那我们

把这个程序运行一下

为什么减3个呢

如果咱减一个试试

我们先减一个试试

我们还给6个

看一下这个尖没有了

顶没有了

这底下 也看上去是打了6个

但是上边我们不是要2个 我们是要1个

这是不是就不对了

那么这个不对是出在哪呢

你的第一次打这个*的时候

开始打了空 打了*

这已经打了一个*了

可是 在这一块 当你上面的i是1的时候

j 2*1

2-1也是1

那j这个1<=1吗 是的

是的 我就打了一次

就循环了一次

实际上第一行打了这个*后面就不要了

后面就不要那个*了

那大家看 咱把它改成3

改成3就变成了说

2*1 2-3是-1

那j<=这个-1吗 不是的

不是 那它自然这一个循环就不执行了

但是大家看 这个循环不执行了

那这个循环呢

这个printf还是可以执行的

我们看这个运行出来是什么样子的

大家看 这个尖

要没有这个*它就是对的了

这个图形就是对的

那这个还是多出来一个*

这个*会多在哪呢

那我们仔细看一下

就说当第一次

第一行上把空打完了

把*也打完了 本来第一行就完成了

不需要再进入下边这块来了

可是 进入了下边这个for执行了吗

我们刚才看是没执行的

2*1-3=-1

i<=-1吗

j j是1

那不满足这个条件 这块没有执行

那问题会出在哪呢

这一块没有执行

但是这一行被执行了

而我们在第一行上是不需要它的

那怎么把它去掉呢

也就说 第一行是个特殊行

我不需要打两个*

上面这一个*打完了就可以了

就完成了 下面这个*是不需要打的

那这时候 我们可不可以这样

加上一句话

如果什么呢

如果我们目前的i

是第一行的话

i 我们不要正着问

反着问

什么时候你需要打这个*呢

它不等于1 它不是第一行

你再来做这件事

那也就是说我们把这件事

搁在if的 if块的里边

如果i不等于1的话

你在打这个*

否则我底下这个*是不需要的

看一下

没有问题了

那么在测试一个奇数 给11

运行它

给一个11

这个图案没有问题

那么我们运行它 给一个1

打了一个 没有问题

大家注意看到

刚才是说在这个题目里边

第一行是个特殊行

把第一个*打出来以后就不要了

所以我们在底下加了一个判断

当你不是第一行的时候

你再来做下边的这件事

这个程序 大家仍然是要关注的是

内循环的循环终值

一定是给外循环的循环变量i

这个循环变量i有关系的一个表达式

这样才使你的图案

能够建起来一个

与行有关的 就是你打每一行的时候

这一行是与整体上的

行的进行 进展有关系的

这道题大家下去自己在看一下

C语言程序设计(上)课程列表:

从问题到C语言程序设计

-1.1 计算机的问题求解方法

--1.1.1--程序设计面向的问题

--1.1.2--关于计算

--1.1.3-1关于算法-算法的特征

--1.1.3-2关于算法——算法的表示

--1.1.3-3关于算法——算法的优化

--1.1.4-1-程序设计方法

--1.1.4-2-程序设计方法

--讨论题:数学模型

-1.1 计算机的问题求解方法--作业

-1.2 C语言与C程序

--1.2.1-1-C概述

--1.2.1-2-C概述

--1.2.2-C初步

--讨论题:运算符

-1.3 C语言处理系统与程序调试运行

--1.3.1C程序如何调试运行

--1.3.2常用C语言处理系统

--1.3.3DEVC++的使用-v1

--1.3.4C语言概貌小程序

--例程

-1.4 程序中的人机交互

--1.4 printf用法

--1.4.2 scanf的用法

--例程

--作业讨论区

数据计算实现与顺序结构程序设计(一)

-2.1 算术运算的C程序实现

--2.1.1 第二章

--2.1.2 C语言算术表达式概念

--2.1.3 算术运算的实现

--2.1.4 整数相除

--2.1.5 输入格式造成的计算错误

--2.1.6 求余运算

--2.1.7 自增自减运算

--2.1.8 复合运算

--fangcheng.c

--fangcheng-1.c

--fangcheng-2.c

--fangcheng-3.c

--fangcheng-4.c

--算术混合运算.c

--讨论题:自增自减符

--讨论题:程序输出结果

--讨论题:程序运行结果

-2.1 算术运算的C程序实现--作业

-2.2 关系运算的C程序实现

--2.2.1 关系比较问题

--2.2.2 C语言关系表达式

--2.2.3关系运算优先级

--2.2.4 用关系运算做判断条件

--2.2.5 程序实例

--2.2.6 字符比较

--bukao.c

--pingshifen-1.c

--panduanzhengshu.c

--pingshifen-2.c

--字符比较.c

--讨论题:比较大小

--讨论题:程序的运行

-2.2 关系运算的C程序实现--作业

-第二周作业--作业

数据计算实现与顺序结构程序设计(二)

-2.3 逻辑运算的C程序实现

--2.3.1 逻辑运算问题~1

--2.3.2 逻辑运算表达式

--2.3.3 如何判断闰年

--2.3.4 逻辑运算优先级

--2.3.5 条件运算符

--计算结合性

--2.3.7 一个简单实例

--闰年.c

--自动购票问题.c

--讨论题:逻辑表达式

-2.3 逻辑运算的C程序实现--作业

-2.4 位运算的C程序实现

--2.4.1 什么是位运算

--2.4.2 位运算有哪些

--2.4.3 位运算怎么用

--讨论题:位运算

-2.5 几种很个别的运算

--2.5 几个很个别的运算

--讨论题

--讨论题

-2.5 几种很个别的运算--作业

-2.6 混合运算及数据类型转换

--2.6 混合运算及数据类型转换

--讨论题:数据类型

-2.7 顺序结构程序实例

--2.7.1 第一个程序:三角形

--Video

--三角形面积.c

--讨论题:工业产值

--讨论题:程序无效结果

-2.7 顺序结构程序实例--作业

选择结构的程序设计

-3.1 程序中的路径选择实现

--3.1.1_1 第三章

--3.1.1_2 神奇的if_else

--打印学生成绩.c

--一元二次方程.c

-3.1 程序中的路径选择实现--作业

-3.2 路径中的再选择——嵌套判断

--3.2.1_1 if语句的嵌套

--3.2.1_2三个数排序1029

--例程

--3.2.2 用户登录检查

--三个数排序_未优化.c

--三个数排序_优化.c

--讨论题:程序改错

-3.2 路径中的再选择——嵌套判断--作业

-3.3 复杂判断问题的C程序设计

--3.3 多级选择

--银行存款.c

--讨论题:多级选择

-3.4 多分支问题的C程序设计

--3.4.1 switch语句表达式

--3.4.2 加减乘除计算

--3.4.3 几类说明

--加减乘除运算.c

--讨论题:关于switch

-3.4 多分支问题的C程序设计--作业

-3.5 GOTO的适当使用

--3.5 GOTO的适当使用

-3.6 选择结构的程序实例

--3.6 程序展示

--计算第几天.c

--存款利息__switch实现.c

--讨论题:输出奇数

--讨论题:计算税金

-3.6 选择结构的程序实例--作业

-第四周作业--作业

循环结构的程序设计(一)

-4.1 需要重复执行的程序

--4.1.1----第四章~1

--4.1.2---while实现先判断后循环~1

--4.1.3----while循环的应用-录入速度~1

--求和.c

--打印学生成绩.c

--统计录入速度.c

--求平均数.c

-4.1 需要重复执行的程序--作业

-4.2 至少要执行一次的循环

--4.2.1至少要执行一次的循环

--4.2.2-do-while循环应用

--成绩录入_do while实现.c

--n的阶乘.c

--字符分类统计.c

--讨论题:关于while

-4.2 至少要执行一次的循环--作业

-4.3 已知循环次数用for语句

--4.3.1--用for语句控制循环次数

--4.3.2--循环的应用-求和

--求和问题.c

--斐波那契数列问题.c

--数列求和.c

--讨论题:循环语句的不同

--讨论题:循环语句

-4.3 已知循环次数用for语句--作业

-4.4 循环控制——简单循环应用

--4.4.1-循环的应用-找数-水仙花数

--4.4.2--循环的应用-求素数

--水仙花数.c

--讨论题:死循环

--讨论题:continue和break

--讨论题:猜数字

-循环结构的程序设计(一)--4.4 循环控制——简单循环应用

循环结构的程序设计(二)

-4.5 循环的嵌套

--4.5.1 循环的嵌套——九九乘法表

--4.5.2 循环的嵌套——打印三角形

--打印九九乘法表.c

--打印实心三角图案.c

--打印空心三角图案.c

--讨论题:程序运行

-4.5 循环的嵌套--作业

-4.6 break与continue

--4.6 循环中断与继续循环——break再讨论

--最大素数.c

--求正数个数及平均数.c

-4.6 break与continue--作业

-4.7 循环的综合应用

--4.7.1 数的排列组合问题

--4.7.2 循环综合应用——穷举算法

--4.7.3 循环综合应用——满足条件的数

--4.7.4 循环综合应用——求最后三位数

--4.7.5 循环综合应用——打印空心图案

--数的排列组合.c

--数的排列组合优化.c

--鸡兔同笼.c

--找满足条件的数.c

--输出14的13次方的最后三位数.c

--打印空心字符.c

--讨论题:打印图形

--讨论题:打印空心图形

--讨论题:计算闰年

-第六周作业

--虚拟实验:循环程序设计实验

-第六周作业--作业

数组(一)

-5.1 同类有序数据处理问题

--5.1.0 数组开篇

--5.1.1 同类有序数据存储问题

--讨论题:下标变量与下标

-5.2 一维数组的定义和引用

--5.2.1_1 数组的定义~1

--5.2.1_2 数组的初始化

--5.2.2 一维数组的输入输出

--5.2.3 一维数组的应用1--成绩排序(选择法)~2

--5.2.4 一维数组的应用2--Fibonacci数列

--数组定义.c

--数组初始化.c

--输出大于平均值的数.c

--反向输出.c

--选择法_成绩排序.c

--求斐波那契数列前n项.c

--讨论题:对称数

--讨论题:关于'\0'

-5.2 一维数组的定义和引用--作业

-5.3 一维字符串数组

--5.3 一维字符串数组11.24~1

--用函数测试字符串长度.c

--讨论题:编程

-5.4 字符串处理函数

--5.4 字符数组的输入与输出

--字符串反向.c

--字符串函数

--讨论题:程序如何运行

--讨论题:黑色星期五

数组(二)

-5.5 二维数组的定义与使用

--5.5 二维数组定义

--二维数组的定义与初始化.c

-5.6 二维数组的输入输出

--5.6 二维数组的输入与输出

--二位数组输出_矩阵输出.c

--讨论题:随机数据存储

-5.6 二维数组的输入输出--作业

-5.7 二维数组的应用‍

--5.7.1二维数组的应用-转置矩阵

--5.7.2 用一维数组方式引用二维数组元素

--转置矩阵.c

--找二维数组最大数.c

--讨论题:修改程序

--讨论题:关于随机数函数 rand()

-5.8 二维字符数组

--5.8 单词排序

--单词排序.c

--讨论题:回文字符串

-5.8 二维字符数组--作业

-5.9 数组综合应用

--5.9.1 应用1——学生成绩统计

--统计成绩.c

--5.9.2 应用2——删除重复字符

--删除串中的重复字符串

--5.9.3 应用3——统计字符

--5.9_4数组的应用4--矩阵相乘

--统计字符次数.c

--讨论题:洗牌

-本期课程结束语

--end

-第八周编程作业

--虚拟实验:冒泡排序算法程序设计实验

期末复习

-《C语言程序设计(上)》期末复习参考

--html

期末复习答案

-《C语言程序设计(上)》期末复习参考答案

--html

4.5.2 循环的嵌套——打印三角形笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。