版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章程序控制结构Chapter3ControlFlow第三章程序控制结构Chapter3Control1程序的三种控制结构
结构化程序设计是软件设计的第三次革命。结构化程序设计的基础是采用三种程序的控制结构。1966年BÖHM&Jacopini证明:只要三种控制结构就能表达用一个入口和一个出口框图所能表达的任何程序逻辑。三种控制结构如下:⒈顺序结构Sequence算法描述:f;g;框图:f;g;⒉选择结构Selection(分支结构)算法描述:if(e)f;elseg;框图:e?yesf;nog;程序的三种控制结构结构化程序设计是软件设计的2⒊循环结构Repetition⑴当型循环whilecistruedofc?fYESNO⑵直到循环dofuntilcisfalsefc?YESNO三种控制结构有如下共同的特点:一个入口和一个出口;无死语句;无死循环。如何构造条件?⒊循环结构Repetition⑴当型循环whilecis3⒋复合语句
概念:C语言可以用{}包括一系列的语句。一对{}所包含的内容称为一个复合语句。其中可以含有0到多条C语言语句。#include<stdio.h>voidmain(void)
{inta,b;scanf(“%d,%d”,&a,&b);
{inttemp;
temp=a;a=b;b=temp;
}printf(“%d,%d”,a,b);}复合语句复合语句复合语句可以嵌套凡是可以出现单一语句的地方都可以使用复合语句。复合语句的作用:⒈作为分支和循环的块。⒉作为标识符的作用域。交换算法演示⒋复合语句概念:C语言可以用{}包括4顺序结构程序设计顺序结构的程序是指程序的语句中不含任何转移语句,程序的执行流程完全按照语句在程序中的顺序执行。如:求sin30o+sin60o+cos30o+cos60o #include<>#include<>voidmain(void){floats,a,b;a=30*3.14159/180;a=60*3.14159/180;s=sin(a)+sin(b)+cos(a)+cos(b);printf(“s=%f\n”,s); }顺序结构程序设计顺序结构的程序是指程序的语句中5问题#include<stdio.h>#include<math.h>voidmain(void){floata,b,c,x1,x2;scanf(“%f,%f,%f”,&a,&b,&c);x1=(-b+sqrt(b*b-4.*a*c))/(2.0*a);x2=(-b-sqrt(b*b-4.*a*c))/(2.0*a);printf(“x1=%7.2f\nx2=%7.2f”,x1,x2);}b*b-4ac<0?问题#include<stdio.h>b*b-4ac<0?6一元二次方程根求解算法描述b2-4ac=0?yes求等根nob2-4ac>0?yes求实根no求复根问题:如何构造条件?如何根据条件实现不同算法?一元二次方程根求解算法描述b2-4ac=0?yes求等根no73.2关系运算和逻辑运算⒈关系运算(RelationalOperator)关系运算是比较两个表达式的数值相互关系的运算。运算符比较的关系实例>大于a>b>=大于等于a>=b<小于2<1<=小于等于c<=d==等于1==c!=不等于1!=3
关系运算规则:参加运算的表达式的从左到右按关系运算符提供的关系进行比较,满足关系得到整型值1,不满足关系得到整型值0。inta=1,b=3,c,d;c=a>b;d=a+2<=b+3;3.2关系运算和逻辑运算⒈关系运算(Relational8⒉逻辑运算(LogicalOperator)逻辑运算运算时判断对象真、假的运算。C语言没有提供逻辑类型。任何类型的值都可以表示逻辑状态,如下表:表达式的值所对应的逻辑值表达式的值表示的逻辑关系非0真true0假false运算对象非0代表逻辑真,是0代表逻辑假。也就是说任何类型的量都有逻辑值。逻辑运算的结果用整型值表示。运算结果为真时,得到整型值1;运算结果为假时,得到整型值0。inta=2,b=0;aba+b⒉逻辑运算(LogicalOperator)9C语言的逻辑运算运算符逻辑关系举例&&逻辑与a>2&&a<3||逻辑或s<2||s>6!逻辑非!a其中,!运算是单目运算。逻辑运算演示C语言的逻辑运算运算符逻辑关系举例&&逻辑与a>2&&a<310⒊复杂逻辑关系的表示在实际应用中,经常会遇到描述复杂的关系。如:判断x是否大于等于5或小于3。此类关系的描述在程序设计中会大量使用。035x<3||x>=50-23-2<x<3?x=4-2<x&&x<3表示数值关系的原则:开放区间用或;闭合区间用与。思考题⒈判断是否在一、三象限的表达式。⒉判断是否在如图圆环内的表达式。sqrt(x),代表对x开平方。⒊ch为字符变量,判断ch是否为字母的表达式。(ch>=’a’&&ch<=‘z’)||(ch>=’A’&&ch<=‘Z’)不是字母的表达式?⒊复杂逻辑关系的表示在实际应用中,经常会遇到描11⒋运算的优先级C语言允许所有基本类型的量参加同一表达式的运算,也允许所有类型的运算符出现在一个表达式中。因此,表达式值的类型如何确定,运算的先后顺序如何确定,必须通过一套规则解决。为了便于调整优先级,设置()为最高优先级。相同优先级存在一个顺序称为结合顺序,结合顺序有从右向左或从左向右。⑴运算优先级第一原则:单目运算的优先级高于双目运算。第二原则:算术运算关系运算逻辑运算赋值运算表达式优先级举例说明:++a-b>c+d&&a>=b*34①②③④⑤⑥⑦注意:在无法确定优先级时,加()区分。简化表达式。c=b*=a+2c=(b*=(a+2))⒋运算的优先级C语言允许所有基本类型的量参12级别运算符结合顺序1()[]->.从左向右2!-++--(type)sizeof*&从右向左3*/%从左向右4+-从左向右5<<>>从左向右6<<=>>=从左向右7==!=从左向右8&从左向右9^从左向右10|从左向右11&&从左向右12||从左向右13?:从右向左14=op=从右向左15,从左向右优先级总表级别运算符结合顺序1()[]->.从左向右2!13优先级特例
⒈自加、自减运算优先级遵循原则:
前置:先运算后引用;
后置:先引用后运算。#include<stdio.h>voidmain(void){inta=3,b;b=a+++a++;printf(“b=%d”,b);b=++a+(++a);printf(“b=%d”,b);}CHAP3EX0⒉在逻辑运算中,如果逻辑值能够确定,则不再进行运算。inta=0,b=0++a||++b;printf(“a=%d\nb=%d”,a,b);a=0;a&&++b;/*b的值?*/++CHAP3EX1优先级特例⒈自加、自减运算优先级遵循原则:#143.3分支结构(选择结构Selection)
⒈if及if-else的三种结构。由标准的分支结构可以演化成单分支、多分支结构。C语言的分支语句有if、if–else、switch三种。
⑴if语句格式:
if(expression)statement;语句表达式,非0为yes,0为no。语句,可以是复合语句。流程图:e?statement;yesno举例:#include<stdio.h>voidmain(void){charch;ch=getchar();
if(ch>=‘a’&&ch<=‘z’)ch-=32;putchar(ch);}#include<stdio.h>voidmain(void){inta,b;a=10;b=50;
if(a<b)a=b;b=c;c=a;pintf(“%d,%d”,a,b);}3.3分支结构(选择结构Selection)⒈15⑵if–else结构格式:
if(expression)
stat1;
else stat2;语句或复合语句。流程图:e?falsestat2;stat1;true入口出口举例:输出|x|。#include<stdio.h>main(){intx;scanf(“%d”,&x);
if(x>=0)
printf(“%d”,x);
else
printf(“%d”,-x);}#include<stdio.h>main(){inta;scanf(“%d”,&a);
if(a++>10)printf(“%d”,++a);
else
printf(“%d”,a--);}⑵if–else结构格式:语句或复合语句。流程图:e16⑶if–elseif结构(Muliline)格式:
if(e1)
stat1;
elseif(e2)
stat2;
elseif(e3)
stat3;…
elseif(en-1)
statn-1;
elsestatn;
框图:e1?tstat1;fe2?tstat2;出口fen-1?tstatn-1;fstatn;n-1个条件,满足某个条件,执行对应的语句,然后到出口。⑶if–elseif结构(Muliline)格式:框17ifelseif结构举例:征税问题:1000以下税率为3%1000~2000税率为4%2000~3000税率为5% 3000以上税率6%输入收入,求应缴税款。#include<stdio.h>voidmain(void){floatx,rate;scanf(“%f”,&x);
if(x<1000)rate=.03;elseif(x<2000)rate=.04;elseif(x<3000)rate=.05;elserate=.06;printf(“%f”,x*rate);}3/100?ifelseif结构举例:征税问题:1000以下税率18⑷if语句的嵌套对于如下的结构:if(e1)stat1;elsestat2;在stat1或stat2中又含有if结构:if(e2)stat3;elsestat4;称为if结构的嵌套。各种if结构都可以嵌套。
如求符号函数:-1(x<0)y=0(x=0)1(x>0)#include<stdio.h>voidmain(void){intx,y;scanf(“%d”,&x);
if(x<0)y=-1;
else
if(x==0)y=0;
else
y=1;printf(“x=%d,y=%d\n”,x,y);}外层内层在外层else语句中,含有一个if结构。说明:①书写采取缩进形式,便于区分。内层缩进。②else与最近的if相匹配,从内到外。y=-1;if(x!=0)if(x>0)y=1;elsey=0;x==0结果?⑷if语句的嵌套对于如下的结构:在stat1或stat2中又19求一元二次方程ax2+bx+c=0的根。#include<stdio.h>#include<math.h>voidmain(void){floata,b,c,d,e,x1,x2;scanf(“%f,%f,%f”,&a,&b,&c);d=b*b-4.0*a*c;
if(fabs(d)
{x1=x2=-b/(2.0*a);printf(“\nx1=x2=,%f”,x1);}
else
{
if(d>0){
printf(“\nx1=%f”,(-b+sqrt(d))/(2.0*a));printf(“\nx2=%f”,(-b-sqrt(d))/(2.0*a));}
else{
printf(“\nx1=%f+i%f”,-b/(2.0*a),sqrt(-d)/(2.0*a));printf(“\nx2=%f-i%f”,-b/(2.0*a),sqrt(-d)/(2.0*a));}
}}外层内层求相等实根。求不等实根。求共扼复根。判断实型量相等或不等用误差的方法。flaot或0.999999*/a==1.0?求一元二次方程ax2+bx+c=0的根。#include20⒉switch语句(多分支结构)格式:switch
(expression)
{case常量表达式1:statement1;case常量表达式2:statement2;…case常量表达式n-1:statementn-1;default:statementn;
}只能是整型或字符型表达式。整型字符型常量表达式。表达式的值要互不能相等!
流程:①先求expression的值。②依次比较expression和各常量表达式的值。
③如果和第i个常量表达式相等,则执行第i条以后的语句。④如果不相等,则执行default以后的语句。⒉switch语句(多分支结构)格式:只能是整型或字符型表达21语句标号的概念:#include<stdio.h>voidmain(void){chargrade;grade=getchar();
switch(grade){
case‘A’:printf(“90—100\n”);
case‘B’:printf(“80—89\n’);
case‘C’:printf(“70—79\n”);
case‘D’:printf(“60—69\n”);
case‘E’:printf(“<60\n”);
default:printf(“error\n”);}}语句标号。break语句:格式:break;作用:中断switch流程。break;break;break;break;break;语句标号的概念:#include<stdio.h>语句标号22例:输出五分制对应的百分制范围。#include<stdio.h>voidmain(void){charchGrad;chGrad=getchar();
switch(chGrad){
case‘a’:case‘A’:
printf(“90—100\n”);break;case‘b’:case‘B’:printf(“80—89\n”);break;case‘c’:case‘C’:printf(“70—79\n”);break;case‘d’:case‘D’:printf(“60—69\n”);break;case‘e’:case‘E’:printf(“<60\n”);break;
default:printf(“DataError!\n”);
}}多个标号可以共用相同的语句。default语句可以省略。例:输出五分制对应的百分制范围。#include<std233.4
循环结构(Repetition)程序经常会重复执行某些相同的操作,如:求:s=1+2+3+4+…+100算法描述:①s=0;i=1;②s+=i;i++;③判断i是否小于等于100
如果i小于等于100,重复②;
否则,结束。此类根据“条件”重复执行相同算法的结构,称为循环。初始化部分。循环体。含有使条件趋假的语句。循环的条件。注意:循环应在有限次完成。
C语言提供了三类实现循环的语句:
while,dowhile,for
3.4
循环结构(Repetition)程序经常会重复执行24⒈while语句(当型循环)格式:
while(expression)
statement;表达式:值非0,表示满足条件;值为0代表不满足条件。语句(复合语句),重复执行部分(循环体)。流程:e?truestatement;false含有使条件趋假的语句。举例:求s=1+2+3+4+…+100#include<stdio.h>voidmain(void){ints=0,i=1;
while(i<=100)
{s=s+i;/*s+=i;*/i++;}
printf(“s=%d\n”,s);}初始化部分循环体条件测试使条件趋假语句CHAP3EX7⒈while语句(当型循环)格式:表达式:值非0,表示满足25⒉do–while语句(直到型循环)格式:
do{
statement;}
while
(expression);流程:statement;e?truefalse含有使条件趋假的语句。while循环与do-while循环的区别:while循环先判条件,后执行循环体;do–while循环先执行循环体,后判条件。举例:求:30!#include<stdio.h>voidmain(void){floats=1.0;inti=1;
do{s*=i;i++;}while(i<=30);
printf(“30!=%f”,s);}初始化。循环体。测试条件。使条件趋假。CHAP3EX8思考题:用do-while实现s=1+2+…+100。用while实现30!。⒉do–while语句(直到型循环)格式:流程:stat26⒊for语句格式:
for
(e1;
e2;e3)
statement;流程:e1e2?truestatement;e3false举例:求:s=1+2+3+…+100#include<stdio.h>voidmain(void){ints,i;
for(s=0,i=1;i<=100;i++)
{s=s+i;
}
printf(“s=%d”,s);}使e2趋假。在for循环中,e1、e2、e3都可以省略!e1省略
s=0,i=1;e3省略
i++;初值表达式。测试表达式。增值表达式。⒊for语句格式:流程:e1e2?truestateme27for循环实例求100以内的偶数和。ints=0,i;for(i=2;i<100;i+=2){s+=i;}求500以内最大的5个能被50整除数的和。inti,j,s=0;for(j=500,i=0;i<5;i++,j-=50)
{s+=j;}从大到小输出100以内能被5整除的数。inti;for(i=100;i>=0;i-=5)printf(“%d\n”,i);inti,j,s=0;for(i=0,j=0;i+j<100;i++,++j)s+=i+j;for循环实例求100以内的偶数和。int28⒋转移语句①循环的中断:break语句概念:循环体中可以加分支,判断是否继续执行循环,break语句可以提前结束循环。举例:求:r=1—10的圆的面积,如圆面积大于100则中断。for(r=1;r<=10;r++){area=3.14159*r*r;
if(area>100)
break;
printf(“\n%f“,area);}满足条件,则退出循环。②继续循环:continue语句continue语句的作用是跳过本次循环剩余的循环体内容,执行下次循环。举例:求1—100内的偶数和。
s=0;for(n=1;n<=100;n++){
if(n%2!=0)
continue;
s+=n;}满足条件,跳过循环体,继续循环。ints=0,i;for(i=2;i<100;i=i+2)s+=i;⒋转移语句①循环的中断:break语句概念:循29③goto语句格式:gotoLabel/*Label:同一函数内语句前的标号。*/作用:转移到标号对应的语句上继续执行。loop:
if(i<=100){
sum=sum+i;i++;
gotoloop;
}③goto语句格式:作用:转移到标号对应的语句上继续执行。30⒋循环的嵌套概念:在一个循环的循环体内又包含一个完整的循环称为循环的嵌套。i123456789 11112……19
j 22122……29 99192……99如打印一99的乘法表:i=1时,i从1变化到9,完i*j。⒋循环的嵌套概念:在一个循环的循环体内又包含一个完整31多重循环打印99乘法表。#include<>voidmain(void){inti,j;for(i=1;i<=9;i++){
printf(“\n“);}}外层循环内层循环说明:⒈内外层循环采用缩进形式。⒉while和do-while和for可以相互嵌套。
⒊执行次数为内层循环次数和外层循环次数的乘积。CHAP3EX9如何打印乘法表的一半?for(j=1;j<=9;j++){printf(“%4d“,i*j);}多重循环打印99乘法表。#include<>内层循环说32循环和分支相互嵌套例:输入10个自然数统计其中偶数的个数及偶数值和。算法框图:start定义变量初始化循环?true输入偶数?true统计累加falsefalse输出结果end#include<stdio.h>voidmain(void){inti,ix,iCount=0,iSum=0;
for(i=1;i<=10;i++){
scanf(“%d\n”,&ix);
if(ix%2==0){iSum+=ix;iCount++;}
}printf(“Num=%d\nSum=%d”,iCount,iSum);}循环结构分支结构输入负数?do{if(ix<=0)printf(“dateerror”);}while(ix<=0);
算法的健壮性注意:结构应完整的包含和被包含。循环和分支相互嵌套例:输入10个自然数统计其中偶数的个数及偶33程序设计的基本方法根据计算机的特点,结合循环与分支结构在程序设计时常使两种常用的基本方法。枚举法(穷举法)迭代法本专题将结合分支和循环介绍两种方法的基本思想和具体实现!程序设计的基本方法根据计算机的特点,结合循环34枚举法Enumeration存在有限状态;其中某些状态满足特定条件。通过循环产生所有状态(枚举)。对每一状态,按条件进行状态测试,满足条件的状态,为所求的解。求3到100内的所有素数。通过循环使i从3变化到99(枚举所有状态)对每次循环的i进行是否是素数的测试,如果是素数,输出i。枚举法Enumeration存在有限状态;其中某些状态35枚举法举例:⒈求3到200之间的所有素数(只能被1和自身整除的数)。对于自然数n,判断其是否为素数有以下三种方法:①判断n是否能被从2到n-1范围内的数整除;②判断n是否能被从2到(int)(n/2)范围的数整除;③判断n是否能被从2到(int)sqrt(n)范围的数整除;枚举法举例:⒈求3到200之间的所有素数(只能被1和自身整除36程序如下:#include<stdio.h>#include<math.h>voidmain(void){intn,j,s;
for(n=3;n<100;n+=2){
s=(int)sqrt((double)n);
for(j=2;j<=s;j++){if(n%j==0)break;}
if(j>s)printf(“\n%d”,n);
}}枚举所有数构造,测试条件如果n能被2到s的任意数整除,退出循环。如果n是素数,输出n。CHAP3EXA程序如下:#include<stdio.h>枚举所有数构造37
⒉求水仙花数(条件:三位数的个、十、百位的方和等于该数。153==13+53+33)。n为枚举变量,枚举初值100,枚举终值999。构造条件:取出n的个、十、百位数。测试是否满足条件,满足条件输出n。#include<stdio.h>voidmain(void){intn,a,b,c;
for(n=100;n<=999;n++){
a=n/100;b=n%100/10;c=n%10;
if(a*a*a+b*b*b+c*c*c==n) printf(“\n%d”,n);
}}枚举所有三位数构造条件测试条件取n的百位a、十位b、个位c。CHAP3EXB⒉求水仙花数(条件:三位数的个、十、百位的方和38迭代法Iteration迭代是通过循环不断由旧值推导新值,并最后求解的过程。迭代法有三个要点:
如人口每年按2%增长,现在人口有12亿,10年后人口有多少?⒈迭代公式。m=m*(1+2%)⒉迭代初值(边界条件)。m=12⒊迭代次数(或条件)。n=10迭代法Iteration迭代是通过循环不断由旧值推导新值,39迭代法举例求ex=1+x+x2/2!+…+xn/n!前n+1项之和。迭代次数i012…n迭代公式t=t*x/i迭代初值exp=1,t=1,(i=1~n)#include<stdio.h>voidmain(void){floatexp,x,t;inti,n;
scanf(“%f,%d”,&x,&n);t=1.0;
exp=1.0;
for(i=1;i<=n;i++){
t*=x/i;exp+=t;
}
printf(“e^%d=%15.6f”,(int)x,exp);}迭代初值。迭代公式。迭代过程附加条件:当|t|<10-5,结束运算。if(fabs(t)<1e-5)break;CHAP3EXD迭代法举例求ex=1+x+x2/2!+…+xn/n!前n+140第三章程序控制结构Chapter3ControlFlow第三章程序控制结构Chapter3Control41程序的三种控制结构
结构化程序设计是软件设计的第三次革命。结构化程序设计的基础是采用三种程序的控制结构。1966年BÖHM&Jacopini证明:只要三种控制结构就能表达用一个入口和一个出口框图所能表达的任何程序逻辑。三种控制结构如下:⒈顺序结构Sequence算法描述:f;g;框图:f;g;⒉选择结构Selection(分支结构)算法描述:if(e)f;elseg;框图:e?yesf;nog;程序的三种控制结构结构化程序设计是软件设计的42⒊循环结构Repetition⑴当型循环whilecistruedofc?fYESNO⑵直到循环dofuntilcisfalsefc?YESNO三种控制结构有如下共同的特点:一个入口和一个出口;无死语句;无死循环。如何构造条件?⒊循环结构Repetition⑴当型循环whilecis43⒋复合语句
概念:C语言可以用{}包括一系列的语句。一对{}所包含的内容称为一个复合语句。其中可以含有0到多条C语言语句。#include<stdio.h>voidmain(void)
{inta,b;scanf(“%d,%d”,&a,&b);
{inttemp;
temp=a;a=b;b=temp;
}printf(“%d,%d”,a,b);}复合语句复合语句复合语句可以嵌套凡是可以出现单一语句的地方都可以使用复合语句。复合语句的作用:⒈作为分支和循环的块。⒉作为标识符的作用域。交换算法演示⒋复合语句概念:C语言可以用{}包括44顺序结构程序设计顺序结构的程序是指程序的语句中不含任何转移语句,程序的执行流程完全按照语句在程序中的顺序执行。如:求sin30o+sin60o+cos30o+cos60o #include<>#include<>voidmain(void){floats,a,b;a=30*3.14159/180;a=60*3.14159/180;s=sin(a)+sin(b)+cos(a)+cos(b);printf(“s=%f\n”,s); }顺序结构程序设计顺序结构的程序是指程序的语句中45问题#include<stdio.h>#include<math.h>voidmain(void){floata,b,c,x1,x2;scanf(“%f,%f,%f”,&a,&b,&c);x1=(-b+sqrt(b*b-4.*a*c))/(2.0*a);x2=(-b-sqrt(b*b-4.*a*c))/(2.0*a);printf(“x1=%7.2f\nx2=%7.2f”,x1,x2);}b*b-4ac<0?问题#include<stdio.h>b*b-4ac<0?46一元二次方程根求解算法描述b2-4ac=0?yes求等根nob2-4ac>0?yes求实根no求复根问题:如何构造条件?如何根据条件实现不同算法?一元二次方程根求解算法描述b2-4ac=0?yes求等根no473.2关系运算和逻辑运算⒈关系运算(RelationalOperator)关系运算是比较两个表达式的数值相互关系的运算。运算符比较的关系实例>大于a>b>=大于等于a>=b<小于2<1<=小于等于c<=d==等于1==c!=不等于1!=3
关系运算规则:参加运算的表达式的从左到右按关系运算符提供的关系进行比较,满足关系得到整型值1,不满足关系得到整型值0。inta=1,b=3,c,d;c=a>b;d=a+2<=b+3;3.2关系运算和逻辑运算⒈关系运算(Relational48⒉逻辑运算(LogicalOperator)逻辑运算运算时判断对象真、假的运算。C语言没有提供逻辑类型。任何类型的值都可以表示逻辑状态,如下表:表达式的值所对应的逻辑值表达式的值表示的逻辑关系非0真true0假false运算对象非0代表逻辑真,是0代表逻辑假。也就是说任何类型的量都有逻辑值。逻辑运算的结果用整型值表示。运算结果为真时,得到整型值1;运算结果为假时,得到整型值0。inta=2,b=0;aba+b⒉逻辑运算(LogicalOperator)49C语言的逻辑运算运算符逻辑关系举例&&逻辑与a>2&&a<3||逻辑或s<2||s>6!逻辑非!a其中,!运算是单目运算。逻辑运算演示C语言的逻辑运算运算符逻辑关系举例&&逻辑与a>2&&a<350⒊复杂逻辑关系的表示在实际应用中,经常会遇到描述复杂的关系。如:判断x是否大于等于5或小于3。此类关系的描述在程序设计中会大量使用。035x<3||x>=50-23-2<x<3?x=4-2<x&&x<3表示数值关系的原则:开放区间用或;闭合区间用与。思考题⒈判断是否在一、三象限的表达式。⒉判断是否在如图圆环内的表达式。sqrt(x),代表对x开平方。⒊ch为字符变量,判断ch是否为字母的表达式。(ch>=’a’&&ch<=‘z’)||(ch>=’A’&&ch<=‘Z’)不是字母的表达式?⒊复杂逻辑关系的表示在实际应用中,经常会遇到描51⒋运算的优先级C语言允许所有基本类型的量参加同一表达式的运算,也允许所有类型的运算符出现在一个表达式中。因此,表达式值的类型如何确定,运算的先后顺序如何确定,必须通过一套规则解决。为了便于调整优先级,设置()为最高优先级。相同优先级存在一个顺序称为结合顺序,结合顺序有从右向左或从左向右。⑴运算优先级第一原则:单目运算的优先级高于双目运算。第二原则:算术运算关系运算逻辑运算赋值运算表达式优先级举例说明:++a-b>c+d&&a>=b*34①②③④⑤⑥⑦注意:在无法确定优先级时,加()区分。简化表达式。c=b*=a+2c=(b*=(a+2))⒋运算的优先级C语言允许所有基本类型的量参52级别运算符结合顺序1()[]->.从左向右2!-++--(type)sizeof*&从右向左3*/%从左向右4+-从左向右5<<>>从左向右6<<=>>=从左向右7==!=从左向右8&从左向右9^从左向右10|从左向右11&&从左向右12||从左向右13?:从右向左14=op=从右向左15,从左向右优先级总表级别运算符结合顺序1()[]->.从左向右2!53优先级特例
⒈自加、自减运算优先级遵循原则:
前置:先运算后引用;
后置:先引用后运算。#include<stdio.h>voidmain(void){inta=3,b;b=a+++a++;printf(“b=%d”,b);b=++a+(++a);printf(“b=%d”,b);}CHAP3EX0⒉在逻辑运算中,如果逻辑值能够确定,则不再进行运算。inta=0,b=0++a||++b;printf(“a=%d\nb=%d”,a,b);a=0;a&&++b;/*b的值?*/++CHAP3EX1优先级特例⒈自加、自减运算优先级遵循原则:#543.3分支结构(选择结构Selection)
⒈if及if-else的三种结构。由标准的分支结构可以演化成单分支、多分支结构。C语言的分支语句有if、if–else、switch三种。
⑴if语句格式:
if(expression)statement;语句表达式,非0为yes,0为no。语句,可以是复合语句。流程图:e?statement;yesno举例:#include<stdio.h>voidmain(void){charch;ch=getchar();
if(ch>=‘a’&&ch<=‘z’)ch-=32;putchar(ch);}#include<stdio.h>voidmain(void){inta,b;a=10;b=50;
if(a<b)a=b;b=c;c=a;pintf(“%d,%d”,a,b);}3.3分支结构(选择结构Selection)⒈55⑵if–else结构格式:
if(expression)
stat1;
else stat2;语句或复合语句。流程图:e?falsestat2;stat1;true入口出口举例:输出|x|。#include<stdio.h>main(){intx;scanf(“%d”,&x);
if(x>=0)
printf(“%d”,x);
else
printf(“%d”,-x);}#include<stdio.h>main(){inta;scanf(“%d”,&a);
if(a++>10)printf(“%d”,++a);
else
printf(“%d”,a--);}⑵if–else结构格式:语句或复合语句。流程图:e56⑶if–elseif结构(Muliline)格式:
if(e1)
stat1;
elseif(e2)
stat2;
elseif(e3)
stat3;…
elseif(en-1)
statn-1;
elsestatn;
框图:e1?tstat1;fe2?tstat2;出口fen-1?tstatn-1;fstatn;n-1个条件,满足某个条件,执行对应的语句,然后到出口。⑶if–elseif结构(Muliline)格式:框57ifelseif结构举例:征税问题:1000以下税率为3%1000~2000税率为4%2000~3000税率为5% 3000以上税率6%输入收入,求应缴税款。#include<stdio.h>voidmain(void){floatx,rate;scanf(“%f”,&x);
if(x<1000)rate=.03;elseif(x<2000)rate=.04;elseif(x<3000)rate=.05;elserate=.06;printf(“%f”,x*rate);}3/100?ifelseif结构举例:征税问题:1000以下税率58⑷if语句的嵌套对于如下的结构:if(e1)stat1;elsestat2;在stat1或stat2中又含有if结构:if(e2)stat3;elsestat4;称为if结构的嵌套。各种if结构都可以嵌套。
如求符号函数:-1(x<0)y=0(x=0)1(x>0)#include<stdio.h>voidmain(void){intx,y;scanf(“%d”,&x);
if(x<0)y=-1;
else
if(x==0)y=0;
else
y=1;printf(“x=%d,y=%d\n”,x,y);}外层内层在外层else语句中,含有一个if结构。说明:①书写采取缩进形式,便于区分。内层缩进。②else与最近的if相匹配,从内到外。y=-1;if(x!=0)if(x>0)y=1;elsey=0;x==0结果?⑷if语句的嵌套对于如下的结构:在stat1或stat2中又59求一元二次方程ax2+bx+c=0的根。#include<stdio.h>#include<math.h>voidmain(void){floata,b,c,d,e,x1,x2;scanf(“%f,%f,%f”,&a,&b,&c);d=b*b-4.0*a*c;
if(fabs(d)
{x1=x2=-b/(2.0*a);printf(“\nx1=x2=,%f”,x1);}
else
{
if(d>0){
printf(“\nx1=%f”,(-b+sqrt(d))/(2.0*a));printf(“\nx2=%f”,(-b-sqrt(d))/(2.0*a));}
else{
printf(“\nx1=%f+i%f”,-b/(2.0*a),sqrt(-d)/(2.0*a));printf(“\nx2=%f-i%f”,-b/(2.0*a),sqrt(-d)/(2.0*a));}
}}外层内层求相等实根。求不等实根。求共扼复根。判断实型量相等或不等用误差的方法。flaot或0.999999*/a==1.0?求一元二次方程ax2+bx+c=0的根。#include60⒉switch语句(多分支结构)格式:switch
(expression)
{case常量表达式1:statement1;case常量表达式2:statement2;…case常量表达式n-1:statementn-1;default:statementn;
}只能是整型或字符型表达式。整型字符型常量表达式。表达式的值要互不能相等!
流程:①先求expression的值。②依次比较expression和各常量表达式的值。
③如果和第i个常量表达式相等,则执行第i条以后的语句。④如果不相等,则执行default以后的语句。⒉switch语句(多分支结构)格式:只能是整型或字符型表达61语句标号的概念:#include<stdio.h>voidmain(void){chargrade;grade=getchar();
switch(grade){
case‘A’:printf(“90—100\n”);
case‘B’:printf(“80—89\n’);
case‘C’:printf(“70—79\n”);
case‘D’:printf(“60—69\n”);
case‘E’:printf(“<60\n”);
default:printf(“error\n”);}}语句标号。break语句:格式:break;作用:中断switch流程。break;break;break;break;break;语句标号的概念:#include<stdio.h>语句标号62例:输出五分制对应的百分制范围。#include<stdio.h>voidmain(void){charchGrad;chGrad=getchar();
switch(chGrad){
case‘a’:case‘A’:
printf(“90—100\n”);break;case‘b’:case‘B’:printf(“80—89\n”);break;case‘c’:case‘C’:printf(“70—79\n”);break;case‘d’:case‘D’:printf(“60—69\n”);break;case‘e’:case‘E’:printf(“<60\n”);break;
default:printf(“DataError!\n”);
}}多个标号可以共用相同的语句。default语句可以省略。例:输出五分制对应的百分制范围。#include<std633.4
循环结构(Repetition)程序经常会重复执行某些相同的操作,如:求:s=1+2+3+4+…+100算法描述:①s=0;i=1;②s+=i;i++;③判断i是否小于等于100
如果i小于等于100,重复②;
否则,结束。此类根据“条件”重复执行相同算法的结构,称为循环。初始化部分。循环体。含有使条件趋假的语句。循环的条件。注意:循环应在有限次完成。
C语言提供了三类实现循环的语句:
while,dowhile,for
3.4
循环结构(Repetition)程序经常会重复执行64⒈while语句(当型循环)格式:
while(expression)
statement;表达式:值非0,表示满足条件;值为0代表不满足条件。语句(复合语句),重复执行部分(循环体)。流程:e?truestatement;false含有使条件趋假的语句。举例:求s=1+2+3+4+…+100#include<stdio.h>voidmain(void){ints=0,i=1;
while(i<=100)
{s=s+i;/*s+=i;*/i++;}
printf(“s=%d\n”,s);}初始化部分循环体条件测试使条件趋假语句CHAP3EX7⒈while语句(当型循环)格式:表达式:值非0,表示满足65⒉do–while语句(直到型循环)格式:
do{
statement;}
while
(expression);流程:statement;e?truefalse含有使条件趋假的语句。while循环与do-while循环的区别:while循环先判条件,后执行循环体;do–while循环先执行循环体,后判条件。举例:求:30!#include<stdio.h>voidmain(void){floats=1.0;inti=1;
do{s*=i;i++;}while(i<=30);
printf(“30!=%f”,s);}初始化。循环体。测试条件。使条件趋假。CHAP3EX8思考题:用do-while实现s=1+2+…+100。用while实现30!。⒉do–while语句(直到型循环)格式:流程:stat66⒊for语句格式:
for
(e1;
e2;e3)
statement;流程:e1e2?truestatement;e3false举例:求:s=1+2+3+…+100#include<stdio.h>voidmain(void){ints,i;
for(s=0,i=1;i<=100;i++)
{s=s+i;
}
printf(“s=%d”,s);}使e2趋假。在for循环中,e1、e2、e3都可以省略!e1省略
s=0,i=1;e3省略
i++;初值表达式。测试表达式。增值表达式。⒊for语句格式:流程:e1e2?truestateme67for循环实例求100以内的偶数和。ints=0,i;for(i=2;i<100;i+=2){s+=i;}求500以内最大的5个能被50整除数的和。inti,j,s=0;for(j=500,i=0;i<5;i++,j-=50)
{s+=j;}从大到小输出100以内能被5整除的数。inti;for(i=100;i>=0;i-=5)printf(“%d\n”,i);inti,j,s=0;for(i=0,j=0;i+j<100;i++,++j)s+=i+j;for循环实例求100以内的偶数和。int68⒋转移语句①循环的中断:break语句概念:循环体中可以加分支,判断是否继续执行循环,break语句可以提前结束循环。举例:求:r=1—10的圆的面积,如圆面积大于100则中断。for(r=1;r<=10;r++){area=3.14159*r*r;
if(area>100)
break;
printf(“\n%f“,area);}满足条件,则退出循环。②继续循环:continue语句continue语句的作用是跳过本次循环剩余的循环体内容,执行下次循环。举例:求1—100内的偶数和。
s=0;for(n=1;n<=100;n++){
if(n%2!=0)
continue;
s+=n;}满足条件,跳过循环体,继续循环。ints=0,i;for(i=2;i<100;i=i+2)s+=i;⒋转移语句①循环的中断:break语句概念:循69③goto语句格式:gotoLabel/*Label:同一函数内语句前的标号。*/作用:转移到标号对应的语句上继续执行。loop:
if(i<=100){
sum=sum+i;i++;
gotoloop;
}③goto语句格式:作用:转移到标号对应的语句上继续执行。70⒋循环的嵌套概念:在一个循环的循环体内又包含一个完整的循环称为循环的嵌套。i123456789 11112……19
j 22122……29 99192……99如打印一99的乘法表:i=1时,i从1变化到9,完i*j。⒋循环的嵌套概念:在一个循环的循环体内又包含一个完整71多重循环打印99乘法表。#include<>voidmain(void){inti,j;for(i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB6111∕T+215-2024+设施火龙果产期调控技术规程
- DB4110T74-2024农田氮磷面源污染源头减控技术规程
- 农药制造中的纳米技术应用考核试卷
- 海水淡化处理中的膜技术应用考核试卷
- 电机制造中的少量多品种生产技术考核试卷
- 煤炭业生态环境保护措施考核试卷
- 油炸食品加工中的营养与健康认证考核试卷
- 座板式单人吊具培训教案考核试卷
- 玉质艺术品的审美标准与评价体系考核试卷
- 森林改培对农村生活质量的提升考核试卷
- 八大特殊作业安全试题题库
- 标签打印管理办法及流程
- 五四制青岛版2022-2023五年级科学上册第五单元第19课《生物的栖息地》课件(定稿)
- DB65∕T 3253-2020 建筑消防设施质量检测评定规程
- 四年级上册美术教案15《有创意的书》人教版
- 否定词否定句课件(PPT 38页)
- 水力学第12章 相似理论-2015
- 第7章国际资本流动与国际金融危机
- 藏传佛教英文词汇
- 模拟法庭刑事案例解析
- 人像摄影构图(PPT)
评论
0/150
提交评论