模块化程序设计

模块化程序设计
模块化程序设计

第四章模块化程序设计

教学目的:模块程序设计是C程序合作编程序的方法,通过这一章的学习使学生能自己编C 程序中的函数,正确地调用函数,熟悉函数调用时形式参数和实在参数的关系。通过变量的存储类型,能正确使用各种不同存储类型的变量编程序。

重点难点:函数的嵌套调用及函数的递归调用。

前面各几章的学习,大家已有了编制小程序的经验。如果想编制大程序,在C语言下就得用模块化程序设计,其基本思想是将一个大的程序按功能分割成一些模块,使每一个模块都成为功能单一、结构清晰、接口简单、容易理解的小程序。

C语言提供了支持模块化软件开发的功能:

1 函数式的程序结构。程序由一个或多个函数组成,每个函数都有各自独立的功能和界面。

2 允许通过使用不同的存储类别的变量,控制模块内部和外部的信息交换。

3具有预编译处理功能,为程序的调试、移植提供方便,支持模块化程序设计。

本章介绍这些功能及进行程序开发的基本方法。

4.1 函数

C程序结构

无论涉及的问题是复杂还是简单,规模是大还是小,用C语言设计程序,任务只有一种,就是编写函数,至少要编写一个主函数main(),C程序的执行就是执行相应的main()函数。即从它的main()函数的第一个花括号开始,依次执行后面的语句,直到最后的花括号为止。其它函数只有在执行了main()函数的过程中被调用时才执行。

高级语言中“函数”的概念和数学中“函数”的概念不完全相同。英语单词function有“函数”和“功能”两种介绍,高级语言中的函数实际上是功能的意思。当要完成某一个功能时,就用一个函数去实现它。在程序设计时首先要考虑main()函数中的算法,当main()中需要使用某一功能时,就用一个具有该功能的函数表达式表示。这时的函数,我们只知道它具有什么功能,其它先不作处理。设计完main()的算法并检验无误后,这时开始考虑它所调用的函数。如果在库函数中能找到,就可直接使用,否则再动手设计这些函数。这种设计方法称为自顶向下、逐步细化的程序设计方法。这种方法设计出来的程序在功率高,程序层次分明、结构清晰。复杂程序的层次可从以下图形中看出:

许多大型软件系统包含了相当丰富的,可供从事某一领域工作人员选用,如一个高等学校的信息管理系统就包含了教务、科研、人事、财务,设备、图书、后勤、办公室等子系统。每一个子系统以可分为许多子子系统。

这种软件为了方便用户大都采用菜单(menu)方式,这种形式的软件,大家都用过。用户

只需按一些简单的键,就能调用该功能,就像在饭店点菜一样那么方便。高等院校事务管理系统的模块结构如下:(程序menu.c)

函数的定义与函数声明(一)

函数就是在程序中设定的一个函数模块。一个函数是由变量声明部分与可执行语句组的成独立实体,用来完成一指定功能。除了系统提供的函数外,用户编制函数才是一种正确的选择。

(一).函数定义:(函数类型、函数名、形参、函数体内容)

函数返回值的类型说明函数名(类型名形式参数1,类型名形式参数2,…)

{ 函数首部

说明部分函数体

语句部分

}

函数类型:函数计算后的值是什么类型。

函数名:用户命名的标识符,在主函数中调用的名字。

形式参数:函数中处理的变量,通过它接收主函数传过来的具体值。

函数体:函数计算时的具体方法和函数的表达式。由变量定义部分和

语句组成。

函数的返回:由函数返回调用它的函数,可由以下返回形式:

return 表达式;return; 可没有return语句,也可有多个return语句。函数的定义与函数声明(二)

函数名 (类型名形式参数1,类型名形式参数2,…) 省略类型说明,C语言默认返回值为int型。

例:求两个双精度数这和的函数。

double add(double a,double b)

{ double s;

s=a+b;

return s;

}

函数返回值的类型可以是整型、实型、字符型

和指针类型。以上函数的返回值是double型。

可用double add(a,b) double a,b来写函数首部。

定义函数可以没有参数,但一对括号不省略,如:dummy() ,函数体也可是空的,这样的函数什么也不做。编程时可作为一个虚设的部分。

函数举例:编一个求两个数中最小数的函数,用循环语句多次调用该函数,找出十个数中的最小数。 (ec711.c)

函数声明(三)

在C 语言中,除了主函数外,对于用定义的函数要遵循“先定义,后使用”的规则。凡是未在调用前定义函数,C编译程序都默认函数的返回值为int类型。对于返回值为其它类型的函数,若把函的定义放在调用之后,应该在调用之前对函进行说明。即只有函数的首部,一般形式为:类型名函数名(参数类型1,参数类型2,…)

如:double add(double,double)或

类型名函数名(参数类型1 参数名1,参数类型2,参数名2,…)

如:double add(double p,double q)

这里的参数是虚设的,实际上参数名常常省略。函数说明语句中的类型名必须与函数返回值的类型一致。

函数说明既可以作为一条单独的语句如:double add(double,double)也可以与普通变量的说明在一起如:double x,y,add(double,double)

函数说明的位置与调用的关系

当在所有函数的外部、被调用之前说明函数时,在说明之后的任何位置都可调用。

函数说明也可放在调用函数内的说明部分,但只能在该函内调用。

函数的传值调用(一)

参数是函数调用时进行信息交换的载体,实参和形参结合,完成信息交换,函数的执行部分对这些传递来的数据进行处理后,返回相应的函数值。与数学中的知道函数表达式求函数值相类似。(f(x)=3x+1;f(5)=?,f(0)=?)只不过是C语言中的函数自变量个数不只是一个。

1.当所调用的函数用于求出某个值时,函数的调用可作为表达式出现在允许表达式出现的任何地方,如:

y=add(3.0,4.0); 也可出现有关系表达式中用于条件判断。

2.如果只为了某些操作不返回函数值时,函数作为一条独立的语句,如:函数名(实在参数);函数调用时的语法要求:

1.调用函数时,函数名必须与定义的函数名字完全一致。

2.实在参数的个数必须与形式参数的个数一样。实在参数可以是表达式,类型上应按位置与形式参数一一对应匹配。如果类型不一致,编译系统会根据赋值兼容规定进行转换,若类型不赋值兼容,不给出错信息,程序继续执行,得不到正确的结果。

函数的传值调用(二)

在C语言中调用函数与被调用函数之间的数据可通过三种方法进行传递:

1.实在参数和形式参数之间进行数据传递。

2.通过return语句把函数值返回调用函数。

3.通过全局变量。这种方法不好。

在C语言中,数据只能从实参传递给形参,称为“按值”传递。也就是说,当用简单变量作为实在参数,用不能在函数中改变对应的值。观察参数传递两个实例:

函数参数之间的单向传递。(ec71.c)

调用函数交换两个变量中的值。(ec72.c)

没有返回值的调用:(ec710.c)

函数的嵌套调用

C程序的main()函数在调用一个函数时,被调用的函数,又要调用另一个函数,这种调用称为函数的嵌套调用。

例:把一个偶数分解为两个素数之和。

两次调用判断一个数是否为素数的函数; (ec74.c)

(ec75.c)

函数的递归调用

C语言中的函数可以递归调用,即:可直接叵间接地调用自己。前者称为简单递归,后者称为间接递归,只讨论简单递归。

递归符合的三个条件:

1. 可以反要解决的问题转化为一个新的问题,而这个新的问题的解法仍与原野来的解法相同,只是所处理的对象有规律地递增或递减。

2 .可以应用这个转化过程使问题得到解决。

3 .必有一个明确的结束递归的条件。

例:用递归的方法求n!。

把计算n的阶乘转化为n-1的阶乘,而计算方法相同。当计算到n为0时,问题完成。

函数的递归调用

函数递归调用如何分析执行结果:

fac(5)

fac(5)=5*fac(4)=5*4*3*2*1=120

5*fac(4) fac(4)=4*f(3)=4*3*2*1=24

4*fac(3) fac(3)=3*fac(2)=3*2*1=6

3*fac(2) fac(2)=2*fac(1)=2*1=2

2*fac(1) fac(1)=1*fac(0)=1*1=1

1*fac(0) fac(0)=1

fac(int n) main()

{int t; { int m,y;

if(n= =1||n= =0) return 1; scanf(“%d”,&m);

else {t=n*fac(n-1); return t; } if (m<0) printf(“Input data error”); } else

{ y=fac(m);printf(“%d”,y);}

}

程序执行结果ec1102.c

函数的递归调用

分析11.7程序的执行结果:

fun(6,&x) fun(6,&x)=fun(5,&x)+fun(4,&x) =5+3=8

fun(5,&x) fun(5,&x)=fun(4,&x)+fun(3,&x) =3+2=5

fun(4,&x) fun(4,&x)=fun(3,&x)+fun(2,&x) =2+1=3

fun(3,&x) fun(3,&x)=fun(2,&x)+fun(1,&x) =1+1=2

fun(2,&x) fun(2,&x)=1

fun(1,&x) fun(1,&x) =1

先下来,再返上去,这就是递归的分析的方法。

看程序执行结果ec1103.c

程序举例

1.编写函数判断自变量是不为素数,若是素数,函数返回1,否则返回0。

(ec73.c)

2.编写函数,验证任意偶数可分解为两个素数之和,并输出这个素数。 (ec74.c)

3.

(ec75.c)

4.用梯形法求函数的定积分。近似公式如下:

(ec76.c)

5.把小写字母转换成大写字母的函数。 (ec77.c)

6.统计输入字符的个数。 (ec78.c)

7.统计输入一段文本中的单词个数。用空格、换行符、跳格隔开。 (ec79.c)

变量的存储属性

变量是对程序中数据的存储空间的抽象。前面介绍的数据类型是变量的操作属性。除此之外,影响变量使用的还有变量的存储属性。

⒈变量的存储类型:计算机中的存储器分为内存和外存,除此这外不有一个称为寄存器的临时存储器,用来存储一些反复被加工的数据,存取速度比内存和外存要快得多。

⒉变量的生存期:C语言中的变量可用两种方法建立:在编译时分配存储单元,程序开始执行变量被创建,结束被撤销。这种变量生存期为程序执行的整个过程,在该过程中占有固定存储空间,称为永久存储;另一种是在某一段时间内存在,函数的形参和在函数体中的定义的变量,在程序进入该函数,才分配存储空间,函数结束,存储空间又被撤销,称为动态存储。

⒊变量的可用域:分为两种:局部可用和全局可用,即局部变量与全局变量。

用存储属性可表示这三个方面的属性;分为四种存储类别说明auto(自

动);register(寄存器);static(静态)和extern(外部)。以上属性说明,放在类型说明符的左边,也可以放在类型说明符的右边。 auto int k,l ; int auto k,l;

4.2.1 动态变量

4.2.2 静态变量

4.2.3 外部变量

动态变量(一)

(一)自动(auto)变量:

在变量定义时使用auto和不使用auto定义都是自动变量,这类变量的使用和前面所用变量一样。在主函数和子函数中变量名一样的变量分析程序时要特别注意。

1.自动变量是局部变量

自动变量只有在它定义的那个局部才能使用。(ec72.c)

(ec712.c)

2.在对自动变量赋值之前,它值是不确定。

在编制累加和累乘的程序时,为什么要给和单元及积单元赋初值,原理就在这里。

(ec713.c)程序计算的结果不确定。

(ec714.c)变量x没有赋初值,执行的结果不可预测。

动态变量(二)

二寄存器(register)变量:

它的值保留的CPU的寄存器中,不占用内存单元,存取时间快,用它可提高程序的运行速度。通常把使用频率较高的变量定义为寄存器变量。定义与自动变量一样。

由于现在的计算机运算速度快,定义寄存器变量,很难分辨出它执行的情况。

打印乘法九九表的程序:(ec715.c)

由循环控制变量i,j经常用,所以定义为寄存器变量。

由于各种计算机系统中的寄存器数目不同,寄存器的长度也不同,因此程序中定义寄存器变量的数量受限制。

静态变量

静态static变量:

它中的值和其它类型变量不一样在于:

1.在整个程序运行期间,静态局部变量在内存中占有永久性的存储单元,即使退出函数以后,再进入函数时,静态局部变量仍使用原来的存储单元。由于不释放原来的值,它的值可以使用到程序结束。

2.它的初值是在编译时赋予的,在执行时不再赋初值,末赋初值时系统自动赋初值0。

⒊在函数多次被调用过程中静态局部变量的值具有可继承性。

(ec716.c)(ec716a.c)

⒋静态局部变量的值只能在本函数中使用。

外部变量

一、外部变量(extern)是全局变量

定义在所有函数之外的变量称为外部变量。

(ec717.c)(ec717a.c)

(ec718.c)

二、外部变量使用的几种情况

产生随机数(ec719.c)

在不同的编译单位内用extern说明符来扩展全局变量的作用域同一编译单位是在同一C的源程序中。不同的编译单位是在两个以上不同的C源程序内。通过头文件来进行互相访问的。

三、外部变量的副作用

主函数和子函数用同名外部变量产生的错误。(ec720.c)

编译预处理

“编译预处理”就是在C编译程序对C源程序进行编译前,由编译预处理程序对这些编译预处理命令处理的过程。

C语言的预处理均以 #include #define开头不加分号。

编译预处理是C语言的一个重要特点,它能改善程序设计环境,有助于编写易移植、易处理的程序,也是模块化程序设计的一个重要工具。

4.3.1 宏替换

4.3.2 文件包含

编译预处理(一)

宏替换是用预处理命令 #define指定的预处理。

一、不带参数的宏:

#define 宏名替换文本 #define SIZE 1000

这种使用在前面的程序中已用到,如果替换文本还用到已定义的宏时,分析时要注意。

替换文本中包含已定义过的宏:

#define PI 3.14

#define ADDPI (PI+1)

#define TWO_ADDPI (2*ADDPI)

如果有表达式:x=TWO_ADDPI/2,则替换后为:x=(2*(3.14+1))/2

若写成“PI+1”和“2*ADDPI”不加括号,替换后为x=2*3.14+1/2;因为是编译预处理,不计算后再用,就是先替换再计算。

编译预处理(二)

二、带参数的宏替换:(ec721.c)

类似于函数,但要根据宏定义时的表达式,要先替换,再计算。

例:#define MU(X,Y) ((X)*(Y))

a=MU(5,6) 替换为 a=((5)*(6))=30

#define MU(X,Y) X*Y

a=MU(5,6) a=5*6=30

a=MU(2+3,6) a=2+3*6=20

分析以下程序执行的结果:

#define SQR(X) X*X

main()

{int a=10,k=2,m=1; /*没加括号,替换结果为*/

a/=SQR(k+m)/SQR(k+m); /* k+m*k+m/k+m*k+m */

printf(“%d\n”,a);

}

文件包含

文件包含:

在C语言程序开发时,可以用文件包含的方法使得按照一定功能编制的存在文件中的某类宏被当前文件调用,而不需再去编制。只需在头文件中包含这些文件即可。

所谓文件包含,是在一个文件中,去包含另一个文件的全部内容。在以前的程序编制时已用过。

#include"文件名"

或 #include <文件名>

在预编译时,预编译程序将用指定文件中的内容来替换此命令。

包含的文件的扩展名不一定用“.h” ,也可以是C源程序“.c”。(file1.c)

#include "stdio.h" 标准输入输出函数 #include "conio.h" 屏幕控制函数

#include "stdlib.h" 随机函数等 #include "math.h" 数学函数

#include "ctype.h" 字符函数 #include "string.h" 字符串函数

C语言用函数实现模块化程序设计

第7章用函数实现模块化程序设计 习题与思考 2.在C语言中,函数的隐含存储类别是_____A_____. A)auto B)static C)extern D)无存储类别 要点分析:本习题考察变量的存储类别。C语言规定,如不指定变量的存储类别,系统默认为自动类型的,即auto型。 3.以下所列的各函数首部中,正确的是_____C_____. A)void play(var:Integer,var b:Integer) B)void play(int a,b) C)void play(int a,int b) D)Sub play(a as integer,b as integer) 要点分析:本习题考察函数的定义。要求函数首部的各个形式参数应分别指出其数据类型。 4.以下程序的输出结果是_____C_____. fun(int x,int y,int z) { z=x*x+y*y;} void main( ) { int a=31; fun(5,2,a); printf("%d",a);} A)0 B)29 C)31 D)无定值要点分析:本习题考察形参和实参的关系。函数一旦发生传值调用,把实参的值传递给形参后,实参的值仍保留原值。 5.以下程序的输出结果是_____A_____. f( int b[ ],int m, int n ) { int i,s=0; for(i=m;i

return s; } void main( ) { int x,a[ ]={1,2,3,4,5,6,7,8,9}; x=f(a,3,7); printf("%d\n",x); } A) 10 B) 18 C) 8 D) 15 要点分析:本习题考察数组做函数的参数,此时实参为数组名,形参数组不再重新分配存储空间,形参数组共占实参数组所在的存储空间。数组做函数参数是学生出错误比较多的知识点。 7.以下程序的输出结果是_____D_____. int f( ) { static int i=0; int s=1; s+=i;i++; return s;} void main( ) { int i,a=0; for(i=0;i<5;i++)a+=f(); printf("%d\n",a); } A) 20 B) 24 C) 25 D) 15 要点分析:本习题考察静态局部变量。静态局部变量的值在调用结束后仍保持结束后的值。静态局部变量是变量的存储类别的重点,学生应该掌握并应用。 8. 以下程序的功能是调用函数fun计算:m=1-2+3-4+…+9-10,并输出结果。请填空。 int fun( int n) { int m=0,f=1,i; for(i=1; i<=n; i++) { m+=i*f; f= _____-f_____ ; } return m; } void main( ) { printf("m=%d\n", _____fun(10)_____ ); } 要点分析:本习题考察函数的调用。通过编写fun函数求得累加和。

模块化设计方法的设计流程

BJ-EPM240T100学习板实验教程 模块化设计方法的设计流程 将这种模块化设计思路运用于FPGA/CPLD设计,将大规模复杂系统按照一定规则划分成若干模块,然后对每个模块进行设计输入、综合,并将实现结果约束在预先设置好的区域内,最后将所有模块的实现结果有机地组织起来,就能完成整个系统的设计。 (1)顶层模块的设计:项目管理者需要完成顶层模块的设计输入与综合,为进行Modular Design实现阶段的第一步—初始预算阶段(Initial Budgeting Phase)做准备。 (2)子模块的设计:每个项目成员相对独立地并行完成各自子模块的设计输入和综合,为进行Modular Design实现阶段的第二步—子模块的激活模式实现(ActiveModule Implementation)做准备。 模块化设计的实现步骤是整个模块化设计流程中最重要、最特殊的,它包含: (1)初始预算–本阶段是实现步骤的第一步,对整个Modular Design起着指导性的作用。在初始预算阶段,项目管理者需要为设计的整体进行位置布局,只有布局合理,才能够在最大程度上体现Modular Design的优势;反之,如果因布局不合理而在较后的阶段需要再次进行初始预算,则需要对整个实现步骤全面返工。 (2)子模块的激活模式实现(Active ModuleImplementation)--在该阶段,每个项目成员并行完成各自子模块的实现。 (3)模块的最后合并(Final Assembly)--在该阶段项目管理者将顶层的实现结果和所有子模块的激活模式实现结果有机地组织起来,完成整个设计的实现步骤。 模块化设计中模块划分的基本原则为: 子模块功能相对独立,模块内部联系尽量紧密,而模块间的连接尽量简单。

模块化设计方法及其在机械设计中的应用

模块化设计方法及其在机械设计中的应用 摘要:随着社会经济的发展,为了提高企业生产效率,模块化设计理念在机械设计领域日益广泛,其对于整合市场、优化结构具有重要意义。我们要树立创新意识,加强其在机械设计中的研究运用,实现模块化的转变。 关键词:模块化;设计方法;机械设计 随着技术的发展和经验的总结,在机械设计中,越来越多的设计方相继出现,并逐渐得到广泛的运用。在实际工作中传统的机械包装方法的弊端日益显现,越来越多不适应机械设计的需要,而模块化设计方法逐渐得到广泛的运用。 1 机械产品模块化涵义 模块化就是以它的观点去对产品或者系统进行策划和生产方案,在某个限度内的一样或者存在差异的功能、相异规格的产品探究讨论,区分并设计。机械产品的模块化主要可从以下几方面进行分析: (1)功能需求集,指的是市场和客户对模块化产品基本功能要求的合集。产品的功能需求是进行产品模块化的重要内容,是产品发展的重要方向。 (2)功能模块,强调的为产品里所能够充分发挥其性能因素的作用. (3)结构模块,指的是功能模块的具体结构,一般由部件或子结构模块组成。 (4)模块接口,指的是描述结构模块组合时相互间的几何、物理关系的结合面,模块接口是模块组合的重要依据。 (5)基础模块,通用型接口模块,能够满足基本功能,而得以实现的定向模块功能演进的模块形式。 2 模块化设计 2.1 模块划分标准 为了让人们对模块化设计方法在机械设计中运用有更为详细的了解,对模块化的设计进行划分,在数控立式车床设计中,运用模块化设计方法,其中最为关键的内容是进行功能与结构分析,这是决定设计效果的关键内容。因此,设计开始前,要对模块进行处理,详细划分模块。当前,还没有任何一种标准可以作为模块划分原则。这里,依据不同侧重点,对不同模块进行划分。模块具有独立性,

模块化程序设计实例

9 .5 模块化程序设计实例 《程序设计基础》(基于C语言讲解)石光华编著—北京: 清华大学出版社 下面以设计一个简单的成绩管理软件为例,一步一步地按模块化程序设计方法进行设计。 1 .定义问题 设计一个成绩管理软件,其基本功能包括:输入成绩,成绩加分,计算平均成绩,找出最高分,找出最低分,输出成绩等。 2 .确定组成程序的模块 根据成绩管理软件的功能,确定软件的基本模块包括:输入模块,加分模块,平均分模块,最高分模块,最低分模块,输出模块等。 142 程序设计基础 3 .绘制程序结构图 成绩管理软件的结构图如图9-5所示。 图9-5 成绩管理软件结构图 4 .流程图 用流程图确定主程序的逻辑结构,如图9-6所示。 在流程图中,istate 的作用是记录是否已经输入成绩。istate 的使用有如下两种 方式。 (1) 作为全局变量使用。此时istate可以在所有模块中改变其值,主程序更简洁,但 可能产生边际效应。 (2) 作为主程序的局部变量使用。此时istate只能在主程序中改变其值。在主程序 中可以直观地看到其变化,能够防止边际效应。 采用方式(2)的主程序如下。

#include < stdio .h> #define SIZE 10 void main() { int iscore[SIZE] ={0}; int key= - 1; int iresult=0; float fresult=0; int istate=0; printf(″1:Input scores;\n″); 第9章模块化程序设计 143 图9-6 成绩管理软件主程序流程图 printf(″2:Output scores;\n″); printf(″3:Count for the max score;\n″); printf(″4:Count for the minimum score;\n″); printf(″5:Count for the total score;\n″); printf(″6:Count for theaverage score;\n″); printf(″- 1:Exit .\n″); while(1) { printf(″Please input your choose:″); scanf(″%d″,&key); if (key = = - 1) 144 程序设计基础

模块化程序设计练习题及答案

第四章模块化程序设计练习题及参考答案 一、填空题 1、以下程序的运行结果是(111),把x定义为静态变量运行结果是(123)。void increment(void) { int x=0; x+=1; printf("%d",x);} main() { increment(); increment(); increment(); } 2、若输入的值是-125,以下程序的运行结果是(-125=-5*5*5) #include "" main() { int n; void f(int n); scanf("%d",&n); printf("%d=",n); if(n<0) printf("-"); n=fabs(n); fun(n); } void fun(int n) { int k,r; for(k=2;k<=sqrt(n);k++) { r=n%k; while(r==0) { printf("%d",k); n=n/k; if(n>1)printf("*"); r=n%k; } } if(n!=1) printf("%d\n",n); } 3、设有以下宏定义: #define WIDTH 80 #define LENGTH WIDTH+40 则执行赋值语句:v=LENGTH*20;(v为int型)后,v的值是(880) 4、设有以下宏定义: #define WIDTH 80 #define LENGTH (WIDTH+40)

则执行赋值语句:k=LENGTH*20;(k为int型变量)后,k的值是(2400) 5、下面程序的运行结果是(5) #define DOUBLE(r) r*r main() { int x=1,y=2,t; t=DOUBLE(x+y); printf("%d\n",t);} 6、下面程序的运行结果是(36) #define MUL(z) (z)*(z) main() { printf("%d\n",MUL(1+2)+3); } 7、下面程序的运行结果是(212) #define POWER(x) ((x)*(x)) main() { int i=1; while(i<=4) printf("%d,",POWER(i++)); } 8、下面程序的运行结果是(9) #define MAX(a,b) (a>ba:b)+1 main() { int i=6,j=8,k; printf("%d\n",MAX(i,j)); } 二、选择题 1、以下正确的说法是(D)建立自定义函数的目的之一是: A)提高程序的执行效率 B)提高程序的可读性 C)减少程序的篇幅 D)减少程序文件所占内存 2、以下正确的说法是(B) A)用户若需调用标准库函数,调用前必须重新定义 B)用户可以重新定义标准库函数,若如此,该函数将失原有含义。 C)系统根本不允许用户重新定义标准库函数。 D)用户若需调用标准函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,系统自动去调用。 3、以下正确的函数定义形式是(C) A)double fun(int x,int y) B)double fun(int x;int y) C)double fun(int x,int y); D)double fun(int x,y) 4、以下正确的说法是(D)。在C语言中: A)实参与其对应的形参各占用独立的存储单元。 B)实参和与其对应的形参共占用一个存储单元。 C)只用当实参和与其对应的形参同名时才共占用存储单元。

产品模块化设计

当今制造业企业一方面必须利用产品的批量化、标准化和通用化来缩短上市周期、降低产品成本、提高产品质量,另一方面还要不断地进行产品创新使产品越来越个性化,满足客户的定制需求。这样,如何平衡产品的标准化、通用化与定制化、柔性化之间的矛盾,成为赢得竞争的关键能力。平台化、模块化的产品设计和生产可以在保持产品较高通用性的同时提供产品的多样化配置,因此平台化、模块化的产品是解决定制化生产和批量化生产这对矛盾的一条出路。 以下总结了推行模块设计过程需要关注的要点: 1 产品模块化设计各个部门远景目标: 1)产品开发:产品开发过程分解为平台开发和产品开发过程,专门的团队进行平台的设计和优化,新产品的开发由平台通过 变量配置实现; 2)产品制造:产品制造部门按照产品平台分配产线和装配资源; 3)供应链管理:实现零库存,根据模块的要求选择能够承接模块设计和开发的供应商; 4)市场部门:实现按订单制定产品开发和制造计划。 2 模块化实施过程: 1)产品系列平台划分,采用“产品型号组方法”则是对整个目标 市场划分所进行的全部变型型号的规划和开发。新产品规划要

定义一组变型型号。配置应当与市场定位关联,其实际定义应 当与产品性能的部分关联,并体现出不同变型型号之间的差异。 2)产品模块划分,可以采用MFD方法进行模块划分,步骤包括: a 定义客户需求,利用卡诺模型区分客户需求与满意度关 系、使用QFD方法定义客户需求与产品性能的对应关系; b 选择技术方法,定义产品功能树,使用波氏方法选择 技术方法;使用DPM矩阵描述技术方法与产品性能的对 应关系; c 产生模块概念,定义模块驱动与技术解决方案的对应关 系,最理想的模块技术解决方法是可以自己组合成一个模 块,至少可以作为一个模块的基础; 不够优化的技术解决 方法应该和其他技术解决方法整合在一起组成模块。 d 评估模块概念,定义模块接口,优化模块接口。 e 模块优化,创建模块规格说明,进行模块优化,进行 经济和技术上的评价。 3)选项变量定义;在一个平台上定义许可的选项/选项集,定义选项之间的关系和约束。 3 模块化设计考核指标 1)部署通用产品结构的型号组/ 全部型号组; 2)通用模块实例/ 全部的模块实例; 3)CAD/PDM系统中零部件族的利用率;

家具模块化设计方法实例分析

家具模块化设计方法实例分析 1前言 当前,消费者对家具的个性化需求日益凸显,如何满足这种需求已经成为越来越多家具企业发展的关键。要做到既符合现代机械化生产的发展主流,又节约成本,且能提高产品的市场竞争力。这确实为难了不少的家具企业。有一坐企业尝试通过从销售终端满足个性化,但众多形态各异、尺寸繁多的家具定单从销售端传送至生产和设计部门,却带来了新的矛盾:设计任务艰巨、生产设计难排、产品质量难以保证,甚至由于部件尺寸的相近导致出错率增加、生产效率低下。有一些敢于吃螃蟹的企业尝试从设计入手,通过标准零部件的设计、组合成新产品来满足这种“个性化”“的需求。但遗憾的是,这种做法并未带来预期的效果,单一的产品导致了销售客额和顾客满意率的下降。所以,如何实现产品的个性化?是从销售端,还是从设计与生产端着手呢?这是家具企业必须根据企业现状做出回答的问题。定制是从销售端解决问题,而模块化设计是从设计端解决问题,旨在通过设计具有标准性和通用性的功能模块,达到组合成多样化的家具的目的。毫无疑问,模块化设计在家具业具有很大的发展潜力,它既能解决个性化需求的问题,还能做到低成本与高效率。 模块化设计属于方法学的范畴,在其他工业行业中已经得到了长足的发展。由于家具消费环塘和制造环境的变化,模块化设计以其特有的优势,开始在家具行业尤其是办公家具中应用。而对于民用家具,

近年来个性化需求与家具企业的生产矛盾日益突出,有关模块化设计的探索才刚刚开始。鉴于国内尚无系统的家具模块化设计理论来指导企业的实践,本文着重以衣橱为例,详细具体地分析单个家具的非模块化设计过程,以进一步明确家具模块化设计的必要性和可操作性。 2 设计概念及设计方法 家具模块化设计指的是在对家具进行功能分析的基础上,划分并设计出一系列的家具功能模块,通过功能模块的选择与组合构成不同的家具,以满足市场多样化需求的设计方法。与传统的设计方法相比较,家具模块化设计呈现出许多新特征。首先,它是针对模块和家具产品系统的设计,既要设计模块,又要设计家具成品。其次,它以标准化、通用化的零部件快速组合成家具,能实现家具的多样化。模块化设计不同于标准化设计,标准化设计带来的是单一的产品,而模块化设计则不然,在设计之初就考虑模块可组合成产品的多样性。因此模块化设计是在标准化设计基础之上,实现产品多样化的一种方法。 根据家具模块化设计的概念,笔者提出从三个层次展开家具的模块化设计。第一层次是家具模块化总体设计。这个阶段主要是进行模块化系统的总体策划,确定模块化实施的范围。良好的模块化总体设计,是模块化设计得以实现的基础。第二层次是家具模块设计,这是模块化设计系统具体化的过程,是承上启下的环节。模块化设计的好坏,直接影响到模块化家具组合的最终效果。第三层次是家具模块化产品设计。这个阶段主要是选择模块,评价模块可能组合方式的合理

实验七 用函数实现模块化程序设计

河南工业大学C语言实验报告 专业班级:生物11级1班学号:201112910118姓名:l刘路路指导老师:朱红莉评分: 实验题目:用函数实现模块化程序设计 实验目的:熟练掌握函数的定义、调用、声明 实验内容:P218-219 习题1、2、4 实验步骤:(具体程序及运行结果) 7.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。 #include int main() {int hcf(int,int); int lcd(int,int,int); int u,v,h,l; scanf("%d,%d",&u,&v); h=hcf(u,v); printf("H.C.F=%d\n",h); l=lcd(u,v,h); printf("L.C.D=%d\n",l); return 0; } int hcf(int u,int v) {int t,r; if (v>u) {t=u;u=v;v=t;} while ((r=u%v)!=0) {u=v; v=r;} return(v); } int lcd(int u,int v,int h) { return(u*v/h); } 7.3写一个判素数的函数,在主函数输入一个整数,输出是否为素数的信息。 #include int main() {int prime(int); int n; printf("input an integer:"); scanf("%d",&n);

if (prime(n)) printf("%d is a prime.\n",n); else printf("%d is not a prime.\n",n); return 0; } int prime(int n) {int flag=1,i; for (i=2;i #define N 3 int array[N][N]; int main() { void convert(int array[][3]); int i,j; printf("input array:\n"); for (i=0;i

模块化程序设计

第四章模块化程序设计 教学目的:模块程序设计是C程序合作编程序的方法,通过这一章的学习使学生能自己编C 程序中的函数,正确地调用函数,熟悉函数调用时形式参数和实在参数的关系。通过变量的存储类型,能正确使用各种不同存储类型的变量编程序。 重点难点:函数的嵌套调用及函数的递归调用。 前面各几章的学习,大家已有了编制小程序的经验。如果想编制大程序,在C语言下就得用模块化程序设计,其基本思想是将一个大的程序按功能分割成一些模块,使每一个模块都成为功能单一、结构清晰、接口简单、容易理解的小程序。 C语言提供了支持模块化软件开发的功能: 1 函数式的程序结构。程序由一个或多个函数组成,每个函数都有各自独立的功能和界面。 2 允许通过使用不同的存储类别的变量,控制模块内部和外部的信息交换。 3具有预编译处理功能,为程序的调试、移植提供方便,支持模块化程序设计。 本章介绍这些功能及进行程序开发的基本方法。 4.1 函数 C程序结构 无论涉及的问题是复杂还是简单,规模是大还是小,用C语言设计程序,任务只有一种,就是编写函数,至少要编写一个主函数main(),C程序的执行就是执行相应的main()函数。即从它的main()函数的第一个花括号开始,依次执行后面的语句,直到最后的花括号为止。其它函数只有在执行了main()函数的过程中被调用时才执行。 高级语言中“函数”的概念和数学中“函数”的概念不完全相同。英语单词function有“函数”和“功能”两种介绍,高级语言中的函数实际上是功能的意思。当要完成某一个功能时,就用一个函数去实现它。在程序设计时首先要考虑main()函数中的算法,当main()中需要使用某一功能时,就用一个具有该功能的函数表达式表示。这时的函数,我们只知道它具有什么功能,其它先不作处理。设计完main()的算法并检验无误后,这时开始考虑它所调用的函数。如果在库函数中能找到,就可直接使用,否则再动手设计这些函数。这种设计方法称为自顶向下、逐步细化的程序设计方法。这种方法设计出来的程序在功率高,程序层次分明、结构清晰。复杂程序的层次可从以下图形中看出: 许多大型软件系统包含了相当丰富的,可供从事某一领域工作人员选用,如一个高等学校的信息管理系统就包含了教务、科研、人事、财务,设备、图书、后勤、办公室等子系统。每一个子系统以可分为许多子子系统。 这种软件为了方便用户大都采用菜单(menu)方式,这种形式的软件,大家都用过。用户

汇编语言实验报告 模块化程序设计

汇编语言实验报告 Assembly Language Programming Lab Reports ______________________________________________________________________________ 班级:姓名:学号:实验日期: 学院:专业: 实验顺序:原创:___ 实验名称:模块化程序设计 实验分数:_______ 考评日期:________ 指导教师: ______________________________________________________________________________ 一.实验目的 1、掌握宏定义的相关内容。 (1)伪指令: MACRO,ENDM。 (2)掌握宏定义时的哑元,变元,&分割符的使用。变元可以是操作数,操作码,操作码的一部分和&联合使用,存储单元,字符串。 (3)掌握宏调用时的实元和宏的展开。 2.掌握宏运算 (1)&替换运算符 (2)<>传递运算符 (3)!转义运算符号 (4)%表达式运算符 (5);;宏注释符 3、其它宏功能 (1)宏标号LOCAL (2)宏删除purge (3)宏嵌套,宏展开中的数字1代表插入的程序是宏定义实体中的。宏嵌套在展开时里层被嵌套调用的宏会显示嵌套调用的层次,待验证。 (4)宏库的建立和调用 4、结构伪操作 (1)结构定义 结构名 STRUG 结构体 结构名 ENDS (2)结构预置 (3)结构引用 5、重复汇编和条件汇编。 6、多模块结构程序设计 (1)全局符号定义PUBLIC

(2)外部符号说明EXTRN (3)段属性与段组合 (4)参数传递 7、宏指令和子程序的区别 (1)工作方式的区别,在多次调用时,使用宏指令占用较大空间但速度较快。使用子程序占用空间小但执行时间长。 (2)参数传递的方便性。 (3)参数的多样性和灵活性,宏指令的实参数可以是常数,寄存器,内存变量,操作码或操作码的一部分,操作数的一部分等,子程序是不可以比拟的。 鉴于以上区别,编程时应该扬长避短地使用宏指令和子程序,通常宏指令被用在代码较短且参数较多的场合,子程序被用在代码较长的场合。 8、模块连接 (1)外部引用与全局符号说明 (2)使用公用数据段实现通信过程 段定义伪指令在定义组合类型时定义为COMMON类型,这样在连接时会把多个程序的同名数据段连接时重叠形成一个段,产生段覆盖。允许各模块使用不同的变量名,但是主模块和子模块的数据在定义这些变量上应当有对应的结构。 (3)使用寄存器或者堆栈实现过程通信。 ______________________________________________________________________________二.实验环境 操作系统:windows 8 编译程序:masm 5.0 ______________________________________________________________________________三.实验原理 1、宏库的建立和调用 2、多模块结构程序设计 _______________________________________________________________________ 四.实验步骤及结果分析 1、宏库的建立和调用 宏库的建立: ;8-1.mac input macro mov ah,01h int 21h endm output macro x mov dl,x

家具模块化设计方法实例分析(1).doc

家具模块化设计方法实例分析 1 前言 当前,消费者对家具的个性化需求日益凸显,如何满足这种需求已经成为越来越多家具企业发展的关键。要做到既符合现代机械化生产的发展主流,又节约成本,且能提高产品的市场竞争力。这确实为难了不少的家具企业。有一坐企业尝试通过从销售终端满足个性化, 但众多形态各异、尺寸繁多的家具定单从销售端传送至生产和设计部门,却带来了新的矛盾:设计任务艰巨、生产设计难排、产品质量难以保证,甚至由于部件尺寸的相近导致出错率增加、生产效率低下。 有一些敢于吃螃蟹的企业尝试从设计入手,通过标准零部件的设计、组合成新产品来满足这种个性化”的需求。但遗憾的是,这种做法并未带来预期的效果,单一的产品导致了销售客额和顾客满意率的下降。所以,如何实现产品的个性化?是从销售端,还是从设计与生产 端着手呢?这是家具企业必须根据企业现状做出回答的问题。定制是从销售端解决问题,而模块化设计是从设计端解决问题,旨在通过设计具有标准性和通用性的功能模块,达到组合成多样化的家具的目的。毫无疑问,模块化设计在家具业具有很大的发展潜力,它既能解决个性化需求的问题,还能做到低成本与高效率。 模块化设计属于方法学的范畴,在其他工业行业中已经得到了长足的发展。由于家具消费环塘和制造环境的变化,模块化设计以其特 有的优势,开始在家具行业尤其是办公家具中应用。而对于民用家具, 近年来个性化需求与家具企业的生产矛盾日益突出,有关模块化设计的探索才刚刚开始。鉴于国内尚无系统的家具模块化设计理论来指导企业的实践,本文着重以衣橱为例,详细具体地分析单个家具的非模块化设计过程,以进一步明确家具模块化设计的必要性和可操作性。 2 设计概念及设计方法 家具模块化设计指的是在对家具进行功能分析的基础上,划分并设计出一系列的家具功能模块,通过功能模块的选择与组合构成不同的家具,以满足市场多样化需求的设计方法。与传统的设计方法相比较,家具模块化设

模块化产品设计的一些思考和体会-王志华

模块化产品设计的一些思考和体会 一、产品开发工作的挑战 在剧烈变动的3C时代(客户Customer、竞争Compete和变化Change),要想赢得竞争的胜利,企业必须通过优化整个产品开发来缩短产品上市时间、提高产品质量、降低成本,同时还要不断通过研发创新来满足客户的变化需求。技术的飞速进步,引起产品越来越复杂,随着客户对教学产品个性化需求程度的增加,也导致产品定制化趋势越来越明显,企业必须创建数量庞大的产品系列来满足学校不断变化的需求。随着现代科技的发展,模块化已成为工程产品的主要发展趋势之一,作为标准化的新形式,模块化被视为实现产品多样化的主要途径。 二、模块化产品设计概念 1、模块的历史来源 模块并不是一个新的概念,早在20世纪初期的建筑行业中,将建筑按照功能分成可以自由组合的建筑单元的概念就已经存在,这时的建筑模块强调在几何尺寸上可以实现连接和互换。然后,模块被引入机械制造业,人们进一步将模块与物理产品的功能联系到了一起,模块具有了明确的功能定义特征、几何连接接口,以及功能输入、输出接口特征。 2、现代模块化的诞生 模块的演变过程是从单纯的几何结构单元,发展到集成功能单元,又演变成为非物理实体的载体,如知识和软件等。 1965年之前,计算机都是整机制造的,当时的设计是相互依赖的,之所以这样是因为计算机系统太复杂了。在这种复杂性灾难之下,不可能像现在这样按照某种标准,遵照通用化原则,设计具有兼容性的可以实现工业化大生产的产品,使得计算机在当时非常昂贵。 比如1944年在美国国防部的资助下,由J.Presper Eckert Jr 和W.Mauchly领导的小组在宾夕法尼亚大学建造了一台名为ENIAC(电子数字积分计算机Electronic Numerical Integrator And Calculator)的计算机。生产完全是在试错过程中进行,应用完全是实验性的。 1945年当ENIACt投入使用之后,设计者累积的知识使他们明白了如何建造一台性能更好的机器。他们把想象中的机器命名为ENVAC,并把计算机系统界定为一种“组合式”制品。标明其关键组成部分是基本存储器、控制单元、运算“器官”、输入/输出和辅助存储器(IBM360电脑)。 随着计算机软件技术的发展,模块的概念又被用到了非物理产品领域,在软件行业模块的概念被广泛的实践着,大型的软件系统(比如PTC公司的Windchill系统)的模块化趋势越来越明显。 3、模块设计的案例 平台化、模块化的产品战略已经有很多成功的案例在世界很多的著名公司中应用。日本索尼公司在20世纪80年代仅利用4个基础平台的Walkman产品,生产出250余种录音机随身听。这250种随身听无论在价位、功能和款式上都有很大的区别,可以满足用户的各种不同需求,但是这4个基础平台却存在着大量的重用模块。 “平台”概念最早由大众集团提出并实践,并在PQ34平台上获得了巨大的成功。PQ24,PQ25,PQ34,PQ35,PQ46,PL45,PQ2,PQ3。 P*4等。大众现在基本上已经逐渐放弃平台的概念,而采取更抽象的“模

C语言 实验三 模块化程序设计

实验三模块化程序设计 (3学时) 【实验目的】 1. 掌握一维数组和二维数组的定义、赋值和输入输出的方法。 2. 掌握字符数组和字符串函数的使用。 3. 掌握与数组有关的算法。 4. 掌握函数定义的方法。 5. 掌握函数实参与形参的传递方式。 6. 掌握函数的嵌套调用和递归调用的方法。 7. 了解全局变量和局部变量、动态变量、静态变量的概念和使用方法。 【实验内容】 任务1 数组的基本定义与应用 1. 定义一个10个元素的int数组a,输入10个数,并输出。 参考程序: main() {int i,a[10]; for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++) printf("%5d",a[i]); printf("\n"); } 运行结果: 2. 寻找整数数组num中的最大值及其所在的下标。 参考程序:main() {int i,max,p,a[10]; printf("please enter 10 data:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); max=a[0];p=0; for(i=1;i<10;i++) 淮南师范学院电气信息工程学院 1

if(a[i]>max) {max=a[i];p=i;} printf("max is:%d\n",max); printf("point is:%d\n",p+1); } 运行结果: 3. 实现对n个数的数列从小到大排序。(比较交换法、选择法、冒泡法) 参考程序:冒泡法 #include main() {int i,j,n,a[100];int temp;clrscr(); printf("enter the number:\n"); scanf("%d",&n); for(i=0;ia[j+1]) {temp=a[j];a[j]=a[j+1];a[j+1]=temp;} printf("\n output the sorted array\n"); for(i=0;i

家具模块化设计

技术:家具模块化设计方法实例分析 1前言 当前,消费者对家具的个性化需求日益凸显,如何满足这种需求已经成为越来越多家具企业发展的关键。要做到既符合现代机械化生产的发展主流,又节约成本,且能提高产品的市场竞争力。这确实为难了不少的家具企业。有一坐企业尝试通过从销售终端满足个性化,但众多形态各异、尺寸繁多的家具定单从销售端传送至生产和设计部门,却带来了新的矛盾:设计任务艰巨、生产设计难排、产品质量难以保证,甚至由于部件尺寸的相近导致出错率增加、生产效率低下。有一些敢于吃螃蟹的企业尝试从设计入手,通过标准零部件的设计、组合成新产品来满足这种“个性化”“的需求。但遗憾的是,这种做法并未带来预期的效果,单一的产品导致了销售客额和顾客满意率的下降。所以,如何实现产品的个性化?是从销售端,还是从设计与生产端着手呢?这是家具企业必须根据企业现状做出回答的问题。定制是从销售端解决问题,而模块化设计是从设计端解决问题,旨在通过设计具有标准性和通用性的功能模块,达到组合成多样化的家具的目的。毫无疑问,模块化设计在家具业具有很大的发展潜力,它既能解决个性化需求的问题,还能做到低成本与高效率。 模块化设计属于方法学的范畴,在其他工业行业中已经得到了长足的发展。由于家具消费环塘和制造环境的变化,模块化设计以其特有的优势,开始在家具行业尤其是办公家具中应用。而对于民用家具,近年来个性化需求与家具企业的生产矛盾日益突出,有关模块化设计的探索才刚刚开始。鉴于国内尚无系统的家具模块化设计理论来指导企业的实践,本文着重以衣橱为例,详细具体地分析单个家具的非模块化设计过程,以进一步明确家具模块化设计的必要性和可操作性。 2设计概念及设计方法 家具模块化设计指的是在对家具进行功能分析的基础上,划分并设计出一系列的家具功能模块,通过功能模块的选择与组合构成不同的家具,以满足市场多样化需求的设计方法。与传统的设计方法相比较,家具模块化设计呈现出许多新特征。首先,它是针对模块和家具产品系统的设计,既要设计模块,又要设计家具成品。其次,它以标准化、通用化的零部件快速组合成家具,能实现家具的多样化。模块化设计不同于标准化设计,标准化设计带来的是单一的产品,而模块化设计则不然,在设计之初就考虑模块可组合成产品的多样性。因此模块化设计是在标准化设计基础之上,实现产品多样化的一种方法。 根据家具模块化设计的概念,笔者提出从三个层次展开家具的模块化设计。第一层次是家具模块化总体设计。这个阶段主要是进行模块化系统的总体策划,确定模块化实施的范围。良好的模块化总体设计,是模块化设计得以实现的基础。第二层次是家具模块设计,这是模块化设计系统具体化的过程,是承上启下的环节。模块化设计的好坏,直接影响到模块化家具组合的最终效果。第三层次是家具模块化产品设计。这个阶段主要是选择模块,评价模块可能组合方式的合理性,然后根据消费者的需求组合成家具。从这三个层次可看出,家具模块化设计自上而下,从总到细,各个层次的设计环环相扣。 3设计实例

模块化产品开发的基本思路

●模块化产品开发的基本思路 ▲把产品族分解为模块,建立模块体系。不同模块组合构成柔性的、可变的、多样化的产品。 ▲实现“以不变(模块系列)应多变(用户需求)的产品开发模式。 ●系统分解为模块的基本原则 ▲以功能为核心、结合组装结构进行分解。 ▲系统通用要素的提取和分离,相似要素的简化、归并、统一,经典型化处理,形成模块。 ▲分解点的选择:高内聚,低耦合。 ?模块化产品开发模式 ●模块化设计的基本方法 ▲模块组合法: 新产品=不变部分(通用模块)+准通用部分(改型模块) +专用部分(新功能模块) ▲基本型派生法:研制一种基本型,通过变型(某些零部件的附加、替换、再加工),构成派生型产品,以满足不同需求。 ▲组合法+基本型派生法 ?标准化、模块化对企业的价值 ●现代模块化设计方法——“设计规则” ▲“设计规则”包含模块的三要素。 ——模块“结构规则”:又称“划分规则”。确定构成系统的模块的轮廓(界线),即系统是由哪些模块组成的,它们是怎样发挥作用的。这实际上就是,系统分解(为模块)的规则、或系统要素组合(为模块)的规则。 ——模块间“接口规则”:规定模块如何相互作用,模块间的位置安排、联系,如何交换信息。通过“接口规则”,固化模块间接口特征。 ——模块“评定规则”:即系统集成与检测的规则。它是模块接口的检验、测定“标准”,以保证系统集成质量。 ▲设计规则的价值:把“由上而下”的设计原则,具体化为确立设计规则。即系统设计之前需首先确定设计规则;突出了“接口”(界面)在模块体系建设中的作用。 ?模块化产品开发模式 ●模块化设计特点:与整体式设计方法有原则上的区别 ▲面向产品族:一种模块能通用于多种产品。 ——传统设计:面向某一具体产品; ——模块化设计:是面向整个产品族系统。 ▲三个设计层次: ——模块化系统总体设计。 ——模块系统设计。 ——模块化产品设计。 ▲由上而下设计: ——传统设计:由下而上着眼于功能设计、详细设计。 ——模块化设计:首先着眼于产品族系统分解,由上而下建立通用模块体系,最后由模块组合构成的产品。

第5章_模块化程序设计

第5章模块化程序设计 5.1 简答题 (1)指令“CALL EBX”采用了指令的什么寻址方式? 寄存器间接寻址 (2)为什么MASM要求使用proc定义子程序? (这个问题不好回答,是不是作者写错了?我猜测可能的原因:在汇编语言中,函数、子程序等都称为过程,所以使用proc定义子程序) (3)为什么特别强调为子程序加上必要的注释? 便于程序员调用时使用,而不必关注子程序的内部实现。 (4)参数传递的“传值”和“传址”有什么区别? 传值是传递参数的拷贝,传址是传递参数的地址 (5)子程序采用堆栈传递参数,为什么要特别注意堆栈平衡问题? 保证正确返回;释放传递参数占用的堆栈空间,避免多次调用可能导致的堆栈溢出(6)INCLUDE语句和INCLUDELIB有什么区别? INCLUDE语句包含的是文本文件、是源程序文件的一部分;INCLUDELIB语句包含的是子程序库文件 (7)什么是子程序库? 子程序库就是子程序模块的集合,其中存放着各子程序的名称、目标代码以及有关定位信息,便于子程序的管理和调用 (8)调用宏时没有为形参提供实参会怎样? 缺少的实参,形参会做“空”处理。 (9)宏定义体中的标号为什么要用local为指令声明? 为了避免宏展开后出现标示符不唯一的情况,定义为局部。 (10)条件汇编不成立的语句会出现在可执行文件中吗? 不会。 5.2 判断题 (1)过程定义proc是一条处理器指令。 错,proc是伪指令 (2)CALL指令的执行并不影响堆栈指针ESP。 错,要改变,因为返回地址要压入堆栈 (3)call指令本身不能包含子程序的参数。 对。 (4) call指令用在调用程序中,如果被调用程序中也有call指令,说明出现了嵌套。 对。 (5)子程序需要保护寄存器,包括保护传递入口参数和出口参数的通用寄存器。 错,不能保护传递出口参数的寄存器 (6)利用INCLUDE包含的源文件实际上只是源程序的一部分。 对 (7)宏调用与子程序调用一样都要使用CALL指令实现。 错,宏调用是通过宏展开实现的调用,不用CALL指令 (8)宏定义与子程序一样一般书写与主程序之后。

(实验六)模块化(函数)程序设计

实验六模块化(函数)程序设计 一、实验目的 ●了解并掌握函数的定义方法 ●了解并掌握函数的调用方法 ●了解并掌握函数参数的单向传递 ●了解并掌握函数的递归调用 二、实验环境 ●个人计算机一台,PIII500(或同等性能)以上CPU,128MB以上内存,500MB以 上硬盘剩余空间。 ●Windows2000、Windows XP或Win 7操作系统 ●Code::Blocks(版本12.11或近似版本,英文版) 三、实验内容 1. 课本习题 完成课本P197第3题。 /*example-22.c*/ 2. 年龄谜题 有5个人坐在一起,问第5个人多少岁?他说比第4个大2岁。问第4个人多少岁?他说比第3个大2岁。问第3个人多少岁?他说比第2个大2岁。问第2个人多少岁?他说比第1个大2岁。最后问第一个人,他说是10岁。请问第5个人有多大? 编写一函数fun来用递归调用来计算第5个人的岁数,并在main函数中调用它。 /*example-23.c*/ 3. 课本习题

完成课本P197第1题。 例如:输入两个整数319和377,两者的最大公约数为29,两者的最小公倍数为4147。 /*example-24.c*/ 【解题提示】 两个整数a与b(a>b)的最大公约数gcd(a, b)可用辗转相除法来求得: 若a%b=0,则gcd(a, b)=b;若a%b=r≠0,则gcd(a, b)=gcd(b, r),即a与b的最大公约数等于b与r的最大公约数。把b赋给a,把r赋给b,获得新的a和b,继续这个过程。一定有一个时刻,b的值会为0,此时a即为原来的a和b的最大公约数。 用公式表示如下:gcd(a, b)=gcd(b, r1)=gcd(r1, r2)=gcd(r2, r3)...=gcd(r n-1, r n),当r n=0,r n-1即为a和b的最大公约数。(a%b=r1,b%r1=r2,r1%r2=r3…r i%r i+1=r i+2) 两个整数a与b的最小公倍数lcm=a*b/gcd(a, b),即为a和b的乘积除以两者的最大公约数。 4. 结构体数据在函数之间的传递 将下列程序补充完整,练习结构体变量作为函数参数和函数返回值的方法。 在主函数中定义结构体变量s,并将其成员的初值赋为1、1.0和"example_1";在子函数fun()中,将三个成员的值分别改为20、2.0和"example_2",再传回到主函数中赋给s。程序的输出为:20, 2.000000, example_2。 /*example-25.c*/ #include "stdio.h" #include "string.h" typedef struct st { int a; float b; char c[20]; } ST; fun( ) { } int main() { s = {10, 1.0, "example1"}; printf("%d, %f, %s\n", s.a, s.b, s.c); return 0; }

相关文档
最新文档