double x1, y1, x2, y2, x3, y3;
double d12, d13, d23;
double area, s;
scanf ("%lf%lf",&x1,&y1);
scanf ("%lf%lf", &x2, &y2);
scanf ("%lf%lf", &x3, &y3);
d12 = sqrt ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 -y2));
d13 = sqrt ((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3));
d23 = sqrt ((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3));
if ((d12 + d13 > d23) && (d13 + d23 > d12)&& (d12 + d23 > d13)){
s=(d12 + d13 + d23) / 2;
area = sqrt (s * (s - d12) * (s - d13) * (s - d23));
printf ("L = %.2lf, A = %.2lf\n", s * 2.0, area);
} else
printf ("Impossible\n");
return 0;
}
3.4 实验指导教材参考答案
一 、 调 试 示 例
求一元二次方程的根:输入参数 a、b、c,求一元二次方程 ax2 + bx + c = 0 的根。
解答:
# include <stdio.h>
# include <math.h>
# define eps 0.0000000001 int main (void)
{
double a, b, c, d;
scanf ("%lf%lf%lf", &a, &b, &c);
d = b * b - 4 * a * c;
if (fabs (a) < eps){
if (fabs (b) < eps){
if (fabs (c) < eps){
printf ("Zero Equation\n");
} else{
printf ("Not An Equation\n");
} } else{
printf ("%0.2f\n", -c / b);
} } else{
if (fabs (d) < eps){
printf ("%0.2f\n", -b / (a+a) );
}
else if (d > 0){
printf ("%0.2f\n", (-b + sqrt (d)) / (2 * a));
printf ("%0.2f\n", (-b - sqrt (d)) / (2 * a));
}
else if (fabs (b) < eps){
printf ("0.00+%0.2fi\n", sqrt (-d) / (2 * a));
printf ("0.00-%0.2fi\n", sqrt (-d) / (2 * a));
} else{
printf ("%0.2f+%0.2fi\n", -b / (2 * a), sqrt (-d) / (2 * a));
printf ("%0.2f-%0.2fi\n", -b / (2 * a), sqrt (-d) / (2 * a));
} }
return 0;
}
二 、 基 础 编 程 题
(1)计算符号函数的值:输入一个整数 x,计算并输出符号函数 sign(x) 的值。试编写相 应程序
⎪ ⎩
⎪ ⎨
⎧
>
=
<
−
=
=
0 1
0 0
0 1
) (
x x x x
sign y
,
,
,
解答:参见练习3-2。
(2)比较大小:输入 3 个整数,按从小到大的顺序输出。
解答:参见习题程序设计第1 题。
(3)统计字符:输入 10 个字符,统计其中英文字母、空格或回车、数字字符和其他字符的 个数。
解答:参见练习3-4。
(4)查询水果的单价:有 4 种水果,苹果(apples)、梨(pears)、桔子(oranges)和葡萄
(grapes),单价分别是 3.00 元/公斤,2.50 元/公斤,4.10 元/公斤和 10.20 元/公斤。在屏幕
上显示以下菜单(编号和选项),用户可以连续查询水果的单价,当查询次数超过5 次时,
自动退出查询;不到 5 次时,用户可以选择退出。当用户输入编号 1~4,显示相应水果的
单价(保留一位小数);输入0,退出查询;输入其他编号,显示价格为 0。试编写相应程序。
[1] apples [2] pears [3] oranges [4] grapes [0] Exit
解答:参见练习3-8。
(5)计算个人所得税:假设个人所得税为:税率 * (工资 - 1600)。请编写程序计算应缴的 所得税,其中税率定义为:
•
当工资不超过 1600 时,税率为 0;• 当工资在区间(1600, 2500]时,税率为 5%;
• 当工资在区间(2500, 3500]时,税率为 10%;
• 当工资在区间(3500, 4500]时,税率为 15%;
• 当工资超过 4500 时,税率为 20%。
解答:
# include <stdio.h>
# include <math.h>
int main(void) {
double rate, salary, tax;
scanf("%lf", &salary);
if (salary > 4500.0){
rate = 0.20;
}
else if (salary > 3500.0){
rate = 0.15;
}
else if (salary > 2500.0){
rate = 0.10;
}
else if (salary > 1600.0){
rate = 0.05;
} else{
rate = 0.0;
}
tax = fab((salary - 1600) * rate);
printf("%.2f\n", tax);
return 0;
}
(6)统计学生成绩:输入一个正整数 n,再输入 n 个学生的成绩,统计五分制成绩的分布。
百分制成绩到五分制成绩的转换规则:大于或等于90 分为 A,小于 90 分且大于或等于 80 分为B,小于 80 分且大于或等于 70 为 C,小于 70 分且大于或等于 60 为 D,小于 60 分为 E。
解答:参见习题程序设计第4 题。
三 、 改 错 题
输出三角形面积和周长:输入三角形的3 条边 a、b、c,如果能构成一个三角形,输出
面积area 和周长 perimeter(保留 2 位小数);否则,输出“These sides do not correspond to a valid triangle”。(源程序 error03_2.cpp)
在一个三角形中,任意两边之和大于第3 边。三角形面积计算公式:
area=
s ( s − a )( s − b )( s − c )
其中,s = (a+b+c)/2解答:
# include <stdio.h>
# include <math.h>
int main (void) {
int a, b, c;
double area, perimeter, s;
scanf ("%d%d%d", &a, &b, &c);
if ((a + b > c) && (b + c > a) && (a + c > b)){
perimeter = a + b + c;
s = (a + b + c) * 1.0 / 2;
area = sqrt(s * (s-a) * (s-b) * (s-c));
printf ("area = %.2f; perimeter = %.2f\n",area, perimeter);
} else {
printf ("These sides do not correspond to a valid triangle\n");
} return 0;
}
四 、 拓 展 编 程 题
(1)三天打鱼两天晒网:中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三
天打鱼两天晒网”,问这个人在以后的第 N 天中是“打鱼”还是“晒网”?试编写相应程序。
解答:
# include <stdio.h>
int main(void) {
int m, n;
scanf ("%d", &n);
m = n % 5;
if ((m >= 1) && (m < 4) ){
printf ("Fishing in day %d\n", n);
} else{
printf ("Drying in day %d\n", n);
}
return 0;
}
(2)高速公路超速处罚:按照规定,在高速公路上行使的机动车,超出本车道限速的 10%
则处 200 元罚款;若超出 50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对
该机动车的处理。
解答:参见习题程序设计第2 题。
(3)计算油费:假设现在 90 号汽油 6.95 元/升、93 号汽油 7.44 元/升、97 号汽油 7.93 元/
升。为吸引顾客,某自动加油站推出了“自助服务”和“协助服务”两个服务等级,分别可 得到5%和 3%的折扣。请编写程序,输入顾客的加油量 a,汽油品种 b(90、93 或 97)和服务 类型c(m 为自助服务,e 为协助服务),计算并输出应付款(保留小数点后 2 位)。
解答:
# include <stdio.h>
int main (void) {
int a, b;
char c ;
double price, money;
scanf ("%d%d", &a, &b);
getchar ();
c = getchar ();
if (b == 90){
price = 6.95;
}
else if (b == 93){
price = 7.44;
} else{
price = 7.93;
}
if(c == 'm'){
money = a * price * 0.95;
} else{
money = a * price * 0.97;
}
printf ("%.2f\n", money);
return 0;
}