函数学习总结
一.函数的定义
函数定义的语法形式
数据类型 函数名(形式参数表)
{
函数体 //执行语句
}
注意事项
- 函数的数据类型是函数的返回值类型(若数据类型为void类型,则无返回值)。
如:intmax(int a)或者 void max(int n)
- 形式参数(形参)表可以是空的(既无参函数),多个形参用逗号隔开,但是每一个都必须写明形参类型,类型相同也不可省略。形参可以是变量名,数组名或者指针名。
如:intmax(int a,int b,int c)
- 不管有没有参数,函数名后面的圆括号必须有。
- 函数不允许嵌套定义!但是!允许嵌套使用。
- 函数的形式从结构上说可以分为三种:无参函数,有参函数和空函数。
- 无参函数一般不需要带回返回值,所以函数类型说明为void。
- 有参函数有参数传递,一般需要带回返回值。
- 空函数即函数体只有一对花括号,花括号内什么也没有。
- 例如 函数名()
{ }
空函数不完成什么工作,只占据一个位置。在大型程序设计中,空函数用于扩展函
数功能。
二.函数的声明和参数传递
- 如果实现功能的函数写在主函数后面,调用函数之前,要在主函数之前提前做一个声明。
例如 int prime(int x);
如此即可,计算机才会执行和分配空间。
- 在参数传递的时候,只是把实参的内容赋值给形参,之后它的变化情况跟实参毫无关系。
例如 void swap(char a,char b)
{ char t; t=a;a=b;b=t;} 只是交换了函数的形参a和b,并没对实参产生影响。这也就是我们所说的传数值形式。
- 当函数的数值需要传递给实参或者函数的返回值不止一个的时候,就需要调用以下方式:1.传地址 2.传引用
传地址
在定义函数的时候,将形参定义成指针,这时形参指向实参的存储空间,在改变形参的同时,实参数值也会改变。
指针变量:其内容为地址,简称指针。指向的地址的变量叫目标变量。
传引用
类型名 & 引用名 = 某变量名,计算机不会给这个类型名 & 引用名再分配新的存储空间,它就是实参的另一种表达方式,相当于直接改变实参数值,也能达到上述目的。
- 数组与指针
数组也可以用指针来表示,数组名代表了数组的起始地址;数组的指针其实就是数组的起始地址。数组元素的指针就是数组元素的地址。
由此,我们可以通过对指针的自加自减来指向数组的前后元素。
例如 int a[10],*p; p=a;(此时p就指向a[0]元素) 所以p+1=a[1];通过指针的加减实现对数组的操作方便快捷。
在操作的时候,实参和形参可以在指针变量和数组名之间随意选择。
三.递归函数
- 递归函数就是在调用函数的时候再对自身进行调用,把复杂问题分解,直至不能在分解,也就是答案或者解决办法一眼就能看得出。
例如
leicheng(int a)
{if(a==0||a==1) return 1;
else return n*leicheng(n-1);}
这样就可以用简单的方法实现复杂的问题。
例题
1. 求从1加到n的阶乘的和,输入n的值。(函数)
#include<iostream>
using namespace std;
int jch(int m)
{
int i,jc=1,sum=0;
for (i=1;i<=m;i++)
{
jc*=i;
sum+=jc;
} return sum;
}
int main()
{
int a;
cin>>a;
cout<<jch(a)<<endl;
return 0;
}
2. 递归见上面例子。
3. 输入和输出数组(用指针变量)
#include<bits/stdc++.h>
using namespace std;
int main()
{
inta[10],i;
int*p;
for(i=0;i<10;i++) cin>>a[i];
for(p=a;p<a+10;p++) cout<<*p<<'\t';
return 0;
}
感悟:
学完这节程序设计,我最大的感悟就是这门课好难啊,其实说难也不难,就是我没有理解,我觉得函数还好写,但是到了递归,就很难了,主要是吃不透,而且上课讲的例子都挺简单的,到了练习题的时候,就连解题思路都没有,这就比较绝望了。递归,我存在的问题就是找不出层叠关系,不能分解问题组成,我也不知道这时不是数学方法没学好的原因,而且应该是不止我一个,从做题情况来看就能知道还有很多同学对这节的理解还不够,所系我也希望老师能拿两个作业题来讲一讲,让我们理解的更深一些。
如果说还有问题的话,那就是指针变量和参数传递那个地方有点晕,不明白指针什么时候加星号,什么时候用&地址等等。不过这个就算是小问题了,通过自己多看看书,多做点题就可以自己弄懂,搞明白。
希望自己可以多多学习,早点学会并且熟练运用。