第3章 函数

目录

第1关:华氏温度转摄氏温度

任务描述

相关知识

函数定义

函数的调用

任务要求

测试说明

代码

第2关:max1函数

任务描述

相关知识

函数重载

函数的嵌套调用

代码

第3关:计算x的y次幂

任务描述

相关知识

函数的参数

函数的参数传递

引用类型

可变数量形参

参数的默认值

默认参数值的说明次序

默认参数值与函数的调用位置

使用 C++ 系统函数

代码

第4关:Fibonacci

任务描述

代码


第1关:华氏温度转摄氏温度

任务描述

编写一个函数把华氏温度转换为摄氏温度,转换公式为:C = (F - 32) * 5/9。

相关知识

为了你能够更好的完成本关任务,你需要掌握

  1. 函数的定义;
  2. 函数的调用。
函数定义
  • 函数定义的语法形式 类型标识符 函数名(形式参数表) { 语句序列 }

类型标识符表示返回值类型,由 return 语句给出返回值;若无返回值,写void,不必写return语句。

函数的调用
  • 调用前先声明函数: 若函数定义在调用点之前,可以不另外声明; 若函数定义在调用点之后,必须要在调用函数前声明 函数原型: 类型标识符 被调用函数名(含类型说明的形参表);
  • 调用形式 函数名(实参列表);
  • 嵌套调用 在一个函数的函数体中,调用另一函数;
  • 递归调用 函数直接或间接调用自身。

例: 编写一个求x的n次方的函数

 
  1. #include <iostream>
  2. using namespace std;
  3. //计算x的n次方
  4. double power(double x, int n) {
  5. double val = 1.0;
  6. while (n--) val *= x;
  7. return val;
  8. }
  9. int main() {
  10. cout << "5 to the power 2 is "
  11. << power(5, 2) << endl;
  12. return 0;
  13. }

运算结果: 5 to the power 2 is 25

例:数制转换 题目:输入一个8位二进制数,将其转换为十进制数输出。 例如:11012=1(23)+1(22)+0(21)+1(20)=1310 所以,如果输入1101,则应输出13。

 
  1. #include <iostream>
  2. using namespace std;
  3. double power (double x, int n); //计算x的n次方
  4. int main() {
  5. int value = 0;
  6. cout << "Enter an 8 bit binary number ";
  7. for (int i = 7; i >= 0; i--) {
  8. char ch;
  9. cin >> ch;
  10. if (ch == '1')
  11. value += static_cast<int>(power(2, i));
  12. }
  13. cout << "Decimal value is " << value << endl;
  14. return 0;
  15. }
  16. double power (double x, int n) {
  17. double val = 1.0;
  18. while (n--)
  19. val *= x;
  20. return val;
  21. }

运行结果: Enter an 8 bit binary number 01101001 Decimal value is 105

任务要求

请编写出华氏温度转摄氏温度的代码,并将代码补充在右侧任务挑战区 Begin-End 之间。

测试说明

平台会对你编写的代码进行测试:

测试输入:60 预期输出:15.5556

代码

#include <iostream>
using namespace std;
/********** Begin **********/
double ftoc(int f) {
    return (f - 32) * 5.0 / 9;
}
/**********  End  **********/
int main()
{
    int f;
    cin >> f;
    cout << ftoc(f) << endl;
    return 0;
}    

第2关:max1函数

任务描述

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

相关知识

为了你能够更好的完成本关的任务,你需要掌握

  1. 重载函数;
  2. 函数的嵌套调用。
函数重载
  • C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。 例: 形参类型不同 int add(int x, int y); float add(float x, float y);


    形参个数不同 int add(int x, int y); int add(int x, int y, int z)

  • 注意事项

    重载函数的形参必须不同:个数不同或类型不同。编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。 编译器不以形参名来区分 int add(int x,int y); int add(int a,int b);


    编译器不以 返回值来区分

int add(int x,int y); void add(int x,int y);

  • 不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好: int add(int x, int y){ return x + y; } float add(float x,float y){ return x - y; }

例:重载函数应用举例 编写两个名为sumOfSquare的重载函数,分别求两整数的平方和及两实数的平方和。

 
  1. #include <iostream>
  2. using namespace std;
  3. int sumOfSquare(int a, int b) {
  4. return a * a + b * b;
  5. }
  6. double sumOfSquare(double a, double b) {
  7. return a * a + b * b;
  8. }
  9. int main() {
  10. int m, n;
  11. cout << "Enter two integer: ";
  12. cin >> m >> n;
  13. cout<<"Their sum of square: "<<sumOfSquare(m, n)<<endl;
  14. double x, y;
  15. cout << "Enter two real number: ";
  16. cin >> x >> y;
  17. cout<<"Their sum of square: "<<sumOfSquare(x, y)<<endl;
  18. return 0;
  19. }

运行结果: Enter two integer: 3 5 Their sum of square: 34 Enter two real number: 2.3 5.8 Their sum of square: 38.93

函数的嵌套调用

C++不允许对函数作嵌套定义,也就是说在⼀个函数中不能完整地包含另⼀个函数。在⼀个程序中每⼀个函数的定义都是互相平⾏和独⽴的。虽然C++不能嵌套定义函数,但可以嵌套调⽤函数,也就是说,在调⽤⼀个函数的过程中,⼜调⽤另⼀个函数。 在程序中实现函数嵌套调⽤时,需要注意的是:在调⽤函数之前,需要对每⼀个被调⽤的函数作声明(除⾮定义在前,调⽤在后)。

例: 输入两个整数,求平方和

 
  1. #include <iostream>
  2. using namespace std;
  3. int fun2(int m) {
  4. return m * m;
  5. }
  6. int fun1(int x,int y) {
  7. return fun2(x) + fun2(y);
  8. }
  9. int main() {
  10. int a, b;
  11. cout<<"Please enter two integers (a and b): ";
  12. cin >> a >> b;
  13. cout << "The sum of square of a and b: "
  14. << fun1(a, b) << endl;
  15. return 0;
  16. }

运行结果: Please enter two integers(a and b): 3 4 The sum of square of a and b: 25

代码

#include <iostream>
using namespace std;
/********** Begin **********/
// 两个整数的最大值
int max1(int a, int b) {
    return (a > b)? a : b;
}

// 三个整数的最大值
int max1(int a, int b, int c) {
    return max1(max1(a, b), c);
}

// 两个双精度数的最大值
double max1(double a, double b) {
    return (a > b)? a : b;
}

// 三个双精度数的最大值
double max1(double a, double b, double c) {
    return max1(max1(a, b), c);
}
/**********  End  **********/

int main()
{
    cout << max1(2, 4) << endl;
    cout << max1(2, 4, 7) << endl;
    cout << max1(2.1, 5.0/3) << endl;
    cout << max1(2.1, 4.5, 5.0/3) << endl;
    return 0;
}    

第3关:计算x的y次幂

任务描述

使用系统函数pow(x,y)计算x y的值,注意包含头文件math.h。

相关知识

为了你能够更好的完成本关的任务,你需要掌握

  1. 函数的参数;
  2. 如何使用 C++ 系统函数。
函数的参数
函数的参数传递
  • 在函数被调用时才分配形参的存储单元;
  • 实参可以是常量、变量或表达式;
  • 实参类型必须与形参相符或可隐式转换为形参类型;
  • 值传递是传递参数值,即单向传递;
  • 引用传递可以实现双向传递;
  • 常引用作参数可以保障实参数据的安全。 例: 输入两个整数并交换(值传递)
     
      
    1. #include<iostream>
    2. using namespace std;
    3. void swap(int a, int b) {
    4. int t = a;
    5. a = b;
    6. b = t;
    7. }
    8. int main() {
    9. int x = 5, y = 10;
    10. cout<<"x = "<<x<<" y = "<<y<<endl;
    11. swap(x, y);
    12. cout<<"x = "<<x<<" y = "<<y<<endl;
    13. return 0;
    14. }
    运行结果: x = 5 y = 10 x = 5 y = 10

例: 输入两个整数交换后输出(引用传递)

 
  1. #include<iostream>
  2. using namespace std;
  3. void swap(int& a, int& b) {
  4. int t = a;
  5. a = b;
  6. b = t;
  7. }
  8. int main() {
  9. int x = 5, y = 10;
  10. cout<<"x = "<<x<<" y = "<<y<<endl;
  11. swap(x, y);
  12. cout<<"x = "<<x<<" y = "<<y<< endl;
  13. return 0;
  14. }

运行结果: x = 5 y = 10 x = 10 y = 5

引用类型
  • 引用(&)是标识符的别名; 例如: int i, j; int &ri = i; //定义int引用ri,并初始化为变量i的引用 j = 10; ri = j;//相当于 i = j;
  • 声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象;
  • 一旦一个引用被初始化后,就不能改为指向其它对象;
  • 引用可以作为形参。 void swap(int &a, int &b) {...}
可变数量形参
  • 使用模板类initializer_list可向函数传递同类型不定个数参数, 例如: void log_info(initializer_list lst) { for (auto &info: lst) cout << info << ‘ ’; cout << endl; } log_info({“Hello”, ”world”, “!”});
  • initializer_list lst接受不定个数字符串实参
  • 注意

    实参以大括号列表方式给出

  • 使用范围for语句遍历lst,auto自动推断元素为string类型
参数的默认值
  • 可以预先设置默认的参数值,调用时如给出实参,则采用实参值,否则采用预先设置的默认参数值。 例如: int add(int x = 5,int y = 6) { return x + y; } int main() { add(10,20); //10+20 add(10); //10+6 add(); //5+6 }
默认参数值的说明次序
  • 有默认参数的形参必须列在形参列表的最右,即默认参数值的右面不能有无默认值的参数
  • 调用时实参与形参的结合次序是从左向右 例: int add(int x, int y = 5, int z = 6);//正确 int add(int x = 1, int y = 5, int z);//错误 int add(int x = 1, int y, int z = 6);//错误 int add(int x = 5,int y = 6);
    默认参数值与函数的调用位置
  • 如果一个函数有原型声明,且原型声明在定义之前,则默认参数值必须在函数原型声明中给出;而如果只有函数的定义,或函数定义在前,则默认参数值需在函数定义中给出。 例: //原型声明在前 int main() { add(); } int add(int x,int y) { //此处不能再指定默认值 return x + y; }
    int add(int x = 5,int y = 6) { //只有定义,没有原型声明 return x + y; } int main() { add(); }
使用 C++ 系统函数
  • C++的系统库中提供了几百个函数可供程序员使用,例如:求平方根函数(sqrt),求绝对值函数(abs);

  • 使用系统函数时要包含相应的头文件,例如:cmath;

  • 例: 系统函数应用举例 题目:从键盘输入一个角度值,求出该角度的正弦值、余弦值和正切值;

  • 分析:系统函数中提供了求正弦值、余弦值和正切值的函数:sin()、cos()、tan(),函数的说明在头文件cmath中。

     
      
    1. #include <iostream>
    2. #include <cmath>
    3. using namespace std;
    4. const double PI = 3.14159265358979;
    5. int main() {
    6. double angle;
    7. cout << "Please enter an angle: ";
    8. cin >> angle; //输入角度值
    9. double radian = angle * PI / 180; //转为弧度
    10. cout << "sin(" << angle << ") = " << sin(radian) <<endl;
    11. cout << "cos(" << angle << ") = " << cos(radian) <<endl;
    12. cout << "tan(" << angle << ") = " << tan(radian) <<endl;
    13. return 0;
    14. }

    运行结果: 30 sin(30)=0.5 cos(30)=0.866025 tan(30)=0.57735

代码

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    /********** Begin **********/
    double x, y;
   
    cin >> x >> y;
    double result = pow(x, y);
    cout << result << endl;
    /**********  End  **********/
    return 0;
}    

第4关:Fibonacci

任务描述

用递归的方法编写函数求Fibonacci 级数。

代码

#include <iostream>
using namespace std;
int fib(int n);
int main()
{
    int n, answer=0;
    cin >> n;
    answer = fib(n);
    cout << answer << endl;
    return 0;
}
int fib (int n)
{
    /********** Begin **********/
    if (n == 0) {
        return 0;
    } else if (n == 1) {
        return 1;
    } else {
        return fib(n - 1) + fib(n - 2);
    }
    /**********  End  **********/
}    

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小柒_02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值