找回密码
 立即注册

微信扫码登录

使用验证码登录

搜索
查看: 82|回复: 0

16.第16节课第七章用函数实现模块化程序设计

[复制链接]

6476

主题

3

回帖

1万

积分

管理员

积分
19556
发表于 2024-4-15 08:49:35 | 显示全部楼层 |阅读模式
好吧,我们再来看一下一维数组呢,做函一维数组名做函数参数有两个班级,分别有35和30名学生。调用average函数分别求这两个班的学生的平均成绩,我们用数组名做函数实参时。不是把数组元素的值啊,传递给形参,而是把实参数组的首元素的地址呢传递给形参数组。这样两个数组了,就共占用一段内存单元,我们来看一下这样一个程序。井号includes dd inh标准的输入,输出库函数头文件编译出来,把它包含在我们的程序当中。

int May float average float every in tn。这个我们的函数呢?有两个参数,一个呢?是我们的数组,一个呢?是我们的整型变量。float score five九十五点五这样一个后面的这样一个数值定义长度为五的数组float score 2 ten,那么后面的定义长度为十的数组。定义长度呢为十的数组这样一个部分,那么接下来present the average of class a is。printf the average of the class bis,这是我们的用时参名school 1和五,做时参用数组名school 2和十,做时参。

那么,我们的这样一个调用的函数呢?是我们的average score 15和average score 20。那么我们看一下我们定义的这样一个函数部分float average float average in tan定义average函数未指定行参数组长度。in tn float average sun=I零零float I=1 I小于ni加加sun=sun+error,然后呢r=sun÷n retell error。这是我们的。调用函数的这样一个部分,那么这是我们一维数组名呢?作为函数参数,它的这样一个使用的这样一个方式。我们来看一下一维数组名,做函数参数,用选择法对数组中的十个整数按由小到大的顺序呢排序。那么,

我们解题的思路呢?所谓的选择法呢?这里我们讲一下所谓的选择法是将十个数中。最小的数与a0兑换,再将a1到a9中最小的数呢?与a1兑换那么依次呢?比较比较下去。每比较一轮找出一个未经排序的数中最小的一个,共比较九轮,那么我们看一下它的这样一个排序的,这样一个方式。首先呢,就是我们未排序的这样一个情况,第一次排序呢,将五个数中最小的一个数呢一与a0兑换。

把它放在一放在a0的这样一个部分。第二次呢,是将余下的四个数中最小的数三与a1兑换将它。与a1兑换,将它放在我们的a1这样一个部分,接下来呢,将余下三个数中最小的数呢,与a2兑换。那么就是四呢,与a2对换。那么就是四月a2兑换,将它放在我们的a2当中,那么最后呢?接下来呢?将余下两个数中的六呢?

与a3兑换,将它放在我们的a3当中。那么这样呢,就完成了这样,就这样进行排,这样进行排序,我们来看一下这个排序的这样一个程序。int main void sort error in terror.intni nta 10 i printf enter error for I=0 I小于10I加加。scan f百分号d这样一个符号AI垂AI的地址,那么将我们输入的数组呢数据呢?放在我们的这样一个数组元素当中。sorta 10调用sort函数a为数组名大小为10 printf the sorted error。for I=0 I小于10I加加printf。百分号dai。

printf反斜杠n retarding函数结束程序结束,我们来看一下我们定义的这样一个函数w的sort in terror in tn in tij kt。for I=0初始条件I小于n- 1,这是我们循环的条件表达式,它的这样一个判断条件I加加,这是我们的这样一个条件的变量的,这样一个改变方式,它的一个增量。部分k=I for。I for j=I+1,这是我们循环的初始条件。j小于n,这是我们循环条件表达式,是我们的判断条件。g加加就是我们变量的改变方式,

它的一个增量if ever j小于every k。那么k=g。t=every k。every k=every I,every I=t,那么这是我们进行交换的部分。那么,这是我们排序的这样一个选择。排序的这样一个方式。那么,我们可以看到了,在执行函数调用语句sorta时候呢?之前和之后a数组元素中,各元素的值是不同的。原来是无序的执行sorta时候呢a数组呢,

已经排好序了,这是由于形参数组error了一用选择法进行排序。形参数组改变呢,也使实参数组呢。随之改变。啊,这是我们选择排序的这样一个方式。那么我们看一下程序运行的结果,那么我们输入了这样一些数,然后这是我们输出的,按照一个由小到大的顺序来输出的这样一个部分。那么多维数组名呢?作为函数参数,那么我们可以用多维数组名作为函数的实参和形参,在被调用的函数中呢?

对形参数组定义时呢,可以指定每一位的大小,也可以省略某一位的大小说明,比如说我们定义in terror 30,也可以定义了error一个方框十,那么它是一样的。那么,我们不能定义了两error,两个方框或者error 3方框,那么必须指定列数在定义二维数组时呢?必须指定列数这一行中呢?包含几个元素,由于形参数组呢?与实参数组。类型相同,

所以它们是由具有相同长度的一维数组所组成的,组成的,所以不能呢。只指定一维行数,而审阅二维列数。在第二维大小相同的前提下,形参数组的第一位可以与实参数组不同。例如时参数组呢,定义为int score 50,而形参数组呢,可以定义为in terror。方括号十或者error 80都可以,这是形参数组和实参数组了,都是用相同类型的大小的一维数组组成的。那么C语言编译系统呢?

不检查第一位的大小。那么,我们来看一下多维数组名呢?做函数参数有一个三×4的矩阵,求出所有元素中的最大值。那么我们看一下这个程序引号includes gd二点hinter minter max value inter error方括方括号四,这是函数的声明。接下来进行一个整形数组,整二整形,二维整形数组的这样一个定义inta三四,那么这样一个后面的值的部分对数组元素呢?赋初值。printf max value is百分号d方写个n max value,a max value a呢为函数调用retarding函数结程序结束。我们来看一下函数定义的部分int max value in terror方括号4 in tig max four error零零。

for I=0 I小于3I加加for j=0 j小于4j加加if error ij大于max max呢等于error ij把大的这样一个数呢放在max中。最后呢,return max返回我们的max,返回max。这样一个值我们形那么这样呢,我们就求出了所有元素当中的这样一个最大值形参数组了ever第一位的大小审阅,第二位的大小不能审阅。而且要和行时参数组的第二维的大小相同,在主函数中呢,调用max value函数时呢,把时参二维数组a的第一行的起始地址呢,传递给行参数组error。因此error数组的第一行的起始地址呢?与error数组的第一与a数组的第一行的起始地址相同,由于两个数组的列数相同,

因此error数组的第二行的起始地址与a数组的第二行。起始地址相同aij与aij同占一个存储单元,它们具有同一个值,实际上呢,aij就是aij,因此在函数中呢,对aij的操作aij的操作呢?就是对。aig的。这样一个。操作那么我们再看一下局部变量和全局变量,每一个变量呢,都有一个作用域的问题,就它们在什么范围内有效变量定义了,可以有三种情况在函数的开头定义。

在函数的复合语句类定义在函数的外部定义在一个函数内部定义的变量呢?只在本函数范围内有效,也就是说只有在本函数内才能引用它们。此在此函数外的是不能使用这些变量的,在复合语句内定义的变量呢,只能在本复合语句内使用有效,在本复合语句外内了才能引用它们。该复合语句外的是不能引用这些变量的,以上这些变量呢,称为局部变量,这是我们局部变量的这样一个部分。我们的全局变量是什么呢?程序的编译单位是原程序文件,一个源文件呢?可以包含一个或若干个函数,

在函数内定义的变量呢?是全局部变量。而在函数为外地的变量呢?称为外部变量,外部变量呢?是全局变量,也称为全程变量。全程变量呢,可以作为本文件中其他函数所共用它的有效范围呢,从定义变量的位置呢,到本文件本源文件结束。也就是说,在函数内定义的变量呢,是局部变量,而在函数外定义的变量呢,

是全局变量。那么,我们建议了不在不要不在必要时。不要使用全局变量,因为全局变量呢,在程序的全部执行过程中呢,都占用存储单元,而不是仅在需要时呢,才开辟单元。那么,它使函数的通用性降低了,如果在函数中引用了全局变量,那么执行情况会受到外部变量的影响。如果将一个函数呢,移植到另一个文件中,

还要考虑把有关变量的起值。一起移过去,但若该外部变量呢?与其文件呢?变得相同时,那么就会出现问题,那么就降低了程序的可靠性和通用性在。在程序设计中,要划分模块时呢?要求。模块的内聚性强,与其他模块的偶合性弱,建模块的功能要单一,不要把许多互不相干的功能放在一个模块中,与其他的模块的相互影响要较小,

而用全局变量的不符合这个。规则一般要求呢,把c程序中的函数呢,作为一个相对的封闭期,除了可以通过形参实参的渠道与外界发生联系外,没有其他渠道,这样的程序一致性好,可读性强。使用全局变量过多,会使程序的清晰性降低,人们往往呢,难以清楚的判断每个顺序,某个外部变量的值。由于在各个函数之间使了都可能改变外部变量值,程序容易。

出错,因此呢,要限制使用全局变量。那么,接下来我们看一下。变量的存储方式与生存期那么动态存储方式呢?与静态存储方式从变量的值存在的时间来观察,有的变量呢?在程序运行的整个过程中呢?都是存在的。而有的变量呢,则在调用其所在函数时呢,才临时分配存储单元。而在函数调用结束后呢,该存储单元就马上释放了变量,

不存在了。也就是说,变量的存储呢,有两种不同的方式,静态存储方式和动态存储方式。静态存储方式呢,是指在程序运行期间,由系统分配固定存储空间的方式。动态存储方式呢,则是在程序运行期间。根据需要进行动态的分配,存储空间的方式,我们来看一下比较一下动态存储方式与静态存储方式。数据呢,分别放在静态存储区和动态存储区中,

全局变量呢,全部存放在静态存储区中,在存储开始执行时呢,给全局变量分配存储区。程序实行完毕,就释放在程序执行过程中呢,他们占据固定的存储单元,而不是固定的,动态的分配和释放。在动态存储区中呢,存放这样一些数据,比如说函数形式,参数,在调用函数时呢,给形参分配存储空间,

在函数中定义时没有使用关键字。tick生命的函数就自动变量函数调用时,现场保护和返回地址等,那么这些呢,都存放在动态存储区中。对于以上这些数据呢,在函数调用开始时,分配动态存储空间。函数结束时呢,释放这些存储空间,在程序执行的过程中,这些动态和。分配了是释放了,是动态的,如果在一个程序中呢,

两次调用同一函数,在此函数中呢,定义了局部变量。也在两次调用时呢,分配给这些局部变量的存储空间的地址呢,可能是不相同的,如果一个程序中呢,包含若干函数,每个函数的局部变量的生存期呢,并不等于整个程序的执行周期。它只是程序执行周期的一部分,在程序执行过程中呢,先后调用各个函数,此时会动态的和分。动态的分配和释放存储空间,

在C语言中每个变量和函数呢,都有两个属性,数据类型和数据的存储类别。存储类别指的是数据在内存中的存储方式,比如说动态存储和静态存储,在定义和声明。变量和函数时应该一般应同时指定其数据类型和存储类别,也可以采用默认方式指定。如果用户不指定呢,系统会隐含的指定为某一种存储类别。c的存储类别呢,包括四种altar stairs d stairs tis。register.extern就是自动静态寄存器,外部根据变量的存储类别呢,

可以知道变量的作用域和生存期。函数中的局部变量,如果不专门声明为s静态存储类别都是动态的分配存储空间数据,存储在动态存储区中。此时函数的形参和函数中定义的局部变量呢,包括在复合语句中定义的局部变量都是这样一个情况。在调用该函数时呢。系统会给这些变量的配存储空间在函数调用结束时呢,就自动释放这些存储空间,因此呢,这类局部变量呢,称为自动变量。自动变量呢,用alt做存储类别的声明,那么实际上呢?

关键字alt可以省略不写。alt则指定为隐含的自动存储类别,它属于动态存储方式。程序中呢,大多数变量呢,属于自动变量。有时候呢,希望函数的局部变量的值呢,在函数调用结束后呢,不消失而继续保留原值,既占用的存储空间呢,不释放。在下一次调用时呢?该函数时呢?该变量已有值,

就是上一次函数调用结束时的值,这时就应该指定该局部变量为静态,局部变量用关键字static进行声明。静态局部变量呢,属于静态存储类别。在静态存储区中呢,分配存储单元在程序整个运行期间呢,都不释放。而自动变量呢,就动态局部变量呢,属于动态存储类别。分配在动态存储区空间,而不在静态存储区空间函数调用结束后呢,即释放对静态局部变量呢,是在编译时赋初值了。

只借只付出值一次,在程序运行时呢,它已有初值,以后每次调用函数时不再重新赋初值,而是保留上次函数使用学术时的值。而对自动变量赋初值呢,不是在编译时进行,而是在函数调用时进行。每调用一次函数呢,赋给一次初值,相当于执行一次赋值语句。定义局部变量时呢,如果不赋初值的话,对静态局部变量来说,系统自动赋初值零或者空字符。

对动自动变量来说,它的值是一个不确定的值,这是由于每次调用函数时呢,存储单元已释放,下次调用时又重新分配存储单元。而所分配的单元中的内容是不可知的,虽然静态局部变量呢,在调用函数时仍然存在其他函数呢,是不能引用的,因为它是局部变量,只能被本函数引用,而不能被其他函数使用。全局变量呢,是存放在静态存储区中的,因此它们的生存区是固定的,

存在于整个的程序的运行过程。一般来说,外部变量呢,是在函数定外部定义的局部变量,它的作用域呢,从变量的定义数开始,到本程序文件的末尾。在此作用域中呢,全局变量呢,可以为程序中的各个函数所引用,但有时程序设计人员呢,希望能扩展外部变量的作用域。如果外部变量呢,不在文件的开头定义其有效的作用范围呢,只限定于定义的文件结束,

在定义点之前的函数呢,不能引用该局部变量,该外部变量。但由于某种考虑在定义点之前的函数呢,需要启用该外部变量则应该在引用该关键字的extern。对该变量做外部变量,声明表示,把该外部变量的作用力呢,就扩展到了此处。有了此声明,就可以从声明处开始了合法的启动该变量。比如说我们定义了一个外部变量ABC,那么我们要把外部变量ABC的作用域呢?扩展到我们这样一个。另外的这样一个运用的部借,

另外的这样一个部分,我们就可以了,使用这样一个声明的这样一个运用的这样一个方式。那么,这是我们在一个文件内呢,扩展外部变量的作用域。那么excel呢?既可以呢,用来扩展外部变量。在本文件中的作用域,又可以使外部变量的作用域呢?从一个文件扩展到程序中的其他。文件系统在编译过程中遇到extern的时候呢?先在。本文件中找外部变量的定义,

如果找到就在本文件议中呢,扩展作用域,如果找不到就在连接时呢,从其他文件中呢,找外部变量的定义,如果在其他文件中找到了就将作用域呢,扩展到本文件。如果再找不到,就按出错处理。那么有时呢?程序设计呢?希望某些变量呢?只被本文件引用,而不被其他文件引用,这时可以在定义外部变量时呢?

加一个static声明。那么,这种加上static声明呢?只能用于本文件的外部变量呢?称为静态外部变量,在程序设计中常由若干人的。分别完成各个模块,个人可以独立的在其设计的文件中呢,使用相同的外部变量名而互不相干,只需在每一个文件定义外部变量时呢,加上static。tick那么,这就为程序的模块化,通用性的提供方面,如果已确认其他文件呢?

不需要使用本文件的外部变量,就可以对本文件中的外部变量呢?都加上start tick。成为外静态外部变量。那么,至于在各文件的函数类定义的局部变量呢?就不能被函数外所使用,更不能被其他文件使用,那么因此呢?那么是那么就是可以的运用的这样一些部分。那么不要误,不那么对外部变量的了,申明后呢,才采取静态存储方式的话,不是这样的一个这样一个。

呃,我们并不是并不是这样一个使用的,这样一个使用的部分并不是呢,对外部变量加上static声明后呢,才采取静态存储方式,放在静态存储区中,而不加static呢是采用。动态存储方式,那么我们不是这样的,这样一个。执行了这样一个部分,那么并不是啊,对外部变量加上斯蒂尔图斯德尔提格声明后呢,才采取静态存储。方式也那么也不是而不加呢,

采取的是动态存储申明局部变量的存储类型和声明全局变量的类型是不同的,对于局部变量来说,声明存储类型的作用呢?是指定变量存储的区域。而声明存储类型的作用呢?是变量作用域的这样一个扩展问题。那么,对static声明一个变量的作用呢?是对局部变量使用static声明把它分配在静态存储区中。该变量呢?在整个存储区中呢?不释放所分配的空间呢?始终存在。对全局变量12这个声明呢?对该变量的作用域呢?

只限于本文件模块具备声明的文文件中。那么,用alt register和static森林变量的时候呢?是在定义变量的基础上呢?加上关键字,而不是单独使用。好同学们,今天我们讲过了,用函数实现模块化程序设计的这样一个方式,我们讲过了,递归的这样一个方式,以及呢,函数的这样一个作用,范围,作用域,

以它的生存期。那么,这样一些就它的这样一个运用的,这样一个形式,我们大家下来之后呢?大家看一下这些部分进行一个了解,和这样一个掌握那么好,我们今天的课呢?就讲到这里好,谢谢大家。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|5432考试网 ( 蜀ICP备2022024372号|川公网安备51152402000101号 )|网站地图

GMT+8, 2024-5-19 18:21 , Processed in 0.084998 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表