C语言函数与模块化程序设计

1.函数的定义
1.函数的分类
(1)标准库函数
(2)自定义函数
2.函数的定义
自定义的一系列函数。一般形式:
返回值类型 函数名(类型 形式参数1 , 类型 形式参数2,。。。)
|
声明语句序列
可执行语序序列
|
函数定界符–花括号 { },函数内部定义的变量只能再函数体内访问,称为内部变量。头部参数里面的变量,称为形式参数。
2.向函数传递和从函数返回值
1.函数的调用
(1)函数必须通过main()间接或者直接发挥作用。因此就涉及到函数调用的问题。
main 函数调用时 必须提供一个称为实际参数(Arugument,简称实参)的表达式给被调用的函数。称为主调函数,被调用的函数称为被调函数。 需要注意的是,函数的返回值只能有一个,函数的返回值的类型可以是除数组意外的任何类型。函数中的return语句可以有多个,但是最终返回值只有一个。
3.函数封装与防御性程序设计
函数的健壮性:
函数遇到不正确或者非法输入时仍能保护自己避免出错的能力。像添加某些代码专门用于处理异常输入的程序设计就叫做防御式编程(Defensive Programming)

#include
unsigned long Fact(unsigned int  n);
int main(void)
{
    int m,k;
    unsigned long p;
    do{
        printf("Input m,k(m >= k > 0): ");
        scanf("%d,%d", &m ,&k);
            printf("%d,%d\n", m, k);
        }while(m<k || m<=0 || k<0);
    p = Fact(m)/(Fact(k) * Fact(m-k));
    printf("p = %lu\n",p);
    return 0;
}
unsigned long Fact(unsigned int  n)
{
    unsigned int i;
    unsigned long result = 1;
    for( i = 2 ; i <= n ; i++ )
    result *= i;
    printf("n= %d,result = %lu\n",n,result);
    return result;
}

这个程序的写了几次答案都不对,然后发现是因为输入字符时误打入了中文的逗号! 一定要注意区分!
4.基本原则
1.规模尽量小,避免出错
2.功能单一
3.只能有一个入口和一个出口
4.函数接口中清楚地定义函数的行为,包括入口参数、出口参数、返回状态、异常处理。
5.函数的接口处,对参数的有效性进行检查
6.在执行某些操作时,检查合法性
7.考虑调用失败时该如何处理。
8.IDE考虑
5.递归
递归函数的两个部分:
(1)由其自身定义的与原始问题类似的更小规模的子问题,它使递归调用过程的条件,通常称为极限情况(General Case)
(2)递归调用的最简形式,它是一个能够用来结束递归调用过程的条件,通常为基线情况(Base Case)
6.变量的作用域
全局变量(Global Variable)。全局变量的作用域为整个程序,即全局变量在程序的所有位置均有效。
局部变量(Local Variable)。除整个程序以外的其他语句块内定义的变量。
斐波那契函数

#include
long Fib(int n);
int count;
int main()
{
    int n,i,x;
    printf("Input n:");
    scanf("%d",&n);
    for( i = 1 ; i <= n ; i++)
    {
        count = 0;
        x = Fib(i);
        printf("Fib(%d) = %d,count = %d\n",i,x,count);
    }
    return 0;
}
long Fib(int n)
{
    count++;
    if(n == 0) return 0;
    else if(n == 1) return 1;
    else return (Fib(n-1)+Fib(n-2));
}

7.变量的生存期
1.自动变量。(动态局部变量)
auto 类型名 变量名;
由于auto十分常见,因此C语言常省略不写。
(1)自动变量在定义时不会自动初始化。
(2)自动变量在退出函数后,其分配的内存立即被释放。
2.静态变量
一个自动变量(即动态局部变量)在退出定义它的函数时,因系统给它分配的内存已经被释放,下次再进入该函数时,系统会给它重新分配内存,因此它的值是不会被保留的。如果希望这个值被保留下来,除非系统分配给它的内存在退出函数调用时不注释。这时就要用到静态变量。
static 类型名 变量名;
静态变量是与程序共存亡的,而动态变量是与程序块共存亡。
3.外部变量
外部变量是全局变量,它的作用域是从它的定义点到本文件的末尾。
extern 类型名 变量名;
外部变量也是在静态存储区内分配内存的,其生存期是整个程序的运行期。没有显式初始化的外部变量由编译程序自动初始化为零。
4.寄存器变量
register 类型名 变量名;
寄存器(Register)是CPU内部的一种容量有限但是速度极快的存储器。由于CPU进行访问内存的操作是很耗时间的,使得有时对内存的访问无法与指令的执行保持同步。
8.模块化程序设计
1基本原则
高聚合、低耦合、保证每个模块相对独立。
2.自顶向下,逐步求精

你可能感兴趣的:(程序设计,c语言)