函数复习总结

一、重点知识点

  1.函数的定义

   函数要先定义后使用(调用)

  函数定义的一般形式:

  返回值类型 函数名 ( 形参列表 )
{
....
return 对应的返回值类型数据(常量或变量);
}

  注意:返回值类型如果没有,则写成void
       形参列表如果没有,则写成void,或者不写

例:输出两个数中较大的数

double max ( double x , double y )//返回值类型 函数名(形参列表)
{  if ( x > y )
	 return x ;//返回值
    else
	 return y ;//返回值
} 

   2.函数的调用  

    函数调用的一般形式:

           函数名实际参数表

函数名:函数的入口地址

实际参数表:于形式参数必须在个数、类型、位置一一对应
例:
#include<iostream.h> double max ( double x , double y ) { if ( x > y ) return x ; else return y ; } void main() { double a, b; cin >> a >> b ; double m = max( a, b );//函数的调用 cout << max( m, 3.5 ) << endl ; }

  3.参数传递

 第一种:按值传递
 将计算出的实参的值传给已经分配了储存空间的形参,只有形参改变,实参并未被改变,函数再调用时直接使用形参。该方法只能传输一个数值并不能传递多个数值。

例:输出n的所有因子
#include<iostream>
using namespace std;
int yz(int x);
int main()
{
    int n;
    cin>>n;
    yz(n);
}
int yz(int x)
{
    int a=0;
    for (int i=2;i<x/2;i++)
      if(x%i==0)
      {
          a++;
          cout<<i<<" ";
      }
    cout<<a;
    }

  第二种:地址传递
形参与实参指向同一个地址,他俩相当于住在一起,相当于同一个人的不同名字。因此,当形参所指向的地址的数值发生改变时实参的数值也会发生改变。

例:
#include <iostream>
using namespace std;
void swap(int*,int*);
int main()
{
    int a = 3, b = 4;
    cout << "a = " << a << ", b = "
    << b << endl;
    swap(&a,&b);
    cout << "a = " << a << ", b = "
    << b << endl;
    system("pause");
    return 0;
}
void swap(int *x,int *y)
{
     int t = *x;
     *x = *y;
     *y = t;
}

  第三种:引用传递
引用传递方式是在函数定义时在形参前面加上引用运算符&”   这种传递方式既可以使得对形参的任何操作都能改变相应的数据,又使得函数调用显得方便、自然。
例:
#include <iostream>
using namespace std;
void swap(int&,int&);
int main()
{
    int a = 3, b = 4;
    cout << "a = " << a << ", b = "
    << b << endl;
    swap(a,b);
    cout << "a = " << a << ", b = "
    << b << endl;
    system("pause");
    return 0;
}
void swap(int &x,int &y)
{
     int t = x;
     x = y;
     y = t;
}

4.递归函数

直接或者间接调用自身的函数称为递归函数。它通常把一个大型复杂问题层层转化为一个与原问题相似的规模较小的问题来求解。
递归定义:使问题向边界条件转化的规则。递归定义必须能使问题越来越简单。
递归终止条件:也就是所描述问题的最简单情况,它本身不再使用递归的定义。

递归算法解题通常有三个步骤:
1)分析问题、寻找递归:找出大规模问题与小规模问题的关系,这样通过递归使问题的规模逐渐变小。
2)设置边界、控制递归:找出停止条件,即算法可解的最小规模问题。
3)设计函数、确定参数:设计函数体中的操作及相关参数。

二、典型例题

例:

描述

从键盘输入个任意位数的正整数,输出它的位数。

输入一个正整数输出它的位数
#include<iostream>
using namespace std;
int ws(int );
int main()
{
    int n;
    cin>>n;
    cout<<ws(n);
}

int ws(int x)
{
    int a=0;
    while(x!=0)
      {
          x/=10;
          a++;
      }
    return a;
    }

例:
描述把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。输入第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。输出对输入的每组数据M和N,用一行输出相应的K。样例输入
1
7 3
样例输出
8

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int k,n,m,i,j,f[20][20];
int main()
{
scanf("%d",&k);
for (int l=1;l<=k;l++)
{
scanf("%d%d",&n,&m);
memset(f,0,sizeof(f));
f[1][1]=1;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
  if (i!=1||j!=1)
   {
      f[i][j]=f[i-1][j-1];
      if (i-j>=0)
       f[i][j]+=f[i-j][j];
   }
int ans=0;
for (i=1;i<=m;i++)
ans+=f[n][i];
cout<<ans<<endl;
}
}

解析:f[n][m]表示把n个苹果分成m分的方案数,分为两种情况。第一种是每份中的苹果数都大于1,即不存在一个盘中有一个;和存在一个盘中有一个。因为允许有空盘子,所以最后求和输出即可。

三、心得体会

通过对函数的学习,发现了简化程序的诀窍:就是把复杂的问题分工给下属们(函数)。从而使程序的可行性和简洁性大大提升。相对于具体的函数学习来讲,递归函数、引用传递和按地址传递属于重点和难点,尤其是对于递归函数的学习,尤其摸不着头脑。我想还是需要慢慢的积累,见识的题多了,会的方法多了,知识点自然也就稳固了。程序设计的知识涉猎面实在是广,在不断学习C++的过程中,自己也在不断补充着数学等方面的知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值