C++学习之循环和关系表达式(while部分、do-while和嵌套)

1.while循环

  • while循环是没有初始化和更新部分的for循环,他只有测试条件和循环体

while(test-condition)

        body

首先,程序计算圆括号内的测试条件表达式。如果该表达式为true,则执行循环体中的语句。执行完循环体,程序返回测试条件,对他进行重新评估。如果该条件为非零,则再次执行循环体。测试和执行将一直进行下去,直到测试条件为false为止。

  • 由于for循环和while循环几乎是等效的,因此究竟使用哪一个只是风格上的问题。他么之间存在三个差别。首先,在for循环中省略了测试条件时,将认为条件为true;其次,在for循环中,可使用初始化语句声明一个局部变量,但在while循环中不能这样做;最后,如果循环体中包括continue语句,情况将稍有不同。
  • 通常程序员使用for循环来循环计数,因为for循环格式允许将所有相关的信息——初始化、终止值和更新计数器的方法——放到同一个地方。在无法预知循环将执行的次数时,程序员常使用while循环。
  •  
  • //通过while和函数clock()的延时小程序
    #include<iostream>
    #include<ctime>
    
    int main(void)
    {
    	using namespace std;
    	cout << "Enter the delay time,in seconds:";
    	float secs;
    	cin >> secs;
    	clock_t delay = secs*CLOCKS_PER_SEC;
    	cout << "staring\a\n";
    	clock_t start = clock();
    	while (clock() - start < delay);
    	cout << "done\a\n";
    	return 0;
    }

    在头文件ctime中,定义了一个符号常量——CLOCKS_PER_SEC,该常量等于每秒钟包含的系统时间单位数。因此,将系统时间除以这个值,可以得到秒数。或者将秒数乘以CLOCKS_PER_SEC,可以得到以系统时间单位为单位的时间。clock()返回程序开始执行后所用的系统时间。其次ctime将clock_t 作为clock()返回类型的别名,这意味着可以将变量声明为clock_t 类型,编译器将把它转换为long、unsigned int或适合系统的其他类型

2.do—while循环

  • 这种循环将首先执行循环体,然后在判定测试表达式,决定是否应继续执行循环。

do{

body

}while(test-expression)

3.循环和文本输入

先来一个小程序:

#include<iostream>


int main(void)
{
	using namespace std;
	char ch;
	int count = 0;
	cout << "Enter characters;enter # to quit:\n";
	cin >> ch;
	while (ch!='#')
	{
		cout << ch;
		++count;
		cin >> ch;
	}
	cout << endl << count << " characters read\n";
}

输出结果时你会发现程序在输出的时候省略了空格。原因在于cin,读取char值时,与读取其他基本类型一样,cin将忽视空格和换行符。

更为复杂的是,发送给cin的输入被缓冲。这意味着只有在用户按下回车后,他输入的内容才会被发送给程序。

使用cin.get(char)进行补救

#include<iostream>


int main(void)
{
	using namespace std;
	char ch;
	int count = 0;
	cout << "Enter characters;enter # to quit:\n";
	cin.get(ch);
	while (ch!='#')
	{
		cout << ch;
		++count;
		cin.get(ch);
	}
	cout << endl << count << " characters read\n";
}

现在,该程序回显了每个字符,并将全部字符计算在内,其中包括空格。输入任被缓冲,因此输入的字符个数仍可能比最终到达程序的要多。

4.简单嵌套

#include<iostream>
const int Cities = 5;
const int Years = 4;


int main(void)
{
	using namespace std;
	const char * cities[Cities] =
	{
		"Gribble City",
		"Gribbletown",
		"New Gribble",
		"San Gribble",
		"Gribble Vista"
	};
	int maxtemps[Years][Cities]=
	{
		{96,100,87,101,105},
		{96,98,91,107,104},
		{97,101,93,108,107},
		{98,103,95,109,108}
	};
	cout << "Maximum temperatures for 2008-2011\n\n";
	for (int city = 0; city < Cities; city++)
	{
		cout << cities[city] << ":\t";
		for (int year = 0; year < Years; ++year)
			cout << maxtemps[year][city] << "\t";
		cout << endl;
	}
	return 0;
}

5.总结

C++报供了3种循环:for循环、while循环和do while循环如果循环测试条件为true或非零,则循环将重复执行一组指令:如果测试条件为false或0,则结束循环。for循环和while循环都是入口条件循环,这意味着程序将在执行循环体中的语句之前检查测试条件。do while循环是出口条件循环,这意味着其将在执行循环体中的语句之后检查条件。

每种循环的语句都要求循环体有一条语句组成。然而,这条语句可以是符合语句,也可以是语句块(由花括号括起来的多条语句)

关系表达式对两个值进行比较,常被用来循环测试条件。关系表达式是通过使用6种关系运算符之一构成的:<.<=.==.>=.>或!=。关系表达式的结构为bool类型,值为true或false。

许多程序都逐字节地读取文本输入或文本文件,istream类提供了多种课完成这种工作的方法。如果ch是一个char变量,则下面的语句将输入中的下一个字符读入ch中:

cin>>ch;

然而,它将忽略空格、换行和制表符。下面的成员函数调用读取输入中的下一个字符(而不管高字符是什么)并将其存储到ch中

cin.get();

成员函数调用cin.get()返回下一个输入字符——包括空格、换行符和制表符,因此,可以这样使用它:

ch=cin.get();

cin.get(char)成员函数调用通过返回转换为false的bool值来指出已到达EOF,而cin.get()成员函数调用则通过返回EOF值来指出已到达EOF,EOF是在文件iostream中定义的

嵌套循环是循环中的循环,适合用于处理二维数组。

6.补充一下文件尾条件(EOF)

如果输入来自于文件,则可以使用一种功能更为强大的技术——检测文件位(EOF)。C++输入工具和操作系统协同工作,来检查文件尾并将这种信息告知程序。(键盘模拟,在windows命令提示符模式下,可以在任意位置按Ctrl+Z和Enter)

检测到EOF后,cin将两位(eofbit和failbit)都设置为1.可以通过成员函数eof()来查看eofbit是否被设置;如果检测到EOF,则cin.eof()将返回bool值true,否则返回false。同样,如果failbit被设置为1,则fail()成员函数返回true,否则返回false。注意,eof()和fail()方法报告最近读取的结果;也就是说,他们在事后报告,而不是预先报告。因此应该将cin.eof()和cin.fail测试放在读取后,接下来的程序就会体现这一点。而且fail()可用于更多的实现中。

(有些系统不支持来自键盘的模拟EOF;有些系统对齐支持不完善。cin.get()可以用来锁住屏幕,知道可以读取为止,但是这种方法在这里并不适用,因为检查EOF是将关闭对输入的进一步读取)

#include<iostream>


int main(void)
{
	using namespace std;
	char ch;
	int count = 0;
	cin.get(ch);
	while (cin.fail() == false)
	{
		cout << ch;
		++count;
		cin.get(ch);
	}
	cout << endl << count << "  characters read\n";

	return 0;
}

我的电脑是按ctrl+z再按一下Enter模拟EOF的。

方法cin.get(char)的返回值是一个cin对象,然而,istream类提供了一个可以将istream对象转化为bool值的函数;当cin出现在需要bool值的地方时,该转换函数将被调用。另外,如果最后一次读取成功了,则转换得到的bool值为true;否则为false。这就意味着可以将上述while测试改写成

while(cin.get(ch))//while input is successful

他还可以检查到其他失败的原因。

#include<iostream>


int main(void)
{
	using namespace std;
	char ch;
	int count = 0;
	//cin.get(ch);
	//while (cin.fail() == false)
	while (cin.get(ch))
	{
		cout << ch;
		++count;
		//cin.get(ch);
	}
	cout << endl << count << "  characters read\n";

	return 0;
}

7.另一个cin.get()版本

c语言中有两个字符I/O函数——getchar()和putchar(),他们仍然适用,只要像在c语言中那样包含stdio.h(或者cstdio)即可。也可以使用istream和ostream类中类似功能的成员函数,来看看这种方式。

不接受任何参数的cin.get()成员函数返回输入中的下一个字符,也就是说可以这样使用:

ch=cin.get();

该函数的工作方式与c语言中的getchar()相似,将字符编码作为int 返回;而cin.get(ch)返回一个队像,而不是读取的字符。同样,可以使用cout.put()函数来显示字符。

cout.put(ch);

该函数 的工作方式类似C语言中的putchar(),只不过其参数类型为char,而不是int;

提到这突然想到一个东西就是函数重载——比如之前有一个函数

cin.get(name,ArSize);

还有一个函数:

cin.get(ch);

在C中,如果函数接收char指针和int参数,则使用该函数是,不能只传递一个参数。但在C++中可以这样做。因为该语言支持被称为函数重载的OPP特性。函数重载允许创建多个同名的函数,条件是他们的参数不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值