《斗破CPP》 第叁章(上) ---- 神清气爽破循环

16 篇文章 1 订阅
15 篇文章 0 订阅

提前据透一下:《斗破CPP》第叁章将会分成上中下三部分分享给大家,(上)偏向于讲述循环;(中)讲2个中级难度的运算符;(下)偏向于讲解具有强大功能的语句以及控制符。不管有基础还是没基础的小伙伴,都可以重点看看(上)后半部分、(中)前半部分、(下)后半部分小总结。

目录

do-while语句

while语句

众星捧月般的for语句

for语句使得循环体更加循环

for循环提高了循环的容错率

建议1

建议2

多层循环

未完待续


 

do-while语句

我们先来学习do-while 语句使用该语句可以在特定条件成立期间循环执行任意次处理。

我们来看看下面有关于季节的程序:

//chap0301

#include <iostream>

using namespace std;

int main()
{
	int hand;

	do {
		cout << "请选择手势(0...石头 1...剪刀 2...布):";
		cin >> hand;
	} while (hand < 0 || hand > 2);

	switch (hand) {
	 case 0: cout << "石头\n";	   break;
	 case 1: cout << "剪刀\n";     break;
	 case 2: cout << "布\n";	       break;
	}
}

我们来看看,chap0301 中的switch语句里的字符串中用的是\n而不是endl,看过我以前博客的小伙伴或许会有点小问号。其实对于输出字符串的话,用\n比endl这样写更加简洁。

再来看看 chap0301 程序,main 函数的大部分语句由do和while包围,这样的语句被称为do-while 语句,do的意思是“执行”,while的意思是“在……期间”。如下图所示:

 循环称为loop,因此do-while 语句中作为循环对象的语句称为循环主题。后文会介绍到while语句和for语句,它们也是循环主体

我们来看一下判断do-while 语句是否继续循环的表达式。

(hand < 0 || hand > 2)

如果变量输入的是小于0或者大于2的数字,则该表达式的求值结果为true,循环主体块将再次被执行。

也就是说,当求值结果为true时,程序流就返回至块的开头,从那里开始再次执行块。

如果变量输入的是小于0或者大于2之外的数字,则该表达式的求值结果为flase,do-while 语句将结束执行。

看到这里do-while 语句并没有过多的亮点。

 

while语句

while语句也能和do-while语句一样也可以实现在特定条件成立期间循环执行处理。我们来看看while语句如何使用:

//chap0302

#include <iostream>

using namespace std;

int main()
{
	int x;

	cout << "倒数。\n";
	do{
		cout << "正整数值:";
		cin >> x;
	} while (x <= 0);

	while (x >= 0)
	{
		cout << x << endl;	
		x--;				// x的值递减(值减1) ,第叁章(中)会介绍到,这里不过多介绍
	}
}

首先我们来看看do-while语句。该语句仅在读入的x的值小于等于0时执行循环,因此在该do-while语句结束时,x必定为正值。正值出现,就进入了while语句,while语句在条件的求值结果为true期间循环执行语句。因此,该程序的while语句图如下:

while语句与do-while 语句在判断是否执行循环的时间点上不同。do-while 语句在执行循环主体之后判断,称为后判断循环,而while 和for语句在执行循环主体之前判断,称为前判断循环。

 

众星捧月般的for语句

for语句的语法就有必要说一下了,他不像while语句和do while语句那样容易理解:

 for语句执行过程是这样的先进行1,然后用2来判断,如果满足条件的话就运行3,不满足的话则退出循环;执行完3以后,再通过4来对1进行改变。

for语句是由while语句修改而来的,由此可知,for语句和while语句可以互换。我们看看for语句和while语句的图:

我们通过列举奇数的程序来看看for语句如何使用:

//chap0303

#include <iostream>

using namespace std;

int main()
{
	int n;
	cout << "整数值:";
	cin >> n;

	for (int i = 1; i <= n; i += 2)
		cout << i << endl;
}

chap0303 程序中出现的 += 是后面会讲到复合赋值运算符。

for语句为何处于众星捧月的地位?我总结了它的两大优势两个建议

for语句使得循环体更加循环

//chap0304
//打印1-10的数(for和while的较量)

#include <iostream>

using namespace std;

int main()
{
	int i = 1;

	while (i <= 10)
	{
		cout << i << " ";
		i++;
	}
	cout << endl;

	return 0;
}


int main()
{
	int i;
	for (i = 1; i < 11; i++)
	{
		cout << i << " ";
	}
	cout << endl;

	return 0;
}

观察这两种写法,显然for语句更为地简单明了!

for循环提高了循环的容错率

后面会涉及到的contine语句这里先提一下,我们只知道它的作用是:程序流将跳过循环主体的剩余部分,直接跳转至循环主体的末尾。来上代码:

//chap0305

#include <iostream>

using namespace std;

int main()
{
	int i = 1;

	while (i <= 10)
	{
		if (i == 5)
			continue;
		cout << i << " ";
		i++;
	}
	cout << endl;

	return 0;
}


int main()
{
	int i;
	for (i = 1; i < 11; i++)
	{
		if (i == 5)
			continue;
		cout << i << " ";
	}
	cout << endl;

	return 0;
}

我们通过if语句来试探出来了它们的优劣。用while语句的程序执行的结果是死循环,而用for语句的程序可以达到目的。

建议1

不要再for循环内改变循环变量,这样很容易使循环失去控制。

建议2

for循环很推崇对控制变量的取值采用“前闭后开写法”,这样就可以很清晰的计算到循环的次数啦。

for(int i = 0;i < 11;i++)        //不推荐

for(int i = 0;i <= 10;i++)       //推荐

 

多层循环

把循环语句的循环主体作为循环语句,就可以执行二重、三重循环。这样的循环是多重循环。下面我将通过两侧等腰三角形(有四侧,但都殊途同归,小伙伴自己去实现吧)来将多重循环的妙用分享给大家,我们先来看看左下侧为直角的等腰三角形

//chap0306

#include <iostream>

using namespace std;

int main()
{
	int n;
	cout << "显示左下侧为直角的等腰直角三角形。\n";
	cout << "行数:";
	cin >> n;

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= i; j++)	// 显示i个'*'
			cout << '*';
		cout << endl;
	}
}

结果如下:

上图所示为用来显示等腰直角三角形的程序流程图如下:

在外侧的for语句(行循环)中,变量i的值从1开始递增到n(即5)。这是与三角形的各行对应的纵向循环。

在各行中执行的内测的for语句(列循环)中,变量j的值从1开始递增到i,并进行显示。这是各行中的横向循环。 

当i为1时,使j从1递增到1,并显示‘*’,然后换行。*
当i为2时,使j从1递增到2,并显示‘*’,然后换行。**
当i为3时,使j从1递增到3,并显示‘*’,然后换行。***
当i为4时,使j从1递增到4,并显示‘*’,然后换行。****
当i为5时,使j从1递增到5,并显示‘*’,然后换行。*****

把三角形从上至下看作第1行--第n行,第i行显示i个‘*’,最后一行显示n个‘*’。接下来我们再来看看右下侧为直角的等腰直角三角形

//chap0307

#include <iostream>

using namespace std;

int main()
{
	int n;
	cout << "显示右下侧为直角的等腰直角三角形。\n";
	cout << "行数:";
	cin >> n;

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n - i; j++)	// 显示n-i个' '
			cout << ' ';
		for (int j = 1; j <= i; j++)		// 显示i个'*'
			cout << '*';
		cout << endl;
	}
}

 

未完待续

很感激阅读到这里的你,《斗破CPP》的精彩并不止于这些,学有余力的小伙伴可以看看下面这些博客,都是有着极多的技巧与干货❤

《斗破CPP》 第壹章 ---- 初窥CPP_施律.的博客-CSDN博客

《斗破CPP》 第贰章(上) ---- 初识分支句_施律.的博客-CSDN博客

《斗破CPP》 第贰章(下) ---- 拿捏运算符与标识符_施律.的博客-CSDN博客

关于时间的函数,让你成为掌控时间的强者:(极力推荐!)关于时间的函数,让你成为掌控时间的强者_施律.的博客-CSDN博客

如果觉得本篇博客对正在学习编程的你有帮助的话,请给施律.多一点的支持与关注!未来的一段时间里施律.将和小伙伴们一起斗破CPP,希望下次的我能为大家奉上更好的博客内容,也希望下次的博客有你

  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 25
    评论
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

施律.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值