程序设计基础(上)张立红13405330459(88028)zlh13405330459@163.com9#501前面已讨论程序结构顺序结构选择结构循环结构本次讨论后面讨论第4章基本控制结构第4章基本控制结构4.1顺序结构4.2选择结构4.3循环结构4.4控制结构应用举例4.2选择结构--P63选择结构:根据选择条件执行某些语句,或不执行某些语句;例如:求解ax2+bx+c=0根据b2-4ac0、0、==0分别有2个、1个或0个实根。条件表示:关系表达式或逻辑表达式。4.2.1关系运算与逻辑运算--P641.关系运算符和关系表达式关系运算符含义优先级结合性大于4个关系运算符优先级相同,但比下面的优先级高。左结合性=大于或等于小于=小于或等于==等于关系运算符优先级相同,但比上面的优先级低。!=不等于关系运算符{{高低关系表达式使用:例:a+bc–dx3/2'a'+1c–i–5*j==k+1注意:①C语言用0表示假,非0表示真;②一个关系表达式的值只能是0或1假真关系运算符的优先级例如:ca+b等价于:a==b+c等价于:a=bc等价于:c(a+b)a==(b+c)a=(bc)算术运算符关系运算符赋值运算符高低关系运算符应用举例例:inta=3,b=2,c=1,d,f;求表达式的值。①ab②(ab)+c③b+ca④d=ab⑤f=abc//d的值是1,表达式值是1//f的值是0,表达式值是0//表达式值1//表达式值2//表达式值02.逻辑运算符和逻辑表达式--P64逻辑运算符:逻辑运算符含义结合性优先级关系!---单目逻辑非,表示相反右结合性高低&&--双目逻辑与,表示并且左结合性||--双目逻辑或,表示或者逻辑运算取值:!----取反&&---全为真才是真||---全为假才是假2.逻辑运算符应用例:inta=4,b=5;求下列表达式的的值。①!a②a&&b③a||b④!a||b⑤'c'&&0//值为0//值为1//值为1//值为1//值为0逻辑运算符的优先级!高算术运算符关系运算符&&、||赋值运算符低例如:①a=x&&x=b等价于:②ab&&xy等价于:③a==b||x==y等价于:④!a||ab等价于:⑤!ab等价于:⑥c=a||b等价于:⑦a||7&&b+8等价于:(a=x)&&(x=b)(ab)&&(xy)(a==b)||(x==y)(!a)||(ab)(!a)bc=(a||b)(a||7)&&(b+8)2.逻辑运算符和逻辑表达式建议:在较复杂的表达式中,用()处理运算符优先级。3.短路原则--P66由&&和||连接的表达式按照从左至右的顺序求值,在求值过程中,一旦可以确定表达式的值,求值过程就立即停止-----短路原则。短路原则应用举例:例1:a&&b&&c例2:a||b||c例3:inta=1,b=2,c=4,d=3,m=1,n=0;则:(m=ab)&&(n=cd)//结果:m是0,n是0;表达式是0//只在a为真时,才判别b的值;只在a、b都为真时,才判别c的值//只在a为假时,才判别b的值;只在a、b都为假时,才判别c的值运算符总结-----运算符优先级的记忆规则逗号运算符的优先级最低,其次是赋值运算符。只有单目运算符、赋值运算符和条件运算符具有右结合性,其它运算符都是左结合性。双目运算符中,算术运算符的优先级最高,关系运算符优先级居中,逻辑运算符的优先级最低。单目运算符高算术运算符关系运算符逻辑运算符条件运算符赋值运算符逗号运算符低4.2选择结构4.2.1关系运算和逻辑运算4.2.2if语句4.2.3if语句的嵌套4.2.4switch语句4.2.2if语句---P671、if语句的单分支形式格式:执行流程:语句1表达式TFif(表达式)语句1;功能:1)首先计算表达式的值;2)若表达式的值非0(真),则执行语句1。3)若表达式的值是0(假),则跳过语句1。例1:求整数的绝对值—ACM(1117)①#includestdio.h②intmain()③{intx,y;④scanf(%d,&x);⑤y=x;⑥if(x0)y=-x;⑦printf(%d\n,y);⑧return0;⑨}真假x0y=-x输出yy=x例2:输入三个数,输出它们的最大者—ACM(1154)分析:采用打擂法解决该问题1)“擂主”max存放所有数中的最大者;2)“打擂”的数据都存放在变量中;3)第一个“上台”的数是初始擂主;4)剩余的数依次与max作比较,最终留在max中的就是最大值。①#includestdio.h//输出3个数中的最大数—ACM(1154)。②intmain()③{inta,b,c,max;④scanf(%d%d%d,&a,&b,&c);⑤max=a;//第一个数是擂主⑥if(bmax)max=b;⑦if(cmax)max=c;⑧printf(max=%d\n,max);⑨return0;⑩}例3:输入3个整数,将这3个数由大到小输出—ACM(1118)分析:①若xy,x与y对换-----(x是x、y中的大数)②若xz,x与z对换-----(x是3数中最大数)③若yz,y与z对换-----(y是3数中次大数)④顺序输出x、y、z①#includestdio.h//将三个整数由大到小输出。②intmain()③{intx,y,z,t;④scanf(%d%d%d,&x,&y,&z);⑤if(xy)⑥{t=x;x=y;y=t;}//xy⑦if(xz)⑧{t=z;z=x;x=t;}//xz,此时x最大⑨if(yz)⑩{t=y;y=z;z=t;}//yz,此时z最小11printf(%d%d%d\n,x,y,z);12return0;13}复合语句不论包含几条语句,逻辑上按一条语句处理。2.if_else双分支形式---P69格式:执行流程:表达式语句1语句2TFif(表达式)语句1;else语句2;功能:①先计算表达式的值;②若表达式的值为“真”,则执行语句1;否则,执行语句2;。例4:输入1个正整数,判断其奇偶性。分析:1)对于1个正整数,奇数、偶数-----只有两种情况;-------采用双分支选择结构。2)整数的奇偶性使用求余(%)运算的结果来判断。①#includestdio.h//输入1个正整数,判断其奇偶性。②intmain()③{④intn;⑤scanf(%d,&n);⑥if(n%2==1)⑦printf(\n%disanoddnumber,n);⑧else⑨printf(\n%disanevennumber,n);⑩return0;11}(n%2)?如果n能同时被5和7整除:if(n%5==0&&n%7==0)3.if_else_if多分支选择结构形式---P71格式:执行流程:表达式1语句1语句2F表达式2表达式3F语句3语句nTFTTif(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;……[else语句n;]例5:从键盘任意输入一个字符ch,判断其是数字、大写字母、小写字母或其它字符。分析:①ch在'0'-----'9'之间的是数字;②ch在'A'和'Z'之间的是大写字母;③ch在'a'和'z'之间的是小写字母;④否则是其它字符。例5:输入一个字符,判断其是数字、大写字母、小写字母或其它字符。①#includestdio.h②intmain()③{charch;④ch=getchar();⑤if(ch='0'&&ch='9')⑥printf(%cisadigit\n,ch);⑦elseif(ch='A'&&ch='Z')⑧printf(%cisacapitalletter\n,ch);⑨elseif(ch='a'&&ch='z')⑩printf(%cisalowerletter\n,ch);11else12printf(%cisothercharacter\n,ch);13retrun0;14}if语句注意事项(1)if语句后面的表达式必须用括号括起来。(2)if的条件表达式可以是任何表达式。如赋值表达式等,甚至也可以是一个变量。只要表达式非零,表达式的值就为真,否则是假。例1:ifx0printf(x0);例2:if(x0)printf(x0);if(a=5)语句1//表达式的值永远为真,语句1总是执行if(b)语句//等价于if(b!=0)语句;if语句注意事项(3)在if语句中,所有的语句应为单个语句,如果要在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句。例1:if(ab)a++;b++;else{a=0;b=1;}例2:if(ab){a++;b++;}else{a=0;b=1;}注意:在}之后不能再加分号。if语句注意事项(4)不能将==写成=例1:①intx=0;②if(x==1)③printf(***\n);④else⑤printf(!!!\n);例2:①intx=0;②if(x=1)③printf(***\n);④else⑤printf(!!!\n);运行结果:!!!运行结果:***表达式1取表达式2值取表达式3值非0=04.条件运算符与条件表达式---P72格式:表达式1?表达式2:表达式3执行过程:例:分析下列表达式的含义?①(a==b)?1:0②(x%2==1)?1:0③(x=0)?x:-x④(c='a'&&c='z')?c-32:c//判断a、b是否相等//判断x是否奇数//返回x的绝对值//将小写字母转大写4.条件运算符与表达式结合方向:自右向左例如:ab?a:cd?c:d相当于:ab?a:(cd?c:d)例if(ab)printf(“%d”,a);elseprintf(“%d”,b);printf(“%d”,ab?a:b);4.2.3if语句嵌套--P73若if语句内再使用if语句----构成if嵌套;内嵌的if语句可以出现在if子句中,也可以出现在else子句中。if语句嵌套的格式:if(expr1)if(expr2)语句1else语句2elseif(expr3)语句3else语句4内嵌if内嵌ifif(expr1)if(expr2)语句1else语句2内嵌ifif(expr1){if(expr2)语句1}else语句2内嵌ifif(expr1)语句1elseif(expr3)语句2else语句3内嵌ifif(……)if(……)if(……)else……else……else……if_else配对原则--P74C语言规定:在缺省{}时,else总是和它上面离它最近的未配对的if配对。例1:①inta=1,b=-1;②if(a0)③if(b0)④a++;⑤elsea--;例2:①inta=1,b=-1;②if(a0)③{if(b0)④a++;⑤}⑥elsea--;简单实现if~else正确配对方法:加{}{}例6:闰年--ACM(1160/1580)scanf(%d,&y);if(y%4==0)if(y%100!=0)printf(Yes\n);elseif(y%400==0)printf(Yes\n);elseprintf(No\n);elseprintf(No\n);4.2.4switch语句(开关分支语句)--P74执行过程:格式:switch(表达式){caseE1:语句1;caseE2:语句2;…….caseEn:语句n;[default:语句;]}switch表达式语句1语句2语句n语句…...E1E2Endefaultcase说明:E1---En是常量表达式例7:用switch语句:输入一个百分制分数,输出分数的等级A、B、C、D或E---P75分析:1)将学生的成绩存入变量sc中;2)g=sc/10;3)若g==10或g==9,学生成绩等级为A;若g==8,学生成绩等级为B