概述
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 << "staringan"; clock_t start = clock(); while (clock() - start < delay); cout << "donean"; 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 readn";
}
输出结果时你会发现程序在输出的时候省略了空格。原因在于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 readn";
}
现在,该程序回显了每个字符,并将全部字符计算在内,其中包括空格。输入任被缓冲,因此输入的字符个数仍可能比最终到达程序的要多。
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-2011nn";
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 readn";
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 readn";
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特性。函数重载允许创建多个同名的函数,条件是他们的参数不同。
最后
以上就是纯真鞋子为你收集整理的C++学习之循环和关系表达式(while部分、do-while和嵌套)的全部内容,希望文章能够帮你解决C++学习之循环和关系表达式(while部分、do-while和嵌套)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复