c++第二次作业

函数的相关知识点

为什么要用函数?

在面向过程的结构化程序设计中,函数是模块划分的基本单位,是处理问题过程的一种抽象。一个较为复杂的系统往往需要划分为若干子系统,然后对这些子系统分别进行开发和调试。C和C++语言中的子程序被重复使用,使用时可以只关心函数的功能和使用方法而不必关心函数的功能的具体实现。这样有利于代码的重用,可以提高开发效率、增强程序的可靠性,也便于分工合作和修改维护。

假设我需要用大量的数据得到一个结果。
例如我要重复调用一个数据库中的数据x,输入到计算机中,得到x*x+x+1的值,这个时候我们若是一个一个去计算就会浪费很多的时间。

double fun(x){
    double y;
    y = x*x+x+1;
    return y;
}

若是数据库中有多个这样的x求值,不调用函数的话就必须自己一个个手敲代码,而调用函数的话就直接fun(3.5)、fun(4.3)这样,十分方便。

为什么要用函数的重载?

阅读以下代码:

int max(int num1,int num2){
    if(num1 > num2)
	return num1;
    else
	return num2;
} 

可以看出,如果我在主函数的调用时输入非int型参数,如max(1.2,1.1) ,那么这个编译将不会通过,为解决这个问题,c++增加了重载机制,使得我们能处理多种类型的信息,也减少了代码量。

针对以上问题,我们可以重新写个函数:

double max(double num1,double num2){
    if(num1 > num2)
	return num1;
    else
	return num2;
}

在这个函数中,参数的类型不同,但函数体和函数名是相同的。
我们可以在main函数中直接调用max(1,2)或者max(1.5,1.3) ,计算机可以自己帮我们匹配用哪个函数。

什么是值传递

值传递就是给函数的参数赋值,我们有值传递和引用传递两种方式。
值传递有下面几种规则
1.值传递时,函数的参数在被调用时才分配空间。
2.实参可以是常量、变量和表达式。
3.实参和形参的类型要相符,若不符合时,会进行强制转化,若不能合理的强制转化则会报错。
4.值传递时仅仅传递参数值,即单向传递,不会影响到实参。

请看以下代码:

#include <iostream>
using namespace std;
void swap(int a,int b){    //就是一个简单的交换函数
    int t = a;
    a = b;
    b = t;
}
int main(){
    int x = 3 ,y = 6;
    cout<<"x = "<< x << "  y = " << y <<endl;
    swap(x,y);             //交换一下x和y的值
    cout<<"x = "<< x << "  y = " << y <<endl;        //再打印一下
    return 0;
}

我们运行一下:
nfYZMd.png
可以看出,我们明明在swap函数中交换了x和y的值,但是最后x和y的值却没变,说明值传递并不会影响到实参。

什么是地址传递

地址传递是直接把变量的地址传递给函数,这时函数是直接对原来的变量进行操作的。
将地址传递给函数的方法可以用引用的方式
void swap(int &a,int &b)
这里的&即引用符号,可以将实参与形参关联在一起,这个时候的调用函数的话不会生成新的存储区。

#include <iostream>
using namespace std;
void swap(int &a,int &b){    //就是一个简单的交换函数
    int t = a;
    a = b;
    b = t; 
}
int main(){
    int x = 3,  y = 6;
    cout<<"x = "<< x << "  y = " << y <<endl;
    swap(x,y);             //交换一下x和y的值
    cout<<"x = "<< x << "  y = " << y <<endl;        //再打印一下
    return 0;
}

我们再测试一次:
nfBLin.png

可以看到这时x和y的值交换了!
其实地址传递也不止这一种方法,如指针和数组都可以用作地址传递。

如何编写递归函数

定义:函数可以直接或间接的调用自身,称为递归调用。
例如:

void fun(){
    ...
    fun();
    ...
}

编写递归函数的步骤有一下三步:
1.找出找出“递推式”
比如我们要求n! f(n) = n(n-1)! ,而f(n-1) = (n-1)(n-2)! ,以此类推,这就是递推式。
2.找出终止条件
求n!用递推式一直推下去,那什么时候才到头呢?所以我们要先设置一个终止条件,终止条件就是f(1) = 1
3.根据递推式和终止条件,编写程序

#include <iostream>
using namespace std;
int fun(int n)
{
    int sum = 1;
    if(1 == n)
    {
        return 1;
    }
    sum =n * fun(n - 1);
    return sum;
}
int main()
{
    int n = 0;
    cin >> n;
    cout << fun(n) << endl;  
    return 0;
}

运行结果在下面:
nfcHdU.png

posted @ 2019-09-16 19:34  醉死的乌鸦  阅读(195)  评论(0编辑  收藏  举报