第 5 章 循环和关系表达式

第 5 章 循环和关系表达式

5.1 for 循环

for 循环包括:循环的初始化(loop initialization)、循环测试(loop test)、循环体(loop body)& 循环更新(loop update)
示例 1:

for (i = 0; i < 5; i++)
	cout << i << endl;

循环的初始化(loop initialization):i = 0;
循环测试(loop test):i < 5
循环体(loop body): cout << i << endl;
循环更新(loop update):i++

5.1.1 for 循环的组成部分

1、设置初始值;
2、执行测试,看看循环是否应当继续执行;
3、执行循环操作;
4、更新用于测试的值。

注意:C++并没有将 测试语句(test-expression) 的值限制位只能为真或假,可以使用任意表达式。C++会将结果强制转换为布尔类型。

示例 2:

#include <iostream>
int main()
{
	using namespace std;
	cout << "Enter the starting countdown value: ";
	int limit;
	cin >> limit;
	int i;
	for (i = limit; i; i++)  // i 为非0,循环继续,否则退出循环
		cout << "i = " << i << endl;
	cout << "Done now that i = " << i << endl;
	return 0;
}
cout.setf(ios_base : : boolalpha);

函数调用设置了一个标记,该标记命令cout 显示 true or false ,而不是 1 or 0.

示例 3:

int main()
{
	......
	int x = 100;
	cout << (x < 3) << endl; // 0
	cout << (x > 3) << endl; // 1
	cout.setf(ios_base : : boolalpha); // 函数调用设置了一个标记
			                   // 该标记命令cout 显示 true or false 
	 cout << (x < 3) << endl; // false
	 cout << (x > 3) << endl; // true
	......
}

5.1.2 利用 for 循环进行字符反转

示例 4:

#include <iostream>
#include <string>
int main()
{
	using namespace std;
	cout << "Enter a word: ";
	string word;
	cin >> word;

	for (int i = word.size() - 1; i >= 0; i--)
		cout << word[i];
	cout << "Done!\n";
	return 0;
}

示例 5:

#include <iostream>
#include <string>
int main()
{
	using namespace std;
	cout << "Enter a word: ";
	string word;
	cin >> word;
	
	char temp;
	int i, j;
	// for 循环复合语句
	for (j = 0, i = word.size() - 1; j < i; j++; i--)
	{
		temp = word[i];
		word[i] = word[j];
		word[j] = temp;
	}
	cout << word << endl;
	return 0;
}

5.1.3 ++ or - - 前缀与后缀格式

a++:使用 a 当前的值,随后 +1;
++b: b +1,随后使用新的值。

5.1.4 递增/递减运算符和指针

double arr[5] = {21.1, 32.8, 23.4, 45.2, 37.4};
double *pt = arr; //arr[0],  21.1
++pt; // arr[1], 32.8
*++pt; // arr[2], 23.4
++*pt; // arr[2] + 1, 24.4
(*pt)++; // 先 arr[2] + 1 = 24.4, 然后 arr[3]
x = *pt++; // 先 arr[3] = 45.2, 再 arr[4]

5.1.5 组合赋值运算符 & 关系运算符

赋值运算符:+= 、 -=、*=、/=、%=
关系运算符:<、<=、==、>、>=、!=
注意: = 是赋值运算符,而 == 是关系运算符,不要混淆。

5.1.6 复合语句

见 示例5 程序块

复合语句的特性:
1、如果在语句块中定义一个新的变量,仅当程序执行该语句块中的语句时,该变量才存在,执行完语句块中的语句,该变量被释放。
2、在外部语句中定义的变量在内部语句块中也是被定义了
3、如果在一个语句块中声明了一个变量,而在外部语句块中也声明了,则:
示例 6:

int x = 20;
{
	cout << x << endl; // 20
	int x = 100;
	cout << x << endl; // 100
}
cout << x << endl; // 20

5.1.7 逗号运算符

两个作用:

++j, --i; // 作为一个表达式执行
int i, j; // 分隔符作用

5.1.8 字符串比较

示例 7:

int main()
{
	using namespace std;
	char word[5] = "?ate";
	for (char ch = 'a'; strcmp(word, "mate"); ch++)
	{
		cout << word << endl;
		word[0] = ch;
	}
	cout << "After loop ends, word is " << word << endl;
	return 0;
}

示例 8:

int main()
{
	using namespace std;
	char word = "?ate";
	for (char ch = 'a'; word != "mate"; ch++)
	{
		cout << word << endl;
		word[0] = ch;
	}
	 cout << "After loop ends, word is " << word << endl;
	 return 0;
}

两个程序输出结果一样,但比较方式不同。

5.2 while循环

while(name[i] != '\0') // 与while(name[i])等同

5.2.1 编写延时程序

long wait = 0;
while(wait < 10000)
	wait++;

使用clock() 和 头文件 ctime 来创建延时循环

#include <ctime>
int main()
{
	using namespace std;
	cout << "Enter the delay time, in seconds: ";
	float secs;
	cin >> secs;
	clock_t delay = secs * CLOCKS_PER_SEC;
	cout << "starting.....\n";
	clock_t start = clock();
	while(clcok() - start < delay)
		;
	cout << "done.\n";
	return 0;
}

5.2.2 类型别名

#define BYTE char
typedef char byte;

5.3 do-while 循环

5.4 循环和文本输入

如果程序需要使用循环来读取来自键盘的文本输入,需要知道何时停止。
一种方法是设置哨兵字符。
示例 9:

cin >> ch; //获取第一个字符
// 判断第一个字符是否为 #
while(ch != '#') // # 为哨兵字符
{
	cout << ch;
	++count; // 计算字符数
	cin >> ch; // 获取下一个字符
}
// see kun run#really ...
// seekunrun 碰到#停止读取,不读取空格
// cin 将忽略空格和换行符。因此输入中的空格没有被显示,也没有在计数内
// count = 9 不计入空格

5.5 使用 cin.get(ch) 进行补救

cin.get(ch);
while(ch != '#')
{
	cout << ch;
	++count;
	cin.get(ch);
}
// see kun run#really ...
// see kun run 碰到#停止读取
// count = 14

5.6 cin.get()的类型

cin.get(name, Arsize); // 1 
cin.get(); // 2
cin.get(ch); // 3

5.7 文件末尾 EOF

检测到EOF:eofbit = 1 & failbit = 1

while(cin.eof() == false) //检测到文件末尾EOF,cin.eof() 返回false,不进入循环
			 // 反之 返回 true 进入循环
while(cin.fail() == false) //检测到文件末尾EOF,cin.fail() 返回false,不进入循环
                          // 反之 返回 true 进入循环

常见的字符输入法:

// 1
cin.get(ch); // 获取第一个字符
while(cin.fail() == false)
{
	...
	cin.get(ch); // 获取下一个字符
}
// 2
cin.get(ch);
while(!cin.fail())
{
	...
	cin.get(ch);
}
// 3
cin.get(ch);
while(cin) // 比!cin.fial() or !cin.eof() 更通用
          //它可以检测到其他故障原因,如磁盘故障
{
	...
	cin.get(ch);
}
// 4
while(cin.get(ch)) // 由于 cin.get(char) 的返回值为cin, 因此可以将循环简化成这种

5.8 嵌套循环与二维数组

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页