C语言条件控制语句.docx
- 文档编号:8598092
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:9
- 大小:47.29KB
C语言条件控制语句.docx
《C语言条件控制语句.docx》由会员分享,可在线阅读,更多相关《C语言条件控制语句.docx(9页珍藏版)》请在冰豆网上搜索。
C语言条件控制语句
在程序的三种基本结构中,第二种即为选择结构,其基本特点是:
程序的流程由多路分支
组成,在程序的一次执行过程中,根据不同的情况,只有一条支路被选中执行,而其他分支上的语句被直接跳过。
C语言中,提供if语句和switch语句选择结构,if语句用于两者选一的情况,而switch用于多分支选一的情形。
3.3.1if语句
1.if语句的两种基本形式首先,我们看一个例子,由此了解选择结构的意义及设计方法。
[例3-5]输入三个数,找出并打印其最小数。
分析:
设三个数为A、B、C,由键盘读入,我们用一个变量MIN来标识最小数,A、B、
C与MIN皆定义为int型变量。
每次比较两个数,首先比较A和B,将小的一个赋给MIN,再把第三个数C与MIN比较,
再将小的一个赋给MIN,则最后MIN即为A、B、C中最小数。
算法如下:
1)输入A、B、C。
2)将A与B中小的一个赋给MIN。
3)将MIN与C中小的一个赋给MIN。
4)输出MIN。
将第2)步细化为:
若A
MIN<==B;其流程图见图3-1。
第3)步细化为:
若C 对应图3-1和图3-2,正是if语句的两种基本形式,与图3-2对应的if语句的格式为: if<表达式>语句 当表达式为真时,执行语句,表达式为假时跳过语句。 与图3-1对应的if语句的格式为: if〈表达式〉 语句1 else 语句2 当表达式为真时,执行语句1,表达式为假时执行语句2。 无论如何,语句1与语句2每次只能有一个被执行。 要注意的是: if或if...else,包括后面要讲到的嵌套if,即if...elseif...被看成是一条语句,即使其中的语句是包含多条语句的复合语句,仍然如此。 下面是例3-5的源程序: main() { inta,b,c,min; printf("inputa,b,c: "); scanf("%d%d%d",&a,&b,&c); if(a min=a; else min=b; if(c min=c; printf("Theresultis%d\n",min); } 执行情况如下: RUN inputa,b,c: 352 Theresultis: 2 这里顺便提一下程序书写的缩排问题,所谓缩排,就是下一行与上一行相比,行首向右缩进若字符,如上例的min=a、min=b等。 适当的缩排能使程序的结构、层次清晰、一目了然,增加程序的易读性。 应该从一开始就养成一个比较好的书写习惯,包括必要的注释、适当的空行以及缩排。 2.复合语句 if语句中,有时需要执行的语句不止一条,这就要用到复合语句。 复合语句,就是用一对花括号括起来的一条或多条语句,形式如下: { 语句1; 语句2; ....... 语句n; } 无论包括多少条语句,复合语句从逻辑上讲,被看成是一条语句。 复合语句在分支结构、循环结构中,使用十分广泛。 [例3-6]读入两个数x、y,将大数存入x,小数存入y。 分析: x、y从键盘读入,若x>=y,只需顺序打出,否则,应将x,y中的数进行交换,然后输出。 两数交换必须使用一个中间变量t,定义三个浮点数x、y、t。 算法: 1)读入x、y; 2)大数存入x,小数存入y; 3)输出x、y。 第2)步求精: 若x 再求精,x与y交换; ①t<==x ②x<==y ③y<==t 算法的流程图见图3-3,程序如下: #include main() { floatx,y,t; printf("inputx,y: "); scanf("%f%f",&x,&y); if(x { t=x; x=y; y=t; } printf("result: %7.3f\t%7.3f\n",x,y); } 执行结果: inputx,y: 43.256.7 result: 56.70043.200 3.if...elseif语句 实际应用中常常面对更多的选择,这时,将if...else扩展一下,就得到if...elseif结构,其一般形式为: if<表达式1> 语句1 elseif<表达式2> 语句2 elseif<表达式3> 语句3 else语句4 对应的流程图见图3-4。 [例3-7]货物征税问题,价格在1万元以上的征5%,5000元以上1万元以下的征3%, 1000元以上5000以下的征2%,1000元以下的免税,读入货物价格,计算并输出税金。 分析: 读入price,计算tax,这是一个较复杂的分支结构程序设计(应注意避免重复征税)。 假定货物的价格在1万元以上,征税应分段累计,各段采用不同税率进行征收。 算法: 若price>=10000 则tax=0.05*(price-10000);price=10000; 否则,若price>=5000 则tax=0.03*(price-5000)+tax;price=5000; 否则,若price>=1000 则tax=0.02*(price-1000)+tax;price=1000; 程序如下: #include main() { floatprice,tax=0; printf("inputprice: "); scanf("%f",&price); if(price>=10000.0) { tax=0.05*(price-10000)+tax;price=10000; } if(price>=5000.0) { tax=0.03*(price-5000)+tax;price=5000; } if(price>=1000.00) { tax=0.02*(price-1000)+tax; } printf("thetax=%10.3f",tax); } 运行程序: RUN¿ 15000¿ thetax=480.000 4.if语句嵌套 在一个if语句中可以又出现另一个if语句,这称为if语句的嵌套或多重if语句: if<表达式1> if<表达式11> ...... else 语句2; [例3-8]计算函数 1x>0 y=0x=0 -1x<0 流程图见图3-5。 源程序如下: main() { floatx,y; printf("inputx,y: "); scanf("%f",&x); if(x>=0) if(x>0) y=1; else y=0; else y=-1; printf("y=%4.0f\n",y); } 对多重if,最容易犯的错误是if与else配对错误, 例如,写成如下形式: y=0; if(x>=0) if(x>0) y=1; else y=-1; 从缩排上可以看出,作者希望else是与ifx>=0配对,但是C语言规定else总是与离它最近 的上一个if配对,结果,上述算法的流程图变成图3-6,完全违背了设计者的初衷。 改进的办法是使用复合语句,将上述程序段改写如下: y=0; if(x>=0) { if(x>0) y=1; } else y=-1; 3.3.2switch语句 if语句只能处理从两者间选择之一,当要实现几种可能之一时,就要用if...elseif甚至多重的嵌套if来实现,当分支较多时,程序变得复杂冗长,可读性降低。 C语言提供了switch开关语句专门处理多路分支的情形,使程序变得简洁。 switch语句的一般格式为: switch<表达式> case常量表达式1: 语句序列1; break; case常量表达式2: 语句序列2; break; ⋯⋯ case常量表达式n: 语句n; break; default: 语句n+1; 其中常量表达式的值必须是整型,字符型或者枚举类型,各语句序列允许有多条语句,不需要按复合语句处理,若语句序列i为空,则对应的break语句可去掉。 图3-7是switch语句的流程图。 特殊情况下,如果switch表达式的多个值都需要执行相同的语句,可以采用下面的格式: switch(i) { case1: case2: case3: 语句1; break; case4: case5: 语句2; break; default: 语句3; } 当整型变量i的值为1、2或3时,执行语句1,当i的值为4或5时,执行语句2,否则,执行 语句3。 [例3-9]输入月份,打印1999年该月有几天。 程序如下: #include main() { intmonth; intday; printf("pleaseinputthemonthnumber: "); scanf("%d",&month); switch(month) { case1: case3: case5: case7: case8: case10: case12: day=31; break; case4: case6: case9: case11: day=30; break; case2: day=28; break; default: day=-1; } ifday=-1 printf("Invalidmonthinput! \n"); else printf("1999.%dhas%ddays\n",month,day); } 3.3.3程序应用举例 [例3-10]解一元二次方程ax2+bx+c=0,a、b、c由键盘输入。 分析: 对系数a、b、c考虑以下情形 1)若a=0: ①b<>0,则x=-c/b; ②b=0,则: ①c=0,则x无定根; ②c<>0,则x无解。 2)若a<>0; ①b2-4ac>0,有两个不等的实根; ②b2-4ac=0,有两个相等的实根; ③b2-4ac<0,有两个共轭复根。 用嵌套的if语句完成。 程序如下: #include #include main() { floata,b,c,s,x1,x2; doublet; printf("pleaseinputa,b,c: "); scanf("%f%f%f",&a,&b,&c); if(a==0.0) if(b! =0.0) printf("therootis: %f\n",-c/b); elseif(c==0.0) printf("xisinexactive\n"); else printf("noroot! \n"); else { s=b*b-4*a*c; if(s>=0.0) if(s>0.0) { t=sqrt(s); x1=-0.5*(b+t)/a; x2=-0.5*(b-t)/a; printf("Therearetwodifferentroots: %fand%f,\xn1",x2); } else printf("Therearetwoequalroots: %f\n",-0.5*b/a); else { t=sqrt(-s); x1=-0.5*b/a;/*实部*/ x2=abs(0.5*t/a);/*虚部的绝对值*/ printf("Therearetwovirtualroots: "); printf("%f+i%f\t\t%f-i%f\n",x1,x2,x1,x2); } } } 运行结果如下: RUN pleaseinputa,b,c: 123 Therearetwovirtualroots: -1.000000+i1.000000-1.000000-i1.000000 RNU pleaseinputa,b,c: 253 Therearetwodifferentroots: -1.500000and-1.000000 RNU pleaseinputa,b,c: 003¿ Noroot!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 条件 控制 语句
![提示](https://static.bdocx.com/images/bang_tan.gif)