结构化程序设计一


复杂算法
结构化程序设计方法:模块的分解和组装

函数的定义和调用

+数据管理
分散管理
集中管理
一、结构化程序设计方法
+结构化程序设计方法就是
将一个求解复杂问题的过程划分为若干个子过程,每个子过程完成一个独立的、相对简单的功能;用算法描述各个过程的操作步骤,每个算法称为一个模块;采用“自顶向下,逐步细化”的方法逐步分解和设计算法模块,再通过调用关系将各个模块组织起来,最终形成一个完整的数据处理算法

+基于模块的团队分工协作开发
自顶向下,逐步细化

+常见的某块调用关系
模块重用 被上层多个模块调用

+主模块与被调模块

+结构化程序设计方法
模块化是团队分工的基础
模块接口是团队协作的基础
模块重用影响大型软件开发的组织与管理方式

+代码重用
跨时间重用,现在的软件开发项目可以重用以前项目所开发的代码
跨项目重用,
跨组织机构重用

+模块的额4大要素
模块名称、输入参数、返回值、算法

+模块设计者
重实现算法
+模块调用者
要了解模块的接口

+主模块与子模块

+c++语言支持结构化程序设计方法,以函数的语法形式来描述和组装模块,即函数的定义和调用

二、函数的定义和调用
1.定义函数

  函数类型 函数名(形式参数列表)
  {
    函数体
  }

函数类型:函数返回值(即函数值)的数据类型。由函数功能决定,可以是除数组之外的任何数据类型,省略是默认为int型,某些函数知识完成某种功能,但没有返回值,此时函数类型应定义为void

函数名:由程序员命名,符合标识符命名规则,通常函数之间不能重名

形参列表:定义了函数接收输入参数所需的变量,这些变量称为形式参数,简称为形参。可以有多个形参,每个形参以“数据类型 变量名”的形式定义,形参之间用逗号隔开。某些函数可能不需要输入参数,此时形式参数列表省略为空

函数体:描述数据处理算法的C++语句序列,用{} 括起来,函数体中可以定义专供本函数使用的变量,如果有返回值,则应使用return语句返回,返回值的数据类型应与函数类型一致

“ 函数类型 函数名(形式参数列表)”也称函数头,定义了函数的调用接口,及函数名、输入参数和返回值类型。

2.函数的调用

  函数名(实际参数列表)

实参列表指定函数所需要的输入参数。调用函数时应按被调用函数的要求给定具体的输入参数值,这些参数值称为实际参数,简称实参。实参可以是常量请、变量或表达式,参数之间用逗号隔开。调用时,首先将实参值按位置顺序一一赋值给对应的形参变量,这称为函数调用时的参数传递。实参与形参应当个数一致,类型一致
一个函数调用另一个函数,调用别人的函数称为主调函数,被调用的函数称为被调函数

+数据参数化

+函数的执行
执行子函数时暂停主函数执行跳转到子函数,子函数执行结束后返回主函数

+主调函数与被调函数间的2次数据传递
主调函数传给被调函数:实参--形参
被调函数传给主调函数:返回值

+函数的声明

  函数类型 函数名(形参列表);

函数(未定义)应在被调用之前声明
函数先定义后调用

三、数据的管理策略
+函数间需共享数据
数据分散管理:将数据交给各个函数管理,函数各自定义变量申请自己所需的内存空间,其它函数不能之间其中的数据, 需要时可通过数据传递来实现共享。采用分散管理策略时,定义变量的语句放在函数的函数体中,这样的变量称为"局部变量"。局部变量属本函数所有,其他函数不能直接访问
数据集中管理:将数据集中管理,统一定义公共的变量来存放共享数据,所有函数都可以访问。采用集中管理策略时,应将定义变量语句放在函数外面(不在任何函数的函数体中),这样的变量称为全局变量。全局变量属不属于任何函数,是公共的,所有函数都可以访问

+分散管理
按需传递
形实结合
返回值

+集中管理,全局共享

+变量作用域
局部变量:只能被本函数访问。
全局变量:可以被所有函数访问

c++源程序中的变量需要遵循“先定义 后访问”的原则,即变量在定义之后,其后续的语句才能访问该变量。变量的作用域(Scope)指的是C++源程序中可以访问该变量的代码区域

C++语言根据定义位置将变量分为局部变量、全局变量和函数形参等3种类型,他们具有不同的作用域。作用域也分为3种,分别是块作用域、文件作用域和函数原型作用域。所有变量只能在其作用域范围内访问

局部变量 块作用域 {}
全局变量 文件作用域
形参
函数定义中的形参具有块作用域,这里的代码块指的是该函数的函数体。函数定义中的形参只能被本函数体内的语句访问
函数声明中的形参不能也不需要被访问,其作用域为空,称为函数原型作用域。声明函数时,其形参列表可以只声明形参个数和类型,而形参名可以省略。

全局变量 先声明,后访问
extern int r;//使用外部声明语句延伸全局变量r的作用域

+变量的重名及局部优先原则
c++规定:同一作用域中的变量不能重名,不同作用域中的变量可以重名
访问重名变量时:局部优先

四、程序代码和变量的存储原理
+程序加载后立即为全局变量分配内存。全局变量将之一占用所分的内存,直到程序结束推测出时才被释放,这种内存分配方法称为静态分配
+局部变量时在计算机执行到其定义语句时才分配内存,到其所在代码块执行结束即被释放,这种内存分配方法称为自动分配

+生存期
程序生存期:从加载到执行结束退出这个时间段是一个程序在内存中的生存期
变量生存期:从内存分配到释放的时间段

+计算机只能执行函数调用语句的具体过程:

  • 动态内存分配
    new运算符来分配内存
    delete运算符将其释放 使用完后
    动态内存分配方法让程序员更主动、更直接地管理内存,根据需要分配尽可能多少的内存,同时尽早释放以减少内存的占用时间

+函数指针
可以通过内存地址访问变量,也可以通过内存地址调用函数
计算机程序在执行时被读如内存,在内存中建立一个程序副本,其中包括各函数的代码。也就是所,智能型时程序中各函数的代码时存放在内存中的
调用函数一般时通过函数名来调用,也可以函数代码的首地址来调用
通过地址调用函数需分为3步,一次时定义函数型指针变量、将函数首地址赋值给该指针变量、通过指针变量间接调用函数

 函数类型(*指针变量名)(形参列表);
  double fun(double x,int y){return(x+y);}
  double (*p)(double,int);
  p=fun1;
  cout<<fun1(3.5,2);
  cout<<(*p)(3.5,2);
  cout<<p(3.5,2);

函数名实际上可以理解成时指向函数代码的指针,只不过它时一种指针常量,固定指向某个函数
一个函数型指针变量可以i指向多个函数、这些函数都需要与指针变量匹配,即他们具有相同的形参和返回值类型

五、函数间参数传递的3种方式
+参数传递
值传递
引用传递
指针传递

+值传递
将主调函数中实参的值传递给被调函数的形参。形参单独分配内存,另外保存一份实参值的副本,被调用函数访问形参中的副本
值传递只是将主调函数中实参的值传递给被调函数的形参,无论被调函数如何修改形参都不会影响到实参

+引用传递
函数中定义的局部变量不能被其他函数直接访问,但能够被间接访问。引用传递就是传递实参变量的引用,被调函数通过该引用间接访问主调函数中的变量,从而达到传递数据的目的
采用引用传递时,被调函数的形参需定义成引用变量

特点:
引用传递将被调函数的形参定义成主调函数中实参变量的引用,被调函数通过该引用间接访问主调函数中的变量
被调函数修改形参实际上修改的是对应的实参。换句话说,主调函数可以通过引用将数据传给被调函数,被调函数也可以通过该引用修改实参的值将数据传回主调函数。引用传递是一种双向数据传递机制
引用传递时,实参必须是变量
引用传递的好处:一是形参直接引用实参,不需分配内存、传递数值,这样可以提高函数调用速度,降低内存占用;二是可以通过引用实现双向数据传递

+指针传递
指针传递就是传递实参变量的内存地址,被调用函数通过该地址间接访问主调函数中的变量,从而达到传递数据的目的
采用指针传递时,被调函数的形参需定义成指针变量,以接收实参变量的内存地址
特点:
指正传递将主调函数中实参变量的内存地址传给被调函数的指针形参,被调函数通过该内存地址间接访问主调函数中的变量
被调函数可通过内存地址修改对应的实参。指针传递是一种双向数据传递机制
指针传递时,实参必须是指针变量或指针表达式
指针传递的好处:一是可以通过内存地址实现双向数据传递,二是在传递批量数据(例如数组)时只需要传递一个内存首地址,这样可以提高函数调用速度,降低内存占用

六、在函数间传递数组
+函数在函数体中定义的数组时局部变量,其它函数不能直接访问其中的数据,需要时可通过传递来实现对数组的共享
+传递数组时,被调用函数需定义数组形式的形参,同时还需传递表明数组大小的参数,例如数组的元素个数

+计算机内部对数组的管理和访问是通过指针(即内存地址)来实现的
+在函数间传递数组,所传递的实际上是数组的首地址。换句话说,函数间数组传递采用的是指针传递,而不是值传递

猜你喜欢

转载自www.cnblogs.com/OceanF/p/9251030.html