20201015-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises05
P270
题解和分析
第一种方式,直接判断
/*
编写一程序P270.C实现以下功能
从键盘读入3个实数,按由大到小的顺序输出这3个数。
编程可用素材:
printf("请输入3个数:")、
printf("\n这三个数由大到小为: %.2f %.2f %.2f\n"…。
程序的运行效果应类似地如图1所示,图1中的红色部分是从键盘输入的内容。
请输入3个数:200.35 1056.1 72.132
这三个数由大到小为: 1056.10 200.35 72.13
解题思路
1. 直接判断,给出结果
2. 要注意考虑到所有情况
*/
#include <stdio.h>
int main(void)
{
double data1, data2, data3;
printf("请输入3个数:");
scanf("%lf %lf %lf", &data1, &data2, &data3);
if (data1 >= data2 && data1 >= data3)
{
if (data2 >= data3)
{
printf("\n这三个数由大到小为: %.2lf %.2lf %.2lf\n", data1, data2, data3);
}
else
{
printf("\n这三个数由大到小为: %.2lf %.2lf %.2lf\n", data1, data3, data2);
}
}
if (data2 >= data1 && data2 >= data3)
{
if (data1 >= data3)
{
printf("\n这三个数由大到小为: %.2lf %.2lf %.2lf\n", data2, data1, data3);
}
else
{
printf("\n这三个数由大到小为: %.2lf %.2lf %.2lf\n", data2, data3, data1);
}
}
if (data3 >= data1 && data3 >= data2)
{
if (data1 >= data2)
{
printf("\n这三个数由大到小为: %.2lf %.2lf %.2lf\n", data3, data1, data2);
}
else
{
printf("\n这三个数由大到小为: %.2lf %.2lf %.2lf\n", data3, data2, data1);
}
}
return 0;
}
第二种方式,节省判断,直接排序
/*
编写一程序P270.C实现以下功能
从键盘读入3个实数,按由大到小的顺序输出这3个数。
编程可用素材:
printf("请输入3个数:")、
printf("\n这三个数由大到小为: %.2f %.2f %.2f\n"…。
程序的运行效果应类似地如图1所示,图1中的红色部分是从键盘输入的内容。
请输入3个数:200.35 1056.1 72.132
这三个数由大到小为: 1056.10 200.35 72.13
解题
1. 可以采用交换的思路
2. 最大端和最小端位置固定即可
*/
#include <stdio.h>
int main(void)
{
double data1, data2, data3;
double tmp;
printf("请输入3个数:");
scanf("%lf %lf %lf", &data1, &data2, &data3);
// 始终让data1最大, data2中,则data3最小
if (data1 < data2)
{
tmp = data1;
data1 = data2;
data2 = tmp;
}
if (data1 < data3)
{
tmp = data1;
data1 = data3;
data3 = tmp;
}
if (data2 < data3)
{
tmp = data2;
data2 = data3;
data3 = tmp;
}
printf("\n这三个数由大到小为: %.2lf %.2lf %.2lf\n", data1, data2, data3); //由大到小
return 0;
}
/*
分析:
1. 注意其中的交换两个数的实现,其实,这里可以抽取出来,重构程序,生成交换函数
2. 这个程序更简洁,是因为进行了数据交换,也就是算法上有了变化
3. 任何一个问题,都可能会有多种解决思路和算法
*/
P723
题解和分析
/*
编写一程序P723.C实现以下功能
输入三角形的三边长a、b、c(边长可以是小数),求三角形面积area,并输出。
如果输入的三边构不成三角形,应给出“data error”的信息提示。
注:根据“海伦-秦九韶”公式,area=√p(p-a)(p-b)(p-c),其中p=(a+b+c)/2。
编程可用素材:
printf("please input triange sides: ")、
printf("\ndata error\n")、printf("\narea=…\n"…。
程序的运行效果应类似地如图1和图2所示,图中的红色部分是从键盘输入的内容。
please input triange sides: 3, 4, 5
area=6.00
图1 程序运行效果示例
please input triange sides: 3, 4, 8
data error
*/
#include <stdio.h>
#include <math.h>
int main(void)
{
double edgeA, edgeB, edgeC;
double circle,semi_circle;
double area;
printf("please input triange sides: ");
scanf("%lf, %lf, %lf", &edgeA, &edgeB, &edgeC);
// 如果不能构成三角形
if(((edgeA+ edgeB)<=edgeC) || ((edgeA+ edgeC)<=edgeB) || ((edgeC+ edgeB)<=edgeA))
{
printf("\ndata error\n");
}
else
{
// 可以构成三角形
circle = edgeA + edgeB + edgeC;
semi_circle = circle / 2;
area = sqrt(semi_circle * (semi_circle - edgeA) * (semi_circle - edgeB) * (semi_circle - edgeC));
printf("area=%.2lf", area);
}
return 0;
}
/*
分析:
1. 在以后的程序中,有很多程序动作, 是有前提条件的,当条件不满足时,做这个动作是没有意义的
比如这里的三角形求面积,如果都已经不能构成三角形了,面积本身也就没有意义了
无意义的事情,计算机是无法完成的
2. 程序是为了解决问题而编写的,是依赖于合理的算法写出来的,算法不合理时,程序肯定会有问题
3. if作为一个开关,试先置于程序开头或是检查节点部分,是以后设计程序时的一种常用思路
*/
P737
题解和分析
/*
编写一程序P737.C实现以下功能
从键盘输入3个整数,输出绝对值最大的数。
编程可用素材:
printf("Input 3 numbers: ")、
printf("\nThe number with maximum absolute value is ….\n"…。
程序的运行效果应类似地如图1所示,图1中的红色部分是从键盘输入的内容。
Input 3 numbers: 1, -362, 300
The number with maximum absolute value is -362.
*/
#include <math.h>
#include <stdio.h>
int main(void)
{
int data1, data2, data3;
int myMax = 0;
printf("Input 3 numbers: ");
scanf("%d, %d, %d", &data1, &data2, &data3);
if (abs(data1) > abs(data2) && abs(data1) > abs(data3))
{
myMax = data1;
}
if (abs(data2) > abs(data1) && abs(data2) > abs(data3))
{
myMax = data2;
}
if (abs(data3) > abs(data1) && abs(data3) > abs(data2))
{
myMax = data3;
}
printf("\nThe number with maximum absolute value is %d.\n", myMax);
return 0;
}
/*
分析:
1. 使用库函数
2. 判断三个数的最大值,算法很多,这只是一种
3. 计算顺序:先取绝对值,再判断
*/
P111
题解和分析
/*
编写一程序P111.C实现以下功能
x(x只考虑整数int且必须定义为int、但F(x)完全可能超过int的表示范围)通过键盘输入(输入前给出提示Please input x:),
然后计算并在屏幕上输出函数值。
编程可用素材:printf("Please input x: ")、printf("\nF(…) = …。
┌ -5x+27 (x<0)
F(x)= ├ 7909 (x=0)
└ 2x-1 (x>0)
程序的运行效果应类似地如图1所示,图中的红色部分是从键盘输入的内容。
Please input x: 3
F(3) = 5
*/
#include <stdio.h>
int main(void)
{
int data;
printf("Please input x: ");
scanf("%d", &data);
if(data < 0)
{
printf("F(%d) = %lu", data, (unsigned long )(-5 * (unsigned long )data + 27));
}
else if(data > 0)
{
printf("F(%d) = %lu", data, (unsigned long )(2 * (unsigned long )data -1));
}
else
{
printf("F(%d) = 7909", data);
}
return 0;
}
/*
分析:
1. 在一开始合理的数据表示范围里,即允许的值域里,表达数据没有问题,但运算过后的结果,可能超出值域范围,这就需要扩大值域范围来保证精度
2. 这个程序,可以分析出,结果是正数,可以使用无符号数,来扩大表示范围,保证结果表示的正确性
3. 要先转换,再计算
*/
P703
题解和分析
/*
编写一程序P703.C实现以下功能
已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与利润提成的关系如下(计量单位:元):
profit≤1000 没有提成;
1000<profit≤2000 提成10%;
2000<profit≤5000 提成15%;
5000<profit≤10000 提成20%;
10000<profit 提成25%。
请根据输入的利润计算员工的薪水。编程可用素材:printf("Input profit: ")、printf("\nsalary=…\n"…。
程序的运行效果应类似地如图1所示,图中的红色部分是从键盘输入的内容。
Input profit: 2000
salary=700.00
*/
#include <stdio.h>
int main(void)
{
double profit;
double salary = 500.00;
printf("Input profit: ");
scanf("%lf", &profit);
if(profit > 10000)
{
salary += profit * 0.25;
}
else if (profit > 5000 && profit <= 10000)
{
salary += profit * 0.20;
}
else if (profit > 2000 && profit <= 5000)
{
salary += profit * 0.15;
}
else if (profit > 1000 && profit <= 2000)
{
salary += profit * 0.10;
}
printf("\nsalary=%.2lf\n", salary);
return 0;
}
/*
分析:
1. a<b<c这样的数学书上的表达方式,在这里,其实是一个并且的关系,需要使用逻辑运算符来表达
2. 要特别注意这个条件范围 ,用数学集来表示,是左开区间,右闭区间,要特别注意取值的端点
3. 复合赋值运算符的使用
4. if...else...的嵌套使用,连续的if判断,要特别注意else与if的匹配
*/
P113
题解和分析
/*
编写一程序P113.C实现以下功能
已知某银行整存整取存款不同期限的年息利率分别为:
3.15%期限一年,3.63%期限二年, 4.02%期限三年,4.69%期限五年,5.36%期限八年。
从键盘上输入存钱的本金(以元为单位,必须定义为int且应考虑金额很大的情况)和存款期限(只考虑1,2,3,5,8),
求到期时能从银行得到的利息(以元为单位,应考虑有小数,不计复利)。
编程可用素材:
printf("Please input benjin,cunqi: ")、
printf("\nlixi = … yuan"…。
程序的运行效果应类似地如图1所示,图中的红色部分是从键盘输入的内容。
Please input benjin,cunqi: 10000,8
lixi = 4288.00 yuan
*/
#include <stdio.h>
int main(void)
{
int benjin, cunqi;
double lixi = 0.0;
printf("Please input benjin,cunqi: ");
scanf("%d,%d", &benjin, &cunqi);
if ( cunqi == 1 )
{
lixi = benjin * 0.0315;
}
if ( cunqi == 2 )
{
lixi = benjin * 0.0363 * 2;
}
if ( cunqi == 3 )
{
lixi = benjin * 0.0402 * 3;
}
if ( cunqi == 5 )
{
lixi = benjin * 0.0469 * 5;
}
if ( cunqi == 8 )
{
lixi = benjin * 0.0536 * 8;
}
printf("\nlixi = %.2lf yuan\n", lixi);
return 0;
}
/*
分析
1. 只考虑1,2,3,5,8,可以直接使用if判断后处理
2. 如果不是,则需要仔细分析和思考,确定相应的条件,再使用if语句来完成
3. 注意程序编辑上的缩进
*/