前言
"打牢基础,万事不愁" .C++的基础语法的学习."学以致用,边学边用",编程是实践性很强的技术,在运用中理解,总结.
引入
while的使用是编写代码的基础内容.笔者的记忆力已不如以前,最近遇到了还花了不少功夫,可见是掌握地不够牢固.所以对while的思路和内容做一个归纳,便于以后使用.当然最重要的还是在思路的推导和总结.
while的概览
while指的是条件循环.即:满足条件在代码块中反复执行,条件不满足则退出.
代码格式:
while(循环条件){ //while的代码块
语句1;
语句2;
}
使用while的重点有两个,他们都围绕着while的条件
1.循环条件的描述 2.退出循环的条件
循环条件
while后跟着的循环条件,是一个返回值为bool类型的表达式.
例如: true; //bool类型值,可以做表达式
a>b; //比较表达式,返回值是bool类型
a<b && a>c //逻辑表达式,返回值是bool类型
cin>>a; //输入语句,他的返回值也是bool类型;成功执行返回true,否则false
退出循环条件
如果没有退出循环条件,那么只能是无限循环,这通常是不想被看见的情况
//无限循环1
while(true){
cout<<"hello"<<endl;
}
//无限循环2
int a=2;
while(a>1){
cout<<"hello"<<endl;
}
因此可以作出推导:循环条件中有变量,当变量等于某个值,表达式值为false,退出循环
while的几种应用
有时候编码内容文字不好表达,简单给个概念,用实际代码来说明.
1>while遍历字符串
/*while遍历字符串*/
char p[] = "hello";
char* pt = p;
int n = 1;
while (*pt) {
cout << "第"<<n<<"个字符为:" << *pt << endl;
pt++;
n++;
}
C++中如果写 char *pt="hello",编译通不过.在C语言中应该可以.C语言中字符串本质上字符数组,C++中常用string对象表达字符串,string对象实现了begin(),end()等接口函数,被看作"字符容器"
上面代码中用到了"字符串末尾是空字符''\0"这个特点,当遍历到字符串末尾时,while判定为false,跳出循环.
2>while遍历容器
/*while遍历容器*/
list<int> li;
li.push_back(1);
li.push_back(2);
li.push_back(3);
auto lip = li.begin();
while (lip!=li.end()) {
cout << *lip << endl;
lip++;
}
上面代码常用for来写,用到了"迭代器变量(lip)从begin()开始,直到超尾迭代器end()结束,中间的迭代器变量指向容器元素"这个特点.
3>while和cin(输入流)相结合
下面代码用输入字符控制while的循环退出
char ar;
int b=0;
while (cin >> ar && ar != 'q') { //输入除空白字符(空格,回车,tab)以外的字符,q退出
cout << "你输入的字符是:" << ar << endl;
b++;
}
cout << "b的值是:" <<b<< endl;
上面代码中cin>>ar表达式,他的返回值也是bool类型.成功输入返回true,否则返回false.
代码表示:只要不输入q,其他输入进去的字符被显示出来;此外声明的变量b表示输入次数.
cin有个特点:缓冲流中的空白字符不被识别,比如输入" 3",识别为3,前面的空白字符被丢弃.但cin.get()和cin.getline()会识别空白字符.具体情况可以上网搜索.
下面代码用输入格式控制while的循环退出
double x, y;
cout << "输入两个double型数字:" << endl;
while (cin >> x >> y) { //输入两个值
cout << "输入两个值加起来是:" << x + y << endl;
cout << "格式:数字+空格+数字+空格,其他字母退出" << endl;
}
上面代码实现两个double类型值相加,输入"2 3",计算出5;当输入"t t"等不符合格式时,退出循环
//使输入值在范围内
int number;
while(!(cin>>number && number>=1 && number<=6)){ //当输入不符合要求时
cin.clear(); //重置输入
while(cin.get()!='\n'); //清除多余输入
cout<<"请输入1到6之间的整数(含1和6)"<<endl;
}
.....
//跳出循环后number值在正确范围内(1~6)
上面代码表示必须输入1~6内的一个整数,才可以跳出循环
下面是一个嵌套的while
/*用输入作为while的循环条件的写法*/
double x, y;
cout << "输入任意字符继续,按t退出" << endl;
while (cin >> ar && ar != 'q') { //输入选择
cout << "你还在循环中:" << endl;
cout << "输入两个double型数字:" << endl;
while (cin >> x >> y) { //输入两个值
cout << "输入两个值加起来是:" << x + y << endl;
cout << "按其他键退出" << endl;
}
cin.clear(); //注意:一定要用clear,否则直接退出!
while(cin.get()!='\n'); //注意:这句和上一句一起用,网上说的cin.syc()不行!
cout << "输入任意字符继续,按t退出" << endl;
}
上面代码有个需要注意的地方,从cin从while中跳出来,要将缓冲区做处理,把缓冲区中直到回车符前的部分全部吸收,或者沿用书上叫法-丢弃.不让他影响到下一次的输入.
cin.clear();
while(cin.get()!='\n');
这部分相当于C语言中的
int ch;
while((ch=getchar())!='\n');
4>while和比较表达式结合
假设现在有两个数组,一个数组有n个值,另一个数组有n+2个值.把一个数组内的值复制到另一个数组当中.----当然这个例子不是太典型,一般用for来完成.
int a[3]={1,2,3};
int length=sizeof(a)/sizeof(int);
int b[length+2];
int num=0; //记录元素个数
while(num<length){ //数组之间传递值
b[num]=a[num];
num++;
}
小结
while条件必须是返回值为bool类型的表达式,可用到的表达式有:比较表达式,逻辑表达式,输入表达式cin.表达式里用变量来编写程序员需要的逻辑,逻辑闭环问题解决.
思路:while→表达式→变量→逻辑