




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章C程序流程设计【教学要求】1.掌握关系运算符、逻辑运算符的使用特点,清楚每种运算符的优先级与结合性,掌握关系表达式、逻辑表达式的使用要点。2.熟练掌握IF语句的三种形式,掌握IF语句的基本结构以及IF语句的嵌套,并能将条件运算符给出的语句转化成IF语句的形式。3.掌握SWITCH语句的一般形式,并能把复杂的分支选择性结构化成SWITCH语句来解决问题。4.掌握WHILE语句与DOWHILE语句的结构与使用方法。5.掌握for语句的结构与使用方法4.1程序的三种基本结构4.2关系运算符与逻辑运算符4.3关系表达式与逻辑表达式4.4选择结构程序设计一、条件语句(if语句)条件语句的作用:用来判定所给定的条件是否满足,并根据判定的结果决定执行给出的两种操作之一。二、条件运算符三、switch语句switch语句的用途:解决“多路选择”的问题。4.5循环结构程序设计4.6辅助控制语句(break、continue语句)的作用4.7综合举例教学要点4.1
程序的三种基本结构结构化程序设计基本思想:任何程序都可以用三种基本结构表示,限制使用无条件转移语句(goto)结构化程序:由三种基本结构反复嵌套构成的程序叫结构化程序优点:结构清晰,易读,提高程序设计质量和效率常用流程图符号三种基本结构顺序结构ABAB流程图N-S图常用流程图符号
起止框输入输出框判断框处理框流程线注释框连接点PAB真假PBA真假选择结构kA1A2AiAnk=k2k=k1k=knk=ki......二分支选择结构多分支选择结构循环结构当型循环结构直到型循环结构PA假真当P为真AAP假真A直到P为假注:A,B,A1….An可以是一个简单语句,也可以是一个基本结构关系运算符的使用要点1、含义:关系运算符用于判断各个运算对象之间的相互关系2、符号类型:<、>、<=、>=、==、!=3、优先级:
<、>、<=、>=的优先级相同,而==、!=优先级相同,且前者高于后者;关系运算符的优先级低于算术运算符,高于赋值运算符。4、例:c>a+b等价于c>(a+b)算术运算符高a>b!=c等价于(a>b)!=ca==b<c等价于a==(b<c)关系运算符a=b>c等价于a=(b>c)
赋值运算符低逻辑运算符1、含义:逻辑运算符用于完成逻辑(布尔)运算。2、符号类型:&&(逻辑与)、||(逻辑或)、!(逻辑非)3、优先级4、使用要点在C语言中,没有逻辑型的数据,以“1”代表“真”,以“0”代表“假”。逻辑运算规则:
&&参与运算的表达式同时为真,则&&运算的结果为真;
||参与运算的表达式其中之一为真,则||运算的结果为真;
!为单目运算符,取运算对象的相反值。各种运算符的优先级
!(逻辑非)高算术运算符关系运算符
&&和||
赋值运算符低ab!a!ba&&ba||b真假真假假假真真真假假假假假真真假假真真真假真真逻辑运算真值表(课本P94表4.3)C语言中,运算量:0表示“假”,非0表示“真”,运算结果:0表示“假”,1表示“真”,关系表达式1、含义:用关系运算符将两个表达式连接起来的式子(连接的表达式可以是算术表达式也可以是关系表达式、逻辑表达式、赋值表达式、字符表达式)例如:a>b、a+b>c-d、(a=3)>(b=5)、’a’<‘b’、(a>b)>(b<c)等2、使用要点:关系表达式的值为一个逻辑值,即只有“真”和“假”两种状态.
关系表达式条件成立(值为真),则表达式的值为真(1),否则为假(0)。例如:(1)已知a=12,b=20;则表达式a>b的值为“0”;而a<b的值为“1”.
(2)若a=1,b=3,c=0;则表达式a+b>c的值为“1”;
表达式c=a>b的值为“0”;
表达式a=b+c的值为“1”。C语言识别表达式是否成立的方法是:所有值为“0”的表达式表示“假”,所有值为“非零”(包括-1)的表达式都表示“真”。请区别:x=1与x==1的不同。关系运算注意:例若a=0;b=0.5;x=0.3;
则a<=x<=b的值为0例5>2>7>8在C中是允许的,值为0例inti=1,j=7,a;a=i+(j%4!=0);
则a=2例‘a’>0结果为‘A’>100结果为10关系运算注意:例注意区分“=”与“==”inta=0,b=1;if(a=b)printf(“aequaltob”);elseprintf(“anotequaltob”);例应避免对实数作相等或不等的判断如1.0/3.0*3.0==1.0结果为可改写为:fabs(1.0/3.0*3.0-1.0)<1e-60逻辑表达式1、含义:将两个逻辑值连接起来的表达式成为逻辑表达式.2、使用要点:逻辑运算符两侧的运算对象不但可以是逻辑值也可以是任何类型的数据,而表达式的值最终结果为逻辑值.例如:(1)已知a=4,b=5则表达式a&&b的值为1,
而表达式a||b的值为1.测试逻辑表达式值的方法:在逻辑表达式的运算过程中,并不是所有的运算符都被执行,只是在必须执行下一个表达式才能求出整个表达式的值时才执行下一个表达式.例如:(1)对a&&b&&c只有当a的值为真时才判定b的值,
只有a和b的值都为真时才判定c的值.
当a的值为假时,就不再判定b和c的值.
(2)对a||b||c只要a为真就不再判定b和c的值。(3)如果有a=1,b=12,c=3,d=4,m=1,n=1;则表达式:(m=a>b)&&(n=c>d)的值为0,m的值为0,而n的值为1,
因为(n=c>d)没有被执行.4.2
选择型程序设计if语句(条件选择语句)if语句的三种形式形式一:格式:if(expression)statement执行过程:exprstatement非0=0例:if(x>y)printf(“%d”,x);exprstatement1statement2非0=0形式二:格式:if(expression)statement1elsestatement2执行过程:例:if(x>y)max=x;elsemax=y;形式三:格式:if(expr1)statement1elseif(expr2)statement2elseif(expr3)statement3…...[elsestatementn]expr1statemnt1非0=0expr2expr3statemntnstatemnt3statemnt2非0非0=0=0执行过程:
例:if(salary>1000)index=0.4;elseif(salary>800)index=0.3;elseif(salary>600)index=0.2;elseif(salary>400)index=0.1;elseindex=0;如:if(a==b&&x==y)printf(“a=b,x=y”);if(3)printf(“OK”);if(‘a’)printf(“%d”,’a’);说明:if后面的表达式类型任意语句可以是复合语句
if(x)if(x!=0)if(!x)if(x==0)例考虑下面程序的输出结果:#include<stdio.h>voidmain(){intx,y;scanf(“%d,%d”,&x,&y);if(x>y)x=y;y=x;elsex++;y++;printf(“%d,%d\n”,x,y);}CompileError!#include<stdio.h>intmain(){intx,y;printf("Enteraninteger:");scanf("%d",&x);y=x;if(y<0)y=-y;printf("\ninteger:%d--->absolutevalue:%d\n",x,y);return0;}例求一个数的绝对值运行:Enteraninteger:-12integer:-12--->absolutevalue:12#include<stdio.h>intmain(){inta,b;printf("Enterintegera:");scanf("%d",&a);printf("Enterintegerb:");scanf("%d",&b);if(a==b)printf("a==b\n");elseprintf("a!=b\n");return0;}例输入两个数并判断两数相等否运行:Enterintegera:12
Enterintegerb:12a==b运行:Enterintegera:12
Enterintegerb:9a!=b#include<stdio.h>intmain(){charc;printf("Enteracharacter:");c=getchar();if(c<0x20)printf("Thecharacterisacontrolcharacter\n");elseif(c>='0'&&c<='9')printf("Thecharacterisadigit\n");elseif(c>='A'&&c<='Z')printf("Thecharacterisacapitalletter\n");elseif(c>='a'&&c<='z')printf("Thecharacterisalowerletter\n");elseprintf("Thecharacterisothercharacter\n");return0;}例判断输入字符种类运行:Enteracharacter:
Thecharacterisacontrolcharacter运行:Enteracharacter:8Thecharacterisadigit运行:Enteracharacter:DThecharacterisacapitalletter运行:Enteracharacter:hThecharacterisalowerletter运行:Enteracharacter:F1Thecharacterisothercharacterif语句嵌套:一般形式:if(expr1)if(expr2)statement1elsestatement2elseif(expr3)statement3elsestatement4内嵌if内嵌ifif(expr1)if(expr2)statement1elsestatement2内嵌ifif(expr1){if(expr2)statement1}elsestatement3
内嵌ifif(expr1)statement1elseif(expr3)statement3elsestatement4内嵌if例输入两数并判断其大小关系#include<stdio.h>intmain(){intx,y;printf("Enterintegerx,y:");scanf("%d,%d",&x,&y);if(x!=y)if(x>y)printf("X>Y\n");elseprintf("X<Y\n");elseprintf("X==Y\n");return0;}运行:Enterintegerx,y:12,23X<Y
Enterintegerx,y:12,6X>YEnterintegerx,y:12,12X==Yif~else配对原则:缺省{}时,else总是和它上面离它最近的未配对的if配对if(……)if(……)if(……)else…...else…...else…...例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);修改:if(a==b){if(b==c)printf(“a==b==c”);}elseprintf(“a!=b”);实现if~else正确配对方法:加{}例:写一程序判定某一年是否为闰年。闰年的判定:某年能被4整除但不能被100整除或者能被4整除,又能被400整除.year被4整除FTTTTFFFyear被100整除year被400整除leapleap=1leap=1leap=0leap=0输出闰年输出非闰年程序设计结果#include<stdio.h>intmain(){intyear,leap;scanf(“%d”,&year);if(year%4==0){if(year%100==0) {if(year%400==0)leap=1; elseleap=0;}elseleap=1;}elseleap=0;if(leap)printf(“%dis”,year);elseprintf(“%disnot”,year);printf(“aleapyear\n”);return0;}请同学们考虑程序有无其它简化形式!!例考虑下面程序输出结果:#include<stdio.h>intmain(){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;printf(“%d”,x);return0;}结果:-1★条件运算符(?:)1、含义:在if语句中,表达式为真和假时都执行一条赋值语句并且都是给同一个变量赋值.这时可以把if语句简化为条件运算符.2、一般形式为:表达式1?表达式2:表达式3;如:可以写成:if(a>b)max=a;max=(a>b)?a:b;elsemax=b;(条件运算符是三目运算符)3、使用要点4、应用举例条件运算符的使用要点1.条件运算符的执行顺序先求表达式1,若为真则求解表达式2,整个表达式的值为表达式2的值;若表达式1的值为假则求解表达式3,整个表达式的值为表达式3的值.2.比较条件运算符与其他运算符的优先级别和结合性3.条件表达式中表达式1的类型可以与表达式2和表达式3的类型不一致.表达式2与表达式3的类型也可以不一致.例exp4_5:阅读程序写结果#include<stdio.h>voidmain(){floatx=1.0;inta=2,b=3;x=(a>b)?a:b;printf(“%.4f”,x);}输出为:3.0000条件表达式(a>b)?a:b的值为整型数据,但x为实型数据,所以输出为实型数据.例exp4_6:阅读程序写结果#include<stdio.h>main(){floatx=1.0;inta=2,b=3;a=(x>b)?x:b;printf(“%d\n”,a);printf(“%f”,(x>b)?x:b);}输出为:33.000000条件表达式(x>b)?x:b的值为实型数据,但a为整型数据,所以printf(“%d\n”,a);输出为整型数据,printf(“%f”,(x>b)?x:b);为实型数据.switch语句(开关分支语句)一般形式:switch(表达式){caseE1:
语句组1;break;caseE2:
语句组2;break;…….caseEn:
语句组n;break;[default:
语句组;break;]}执行过程:switch表达式语句组1语句组2语句组n语句组…...E1E2Endefaultcase说明:E1,E2,…En是常量表达式,且值必须互不相同语句标号作用,必须用break跳出case后可包含多个可执行语句,且不必加{}switch可嵌套多个case可共用一组执行语句如:……case‘A’:case‘B’:case‘C’:printf(“score>60\n”);break;……..例#include<stdio.h>intmain(){intx;scanf(“%d”,&x);switch(x){case5:printf(“Verygood!”);case4:printf(“Good!”);case3:printf(“Pass!”);case2:printf(“Fail!”);default:printf(“dataerror!”);}return0;}运行结果:score为5时,输出:
Verygood!Good!Pass!Fail!dataerror!例#include<stdio.h>intmain(){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++;}printf(“\na=%d,b=%d”,a,b);return0;}运行结果:a=2,b=1例:程序#include<stdio.h>voidmain(){inta=5;if(a++>5)printf("%d\n",a);elseprintf("%d\n",a--);}执行后显示结果是()。
A.4B.6C.5D.有语法错误B4.3循环型程序设计概述C语言可实现循环的语句:while语句do~while语句for语句while语句一般形式:while(表达式)
循环体语句;执行流程:expr循环体假(0)真(非0)while特点:先判断表达式,后执行循环体说明:循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,return,goto无限循环:while(1)
循环体;例用while循环求
/*例*/#include<stdio.h>intmain(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf("%d",sum);}循环初值循环终值循环变量增值循环条件循环体例显示1~10的平方#include<stdio.h>intmain(){inti=1;while(i<=10){printf("%d*%d=%d\n",i,i,i*i);i++;}return0;}运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100do~while语句一般形式:do
循环体语句;
while(表达式);执行流程:do循环体expr假(0)真(非0)while特点:先执行循环体,后判断表达式说明:至少执行一次循环体do~while可转化成while结构expr循环体假(0)真(非0)循环体While循环例用do~while循环求
#include<stdio.h>intmain(){inti,sum=0;i=1;do{sum+=i; i++;}while(i<=100);printf("%d",sum);return0;}例while和do~while比较#include<stdio.h>intmain(){inti,sum=0;scanf("%d",&i);do{sum+=i; i++;}while(i<=10);printf("%d",sum);return0;}#include<stdio.h>intmain(){inti,sum=0;scanf("%d",&i);while(i<=10){sum+=i; i++;}printf("%d",sum);return0;}for语句一般形式:for([expr1];[expr2];[expr3])
循环体语句;执行流程:expr2循环体假(0)真(非0)forexpr1expr3for语句一般应用形式:for(循环变量赋初值;循环条件;循环变量增值){
循环体语句;}说明:for语句中expr1,expr2,expr3类型任意,都可省略,但分号;不可省无限循环:for(;;)for语句可以转换成while结构expr1;while(expr2){
循环体语句;
expr3;}例用for循环求
#include<stdio.h>main(){inti,sum=0;for(i=1;i<=100;i++)sum+=i;printf("%d",sum);}例:#include<stdio.h>main(){inti=0;for(i=0;i<10;i++)putchar(‘a’+i);}运行结果:abcdefghij例:#include<stdio.h>main(){inti=0;for(;i<10;i++)putchar(‘a’+i);}例:#include<stdio.h>main(){inti=0;for(;i<10;)putchar(‘a’+(i++));}例:#include<stdio.h>main(){inti=0;for(;i<10;putchar(‘a’+i),i++);}#include<stdio.h>main(){inti,j,k;for(i=0,j=100;i<=j;i++,j--){k=i+j; printf("%d+%d=%d\n",i,j,k);}}#include<stdio.h>main(){charc;for(;(c=getchar())!='\n';)printf("%c",c);}#include<stdio.h>main(){inti,c;for(i=0;(c=getchar())!='\n';i+=3) printf("%c",i+c);}循环的嵌套三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环,但不能相互交叉嵌套循环的执行流程(1)while(){……while(){……}…...}(2)do{……do{……}while();…...}while();(3)while(){……do{……}while();…….}(4)for(;;){……do{……}while();……while(){……}…...}内循环外循环内循环嵌套循环的跳转禁止:从外层跳入内层跳入同层的另一循环向上跳转例循环嵌套,输出九九表1234567891234567892468101214161836912151821242791827364554637281……………..ij#include<stdio.h>intmain(){inti,j;for(i=1;i<10;i++)printf("%4d",i);printf("\n---------------------------------------\n");for(i=1;i<10;i++)for(j=1;j<10;j++) printf((j==9)?"%4d\n":"%4d",i*j);return0;}i<10printf假(0)真(非0)i=1j++j=1j<10真(非0)假(0)i++for(i=1;i<10;i++)for(j=1;j<10;j++)printf((j==9)?"%4d\n":"%4d",i*j);外循环内循环内循环
4.4辅助控制语句break语句功能:在循环语句和switch语句中,终止并跳出循环体或开关体说明:break只能终止并跳出最近一层的结构break不能用于循环语句和switch语句之外的任何其它语句之中
expr……break;……假(0)真(非0)whiledo……break;…...expr假(0)真(非0)whileexpr2……break;…...假(0)真(非0)forexpr1expr3switchexpr语句组1break;语句组2break;语句组nbreak;语句组break;…...const1const2constndefaultcase例break举例:输出圆面积,面积大于100时停止#include<stdio.h>#definePI3.14159intmain(){intr;floatarea;for(r=1;r<=10;r++){area=PI*r*r;if(area>100) break;printf("r=%d,area=%.2f\n",r,area);}}例break举例:小写字母转换成大写字母,直至输入非字母字符#include<stdio.h>intmain(){charc;while(1){c=getchar(); if(c>='a'&&c<='z') putchar(c-'a'+'A'); else break;}return0;}continue语句功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断仅用于循环语句中expr……continue;……假(0)真(非0)while真(非0)do……continue;…...expr假(0)whileexpr2……continue;…...假(0)真(非0)forexpr1expr3例求输入的十个整数中正数的个数及其平均值#include<stdio.h>intmain(){inti,num=0,a;floatsum=0;for(i=0;i<10;i++){scanf("%d",&a); if(a<=0)continue; num++; sum+=a;}printf("%dplusinteger'ssum:%6.0f\n",num,sum);printf("Meanvalue:%6.2f\n",sum/num);}程序举例t=1,pi=0,n=1.0,s=1当|t|1e-6pi=pi+tn=n+2s=-st=s/npi=pi*4输出pi分子:1,-1,1,-1…分母:1,3,5,7,...#include<stdio.h>#include<math.h>intmain(){ints=1;floatn=1.0,t=1,pi=0;while(fabs(t)>=1e-6){pi=pi+t;n+=2;s=-s;t=s/n;}pi=pi*4;printf(“pi=%10.6f\n”,pi);return0;}例求Fibonacci数列:1,1,2,3,5,8,……的前40个数f1=1,f2=1fori=1to20输出f1,f2f1=f1+f2f2=f2+f11534
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 租车牌照协议书
- 草场划分协议书
- 红砖协会协议书
- 婚介所入股合同协议书
- 承包给别人合同协议书
- 武侠剧影视合作协议书
- 接亲时搞笑结婚协议书
- 美军撤军协议书
- 婚房屋财产分配协议书
- 邮政理赔协议书
- 公司外聘法人协议书
- 人力资源管理视角下岗位胜任力素质模型的构建与优化
- 2025年4月自考00041基础会计学试题及答案含评分标准
- 经济学中的时间价值试题及答案解读
- 2025年平面设计师专业能力测试卷:平面设计作品集制作与展示策略分析技巧试题
- 承包矿山运输协议书
- 员工持股协议书合同
- 2025年人保财险陕西省分公司招聘(57人)笔试参考题库附带答案详解
- 聚合硫酸铁烘干机-LPGФ8150型喷雾干燥机-天然气热风炉
- 2025年平面设计师专业能力测试卷:平面设计行业规范与法规执行技巧分析试题
- 《铁路轨道维护》课件-扣件螺栓涂油作业
评论
0/150
提交评论