clr scr(); /*清屏*/选择结构一、单分支选择语句1. 格式if(表达式)语句2. 功能当表达式的值为非0(真、条件成立)时,执行“语句”。
否则执行if之后的下一句。
3. 说明(1)表达式可以是任意类型的表达式(结果是数值型),但通常是关系或逻辑表达式。
也可以是数值型的常量或变量(它们是最简单的表达式)。
(2)“语句”可以是以分号结束的单个语句,也可以是..复合语句。
不可以是多一个..个语句。
4. 举例例1、任意读入两个整数,然后输出其中的较大者。
main(){int x,y;scanf("%d%d",&x,&y);if(x>y)printf("%d\n",x);if(y>=x)printf("%d\n",y );}二、双分支if语句【格式】if(表达式)语句1else语句2【功能】【说明】1.“语句1”和“语句2”可以分别是以分号结束的单个语句,也可以分别是一个复合语句。
都不可以是多个语句。
2. else子句不可以独立存在。
改写上例:任意读入2个整数,输出较大数。
main(){int x,y;scanf("%d%d",&x,&y); if(x>y)printf("%d\n",x); else /*暗含两种情况:<和=*/printf("%d\n",y);}例如:任意读入2个整数,按从小到大的顺序输出这2个数。
【法1】main(){int x,y;scanf("%d%d",&x,&y); if(x<y)printf("%d,%d\n",x,y); elseprintf("%d,%d\n",y,x);}【法2:借助第三数,完成两数的交换】让x中放较小数,y中放较大数。
main(){int x,y;int t; /*中间变量*/ 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)语句1else if(表达式2)语句2else if(表达式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(){int x;float cost; scanf("%d",&x); if(x>=1000)cost=1*x*0.4; else if(x>=500)cost=1*x*0.45; else if(x>=300)cost=1*x*0.5;else if(x>=100)cost=1*x*0.7;elsecost=1*x;printf("cost=%f\n",cost );}%m.n f(m、n是正整数,通常m>n,m表示整个实数所占显示宽度,包含小数点,实数宽度不够时,左补空格;n表示小数点右边的位数。
)例如:printf("%6.2f\n",3.1415 9);UU3.14(U代表空格)又如:printf("%3.4f\n",3.1415 9);3.1416【注意】%m.nf的格式可以省写成“%.n f”,即可将m 省略。
%-m.n f(若数宽度不够,则右补空格)%.nf(m可以省,满足小数点后保留n位,该实数实际需要占多少位,就占多少位。
)关于整数:%md: 输出的整数若位数不足m位,左补空格。
%-md: 输出的整数若位数不足m位,右补空格。
例:任意读入一个年份,判断其是否为闰年。
(能被400整除,或能被4整除且不能被100整除的,就是闰年)四、if语句的嵌套(if语句中含有另一个if语句)例1:铅笔打折的改写。
main(){int x;float cost;scanf("%d",&x); if(x<100)cost=1*x;elseif(x<300)cost=1*x*0.7;elseif(x<500)cost=x*1*0.5;elseif(x<1000)cost=1*x*0.45;elsecost=1*x*0.4; printf("cost=%.2f\n",cost);}【注意】(1)外选择语句必须完整地包含内选择语句,请缩进书写。
(2)else总是和前面最近的一个没有配对且有资格配对的if配对。
例2、任意读入一个字符,判断其是否为数字字符,若是,进一步判断其是否为’5’,是就输出该字符及其ASCII码值;若不是数字字符,就输出“Is not digit!”。
【法一:利用ASCII值判断】#include<stdio.h> main(){char c;c=getchar();if(c>='0'&&c<='9'){if(c=='5')printf("%c,%d\n",c,c);}elseputs("Is not digit!\n");}【用{}取消内if的配对资格!】【法二:利用系统函数isdigit判断数字字符】用系统函数(库函数):isdigit(字符型数据)含义是判断“字符型数据”是否为数字字符。
(是,则函数返回值为非0;否则为0),使用时一定要加头文件“c type.h”。
#include <stdio.h>#include <ctype.h> main(){char x;scanf("%c",&x);if(isdigit(x)!=0) /*逻辑等价于isdigit(x)*/{if(x=='5')printf("%c:%d\n",x,x);} elseprintf("Is notdigit!\n");}【将光标移到系统函数名下方,然后按Ctrl+F1,弹出对应头文件名。
按Esc键回到蓝色编辑环境。
】【结论】(1)用{}扩住某单分支if 语句,可以取消其与else的配对资格!(2)两组逻辑等价式:【解释:】所谓“逻辑等价”就是,当某式子的结果被当做逻辑值用时,其逻辑等价式的真值与该式子完全一致。
五、多分支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<stdio.h> main(){int x;float cost;scanf("%d",&x);switch(x/100){case 0: cost=1*x; break;case 1:case 2: cost=1*x*0.7;break; case 3:case 4: cost=1*x*0.5;break;case 5: case 6: case 7: case 8:case 9: cost=1*x*0.45; break;default:cost=1*x*0.4; }printf("%.2f\n",cost); }【而以下也正确】#include<stdio.h> main(){int x;float cost;scanf("%d",&x); switch(x/100){case 1:case 2: cost=1*x*0.7;break;default:cost=1*x*0.4;br eak;case 3:case 4: cost=1*x*0.5;break; case 5:case 6:case 7:case 8:case 9: cost=1*x*0.45;break;case 0: cost=1*x;}printf("%.2f\n",cost); }【注意】(1)各分支位置可以不分先后(不好!应试的)。
但依然只有最后一个分支可以不加break;语句!。
(2)两个(或以上)相邻分支的操作一样,可将对应语句写在最后一个分支上。
(3)如果前面的分支缺了break语句,则无条件地接着做下一个分支的语句,直到遇到break;或switch 的}为止。
【补充:4个数学函数,要加#include <math.h>】1、pow(x,y)功能:计算x y2、abs(数值型表达式)求“数值型表达式”的绝对值,即|数值型表达式|。
注意:必须是整型数据。
3、fabs(实数表达式) 求绝对值4、sqrt(正数)求“正数”的平方根。