670 likes | 765 Vues
循环语句. 循环语句控制程序流多次执行一段程序。 是结构化程序设计的 3 种基本结构之一。 C/C++ 语言提供了三种循环语句: for 语句 、 while 语句 和 do 语句 。 三种循环语句可以相互代替,但有些场合用某种循环语句在形式上更简单易懂。 循环语句在高级语言中的地位十分重要。. 循环结构 , 有两种循环结构 : ① 当型循环结构 , 见下图。当 p 条件成立 ( “ 真 ” ) 时 , 反复执行 A 操作。直到 p 为 “ 假 ” 时才停止循环。.
E N D
循环语句 计算机与信息工程学院
循环语句控制程序流多次执行一段程序。 • 是结构化程序设计的3种基本结构之一。 • C/C++语言提供了三种循环语句:for语句、while语句和do语句。 • 三种循环语句可以相互代替,但有些场合用某种循环语句在形式上更简单易懂。 • 循环语句在高级语言中的地位十分重要。 计算机与信息工程学院
循环结构,有两种循环结构: ① 当型循环结构,见下图。当p条件成立(“真”)时,反复执行A操作。直到p为“假”时才停止循环。 计算机与信息工程学院
② 直到型循环结构,见下图。先执行A操作,再判断p是否为“假”,若p为“假”,再执行A,如此反复,直到p为“真”为止。 计算机与信息工程学院
1. for循环语句 问题的提出: 在屏幕上输出一行10个星号“*”语句是? 解决方法是用如下一条输出语句显示: cout << “**********” << endl; 在屏幕上输出两行10个星号“*”语句是? 解决方法是用如下两条输出语句显示: cout << “**********” << endl; cout << “**********” << endl; 计算机与信息工程学院
在屏幕上输出三行10个星号“*”语句是? 解决方法是用如下三条输出语句显示: cout << “**********” << endl; cout << “**********” << endl; cout << “**********” << endl; …… …… 在屏幕上输出100行10个星号“*” 语句是? 上面的方法是不可取的。用循环结构解决是一个好办法! 计算机与信息工程学院
for(i=1;i<=100;i++) sum=sum+i; 【例1】for 语句的引例。 求1+2+3+…+100的值,并将其结果放在变量sum中。 sum sum=0; sum=sum+1; 3 5050 不确定 0 1 6 规律是: 表示为: sum=sum+2; for(i=1;i<=100;i++) sum=sum+3; sum=sum+i; …… 是for语句 sum=sum+100; 计算机与信息工程学院
for 关键字 #include <iostream> using namespace std; int main(void) { int i, sum=0; for ( i=1; i<=100; i++ ) sum=sum+i; cout<<"1+2+3+......+100=“; cout<<sum<<endl; return 0; } 循环体 运行结果:1+2+3+......+100=5050 计算机与信息工程学院
for语句的格式如下: for(表达式1;表达式2;表达式3)〈语句〉 注意每个“;”必须有! 执行过程如下: ①计算表达式1 ②计算表达式2并判断,若为0→退出循环;若非0 → ③ ③〈语句〉 ④计算表达式3,返回① 执行过程演示 计算机与信息工程学院
输出100行10个星号“*” 语句是? for ( i = 1; i <= 100; i = i + 1 ) cout << “**********” <<endl; 计算机与信息工程学院
cin>>score; cout<<score; sum=sum+score; 【例2】键盘输入十个学生的成绩,输出各成绩和平均成绩。 编程点拨:确定两件事情 哪些语句重复执行 输入十个,重复十次 执行多少次循环体 计算机与信息工程学院
int main(void) { int i , score, sum=0; float ave; cout<<"Input score:“<<endl; for( i=1; i<=10; i++) { cin>>score; cout<<score; sum=sum+score; } 用复合语句 循环体是三条语句 cout<<endl; ave=(float)sum/10; cout<<"ave=“<<ave; } 不必放在循环体内 计算机与信息工程学院
运行结果如下: Input score: 95 100 65 45 60 89 78 80 83 70 95 100 65 45 60 89 78 80 83 70 ave=76.500000 计算机与信息工程学院
【例3】在3~100之间所有3的倍数中,找出个位数为2的数。 编程点拨: 3~100内3的倍数有3 6 9 … 99 for ( i=3; i<=100; i=i+3 ) 用 i%10 表示个位数 if( i%10==2 ) … 计算机与信息工程学院
将最小的3的倍数3赋给i 当i的值小于等于100时 i个位数是2? 假 真 输出i的值 i的值增3 流程图 计算机与信息工程学院
72 _ 用三种基本结构能写出所有复杂程序 #include “iostream.h” void main( ) { int i; for ( i=3; i<=100; i=i+3 ) if( i%10==2 ) cout<<““<<i; cout<<endl; } 循环结构 按4个字符位 输出整数 顺序结构 分支结构 输出: 12 42 计算机与信息工程学院
【例4】输出1!、2!、3!、……、n!。 其中n!= 1×2×3×……×n, n的值从键盘输入 。 编程点拨: 算法和求1+2+…+100的算法类似 但在本程序中fac的初值为1,不是0。 计算机与信息工程学院
若为int型,求8!时开始出现溢出现象 不能为0.0 #include <iostream> main () { int i,n; float fac=1.0; cout<<"Input n:"; cin>>n; for ( i=1; i<=n; ) { fac=fac*i; cout<<"d!="<<fac<<endl; i++; } } 省略了i++ 建议使用 规范形式 计算机与信息工程学院
只输出整数部分 #include “iostream.h” main () { int i,n; float fac=1.0; cout<<"Input n:"; cin>>n; for ( i=1; i<=n; ) { fac=fac*i; cout<<"d!="<<fac<<endl; i++; } } 计算机与信息工程学院
运行结果如下: Input n:20 1!=1 2!=2 …… 19!=121645096004222976 20!=2432902023163674620 (注意,只保证前6~7位是准确的) 计算机与信息工程学院
请思考 如何求2的n次方 fac=1.0; for ( i=1; i<=n; i++ ) { fac= fac * i ; cout<<fac; } 2 计算机与信息工程学院
【例5】在两行上分别按顺序和逆序输出26个英文大写字母。【例5】在两行上分别按顺序和逆序输出26个英文大写字母。 编程点拨: 在ASCII码表中,字母按A到Z的顺序排列 使用循环通过A计算 (即’A’+i,i=0,1,2,…,25) 计算机与信息工程学院
cout<<endl; cout<<endl; #include “iostream.h” main ( ) { int i; } for ( i=0; i<=25; i++ ) cout<< 'A'+i; 顺序输出 注意位置 for ( i=25; i>=0; i-- ) cout<< 'A'+i; 逆序输出 不是i++ 计算机与信息工程学院
【例6】从键盘输入十个数,求其中最大值。 编程点拨: 用例三个整数中求最大数介绍的算法由于数据较多,用循环结构比较合适 计算机与信息工程学院
#include “iostream.h” main( ) { int a,max,i; cout<<“max=”<<max; } 运行时试最大值在 最前最后中间某一位置的情况 cout<<"Input data:"; 思考:100个数中求最大,如何修改? cin>>a; cout<<a; 输入第一个数并输出 max=a; 第一个数存入max for ( i=1; i<=9; i++ ) { cin>>a; cout<<a; 输入后九个数并输出 if ( max<a ) max=a; } 计算机与信息工程学院
【例7】求 先思考:如何求 for(i=1; i<=100; i++) sum=sum+(float)1/i; 计算机与信息工程学院
再思考:如何解决正负相间的问题 i=1 sign=1 sum=sum+1/1 i=2 sign=-1 sum=sum-1/2 i=3 sign=1 sign=1; for ( i=1; i<=100; i++ ) sum=sum+(float) 1 / i; sum=sum+1/3 … … { } sign sign=-sign; 符号翻转 计算机与信息工程学院
#include “iostream.h” main( ) { int i,sign; float sum; 运行结果 sum=0.688172 } 完整程序 sign=1; for ( i=1; i<=100; i++ ) {sum=sum+(float)sign/ i; sign=-sign; } sum=0.0; cout<<“sum=”<<sum<<endl; 计算机与信息工程学院
【例8】输出斐波纳契(Fibonacci)级数1、1、2、3、5、8、13、… 的前三十项。 规律:前两项的值各为1,从第三项起,每一项都是前两项的和。 要求:一行输出6项 计算机与信息工程学院
规律: 1 1 + a b next=a+b; a=b; b=next; 求解过程 2 next 第3项 3 a + b next 第4项 2 1 5 a + b next 第5项 2 3 8 a + b next 第6项 3 5 … … 计算机与信息工程学院
main( ) { int i,n; long a,b,next; } a=b=1; cout<<a<<b; n=2; 处理前两项 for ( i=3; i<=30; i++ ) { next=a+b; a=b; b=next; } 处理后28项 cout<<setw(10)<<next; n++; if ( n%6==0 ) cout<<endl; 输出并控制换行 计算机与信息工程学院
运行结果如下: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 计算机与信息工程学院
说明: • 同一个问题,可能有多种算法 • 在学习过程中,勤于思考,善于发现问题,编写出更优化的程序。 • 以上循环共同点:容易确定循环次数 • 注意掌握循环的嵌套调用方法 • for语句一般用于循环次数已知的情况。 • 如果次数事先不知,则常用while 语句或do-while语句。 计算机与信息工程学院
2. while循环语句 格式如下: while(〈条件〉)〈语句〉 执行过程 表达式 循环体 非0 0 计算机与信息工程学院
【例9】从键盘输入若干个非0数据,求它们的和。用0结束循环的执行。 • 编程点拨: • 本题需要用循环结构 • 用for语句不方便 • 下面用while 语句 计算机与信息工程学院
#include <iostream.h> main( ) { int a,sum=0; cout<<“Input data:”<<endl; cin>>a; while ( a!=0 ) { cout<<a; sum=sum+a; cin>>a; } cout<<"sum=“<<sum; } while 当a为非0时,执行循环体 关键字 进入循环前 先输入一个数 计算机与信息工程学院
第一次运行: Input data: 11 22 33 44 55 66 77 88 99 0 1 2 11 22 33 44 55 66 77 88 99 sum=495 Ctrl+Break强行结束执行 第二次运行: Input data: 0 (空一行) sum的初值 sum=0 计算机与信息工程学院
【例10】用while循环求1+2+3+…+100 #include <iostream.h> int main( ) { int ,sum=0; cout<<“sum=”<<sum; } i=1 while ( i<=100 ) sum=sum+i; 不同循环语句之可以相互转换 { } i++; 计算机与信息工程学院
【例11】用公式 求π的近似值,直到最后一项的绝对值小于10-4为止。 编程点拨: 先计算 的近似值,再求π的近似值 不易确定从第几项起,绝对值小于10-4 本例用while语句 计算机与信息工程学院
#include <math.h> 加入一行 main ( ) { int , ; float pi, pi=sum*4 ; cout<<"pi=“<<pi<<endl; } next=1.0,sum=0.0; sign=1 i=1 while ( ) { } fabs(next) >= 1e-4 sum=sum+next; fabs是库函数 求绝对值 sign=-sign; i=i+2; next=(float)sign/i; 计算机与信息工程学院
【例12】编写加、减、乘、除运算程序。 执行效果: 请输入第1题,用3#3退出。 2*3.5 2.000000*3.500000=7.000000 请输入第2题,用3#3退出。 3/0 除数为0! 请输入第2题,用3#3退出。 5.5&4.7 &是非法字符! 请输入第2题,用3#3退出。 结束循环 3#3 计算机与信息工程学院
编程点拨: 本题用while语句较方便 加、减、乘、除、非法共五个分支 用switch语句,且带break语句 计算机与信息工程学院
用做标记 #include <stdio.h> #include <conio.h> main ( ) { int i=1,flag=0; float a,b,result; char sym; clrscr( ); cout<<"请输入第1题,用3#3退出。"; cin>>a>>sym>>b; while ( sym!='#' ) { 用清屏函数时加此行 清屏函数 ……见下一页 计算机与信息工程学院
while ( sym!='#' ) { switch ( sym ) { case '+': result=a+b; break; case '-': result=a-b; break; case '*': result=a*b; break; case '/': if ( b==0 ) flag=1; else result=a/b; break; default : flag=2; } } 注意缩进格式 不能少 除数0,用1标记 非法字符,用2标记 ……见下一页 计算机与信息工程学院
while ( sym!='#' ) {…………见上一页 if ( flag == 0 ) { cout<<a<<sym<<b<<result<<endl; i++; } if ( flag == 1 ) cout<<“除数为0!”<<endl; if ( flag == 2 ) cout<< sym <<"是非法运算符!“<<endl; cout<< “请输入第” <<i; cout<<“题,用3#3退出。”<<endl; cin>>a>>sym>>b; }} 是合法算式 准备下一题数 i 计算机与信息工程学院
3. do-while循环语句 格式如下: do〈语句〉 while(〈条件〉); do-while和while很相似 区别: while 先判断表达式的值,后执行循环体 do-while先执行循环体,再判断表达式 计算机与信息工程学院
执行过程 循环体 非0 表达式 0 计算机与信息工程学院
说明: do-while先执行一次循环体,后判断表达式 循环体至少被执行一次 • while先判断表达式,后执行循环体 循环体有可能一次也不被执行 • 三种循环可以互相转换 根据不同情况,选择具体循环 计算机与信息工程学院
【例14】从键盘输入的一串字符(用#结束输入)按如下规则进行转换: • 如果为大写字母,则先转换为小写字母 • 将a转换为c • b转换为d • ……… • x转换为z • y转换为a • z转换为b • 其它字符不变 a b c d … x y z 计算机与信息工程学院
编程点拨: if ( ch>='A' && ch<='Z' ) ch=ch+32; 大写转小写 • if ( ch>='a' && ch<='z' ) • ch=ch+2; 小写转其后第二个字母 • ’y’和’z’通过ch=ch+2; 后 ch>’z’ • if ( ch>'z') ch=ch-26; 计算机与信息工程学院