已阅读5页,还剩81页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,scanf函数(格式输入函数) 1.一般形式 scanf(格式控制符,地址列表) 作用:按格式控制符的要求将数据从终端传送到变量地址所指定 的内存空间 说明:“格式控制”的含义同printf函数; “地址表列”是由若干个地址组成的表列,可以是 变量的地址,或字符串的首地址;,scanf(“%d%d”,scanf函数中的“格式控制”后面应当是变量地址,而不是变量名。,复习,注意:,1)可以指定输入数据所占列数,系统自动按它截取所需数据,如: scanf(“%3d%3d”, 如果输入:a b c,复习,例:若输入12345和abc,以下程序的输出结果是( )。 main() int a; char ch; scanf(“%3d%3c”, A) 123, abc B) 123,4 C) 123,a D) 12345,abc,复习,B,例:鸡兔同笼,已知鸡兔总头数为h,总脚数为f,求鸡兔各多少只? 分析:设鸡x只 兔y只 则 解得,#include void main() int x,y,h,f; scanf(“%d%d”, ,运行情况: 928 head=9,foot=28 chicken=4,rabbit=5,复习,引例 计算函数值 需考虑输入x 判断x的值 根据x的值,计算y值 输出y值 显然顺序结构不能实现,须引入选择结构,#include #include void main() float x,y; scanf(“%f”, ,运行情况: 2 x=2.00 y=0.4546,判别选择结构程序设计,首先判别条件,若条件满足,程序执行a块,否则,执行b块;,条件成立?,执行a块,执行b块,成立,不成立,满足条件否,满足,不满足,执行a块,执行b块,传统流程图,N-S流程图,第五章 选择结构程序设计,要设计选择结构程序,要考虑两个方面的问题:一是在C语言中如何来表示条件,二是在C语言中实现选择结构用什么语句。 5.1 关系运算及其表达式 5.2 逻辑运算及其表达式 5.3 if语句 5.4 switch语句 5.5 选择结构程序举例,表示条件,实现选择结构,5.1 关系运算符和关系表达式 关系运算实质是比较运算,它是将两个值进行比较,判断其比较的结果是否符合给定的条件,其结果为真(1)或者为假(0)。 5.1.1关系运算符及其优先次序 C语言提供了6种关系运算符:, 大于 = 大于或等于,= 等于 != 不等于,优先级相同(高),优先级相同(低),说明:1)关系 运算符的优先级 低于算术运算; 2)关系运算符 的优先级高于赋 值运算符,关系运算符结合方向自左向右,5.1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称为关系表达式。下面为一些合法的关系表达式 x!=0 a+bb+c (a=3)(b=5) ab 关系表达式的结果只有两种:真或假;在C语言中,以1代表“真”,0代表“假”。 例:假设a=3,b=2,c=1,则: (ab)=c 结果为:表达式的值为1(真); d=ab 结果为:d 的值为1,表达式的值为1 ; f=abc 结果为:f 的值为0,表达式的值为0 ;,例:设a=1,b=-5,c=a,则: (1)ca+b (2)a=bc (3)a=bc,1,1,1,5.2逻辑运算符和逻辑表达式 5.2.1逻辑运算符及其优先次序 C语言提供三种逻辑运算符:,(1)& 逻辑与(与运算符) (2) | | 逻辑或(或运算符) (3) ! 逻辑非(非运算符),说明:1)“&”和“| |”为双目运算符,“!”为单目运算符; 2)逻辑运算的结果只有两种:真或假。逻辑运 算的真值表详细情况见书P89表5.1。,几种运算符的优先次序为:,! (非) (高) 算术运算符 关系运算符 &和| | 赋值运算符 (低),例:!a&b| |xy&c,结合方向除了!都是从左至右,5.2.2 逻辑表达式 给出逻辑运算结果: 数值1代表“真”,数值0代表“假” 判断一个量是否为“真” : 0代表“假”,非0代表“真” 例: 1)若a=4,则!a=0; 2)若a=4,b=5 则 a&b=1;a | | b=1;! a | | b=1; 3)53&2 | 84-!0的值为1; 4)c&d的值为1; 例:写出表达式的值a=2,b=0,c=-2.5 a*b|c !b&c 0|a 1&!a/c,说明: 1)对于“&”和“| |”逻辑运算符,在逻辑表达式求解中,有时并不需要执行所有的逻辑运算符。例如: a&b&c,如果a为假,就不必判别b和c的值; a | | b | | c,如果a为真,也不必判别b和c的值了。 所以,对于(m=ab)&(n=cd),如果“ab”的值为0,则n将不进行赋值运算而保留原值(Why?);,以下程序的输出结果是( )。 main() int a= -1, b=4, k; k=(+a0) A) 104 B) 103 C) 003 D) 004,一个重要的例子: 判断某一年是否为闰年的方法。而为闰年的条件是符合下面两者之一: (1)能被4整除,但不能被100整除; (2)能被4整除,又能被400整除; 写出逻辑表达式: 首先分析逻辑结构: 1、条件(1)和条件(2)的关系应该是“或”; 2、而每个条件内部应该为“与”关系; 3、条件(2)内,满足被400整除的一定满足被4整除,因此只需一个逻辑表达式即可; 所以最后的逻辑表达式为: (year%4=0)&(year%100!=0)| |(year%400=0) 根据运算符的优先级关系,上式可简化为: (year%4=0&year%100!=0)| |year%400=0,平年:!((year%4=0&year%100!=0)| |year%400=0),year%4!=0|(year%100=0&year%400!=0),练习写出c语言的表达式 |x|2 x1+a并yb 定义域,x2|x-2,x1+a&yb,(x-1)*(x-2) 0&x!=0,5.3 if 语句,5.3.1 if 语句的三种形式: 1. if (表达式) 语句 执行过程,如左图: if (xy) printf (“%d”,x);,表达式,语句,假(0),真(非0),xy,printf (“%d”,x),假(0),真(非0),if(xy) z=y; y=x; x=z; ,5.1 关系运算符和关系表达式 关系运算实质是比较运算,它是将两个值进行比较,判断其比较的结果是否符合给定的条件,其结果为真(1)或者为假(0)。 5.1.1关系运算符及其优先次序 C语言提供了6种关系运算符:, 大于 = 大于或等于,= 等于 != 不等于,优先级相同(高),优先级相同(低),说明:1)关系 运算符的优先级 低于算术运算; 2)关系运算符 的优先级高于赋 值运算符,关系运算符结合方向自左向右,5.1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称为关系表达式。 关系表达式的结果只有两种:真或假;在C语言中,以1代表“真”,0代表“假”。 例:假设a=3,b=2,c=1,则: (ab)=c d=ab f=abc,5.2逻辑运算符和逻辑表达式 5.2.1逻辑运算符及其优先次序 C语言提供三种逻辑运算符:,(1)& 逻辑与(与运算符) (2) | | 逻辑或(或运算符) (3) ! 逻辑非(非运算符),说明:1)“&”和“| |”为双目运算符,“!”为单目运算符; 2)逻辑运算的结果只有两种:真或假。逻辑运 算的真值表详细情况见书P89表5.1。,几种运算符的优先次序为:,! (非) (高) 算术运算符 关系运算符 &和| | 赋值运算符 (低),结合方向除了!都是从左至右,5.2.2 逻辑表达式 给出逻辑运算结果: 数值1代表“真”,数值0代表“假” 判断一个量是否为“真” : 0代表“假”,非0代表“真” 例: 1)若a=4,则!a 2)若a=4,b=5 则 a&b a | | b ! a | | b; 3)53&2 | 84-!0的值 4)c&d的值,5.3 if 语句,5.3.1 if 语句的三种形式: 1. if (表达式) 语句 执行过程,如左图: if (xy) printf (“%d”,x);,表达式,语句,假(0),真(非0),xy,printf (“%d”,x),假(0),真(非0),if(xy) z=y; y=x; x=z; ,2. if (表达式) 语句1 else 语句2 例如: if (xy) printf (“%d”,x); else printf(“%d”,y);,表达式,语句1,假(0),真(非0),语句2,xy,printf (“%d”,x),假(0),真(非0),printf(“%d”,y),3. if (表达式1) 语句1 else if (表达式2) 语句2 else if (表达式3) 语句3 else if (表达式m) 语句m else 语句n,表达式1,语句1,假,真,表达式2,语句2,真,假,表达式3,语句3,语句4,真,假,表达式4,语句5,假,真,例: if (number500) cost=0.15; else if (number300) cost=0.10; else if (number100) cost=0.075; else if (number50) cost=0.05; else cost=0;,number500,cost=0.15,假,真,cost=0.10,真,假,cost=0.075,cost=0.05,真,假,cost=0,假,真,number300,number100,number50,说明: 1)if 语句中在if后面都有表达式,一般为逻辑表达式或关系表达式,也可以为其它表达式;如果表示式的值为0,则按“假”处理,如果为非0,则按“真”处理; 例如:if (3) printf(“O.K.”); 直接执行打印“O.K.” if (a) printf(“%d”,a); 打印a的ASCII码97 2)注意在if 语句第二、三形式中每个语句后都有分号; if (number500) cost=0.15; else if (number300) cost=0.10; else if (number100) cost=0.075; else if (number50) cost=0.05; else cost=0;,3)在if和else后面可以只含一个内嵌的操作语句,也可以有多个操作语句,此时须用花括号“ ”将几个语句括起来成为一个复合语句。 例: if (a b) m = a ; printf(“The MAX number is %d”, m); else m = b; printf(“The MAX number is %d”, m); ,例5.1:输入两个实数,按代数值由小到大的次序输出这两个数; 分析:这是一个简单而重要的程序,算法的关键在与设 置一个中间交换变量,用于比较两个实数的大小 后进行次序的变换; 设a=8,b=5 a=b; b=a; 引入中间变量t t=a; a=b; b=t;,a,b,t,例5.1:输入两个实数,按代数值由小到大的次序输出这两个数; 分析:这是一个简单而重要的程序,算法的关键在与设 置一个中间交换变量,用于比较两个实数的大小 后进行次序的变换; 程序: main( ) float a, b, t; scanf(“%f,%f”, ,例5.2 输入3个数a、b、c,要求按由小到大的顺序输出; 分析: 1)对于任意两个数a、b: 若abc a cb bac bca cab cba,3)其伪代码算法为: if ab 将a和b对换 (对换之后,a比b小) if ac 将a和c对换 (对换之后,a比c小,a为最小) if bc 将b和c对换 (对换之后,b比c小,b为次小),经过三次比较和变换后:a为最小值,b为次小值,c为最大值。,例5.2 输入3个数a、b、c,要求按由小到大的顺序输出; 分析:此题算法比上题稍微复杂一些。上题为两个变量 比较大小,只需进行一次比较,而本题为三个变 量,则需进行三次比较。其伪代码算法为: if ab 将a和b对换 (对换之后,a比b小) if ac 将a和c对换 (对换之后,a比c小,a为最小) if bc 将b和c对换 (对换之后,b比c小,b为次小) 经过三次比较和变换后:a为最小值,b为次小值,c为最大值。 程序可写为:,#include void main( ) float a, b, c, t; scanf(“%f,%f,%f”, ,是,是,是,否,否,否,例:输入一个整数a,判断它是偶数还是奇数 分析:a%2=0 程序: #include void main() int a; printf (“input a numbei: ”); scanf(“%d”, ,例:设平面上一点M,其坐标为(x,y),若M落在圆心在坐标原点的单位园上,则置key=1,落在圆外key=2,落在圆内置key=0。,算法a: 若r1 key=2 若r=1 key=1 若r1 key=0 输出x,#include b #include void main() float x,y,r; int key; scanf(“%f%f”, ,例:设平面上一点M,其坐标为(x,y),若M落在圆心在坐标原点的单位园上,则置key=1,落在圆外key=2,落在圆内置key=0。,#include 算法b #include void main() float x,y,r; int key; scanf(“%f%f”, ,5.3 if 语句,5.3.1 if 语句的三种形式: 1. if (表达式) 语句 执行过程,如左图: if (xy) printf (“%d”,x);,表达式,语句,假(0),真(非0),xy,printf (“%d”,x),假(0),真(非0),复习,1以下程序实现:输入三个整数,按从大到小的顺序进行输出。请填空。 main() int x, y, z, c; scanf(“%d %d %d”, ,xy,复习,xz ,,yz,2. if (表达式) 语句1 else 语句2 例如: if (xy) printf (“%d”,x); else printf(“%d”,y);,表达式,语句1,假(0),真(非0),语句2,xy,printf (“%d”,x),假(0),真(非0),printf(“%d”,y),复习,3. if (表达式1) 语句1 else if (表达式2) 语句2 else if (表达式3) 语句3 else if (表达式m) 语句m else 语句n,表达式1,语句1,假,真,表达式2,语句2,真,假,表达式3,语句3,语句4,真,假,表达式4,语句5,假,真,复习,score90,printf(“A”),假,真,printf(“B”),真,假,printf(“C”),printf(“D”),真,假,printf(“E”),假,真,score80,score70,score60,例:评价学生的成绩 score90 A score80 B score70 C score60 D score60 E,复习,#include void main( ) int score; printf(“Input score:”); scanf(“%d”, ,复习,2下面程序的运行结果是 。 main() int a=2, b=3, c; c=a; if(ab) c=1; else if(a=b) c=0; else c=-1; printf(“%dn”,c); ,-1,复习,c=1,c=0,真,假,c=-1,假,真,ab,a=b,c=2,5.3.2 if语句的嵌套,一般形式: if( 表达式1 ) if ( 表达式2) 语句1 else 语句2 else if (表达式3 ) 语句3 else 语句4 注意:if与else的配对关系。 else总是与它上面的最近的尚未配对if 配对。,表达式,真,假,A,B,真,真,假,假,真,假,if( p1 ) 语句1 if(p1) else if(p2) 语句1 if ( p3) 语句3 else else 语句4 if( p3) 语句3 else 语句4 if( p1) if( p1) if ( p2) 语句1 if ( p2) 语句1 else 语句2 else 语句3 else语句3,if( ) if ( ) 语句1 else if ( ) 语句2 else 语句3,此if,else配对,此if,else配对,它们共同构成第 一个If的内嵌语句,加上一个花括符,限定了内嵌if语句的范围,可避免上述错误的出现,if( ) if ( ) 语句1 else if ( ) 语句2 else 语句3,比较: if(x0) if(x0) if(y0) printf(“1”); if(y0) printf(“1”); else printf(“2”); else printf(“2”);,x0,Y,y0,Y,N,N,printf(“1”),printf(“2”),x0,Y,y0,Y,N,N,printf(“1”),printf(“2”),if(ab) if(ac) if(ad) m=1; else m=2; else m=3;,问题:哪一个 else 和哪一个 if 相匹配?,规则:在嵌套的ifelse语句中,else总是与上面的离它最近的尚未配对的if 配对。,例5.3有一函数: 编一程序,输入一个x值,输出y值。算法a: 若x0 y=1 输出x 算法b: 输入x 若x0 y=1 输出y,main( ) int x,y; scanf(“%d”, ,算法2之变形算法的完整程序和简要流程图: main( ) int x,y; scanf(“%d”, ,x=0,Y,y = -1,x0,Y,N,N,y = 1,y =0,错误例之一的程序及流程图片段: y=-1 if (x!=0) if (x0) y=1; else y=0,x!=0,Y,y = -1,x0,Y,N,N,y = 1,y =0,此程序的错误在于当x=0时使y= -1,而产生错误的原因是认为第二行的if和第四行的else配对,书P96程序4也是 犯了同样的错误,5.3.3 条件运算符,1.条件运算符: ?和: /*惟一的三目运算符*/ 2.条件表达式的一般形式为: 表达式1? 表达式2:表达式3 如 ab?a:b x=0?1:sin(x)/x 3.执行过程: 1)计算表达式1的值 2)表达式1的值非零(真), 计算并返回表达式2的值, 否则计算并返回表达式3的值 4.运算顺序:高于赋值运算, 低于算术、关系、逻辑运算 如 y=x=0?1:sin(x)/x 等价于 if(x=0) y=1; else y=sin(x)/x;,表达式1,条件表达式 取表达式2的值,条件表达式 取表达式3的值,真(非0),假(0),5.条件运算符的结合方式为“自右向左”。 如:ab?a:cd?c:d相当于ab?a:(cd?c:d) 6.条件表达式不能取代一般的if语句,只有在if语句中内嵌的语句为赋值语句,且两个分支都给同一变量赋值时才能代替if语句。 if (ab) max=a; else max=b; 7.条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。表达式2和表达式3的类型也可以不同,而表达式的值取它们之中较高的类型。 例1:设x为整型变量,有x?a:b 例2: xy?1:1.5,当xy时,表达式的值转换为1.0,例:读程序,写出程序完成功能 #include void main( ) int a,b,max; scanf(“%d,%d”, printf(“max=%dn”,ab?a:b),思考:n个数中找出最大或最小的数,例 5.4 输入一个字符,判断它是否为大写字母,如果是,将它转换为小写字母;如果不是,不转换。然后输出最后得到的字符。 分析:判断一个字符ch是否为大写字母的方法 ch=A ,对于两分支,并对同一个变量赋值用条件表达式比较方便,5.4 switch语句,一、一般形式: switch (表达式e) case 常量表达式c1:语句1 case 常量表达式c2:语句2 case 常量表达式cn:语句n default: 语句n+1 ,二、执行过程: 1.计算表达式e的值 2.若与常量表达式ci的值一致,则从语句i开始执行。直到遇到break语句或switch语句中的 3.若与任何常量表达式值不一致时,则执行default语句或后续语句。,其中表达式e可以是整型、字符型、枚举型 常量表达式的类型必须与表达式e类型一致(整型与字符型通用),注意: (1)常量表达式ci仅其语句标号的作用,不做求值判断 (2)常量表达式的值是唯一的,没有先后次序 (3)多个case语句可以共用一组执行语句,产生这样结果的原因是: “case常量表达式”只是起语句标号作用,并不是在该处进行条件判断。因此,根据switch后面表达式的值找到匹配的入口标号,就从此开始执行下去,不再进行判断。而这种流程控制并不是我们通常所希望的。,我们通常情况下,希望在执行一个case分支后,使流程跳出switch结构,终止switch语句的执行。一般我们使用break语句来达到此目的。因此,我们通常使用的switch语句的一般形式为: switch (表达式) case 常量表达式1:语句1; break; case 常量表达式2:语句2 ; break; case 常量表达式n:语句n ;break; default:语句n+1 最后一个分支可以不加break语句。 这样,switch语句的流程图就改为:,表达式= 常量表达式1,表达式= 常量表达式2,表达式= 常量表达式n,语句1,语句2,语句n,default,语句n+1,break,break,break,break,例: switch(x) case 1: printf(“ 1”); break; case 2: printf(“ 2”); break; default:printf(“default”); 提问:case1、2没有break结果怎样,5.3.2 if语句的嵌套,一般形式: if( 表达式1 ) if ( 表达式2) 语句1 else 语句2 else if (表达式3 ) 语句3 else 语句4 注意:if与else的配对关系。 else总是与它上面的最近的尚未配对if 配对。,表达式,真,假,A,B,真,真,假,假,真,假,复习,if( ) if ( ) 语句1 else if ( ) 语句2 else 语句3,此if,else配对,此if,else配对,它们共同构成第 一个If的内嵌语句,加上一个花括符,限定了内嵌if语句的范围,可避免上述错误的出现,if( ) if ( ) 语句1 else if ( ) 语句2 else 语句3,复习,复习,例:当a=1,b=3,c=5,d=4时,执行完下面一段程序后x的值是( )。 if(ab) if(cd) x=1; else if(ac) if(bd) x=2; else x=3; else x=6; else x=7; A) 1 B) 2 C) 3 D) 6,B,复习,5.3.3 条件运算符,1.条件表达式的一般形式为: 表达式1? 表达式2:表达式3 如 ab?a:b x=0?1:sin(x)/x 2.执行过程: 1)计算表达式1的值 2)表达式1的值非零(真), 计算并返回表达式2的值, 否则计算并返回表达式3的值 3.运算顺序:高于赋值运算, 低于算术、关系、逻辑运算,表达式1,条件表达式 取表达式2的值,条件表达式 取表达式3的值,真(非0),假(0),复习,例:若运行时给变量x输入12,则以下程序的运行结果是( )。 main() int x,y; scanf(“%d”, A) 0 B) 22 C) 12 D) 10,A,复习,5.4 switch语句,一、一般形式: switch (表达式e) case 常量表达式c1:语句1 case 常量表达式c2:语句2 case 常量表达式cn:语句n default: 语句n+1; ,二、执行过程: 1.计算表达式e的值 2.若与常量表达式ci的值一致,则从语句i开始执行。直到遇到break语句或switch语句中的 3.若与任何常量表达式值不一致时,则执行default语句或后续语句。,复习,产生这样结果的原因是: “case常量表达式”只是起语句标号作用,并不是在该处进行条件判断。因此,根据switch后面表达式的值找到匹配的入口标号,就从此开始执行下去,不再进行判断。而这种流程控制并不是我们通常所希望的。,复习,我们通常情况下,希望在执行一个case分支后,使流程跳出switch结构,终止switch语句的执行。一般我们使用break语句来达到此目的。因此,我们通常使用的switch语句的一般形式为: switch (表达式) case 常量表达式1:语句1; break; case 常量表达式2:语句2 ; break; case 常量表达式n:语句n ;break; default:语句n+1 最后一个分支可以不加break语句。 这样,switch语句的流程图就改为:,复习,表达式= 常量表达式1,表达式= 常量表达式2,表达式= 常量表达式n,语句1,语句2,语句n,default,语句n+1,break,break,break,break,复习,例:要求按照考试分数的登记打印出成绩等级。 include void main( ) int score; printf(“Input score:”); scanf(“%d”, ,如果90 score100,则将连续输出: A B C D E,5.5 程序举例,编写程序的一般步骤: 1)分析题意; 2)根据题意划出N-S流程图; 3)写出伪代码; 4)写出程序代码; 5)调试程序。 例5.5 写程序,判断某一年是否闰年。 闰年:year能被4整除,但不能被100整除;或被400整除 此题中为了程序书写方便,我们定义一个整型变量leap作为是否闰年的标志。 划出N-S流程图。,main( ) int year,leap; scan
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年基金从业资格证之证券投资基金基础知识考试题库及完整答案(全优)
- 2025年美术编辑招聘题库及答案
- 小学说明方法讲解
- 2025版痔疮的症状分析与护理培训
- 供应链管理教案二
- 2025年学生骨干考试题目及答案
- 血栓病症状解析及护理方法
- 餐饮业新员工安全培训
- 2025年《土地复垦》试题及答案
- 2025版糖尿病并发症症状解读及护理措施
- 2025-2026学年大象版(2024)小学科学三年级上册(全册)教学设计(附目录P208)
- 湖北省武汉市武昌部分学校2023-2024学年七上期中联考数学试题(原卷版)
- 老旧小区改造施工噪音控制实施方案
- 2025年法官入额遴选政治理论真题及答案
- 输电线路运行规程课件
- 注册港口与航道工程公共基础考试历年真题及答案
- 雨污分流处理教学课件
- 三礼教学课件
- 沙丁胺醇药剂科培训课件
- 精密空调基础知识培训课件
- 妇科子宫内膜异位症课件
评论
0/150
提交评论