第3 章
选择结构程序设计
  3.1 写出下面各逻辑表达式的值。设a = 3,b = 4,c = 5。
(1) a+b>c && b = = c 
(2) a‖b+c && b-c 
(3) !(a>b) && !c‖1 
(4) !(x = a) && (y = b) && 0 
(5) !(a+b)+c-1 && b+c / 2 
解: 
(1) 0 
(2) 1 
(3) 1 
(4) 0 
(5) 1 
3.2 有3 个整数a,b,c,由键盘输入,输出其中最大的数,请编程序。
解: 方法一。N.S 图见图3.1。
输入3 个整数a,b,c 
a<b 
  T F  
b<c 
  T F  
输出最大值
c 
输出最大值
b 
a<c 
  T F  
输出最大值
c 
输出最大值
a 
图 3.1 
编写程序如下。
  #include<stdio.h> 
int main() 
 { int a,b,c; 
printf("请输入3 个整数:");

 17 
    scanf("%d,%d,%d",&a,&b,&c); 
 if (a<b) 
  if (b<c) 
   printf("max=%d\n",c); 
  else 
   printf("max=%d\n",b); 
 else if (a<c) 
   printf("max=%d\n",c); 
  else 
   printf("max=%d\n",a); 
 return 0; 
} 
运行结果: 
  请输入3 个整数: 12, 34, 9 ↙ 
max=34 
方法二。使用条件表达式,可以使程序更加简明、清晰。
  #include<stdio.h> 
int main() 
 { int a,b,c,temp,max; 
 printf("请输入3 个整数:"); 
 scanf("%d,%d,%d",&a,&b,&c); 
 temp=(a>b)? a:b;         /.将a 和b 中的大者存入temp 中./ 
 max=(temp>c)? temp:c;       /. 将a 和b 中的大者与c 比较,取最大者./ 
 printf("3 个整数的最大数是%d\n",max); 
 return 0; 
} 
运行结果: 
  请输入3 个整数: 12, 34, 9 ↙ 
3 个整数的最大数是34 
3.3 有一个函数: 
y = 
x  x < 1 
2x - 1  1 ≤ x < 10 
3x - 11  x ≥ 10 
ì
.
í .. 
.. 
  写程序,输入x,输出y 值。
解: 编写程序如下。
  #include<stdio.h> 
int main() 
 { int x,y; 
 printf("输入x:"); 
 scanf("%d",&x);

 18 
 if(x<1)                   //x<1 
 { y=x; 
  printf("x=%3d, y=x=%d\n" ,x,y); 
 } 
 else if(x<10)                //1<=x<10 
  { y=2.x-1; 
  printf("x=%d, y=2.x-1=%d\n",x,y); 
  } 
  else                    //x>=10 
  { y=3.x-11; 
  printf("x=%d, y=3.x-11=%d\n",x,y); 
  } 
  return 0; 
} 
运行结果: 
  ① 输入x: 4 ↙ 
x=4, y=2.x-1=7 
② 输入x: -1 ↙ 
x=-1, y=x=-1 
③ 输入x: 20 ↙ 
x= 20, y=3.x-11=49 
3.4 给出一百分制成绩,要求输出成绩等级'A' , 'B' , 'C' , 'D' , 'E' 。90 分及以上为
'A' ,80 ~ 89 分为'B' ,70 ~ 79 分为'C' ,60 ~ 69 分为'D' ,60 分以下为'E' 。
解: 编写程序如下。
  #include<stdio.h> 
int main() 
 { float score; 
  char grade; 
  printf("请输入学生成绩:"); 
  scanf("%f",&score); 
  while (score>100‖score<0) 
  {printf("\n 输入有误,请重新输入"); 
  scanf("%f",&score); 
  } 
  switch((int)(score/10)) 
   {case 10: 
case 9: grade='A';break; 
case 8: grade='B';break; 
case 7: grade='C';break; 
case 6: grade='D';break; 
case 5: 
case 4: 
case 3:

 19 
  case 2: 
  case 1: 
  case 0: grade='E'; 
  } 
  printf("成绩是%5.1f,相应的等级是%c.\n ",score,grade); 
  return 0; 
 } 
运行结果: 
  ① 请输入学生成绩: 90.5 ↙ 
成绩是90.5,相应的等级是A 
② 请输入学生成绩: 59 ↙ 
成绩是59.0,相应的等级是E 
说明: 对输入的数据进行检查,如小于0 或大于100,要求重新输入。(int) 
(score / 10) 的作用是将(score / 10) 的值进行强制类型转换,得到一个整型值。例如,当
score 的值为78 时,(int)(score / 10) 的值为7。然后在switch 语句中执行case 7 中的语
句,使grade = 'C' 。
3.5 给一个不多于5 位的正整数,要求: 
① 求出它是几位数; 
② 分别输出每一位数字; 
③ 按逆序输出各位数字,例如原数为321,应输出123。
解: 编写程序如下。
  #include<stdio.h> 
#include<math.h> 
int main() 
 { long int num; 
 int indiv,ten,hundred,thousand,ten_thousand,place; 
/.分别代表个位、十位、百位、千位、万位和位数./ 
 printf("请输入一个整数(0~99999):"); 
 scanf("%ld",&num); 
 if (num>9999) 
   place=5; 
 else if (num>999) 
   place=4; 
 else if (num>99) 
   place=3; 
 else if (num>9) 
   place=2; 
 else place=1; 
 printf("位数:%d\n",place); 
 printf("每位数字为:"); 
 ten_thousand=num/10000;

 20 
 thousand=(int)(num-ten_thousand.10000)/1000; 
 hundred=(int)(num-ten_thousand.10000-thousand.1000)/100; 
 ten=(int)(num-ten_thousand.10000-thousand.1000-hundred.100)/10; 
 indiv = (int)(num -ten _thousand .10000 -thousand .1000 -hundred .100 - 
ten.10); 
 switch(place) 
  {case 5:printf("%d,%d,%d,%d,%d",ten_thousand,thousand,hundred,ten, 
indiv); 
    printf("\n 反序数字为:"); 
    printf("%d%d%d%d%d\n",indiv,ten,hundred,thousand,ten_thousand); 
    break; 
  case 4:printf("%d,%d,%d,%d",thousand,hundred,ten,indiv); 
    printf("\n 反序数字为:"); 
    printf("%d%d%d%d\n",indiv,ten,hundred,thousand); 
    break; 
  case 3:printf("%d,%d,%d",hundred,ten,indiv); 
    printf("\n 反序数字为:"); 
    printf("%d%d%d\n",indiv,ten,hundred); 
    break; 
  case 2:printf("%d,%d",ten,indiv); 
    printf("\n 反序数字为:"); 
    printf("%d%d\n",indiv,ten); 
    break; 
  case 1:printf("%d",indiv); 
    printf("\n 反序数字为:"); 
    printf("%d\n",indiv); 
    break; 
  } 
  return 0; 
} 
运行结果: 
  请输入一个整数(0~99999): 98423 ↙ 
位数: 5 
每位数字为: 9,8,4,2,3 
反序数字为: 32489 
3.6 企业发放的奖金根据利润提成。利润I 低于或等于100 000 元的,奖金可提成
10%;利润高于100 000 元,低于200 000 元(100 000<I≤200 000)时,低于100 000 元的部
分按10% 提成,高于100 000 元的部分,可提成7. 5%;200 000 < I ≤400 000 时,低于
200 000 元的部分仍按上述办法提成(下同)。高于200 000 元的部分按5% 提成; 
400 000<I≤600 000 元时,高于400 000 元的部分按3%提成;600 000<I≤100 0000 时,高
于600 000 元的部分按1.5%提成;I>1 000 000 时,超过1 000 000 元的部分按1%提成。从
键盘输入当月利润I,求应发奖金总数。要求:

 21 
(1) 用if 语句编程序; 
(2) 用switch 语句编程序。
解: 编写程序如下。
(1) 用if 语句编程序。
  #include<stdio.h> 
int main() 
 { long i; 
 double bonus,bon1,bon2,bon4,bon6,bon10; 
 bon1=100000.0.1; 
 bon2=bon1+100000.0.075; 
 bon4=bon2+100000.0.05; 
 bon6=bon4+100000.0.03; 
 bon10=bon6+400000.0.015; 
 printf("请输入利润i:"); 
 scanf("%ld",&i); 
 if (i<=100000) 
  bonus=i.0.1; 
 else if (i<=200000) 
  bonus=bon1+(i-100000).0.075; 
 else if (i<=400000) 
  bonus=bon2+(i-200000).0.05; 
 else if (i<=600000) 
  bonus=bon4+(i-400000).0.03; 
 else if (i<=1000000) 
  bonus=bon6+(i-600000).0.015; 
 else 
  bonus=bon10+(i-1000000).0.01; 
 printf("奖金是: %10.2f\n",bonus); 
 return 0; 
} 
运行结果: 
  请输入利润i: 234000 ↙ 
奖金是: 19200.00 
此题的关键在于正确写出每一区间的奖金计算公式,例如,利润在10 万~20 万元时, 
奖金应由两部分组成: 
① 利润为10 万元时应得的奖金,即10 万元.0.1。
② 10 万元以上部分应得的奖金,即(num-10 万).0.075 元。
同理,20 万~40 万元这个区间的奖金也应由两部分组成: 
① 利润为20 万元时应得的奖金,即10 万元.0.1+10 万元.0.075。
② 20 万元以上部分应得的奖金,即(num-20 万).0.05 元。

 22 
程序中先把10 万元、20 万元、40 万元、60 万元、100 万元各关键点的奖金计算出来, 
即bon1,bon2,bon4,bon6,bon10。然后再加上各区间附加部分的奖金即可。
(2) 用switch 语句编写程序,N.S 图见图3.2。
输入利润i 
    i ≤105 
 T F 
i.0.1     i ≤2.105 
 T F 
bon1+ 
(i-105 ) 
.0.075 
    i ≤4.105 
 T F 
bon2+ 
(i-2.105) 
.0.05 
    i ≤6.105 
 T F 
bon4+ 
(i-4.105) 
.0.03 
i ≤106 
 T F 
bon6+ 
(i-6.105) 
.0.015 
bon10+ 
(i-106 ) 
.0.01 
图 3.2 
编写程序如下。
  #include<stdio.h> 
int main() 
 { long i; 
 double bonus,bon1,bon2,bon4,bon6,bon10; 
 int branch; 
 bon1=100000.0.1; 
 bon2=bon1+100000.0.075; 
 bon4=bon2+200000.0.05; 
 bon6=bon4+200000.0.03; 
 bon10=bon6+400000.0.015; 
 printf("请输入利润i:"); 
 scanf("%ld",&i); 
 branch=i/100000; 
 if (branch>10) branch=10; 
 switch(branch) 
 { case 0:bonus=i.0.1;break; 
  case 1:bonus=bon1+(i-100000).0.075;break; 
  case 2: 
  case 3: bonus=bon2+(i-200000).0.05;break; 
  case 4: 
  case 5: bonus=bon4+(i-400000).0.03;break; 
  case 6: 
  case 7: 
  case 8:

 23 
  case 9: bonus=bon6+(i-600000).0.015;break; 
  case 10: bonus=bon10+(i-1000000).0.01; 
 } 
 printf("奖金是%10.2f\n",bonus); 
 return 0; 
}
运行结果: 
  请输入利润i: 156890 ↙ 
奖金是: 14266.75 
3.7 输入4 个整数,要求按由小到大的顺序输出。
解: 此题采用依次比较的方法排出其大小顺序。在学习了循环和数组以后,可以掌
握更多的排序方法。
编写程序如下。
  #include<stdio.h> 
int main() 
 { int t,a,b,c,d; 
 printf("请输入4 个数:"); 
 scanf("%d,%d,%d,%d",&a,&b,&c,&d); 
 printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d); 
 if (a>b) 
  { t=a;a=b;b=t;} 
 if (a>c) 
  { t=a;a=c;c=t;} 
 if (a>d) 
  { t=a;a=d;d=t;} 
 if (b>c) 
  { t=b;b=c;c=t;} 
 if (b>d) 
  { t=b;b=d;d=t;} 
 if (c>d) 
  { t=c;c=d;d=t;} 
 printf("排序结果如下: \n"); 
 printf("%d %d %d %d \n",a,b,c,d); 
 return 0; 
} 
运行结果: 
  请输入4 个数: 6,8,1,4 ↙ 
a=6,b=8,c=1,d=4 
排序结果如下: 
4 6 8 
3.8 有4 个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1m,见

 24 
图3.3。这4 个塔的高度为10m,塔以外无建筑物。现输入任一点的坐标,求该点的建筑高
度(塔外的高度为0)。
解: N.S 图见图3.4。
图 3.3 
输入某点坐标(x,y) 
求(x,y)到各塔心的距离d1,d2,d3,d4 
是否在塔外
  T F  
(x,y)处高度为0 (x,y)处高度为10 
输出结果
图 3.4 
编写程序如下。
  #include<stdio.h> 
int main() 
 { int h=10; 
 float x1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=2,y4=-2,x,y, 
d1,d2,d3,d4; 
 printf("请输入一个点(x,y):"); 
 scanf("%f,%f",&x,&y); 
 d1=(x-x4).(x-x4)+(y-y4).(y-y4); /.求该点到各中心点距离./ 
 d2=(x-x1).(x-x1)+(y-y1).(y-y1); 
 d3=(x-x2).(x-x2)+(y-y2).(y-y2); 
 d4=(x-x3).(x-x3)+(y-y3).(y-y3); 
 if (d1>1 && d2>1 && d3>1 && d4>1) h=0; /.判断该点是否在塔外./ 
 printf("该点高度为%d\n",h); 
 return 0; 
} 
运行结果: 
  ① 请输入一个点(x,y): 0.5,0.7 ↙ 
该点高度为0 
② 请输入一个点(x,y): 2.1,2.3 ↙ 
该点高度为10