资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第四章,语句、程序控制结构(顺序、选择、循环),4.1,C,语句总述,C,语句一般以分号“,;,”,为结束标志,可分为以下六类:,1.,表达式语句,表达式语句由表达式加上分号“,;”,组成。如:,x*=8;/*,赋值表达式语句*,/,a=5,b=7,c=16;/*,逗号表达式语句*,/,xy?x:y;/*,条件表达式语句*,/,-,a&+b&+c,;/*,逻辑表达式语句*,/,i+;/*,算术表达式语句*,/,2.,说明语句,变量定义语句和函数说明语句统称说明语句。如:,int,a,b,*p,i=0;,float add(float,float);/*,函数说明语句*,/,3.,空语句,只有分号“,;,”,组成的语句称为空语句。空语句是,什么也不执行的语句。,在程序中空语句可用来作空循环体或转向点。,如:,while(getchar,()!=n),;,本语句的功能是,只要从键盘输入的字符不是回,车则重新输入,4.,复合语句,把多个语句用括号,括起来组成的一个语句称为复合语句。,在程序中应把复合语句看成是单条语句,,而不是,多条语句。,如:,t=x;,x=y;,y=t;,5.,函数调用语句,*,由函数名、实际参数加上分号“,;,”,组成。如:,printf(C,Program);,6.,控制语句,控制语句用于控制程序的流程,以实现程序的各种结构方式。它们由特定的语句定义符组成。,语言有九种控制语句,可分成以下三类:,条件判断语句:,if,语句、,switch,语句;,循环执行语句:,do while,语句、,while,语句、,for,语句;,转向语句:,break,语句、,continue,语句、,goto,语句、,return,语句。,4.2,顺序结构,C,语言中的顺序结构主要由说明语句、表达式语句、空语句以及复合语句组成。在顺序结构程序中,各语句(或命令)是,按照位置的先后次序顺序执行的,,且每个语句都会被执行到。,例:输入两个整数,编程完成两数的交换。,main(),int,a,b,t;,scanf(%d,%d,t=a;,a=b;,b=t;,printf(%d,%d,a,b);,main(),int,a,b;,scanf(%d,%d,a=a+b;,b=a-b;,a=a-b;,printf(%d,%dn,a,b);,4.3,选择结构,它所要解决的问题是根据“条件”判断的结果决定程序执行的流向,因此该结构也被称为判断结构。,程序执行的流向是根据条件表达式的值是“,0”,还是非“,0”,来决定,(,流程,),。,设计选择结构程序,需要考虑两个方面的问题:一是在,C,语言中如何来表示条件(条件表达式),二是在,C,语言中实现选择结构用什么语句(,if/switch,结构)。,简单,if,语句,if-else,语句,if-else if-else,语句,switch,语句,A,块,B,块,P,0(,假,),非,0(,真,),3.1,简单,if,语句,语法形式:,if(,表达式),语句,其中,表达式,是决定程序流向的条件,语句,可以是单语句或复合语句,语句,表达式,假,真,if,语句示例,例,1,:输入任意三个整数,a,、,b,、,c,,求三个数中的最大值,(,例,4.2),main(),/*,注意三段式编程思想,*,/,int,a,b,c,max;,printf(Please,input three numbers:);,scanf(“%d,%d,%d,”,/*,输入数据语句,*,/,max=a;,if(ba)max=b;,if(cmax)max=c;,/*,算法处理部分,*,/,printf(“max,=%dn”,max);/*,输出结果语句,*,/,*例,2,:输入,x,y,两整数,按小到大顺序输出。,main(),int,x,y,t;,scanf,(“%d,%d”,&x,&y,);/*,输入*,/,if (x y),t=x;x=y;y=t;,/*,算法处理*,/,printf,(“%d,%,dn,”,x,y);,/*,输出*,/,运行结果,输入:,4,1,输出:,1,4,3.2 if-else,语句,语法,if(,表达式,),语句,1,else,语句,2,语句,1,表达式,假,真,语句,2,if-else,语句示例,例,1.,输入一个整数,输出该整数的绝对值,main(),int,n;,scanf(%d,if(n=0),printf(%d,n);,else,printf(%d,-n);,printf(“%d”,n,=0?n:-n);,*,例,2.,用,if-else,语句求输入的三个整数中的最大数,main(),int,a,b,c,max;,scanf(“%d%d%d,”,max=a;,if(cb),if(ca),max=c;,else,if(ba),max=b;,printf,(max=%dn,max);,max=b,F,输出,max,max=c,输入,a,b,c,max=a,ca,cb,T,T,T,F,ba,F,3.3,系列,if,语句,if(,条件,1),语句,1,else if(,条件,2),语句,2,else if(,条件,3),语句,3,else if(,条件,n,),语句,n,else,语句,n+1,其中最后一个,else,在,无语句,n+1,时,可以省略,系列,if,结构流程图,条件,1,条件,2,语句,1,语句,2,语句,n,语句,n+1,条件,n,T,F,F,T,F,T,系列,if,结构示例,例,1.,用,else if,结构求解一元二次方程,ax,2,+bx+c=0,的 根,系数,a,、,b,、,c,的值从键盘输入。见,98,页 例,4.4,),p=(b*b-4*a*c),;,real=-b/(2*a),imag,=sqrt(fabs(p)/(2*a),输出,2,复根,realimag,i,输入,a,b,c,输出根,-c/b,a!=0,T,T,T,F,F,a=0&b!=0,p=0,p0,F,F,T,非法或无意义,输出,2,实根,realimag,输出根,-b/(2*a),求一元,二次方程流程图,例,2,:从键盘输入成绩,score,,,编程要求能有如下输出:,s,core,60,,,输出,E,;,60,s,core,70,,,输出,D,;,70,s,core,80,,,输出,C,;,80,s,core,90,,,输出,B,;,90,s,core,,,输出,A,。,main(),int,score;,printf,(Enter a score:n);,scanf,(%d,if(score60),printf(“E,);,else if(score 70),printf(D,);,else if(score 80),printf,(C);,else if(score y),z=x;x=y;y=z;,2.if,结构与,+,、,-,的综合应用时遵循原来的自增自减运算符的应用规则,例:下面程序运行后结果是?,main(),int,m=5;,if(m+5),printf(“%dn”,m,);,else,printf(“%dn”,m,-);,3 if,结构可以嵌套使用,当有众多的,if,和,else,时,,else,必须和,if,配对使用,且,else,总是跟它上面最近的,if,配对,例:下面这段程序执行后,,x,的值为,?,main(),int,a=1,b=3,c=5,d=4,x;,if(ab),,,则,x=?*/,if(c,d)x=1;,else,if(a,c),if(b,d)x=2;,else x=3;,else x=6;,else x=7;,printf(x,=%d,x);,注意:在,if-else,的嵌套结构中,,else,总是与它上面最,近的,if,配对,if(ab)x=7,3.4 switch,语句,switch,结构,是多分支选择结构,根据表达式值的,不同,程序转入不同的模块执行,switch,结构的语法形式,switch(,表达式,),case,常量表达式,1:,语句,1;,case,常量表达式,2:,语句,2;,case,常量表达式,n,:,语句,n;,default:,语句,n+1;,不带,break,语句,switch,结构图,e=e1,e=e2,e=e3,e=en,语句,1,语句,2,语句,3,语句,n,语句,n+1,T,T,T,T,F,F,F,F,default,其中:,e,为表达式,e1,、,e2en,为常量表达式,1,、,2n,带,break,语句的,switch,结构,实际使用时,一般要使程序在执行一个,case,语句,后退出,switch,结构,可用,break,语句将上述,switch,结构改成:,switch(,表达式,),case,常量表达式,1:,语句,1;,break;,case,常量表达式,2:,语句,2;,break;,case,常量表达式,n,:,语句,n;,break;,default:,语句,n+1;,e=e1,e=e2,e=e3,e=en,语句,1,语句,2,语句,3,语句,n,语句,n+1,T,T,T,T,F,F,F,F,default,其中:,e,为表达式,e1,、,e2en,为常量表达式,1,、,2n,例,4.6,用,switch,结构编写可处理四则运算的程序,main(),float v1,v2;,char operator;,printf(Please,type your expression:n);,scanf(%f%c%f,switch(operator),case+:printf(v1+v2=%.2fn,v1+v2);,break;,case-:printf(v1-v2=%.2fn,v1-v2);,break;,case*:printf(v1*v2=%.2fn,v1*v2);,break;,case/:if(v2=0),printf(division,by zero.n);,else,printf(v1/v2=%.2fn,v1/v2);,break;,default:,printf(unknown,operator.n);,switch,使用说明,每个,case,后面的,常量表达式,的值必须互不相同,以免程序执行的流程产生矛盾,switch,后面括号内的表达式,,可以是整型或字符型表达式,或,枚举型,数据,加上,break,语句可以使程序执行某一分支后直接退出,switch,结构,多个,case,语句可以共用一组执行语句,如,:case 4:,case 5:,case 6:,case 7:d=8;break;,switch与if-else if-else,改写用,if-else if,语句写成的程序,:,从键盘输入成绩,score,,,编程要求能有如下输出:,s,core,60,,,输出,E,;,60,s,core,70,,,输出,D,;,70,s,core,80,,,输出,C,;,80,s,core,c&a+cb&b+ca,判断是否,等边,三角形:,a=b&b=c,判断是否,等腰,三角形:,a=b|b=c|c=a,判断是否,直角,三角形:,(a*,a+b,*b=c*c)|,(a*,a+c,*c=b*b)|(b*,b+c,*c=a*a),main(),int,a,b,c,;,printf(nPlease,input a,b,c:);,scanf(%d%d%d,&a,&b,&c,);,if(a+bc&a+cb&b+ca),if(a,=b&b=c),printf(equilateral,trianglen);,else if(a=b|b=c|c=a),printf(isoceles,trianglen);,else if(a*,a+b,*b=c*c)|(a*,a+c,*c=b*,b)|(b,*,b+c,*c=a*a),printf(right,-angled trianglen);,else,printf(arbitrary,trianglen);,else,printf(“It,isnt triangle.n”);/*,构不成三角形*,/,在构成三角形的,前提,下,四种三角形的类型判断选择语句,选择结构复习,-,读程题,#include,main(),int,a=0,b=0,c=0,x=0;,if(!a,)b-;,else,if(b,),if(!c,)x=3;,else x=4;,printf,(“x=%,dn,”,x);,#include,main(),int,x=1,y=0,a=0,b=0;,switch(x,),case 1:,switch(y,),case 0:a+;break;,case 1:b+;break;,case 2:,a+;b+;,break;,printf,(“a=%d,b=%,dn,”,a,b);,a=2,b=1,4.4,循环结构,4.4.1 while,循环结构,4.4.2 do-while,循环结构,4.4.3 for,循环结构,4.4.4,无条件控制语句,break,continue,goto,4.4.7,多重循环,4.4.8,应用举例,概述,循环结构,根据循环,条件,决定是否要重复执行某一模块(循环体)。,C,语言中主要提供三种循环语句:,while,语句,do-while,语句,for,语句,4.4.1,while,语句,一般形式,执行流程,while (,表达式,),语句,也称语句为循环体,while,循环结构,是一种当型循环结构,语 句,表达式,0(,假,),非,0(,真,),例,4.8,用,while,循环写一个程序统计从键盘输入的数字字符出现的次数并把其中的数字字符依次输出。,#include,stdio.h,main(),/*,只统计数字字符出现的次数*,/,char c;,int,nd,=0;,while(c,=,getchar,()!=n),if(c,=0&c=0&c=0&c=9),nl,+;,printf(nThere,are%d numbers!,n,nd,);,printf(nThere,are%d characters!,n,nl,);,从键盘输入,n,,计算累加和、阶乘,n!,计算,1+2+n,main(),int,n,sum,=0,i=1;,scanf(“%d”,&n,);,while(i,=n),sum=,sum+i,;,i+;,printf(“sum,=%d”,sum);,计算,n!,main(),long,fa,=1,i=1,n;,scanf,(,“,%ld,”,&n,);,while(i,=n),fa,=,fa,*i;,i+;,printf(“%ld,!=%,ld,”,n,fa,);,*例,2,:已知,s=1!+2!+3!+,+n!,求当s首次超过,2,000,000,时的,n,和,s,的值,main(),int,n=0;,long s=0,an=1;,while(s2000000),n+;,an=an*n;,s=s+an;,for(n,=1;s=1.e-4);,printf(exp(x,)=%fn,s);,4.4.3 for,循环语句,一般形式,for,(,表达式,1,;表达式,2,;表达式,3,),语句,(循环体),其中:,表达式,1,-,初始化表达式。可用来设定循环控制变,量或循环体中变量的初始值,可以是,逗号表达式,。,表达式,2,-,循环条件表达式。其值为逻辑量,为非,0,时继续循环,为,0,时循环终止,表达式,3,-,增量表达式。用来对循环控制变量进行,修正,也可用,逗号表达式,包含一些本来可放在循环,体中执行的其他表达式,上述表达式可以缺省,但分号不可缺少,执行过程,求解表达式,1,求解表达式,3,语 句,表达式,2,T,F,例,4.11,用,for,语句写程序在屏幕上依次输出,26,个字母,输出形式,:a-b-c-d-y-z,*,例,1:,求,s=sin1+sin2+.+sin50,#include math.h,main(),/*,用数学函数加上面的包含文件*,/,int,n;,float s;,for(s=0.,n=1;n=50;n+),s+=,sin,(n);,printf,(s=%fn,s);,s=,s+sin(n,),s=0,n=1,n+,n=50,T,F,例,1,:,写出下列程序的输出结果,main(),int,i,s=0,t=0;,for(i=1;i10;i+),/*,选择结构作循环体*,/,switch(i6),case 0:t+=i;break;,case 1:s+=i;break;,printf,(t=%d,s=%dn;t,s);,结果:,t=30,s=15,无条件控制语句,4.4.4,break,语句,4.4.5 continue,语句,4.4.6,goto,语句,4.4.4,break,语句,形式:,break;,作用:跳出循环体,提前结束循环,无条件转移到,循环结构的下一句继续执行。,使用场合:只能用在,switch,结构和循环结构中。,【,例,4.13】,写一个程序求整数,m,是否是素数。,一个只能被,1,和自己整除的数称为素数。决定一个数,m,是否是素数,只要让,m,被,2,除到被,m,除就可以,如果不能被,2,到,m,中的任何一个数整除,就定,m,为素数,#include,stdio.h,main(),int,m,i;,scanf(%d,&m,);,for(i=2;im;i+),if(m%i=0)break;,if(i=m),printf(%d,is a prime number.n,m);,else,printf(%d,is not a prime number.n,m);,例:,阅读如下程序,写出运行结果,main(),int,i,s=0;,for(i=1;i10),break,;,printf(i,=%d,s=%dn,i,s);,结果:,i=3,s=14,4.4.5 continue,语句,形式:,continue;,作用:,用来结束本次循环(即跳出循环体中尚未,执行的语句)直接进行循环条件的判断,使用场合:,用于循环结构中,。,【,例,4.14】,写程序从键盘读入分数,计算有效分数的总分、平均分、最高分、最低分。,main(),float score,min=100,max=0,total=0,avg;,int,n=0;,printf(Please,input first score:);,while(scanf(“%f”,&score,)=1)/*,利用输入函数的返回值作条件*,/,if(score100)continue,;,n+;,min=(scoremax)?score:max;,total=,total+score,;,printf(please,input next score:);,;,if(n0),avg,=total/n;printf(Max:%.1f,Min:%.1f,Total:%.1f,Average:%.1fn,max,min,total,avg);,例,1,:阅读如下程序,写出运行结果,main(),int,i,s=0,n=0;,for(i=1;i10;i+),if(i%2=0|i%3=0),continue,;,n+;s+=i;,printf(n,=%d,s=%dn,n,s);,结果:,n=3,s=13,*,4.4.6,goto,语句,形式:,goto,语句标号,;,其中语句标号用标识符表示。,与,goto,语句相对应,程序中必有一个带语,句标号的语句,形式为:,语句标号:语句,作用:程序无条件地转移到具有该语句标号的语,句上继续执行。,说明:,goto,语句不是一个必要的语句;,与,if,结构配合构成条件转移或循环。,【,例,4.15】,求,1,100,间的奇数和,即求,1+3+5+,+99,main(),int,i=1,sum=0;,loop:,sum=sum+i;,i=i+2;,if(i100),goto,loop;,printf(sum,=%dn,sum);,运行结果:,sum=2500,for(i=1;i100;sum+=i,i+=2);,4.4.7,多重,(,嵌套,),循环,在,循环体内又包含另一个或多个完整的循环结构,称为多重循环。,要点:,三种循环语句可以相互改写、相互嵌套,但不允许交叉,break,语句用于多重循环中,是从语句所在的循环跳转到上一层循环,continue,处于多重循环时,仅仅影响包含它的循环结构执行体执行的次数。,三种循环结构的等价关系,int,s=0,i=1;,while,(i,=100),s=,s+i,;,i=i+1;,int,s=0,i;,for,(i,=1;i=100;i+),s=,s+i,;,int,s=0,i=1;,do,s=,s+i,;,i=i+1;,while,(i,=100);,以下三种结构都可以计算数学式子,:1+2+3+100,例,1,:打印阶梯状九九乘法表,#include,stdio.h,main(),int,i,j;,for(i=1;i=9;i+),for(j=1;j=i;j+),printf(%d,*%d=%-4d,i,j,i*j);,printf(n,);,嵌套循环举例,例,2,:,写出下列程序的输出结果,#,include“,stdio.h,”,main(),int,n,a,x;char cc=#;,scanf(%d,/*n=4*/,for,(x=0;x0;a,-,),putchar(cc,);,for,(a=0;a1),a=2*(a+1);,i-;,printf(a,=%dn,a);,运行结果:,a=1534,main(),/*,用,for,循环*,/,int,i,a;,for(i=10,a=1;i1;i-),a=2*(a+1);,printf(a,=%dn,a);,【*,2,】,有一头母牛每年年初生一头小母牛,每头小母牛从第,4,个年头起,每年年初也生一头小母牛。求在第,20,年时,共有多少头牛。这是个“,顺推,”问题。,设:第,n,年时的母牛数为,Y,n,,,则:,Y,1,2,,,Y,2,3,,,Y,3,4,,,Y,4,Y,3,+Y,1,,,Y,5,Y,4,+Y,2,,,可得到,当,n4,时有:,Y,n,Y,n-1,+,Y,n-3,已知:,Y,1,2,,,Y,2,3,,,Y,3,4,main(),int,i,y1,y2,y3,y4;,y1=2;y2;=3;y3=4;/*,即,y,1,=2,y,2,=3,y,3,=4*/,for(i=4;i=20;i+),y4=y3+y1;/*,即,y,n,=,y,n-1,+,y,n-3,*/,y1=y2;y2=y3;y3=y4;,printf(,20 years of cow total amount is%dn,y4);,结果:,20 years of cow total amount is 2745,3,【,例,4.20】,求两整数的最大公约数和最小公倍数。,求最大公约数算法,:,有两整数,a,和,b,:,a%b,得余数,c,若,c=0,,则,b,即为两数的最大公约数,若,c0,,则,a=b,,,b=c,,,再回去执行,例如求,27,和,15,的最大公约数过程为:,2715,余,12 1512,余,3 123,余,0,因此,,3,即为最大公约数,求最小公倍数算法:,最小公倍数,=,两整数的乘积,最大公约数,main(),int,m,n,a,b,t,c;,prinf(Input,two integer numbers:n);,scanf(%d%d,m=a;n=b;,c=a%b;,while(c!=0)a=b;b=c;c=a%b;,printf(The,largest common divisor:%dn,b);,printf(The,least common multiple:%dn,m*n/b);,while(b,!=0),c=a%b;a=b;b=c;,b=a;,4,【,例,4.17】,百钱百鸡问题。公鸡,5,文钱,1,只,母鸡,3,文钱,1,只,小鸡一文钱,3,只。,100,文钱如何买,100,只鸡,?,分析:设买,x,只公鸡,,y,只母鸡,,z,只小鸡,则有:,x+y+z=100,5x+3y+z/3=100,隐含条件,:x,、,y,、,z,都是整数;,x20,;,y33,。,用,穷举法,,即把,x,、,y,、,x,所有可能的各种组合都一,一判断是否符合上述不定方程组,具体是:,把,x,可能值,020,和,y,可能值,033,用二重循环来组合,每个,x,和,y,组合都可得到,z,值,即,z=100-x-y,,若,x,、,y,、,z,值使,5x+3y+z/3=100,成立,则该组,x,、,y,、,z,即为一 组所求值。,main(),int,x,y,z,j=1;,printf(Possible,solutions to buy 100 fowls,whith,100,wen:n,);,for(x=0;x=20;x+),for(y=0;y=33;y+),z=100-x-y;,if(z%3=0&5*x+3*y+z/3=100),printf(%2d:cock=%-2d hen=%-2d,chicken=%-2dn,j,x,y,z);,j+;,运行结果:,Possible solutions to buy 100 fowls,whith,100,wen,:,1:cock=0 hen=25 chicken=75,2:cock=4 hen=18 chicken=78,3:cock=8 hen=11 chicken=81,4:cock=12 hen=4 chicken=84,5*,:打印出所有的,“,水仙花数,”,。所谓,“,水仙花,数,”,是指一个三位正整数,其各位数字的立方和,等于该数本身,例如:,153=1,3,+5,3,+3,3,。,分析:可用,穷举法,,即把所有的三位正整数,100999,按 题意一一进行判断,如果一个三位正整数,n,的百位、十位、个位上的数字分别为,i,、,j,、,k,,,则判断式为:,n=i,3,+j,3,+k,3,如何分解三位数,n,的百位、十位、个位:,百位:,i=n/100%10;,十位:,j=(n/10)%10;,个位:,k=n%10;,#include,stdio.h,main(),int,n,i,j,k;,for(,n=100;n=999;n+,),i=n/100;,j=(n/10)%10;,k=n%10;,if(n=i*i*i+j*j*j+k*k*k),printf(%d,=%d3+%d3+%d3n,n,i,j,k);,运行结果:,153,13+53+33,370,33+73+03,371,33+73+13,407,43+03+73,6,:,利用循环结构打印图形,,写程序输入行数,n,,并打印下面的图形,*,*,*,*,main(),int,n,i,k,;,scanf(%d,&n,);,for(i,=0;i,n;i,+),for(k,=0;k=,i;k,+),printf,(*);,printf(n,);,课后复习关键字,语句,选择结构,if,if-else,if-else if-else,switch,循环结构,while,do-while,for,break,continue,算法,求最大公约数、素数判断、完数判断、打印图形等,本章结束,
展开阅读全文