假定弓形弦长为C,半径为R,弦高为H,输入C和H,按公式R=(C*C+4*H*H)/8H输出弓形半径R。
输入格式:
输入实型,空格分隔。
输出格式:
输出实型,保留2位小数。
输入:
4 2.23607
输出:
2.01
#include
using namespace std;
int main( )
{
double C,H;
scanf("%lf %lf",&C,&H);
double R = (C*C+4*H*H)/(8*H);
printf("%.2f",R);
return 0;
}
假定弓形弧长为L,半径为R,圆心角为A,输入R和A,按公式L=0.01745R*A计算并输出弓形弧长L。
输入格式:
输入实型,空格分隔。
输出格式:
输出实型,保留2位小数。
输入:
3 83.62063
输出:
4.38
#include
using namespace std;
int main( )
{
double R,A;
scanf("%lf %lf",&R,&A);
double L = 0.01745*R*A;
printf("%.2f",L);
return 0;
}
假定弓形弧长为L,半径为R,圆心角为A,输入R和L,按公式A=57.296L/R计算并输出弓形圆心角A。
输入格式:
输入实型,空格分隔。
输出格式:
输出实型,保留2位小数。
输入:
3 4.37837
输出:
83.62
#include
using namespace std;
int main( )
{
double R,L;
scanf("%lf %lf",&R,&L);
double A = 57.296*L/R;
printf("%.2f",A);
return 0;
}
上面的题没有什么难度,只有一个需要关注的地方,就是题目中给的公式是平时我们常见的形式,但是编程的时候就需要转换成相应的格式,比如说,我们平时使用的乘号可以省略不写,但是在编程的时候就需要写成*的这种形式。
上面的这个模块是公式与计算,所以更偏向于对数学公式的考察,所以我下面会在学习公式的同时,学习一些考察公式偏向的题目,下面,就是预处理命令这个模块相关的题目。
请编写一个简单程序,把f(x)=x*(x-1)定义成带参数的宏,从键盘输入a,b,将a+b的和作为宏实参计算并输出结果。
输入格式:
输入整型,空格分隔。
输出格式:
输出为实型
输入:
3 5
输出:
56.000000
刚拿到这个题目的时候,我就直接按照平时的方式,直接写出了相应的代码,代码如下:
#include
#define f(x) x*(x-1)
using namespace std;
int main( )
{
int a,b;
scanf("%d %d",&a,&b);
double c = f(a+b);
printf("%.6f",c);
return 0;
}
但是,我发现,输出如下:
于是,通过查资料,有了以下的注意点:
注意:宏代换是直接进行代换的。
例如:
#define f(x) x*x
输入 输出 f(6) 3*3 f(6+1) 6+1*6+1 f((6+1)) (6+1)*(6+1) 按照上面的表格内容,我们可以得知,要是我们想要的是第三种结果,就需要自己属于(a+b),为了避免这种错误,就需要在宏定义的时候将括号加上去。即
define f(x) (x)*(x)
所以按照上面的内容,本题的宏定义就需要将x加上括号。如果不加,那么系统自行读入的格式是a+b*(a+b-1),即3+5*(3+5-1)= 38,化为实型就为38.000000。也就是上面错误的值,但是要是加上括号,那么系统读入格式为(a+b)*((a+b)-1)=(3+5)*((3+5)-1)=56,化为实型记为56.000000,所以最终实现代码如下:
#include
#define f(x) (x)*(x-1)
using namespace std;
int main( )
{
int a,b;
scanf("%d %d",&a,&b);
double c = f(a+b);
printf("%.6f",c);
return 0;
}
成功解决此问题。
通过今天的刷题,我们遇到了最常见的两种预处理命令:
- 本代码使用的文件。例:在本题中就是#include
,这里使用的是万能文件 - 宏定义。就是在题目中所添加的内容。即 #define的这个内容,在本题中就是#define f(x) (x)*(x-1)
将一个浮点型K数保留n(1≤n≤5)位小数(四舍五入)的算法定义为宏。在主函数中输入数据输出计算结果。
输入格式:
输入k为实型,n为整数,空格分隔。
输出格式:
输出为实型
输入:
3.1415926 3
输出:
3.142
- 按照题目要求的算法,将宏定义设置为一个函数,需要注意的是,要写在一行,例本题中:
#define Date(k,n){printf("%.*f",k,n);}
- 动态保留小数方法,使用%.*f来表示(常用的只有实型的数据小数点后需要保留,所以直接记住%.*f),例如下面语句:
printf("%.*f",k,n);
其中k表示输入的实型数据,n表示所要保留小数点后的位数。
#include
#define Date(k,n){printf("%.*f",k,n);}
using namespace std;
int main( )
{
double k;
int n;
scanf("%lf %d",&k,&n);
Date(k,n);
return 0;
}
明天继续吧。