第5章 选择语句_第1页
第5章 选择语句_第2页
第5章 选择语句_第3页
第5章 选择语句_第4页
第5章 选择语句_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章选择语句

本章要点逻辑表达式if语句switch语句C语言语句语句是程序的基础,目前见过:return语句、表达式语句,以及函数调用语句。相比运算符,C语言拥有的语句较少,主要为(语句分类):1.控制语句:控制程序流程2.函数调用语句3.表达式语句4.其他语句:复合语句:把几条语句组合成一条语句。空语句:不执行任何操作。程序流程程序解决问题的思路、或步骤顺序结构选择结构循环结构走直路岔路回头路温故而知新——表达式赋值运算符简单赋值左值:v=e条件:具备可改写的内存空间的对象v、e类型不同:e值转换成v类型(削足适履)复合赋值,+=,-=,*=,/=;a+=b+2++,--温故而知新——自增\自减前缀:先变后取后缀:先取后变k=++a;a+=1;k=a;k=a;a+=1;k=a++;温故而知新——运算优先级优先级名称符号结合性1(后缀)自增++左结合(后缀)自减--2(前缀)自增++右结合(前缀)自减--一元正号+一元负号-3乘法类*/%左结合4加法类+-左结合5赋值=*=/=%=+=-=右结合温故而知新——程序流程程序解决问题的思路、或步骤顺序结构选择结构循环结构走直路岔路回头路(流程)控制语句流程控制(flowcontrol):程序的灵魂顺序结构:无需控制选择语句:if和switch语句。循环语句:while,do和for语句。跳转语句:break,continue和goto语句,return语句也算此类。结合选择和循环使用Eg.还没吃完快递来了控制语句如何控制流程?条件判断if(条件判断表达式),eg.身高低于120cm免票while(条件判断表达式),eg.试卷没有统分完条件判断表达式——逻辑表达式5.1逻辑表达式逻辑表达式:描述一种判断正确与否判断题“勾叉”——对错值为“真(true)”或“假(false)”身高低于120cm,(height<120)真:height确实低于120假:height高或等于120许多编程语言具有“布尔”类型或“逻辑”类型,只有两值:真、假。C语言:0:假1:真构造逻辑表达式关系运算符判等运算符逻辑运算符5.1.1关系运算符C的关系运算符如下:< 小于> 大于<= 小于等于>= 大于等于关系运算符应用于表达式构成逻辑表达式:Eg.i<=j+3结果:0(假)或1(真)。可用于比较整数和浮点数,也可比较混合类型操作数。3<PI关系运算符优先级:v=i+j<k-1等价于:v=((i+j)<(k-1))左结合(二元)i<j<k等价于:(i<j)<k,i<j的结果(1或0)再与k比较大小。而不是j介于i与k之间如果想检测j的值是否在i和k之间:i<j&&j<k(复杂逻辑表达式)算术运算符关系运算符赋值运算符(高)(低)5.1.2判等运算符C的判等运算符如下:== 等于!= 不等于左结合,结果0(假)或1(真)。优先级低于关系运算符。表达式i<j==j<k相当于

(i<j)==(j<k)优先级:vs赋值运算符?x=i==j5.1.3逻辑运算符用于构造复杂逻辑表达式(复杂条件)。eg.儿童、老人免票:year<12或year>60eg.高富帅:h>h潘

且lk>lk赵且vehicle>=1且dorm>=1C逻辑运算符如下:! 逻辑非

一元

右结合性&& 逻辑与(且) 二元

左结合性|| 逻辑或

二元

左结合性5.1.3逻辑运算符以简单逻辑表达式(值0或1)为操作数,运算结果为:0(假)或1(真)儿童、老人免票year<12||year>60高富帅h>h潘&&

lk>lk赵

&&

vehicle>=1&&

dorm>=1非0的操作数当作真值运算。动物园ticket=10;入园:ticket||year<12||year>60if(ticket||year<12||year>60)pass;温故而知新——自增\自减(前缀\后缀)前缀先自增\自减,再取值后缀先取值,后自增\自减k=++a;a+=1;k=a;k=a;a+=1;k=a++;温故而知新——后缀:先取值,后自增1ak2a+=1;寄存器CPUr1r2r3k=r2;11a=1;k=a++;菜筐厨子和锅等取菜温故而知新——程序流程程序解决问题的思路、或步骤顺序结构选择结构循环结构走直路岔路回头路流程控制示例——非诚勿扰如果高富帅,则留灯,否则灭灯if(高并且富并且帅)留灯,else灭灯if(h>h0&&p>p0&&lk>lk0) keeplightonelse trunoffthelight优先级名称符号结合性1(后缀)自增、自减++--左结合2(前缀)自增、自减++--右结合一元正号、负号+-一元逻辑运算符!3乘法类*/%左结合4加法类+-左结合5关系运算符><>=<=左结合6判等运算符==!=左结合7二元逻辑运算符&&||左结合8赋值=*=/=%=+=-=右结合逻辑运算符优先级次序逻辑运算符优先级次序c=d>a+b&&a>b等效于:c=((d>(a+b))&&(a>b))逻辑运算符的运算结果ab!a!ba&&ba||b非0(1)非0(8)非000非0000011010110011100短路计算对&&、||如果根据左操作数就能推出表达式结果,就不计算右操作数。例子1:考试双证:准考证&&学生证intb,x=3,y=5;b=x>y&&x++==y--;结果:b=0,x=3,y=5例子2:intb,x=9,y=5;b=x>y||x++==y--;结果:b=1,x=9,y=5短路副作用:影响其他运算符副作用5.2if语句if语句最简单格式:if(表达式)语句计算(表达式)的值,非零执行语句,Egif(line_num==MAX_LINES)//注意==而非= line_num=0;判定变量是否在某数值范围内,如[

0,n):if(i>=0&&i<n)…//wrong0<=i<n相反情况判定:if(i<0||i>=n)…语句假(0)表达式真(非0)5.2.1复合语句(compoundstatement)if语句处理复杂功能(多条语句),需复合语句,格式:{多条语句}例子:if(line_num==MAX_LINES){ line_num=0; page_num++;}注意:{}外没有“;”也出现在循环和其他需要多条语句的地方。5.2.2else子句格式:if(表达式)

语句1else

语句2例子:if(i>j) max=i;else max=j;

语句1

语句2非00表达式注意缩进对齐程序练习3——标准体重计算根据身高计算标准体重标准体重(男)=(身高cm-100)x0.9(kg)标准体重(女)=(身高cm-100)x0.9(kg)-2.5(kg)

男女有别:男:m(M),女:f(F)男:1,女:0程序练习——标准体重计算/*计算标准体重*/#包含stdio.hintmain(){

声明变量;

提示输入性别;

读入性别;

提示输入身高;

读入身高;

如果是男性

标准体重=(身高-100)*0.9f;

否则//女性

标准体重=(身高-100)*0.9f-2.5;

显示标准体重;

程序返回;

}程序练习——标准体重计算#include<stdio.h>#defineFACTOR0.9fintmain(void){ intheight; floatweight,stdwt; charsex; puts("输入性别,男性用m表示,其它字符表女性."); scanf("%c",&sex); puts("输入身高(cm)."); scanf("%d",&height);

if(sex=='m') stdwt=(height-100)*FACTOR; else stdwt=(height-100)*FACTOR-2.5; printf("你的标准体重应是%.1fkg\n.",stdwt); return0; }程序改进:输入身高、体重,计算与标准体重的差值,并提示温故而知新——控制语句流程控制(flowcontrol):程序的灵魂顺序结构(无需控制)选择语句:if和switch语句。循环语句:while,do和for语句。跳转语句:break,continue和goto语句,return语句也算此类。逻辑表达式用于设置流程控制条件控制语句+逻辑表达式+要执行操作温故而知新——逻辑表达式逻辑运算符将关系表达式或逻辑量连接起来的有意义的式子。运算符关系运算符<,>,<=,>=判等运算符==,!=逻辑运算符&&(并且),||(或者),!(非)结果假:0真:1,非0优先级名称符号结合性1(后缀)自增、自减++--左结合2(前缀)自增、自减++--右结合一元正号、负号+-一元逻辑运算符!3乘法类*/%左结合4加法类+-左结合5关系运算符><>=<=左结合6判等运算符==!=左结合7二元逻辑运算符&&||左结合8赋值=*=/=%=+=-=右结合温故——逻辑运算符优先级次序温故而知新——构造逻辑条件如果高富帅,则留灯,否则灭灯if(高并且富并且帅)留灯,else灭灯if(h>=h0&&p>=p0&&lk>=lk0) keeplightonelse trunoffthelight温故而知新——短路计算对&&、||左操作数能推出表达式结果,就不计算右操作数。例:非诚勿扰副作用:影响其他运算符副作用b=3>5&&x++==y--;温故而知新——if语句简单ifif(逻辑表达式) statement带否则else的ifif(逻辑表达式) statement1else statement2if语句的嵌套前面的if一个条件:两个分支(选择)现实中可能多种(层)选择嵌套的选择eg.实验:陈老师班上的网安的动物园(age<=12)成人老年非老年儿童height<=120freeheight>120half

语句1真假条件1条件2

语句2语句3真假if语句的嵌套求i、j和k中的最大值if(i>j) if(i>k) max=i; else max=k;else if(j>k) max=j; else max=k;max=i真假i>ji>kj>kmax=kmax=jmax=k真真假假i,j,k最大值if语句的嵌套求i、j和k中最大值if(i>j) if(i>k) max=i; else max=k;else if(j>k) max=j; else max=k;增加花括号,增强可读性if(i>j){ if(i>k) max=i; else max=k;}else{ if(j>k) max=j; else max=k;}程序练习——三数求最小值if(i<j){ if(i<k) min=i; else min=k;}else{ if(j<k) min=j; else min=k;}5.2.3级联式if语句流程图:格式:if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3……elseif(表达式m)语句melse语句n不知尺码去买鞋级联式if语句示例判数if(n<0)printf("nislessthan0\n");elseif(n==0)printf("nisequalto0\n");elseprintf("nisgreaterthan0\n");

动物园售票程序:if(h<120)printf(“freeforchildren”);elseif(y>60)printf(“freeforoldpeople”);elseif(soldier_cert)printf(“freeforsoldier”);elseticket=10;例子:计算股票经纪人的佣金股票经纪人的佣金计算表:交易额范围

佣金费用低于$2,500 $30+1.7%$2,500–$6,250 $56+0.66%$6,250–$20,000 $76+0.34%$20,000–$50,000 $100+0.22%$50,000–$500,000 $155+0.11%超过$500,000 $255+0.09%最低收费39美元。broker.c要求用户输入交易额,然后显示佣金数额:Entervalueoftrade:30000Commission:$166.00

/*Calculatesabroker'scommission*/#include<stdio.h>intmain(void){floatcommission,value;printf("Entervalueoftrade:");scanf("%f",&value);if(value<2500.00f)commission=30.00f+.017f*value;elseif(value<6250.00f)//超过2500commission=56.00f+.0066f*value;elseif(value<20000.00f)commission=76.00f+.0034f*value;elseif(value<50000.00f)commission=100.00f+.0022f*value;elseif(value<500000.00f)commission=155.00f+.0011f*value;elsecommission=255.00f+.0009f*value;if(commission<39.00f)commission=39.00f;printf("Commission:$%.2f\n",commission);return0;}5.2.4悬空else问题例子:x/yif(y!=0) if(x!=0) result=x/y;else printf("Error:yisequalto0\n");else和谁匹配?从缩进看,编程者想else和外层if匹配,实际是和内层匹配的。else与前面最近的if(未配对)配对if(y!=0) if(x!=0) result=x/y; else printf("Error:yisequalto0\n");{}//加括号强制配对编程练习——门票价格动物园门票全价20120cm及以下儿童免票,60岁及以上半价,其他全价if语句怎么写有同学说不知道怎么写if语句,不知道怎么嵌套先用自然语句把逻辑表达出来,再翻译成if语句三八节放假安排语句假(0)表达式真(非0)如果你是女性,则放假[否则该干嘛干嘛]if(你是女性)放假[elsedoasusual]charsex;//’F’表示女性scanf(“%c”,&sex);if(sex==‘F’)

printf(“haveaholiday\n”);简单if语句游泳池更衣指示如果你是女性,则往右否则[男性],则往左if(你是女性)turnright;elseturnleft;charsex;//’F’表示女性scanf(“%c”,&sex);if(sex==‘F’)

printf(“turnright\n”);elseprintf(“turnleft”\n);完整if语句

语句1

语句2非00表达式动物园售票12岁及以下儿童和60岁及以上老人免票,学生半价,其他全价如果你是儿童或老人,免票否则,如果你有学生证,半价否则[你是成人]全票if(儿童||老人)freeelseif(stu_cert)halfpriceelsefullpriceintage;if(age<=12||age>=60) printf(“free\n”);elseif(stu_cert) printf(“halfprice\n”);elseprintf(“fullprice\n”)级联if语句动物园售票12岁及以下儿童,身高120及以下免票,120以上半价,60岁及以上半价,其他全价if(你是儿童) if(身高120及以下)free elsehalfprice;elseif(你是老人)halfpriceelsefullpriceintageheight;if(age<=12)

if(height<=120)printf(“free\n”); elseprintf(“halfprice\n”);elseif(age>=60)printf(“halfprice\n”);elseprintf(“fullprice\n”)嵌套if语句如果你是12岁及以下儿童,并且如果你身高120及以下则免票,否则半票否则,如果你是60岁以上老人,则半价否则[你是成人]全票两个年龄节点12岁、60岁将人群分为三类——一层if语句在12岁儿童段,身高120cm将儿童分为两类——第二层if语句#include<stdio.h>#definePRICE20intmain(){ inty,p; printf(“Howoldareyou?\n"); scanf("%d",&y); if(y<=12){ printf("howtallareyou:\n"); inth; scanf("%d",&h); if(h<=120)p=0; elsep=PRICE/2;} elseif(y>=60)p=PRICE/2; elsep=PRICE; if(0==p) printf(“youdon'tneedtobuyticket\n"); elseprintf("pleasebuyticket:%d元(RMB)\n",p); return0; }程序练习5-2转换时间格式,24小时制转12小时制0-12:上午am(aftermidnight)12-24:下午pm(priortomidnight)00:00-12:00am12:00-12:00pm程序练习5-2inthours,minutes;printf("Entera24-hourtime:");scanf("%d:%d",&hours,&minutes);printf("Equivalent12-hourtime:");if(hours==0)printf("12:%.2dAM\n",minutes);elseif(hours<12)printf("%d:%.2dAM\n",hours,minutes);elseif(hours==12)printf("%d:%.2dPM\n",hours,minutes);elseprintf("%d:%.2dPM\n",hours-12,minutes);5.2.5条件表达式根据条件产生值(简化这类if语句)条件运算符:由符号?和符号∶组成。三元运算符格式:表达式1?表达式2∶表达式3还原ifif(表达式1)表达式2else表达3结果:计算表达式1的值:如果不为0,计算表达式2的值,为最后结果。如果为0,计算表达式3的值,为最后结果。例子inti,j,k;i=1;j=2;k=i>j?i:j;/*kisnow2,意义:为i,j中的最大值*/k=(i>=0?i:0)+j;/*kisnow3*/条件运算符优先级只比赋值运算符高,比其他的都低。例子例:If(a>b)

max=a;

elsemax=b;替换为:max=(a>b)?a:b;可以应用于return语句:returni>j?i:j;可以应用于printf语句:printf("%d\n",i>j?i:j);

5.2.6C89中的布尔值C89没有定义布尔值类型。可以定义一个int变量,赋值为0或1:intflag;flag=0; …flag=1;为了程序更便于理解,可以定义宏:#defineTRUE1#defineFALSE0例子使用上页的宏:flag=FALSE; …flag=TRUE;判定flag为真if(flag==TRUE)…或(等价):if(flag)…判定flag为假if(flag==FALSE)…或:if(!flag)…定义类型的宏定义一个int型的宏:#defineBOOLint声明布尔型时就用BOOL代替intBOOLflag;预编译后intflag;宏定义实质:另起名字eg.#definePI3.14作用:三便便于书写便于修改便于理解5.2.7C99中的布尔值C99中提供了_Bool类型:_Boolflag;_Bool是一个整形值(无符号整形),只能赋值为0或1。往_Bool变量中存储非零值会使值变为1:flag=5;/*flagisassigned1*/C99中的布尔值C99提供了一个新头文件<stdbool.h>,提供了bool宏,#definebool_Bool提供了true和false两个宏表示1和0如果#include<stdbool.h>,就可以:boolflag;/*sameas_Boolflag;*/flag=false; …flag=true;5.3switch语句把表达式和一系列值比较,可以用级联式if语句:if(grade==4) printf("Excellent");elseif(grade==3) printf("Good");elseif(grade==2) printf("Average");elseif(grade==1) printf("Poor");elseif(grade==0) printf("Failing");else printf("Illegalgrade");

买鞋:不同大小挨个儿试switch语句switch(grade){case4:printf("Excellent");break;case3:printf("Good");break;case2:printf("Average");break;case1:printf("Poor");break;case0:printf("Failing");break;default:printf("Illegalgrade");break;}加标签,对号入座switch语句比级联式if语句更容易阅读,执行速度也快。格式:switch(表达式){//控制表达式 case常量表达式1:语句1//分支标号 case常量表达式2:语句2 … case常量表达式n:语句n default:语句n+1 }switch语句(号)控制表达式:整型(字符可当整数处理)不能用浮点数和字符串(座)分支标号:case常量表达式不能包含变量和函数调用。语句:每个分支标号后可以跟任意数量的语句,不需要花括号,case即括号最后通常是break语句分支结束“闪人”switch语句示意图switch语句多个分支共用一组语句:

switch(grade){ case4: case3: case2: case1:printf("Passing"); break; case0:printf("Failing"); break; default:printf("Illegalgrade"); break; }轮滑:多码一鞋如果加break;?switch语句为了节省空间,可把多个分支放一行。switch(grade){ case4:case3:case2:case1: printf("Passing"); break; case0:printf("Failing"); break; default:printf("Illegalgrade"); break;}不要求必须有default,如果没有,控制表达式的值和任何分支都不匹配,就会传给switch后面的语句。break的作用中断并跳出switch,跳到switch后没有break:一个分支接一个分支,直到break或}。例子:switch(grade){ case4:printf("Excellent"); case3:printf("Good"); case2:printf("Average"); case1:printf("Poor"); case0:printf("Failing"); default:printf("Illegalgrade"); }如果grade等于3,结果为:GoodAveragePoorFailingIllegalgrade温故而知新——条件表达式条件运算符:?:三元运算符格式:表达式1?表达式2∶表达式3结果:If表达式1为真(非0)为表达式2的值,否则为表达式3的值温故而知新——switch语句比级联if更易阅读,执行速度也快。格式:switch(表达式){//控制表达式 case常量表达式1:语句1//分支标号 case常量表达式2:语句2 … case常量表达式n:语句n default:语句n+1 }对号入座语句号座1座2座n要求:

号、座都为整数(包括字符)

座为常数(常量表达式,不含变量函数调用break:跳出switch例子:显示法定格式的日期要求按下列格式显示日期:Datedthis____dayof____,20__.要求用户以mm/dd/yy方式录入日期,然后按上面方式显示Enterdate(mm/dd/yy):7/19/14Datedthis19thdayofJuly,2014.用switch语句为日添加“th”(或“st”、“nd”、“rd”)。数字月份转换成英文表达date.c#include<stdio.h>intmain(void){intmonth,day,year;printf("Enterdate(mm/dd/yy):");scanf("%d/%d/%d",&month,&day,&year);printf("Datedthis%d",day);switch(day){case1:case21:case31:printf("st");break;case2:case22:printf("nd");break;case3:case23:printf("rd");break;default:printf("th");break;}printf("dayof");switch(month){case1:printf("January");break;case2:printf("February");break;case3:printf("March");break;case4:printf("April");break;case5:printf("Ma

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论