循环结构
顺序结构程序自上而下只执行一遍,分支结构中有些语句可能一遍也执行不了,这两种结构都没有充分利用计算机速度快的特点。循环结构是让一些语句在一定条件下反复多次被执行。
循环结构是三大程序结构之一,是C++程序设计的重点内容。顺序结构、选择结构只解决简单问题,是程序设计的基础,而循环结构则是程序设计的实际应用。顾名思义,所谓循环,是指某些语句由于需要而被反复执行多次的现象。
三种循环语句(for、while、do-while)。
1、for循环
格式:for( 初始化; 条件; 调整) 循环体;
循环体可能是复合语句,要写为下面这种格式: for( 初始化; 条件; 调整) { 循环体; }
C++中的for语句使用最为广泛和灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。
for语句的一般格式为
for(表达式1;表达式2;表达式3) 语句 它的执行过程如下: (1) 先求解表达式1。
(2) 求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。 (3) 求解表达式3。
(4) 转回上面第(2)步骤继续执行。
(5) 循环结束,执行for语句下面的一个语句。 例如,输出10个?*?,可用如下语句即可完成: cout << “**********”; 如果要输出1000个?*?,再用上面的写法就不现实了! 解决办法是: 输出一个?*?,即cout << ?*?;重复1000次。
int main(){ int i;
for(i=1;i<=1000;i++)cout << “*\ }
○for 先判断条件而后执行循环体,即有可能循环体一
次也不被执行。如下语句中循环体?s=s+i?一次也不被执行:
for(i=10;i<0;i++)s=s+i;
○c++对循环变量的数据类型没有什么特殊要求:整型int,实型double,字符型 char都可以
○for 适宜循环次数明显的情况,又称计数循环。 ○for中三个表达式间只能用分号相隔,且即使三个表达式省略时,分号也不可省略。
○当循环语句超过一条语句时,要用{ }将语句组合在一起,构成复合语句。
○for中三个表达式,可以为多条语句。 如:for(i=1,j=2;i<=10;i++,j++)s=s+i+j;
2、while循环 格式:
while ( 条件表达式) {语句组} 等同于
for(; 条件表达式; ) {语句组}
3、do while循环 1)格式:
do { 语句组}
while(条件表达式);
for循环和while循环都是先判断表达式是否成立,然后再决定是否循环,do-while的差别在于先执行一次循环再看表达式是否成立。它是这样执行的:先执行一次指定的语句(即循环体),然后判别表达式,当表达式的值为非零(?真?) 时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。 例3.11 用do-while语句求1+2+3+…+100。 可编写出下面的程序: #include
{int i=1,sum=0; do
{ sum=sum+i; //累加求和 i++;
}while (i<=100); //条件成立就返回do后面大括号中的内容执行
cout<<″sum=″< 13 4、转向语句 1)break语句 break在循环体中,也可以从循环体内跳出循环体,提前结束循环。 for ( ; ; ) { cin>>x; if (x==123) break; } 注意:break只能退出一层循环 2)continue语句 continue:其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。 int main( ) { int i; for (i=1;i<=5;i++) { if (i%2)cout<<“*”; else continue; cout<<“#”; } cout<<“ $\\n”; } 结果为:*#*#*# $ 5、多重循环 循环嵌套:这是循环结构的重点和难点。三种循环语句可以互相嵌套(而不是交叉!),共有六种情况,构成循环嵌套结构的各种形式。 多重循环格式之一: for( ; ; ){ 语句组; for( ; ; ) { 语句组; } 语句组; } 例题: 如输出一个m×n的一个矩形的’*’号阵 样例输入:3 5 样例输出: ***** ***** ***** 一般用外循环控制行,内循环控制每行输出的内容. 如本例中用m控制行,n控制每行上有多少个*号,每行上的*号输出完毕后输出一个换行符。 输出m行n列*号 cin>>m>>n; for( i=0;i //外循环通常用作控制行,表示输出图形有m行 for(j=0;j cout< 外循环i=0时,内循环j从0一直变化到n-1,即内循环中的语句{ cout<<‘*’; }被执行了n次,语句 cout< 有时每列上的字符个数不同,如 n=3时,输出如下图形 * ** *** cin>>n; for( i=0;i #include for(i=1;i<=20;i++) {cout< if(i%2==0) cout< 14 f1=f1+f2; //左边的f1代表第3个数,是第1、2个数之和 f2=f2+f1;//左边的f2代表第4个数,是第2、3个数之和 } return 0; } 有时每行上的字符个数以等差数列递增,如 n=3时,输出如下图形 * *** ***** cin>>n; for( i=1;i<=n;i++ ){ for( j=1;j<=2*i-1;j++ )//每行上的字符数目以2递增,因此是2*i cout<*?; cout< 如果是这样的金字塔形式 n=3,输出 * *** ***** 可以看作是先输出了一个倒三角形的空格,然后再输出上例中的图形 cin>>n; for( i=1;i<=n;i++ ){ for(j=1;j<=n-i;j++) //每行上的空格数是n-1,n-2,...,1,0这样一个递减序列,而i每次递增1,要将一个递增序列改为递减序列,直接在前面加上-号 cout<<' '; for( j=1;j<=2*i-1;j++){//每行上的字符数目以2递增,因此是2*i cout<*?; } cout< 简单算法与常用技巧 1、输入数据的数量不确定的处理 可以用while(cin>>n) 来进行处理。一直到无输入流数据时才退出循环。 2、数字的分离 如输入一个不知道位数的整数,要将其倒序输出 cin>>a; b=0; while(a!=0){ //可接写为while(a) b=b*10+a;//将a的个位取出来累加到b中 a=a/10; //将a的个位去掉 } cout< 3、计数器 计数器在循环中的一般形式 cin>>n;j=0; //计数器初值一般为0 for(i=1;i<=n;i++){ cin>>a; if(a%2==0) j=j++; } cout< 4、累加器 累加器在循环中的一般形式 cin>>n;s=0;//n个数的累加 for(i=1;i<=n;i++){ cin>>a; s=s+a;} cout< 5、累乘器 累乘器在循环中的一般形式 cin>>n;s=1; for(i=1;i<=n;i++){ cin>>a; s=s*a;} cout< 6、标记法 输入整数n,请判断其是否为素数(质数)。 cin>>n; f=1; //用f做标记,为1则表示是素数 for( j=2;j if(n%j==0)f=0;//f为0表示n在2~n-1间有约数 if(f==1) cout<<”yes”; else cout<<”no”; 7、求最大值 先假设输入的第一个数即为最大数,然后用它去和后面的数一一进行比较,如果后面的数比它大,则将大的数 15 赋值给它。 cin>>a; max=a; for(i=1;i { cin>>a; if(a>max) max=a;} 循环退出后max中存储的就是最大值 8、求最小值 先假设输入的第一个数即为最小数,然后用它去和后面的数一一进行比较,如果后面的数比它小,则将小的数交换给它。 cin>>a; min=a; for(i=1;i { cin>>a; if(a 9、字符的处理 输入一串字母和数字,以? . ?号结束,统计其中字母和数字的个数。 char a; zimu=0; shuzi=0; for( cin>>a; a!=?.?;){ if(a>=?a?&&a<=?z?||a>=?A?&&a<=?Z?) zimu++; if(a>=?0?&&a<=?9?) shuzi++; cin>>a; } 10、穷举的思想 穷举法也称为?枚举法?,这种算法基本思想是依题目的部分条件,确定答案的大致范围;在此范围内,对所有可能的情况一一列举,逐一验证,直到全部情况验证完毕,或者得到了需要的结果。 若某个情况经验证符合题目的全部条件,则它就是本题的一个答案;若全部情况经验证后,都不符合 题目的全部条件,则原题无解。 用穷举法解题的大致步骤如下: 1)分析题目,确定所要求的解是什么? 2)确定解的可能取值范围是什么? 3)穷举出所有可能的解 4)验证每一个可能的解 5)优化 例:鸡兔同笼问题 一个笼子里有鸡和兔,现在只知道里面一共有a个头,b只脚,问鸡和兔各有多少只(要求鸡和兔至少1只)? int i,j,a,b; cin>>a>>b; for(i=1;i 11、递推的思想 迭代的方法 例:斐波那契数列(从第三项起为前面两项之和) 1 1 2 3 5 8 13… F1=1 (n=1) F2=1 (n=2) Fn=Fn-1+Fn-2 (n≥3) cin>>n; a1=1; a2=1; for(i=3; i<=n; i++){ a3=a1+a2; a1=a2; a2=a3; } cout< 猴子吃桃问题。猴子摘了一堆桃,第一天吃了一半,还嫌不过瘾,又吃了一个;第二天又吃了剩下的一半零一个;以后每天如此。到第N天,猴子一看只剩下一个了。问最初有多少个桃子? cin>>n; for(s=1,i=2;i<=n;i++) s=(s+1)*2; cout< 练习(循环) 一、选择 1、下列关于if语句的描述中,错误的是 A.If语句中可以没有 else if 子句,也可以没有else子句 B.If语句中只能有1个else子句 C.If语句中只能有不超过5个的else if 子句 D.If语句中<条件>可以是任意表达式 2、下列关于break语句和continue语句的描述中,错误的是 A.break语句可以用来退出循环体 B.Break语句可以用来退出if语句 16