C语言选择结构.docx
《C语言选择结构.docx》由会员分享,可在线阅读,更多相关《C语言选择结构.docx(11页珍藏版)》请在冰豆网上搜索。
C语言选择结构
clrscr();/*清屏*/
选择结构
一、单分支选择语句
1.格式
if(表达式)语句
2.功能
当表达式的值为非0(真、条件成立)时,执行“语句”。
否则执行if之后的下一句。
3.说明
(1)表达式可以是任意类型的表达式(结果是数值型),但通常是关系或逻辑表达式。
也可以是数值型的常量或变量(它们是最简单的表达式)。
(2)“语句”可以是以分号结束的单个语句,也可以是一个复合语句。
不可以是多个语句。
4.举例
例1、任意读入两个整数,然后输出其中的较大者。
main()
{intx,y;
scanf("%d%d",&x,&y);
if(x>y)printf("%d\n",x);
if(y>=x)printf("%d\n",y);
}
二、双分支if语句
【格式】
if(表达式)
语句1
else
语句2
【功能】
【说明】
1.“语句1”和“语句2”可以分别是以分号结束的单个语句,也可以分别是一个复合语句。
都不可以是多个语句。
2.else子句不可以独立存在。
改写上例:
任意读入2个整数,输出较大数。
main()
{intx,y;
scanf("%d%d",&x,&y);
if(x>y)
printf("%d\n",x);
else/*暗含两种情况:
<和=*/
printf("%d\n",y);
}
例如:
任意读入2个整数,按从小到大的顺序输出这2个数。
【法1】
main()
{intx,y;
scanf("%d%d",&x,&y);
if(xprintf("%d,%d\n",x,y);
else
printf("%d,%d\n",y,x);
}
【法2:
借助第三数,完成两数的交换】
让x中放较小数,y中放较大数。
main()
{intx,y;
intt;/*中间变量*/
scanf("%d%d",&x,&y);
if(x>y)
{t=x;x=y;y=t;}
printf("%d,%d\n",x,y);
}
【基本算法一:
两数交换,借助第三数】
t=x;x=y;y=t;
【思考:
本题改成“任意读入3数,从小到大输出”】
三、多分支if语句
【格式】
if(表达式1)
语句1
elseif(表达式2)
语句2
elseif(表达式3)
语句3
……
else
语句n+1
【功能】
【注意】else和if之间有空格。
最后的else子句可以省。
【举例】
例1、批发铅笔,批发量x,
100≤x<300,打7折;
300≤x<500,打5折;
500≤x<1000,打4.5折;
x>=1000,打4折。
其余不
打折。
求顾客应付款。
(1元/支)
【法1:
多分支选择语句】
main()
{intx;
floatcost;
scanf("%d",&x);
if(x>=1000)
cost=1*x*0.4;
elseif(x>=500)
cost=1*x*0.45;
elseif(x>=300)
cost=1*x*0.5;
elseif(x>=100)
cost=1*x*0.7;
else
cost=1*x;
printf("cost=%f\n",cost);
}
%m.nf(m、n是正整数,通常m>n,
m表示整个实数所占显示宽度,包含小数点,实数宽度不够时,左补空格;
n表示小数点右边的位数。
)
例如:
printf("%6.2f\n",3.14159);
UU3.14(U代表空格)
又如:
printf("%3.4f\n",3.14159);
3.1416
【注意】%m.nf的格式可以省写成“%.nf”,即可将m省略。
%-m.nf(若数宽度不够,则右补空格)
%.nf(m可以省,满足小数点后保留n位,该实数实际需要占多少位,就占多少位。
)
关于整数:
%md:
输出的整数若位数不足m位,左补空格。
%-md:
输出的整数若位数不足m位,右补空格。
例:
任意读入一个年份,判断其是否为闰年。
(能被400整除,或能被4整除且不能被100整除的,就是闰年)
四、if语句的嵌套(if语句中含有另一个if语句)
例1:
铅笔打折的改写。
main()
{intx;
floatcost;
scanf("%d",&x);
if(x<100)
cost=1*x;
else
if(x<300)
cost=1*x*0.7;
else
if(x<500)
cost=x*1*0.5;
else
if(x<1000)
cost=1*x*0.45;
else
cost=1*x*0.4;
printf("cost=%.2f\n",cost);
}
【注意】
(1)外选择语句必须完整地
包含内选择语句,请缩进书写。
(2)else总是和前面最近的一个没有配对且有资格配对的if配对。
例2、任意读入一个字符,
判断其是否为数字字符,若是,
进一步判断其是否为’5’,是
就输出该字符及其ASCII码值;
若不是数字字符,就输出
“Isnotdigit!
”。
【法一:
利用ASCII值判断】
#include
main()
{charc;
c=getchar();
if(c>='0'&&c<='9')
{if(c=='5')
printf("%c,%d\n",c,c);}
else
puts("Isnotdigit!
\n");
}
【用{}取消内if的配对资格!
】
【法二:
利用系统函数isdigit判断数字字符】
用系统函数(库函数):
isdigit(字符型数据)
含义是判断“字符型数据”是否为数字字符。
(是,则函数返回值为非0;否则为0),使用时一定要加头文件“ctype.h”。
#include
#include
main()
{charx;
scanf("%c",&x);
if(isdigit(x)!
=0)/*逻辑等价于isdigit(x)*/
{if(x=='5')
printf("%c:
%d\n",x,x);}
else
printf("Isnotdigit!
\n");
}
【将光标移到系统函数名下方,然后按Ctrl+F1,弹出对应头文件名。
按Esc键回到蓝色编辑环境。
】
【结论】
(1)用{}扩住某单分支if语句,可以取消其与else的配对资格!
(2)两组逻辑等价式:
变量a格式
a取值
逻辑等价式
a
0或非0
a!
=0
!
a
0或非0
a==0
【解释:
】
数值数据a
a!
=0
0(假)
假
非0(真)
真
所谓“逻辑等价”就是,当某式子的结果被当做逻辑值用时,其逻辑等价式的真值与该式子完全一致。
五、多分支switch语句
【格式】
switch(表达式)
{case常量1:
语句块1;break;
case常量2:
语句块2;break;
case常量3:
语句块2;break;
……
default:
语句n+1;
}
【说明】
(1)switch后的表达式通常
是整型或字符型表达式(常量、变量);
(2)case后的常量必须是
整型或字符型。
(3)“break;”语句只能出现
在switch或循环语句中。
作用
是跳出所在语句结构。
(4)“语句块1;……语句块n+1;”
可以是若干个语句,不必构成一个
复合语句。
(5)default分支可以省略。
【功能】
例1:
改写铅笔。
#include
main()
{intx;
floatcost;
scanf("%d",&x);
switch(x/100)
{case0:
cost=1*x;break;
case1:
case2:
cost=1*x*0.7;break;
case3:
case4:
cost=1*x*0.5;break;
case5:
case6:
case7:
case8:
case9:
cost=1*x*0.45;break;
default:
cost=1*x*0.4;
}
printf("%.2f\n",cost);
}
【而以下也正确】
#include
main()
{intx;
floatcost;
scanf("%d",&x);
switch(x/100)
{case1:
case2:
cost=1*x*0.7;break;
default:
cost=1*x*0.4;break;
case3:
case4:
cost=1*x*0.5;break;
case5:
case6:
case7:
case8:
case9:
cost=1*x*0.45;break;
case0:
cost=1*x;
}
printf("%.2f\n",cost);
}
【注意】
(1)各分支位置可以不分先后(不好!
应试的)。
但依然只有最后一个分支可以不加break;语句!
。
(2)两个(或以上)相邻分支的操作一样,可将对应语句写在最后一个分支上。
(3)如果前面的分支缺了break语句,则无条件地接着做下一个分支的语句,直到遇到break;或switch的}为止。
【补充:
4个数学函数,要加
#include】
1、pow(x,y)
功能:
计算xy
2、abs(数值型表达式)
求“数值型表达式”的绝对值,即
|数值型表达式|。
注意:
必须是整型数据。
3、fabs(实数表达式)
求绝对值
4、sqrt(正数)
求“正数”的平方根。