【文档说明】c语言课件第四章.ppt,共(38)页,423.535 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44595.html
以下为本文档部分文字说明:
共39页第1页第四章C语言程序设计共39页第2页本章要点:•正确使用关系表达式和逻辑表达式•掌握用if语句和switch语句实现选择结构•掌握条件运算符的使用共39页第3页选择语句是控制程序执行选择结构的语句是程序实现逻辑判断的
唯一形式根据学生分数判断是否及格根据学生分数如何进行分级一元二次方程求解自然语言:如果…那么…否则…C语言:分支语句如何解决?为什么要用选择结构?共39页第4页4.1关系运算符和关系表达式4.1.1关系运算符1.关系运算符关系运算是进行比较
大小的运算,并产生运算结果1(真)或0(假)。C语言中的关系运算符有6种:<、<=、>、>=、==、!=优先次序:前4种同级,高于后2种(后2种同级)关系运算符的结合性为从左到右;算术运算符(高)关系运算符赋值运算符(低)如:3>2a<b注意!共39页第5页4.1.2关系表
达式定义:用关系运算符将两个表达式连接起来的式子。形式:表达式1关系运算符表达式2如:(a>b)>(b<c)、‘a’<‘b’、x>y、s+f>d关系表达式的值为逻辑值“真”或“假”.注意:C语言没有逻辑型数据,关系表达式的真、假是以数值“1”代表“真”,以“0”代表“假”。[例]:设a=3,b
=2,c=1,求下列表达式的值?c>b值为0(假)(a-b)==1值为1(真)(b+c)<a值为0(假)a=5>3>4a的值为0共39页第6页练习1.设有变量定义intz;分析z%2==0的值?如果z为偶数,则z%2==0的值为1;否则z为
奇数,则z%2==0的值为0;因此,z%2==0是断言“z是偶数”的c语言判断式。2.x与y的个位数字相同x%10==y%10如何判断十位数上数字相同?共39页第7页4.2.1逻辑运算符C语言提供三种逻辑运算符
:&&(逻辑与)、||(逻辑或)、!(逻辑非)说明:(1)“&&”和“||”是“双目(元)运算符”,它要求有两个操作数。(2)“!”是“单目(元)运算符”,只要求有一个运算量。(3)优先级次序:!&&||4.2逻辑运算符和逻辑表达式a&&ba、b均为真,则a&
&b为1(真)。a||ba、b之一为真,则a||b为1(真)。!a若a为真,则!a为假。共39页第8页运算符的优先级!(非)(高)算术运算符关系运算符&&和||赋值运算符(低)共39页第9页4.2.2逻辑表达式用逻辑运算符将关系表达式或
逻辑量连接起来的式子.规定:判断一个逻辑量为“真、假”的方法:“非0”代表“真”,“0”代表“假”[例]:写出1<x<10的逻辑表达式?x>1&&x<101<x<10[例]:5>3&&2||8<4-!0
[例]:a+b<c&&c==d[例]:a-!d||m>n+3[例]:(m=a<b)&&(n=c-d)若a=3,b=2,c=6,d=5,n=8[例]:a||b||c如果a为真,就不再判断b和c了强调:在逻辑表达式的求解过
程中,只要能确定表达式的值,就不继续向下求解其他的值了.((a+b)<c)&&(c==d)(a-(!d))||(m>(n+3))(5>3)&&2||((8<(4-(!0)))共39页第10页xyx&&yx|
|y!x000010非0011非00010非0非0110逻辑运算真值表共39页第11页根据给定的表达式决定要执行的操作。执行过程:计算表达式的值,判断表达式值为真时执行语句组,否则跳过语句继续执行后续语句。语句格式:if(表达式){语句组;}例
:if(a>b)x=a;1.单选择if语句语句零表达式非零表达式可以是关系式或逻辑式4.3选择语句4.3.1if语句共39页第12页2.双选择if语句语句格式:if(表达式){语句组1;}else{语句组2;}功能:计算表达式的值,当表达式值为
非零时执行语句组1,否则执行语句组2。APB非零零共39页第13页3.控制条件的表示#include“stdio.h”main(){inta,b,c=25;a=10>c;b=a==a;printf(“a=%d,b=%d,”,a,b);if(
c)printf(“c=%d”,c);}运行结果:a=0,b=1,c=25共39页第14页控制条件的几种形式:if(a==0)k=1;if(a=0)k=1;if(a!=0)k=1;if(a)k=1;if(1)k=1;思考a取不同的值时,语句的执行情况?提示:不要用“==“比较两个浮点数是否
相等。可使用如下方式:if(fabs(a-b)<1.e-6)fabs(x)是库函数,表示求x的绝对值共39页第15页#include“stdio.h”main(){inta,b,s;scanf(“%d%d”,&a,&b);s=a;if(a
<b)s=b;s*=s;printf(“%d\n”,s);}例1运行时输入:34输出:16共39页第16页指出下列程序的输出结果:#include“stdio.h”main(){inta;scanf("%
d",&a);if(a>50)printf("%d",a);if(a>40)printf("%d",a);if(a>30)printf("%d",a);}程序运行:输入58,输出?585858输入30,输出?例2共39页第17页if(a>=60)printf(“及格\n”);elseprint
f(“不及格\n”);main(){inta;scanf(“%d”,&a);if(a<60)printf(“%d\n”,a);}输出不及格的成绩例3共39页第18页#include“stdio.h”main(){inta,b,max;printf(
"Inputaandb=");scanf("%d%d",&a,&b);if(a>b)max=a;elsemax=b;printf("Themaxofaandbis:%d\n",max);}a>b?max=bmax=a非00求a和b两数中较大的一个。例4共
39页第19页#include“stdio.h”main(){inta,b,t;printf("Inputaandb=");scanf("%d%d",&a,&b);if(a>b){t=a;a=b;b=t;}p
rintf(“%d,%d\n",a,b);}按由小到大的顺序输出两个数。例5共39页第20页有关if语句的说明表达式后面不加分号语句之后有分号else不是语句,不能单独使用当if后有多个执行语句时,必须用{}将多个语句括起来,构成一个复合语句,{}之外不必有分号。共39页第21
页4.3.2if语句的嵌套格式:if(表达式)if(表达式1)语句11;else语句12;elseif(表达式2)语句21;else语句22;在if语句的“语句1”或“语句2”中又包含着if语句判断表达式的
值,若为非0,再判断表达式1的值,非0执行语句11,否则执行语句12若表达式的值为0,再判断表达式2的值,非0执行语句21,否则执行语句22功能:外if内嵌if共39页第22页下列程序段表示的数学式子?y=-1;if(x!=0)if(x>0)y=2*sin(x);elsey=0;程序
段表示的数学式1:0(x<0)y=-1(x=0)2sinx(x>0)讨论:给第二个if行加{}后表示的数学式?}{程序段表示的数学式2:-1(x<0)y=0(x=0)2sinx(x>0)数学式1程序可
表示为:y=-1;if(x!=0){if(x>0)y=2*sin(x);elsey=0;}思考强调:if和else可成对出现,也可不成对出现,每个else都与距其最近的if配对。共39页第23页if语句的常用格式:if(表达式1)语句1elseif(表达式
2)语句2elseif(表达式3)语句3······elseif(表达式m)语句melse语句n仅执行表达式为真的elseif后的内嵌语句,若所有的表达式值都为0,则执行最后一个else后的内嵌语句.共39页第24页已知编写程序,输入一个x的值,输出y值。
010001)(xxxxy程序为:#include“stdio.h”main(){intx,y;scanf(“%d”,&x);if(x<0)y=-1;elseif(x==0)y=0;elsey=1;printf(“x=%d,y=%d\n
”,x,y);}例6共39页第25页switch语句该语句为开关语句,适合解决多分支的情况。格式:switch(表达式){case常量表达式1:语句序列1;case常量表达式2:语句序列2;„„case常量表达式n:语句序列n;[default:语句序列n+1;]}说明:执
行顺序如下:4.3.2switch语句问题:为什么引出switch语句?可以是一条语句,也可以是多条语句。多条语句不必用括号括起来。起语句标号的作用,不进行条件判断,在执行完某个case后的语句序列后,将自动转移到下一个case继续执行。可以是整型、字符型
。共39页第26页a.计算表达式的值;b.找到与表达式的值相同的case常量表达式,执行该case后边的语句序列,之后依次往下执行语句块。表达式语句序列1语句序列2语句序列n语句序列n+1······共39页第27页每个语句序列的最后一条语句后增加break语句,执行流程为:表达式语
句序列1语句序列n······语句序列n+1语句序列2共39页第28页根据考试成绩的等级打印出百分制分数段。采用多分支情况程序段:switch(grade){case'A':printf(“85~100\n”);br
eak;case'B':printf(“70~84\n”);break;case'C':printf(“60~69\n”);break;case'D':printf(“<60\n”);break;default:printf(“error”);}若grade
=„A‟时,输出结果为?当grade=„B‟时,输出结果为?例7共39页第29页流程图为:grade输出“85-100”输出“<60”输出“60-69”输出“error”输出“70-84”共39页第30页说明:case和default
的次序可以交换。例:#include“stdio.h”main(){intc=3;switch(c){case1:c++;default:c++;case2:c++;}printf("c=%d\n",c);}c
ase3:c++;共39页第31页多个case可以执行同一个语句序列。switch(c=getchar()){case'y':case'Y':printf(“Youareright.\n”);}共39页第
32页条件运算符:唯一的三目操作符,要求有三个操作对象。格式:表达式1?表达式2:表达式3功能:判断表达式1的值,该值为“非0”,则取表达式2的值,为“0”时,取表达式3的值。如:max=a>b?a:b若
a=3,b=2,则max=?说明:(1)条件运算符优于赋值运算符。(2)条件运算符的结合方向为“自右向左”。如:当a=1,b=2,c=3,d=4时,表达式a>b?a:c>d?c:d,值为:?如:若x=1,y=0,a=3,b=-3表达式(y>x?a:b)&&a+b值为:?404.4条件
运算符共39页第33页(3)条件表达式中的表达式1的类型可以与表达式2和表达式3的类型不同。条件表达式值的类型为二者中较高的类型。如:x>y?1.2:6,当x>y成立时条件表达式的值为1.2,否则为实型数据6.0。c
=x>y?1:„s‟,当x>y成立时c=1,否则c=„s‟。共39页第34页if(y<0)x=-y;elsex=y;(y<0)?x=-y:x=y;等价等价x=(y<0)?-y:y;说明:ifelse可以完成与条件运算符
(?:)完全相同的任务,并且可以进行相应的转换。共39页第35页将输入的大写字母转换为小写字母.main(){charch;scanf(“%c”,&ch);ch=(ch>=‘A’&&ch<=’Z’)?(ch+32):ch;printf(“%c”,ch)}输入A输出a例8
共39页第36页判别某一年year是否闰年。闰年条件:能被4整除,但不能被100整除,或能被4整除,又能被400整除。判断闰年的逻辑表达式为:(year%4==0&&year%100!=0)||year%400==0)判断非闰年的逻辑表达式为:(year%4
!=0)||(year%100==0&&year%400!=0)共39页第37页main()/*输入今天的日期,显示明天的日期。*/{intyear,month,day;scanf("%d%d%d",&ye
ar,&month,&day);switch(month){case1:case3:case5:case7:case8:case10:case12:if(day<31)day=day+1;elseif(month==1
2){year=year+1;month=1;day=1;}else{month=month+1;day=1;}break;case4:case6:case9:case11:if(day<30)day=day+1;else{month=month+1;day=1;}break;
case2:if(day<28)day=day+1;elseif((year%4==0&&year%100!=0)||(year%400==0)){if(day==29){month=month+1;day=1;}elseday=day+1;}elseif(day==28){mont
h=month+1;day=1;}break;default:printf("error!\n");month=-1;break;}if(month!=-1)printf("tomorrowis:%d%d%d\n",year,m
onth,day);}共39页第38页小结•if语句实现单分支•if-else语句实现两个分支•switch-break语句实现多分支•嵌套if语句可以实现复杂的分支结构(注意else与最近的if结合)