一。概述
1.模块与函数
功能模块:求解较小问题的算法和程序
各个功能模块可以先单独设计,然后将求解的所有子问题的模块组合成求解原问题的程序
“自顶向下”的模块化程序设计方法
求解一个大问题分解成多个小问题的方法
函数:完成相对独立功能的程序
2.模块设计三个原则
(1)模块独立:功能独立的子功能,模块之间关系简单,使用独立变量
(2)模块规模适当
(3)分解模块要注意层次:对问题抽象化,设计时细化
总的设计原则:高内聚低耦合
二。函数定义与使用
1.标准库函数
定义在不同的头文件中
用户使用时,必须用#include“头文件”把相应的头文件包含到程序中来
2.用户自定义函数
函数类型:无参函数,有参函数,空函数
3.函数定义
方式1;函数返回值类型名 函数名(参数列表)
参数类型说明
{ 局部变量说明;
语句序列}
int max(a,b)
int a,b;
{}
方式2(推荐):函数返回值类型名 函数名(参数类型说明及参数列表)
{局部变量说明;
语句序列;}
int max(int a,int b)
{}
定义符号函数sign
int sign(int x)
{
int y;
y=x>0?1:(x==0?0:-1);
return y;
}
C语言函数分为两大部分:函数的说明部分(函数原型),函数体部分
4.函数各部分的作用
函数的说明部分:说明函数的类型,函数名,参数表及参数类
函数体:包括变量定义和执行语句序列。函数所完成的工作由函数体中的一段程序实现。
函数的返回值用返回值语句return返回,形式:return(表达式);或return 表达式;
如果函数的类型与return语句的表达式的类型不一致时,则以函数的类型为准。返回时自动进行数据转换
定义函数power(x,n),求x的n次方
float power(float x,int n)
{int i;
float t=1;
for(i=1;i<=n;i++)
t=t*x;
return t;}
5.自定义函数的调用
有参函数的调用形式:函数名(参数);
无参函数的调用形式:函数名();
6.函数调用形式
函数语句调用、函数表达式调用和函数参数调用
power(x,n);
y=power(x,n);
max(power(x1,n),power(x2,n));
三。函数声明
1.函数定义在main()之后,需要进行函数说明。
类型名 函数名(类型1 变量1,。。。类型n 变量n);
2.说明
函数声明应与该函数定义的函数类型与名称、形参的类型、个数、次序相一致
函数声明中的形参名可省略
当函数定义在主调函数之前,即先定义后使用,则调用时函数声明可以省略
3.形参和实参
实参的个数必须与形参相等,且参数顺序、类型要对应一致。实参与形参是按位置一一对应的传递数据的
编程输入2个数,输出较大的
#include
main()
{int a,b,m;
int max(int,int);
scanf("%d%d",&a,&b);
m=max(a,b);
printf("%d",m);}
int max(int x,int y)
{int t;
if(x>y)t=x;
else t=y;
return t;}
说明:形参被调用时才被分配内存,当函数执行完毕返回时,形参占用的内存空间被释放
形参和实参类型必须相容
单向的值传递
四。函数的嵌套调用
调用一个函数的过程中又调用了另一个函数
五。递归调用
自己调用自己
1.直接递归 2.间接递归
用递归算法计算n!
n= 1 n=0
n*(n-1)!;n>0
if(初始条件)
表达式;
else 递推表达式;
#include
long fac(unsigned n)
{long f;
if(n==0)f=1;
else f=n*fac(n-1);
return f;}
main()
{long y;
int n;
scanf("%d",&n);
y=fac(n);
printf("%ld",y);
}
六。变量的作用域及存储特性
1.变量的作用域
变量按作用域分为全局变量和局部变量
区别: 全局变量(外部变量) 局部变量(内部变量)
定义位置 函数体外 函数体内
作用域 从定义处到文件结束 从定义处到本函数结束
举例 所有在函数体外定义的变量 (1)所有在函数体内定义的变量(2)形参
注意 与局部变量同名的处理 不同函数中同名局部变量互不干扰
#include
int a,b;
void f()
{int t1,t2;
t1=2*a;t2=3*b;
b=100;
printf("%d %d",t1,t2);}
main()
{
a=2;b=4;
f1();
printf("%d %d",a,b);}
int a=2;b=4;
void f()
{int t1,t2;
t1=2*a;t2=3*b;
b=100;
printf("%d %d",t1,t2);}
main()
{int b=4;
f1();
printf("%d %d",a,b);}
七。变量的存储特性
1.变量按存在时间分:静态变量、动态变量
静态存储变量:生存期为程序执行的整个过程,在该过程中占有固定的存储空间,也称永久存储
动态存储变量:只生存在某一段时间内
函数的形参、函数体或分程序中定义的变量,只有当程序进入该函数或分程序时才分配存储空间,函数/分程序执行完后,变量的存储空间又被释放
2.变量属性:数据类型,存储类型
完整的变量定义:【存储类型】【数据类型】变量名
3.存储类型:
自动型:auto有形式参数、函数内变量、分程序变量。
进入程序自动分配内存,不长期占用内存
静态型:static局部静态变量,全局静态变量
长期占用内存
寄存器型;register将使用频率高的变量定义为register型,可以提高运算速度
寄存器变量只限于整型、字符型、指针型的局部变量
寄存器变量时动态变量,仅允许说明两个寄存器变量
外部性:extern
引用:extern 类型 变量名;
如果某个模块文件中要用到另一个模块文件的全局变量要用extern声明
定义时分配内存,其他文件引用时不再分配内存
f(int a)
{int b=0;static int c=3;
b++;c++;
printf("%d%d%d",a,b,c);
return(a+b+c);}
main()
{int a=2,k;
for(k=0;k<3;k++)
printf("%d\n",f(a));}
结果:2 1 4 7
2 1 5 8
2 1 6 9
main()
{int i;static int a=10;
register int b=5;
printf("%d %d %d\n",i,a,b);1 10 5
other();
printf("%d %d %d\n",i,a,b);}1 100 5
other()
{int i;static int a;
i=6;
a=100;
printf("%d %d\n",a,i);}6 100
阅读(1029) | 评论(0) | 转发(0) |