4、函数
·介绍
函数是C语言中模块化设计的最小单位(基本模块),函数是程序设计的‘零部件’。
设计得当的函数可以把函数内部的信息对不需要这些信息的其他模块隐藏起来,即不能访问,让使用者不需要关注函数内部是如何做的,只知道如何使用即可,从而使程序紧凑,逻辑清晰,这就是所谓的信息隐藏。
从使用者角度,函数分为:标准库函数{ printf() 、scanf() }和自定义函数两类, 库函数要有头文件的说明。
·函数的定义
函数名是函数的唯一标识,返回值类型默认为int,函数返回值只能有一个,return可以有多个,如:if-eles语句。
函数体内部定义的变量只能在函数体内访问,称为内部变量;参数表中的变量叫做形参,也是内部变量,只能在函数体内访问。
函数必须被main() 直接或间接调用才能发挥作用,有形参,要提供实参。实参——>形参 的过程称为参数传递,参数传递是’单向的值传递’,即实参的值可以传给形参,形参不能影响实参,二者分别占据不同的存储单元,形参和实参同名的变量互不干扰。但全局变量(下文)的出现会破坏函数的封装性。
调用其他函数的函数称为主调函数,被调用的称为被调函数。(先使用后定义--声明在前加分号)
例:
#include<stdio.h>
long Fact(int);
int main(void){
int m;
long ret;
printf("input m:");
scanf("%d",&m);
ret=Fact(m);
if(ret==-1){
printf("ERROR");
}
else
printf("%d!=%ld\n",m,ret);
return 0;
}
long Fact(int n){
int i;
long result=1;
if(n<0)
return -1;
else{
for(i=2;i<=n;i++)
result*=i;
return result;
}
}
思考:可不可以把主函数{printf("ERROR")} 替换Fact函数中result=-1 吗?
·递归与迭代
常见只用递归的例子是汉诺塔。一般为了提高程序的执行效率,尽量用迭代的方式替代递归
对于斐波那契数列:
①递归
#include <stdio.h>
long Fib(int n);
int main(void){
int n;
printf("input n:");
scanf("%d",&n);
Fib(n);
printf("%d\n", Fib(n));
return 0;
}
long Fib(int n)
{
if(n<1)
return -1;
if(n==1||n==2)
return 1;
else
return (Fib(n-1)+Fib(n-2));
}
②迭代
#include <stdio.h>
long Fib(int n);
int main(void){
int n;
printf("input n:");
scanf("%d",&n);
Fib(n);
printf("%d\n", Fib(n));
return 0;
}
long Fib(int n)
{
if(n<1)
return -1;
if(n==1||n==2)
return 1;
else{
int i,a1=1,a2=2;
for(i=3;i<n;i++){
a2=a1+a2;
a1=a2-a1;
}
return a2;
}
}
·全局变量与局部变量
不在任何语句块内定义的变量称为全局变量,相反的就是局部变量了。
全局变量在程序所有位置均有效,从程序运行开始起就占据内存,仅在程序结束时释放(适用于仅仅读取值而不修改值的情况);局部变量仅在语句块内有效。
·变量!
变量只能在其生存期内被访问(占用内存的时间),C语言中变量的存储类型分为:
①自动变量(auto): C语言中可以省略不写,动态存储区,即变量进入语句块时自动申请内存, 退出时自动释放内存,仅能被语句块内的语句访问
②静态变量(static): 体现在变量退出定义它的函数后,系统会重新分配它的内存,如果希望退出函数调用后不释放,则用到静态变量。
long Func(int n){ long Func(int n){
static long p =1; long p =1;
p=p*n; p=p*n;
return p return p
} }
$每次调用函数时,左边的p初始值会不断变化,而右边的p每次都为1。
③外部变量(extern)
④寄存器变量 (register)
第七章课后答案见大佬(非本人)链接:http://t.csdn.cn/GxlIE
-----------------------------------------------------------下一段 数组和算法基础