《第4章过程化语句.ppt》由会员分享,可在线阅读,更多相关《第4章过程化语句.ppt(49页珍藏版)》请在三一办公上搜索。
1、第四章 表达式和语句,授课教师:*,2023/8/5,2,4.1 while语句4.2 do.while语句4.3 for语句4.4 switch语句4.5 转向语句4.6 过程应用:求4.7 过程应用:判明素数4.8 过程应用:求积分注:红色重点必讲,蓝色一般讲授,黑色可不提,第四章 表达式和语句,2023/8/5,3,学习目标,会使用while循环语句会使用dowhile 循环语句会使用for循环语句会使用switch多重选择语句会使用break和continue语句,2023/8/5,4,程序的三种基本结构:,顺序结构选择结构(分支结构)if单分支选择结构 switch 多分支结构循环结
2、构 while do.while for goto语句与if语句构造循环,4.0 前言,2023/8/5,5,循环的基本结构(四个部分),循环的入口,循环继续的条件:其反面为循环结束的条件,被称为循环的出口,循环体:重复执行的语句,改变循环条件:使循环条件发生变化的语句,可以使循环条件不再满足,4.0 前言,2023/8/5,6,4.0 前言,程序的基本组成单位是语句。在一定的条件下,去重复执行一组语句,这样的语句结构称为循环结构,被重复执行的那组语句被称为循环体例如伪代码:While(购物单上还有其他商品)买下一个商品 把它从购物单上划掉,2023/8/5,7,4.1 while语句,语句结
3、构,while(表达式)循环体;,关键字,通常为关系或逻辑表达式决定是否执行循环体,重复执行的操作直至表达式的值为false(0),2023/8/5,8,执行流程:计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式值为0 时结束循环,转去执行while后面的语句while语句的特点:先判断表达式,后执行循环体.,4.1 while语句,2023/8/5,9,说明:循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,return,goto无限循环(死循环):while(1)循环体;
4、,4.1 while语句,2023/8/5,10,例4_1:求sum=1+2+3+100,i=1;/循环变量初始化while(i=10)/循环条件/循环体 sum=sun+i;i+/改变循环变量的值可简化为:while(i=10)sum+=i+;或while(sum+=i+,i=10);,说明:(1)循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现.(2)在循环中应有使循环趋向于结束的语句。,2023/8/5,11,例2:寻找1000以内能被3、5、7同时整除的正整数,a=1为初始值(入口)a=1000为循环的出口a+为改变循环条件的语句(改变循环条件)判断是还能被3、5、
5、7同时整除为重复执行的语句(循环体),2023/8/5,12,例2:程序代码,#include“iostream.h”#include“iomanip.h”void main()int a=1;while(a1000)if(a%3=0,2023/8/5,13,例3 求随机输入的15个数的平均值,分析:输入的15个数应该是什么类型?这15个数存放在哪里?求平均应该先求和,其和也应该存储在一个变量中,其和的初始值应该为多少?使用循环吗?,2023/8/5,14,#include int main()int i=0;/循环计数器 double Sum=0;/累加器 double d;cout d;/
6、输入下一个数据 Sum+=d;/累加 i+;/计算已经输入的数据个数 double Average=Sum/i;cout“n其平均值为:Average endl;return 0;,例3 求随机输入的15个数的平均值,2023/8/5,15,例4:找出从键盘输入若干数据中的最大和最小的数.,请同学们自己动手写一写程序.提示:最大和最小的数保存在哪?如何设置最大数和最小数的初始值?,2023/8/5,16,#include int main()double max,min;double d;cout d;max=min=d;while(cin d)/继续执行 if(min d)min=d;if(
7、max d)max=d;cout n其中最大值为:max n其中最小值为:min endl;return 0;,例4:找出从键盘输入若干数据中的最大和最小的数.,2023/8/5,17,例5.文本加密,加密的规则设定为:,A-E,B-F,.,W-A,X-B,Y-C,Z-Da-e,b-f,w-a,x-b,y-c,z-d 其它的字符不变.,#include void main()char ch;cout=A,程序有问题吗?若有,如何修改?,2023/8/5,18,3.2 do_while语句,语句结构do 内嵌语句;while(表达式);先执行内嵌语句(循环体),之后计算表达式的值,不为0(逻辑真
8、)时,再执行循环体并判断条件,直到表达式的值为 0 结束循环,转去执行while下面的语句,2023/8/5,19,关于dowhile语句的几点注意编写程序时,无论循环体是否为复合语句,最好都用花括号括起来dowhile语句要以分号结束,不能忽略不写while和dowhile循环语句最大差别是:前者的循环体有可能一次也不做(如果进入循环时条件就为假);后者的循环体至少要做一次,因为它的判定条件被安排在了做完一次循环体之后。即:如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。,3.2 do_while语句,2023/8/5,20,例4_2:从键盘得到若干110之间的数,
9、直到输入的数不在此范围为止,/*ch4_2.cpp*#include void main()int val;do cout val;/修改条件 if(val10)cout=10);/继续条件 cout you entered a val endl;,2023/8/5,21,/*ch4_3.cpp*#include void main()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);cout”sum=”sumendl;结果:sum=5050,例4_3:求sum=1+2+3+100,2023/8/5,22,例3:while和do-while循环的比较,/
10、分析输入1运行结果,再分析输入11的运行结果(1)#include(2)#include void main()void main()int sum=0,i;int sum=0,i;cini;cini;while(i=10)do sum=sum+i;sum=sum+i;i+;i+;while(i=10);cout“sum=”sumendl;cout“sum=”sumendl;,2023/8/5,23,3.3 for语句,C+语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况for语句结构 for(表达式1;表达式2;表达式3
11、)循环体,关键字,初始表达式,循环条件,循环后置表达式,expr1;while(expr2)循环体;expr3;,2023/8/5,24,for(i=1;i=1;i-)/1001,-1为间隔,100次for(i=7;i=2;i-=2)/202,-2为间隔,10次for(i=99;i=0;i-=3)/990,-3为间隔,34次,3.3 for语句,2023/8/5,25,#include void main()int sum=0;for(int i=1;i=100;i+)sum+=i;cout sum=sum endl;,例1:求sum=1+2+3+100,2023/8/5,26,说明:for语
12、句中expr1,expr2,expr3 类型任意,都可省略,但分号;不可省,(1)省略表达式1 i=1;for(;i100)break;(3)省略表达式3 for(i=1;i=100;)sum+=i+;(4)缺省表达式3和循环体 for(i=1;sum+=i+,i=n;);,2023/8/5,27,(5)表达式1和表达式3可以同时省略 for(;i100)break;(7)表达式1,2,3,可为任意表达式 for(sum=0,i=1;i=100;i+)/表达式1为逗号表达式 sum+=i;for(i=0,j=100,k=0;ij;i+,j-)/表达式1、3为逗号表达式 k+=i*j;for(i
13、=1;i100;sum+=i+);(8)表达式1可以作为循环变量定义 for(int i=1;i=100;i+)sum+=i;,2023/8/5,28,例2 求菲波那契数列的前 n 项,Fibonacci 数列:0,1,1,2,3,5,8,13,21,34,f0=0f1=1fn=fn-1+fn-2(n=2),分析:可以用迭代方法求解,迭代 是一个不断用新值取代变量的旧值,或由旧值递推出变量的新值的过程。,2023/8/5,29,#include void main()int n,i,pre,next;cout n;pre=0;next=1;cout(i-1)*2)cout pre+next e
14、ndl;,例2 求菲波那契数列的前 n 项,整除每趟循环求得两项,2023/8/5,30,4.4 switch多分支选择语句,用switch语句实现选择结构switch(表达式)case 常量值1:语句序列1;break;case 常量值2:语句序列2;break;case 常量值n:语句序列n;break;default:语句序列n+1;break;,2023/8/5,31,计算switch表达式的值,与case后的常量值比较,如果等于第i个值时,则执行case语句序列i;如果执行时没有遇到break语句,那就继续顺序执行case语句序列i+1、n、n+1,而不用再判别与常量值是否匹配;如果
15、遇到break语句,则立即跳去执行switch的后续语句若与所有常量值都不相等,才执行default的语句序列n+1,4.4 switch多分支选择语句,2023/8/5,32,说明:(1)表达式只能是整型、字符型或枚举型,不能为浮点型。(2)当表达式的值与某个case后常量表达式值相同时,执行之。(3)都不匹配,执行default后的语句。例如;根据考试成绩的等级输出百分制分数段。char grade=B;switch(grade)caseA:cout“85-100n”;break;caseB:cout“70-84n”;break;caseC:cout“60-69n”;break;caseD
16、:cout“60n”;break;default:cout“errorn”;/最后可省略break 输出结果为:70-80,4.4 switch多分支选择语句,2023/8/5,33,多个case可共用一组执行语句,注意break的使用 case A:case B:case C:cout60n”;break;当grade 的值为A、B、C 时,都输出60,2023/8/5,34,用if实现根据考试成绩的等级输出百分制分数段例:根据分数输出等级 int grade;/if(grade=85,2023/8/5,35,1、break 语句break 语句用于while,dowhile,for语句中,
17、从最近的封闭循环体中跳出。break语句用于switch语句中,跳出switch语句。例如:for(;)for(;)/if(i=1)break;/a=1;/break跳至此处/,4.5 转向语句,2023/8/5,36,continue语句用于循环语句中,作用为结束本次循环(即不执行本次循环中尚未执行的语句),进入下一次循环的判定。例如:输出100-200之间不能被3整除的数据。for(int n=100;n=200;n+)if(n%3=0)continue;coutnendl;/注意:continue语句和break语句的区别:continue语句结束一次循环中,其后未执行的语句不一定结束整
18、个循环语句的执行。break语句终止整个循环语句。,2、Continue 语句,2023/8/5,37,goto语句用于将程序控制流程从它所在的地方转移到标识符所标识的语句处。i=1;sum=0;loop:sum+=i+;if(i=100)goto loop;cout“sum is”sumendl;注意:现代程序设计方法主张限制使用goto语句 当程序需要从多重循环深处直接跳转到循环之外时,可用goto语句,比用break语句简洁。,3、goto 语句,2023/8/5,38,4.6 求,例:/4=1-1/3+1/5-1/7+1/n,求的近似值,精度要求为|1/n|108关键是如何形成新项。级
19、数各项分子都是1,分母由奇数组成,各项前的符号正负相间符号变量sign,该变量交替取1和-1两个值绝对值函数,整型abs(x),实型fabs(x)绝对值函数在头文件math.h里,2023/8/5,39,/*ch4_4.cpp*#include#include#include void main()double s=0,x=1;/初始值 long k=1;int sign=1;while(fabs(x)1e-8)/项值在比较前要先求绝对值 s+=x;k+=2;sign*=-1;x=sign/double(k);/强制转换使x得到浮点数值 s*=4;/值 cout the pi is/输出 se
20、tiosflags(ios:fixed)setprecision(8)s endl;,2023/8/5,40,设第n-1项为x则下一项为x*(-1)*(2*n-3)/(2*n-1),/*ch4_5.cpp*#include#include void main()double s=0,x=1;/初始值 for(int n=1;fabs(x)1e-8;n+,x*=(-1.0)*(2*n-3)/(2*n-1)s+=x;s*=4;/值 cout the pi is s endl;/输出,2023/8/5,41,例:给定一个整数m,判断该数是否为素数。分析:m是素数的条件是m不能被2,3,m-1整除。/
21、*ch4_6.cpp*#include void main()long m;coutm;for(int i=2;im;i+)if(m%i=0)break;if(m=i)cout“m is prime.n”;else cout“m is not prime.n”;,4.7 判明素数,2023/8/5,42,改进:为提高效率,用m除以2sqrt(m)求余数,判断m是否能被整除,/*ch4_7.cpp*#include#include void main()long m;int i;cout m;double sqrtm=sqrt(m);/用到math.hfor(i=2;i=sqrtm;i+)if(
22、m%i=0)break;if(sqrtmi)cout m is prime.n;else cout m isnt prime.n;,2023/8/5,43,补充:循环的嵌套,一个循环语句的循环体内又包含循环语句,称为嵌套循环,通常把里面的循环称为内循环,外面的循环称为外循环。各种循环语句都可以互相嵌套,2023/8/5,44,例:求从a到b数段内的所有素数,/*ch4_8.cpp*#include#include#include void main()long l=0;int i;cout a b;cout sqrtm)/素数输出 if(l+%10=0)cout endl;cout setw(
23、5)m;,2023/8/5,45,4.8 求积分,略,2023/8/5,46,本章小结,循环是一组语句,计算机反复执行这组语句直到满足终止条件为止。while,do.while和for三种循环语句可以相互转化。for主要适用于循环次数已知的循环。while先判定循环条件,可能一次都不执行循环体。dowhile后判定循环条件,至少保证执行一次循环体while和dowhile中都有改变循环控制变量的语句。可以通过循环变量来控制循环,在循环体中通过条件判定产生中间跳转的方法,终止循环。switch是多选一的分支语句,它是if语句的一个补充(else if结构),当用它编制程序时会增加可读性。,202
24、3/8/5,47,分析:横向:1-9纵向:1-9结果:形成一个直角三角形,1、输出九九乘法表,习 题,2023/8/5,48,#include#include void main()cout|;for(int i=1;i=9;i+)cout setw(5)i;cout n-|-n;for(i=1;i=9;i+)cout setw(2)i|;for(int j=1;j=i;j+)cout setw(5)i*j;cout endl;coutendl;,输出九九乘法表,2023/8/5,49,2、平面图形的打印,#include void main()int i,j,k;for(i=1;i=10;i+)for(j=1;j=10-i;j+)cout;for(k=1;k=2*i-1;k+)cout#;cout endl;,