第4章 选择结构程序设计
目录
2.C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?
3.写出下面各逻辑表达式的值。设a=3, b=4, c=5。
4.有3个整数a, b, c,由键盘输入,输出其中最大的数。
5.从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000的正数。若不是,则要求重新输入。
8.给出一百分制成绩,要求输出成绩等级'A'、B'、'C'、'D'、'E'。90分以上为'A',80~89分为'B',70~79分为'C',60~69分为'D',60分以下为'E'。
1.什么是算术运算?什么是关系运算?什么是逻辑运算?
算术运算即“四则运算”,是加法、减法、乘法、除法、乘方、开方等几种运算的统称。C语言中的算术运算符包括:+、-、*、/、++、--、%等种类。
所谓“关系运算”就是“比较运算”,将两个数值进行比较,判断其比较的结果是否符合给定的条件。常见的关系运算符包括:<、<=、>、>=、==、!=等种类。
在C语言中,逻辑运算通常用于使用逻辑运算符将关系表达式或其它逻辑量连接起来组成逻辑表达式用来测试真假值。常见的逻辑运算符包括:&&、||、!等种类。
2.C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?
在C的逻辑运算中,以1代表“真”,以0代表“假”。
而系统用0代表“假”,用非0代表“真”。
3.写出下面各逻辑表达式的值。设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 解释:b == c 为假
(2)1
(3)1
(4)0 解释:xxx && 0 无论左边是真是假,结果都为假
(5)1
4.有3个整数a, b, c,由键盘输入,输出其中最大的数。
#include <stdio.h>
int main() {
int a, b, c, max;
printf("请输入a, b, c的值(a,b,c):");
scanf("%d,%d,%d", &a, &b, &c);
if(a > b) max = a;
else max = b;
if(max < c) max = c;
printf("max = %d\n", max);
return 0;
}
5.从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000的正数。若不是,则要求重新输入。
#include <stdio.h>
#include <math.h> // sqrt()开平方函数,在头文件<math.h>中
int main() {
int n, b, c, max;
printf("\n请输入n的值(0<n<1000):");
scanf("%d", &n);
if(n <= 0 || n >= 1000) {
printf("\nn的值无效,请重新n的值(0<n<1000):");
scanf("%d", &n);
}
printf("\n(int)sqrt(n) = %d\n", (int)sqrt(n)); // (int)强制类型转换,遇到小数只保留整数部分;
return 0;
}
6.有一个函数:
写程序,输入x的值,输出y相应的值。
#include <stdio.h>
int main() {
int x, y;
printf("\n请输入x的值:");
scanf("%d", &x);
if(x < 1) {
y = x;
} else if(x < 10) {
y = 2 * x - 1;
} else {
y = 3 * x - 11;
}
printf("\ny = %d\n", y);
return 0;
}
7.有一函数:
有人编写了以下两个程序,请分析它们是否能实现题目要求。不要急于上机运行程序。先分析两个程序的逻辑,画出它们的流程图,分析它们的运行情况。然后上机运行程序,观察和分析结果。
(1)
#include <stdio.h>
int main() {
int x, y;
printf("enter x:");
scanf("%d", &x);
y = -1;
if(x != 0)
if(x > 0)
y = 1;
else
y = 0;
printf("x = %d, y = %d\n", x, y);
return 0;
}
(2)
#include <stdio.h>
int main() {
int x, y;
printf("enter x:");
scanf("%d", &x);
y = 0;
if(x >= 0)
if(x > 0) y = 1;
else y = -1;
printf("x = %d,y = %d\n", x, y);
return 0;
}
(1)
流程图:
分析:
本段代码无法正确实现,如x < 0时,y的值应为1,实际为0。注意代码中的else始终与上方离它最近的且未配对的if配对,如图所示:
错误运行结果:
(2)
流程图:
分析:
本段代码同样无法正确实现,如x = 0时,y的值应为0,实际为-1。同样要注意代码中的else始终与上方离它最近的且未配对的if配对。
错误运行结果:
8.给出一百分制成绩,要求输出成绩等级'A'、B'、'C'、'D'、'E'。90分以上为'A',80~89分为'B',70~79分为'C',60~69分为'D',60分以下为'E'。
#include <stdio.h>
#include <stdlib.h> // exit()函数包含在<stdlib.h>中
int main() {
int n;
char ch;
printf("\n请输入成绩:");
scanf("%d", &n);
if(n < 0 || n > 100) {
printf("\n输入有误!\n");
exit(0);
} else if(n == 100) {
ch = 'A';
} else {
switch(n / 10) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
ch = 'E';
break;
case 6:
ch = 'D';
break;
case 7:
ch = 'C';
break;
case 8:
ch = 'B';
break;
case 9:
ch = 'A';
break;
}
}
printf("\n%d -- %c\n", n, ch);
return 0;
}
9.给一个不多于5位的正整数,要求:
①分别求出它是几位数;
②分别输出每一位数字;
③按逆序输出各位数字,例如原数为321,应输出123。
#include <stdio.h>
#include <stdlib.h>
int main() {
int x, len;
printf("\n请输入一个不多于5位的正整数:");
scanf("%d", &x);
if(x <= 0 || x >= 100000) {
printf("\n输入有误!\n");
exit(0);
}
if(x > 0 && x <= 9) {
len = 1;
} else if(x > 9 && x <= 99) {
len = 2;
} else if(x > 99 && x <= 999) {
len = 3;
} else if(x > 999 && x <= 9999) {
len = 4;
} else {
len = 5;
}
printf("\n%d是%d位数\n", x, len);
switch(len) {
case 1:
printf("\n每一位数为:%d\n", x);
printf("\n逆序为:%d\n", x);
break;
case 2:
printf("\n每一位数为:%d, %d\n", x / 10, x % 10);
printf("\n逆序为:%d\n", (x % 10) * 10 + (x / 10));
break;
case 3:
printf("\n每一位数为:%d, %d, %d\n", x / 100 % 10, x / 10 % 10, x % 10);
printf("\n逆序为:%d\n", (x % 10) * 100 + (x / 10 % 10) * 10 + (x / 100 % 10));
break;
case 4:
printf("\n每一位数为:%d, %d, %d, %d\n", x / 1000 % 10, x / 100 % 10, x / 10 % 10, x % 10);
printf("\n逆序为:%d\n", (x % 10) * 1000 + (x / 10 % 10) * 100 + (x / 100 % 10) * 10 + (x / 1000 % 10));
break;
case 5:
printf("\n每一位数为:%d, %d, %d, %d, %d\n", x / 10000 % 10, x / 1000 % 10, x / 100 % 10, x / 10 % 10, x % 10);
printf("\n逆序为:%d\n", (x % 10) * 10000 + (x / 10 % 10) * 1000 + (x / 100 % 10) * 100 + (x / 1000 % 10) * 10 + (x / 10000 % 10));
break;
}
return 0;
}
10.企业发放的奖金根据利润提成。利润I低于或等于100000元的,奖金可提成10%;利润高于100000元,低于200000元(100000<I≤200000)时,低于100000元的部分按10%提成,高于100000元的部分,可提成7.5%;200000<I≤400000时,低于200000元的部分仍按上述办法提成(下同)。高于200000元的部分按5%提成;400000<I≤600000元时,高于400000元的部分按3%提成;600000<I≤1000000时,高于600000元的部分按1.5%提成;I>1000000时,超过1000000元的部分按1%提成。从键盘输人当月利润I,求应发奖金总数。
要求:
(1)用if语句编程序;
(2)用switch语句编程序。
(1)
#include <stdio.h>
#include <stdlib.h>
int main() {
long i;
double n;
printf("\n请输入当月利润i:");
scanf("%ld", &i);
if(i <= 0) {
printf("\n输入有误,利润必须为正数!\n");
exit(0);
}
if(i <= 100000) {
n = i * 0.1;
} else if(i <= 200000) {
n = 100000 * 0.1 + (i - 200000) * 0.075;
} else if(i <= 400000) {
n = 100000 * 0.1 + 100000 * 0.075 + (i - 200000) * 0.05;
} else if(i <= 600000) {
n = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + (i - 400000) * 0.03;
} else if(i <= 1000000) {
n = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 400000 * 0.03 + (i - 600000) * 0.015;
} else {
n = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 400000 * 0.03 + 600000 * 0.015 + (i - 1000000) * 0.01;
}
printf("\nn = %.2lf\n", n);
return 0;
}
(2)
#include <stdio.h>
#include <stdlib.h>
int main() {
long i, t;
double n;
printf("\n请输入当月利润i:");
scanf("%ld", &i);
if(i <= 0) {
printf("\n输入有误,利润必须为正数!\n");
exit(0);
}
t= i / 100000;
if(t > 10) t = 10;
switch(t) {
case 0:
n = i * 0.1;
break;
case 1:
n = 100000 * 0.1 + (i - 200000) * 0.075;
break;
case 2:
case 3:
n = 100000 * 0.1 + 100000 * 0.075 + (i - 200000) * 0.05;
break;
case 4:
case 5:
n = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + (i - 400000) * 0.03;
break;
case 6:
case 7:
case 8:
case 9:
n = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 400000 * 0.03 + (i - 600000) * 0.015;
break;
case 10:
n = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 400000 * 0.03 + 600000 * 0.015 + (i - 1000000) * 0.01;
break;
}
printf("\nn = %.2lf\n", n);
return 0;
}
11.输入4个整数,要求按由小到大的顺序输出。
#include <stdio.h>
int main() {
int a, b, c, d, t;
printf("请输入a, b, c, d的值(a,b,c,d):");
scanf("%d,%d,%d,%d", &a, &b, &c, &d);
printf("\n排序前:%d, %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排序后:%d, %d, %d, %d\n", a, b, c, d);
return 0;
}
12.有4个圆塔,圆心分别为(2, 2)、(-2, 2)、(-2, -2)、(2, -2),圆半径为1,见图4.17。这4个塔的高度为10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。
#include <stdio.h>
int main() {
int h = 10;
float x, y, x1 = 2, y1 = 2, x2 = -2, y2 = 2, x3 = -2, y3 = -2, x4 = 2, y4 = -2, d1, d2, d3, d4;
printf("\n请输入一个点(x,y):");
scanf("%f,%f", &x, &y);
// 求该点到各中心点的距离
d1 = (x - x1) * (x - x1) + (y - y1) * (y - y1);
d2 = (x - x2) * (x - x2) + (y - y2) * (y - y2);
d3 = (x - x3) * (x - x3) + (y - y3) * (y - y3);
d4 = (x - x4) * (x - x4) + (y - y4) * (y - y4);
if(d1 > 1 && d2 > 1 && d3 > 1 && d4 > 1) h = 0;
printf("\nh = %d\n", h);
return 0;
}