第五章 循环(2)

来源:互联网 发布:怎么看淘宝买家好评率 编辑:程序博客网 时间:2024/05/15 09:57

while循环

先摆出用法

while(test-condition)

body

很好理解,执行循环之前先判断test-condition是否满足,如果满足就执行,如果不满足,就跳出循环


现在和for循环对比可以看出他们本质上没什么区别 ,可以互换,例如

for(int i=0;i<10;i++)

cout<<i<<endl;

可以改成

int i=0;

while(i<10) {

cout<<i<<endl;

i++;

}

while循环怎么改成for循环就自己想呢。 

两个循环主要两个区别,一个实for循环可以通过初始化声明局部变量,循环结束后就释放,while循环就不能这样;另外一个区别就是循环体重包括continue语句,情况会有所不同,这个第六章会讲到。


do while循环

c++还提供了一种循环叫do while,这种循环一进来就do语句一边,然后通过while中的测试语句判断还要不要继续do循环:

do

body

while (test-expression);


另外c++ 11新增了一种循环:基于范围的for循环,一般用于对数组(或者容器如vector,array)的每个元素执行相同的操作:

int num[5] = {1, 2, 3, 4, 5}'

for (int x : num}

cout << x <<endl;


也可以修改数组每个元素

for(int &x : num)

x =  x*2;


知道循环的工作原理后,第五章介绍了循环完成对最常见也是最基本的任务:逐字符读取来自文件或键盘的文本。

1)通过哨兵字符(sentinel character) 来作为输入的停止标记:遇到这个输入就停止,具体见下例

char ch;
cin >> ch;
while(ch != '#') {
cout << ch;
cin >> ch;
}

该例中如果输入see ken run#really fast 只会显示seekenrun

值得注意的是cin读取时会忽略空格和换行符。更为复杂的是,发送给cin的输入都会进入缓冲,这意味着只有在用户按下回车键只会,用户输入的内容才会被发送给程序;按下回车后整个输入被发送给while处理,遇到#结束循环。


如果非要读取空格就需要用cin.get() 函数。上例中可以写成这样:

char ch;
cin.get(ch);
while(ch != '#') {
cout << ch;
cin.get(ch);
}

这样如果输入同样的内容就会显示为see ken run


学过第四章会注意到可以通过cin.get(name,name_size)来输入一个字符串,这是c++一个特性,被称为函数重载,允许创建多个同名函数但参数列表不同。这会在第八章做更多介绍。


输入可以通过检查文件尾EOF(end of file)来结束.如果是键盘输入,EOF也可以通过键盘来模拟,但不同系统不一样:Unix是Ctrl+D,Windows则是Ctrl+Z和Enter。例如上例中可以这样写

char ch;
cin.get(ch);
while(!cin.fail()) {
cout << ch;
cin.get(ch);
}

这样输入会一直进行到按下Ctrl+Z和Enter(windows下)为止。也可以简化为

while(cin.get(ch)) 
cout << ch;

还可以这样 省略cin.get(ch) 直接写成这样

while((ch = cin.get()) !=EOF) 
cout << ch;
这些都是判断eof的方法了,具体道理有点绕,区别也没细说,现在就先了解吧


最后来看嵌套循环以及嵌套循环最经常处理的二维数组

二维数组可以这样声明

int arr2d [4][5]; 

这意味着arr2d是一个包含4个元素的数组,每个元素都是一个由5个int元素组成的数组。可以通过嵌套for循环来读取该数组的每一个元素

for (int row = 0; row < 4; row++)

{

for (int col = 0; col < 5; col++)

cout << arr2d[row][col] << "\t";

cout << endl;

}

0 0