《【教学课件】第四章程序的控制结构.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第四章程序的控制结构.ppt(109页珍藏版)》请在三一办公上搜索。
1、第四章 程序的控制结构,4.1 顺序结构4.2 选择结构4.3 循环结构4.4 结构化程序设计,算法计算方法 解决问题的方法和步骤,例:用辗转相除法求两个正整数的最大公因子1输入m和n2若mn,则交换m和n3m除以n,余数为r4若r=0,则n为最大公因子,输出n,否则执行55m=n,n=r,转3,算法特征:有穷性、确定性、有效性、输入、输出,算法的描述方法:自然语言流程图NS图伪代码,用辗转相除法求两个正整数的最大公因子input m,n;if mn m=n;loop:r=m mod n;if r=0 output n;m=n;n=r;goto loop;,描述算法的三种基本结构:顺序结构 选
2、择结构 循环结构,A1,A2,A3,A1,A2,A3,BC,BC,B1,B1,B2,B2,CC,CC,C1,C1,流程图,NS图,A1,A2,A3,BC,B1,B2,CC,C1,流程图,三种基本结构的特点 只有一个入口 只有一个出口 每一部分都有机会被执行 不存在死循环,4.1 顺序结构,从键盘任意输入一个三位数,计算并输出它的个位、十位、百位数字,int main()int number;int bit0,bit1,bit2;scanf(%d,开始,输入number,计算个位数bit0,输出各位数字,结束,计算十位数bit1,计算百位数bit2,number%10;number/10%10;
3、number/100;,4.2 选择结构,如果外面下雨了,我就带雨伞,红灯停,绿灯行,如果a除以b余数为0,那么b是a的因子,否则b不是a的因子,公园门票,1.2米以下儿童免票,60岁以上老人免票,其余人全票50元。,下雨了?,带雨伞,如果外面下雨了,我就带雨伞,否,是,红灯,停止前进,继续前进,否,是,红灯停,绿灯行,x=a除以b的余数,x等于0?,b是a的因子,b不是a的因子,判断b是否是a的因子,否,是,1.2米以下儿童或60岁以上老人,票价0元,票价50元,否,是,1.2米以下儿童,票价0元,票价50元,否,是,60岁老人,票价0元,否,是,1.2米以下儿童,票价0元,票价50元,否,
4、是,60岁老人,票价0元,否,是,x是偶数a是介于20到30之间的整数c是数字字符c是字母字符year是闰年(1)能被4整除,但不能被100整除(2)能被400整除t是3位整数,一、逻辑表达式示例,int x,a,year,t;char c;(1)x%2=0或x/2*2=x(2)x20&x=0&c=a&c=A&c99&t1000,已知A、B、C、D、E、F共6人参加比赛A、B至少一人获奖A、B、C至少二人获奖A、E中最多一人获奖?谁获奖了?,有人猜测6人依次获得第一名到第六名。这个猜测只猜对了三人的名次?这6个人的名次?,注意(短路计算):逻辑表达式中并不是所有的逻辑运算符都被执行,a&b&c
5、,a|b|c,讨论:i+|j+|k+i+&j+&k+,二、if语句,流程图 N-S图,if(ab)printf(Its right);,if(表达式)语句,if(a+bc,if(表达式)语句1 else 语句2,if(ab)max=a;else max=b;,if(ab)printf(a比b大);else printf(a比b小);,if(a+bc,编程示例,int main()char ch;ch=getchar();if(ch=A,int main()char ch;ch=getchar();if(ch=A,编程示例,if(ab)t=a;a=b;b=t;,讨论:,if(ab)t=a;a=b
6、;b=t;,if(bc)max=b;min=c;else max=c;min=b;,if(a=0)printf(a equal to zero);else printf(a is not equal to zero);,嵌套的if语句,int main()int x,y;scanf(%d,if(x0)y=1;else if(x=0)y=0;else y=1;,if(x=0)if(x0)y=1;else y=0;else y=-1;,y=-1;if(x=0)if(x0)y=1;else y=0;,y=0;if(x!=0)if(x0)y=1;else y=-1;,if(num500)cost=0.
7、15;else if(num300)cost=0.10;else if(num100)cost=0.075;else if(num50)cost=0.05;else cost=0;,num500,cost=0.15,Y,N,num300,num100,cost=0.05,cost=0.075,cost=0.1,Y,Y,N,cost=0,num50,N,N,Y,if(表达式1)语句1 else if(表达式2)语句2 else if(表达式3)语句3.else if(表达式n)语句n else 语句n+1,e1,s1,Y,N,e2,e3,sn+1,s3,s2,Y,Y,N,if(e1)if(e2)
8、s1 else s2else s3,if(e1)if(e2)s1 else s2else if(e3)s3 else s4,if(e1)if(e2)s1 else if(e3)s2 else s3,没有if 就没有elseelse总是与最近的尚未配对的if结合,找a、b、c的最大值,if(ab)if(ac)max=a;else max=c;else if(bc)max=b;else max=c;,max=a;if(maxb)max=b;if(maxc)max=c;,if(ab,1格式:表达式1?表达式2:表达式32语义:if(表达式1)表达式2 else 表达式3,条件表达式,max=(ab)
9、?a:b;,x=表达式1?表达式2:表达式3,main()char ch;scanf(%c,3优先级:高于赋值运算 低于关系和算术运算4结合方向:从右向左 ab?a:cd?c:d;5结果类型:与表达式2或表达式3相同,三、switch语句,switch(ch)case A:printf(Good!n);break;case B:printf(Good!n);break;case C:printf(Passn);break;case D:printf(Fail!n);break;,ch,Good,Pass,Fail,ch=A,ch=B,ch=D,case,ch=C,switch(ch)csae
10、A:case B:printf(Good!n);break;case C:printf(Passn);break;case D:printf(Fail!n);break;,ch,Good,Pass,Fail,ch=A,ch=B,ch=D,case,ch=C,格式:switch(表达式)case 常量表达式1:语句串1 case 常量表达式2:语句串2 case 常量表达式n:语句串n default:语句串n+1,表达式只能是整型、字符型、枚举类型各常量表达式中不能有相同的值执行完某个分支后,要用break语句终止switch语句的执行不同的常量表达式可以执行相同的语句串,switch(ch)
11、csae A:case B:printf(Good!n);case C:printf(Pass!n);case D:printf(Fail!n);,switch(ch)csae A|B:printf(Good!n);case C:printf(Pass!n);case D:printf(Fail!n);,switch(ch)csae A=ch=B:printf(Good!n);case C:printf(Pass!n);case D:printf(Fail!n);,switch(ch)csae A:case B:printf(Good!n);break;case C:printf(Passn)
12、;break;case D:printf(Fail!n);break;,switch(ch)csae A:case B:printf(Good!n);break;case C:printf(Passn);break;case D:printf(Fail!n);break;,if(ch=A)goto LB;if(ch=B)goto LB;if(ch=C)goto LC;if(ch=D)goto LD;LB:printf(Good!n);LC:printf(Passn);LD:printf(Fail!n);L:,goto L;goto L;goto L;,break语句用来在执行完一个case分支
13、后,终止switch语句的执行。如果某个case分支后没有break语句,程序将不再做比较而执行下一个分支,直到break语句或该复合语句结束。当没有case子句匹配时,就执行default子句。default子句是任选的(可有可无)。若无default子句,此时switch语句就什么动作也没有做。switch语句的功能可以用if-else语句来实现,但某些情况下,使用switch语句更简炼。,int main()int data1,data2;char op;printf(Type number operator numbern);scanf(%d%c%d,求方程的根,int main()f
14、loat a,b,c,p,q,disc;printf(Please enter a,b,c:);scanf(%f,%f,%f,if(fabs(a)=1e-6)printf(has one roots:%6.2fn,-c/b);,else disc=b*b-4*a*c;p=-b/(2*a);q=sqrt(fabs(disc)/(2*a);if(fabs(disc)1e-6)printf(has two unequal real roots:%6.2f and%6.2fn,p+q,p-q);else printf(has complex roots:n);printf(%6.2f+%6.2f in
15、,p,q);printf(%6.2f-%6.2f in,p,q);,公里 折扣=250=500=1000=2000=3000 15%,运费计算,每公里每吨货物的 基本运费为p货物重量为w距离为s 折扣为d总运费为:f=p*w*s*(1-d),输入p、w、s,输出f,s/250,d=0,d=2,d=5,d=8,d=10,d=15,f=p*w*s*(1-d/100.0);,公里 折扣=250=500=1000=2000=3000 15%,0,1,4,2,3,5,6,7,8,9,10,11,=12,int main()int c,s;float p,w,d,f;printf(Input p,w,s:
16、);scanf(%f,%f,%d,switch(c)case 0:d=0;break;case 1:d=2;break;case 2:case 3:d=5;break;case 4:case 5:case 6:case 7:d=8;break;case 8:case 9:case 10:case 11:d=10;break;case 12:d=15;break;,f=p*w*s*(1-d/100.0);printf(freight=%15.4fn,f);return 0;,int main()char choice;printf(n-欢迎点菜-n);/显示菜单 printf(1.西红柿炒鸡蛋n
17、);printf(2.宫爆鸡丁n);printf(3.鱼香肉丝n);printf(0.退出n);printf(请选择(0-3):);choice=getchar();/选择 switch(choice)case 1:printf(西红柿炒鸡蛋1份,请稍后);break;case 2:printf(宫爆鸡丁1份,请稍后);break;case 3:printf(鱼香肉丝1份,请稍后);break;printf(n欢迎光临!n);,4.3循环结构程序设计,往前走,直到到达目标为止,没到?,往前走,Y,N,只要.,计算1+2+3+.+100,sum=1+2;/sum存放和值sum=sum+3;sum
18、=sum+4;.sum=sum+100;,sum=0;/sum存放和值sum=sum+1;sum=sum+2;sum=sum+3;sum=sum+4;.sum=sum+100;,sum=0;/sum存放和值i=1;sum=sum+i;i=i+1;sum=sum+i;i=i+1;sum=sum+i;i=i+1;sum=sum+i;i=i+1;.sum=sum+i;,计算1+2+3+.+100,int i,sum;sum=0;i=1;while(i=100)sum+=i;i+;printf(%d,sum);,计算1+2+3+.+100,int i,sum;sum=0;for(i=1;i=100;i
19、+)sum+=i;printf(%d,sum);,sum=sum+i;,sum=0;,i=1;,i=100,N,Y,输出sum,i+;,计算1+3+5+.+99,计算1-3+5-7.-99,符号s,初始为1;s=-s;,i=100,计算x1+x2+x3+.+x100,i=100,符号s,初始为1;s=-s;,计算1+2+3+.+100,int i,sum;sum=0;i=1;do sum+=i;i+;while(i=100);printf(%d,sum);,实现循环的方式:,whiledo whilefor if goto,循环条件结束条件循环的内容,循环要素:,一、while语句,格式:wh
20、ile(表达式)语句;语义:只要表达式为真 重复执行语句,while语句,循环体,while(表达式)语句;,while语句,int main()int i,sum=0;i=1;while(i=100)sum+=i;i+;printf(%dn,sum);return 0;,循环体,二、do while语句,格式:do 语句串;while(表达式);语义:执行语句串直到表达式为假,do while语句,循环体,do 语句串;while(表达式);,int main()int i=1,sum=0;do sum+=i+;while(i=100);printf(%d,sum);return 0;,do
21、 while语句,循环体,三、for 语句,格式:for(表达式1;表达式2;表达式3)语句语义:表达式1;while(表达式2)语句;表达式3;,for语句,循环体,for(e1;e2;e3)s,sum=0;for(i=1;i=100;i+)sum=sum+i;,for(i=1,sum=0;i=100;sum=sum+i+);,for(i=1,sum=0;i=100;i+)sum=sum+i;,循环体,for(e1;e2;e3)s,for(i=1;i=100;)sum+=i;i+;,表达式e1、e3可以省略,i=1;sum=0;for(;i=100;i+)sum+=i;,省略e2是一个死循环
22、,for(i=1;i+)s相当于i=1;while(1)s;i+;,两类循环的对比,当型循环,直到型循环,循环体执行?次,条件表达式判断?遍,n=3;while(n-)printf(%d,n);printf(%d,n);,格式:goto 语句标号;,标识符,goto语句的作用:(1)与if语句一起构成循环(2)从多重循环中跳转到循环体外,四、goto语句,int main()int i,sum=0;i=1;loop:if(i=100)scanf(%d,goto与if语句构成循环,sum=sum+x;i+;,sum=0;,i=1;,i=100,N,Y,输出sum,要写出一个正确的循环结构,对循环
23、控制变量要做三方面的工作:1、对循环控制变量赋初值。2、将循环控制变量写入正确的控制条件。3、对循环控制变量值的更新。如 x=1;s=0;/*给x赋初值*/while(x10)/*循环条件*/s=s+x;x+;/*对x的值做更新、调整*/,输入全班N个人的分数,求最高分,#include#define N 10int main()int i,max=0,score;printf(input%d score:,N);for(i=0;imax)max=score;printf(max=%dn,max);return 0;,输入全班N个人的分数,求最高分,#define N 10int main()
24、int i,max=0,score;printf(input%d score:,N);i=1;while(imax)max=score;i+;printf(max=%dn,max);return 0;,输入全班N个人的分数,求最高分,#define N 10int main()int i,max=0,score;printf(input%d score:,N);i=1;do scanf(%d,#includeint main()int a,b,c;float s,area;do printf(请输入三角形的三条边长度:);scanf(%d%d%d,int i,j;long sum;sum=0;
25、for(i=1,j=100;i=j;i+,j-)sum+=i+j;printf(sum=%ldn,sum);,讨论:,(1)while(count!=10);count=1;sum=sum+x;count=count+1;,(2)name=10;doname=name+1;printf(ok);while(name=1),五、break与continue语句,break语句(跳出.)用在switch语句或循环语句中跳出switch语句,执行switch后面的语句跳出循环体,执行该循环语句后面的语句,例:for(r=1;r100)break;printf(%f,area);,continue语句
26、(跳过循环的一部分)作用:提前结束本次循环,继续下一次循环,int n;for(n=100;n=200;n+)if(n%3=0)continue;printf(%4d,n);,六、循环程序设计示例,用公式计算 的近似值 直到最后一项的绝对值小于1E-6为止,用pi表示/4的值用sign表示每一项的符号用n表示每项的分母用term表示每项的值,int main()int sign;double n,term,pi;printf(pi=%10.6fn,pi*4);,while(fabs(term)=1e-6)pi=pi+term;n+=2;sign=-sign;term=sign/n;,term=
27、1;pi=0;n=1.0;sign=1;,判断m是否是素数,输入m,判断m是否是素数,输出结果,k=sqrt(m),i=2,i=k,i能被m整除,i+,Y,N,Y,N,ik,Y,N,m不是素数,m是素数,#include int main()int m,i,k;printf(m=);scanf(%d,k=sqrt(m),i=2;flag=1,i=k&flag,i能被m整除,i+,Y,N,Y,N,flag0,Y,N,m不是素数,m是素数,flag=0,#include int main()int m,i,k;int flag=1;printf(m=);scanf(%d,&1=flag,七、循环嵌
28、套,while(e)s;,dos;while(e);,for(e1;e2;e3)s;,for(e1;e2;e3).while(e4)s;,s=0;for(i=0;i10;i+)for(j=0;j10;j+)s+=i*10+j;printf(s=%dn,s);,s=0;for(i=0;i10;i+)for(j=0;j10;j+)s+=i*10+j;,s=0;for(i=0;i10;i+);for(j=0;j10;j+);s+=i*10+j;,区别!,s=0;for(i=0;i10;i+)for(i=0;i10;i+)s+=i*10+i;,s=0;for(i=0;i10;i+)for(i=0;i1
29、0;i+)s+=i*10+i;,#include int main()int m,k,n=0,i;printf(n);return 0;,求100至200间的全部素数,k=sqrt(m);for(i=2;ik)printf(%d,m);,for(m=101;m200;m+=2),n+;if(n%10=0)printf(n);,一种运用循环的算法-枚举,对问题的所有可能一一测试,直到找出解或将全部状态测试过为止。,有男人、女人、小孩共30人,在一家饭馆里吃饭共花了50元,每个男人花3元,每个女人花2元,每个小孩花1元。问男人、女人、小孩各有多少人?,men的值:0-16women的值:0-25c
30、hildren的值:30-men-women,int main()int men,women,children;for(men=0;men=16;men+)for(women=0;women=25;women+)children=30-men-women;if(men*3+women*2+children=50)printf(men=%d,women=%dn,men,women);printf(children=%dn,children);,一种运用循环的算法-迭代,不断用新值取代变量的旧值或由旧值递推出变量的新值的过程,有一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每
31、个月又生一对兔子。假设所有的兔子都不死,问每个月的兔子总数是多少?,设不满1个月的为小兔子 满1个月不满2个月的为中兔子 满3个月以上的为老兔子,1 1 0 0 12 0 1 0 13 1 0 1 24 1 1 1 35 2 1 2 5 6 3 2 3 87 5 3 5 13,第几个月 小兔子对数 中兔子对数 老兔子对数兔子总数,1 1 0 0 12 0 1 0 13 1 0 1 24 1 1 1 35 2 1 2 5 6 3 2 3 87 5 3 5 13,第i月的小兔子,第i月的中兔子,第i月的老兔子,第i+1月的小兔子,第i+1月的中兔子,第i+1月的老兔子,第i+2月的小兔子,第i+2
32、月的中兔子,第i+2月的老兔子,设:f1表示第i月的兔子数,f2表示第i+1月的兔子数f表示第i+2月的兔子数,f1=1,i=1,f2=1,f1=1,i=2,f2=2,f=f1+f2,f=f1+f2,f1=2,i=3,f2=3,f=f1+f2,int main()int f1=1,f2=1,f;int i;printf(%12d%12d,f1,f2);for(i=3;i=40;i+)f=f1+f2;printf(%l2d,f);if(i%4=0)printf(n);f1=f2;f2=f;return 0;,m=55 n=15 r=m%n=10,用辗转相除法求两个正整数的最大公因子1输入m和n2
33、若mn,则交换m和n3m除以n,余数为r4若r=0,则n为最大公因子,输出n,否则执行55nm,rn,转3,m=15 n=10 r=m%n=5,m=10 n=5 r=m%n=0,m=5 n=0(终止),Y,N,Y,N,输入m和n,mn,交换m和n,Y,N,r=m%n,r!=0,m=n;n=r,r=m%n,输出n,int main()int m,n,r;scanf(%d,%d,char choice;printf(n-欢迎点菜-n);/显示菜单 do printf(1.西红柿炒鸡蛋n);printf(2.宫爆鸡丁n);printf(3.鱼香肉丝n);printf(0.退出n);printf(请选
34、择(0-3):);choice=getchar();getchar();/选择 switch(choice)case 1:printf(西红柿炒鸡蛋1份,请稍后n);break;case 2:printf(宫爆鸡丁1份,请稍后n);break;case 3:printf(鱼香肉丝1份,请稍后n);break;while(choice!=0);printf(n欢迎光临!n);,4.4 结构化程序设计方法,1966年,C.Bohm和G.Jacopini首先证明了:只用顺序、选择、循环三种基本的控制结构就能实现任何单入口、单出口的程序给结构化程序设计奠定了基础,结构化程序设计是一种进行程序设计的原则
35、和方法,避免使用goto语句采用自顶向下、逐步求精方法进行程序设计程序的特点:结构清晰 容易阅读 容易修改 容易验证,采用顺序、选择、循环三种基本的控制结构采用自顶向下、逐步求精、模块化方法进行程序设计,结构化程序设计思想:,输入m和n,mn,交换m和n,Y,N,r=m%n,r!=0,m=n;n=r,r=m%n,输出n,找出1000之内的所有完数(除自身之外的所有真因子之和等于它本身),计算a的所有因子之和sum,如果a=sum输出它的所有因子,for(a=2;a1000;a+),sum=0;,for(i=1;i=a/2;i+),a%i=0,sum+=i;,printf(%5d,i);,a=sum,for(i=1;i=a/2;i+),a%i=0,y,y,N,N,N,y,程序中的错误,词法或语法错误链接错误语义错误,int main()int a,b,t,c;scanf(%d%d,a,b);if(ab)t=a;a=b;b=t;else c=a;print(%d,c);return 0;,newfile12.c:7:error:syntax error before else,undefined reference to print,
链接地址:https://www.31ppt.com/p-5665204.html