大家好啊,鸡啄米在C++编程入门上一讲中讲了算法的基本控制结构当中的选择结构,这一讲来讲讲另一种控制结构-循环结构。
大家想想,我们要统计一个班上所有同学的分数,如果使用顺序结构就是一个分数一个分数的加,语句多,而且执行的动作都是一样的,这个时候就需要用到循环结构了。
循环结构有三种循环控制语句,就是有三种写法:while语句、do-while语句和for语句。
1.while语句
使用的语法形式是:
while(表达式) 语句
它的执行顺序是,先计算while括号里表达式的值是true还是false,如果是true则执行循环体也就是后面的语句,如果是false则跳出while循环,继续执行while循环下面的程序。while后面的语句可以是多条语句,是多条语句的话要用大括号括起来。大家注意,循环体里应该有可以改变表达式值的语句,以便让它能循环到一定程度时跳出循环,不然可就死循环了。这里给大家一个while循环的例子:
#include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int i=1, sum=0; while(i<=10) { sum+=i; //相当于sum=sum+i; i++; } cout<<"sum="<<sum<<endl; return 0; }
这段代码是计算1一直累加到10的和,输出结果为:sum=55。循环体一定要用大括号括起来,不然它只会循环运行sum+=i;这一句了。
2.do-while语句
使用的语法形式如下:
do 语句
while(表达式)
它的执行顺序是:先执行循环体语句,就是do后面的语句,再判断循环条件表达式的值也就是while括号里表达式的值,如果为true则继续执行循环体,如果为false则结束循环,继续执行do-while循环后面的语句。这里还要强调下,跟while循环一样,循环体中一定要由改变循环条件表达式的语句,不然也会死循环。do后面的语句也可以是多条语句,是多条语句的话也要用大括号括起来。再给大家看看do-while的例子:
#include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int i=1, sum=0; do{ sum+=i; i++; }while(i<=10); cout<<"sum="<<sum<<endl; return 0; }
这段代码看起来跟上面差不多,只是用do-while语句代替了while语句。运行结果也是一样的,也会输出sum=55。
那大家是不是认为do-while和while语句是一样的了?那就错了。因为它们的执行顺序不同,while语句是先判断循环条件表达式的值再执行循环体,do-while是先执行循环体再判断循环条件表达式的值。大家想想,如果上面这两个例子当中的i我们都定义成int i(11)或者int i=11,就是i的初始值是11,那结果怎么样呢?上面那段while语句的代码会判断11是不是<=10,当然是false了,循环体不会执行while循环就退出了,所以sum的值还是初始值,输出sum=0。但是下面的do-while语句会先执行一下do后面大括号里的语句,sum+=i将sum的值变成了11,然后执行i++之后就判断while里i<=10的值了,当然也是false,不会继续执行do里的语句了,最后输出sum=11。大家可以上机调试下,鸡啄米给大家总结下,如果一开始循环条件就为false的话,两种语句的执行结果是不一样的,其他情况下一样。
3.for语句
for语句是最灵活的循环语句,可用于循环次数已知的情况也可用于循环次数未知的情况。for语句的语法形式如下:
for(表达式1;表达式2;表达式3)
语句
它的执行顺序是,先计算表达式1的值,再计算表达式2的值,根据表达式2的值决定是否执行循环体,若是true则执行一次循环体,若为false则退出循环。每执行一次循环体后都计算表达式3的值,然后再计算表达式2的值根据其值判断是否执行循环体,就这样循环了。表达式1的值只在刚进入for语句的时候执行一次,做一些初始化,后面就不执行了。鸡啄米再给大家找个例子:
#include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int n, k; cout << "Enter a positive integer: "; cin >> n; cout << "Number " << n << " Factors "; for (k=1; k <= n; k++) if (n % k == 0) cout << k << " "; cout << endl; return 0; }
这个程序是让我们在屏幕上先设一个n值,然后它会从1到n判断哪些整数是n的因子,就是n能被谁整除。运行结果是:
Enter a positive integer: 36
Number 36 Factors 1 2 3 4 6 9 12 18 36
这里的36只是鸡啄米举的一个例子,大家可以输入别的值。
鸡啄米就for语句要跟大家说几个注意的地方:1.表达式1、2、3都可以省略,分号不能省略,都省略后成为for(;;) 语句,相当于while(true),成死循环;2.表达式2是循环控制条件,只要是省略掉它,就会成为死循环;3.表达式1一般是给循环控制条件赋初值,比如上面的k=1,也可以是跟循环变量无关的表达式,如果是表达式1省略或是跟循环条件无关的表达式,就应该在进入for语句前给循环条件赋初值;4.表达式3为改变循环控制条件的值,如果它被省略掉或者是跟循环条件无关的表达式,就应该在循环体里另有语句来改变循环条件,保证不死循环。比如,for(i=1;i<=10;) { sum+=i; i++; },这里因为for后面括号里没有表达式3,则它的循环体里就要加类似i++这样的语句来改变循环条件i。5.如果省略掉表达式1和表达式3只剩下表达式2则for语句完全等同于while语句。比如for(;i<=10;) { i++; } 相当于 while(i<=10) { i++; }。
三种循环语句鸡啄米就介绍完了,下面说说循环结构的嵌套。一个循环体里边可以包含另一个循环结构。while、do-while和for三种循环语句可以相互嵌套。给大家一个例子:
#include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int i=1, a=0; for(; i<=5; i++) { do{ i++; a++; }while(i<3); i++; } cout << a << "," << i <<endl; return 0; }
这里大家可以上机编译运行下看看结果。鸡啄米还要说明一点,上面程序里的int i=1, a=0;最好写成两个语句:int i=1; int a=0;一个是比较清晰,不容易犯错,也不容易让人误解,比如int i, a=0;这样的语句其实只对a赋了个初值0,并没有给 i 赋初值,但有可能会给别人造成误解,或者别人那一会有点晕,以为也给i赋了个初值。
循环结构也可以和选择结构嵌套,鸡啄米再给大家个例子:
#include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int n; for(n=100; n<=200; n++) { if (n%3!=0) cout<<n<<" "; } return 0; }
这个程序是要求100到200之间不能被3整除的数,然后输出。
经常用来控制循环结构的语句还有几个,鸡啄米再跟大家简单说一下,1.break语句。break出现在switch语句或者循环体中时,程序直接从switch语句中或者循环体中跳出,继续执行下面的程序。2.continue语句。continue语句用在循环体中时,用来结束本次循环,接着判断决定是否执行下一次循环,它跟break的区别是,比如,for(int i=0; i<5; i++) { if(i==1) break; sum+=i; }这里如果循环到i等于1的时候for循环就会直接退出,而for(int i=0; i<5; i++) { if(i==1) continue; sum+=i; }的情况是如果循环执行到i等于1的时候则sum+=i这个语句不执行了直接执行for后面括号里表达式3-i++,也就是进入i等于2的循环。3.goto语句。语法形式是,goto 语句标号;。其中语句标号是用来表示语句的标识符,放在语句的最前面,并用冒号跟语句分开,它的作用是让程序执行时直接跳到语句标号指定的语句,这个语句有些危险,尽量少用或不用。
循环结构的知识差不多就这些了,主要是以后要多练习练习,就熟悉了。算法的基本控制结构就这三种:顺序结构、选择结构(上节讲过)和循环结构。大家要自己多试试,编译运行下鸡啄米给出的程序看看运行结果,然后改改程序再看看,编程入门时基本知识学踏实点,以后就可以更好的理解后面的知识。