c++语言之数学运算练习题(四)(头歌)

第1关:计算自行车踏板圆杆的最小半径
任务描述
编写一个c++程序,计算自行车踏板圆杆的最小半径。
####相关知识
#####pow()
pow(double x, double y) 返回x的y次幂。

举例说明:

int main ()
{
   printf("值 8.0 ^ 3 = %lf\n", pow(8.0, 3));
   return(0);
}
测试结果:

值 8.0 ^ 3 = 512.000000
说明:
r=pow(a,1.0/3.0) 即为 r 
3
 =a 将r开三次方后的结果。

编程要求
键盘上输出d p s,根据相应公式求出圆杆的最小半径

注意:此处圆周率的数值为3.1415926

测试举例:

测试输入:
7.0
300.0
10000.0

预期输出:0.405842

#include <iostream>
#include<cmath>
using namespace std;
int main()
{
	/*********begin*********/
	double d,p,s,r;
    cin>>d>>p>>s;
    r=pow((d*p)/(s*3.1415926),1.0/3.0); 
    cout<<r;
	/*********end*********/
}

 

第2关:两条直线的夹角
任务描述
相关知识
setprecision(n)
编程要求
任务描述
本关任务:编写一个c++程序,计算四个点所构成的两条直线的夹角。

相关知识
setprecision(n)
描述:可以控制输出流显示浮点数的数字个数。C++默认的输出流数值有效位是6。

编程要求
平面上给定4个点的坐标A B C D,分别表示直线AB和CD。坐标均为绝对值不超过100的整数。计算出这两条直线所成的锐角是多少度。(保留两位小数,pi取3.1415926)

注意:当两直线平行或者重合,答案为0。

测试举例:

测试输入:0 0 1 0 0 0 0 1
预期输出:90.00

测试输入:16 34 21 87 98 23 12 9
预期输出:75.36

开始你的任务吧,祝你成功!

#include<iostream>
#include<cmath>
#include<iomanip>
#define pi 3.1415926;
using namespace std;
int main()
{    
    double x1,y1,x2,y2,x3,y3,x4,y4;
    long double x,y;
    cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
    x=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
    y=(x3-x4)*(x3-x4)+(y3-y4)*(y3-y4);
    long double s1,s2;
    s1=sqrt(x);
    s2=sqrt(y);
    long double s3;
    s3=(x2-x1)*(x4-x3)+(y2-y1)*(y4-y3);
    long double s4;
    s4=abs(s3);
    long double ans,ans2;
    ans2=s4/(s1*s2);
    ans=acos(ans2);
    long  double ans3;
    ans3=(180*ans)/pi;
    cout<<fixed<<setprecision(2)<<(long double)ans3;
    return 0;
}

第3关:判断圆与射线是否相交
任务描述
编写一个c++程序,判断某个圆与射线是否相交。

相关知识
向量的点乘
向量乘法:

a∗b=∣a∣∗∣b∣∗cosx

向量的坐标相乘:

(x1,y1)∗(x2,y2)=x1∗x2+y1∗y2

提示:

比较∠OAB和∠OAP的大小,如果∠OAB不大于∠OAP,则圆与射线相交。
可以通过比较sin值判断大小。

编程要求
给定2个点的坐标A和B,代表有一条射线AB。
再给定一个点的坐标O点和一个半径R,代表以O为圆心以R为半径的一个圆。
问射线与圆是否有公共点,即存在某个点既在射线上又在圆上。

输入一共7个数,均为不超过100的非负整数。
输出一行,存在这个点就输出Y,否则输出N。

测试举例:

测试输入:2 3 2 100 2 1 1
预期输出:N

测试输入:1 0 1 100 2 1 1
预期输出:Y

开始你的任务吧,祝你成功!

 

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	double x1,x2,x3,y1,y2,y3,r;
	cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> r;
	double a=(y2-y1)/(x1*y2-x2*y1);
    double b=(x1-x2)/(x1*y2-x2*y1);
	double d=abs(a*x3+b*y3-1)/sqrt(a*a+b*b);
	if(d>r)
    {
		cout << "N";
		return 0;
	}
	double d2=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
	if(d2<=r)
    {
		cout << "Y";
		return 0;
	}
	if((x3-x1)*(x2-x1)+(y3-y1)*(y2-y1)>=0) 
    cout << "Y";
	else 
    cout << "N";
	return 0;
}

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值