假期刷题打卡--Day9

一、C语言刷题打卡

1、MT1055弓形半径

假定弓形弦长为C,半径为R,弦高为H,输入C和H,按公式R=(C*C+4*H*H)/8H输出弓形半径R。

格式

输入格式:

输入实型,空格分隔。

输出格式:

输出实型,保留2位小数。

样例 1

输入:

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;
}

2、MT1056弓形弧长

假定弓形弧长为L,半径为R,圆心角为A,输入R和A,按公式L=0.01745R*A计算并输出弓形弧长L。

格式

输入格式:

输入实型,空格分隔。

输出格式:

输出实型,保留2位小数。

样例 1

输入:

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;
}

3、MT1057弓形圆心角

假定弓形弧长为L,半径为R,圆心角为A,输入R和L,按公式A=57.296L/R计算并输出弓形圆心角A。

格式

输入格式:

输入实型,空格分隔。

输出格式:

输出实型,保留2位小数。

样例 1

输入:

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;
}

上面的题没有什么难度,只有一个需要关注的地方,就是题目中给的公式是平时我们常见的形式,但是编程的时候就需要转换成相应的格式,比如说,我们平时使用的乘号可以省略不写,但是在编程的时候就需要写成*的这种形式。

上面的这个模块是公式与计算,所以更偏向于对数学公式的考察,所以我下面会在学习公式的同时,学习一些考察公式偏向的题目,下面,就是预处理命令这个模块相关的题目。

4、MT1101带参数的宏II

请编写一个简单程序,把f(x)=x*(x-1)定义成带参数的宏,从键盘输入a,b,将a+b的和作为宏实参计算并输出结果。

格式

输入格式:

输入整型,空格分隔。

输出格式:

输出为实型

样例 1

输入:

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;
}

但是,我发现,输出如下:

假期刷题打卡--Day9_第1张图片

于是,通过查资料,有了以下的注意点:

注意:宏代换是直接进行代换的。

例如:

#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;
}

假期刷题打卡--Day9_第2张图片

 成功解决此问题。

通过今天的刷题,我们遇到了最常见的两种预处理命令:

  1. 本代码使用的文件。例:在本题中就是#include,这里使用的是万能文件
  2. 宏定义。就是在题目中所添加的内容。即 #define的这个内容,在本题中就是#define f(x) (x)*(x-1)
5、MT1108保留小数

将一个浮点型K数保留n(1≤n≤5)位小数(四舍五入)的算法定义为宏。在主函数中输入数据输出计算结果。

格式

输入格式:

输入k为实型,n为整数,空格分隔。

输出格式:

输出为实型

样例 1

输入:

3.1415926 3 

输出:

3.142
本题难点
  1. 将宏定义为一个算法
  2. 动态保留小数
解决办法
  1. 按照题目要求的算法,将宏定义设置为一个函数,需要注意的是,要写在一行,例本题中:
    #define Date(k,n){printf("%.*f",k,n);}
  2. 动态保留小数方法,使用%.*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;
}

 

明天继续吧。

你可能感兴趣的:(假期打卡学习,算法,c++,c语言)