【C语言基础04】选择结构程序设计
选择结构的作用是根据给定的条件来决定做什么的操作
if-else if-else语句用于对多条件并列测试,从中取一的情形
目录
4.1 if语句
if语句形式:3种
1.单if语句
if(表达式)语句组
例:求三个整数a,b,c中的最大数。
#include "stdio.h"
main()
{
int a,b,c,max;
printf("请输入3个数字:\n");
printf("例如:1,2,3\n");
scanf("%d,%d,%d",&a,&b,&c);
if(a>b&&a>c) //如果a>b
{
max=a;
}
else
{
if(c>b&&c>a) //如果 c>b
{
max=c;
}
else
{
max=b;
}
}
printf("%d",max);
}
2.if-else语句
例:求两个数的最大值
if (表达式)
语句1
else
语句2
3.if-else if else语句
if(表达式1)
语句组1;
else if(表达式2)
语句组2;
else if(表达式3)
语句组3;
……
else if(表达式n-1)
语句组n-1
else
语句组n
系统首先求解表达式1的值,当其值为“真”(非0)时,执行语句1,然后跳出该选择结构;否则求解表达式2的值,当其值为“真”(非0)时,则执行语句2,然后跳出该选择结构;否则再继续求解表达式3,当其值为“真”(非0)时,执行语句3,然后跳出该选择结构;否则接着进行判断,依次类推。如果经过求解,所有的表达式都为“假”(0),就执行最后一个else部分的语句n,从而结束整个if语句。
例:求学生成绩A,B,C,D,E,F等级
#include "stdio.h"
main()
{
float s;
printf("请输入分数:");
scanf("%f",&s);
if(s>=0&&s<60)
printf("E");
else if(s>=60&&s<=69)
printf("D");
else if(s>=70&&s<=79)
printf("C");
else if(s>=80&&s<=89)
printf("B");
else if(s>=90&&s<=100)
printf("A");
}
注意:
- if语句中的表达式通常是逻辑表达式或关系表达式,也可以是其他类型的表达式,如赋值表达式等,甚至可以是一个变量。
- 在if语句中,表达式必须用括号括起来,在语句之后必须加分号
- 在if语句的三种形式中,所有的语句应为单个语句,如果要在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句,{}之后不能再加分号
例:
if (a=5) 语句;
if (b) 语句;
例:
if (a=b)
printf("%d",a);
else
printf("a=0");
该语句的语义是:把b值赋予a,如为非0则输出该值,否则输出"a=0"字符串。这种用法在程序中是经常出现的。
例:
if (a>b)
{a++;
b++;}
else
{a=0;
b=10;}
4.2.1 if语句的嵌套
在if语句中又包含一个或多个if语句称为if 语句的嵌套;if语句可以内嵌在if子句中,又可以内嵌在else子句中。
如果if与else的数目不一样,为实现程序设计者的企图,可以加花括号来确定配对关系。
if ( )
{
if ( ) 语句1 (内嵌if)
}
else
语句2
这时{ }限定了内嵌if语句的范围,因此else与第一个if配对。
例:猜数程序
main()
{
int number=200;
int i;
scanf("%d",&i);
if(i>number)
{
printf("大!");
}
else
{
if(i<number)
{
printf("小!");
}
else
{
printf("对!");
}
}
return 0;
}
例:3个数求最大值
#include "stdio.h"
main()
{
int a,b,c,max;
printf("请输入3个数字:\n");
printf("例如:1,2,3\n");
scanf("%d,%d,%d",&a,&b,&c);
if(a>b&&a>c) //如果a>b
{
max=a;
}
else
{
if(c>b&&c>a) //如果 c>b
{
max=c;
}
else
{
max=b;
}
}
printf("%d",max);
}
注意:
- 不平衡的if-else结构会增加阅读和理解程序的困难。
- 正确的缩进格式(即锯齿形书写格式)可以帮助人们理解程序,但错误的缩进格式反而会使人迷惑。
- 不要太相信自己的判断,要严格按语法关系检查程序。在不易弄清的地方可以加花括号来保证自己构思的逻辑关系的正确性。
4.2 switch语句
switch语句用于单条件测试,从其多种结果中取一的情形
1.一般形式:
switch (表达式)
{
case常量表达式1: 语句1;
case常量表达式2: 语句2;
……
case常量表达式n: 语句n;
[default : 语句n+1;]
}
- 执行时,系统首先求解表达式的值,然后依次与各个case后面给出的常量表达式的值相比较,当表达式的值与某个case后的常量表达式的值相等时,就从此处开始执行该case后面的语句,而不再进行判断
- 如果所有的case后面的常量表达式的值都和表达式的值不匹配,系统就执行default后面的语句,如果程序省略了default语句,那么将不作任何处理,接着执行该选择结构下面的语句。
注意:
- <表达式>可以是任何类型,经常采用整型或字符型表达式
- case后面必须是常量表达式,不能包含变量,且各常量表达式的值不能相同,否则会出现互相矛盾的现象。因为case后面的常量表达式实际上起语句标号的作用,而程序中不应该同时出现相同标号的语句。
- 在case后,允许有多个语句,可以不用{}括起来。
- 各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
- 多个case可以共用同一组执行语句,此时只有在包含语句的case中有break语句,而其他case中则不包含break语句。
- switch语句也可以内嵌在某个case语句中使用,还可以和if语句或if语句的嵌套形式互相嵌套使用
例:输入任一平年的月份,输出该月份对应的天数
#include "stdio.h"
main()
{
int m;
int d;
printf("请输入月份:");
scanf("%d",&m);
switch(m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:printf("31!");break;
case 4:
case 6:
case 9:
case 11:printf("30!");break;
case 2:printf("28!");break;
default:printf("输入错误!");break;
}
}
4.3 经典程序举例
1. 例:输入三个整数,输出最大数和最小数。
首先比较a,b的大小,把大数装入max,小数装入min中。
然后再与c比较,若max小于c,则把c赋予max;
如果c小于min,则把c赋予min。
因此max总是最大数,而min总是最小数。
最后输出max和min的值即可。
#include "stdio.h"
main()
{
int a,b,c;
int max,z,min;
printf("请输入3个整数:\n");
printf("例:1,2,3\n");
scanf("%d,%d,%d",&a,&b,&c);
if(a>b)
{
max=a;
min=b;
}
else
{
max=b;
min=a;
}
if(max<c)
{
max=c;
}
else
{
if(min>c)
{
min=c;
}
}
printf("max=%d\n",max);
printf("min=%d",min);
}
2. 例:计算器程序。用户输入运算数和四则运算符,输出计算结果。
#include "stdio.h"
main()
{
int a,b;
char c;
float d;
printf("请输入:");
scanf("%d%c%d",&a,&c,&b);
switch(c)
{
case '*':d=a*b;break;
case '%':d=a%b;break;
case '/':d=a/b;break;
case '-':d=a-b;break;
case '+':d=a+b;break;
default:printf("输入错误!");
}
printf("%f",d);
return 0;
}
3. 例:求一元二次方程ax +bx+c=0的根。
main()
{
float a,b,c,disc,x1,x2,realpart,imagpart;
printf("请输入a,b,c的值\n");
scanf("%f,%f,%f",&a,&b,&c);
if(fabs(a)<=1e-6&&fabs(b)<=1e-6)
{
printf("方程无解!");
}
else
{
if(fabs(a)<=1e-6&&fabs(b)>1e-6)
{
printf("方程有单根是%8.4f\n",-c/b);
}
else
{
disc=b*b-4*a*c;
if(fabs(disc)<=1e-6||disc>1e-6)
{
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc)/(2*a));
printf("方程有两个根:");
printf("x1=%8.4f\n",x1);
printf("x2=%8.4f\n",x2);
}
else
{
realpart=-b/(2*a);
imagpart=sqrt(-disc)/(2*a);
printf("方程有两个虚根!\n",realpart,imagpart);
printf("x1=%8.4f+%8.4fi \n",realpart,imagpart);
}
}
}
return 0;
}
4. 例:已知某公司员工的底薪为500元,该员工在某月所接工程项目的利润profit与个人提成的关系如下(计量单位:元):利润profit<1000,没有提成;利润在1000≤profit<2000时,提成是所有利润的10%;当利润在2000≤profit<5000之间时,提成是所有利润的15%;当利润在5000≤profit<10000之间时,提成是所有利润的20%;当profit≥10000时,提成是所有利润的25%。
main()
{
int p; //利润
int c;
float d=0,s=500;
printf("请输入:");
scanf("%d",&p);
if(p>=10000)
{
c=10;
}
else
{
c=p/1000;
}
switch(c)
{
case 0:d=0;break;
case 1:d=0.1;break;
case 2:
case 3:
case 4:d=0.15;break;
case 5:
case 6:
case 7:
case 8:
case 9:d=0.2;break;
case 10:d=0.25;break;
}
s=s+p*d;
printf("s=%f",s);
return 0;
}
5. 例:王小姐9月份的业绩不错,根据合同,公司给她薪资为58000元,*个人所得税法规定:从2011年9月1日起,中国内地个税免征额调至3500元。当月的收入超过3500元按照以下表格提供的利率缴纳个人收入所得税,王小姐非常想知道她9月拿到自己手里的钱是多少?
级数 |
全月应纳税所得额(含税级距) |
税率(%) |
1 |
全月应纳税所得额不超过1500元 |
3% |
2 |
全月应纳税所得额超过1500元至4500元 |
10% |
3 |
全月应纳税所得额超过4500元至9000元 |
20% |
4 |
全月应纳税所得额超过9000元至35000元 |
25% |
5 |
全月应纳税所得额超过35000元至55000元 |
30% |
6 |
全月应纳税所得额超过55000元至80000元 |
35% |
7 |
全月应纳税所得额超过80000元 |
45% |
#include "stdio.h"
main()
{
long int m,s;
float d,p;
scanf("%ld",&m);
if(m<=3500)
p=m;
s=m-3500;
if(s>0&&s<=1500)
p=m-s*0.03;
if(s>1500&&s<=4500)
p=m-(1500*0.03+(s-1500)*0.1);
if(s>4500&&s<=9000)
p=m-(1500*0.03+3000*0.1+(s-4500)*0.2);
if(s>9000&&s<=35000)
p=m-(1500*0.03+3000*0.1+4500*0.2+(s-9000)*0.25);
if(s>35000&&s<=55000)
p=m-(1500*0.03+3000*0.1+26000*0.25+(s-35000)*0.3);
if(s>55000&&s<80000)
p=s-(1500*0.03+3000*0.1+26000*0.25+20000*0.3+(s-55000)*0.35);
if(s>80000)
p=m-(1500*0.03+3000*0.1+26000*0.25+20000*0.3+25000*0.35+(s-80000)*0.45);
printf("税后:%f\n税:%f\n",p,m-p);
return 0;
}