流程控制1课件_第1页
流程控制1课件_第2页
流程控制1课件_第3页
流程控制1课件_第4页
流程控制1课件_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

流程控制2024/4/17流程控制[1]语句序列1语句序列2语句序列1条件?成立不成立语句序列2语句序列不成立成立条件?顺序结构选择结构循环结构流程结构由这三种基本结构经过反复嵌套构成的程序称为结构化程序流程控制[1]顺序结构顺序结构:按照语句出现的先后顺序依次执行。例1:编写程序:要求输入直角三角形的斜边和一条直角边,求三角形另外一条直角边,周长和面积。#include<iostream>#include<cmath>usingnamespacestd;流程控制[1]voidmain(){doublea,b,c;doublel,s;cout<<"输入斜边、直角边的长:";cin>>c>>a;b=sqrt(c*c-a*a);l=a+b+c;s=a*b/2;cout<<"另一直角边="<<b<<endl;cout<<"周长="<<l<<endl;cout<<"面积="<<s<<endl;}流程控制[1]选择结构根据条件的值来判断程序的流向。

if语句,实现n分支,要求n个表达式;switch语句,实现多分支;用1个表达式1.if语句的三种形式if(表达式)语句if(表达式)语句1else语句2不能单独存在流程控制[1]表达式1假真表达式2表达式3表达式4语句5语句4语句3语句2语句1真真真假假假if(表达式1)语句1

elseif(表达式2)语句2

elseif(表达式3)语句3…elseif(表达式m)语句melse语句m+1if语句的三种形式流程控制[1]表达式语句假(0)真(非0)第一种形式的条件语句if(表达式)

语句

说明:if后面的表达式类型任意语句可以是一句或复合语句。if(x)语句if(x!=0)if(!x)if(x<y){t=x;x=y;y=t;}

cout<<x<<y;

if(x==0)流程控制[1]#include<iostream>usingnamespacestd;voidmain(){intx,y,t;cout<<"输入xy"<<endl;cin>>x>>y;if(x<y){t=x;x=y;y=t;}//x与y交换cout<<x<<">"<<y<<endl;}流程控制[1]第二种形式的条件语句表达式语句1语句2真假if(表达式)语句else语句2不能单独存在非00例2:计算分段函数:if(x)y=sin(x)+sqrt(x*x+1);elsey=cos(x)-x*x+3*x;流程控制[1]思考:要使max存放x、y中大者,min存放小者,分析下面程序段正确否?if(x>y)max=x;min=y;elsemax=y;min=x;{复合语句}{}{}流程控制[1]第三种形式的条件语句if(表达式)语句1elseif语句2例:计算分数mark属于优良中及格不及格。表达式1假真表达式2表达式3表达式4语句5语句4语句3语句2语句1真真真假假假elseif语句3else语句4流程控制[1]if(mark>=90)cout<<"优";

elseif(80<=mark&&mark<90)cout<<"良";

elseif(70<=mark&&mark<80)cout<<"中"; elseif(60<=mark&&mark<70)cout<<"及格";

else

cout<<"不及格";

if(mark>=90)cout<<"优";

elseif(80<=mark)cout<<"良";

elseif(70<=mark)

cout<<"中";

elseif(60<=mark)cout<<"及格";

else

cout<<"不及格";

if(mark>=60)cout<<"及格";elseif(mark>=70)cout<<"中";elseif(mark>=80)cout<<"良";elseif(mark>=90)cout<<"优";elsecout<<"不及格";①程序执行一个分支后,其余分支不再执行。②elseif不能写成elseif。③当多分支中有多个表达式同时满足,只执行第一个与之匹配的语句。流程控制[1]例:编程实现分段函数#include<iostream>usingnamespacestd;voidmain(){doublex,y; cout<<"Pleaseinputx="; cin>>x; if(x<0)

{ y=x+1; cout<<"x="<<x<<",

y=x+1="<<y<<endl; }复合语句流程控制[1]

elseif(x<1) //0≤x<1 { y=1; cout<<"x="<<x<<",y="<<y<<endl; }

else //1≤x { y=x*x*x; cout<<"x="<<x<<",y=x*x*x="<<y<<endl; } }流程控制[1]if语句的嵌套if(表达式1)if(表达表2)语句1else语句2elseif(表达表3)语句3else语句4if(表达式1)if(表达式2)语句1else语句2

if(表达式1) if(表达式11)语句11else语句12else语句2else总是和最近的if配对流程控制[1]例:已知x,y,z三个数,使得x>y>z。

if(x<y){t=x;x=y;y=t;}if(y<z)

{t=y;y=z;z=t; if(x<y) {t=x;x=y;y=t;}

}x与y互换z与y互换复合语句为什么要引入中间变量t?流程控制[1]例:考虑下面程序输出结果:voidmain(){intx=100,a=10,b=20;intv1=5,v2=0;if(a<b)if(b!=15)if(!v1)x=1;elseif(v2)x=10;

x=-1;cout<<x;}结果:-1该语句不属于选择结构中的语句流程控制[1]例:求一元二次方程ax2+bx+c=0的根,其中系数a,b,c为实数,由键盘输入。#include<iostream>#include<cmath>usingnamespacestd;voidmain(){ doublea,b,c,delta,p,q; cout<<"Pleaseintputa,b,c="; cin>>a>>b>>c;

delta=b*b-4*a*c;

p=-b/(2*a);

q=sqrt(fabs(delta))/(2*a);流程控制[1]

if(delta>=0)

cout<<"x1="<<p+q<<endl<<"x2="<<p-q<<endl;else {cout<<"x1="<<p<<"+j"<<q; cout<<endl<<"x2="<<p<<"-j"<<q<<endl; } }思考:(1)a=0?(2)a≠0,b=0?(3)a≠0,b≠0?流程控制[1]switch语句switch(表达式){case常量表达式1:语句组1;case常量表达式2:语句组2;case常量表达式n:语句组n;…default:语句组n+1;}[break;][break;][break;]必须为整型或字符型流程控制[1]说明:10常量表达式的值必须互不相等。20语句组i可以含有多个语句。30语句中含有break语句时,执行完后退出switch语句。40若某组语句不含break语句,则本组语句执行完毕后将继续执行下一组语句。流程控制[1]50若没有常量值与表达式值相等,执行default语句n+1,若无该语句,退出switch语句。60可以多个case共用一组语句。80用switch语句实现的多分支结构程序,可用if语句或if语句的嵌套来实现。70switch语句允许嵌套。流程控制[1]例:用switch结构求分段函数2a+1(1<=a<2)b=a2-3(2<=a<4)a其它switch((int)a){case1:b=2*a+1;case2:case3:b=a*a-3;default:b=a;}共用语句组switch((int)a){casea>=1&&a<2:……casea>=2&&a<4:.…..default:b=a;}关系表达式Χ思考:若省去break语句,情况会怎样?break;break;流程控制[1]例:从键盘上输入学生的分数,要求当学生的分数

90~100-verygood!80~90-good60~80-pass0~50-Fail流程控制[1]#include<iostream>usingnamespacestd;voidmain(){intscore;cin>>score;switch(score/10){

case10:case9:cout<<"Verygood!\n";case8:cout<<"Good!\n";case7:case6:cout<<"Pass!\n";case5:cout<<"Fail!\n";default:cout<<"inputerror";break;break;break;break;}}流程控制[1]例:执行下列程序段后,输出结果为:inta=1,b=0;switch(a){case1:switch(b);{case0:cout<<“**0**”;break;case1:cout<<“**1**”;break;}case2:cout<<“**2**”;break;}**0****2**流程控制[1]#include<iostream>usingnamespacestd;voidmain(){intx=1,y=0,a=0,b=0;switch(x){case1:switch(y){case0:a++;break;case1:b++;break;}case2:a++;b++;break;case3:a++;b++;}cout<<a<<b;}a=2,b=1流程控制[1]循环结构while 表达式语句假(0)真(非0)do-while while(表达式)

语句do语句while(表达式);forfor(表达式1;表达式2;表达式3)语句流程控制[1]While语句while(表达式)语句;可以是复合语句,其中常含有改变条件表达式值的语句执行过程:先计算表达式的值,当表达式的值为非0时执行语句;为0时执行循环的后继(退出循环)流程控制[1]说明:循环体可为任意类型语句下列情况,退出while循环条件表达式不成立(为零)循环体内break,return,goto表达式始终为真:while(1)流程控制[1]例1:程序的功能?#include<iostream>usingnamespacestd;voidmain(){intn,sum=0;n=1;while(n<=100)

{sum=sum+n;n++;

}cout<<sum);}条件表达式复合语句例1:求∑n的值。流程控制[1]#include<iostream>usingnamespacestd;voidmain(){intn,sum=0;while(n<=100){sum=sum+n;n++;}cout<<sum;}例1:求∑n的值。n=1;问题:1.语句n=1;能放在循环体内吗?2.若语句n<=100中的等号去掉?3.如要求

1到100的累乘应怎样修改程序?

sum=1;sum=sum*n;

循环体内的语句受循环的控制;在循环体外的语句不受循环的控制。流程控制[1]程序拓展1+1/2+1/3+…+1/100的值。#include<iostream>usingnamespacestd;voidmain(){intn=1;intsum=0;while(n<=100){n++;}cout<<sum;}sum=sum+1/n;floatsum=0;sum=sum+1.0/n;流程控制[1]do-while语句do

语句;while(表达式);可以是复合语句,其中常含有改变条件表达式值的语句执行过程:先执行语句,后判断条件。表达式的值为非0时,继续执行语句;表达式的值为0时,执行循环的后继。流程控制[1]例:i=11,sun=0;do{sun+=i;i++;}while(i<11);例:i=11,sun=0;while(i<11)

{sun+=i;i++;}流程控制[1]while与do-while的比较:do-while和while可相互转化。当while后面的表达式的第一次的值为“真”时,两种循环的结果相同。否则,二者结果不相同(指二者具有相同的循环体的情况)。流程控制[1]求解表达式1表达式2语句求解表达式3下一个语句NT表达式1;while(表达式2){语句;表达式3;}for(表达式1;表达式2;表达式3){循环体}for语句的语法执行一次流程控制[1]注意:1.若省略表达式1,则需在进入循环体之前置初值。for(表达式1;表达式2;表达式3){循环体}for(;表达式2;表达式3){循环体}2.若省略表达式2、表达式3,则在循环体内应有语句能够在一定条件下跳出循环。for(表达式1;;){循环体}3.三个表达式都省略,需用分号分隔,表示表达式2的值为非零。for(;;){循环体}4.表达式1和3可以通过“,”包含一个以上的简单的表达式。for(n=1,sum=0;n<=100;n++){循环体}5.表达式2:关系表达式(i<=100)逻辑表达式(a<b&&x<y)数值表达式;字符表达式

6.for语句后加分号,表示循环体为空语句。流程控制[1]例:用上述三种循环语句求n=1;s=0;while(n<=100){s=s+n;n=n+1;}n=1;s=0;do{s=s+n;n=n+1;}while(n<=100);for(n=1,s=0;n<=100;n++)s=s+n;流程控制[1]例:求下列级数的前m项和.分析:级数的通项为xm/m!,第i项ti与第i-1项ti-1之间存在如下关系: ti=ti-1*x/i|ti|<1e-5当x=1定义变量:i,t,e流程控制[1]inti=1;floatt=1,e=0;while(t>1e-5){e+=t;t=t/i;i++;}第1项inti=1;floatt=1,e=0;for(;t>1e-5;){e+=t;t=t/i;i++;}for(i=1,t=1,e=0;t>1e-5;e+=t,t=t/i,i++);分号不能漏空语句流程控制[1]inti=1;floatt=1,x,e=0;cin>>xwhile(t>1e-5){e+=t;t=t*x/i;i++;}第1项floatx;cin>>x;for(i=1,t=1,e=0;t>1e-5;i++){e+=t,t=t*x/i;}流程控制[1]1.程序分析:该程序的功能是什么?写出输出结果?

#include<iostream>usingnamespacestd;voidmain(){intn;longt=1,s=0;for(n=1;n<=5;n++){t*=n;s+=t;}cout<<s;}流程控制[1]goto语句及用goto构成循环goto语句标号;….…..标号:语句;语句标号:给程序中的某一个语句定义的任意合法的标识符,以冒号和语句之间进行分隔;例:stopcout<<“End”<<endl;用作goto语句转向的目标.gotostop;Goto和语句标号只能用在同一个函数中。流程控制[1]功能:无条件转移语句说明:不能用整数作标号只能出现在goto所在函数内,且唯一只能加在可执行语句前面限制使用goto语句流程控制[1]例:用if和goto语句构成循环,求#include<iostream>usingnamespacestd;voidmain(){inti,sum=0;i=1;loop:if(i<=100){sum+=i;i++;gotoloop;}}标号流程控制[1]循环的嵌套

循环体内包含另一个完整的循环结构。例:打印九九乘法表流程控制[1]#include<iostream>usingnamespacestd;voidmain(){cout<<"\t九九乘法表"<<endl;cout<<"\t-----------"<<endl;for(inti=1;i<=9;i++){for(intj=1;j<=9;j++)

cout<<j<<"×"<<i<<"="<<i*j<<'\t';cout<<endl;}}思考:打印上三角或下三角程序如何改动?流程控制[1]break、continue语句用法break;范围:仅用于在循环体或switch语句中。说明:在switch语句中,执行到break语句时,程序流程转移到switch的后继语句去执行;用于循环语句中,强制终止本层循环,若是多重循环,break只能使流程跳出离break最近的一层。流程控制[1]continue语句功能:在循环体中,当执行到continue语句时,绕过本次循环,强行进入下一次循环。说明:continue语句只能用于循环语句中.continue语句只结束本次循环,而不是终止本层循环的执行;而break语句则是结束本层循环。即它只能跳过循环体中continue后面的语句。流程控制[1]【例】break和continue语句的区别

for(m=20;m>0;m--){if(m%6==0)

break;cout<<m<<"";}for(m=20;m>0;m--){if(m%6==0)

continue;cout<<m<<"";}该语句在循环中执行了几次?流程控制[1]例1:若定义inti,a,k,s;不是死循环的是哪些?a)for(i=1;;i++){if(i=-10)break;s=s+i;}b)k=0;do{k++;}while(k>0);流程控制[1]c)i=0;while(1){i++;if(i==20)break;}d)a=1;while(a<10){if(a<5)continue;a++;}流程控制[1]应用举例例:从键盘输入一组数,求这组数中的最大值。cin>>m;max=m;//第一个数假设为最大数while(cin>>m,m!=0)if(m>max)max=m;以输入0作为结束,输入数的个数未知max=0;//设一个较小的数为最大值的初值for(inti=0;i<10;i++){cin>>m;if(m>max)max=m;}流程控制[1]例:用辗转相除法求两自然数的最大公约数。算法思想:(1)对于已知两数m,n,使得m>n(2)m除以n得余数r(3)若r=0,则n为最大公约数,结束;否则执行(4)(4)mçn,nçr,再重复执行(2)辗转相除法while((r=m%n)!=0){m=n;n=r;}cout<<n;辗转相减法m=m-nm>nn=n-mn>m

m、n为公约数m=nwhile(m!=n)

if(m>n)m-=n;elsen-=m;mnr1252521210流程控制[1]#include"iostream.h"voidmain() {intm,n,t,r;cout<<"请输入mn"<<endl;cin>>m>>n;if(m<n){t=m;m=n;n=t;} while((r=m%n)!=0){ m=n; n=r;}cout<<"最大公约数为"<<n<<endl;}程序:流程控制[1]例3-8:求π的近似值#include<iostream>#include<cmath>usingnamespacestd;intmain(){ ints=1; doublen=1.0,u=1.0,pi=0.0; while(fabs(u)>=1.0e-4) { pi=pi+u; //累加通项 n=n+2; s=-s; //符号位的生成 u=s/n; //通项 } cout<<"pi="<<4*pi<<endl; return0;}流程控制[1]例:求2~100之间的素数,并以每行显示8个质数。(2)每行显示8个:对求得的质数计数,满8个换行。(1)方法:用i=2,3,…,m-1逐个判别m能否被i整除,能整除,m不是素数,退出循环;若都不能整除,则m是素数。可进一步证明:若m不能被中任一整数整除,则m为质数。

........for(i=2;i<=m-1;i++)if(m%i==0)break;If(i==m&&m!=2)................k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i>k)......流程控制[1]#include<iostream>usingnamespacestd;voidmain(){intm,i,countm(0);booltag;for(m=2;m<=100;m++)

{

tag=true;//tag初值为true for(i=2;i<=m-1;i++)

if(m%i==0)tag=false;

if(tag==true)

{cout<<m<<'\t';

countm++;

if(countm%8==0)cout<<endl;

}

}}外循环认为每个数都是素数{tag=false,break;}流程控制[1]例:百元买百鸡问题。假定小鸡每只5角,公鸡每只2元,母鸡每只3元。现有100元钱要买100只鸡,列出所有可能的购鸡方案。分析:for(x=0;x<33;x++)for(y=0;y<50;y++)for(z=0;z<200;z++)if(((3*x+2*y+0.5*z)==100)&&((x+y+z)==100))cout<<“x=“<<x<<“,y=“<<y<<“,z=“<<z<<endl;流程控制[1]例:读入一系列整数,统计出正整数个数i和负整数个数j,读入0则结束。分析:要判断数的正负并分别进行统计,需在循环内部嵌入选择结构。需读入一系列整数,但整数个数不定,要在每次读入之后进行判断,故用while循环。循环控制条件应该是n!=0。流程控制[1]#include<iostream>usingnamespacestd;voidmain(){inti=0,j=0,n;cout<<"请输入若干整数(输入0则结束):";cin>>n;while(n!=0){if(n>0)i++;if(n<0)j++;cin>>n;}cout<<"正整数个数:"<<i<<"负整数个数:"<<j<<endl;}流程控制[1]空格字母个数以及规律1.外循环控制输出的行数2.内循环中一个循环控制每行输出的空格数目。3.内循环中另一个循环控制每行输出字母输出的个数及规律。4.输完一行换行。流程控制[1]#include<iostream>usingnamespacestd;voidmain(){inti,j,k;charc;}for(i=1;i<=26;i++)换行{}for(j=1;j<=26-i;j++)cout<<'';控制每行输出的空格for(k=1;k<=i;k++){}c='a'+k-1;控制每行输出的字母个数cout<<c<<'';

cout<<'\n';流程控制[1]例:打印出如下图案(菱形)

1.前5行一个规律,后4行一个规律,利用双重for循环,第一层控制行,第二层控制列。*****************************************程序分析:空格和“*”流程控制[1]#include<iostream>usingnamespacestd;voidmain(){}inti,j,k;*****************************************for(i=1;i<=5;i++){}for(j=1;j<=5-i;j++)cout<<‘‘;控制空格输出for(k=1;k<=2*i-1;k++)cout<<‘*‘;控制“*”输出cout<<endl;流程控制[1]for(i=1;i<=4;i++){for(j=1;j<=i;j++)cout<<’’;for(k=1;k<=9-2*i;k++)cout<<‘*’;cout<<endl;}}*****************************************扩展到n行菱形图案?流程控制[1]#include<iostream>usingnamespacestd;voidmain(){}inti,j,k;*****************************************for(i=1;i<=5;i++){}for(j=1;j<=5-i;j++)cout<<‘‘;for(k=1;k<=2*i-1;k++)cout<<‘*‘;cout<<endl;intn;cin>>n;if(n%2){}i<=(n+1)/2;j<=(n+1)/2-i;流程控制[1]for(i=1;i<=4;i++){for(j=1;j<=i;j++)cout<<’’;for(k=1;k<=9-2*i;k++)cout<<‘*’;cout<<endl;}}*****************************************i<=n/2;k<=n-2*i;流程控制[1]例:著名意大利数学家斐波那契(Fibonacci)1202年提出一个有趣的问题。某人想知道一年内一对兔子可以生几对兔子。他筑了一道围墙,把一对大兔关在其中。一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?

用循环该如何实现呢?流程控制[1]分析:▲表示大兔,△表示小兔1月2月3月4月5月6月7月11235813流程控制[1]#include<iostream>usingnamespacestd;voidmain(){}inta,b,c,i;for(i=3;i<=12;i++){}c=a+b;a=b;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论