PTA-宏、函数重载与函数模板

6-1 通用对数函数(宏)

作者 李祥

单位 湖北经济学院

C语言库函数只提供以 e 和 10 为底数的对数函数。我们自行设计一个以任意正实数 a 为底数、任意正实数 x 为真数的通用对数函数 loga​x。

函数原型

double LogA(double a, double x);

说明:参数 a 是底数,a>0 且 a=1,x 是真数(幂),x>0,函数值是对数(指数) loga​x。

请在空白处填写适当内容,用带参数的宏替换命令来实现相同的功能。

裁判程序

#include <stdio.h> #include <math.h> __________ int main() { double a, x, y; scanf("%lg%lg", &a, &x); y = LogA(a, x); printf("%g\n", y); return 0; }

注:裁判程序有很多,不止一个。

输入样例
0.49 0.16807

输出样例
2.5

解答:

#define LogA(a,b)(log(b)/log(a))

6-2 平方函数(宏)

作者 李祥

单位 湖北经济学院

已知平方函数的原型如下:

函数原型
double Sqr(double x);

说明:参数 x 是任意实数,函数值为 x 的平方 x2。

请在空白处填写适当内容,用带参数的宏替换命令来实现相同的功能。

裁判程序

#include <stdio.h> __________ int main() { double a, b; scanf("%lg", &a); b = Sqr(a); printf("%g\n", b); return 0; }

注:裁判程序有很多,不止一个。

输入样例
-0.7

输出样例
0.49

要求:不要使用 C 标准库函数如 pow 等。

解答:

#define Sqr(x)((x)*(x))

6-3 立方函数(宏)

作者 李祥

单位 湖北经济学院

已知立方函数的原型如下:

函数原型

double Cube(double x);

说明:参数 x 是任意实数,函数值为 x 的立方 x3。

请在空白处填写适当内容,用带参数的宏替换命令来实现相同的功能。

裁判程序

#include <stdio.h> __________ int main() { double a, b; scanf("%lg", &a); b = Cube(a); printf("%g\n", b); return 0; }

注:裁判程序有很多,不止一个。

输入样例
-0.3

输出样例
-0.027

要求:不要使用 C 标准库函数如 pow 等。

 解答:

#define Cube(x)((x)*(x)*(x))

6-4 余切函数(宏)

作者 李祥

单位 湖北经济学院

C语言库函数只提供正切函数 tanx,没有提供余切函数 cotx。我们用带参数的宏替换命令来实现它。

cotx=1/tanx

已知余切函数的原型如下:

double Cot(double x);

说明:参数 x 是任意角度的弧度,函数值为 x 的余切 cotx。

请在空白处填写适当内容,用带参数的宏替换命令来实现相同的功能。

裁判程序

#include <stdio.h> #include <math.h> __________ int main() { double a, b; scanf("%lg", &a); b = Cot(a); printf("%g\n", b); return 0; }

输入样例
0.7853981633974483

输出样例
1

 注:裁判程序有很多,不止一个。

解答:

#define Cot(x)(1/tan(x))

6-5 绝对值函数(宏)*

作者 李祥

单位 湖北经济学院

C 函数库中提供整数绝对值 abs 函数和实数绝对值 fabs 函数,函数声明如下:

函数原型

int abs(int x); double fabs(double x);

说明:函数值为参数 x 的绝对值 ∣x∣。

请在空白处填写适当内容,用带参数的宏替换命令来实现相同的功能,将上面两个函数合并为一个,并命名为 Abs。

裁判程序1

#include <stdio.h> __________ int main() { int a, b; double x, y; scanf("%d %lg", &a, &x); b = Abs(a); y = Abs(x); printf("%d %g\n", b, y); return 0; }

输入样例1
-5 -2.5

输出样例1
5 2.5

输入样例2
7 3.8

输出样例2
7 3.8

输入样例3
0 0

输出样例3
0 0

输入样例4
-0 -0

输出样例4
0 0


注:裁判程序有很多,不止一个。

特别提示:注意实数为 -0.0 和 0.0 的情况。

 解答:

#define Abs(x)((x)>0?(x):(x)<0?-(x):0)

6-6 面积计算器(函数重载)

作者 何振峰

单位 福州大学

实现一个面积计算器,它能够计算矩形或长方体的面积。

函数接口定义:

int area(int x, int y); int area(int x, int y, int z);

第一个函数计算长方形的面积,其中x和y是长和宽。第二个函数计算长方体的表面积,x,y和z是长,宽和高。

裁判测试程序样例:

#include<iostream> #include<string> using namespace std; int area(int,int); int area(int,int,int); int main() { int i, repeat, c, x, y, z; cin>>repeat; for(i=0;i<repeat;i++){ cin>>c; if(c==2){ cin>>x>>y; cout<<area(x,y)<<endl; } if(c==3){ cin>>x>>y>>z; cout<<area(x,y,z)<<endl; } } return 0; } /* 请在这里填写答案 */

输入样例:

2
2 1 2
3 2 3 4

输出样例:

2
52

解答:

int area(int x, int y)
{
    return x*y;
}
int area(int x, int y, int z)
{
    return 2*(x*y+x*z+y*z);
}

6-7 最大值函数重载

作者 杨军

单位 四川师范大学

编写重载函数myMax可分别求取两个整数,三个整数,两个双精度数的最大值。

函数接口定义:

 

裁判测试程序样例:

/* 请在这里填写答案 */ int main(){ cout<<myMax(3,4)<<endl; cout<<myMax(3,4,5)<<endl; cout<<myMax(4.3,3.4)<<endl; }

输入样例:

输出样例:

在这里给出相应的输出。例如:

4
5
4.3

 解答:

#include <bits/stdc++.h>
using namespace std;
int myMax(int x,int y)
{
    return x>y?x:y;
}
int myMax(int x,int y,int z)
{
    if(x>y)
    {
        if(x>z)
        {
            return x;
        }
        else{
            return z;
        }
    }
    else{
        if(y>z)
        {
            return y;
        }
        else{
            return z;
        }
    }
}
double myMax(double x,double y)
{
    return x>y?x:y;
}

6-8 函数重载实现两数相加

作者 李廷元

单位 中国民用航空飞行学院

设计一个重载函数add,该函数有两个参数,可以实现两个类型相同的参数相加的操作,函数返回相加的结果。两个参数可以是整数、实数和字符串,但必须保证两个参数类型相同。

裁判测试程序样例:

#include <iostream> #include <string> #include <iomanip> using namespace std; /* 请在这里填写答案 */ int main() { int a, b; double c, d; string s1, s2; cin >> a >> b; cin >> c >> d; cin >> s1 >> s2; cout << add(a, b) << endl; cout << fixed << setprecision(2) << add(c, d) << endl; cout << add(s1, s2) << endl; return 0; }

输入样例:

3 5
3.3333 5.555555
hello world

输出样例:

8
8.89
helloworld

解答:

int add(int a,int b)
{
    return a+b;
}
double add(double a,double b)
{
    return a+b;
}
string add(string a,string b)
{
    return a+b;
}

6-9 最大值(模板)*

作者 李祥

单位 湖北经济学院

请设计求两个对象最大值的函数模板。

#include <iostream>
using namespace std;

/* 你提交的代码将被嵌在这里 */

int main()
{
    int a, b, c;
    cin >> a >> b;
    c = Max(a, b);
    cout << c << endl;
    return 0;
}
输入样例
37 29

输出样例
37

 解答:

template<typename T, typename U>
inline auto Max(T const& x, U const& y) -> decltype(x > y ? x : y)
{
    return x > y ? x : y;
}

6-10 绝对值函数模板*

作者 李祥

单位 湖北经济学院

请设计求对象绝对值的函数模板。

#include <iostream>
using namespace std;

/* 你提交的代码将被嵌在这里 */

int main()
{
    int a, b;
    cin >> a;
    b = Abs(a);
    cout << b << endl;
    return 0;
}
输入样例1
37

输出样例1
37

输入样例2
-37

输出样例2
37

提示:运用条件运算符(?:),写出高效的代码。

解答:

template <class T>
T Abs(T &x)
{
    return x<0?-x:x;
}

6-11 求最大值函数模板

作者 董卫萍

单位 绍兴文理学院元培学院

函数重载实现了让同名函数处理不同类型的数据,但最好的解决方法是类型参数化,这样就得到了函数模板。使用模板的目的就是能够让程序员编写与类型无关的代码。要求设计求两个或三个不同类型变量之最大值的函数模板,并在主函数中进行测试。

函数接口定义:

template<class T> T myMax(T a,T b); template<class T> T myMax(T a,T b,T c); T是抽象类型,可以由int,double,char,string类型实例化,两个函数模板也可以进行重载。

裁判测试程序样例:

#include <iostream> #include <string> using namespace std; /* 你提交的代码将被嵌在这里 */ int main() { int a, b, c; double s,t; string x,y; cin>>x>>y; cout << myMax(x,y) << endl; cin>>a>>b>>c; cout << myMax(a,b,c) << endl; cin>>s>> t; cout << myMax(s,t) << endl; cin>> a >> b; cout << myMax(a,b) << endl; return 0; }

输入样例:

在这里给出一组输入。例如:

hello world!
12 3 45
3.14 5.67
120 -100

输出样例:

在这里给出相应的输出。例如:

world!
45
5.67
120

解答:

template<class T> T myMax(T a,T b)
{
    return a>b?a:b;
}
template<class T> T myMax(T a,T b,T c)
{
     if(a>b)
    {
        if(a>c)
        {
            return a;
        }
        else 
        {
            return c;
        }
    }
    else 
    {
        if(b>c)
        {
            return b;
        }
        else
        {
            return c;
        }
    }
}

6-12 myMax模板函数 - C/C++ 函数与抽象

作者 海洋饼干叔叔

单位 重庆大学

请设计合适的模板函数myMax(),使得下述程序可以正确运行。myMax()函数比较并返回两个同类型形参对象中的较大者。

裁判测试程序样例:

#include <iostream> using namespace std; //在此处定义myMax模板函数 int main(){ cout << myMax(3,2) << endl; cout << myMax(string("hello"),string("howdy")) << endl; cout << myMax(3.2,0.5) << endl; cout << myMax(true,false) << endl; return 0; }

输入样例:

输出样例:

3
howdy
3.2
1

请注意:函数题只需要提交相关函数的定义代码,不要提交完整程序。

 解答:

template <class T>
 T myMax(T a,T b)
{
    return a>b?a:b;
}

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值