您好,欢迎访问三七文档
第4讲选择结构选择结构与条件判断关系运算和逻辑运算if语句条件运算符与条件表达式switch语句和break语句语句标号和goto语句教学目标熟悉C语言的逻辑值表示、关系运算和逻辑运算;掌握if语句及其运用(包括单分支、双分支、嵌套);掌握switch语句的用法,能构建相应表达式、合理使用break语句;熟悉条件表达式,会实现选择判断功能;了解语句标号和goto语句。重点:关系运算和逻辑运算、if语句、switch语句、条件表达式难点:关系运算和逻辑运算、if语句的嵌套、switch语句1.选择结构与条件判断在生活有很多需要判断和选择的情景:如果要早读,就得早起床如果某一门课程总评不及格,就要重考若生病了,就要去看医生……处理这些问题,关键在于进行条件判断C语言的逻辑值(即是条件判断的结果)逻辑值只有两个:分别用“真”、“假”表示。早期的C语言没有专门的逻辑值,而是用非0表示“真”,用0表示“假”(注意:计算机输出“真”时用1表示),后来的C99有了表示逻辑的bool型,分别用true、false表示“真”、“假”,不过一些系统还不支持。2.关系运算和逻辑运算运算符(有6个):(小于)、=(小于等于)、(大于)、=(大于等于)、==(等于)、!=(不等于)运算结果:逻辑值0或1(比较两个操作数的大小)(1)关系运算符与表达式关系表达式:由一个关系运算符连接前后两个表达式而构成的式子,格式:操作数1关系运算符操作数2说明:操作数可以是基本数据类型;比较大小时,数值型以其大小、英文字母以其ASCII码、汉字以机内码为准进行比较,例如:‘a’‘A’的值为真(即为1)。说明:(续)浮点数一般不作相等(==)判断。请问为什么?结合性:从左到右优先级:、=、、=高于==、!=算术运算符高于关系运算符高于赋值运算符;验证关系运算符的优先级inta=3,b=2,c=1;a+bcc!=aba=b==c(a+b)c1c!=(ab)0a=(b==c)0不同类型的操作数‘a’-31097-3101运算与反运算:和=、和=、==和!=,每组中的两个运算符是互为反运算,当一种运算结果为1时,它的反运算结果必然为0操作数:逻辑值(0,或非0)运算结果:1(“真”),0(“假”0)运算符:有3个!(逻辑非,单目):“真”(非0)变“假”(0),“假”(0)变“真”(1);&&(逻辑与,双目):只有同时为“真”(非0)时结果才为“真”,否则均为“假”;||(逻辑或,双目):只有同时为“假”(0)时结果才为“假”,否则均为“真”(2)逻辑运算符与表达式运算规则:逻辑表达式:逻辑型数据和逻辑运算符连接而成的式子结合性:从左到右优先级:!高于算术运算高于关系运算高于&&高于||高于赋值运算ab!aa&&ba||b00100011011000111011请注意:对于参加逻辑运算的操作数,只要其值不为0就认为是“真”,只有0值认为是“假”;数学式:0x5该如何书写表达式呢?x0&&x5例:intx=1;请问下列表达式的值:①x=0&&x=2②x-3||x3③!x三个等价式子:!!a==a;!(a&&b)==!a||!b!(a||b)==!a&&!b(x=0)&&(x=2)1(x-3)||(x3)00怎样去构造逻辑表达式?①年龄在13至17岁之内②年龄小于12或大于65③退休条件(男:60,女:55)age=13&&age=17age12||age65(gender==‘m’&&age=60)||(gender==‘f’&&age=55)④字符ch是英文字母或数字字符(ch=‘A’&&ch=‘Z’)||(ch=‘a’&&ch=‘z’)||(ch=‘0’&&ch=‘9’)⑤写出表示“闰年”的条件思路:year表示“年”,满足下列条件之一的年份是闰年(A)能被4整除但不能被100整除;(B)能被4整除且能被400整除表达式:(A)(year%4==0)&&(year%100!=0)(B)(year%4==0)&&(year%400==0)表达式(B)可以简化为(year%400==0)表达式(A)和(B)用“或”||连接(条件之一)即闰年:(year%4==0)&&(year%100!=0)||(year%400==0)不是闰年:!((year%4==0)&&(year%100!=0)||(year%400==0))问题:设学生有五门课程,sc1、sc2、sc3、sc4、sc5表示课程的成绩,请问:怎样表示下列条件:(1)平均成绩80分及80分以上;(2)每门成绩均80分及80分以上;(3)没有一门成绩在80分或80分以上;表达式“短路”现象:在形如:□&&□&&□&&…的表达式中,只要前面有一个表达式□的值为“假”,则整个表达式的值就为“假”,此后各表达式不再计算,因为它们的值无论是“真”还是“假”,都不会影响整个表达式的运算结果;例如:a=0,b=1,计算表达式:a++&&b++先取a值0,a再增加1,表达式值为0,b值不变在形如:□||□||□||…的表达式中,只要前面有一个表达式□的值为“真”,则整个表达式的值也就为“真”,后面各表达式的值也不必再计算,同样的理由是后续表达式的值不会影响整个表达式的运算结果例如:a=1,b=1,计算表达式:a++||b++先取a值1,a再增加1,表达式值为1,b值不变“短路”现象带来的直接结果是后续表达式没有进行运算,要避免这种情况的发生,可使用位运算符&、|来取代&&、||。3.if语句if(表达式)语句1[else语句2](1)基本形式说明:表达式:可以是算术表达式、关系表达式,逻辑表达式,赋值表达式,字符表达式等,其值为0或非0;表达式外的()不能省略;语句1、语句2后应加分号(;),如果表达式为非0就执行语句1,表达式为0就执行语句2,若无语句2就不执行;语句1、语句2可以是由多条语句构成的复合语句,复合语句用{}括住。if(表达式)语句1(2)单分支例1:输入两个实数,按由小到大的顺序输出这两个数思路:设输入的两数为a、b,可能是:ab,a=b,ab。①如果能保证a=b,直接输出a、b即可;需要判断a、b值大小,若是ab,就得交换a、b值;②交换a、b值方法:借助一个临时变量t,如下图所示:★●a互换前●★ab互换后abt★(1)t=a;(2)a=b;●(3)b=t;★●★b#includestdio.hintmain(){floata,b,t;printf(请输入两个实数:);scanf(%f%f,&a,&b);if(ab){t=a;a=b;b=t;}printf(从小到大:%f,%f\n,a,b);return0;}例2:输入3个数a,b,c,要求按由小到大的顺序输出#includestdio.hintmain(){floata,b,c,t;printf(请输入三个实数:);scanf(%f%f%f,&a,&b,&c);if(ab){t=a;a=b;b=t;}if(ac){t=a;a=c;c=t;}if(bc){t=b;b=c;c=t;}printf(从小到大:%f,%f,%f\n,a,b,c);return0;}思路:①a、b比较,较小值放入a,较大值放入b;②a、c比较,较小值放入a,较大值放入c,这样a就是最小值;③b、c再比较,较小值放入b,较大值放入c。最后,得到a、b、c从小到到顺序。(3)双分支例3:求ax2+bx+c=0方程的根。a、b、c由键盘输入。if(表达式)语句1else语句2思路:先计算判别式disc=b2-4ac的值,需要考虑disc=0和disc0情况,这是第3讲例4的改进版本。#includestdio.h#includemath.hintmain(){doublea,b,c,disc,p,q,x1,x2;printf(请输入一元二次方程的系数a、b、c(用空格分开):);scanf(%lf%lf%lf,&a,&b,&c);disc=b*b-4*a*c;printf(一元二次方程的系数:a=%f,b=%f,c=%f\n,a,b,c);if(disc=0){p=-b/(2.0*a);q=sqrt(disc)/(2.0*a);x1=p+q;x2=p-q;printf(一元二次方程的根:x1=%7.2f,x2=%7.2f\n,x1,x2);}else{printf(一元二次方程无实数根\n);}return0;}程序代码思路:先输入x值,再用两分支if语句计算y值。例4:输入x值,输出分段函数的值。#includestdio.hintmain(){doublex,y;printf(请输入x的值:);scanf(%lf,&x);if(x0){y=x-1;}else{y=x+5;}printf(x=%f,y=%f\n\n,x,y);return0;}(4)多分支(即if嵌套语句)if(表达式1)else在if子句中嵌套具有else子句的if语句if(表达式2)语句1;else语句2;if(表达式3)语句3;else语句4;if(表达式1)else语句3if(表达式2)语句1;else语句2;在if子句中嵌套不含else子句的if语句if(表达式1)else语句2{if(表达式2)语句1;}表达式1、表达式2同时为真时才执行语句1;表达式1为假时执行语句2请注意:在if子句中的一对{}不可缺少。因为C语言规定:else子句总是与前面最接近的不带else子句的if语句相结合,与书写格式无关。if(表达式1)else语句2if(表达式2)语句1;相当于if(表达式1)if(表达式2)语句1;else语句2表达式1、表达式2同时为真时才执行语句1;表达式1为真、表达式2为假时才执行语句2在else子句中嵌套if语句(续)在else子句中嵌套多重if…else…语句,形成多分支语句,结构清晰,非常好用。相当于if(表达式1)语句1;elseif(表达式2)语句2…….elseif(表达式n)语句nelse语句n+1if(表达式1)语句1elseif(表达式2)语句2;else……if(表达式n)语句n;else语句n+1;说明:要执行语句k,这意味着:表达式1、…、表达式k-1均为假,但表达式k为真;要执行语句n,这意味着:表达式1、…、表达式n均为假。采用的表达式不同,构造的嵌套语句不同//程序1#includestdio.hintmain(){doublex,y;printf(请输入x的值:);scanf(%lf,&x);if(x=2){if(x-2)//x=2且x-2即:x-2{y=-x*x+4;}else{//x=2且x=-2即:-2=x=2y=0;}}else{//x2y=x*x-4;}printf(x=%f,y=%f\n\n,x,y);return0;}例5:输入x值,输出分段函数的值。//程序2#includestdio.hintmain(){doublex,y;printf(请输入x的值:);scanf(%lf,&x);if(x-2)//x-2y=-x*x+4;elseif(x=2)//x=-2且x=2,即-2=x=2y=0;else//x2y=x*x-4;printf(x=%f,y=%f\n\n,x,y);return0;}程序2更简洁在else子句中嵌套if语句嵌套的if语句带elseif(表达式1)语句1elseif(表达式2)语句2;else语句3;相当于if(表达式1)语句1;elseif(表达式2)语句2esle语句3嵌套的if语句不带elseif(表达式1)语句1elseif(表达式2)语句2;相当于if(表达式1)语句1;elseif(表达式2)语句2例6:输入
本文标题:第4讲 选择结构
链接地址:https://www.777doc.com/doc-3477100 .html