Chinaunix首页 | 论坛 | 博客
  • 博客访问: 485600
  • 博文数量: 164
  • 博客积分: 4024
  • 博客等级: 上校
  • 技术积分: 1580
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-10 16:27
文章分类

全部博文(164)

文章存档

2011年(1)

2010年(108)

2009年(55)

我的朋友

分类: C/C++

2009-10-15 10:38:47

一。概述
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
 
阅读(1022) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~