




已阅读5页,还剩51页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020 2 23 计算机与信息工程分院 第8讲函数 2 数组函数和变量类型 主讲教师 刘莉E mail sjz lily Phone 88890692 C语言程序设计 2 主要内容 作业 C语言程序设计 3 1 数组作为函数参数 例8 1 返回主菜单 数组元素作函数实参数组名作函数参数用多维数组名作函数参数 数组元素就是变量 它与普通变量并无区别 因此它作为函数实参使用与普通变量是完全相同的 在发生函数调用时 把作为实参的数组元素的值传送给形参 实现单向的值传送 例8 2 例8 3 例8 4 例8 5 说明 C语言程序设计 4 例8 1数组元素作为函数实参举例说明 1 有两个数组a b 各有10个元素 将它们对应地逐个相比 即a 0 与b 0 比 如果a数组中的元素大于b数组中的相应元素的数目多于b数组中元素大于a数组中相应元素的数目 如a i b i 6次 b i a i 3次 其中i每次为不同的值 则认为a数组大于b数组 并分别统计出两个数组相应元素大于 等于 小于的次数 例8 1数组元素作为函数实参举例说明 2 main intlarge intx inty 函数说明 inta 10 b 10 i n 0 m 0 k 0 printf enterarraya n for i 0 ib i dtimes na i k printf arrayaislargerthanarrayb n elseif n K printf arrayaissmallerthanarrayb n elseprintf arrayaisequaltoarrayb n C语言程序设计 6 例8 1数组元素作为函数实参举例说明 3 large intx inty intflag if x y flag 1 elseif x y flag 1 elseflag 0 return flag 运行情况如下 enterarraya 1357986420enterarrayb 5389 1 35604a i b i 4timesa i b i 1timesa i b i 5timesarrayaissmallerthanarrayb C语言程序设计 7 例8 2数组名作函数参数举例说明1 有一个一维数组score 内放10个学生成绩 求平均成绩 floataverage floatarray 10 inti floataver sum 0 for i 0 i 10 i sum sum array i aver sum 10 return aver main floatscore 10 aver inti for i 0 i 10 i scanf f 运行情况如下 input10scores 100567898 576879967 57597averagescoreis83 4 C语言程序设计 8 例8 3数组名作函数参数举例说明2 对8 2的改写 即形参数组不指定大小 floataverage floatarray intn inti floataver sum 0 for i 0 i n i sum sum array i aver sum n return aver main floatscore 1 5 98 5 97 91 5 60 55 floatscore 2 10 67 5 89 5 99 69 5 77 89 5 76 5 54 60 99 5 printf theaverageofclassAis 6 2f n average score 1 5 printf theaverageofclassBis 6 2f n average score 2 10 运行结果 theaverageofclassAis80 40theaverageofclassBis78 20 C语言程序设计 9 说明 1 用数组名与用数组元素名作函数参数不同点 1 用数组元素作实参时 只要数组类型和函数的形参变量的类型一致 那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的 因此 并不要求函数的形参也是下标变量 换句话说 对数组元素的处理是按普通变量对待的 用数组名作函数参数时 则要求形参和相对应的实参都必须是类型相同的数组 都必须有明确的数组说明 当形参和实参二者不一致时 即会发生错误 C语言程序设计 10 说明 2 2 用普通变量或下标变量作函数参数时 形参变量和实参变量是由编译系统分配的两个不同的内存单元 在函数调用时发生的值传送是把实参变量的值赋予形参变量 用数组名作函数参数时 不是进行值的传送 即不是把实参数组的每一个元素的值都赋予形参数组的各个元素 因为实际上形参数组并不存在 编译系统不为形参数组分配内存 那么 数据的传送是如何实现的呢 我们曾介绍过 数组名就是数组的首地址 因此在数组名作函数参数时所进行的传送是地址传送 就是把实参数组的首地址赋予形参数组名 形参数组名取得该首地址之后 也就等于有了实在的数组 实际上形参数组和实参数组是同一数组 共同拥有一段内存空间 C语言程序设计 11 说明 3 上图说明了这种情形 图中设a为实参数组名 类型为整型 a占有以2000为首地址的一块内存区 b为形参数组名 当发生函数调用时 把实参数组a的首地址传送给形参数组名b 于是b也取得该地址2000 于是a b两数组共同占有以2000为首地址的一段连续内存单元 从图中还可以看出a和b下标相同的元素实际上也占相同的内存单元 既 a i 和b i 占用相同的内存单元 且a i b i C语言程序设计 12 例8 4数组名作函数参数举例说明3 1 用选择法对数组中十个整数进行由小到大排序 排序的算法如下 1 先从a 0 a 9 的十个整数中找出最小的数 与元素a 0 交换 2 接下来在从a 1 a 9 的九个整数中找出最小的数 与元素a 1 交换 依次类推 每一次比较 减少比较一个数 共比较九次 剩下最大的数留在a 9 C语言程序设计 13 例8 4数组名作函数参数举例说明3 2 以5个整数的排序为例 说明选择法的比较过程 C语言程序设计 14 例8 4数组名作函数参数举例说明3 3 voidsort intarray intn inti j k t for i 0 i n 1 i k i for j i 1 j n j if array j array k k j t array k array k array i array i t main inta 10 i printf enterthearray n for i 0 i n 1 i scanf d a i sort a 10 printf thesortedarray n for i 0 i 10 i printf d a i printf n C语言程序设计 15 用多维数组名作函数参数的说明 多维数组元素与一维数组元素一样 可以看作一个变量 所以在调用函数时可以作为实参 进行值的传递 用多维数组名作为函数参数传递的是数组首元素的地址 要求形参是相同类型的同维数组 这里 形参是二维数组时 第二维的大小 长度 必须指明 而第一维的大小 长度 可以指明 也可以不指明 如 intarray 3 10 或intarray 10 但以下表示是错误的 intarray intarray 3 C语言程序设计 16 例8 5用多维数组名作函数参数举例 1 求出3X4的矩阵 二维数组 中的最大元素 算法分析 先使变量max的初值为矩阵中第一元素的值 然后将矩阵中各个元素的值与max相比 每次比较后都把 大者 存放在max中 全部元素比较完后 max的值就是所有元素的最大值 C语言程序设计 17 例8 5用多维数组名作函数参数举例 2 max intarray 4 intn intI j max max a 0 0 for i 0 imax max array i j returnmax main inta 3 4 1 2 5 7 2 4 6 8 15 17 34 12 printf maxvalueis d n max a 3 运行结果为maxvalueis34 C语言程序设计 18 2 局部变量和全局变量 图示及说明 返回主菜单 局部变量在一个函数内部定义的变量是内部变量 只在本函数范围内有效 全局变量全局变量可以为本文件中其他函数所共用 其有效范围为从定义变量的位置开始到本源文件结束 说明 C语言程序设计 19 说明 1 局部变量只在定义函数的内部可访问 有效 2 不同的函数内部定义的变量可以取相同的名字 由于 1 的原因 访问它们时不会发生混淆 3 形式参数也是局部变量 4 在函数内部 可以在一复合语句中定义局部变量 这些局部变量只在该复合语句内部看见 有效 C语言程序设计 20 对于前四点的图形说明 main inta b a b是局部变量 只在整个主函数 main内部可见 有效 intc c是局部变量 只在复合语句内部 c a b 有效 可见 C语言程序设计 21 有关全局变量的图示说明 C语言程序设计 22 几点说明 1 设全局变量的作用 增加了函数间数据联系的渠道 文件中各个函数都能访问全局变量 被调函数可通过全局变量将结果告知主调函数 2 全局变量不应设置过多 以降低函数之间相互影响 符合现代模块化设计风格 3 若全局变量与局部变量同名 则在局部变量作用的范围内 局部变量有效 即局部变量起作用 例8 6 例8 7 C语言程序设计 23 例8 6全局变量使用举例 1 统计一个班级学生一门功课的平均成绩 找出最高分及最低分 floatMax 0 Min 0 Max Min是全局变量 floataverage floatarray intn inti floataver sum 0 Max Min array 0 for i 0 i n i sum array i if array i Max Max array i if array i Min Min array i aver sum n returnaver main floatav score 10 inti printf enterthearray n for i 0 i 10 i scanf f C语言程序设计 24 例8 6全局变量使用举例 2 运行结果 9945789710067 589926643max 100 00min 43 00average 77 65 函数average中与外界有联系的变量与外界的联系图 C语言程序设计 25 例8 7外部变量与内部变量同名举例 inta 3 b 5 a b为外部变量 max inta intb a b为局部变量 intc c a b a b return c main inta 8 a为局部变量 printf d max a b 形参a b作用范围 运行结果 8 C语言程序设计 26 3 变量的存储类型 1 3 1动态存储和静态存储方式3 2auto变量3 3用static声明局部变量3 4register变量3 5用extern声明外部变量3 6用static声明外部变量3 7关于变量的声明和定义3 8存储类别小结 C语言程序设计 27 3 变量的存储类型 2 3 1动态存储方式与静态存储方式 1 定义1 静态存储方式是指在程序运行期间分配固定的存储空间的方式 2 动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式 从内存中供用户使用的存储空间的情况来分析存储方式存储空间分为三部分 1 程序区2 静态存储区3 动态存储区 C语言程序设计 28 3 变量的存储类型 3 3 1动态存储方式与静态存储方式 2 供用户使用的内存空间可分为三个区域 1 程序区存放程序的机器码 2 数据存放在静态存储区和动态存储区 3 静态存储区存放全局变量和静态局部变量 4 动态存储区存放 自动局部变量形式参数函数调用时的被保护的返回地址 断点 和需保护的现场信息 C语言程序设计 29 3 变量的存储类型 4 3 2auto变量 1 1 变量和函数有两个属性 数据类型 存储类别 变量的存储类别指的是变量在内存中存放的方式 静态存储还是动态存储 分为4种auto static register extern 2 auto变量函数中的形参和在函数中定义的变量 都属于此类 在调用该函数时系统会给它们分配存储空间 在调用该函数结束时自动释放这些存储空间 例如 intf inta 定义f函数 a为形参 autointb c 3 定义b c为自动变量 C语言程序设计 30 3 变量的存储类型 5 3 2auto变量 2 实际上 关键字 auto 可以省略 则隐含确定为 自动存储类别 属于动态存储方式 例如 C语言程序设计 31 3 变量的存储类型 6 3 3用static声明局部变量 变量所在的函数在调用结束后 该变量所占用的存储单元不释放 在下一次该函数调用时 该变量已有值 就是上一次函数调用结束时的值 例题8 8考察静态局部变量的值说明例题8 9打印1到5的阶乘 C语言程序设计 32 3 变量的存储类型 7 3 4register变量 如果有一些变量使用频繁 则为存取变量的值要花不少时间 为提高执行效率 C语言允许将局部变量的值放在CPU中的寄存器中 需要用时直接从寄存器取出参加运算 不必再到内存中去存取 这种变量叫 寄存器变量 register 例8 10 说明 C语言程序设计 33 3 变量的存储类型 8 3 5用extern声明外部变量 外部变量 即全局变量 是在函数的外部定义的 它的作用域为从变量的定义处开始 到本程序文件的末尾 在此作用域内 全局变量可以为程序中各个函数所使用 编译时将外部变量分配在静态存储区 有时需要用extern来声明外部变量 以扩展外部变量的作用域 1 在一个文件内声明外部变量如果在定义点之前的函数要引用外部变量 则在引用前用关键字extern对该变量作 外部变量声明 2 在多个文件的程序中声明外部变量 例8 11 例8 12 C语言程序设计 34 3 变量的存储类型 9 3 6用static声明外部变量 有时在程序设计中希望某些外部变量只限于被本文件引用 而不被其他文件引用 这时可以在定义外部变量时加一个static声明 例如 注意 对外部变量加static并不意味着这时才是静态变量 存放在静态存储区中 而不加static的是动态存储 存放在动态存储区 两种形式的外部变量都是静态存储方式 只是作用范围不同 C语言程序设计 35 3 变量的存储类型 10 3 7关于变量声明和定义的说明 1 1 函数的声明和定义的区别对函数的声明是放在声明部分中的 而函数的定义是一个独立的模块 2 对变量的声明和定义A在声明部分出现的变量的两种情况第一种 需要建立存储空间 如 inta 第二种 不需要建立存储空间 如 externa B外部变量的定义和声明外部变量的定义只一次 位置在所有函数之外 而同一文件的声明可以有许多次 位置在函数内 外部变量的初始化只能在 定义 时进行 定义性说明 引用性说明 C语言程序设计 36 3 变量的存储类型 11 3 7关于变量声明和定义 2 C用static来声明一个变量的作用第一 对局部变量用static声明 则为该变量分配的空间在整个程序执行期间始终存在 第二 全局变量用static声明 则该变量的作用域只限于本文件模块 即被声明的文件中 C语言程序设计 37 3 变量的存储类型 12 3 8存储类别小结 返回主菜单 C语言程序设计 38 4 内部函数与外部函数 返回主菜单 根据函数能否被其他源文件调用 将函数区分为内部和外部函数 内部函数static类型标识符函数名 形参表 外部函数 1 在定义函数时 如果在函数首部的最左端冠以关键字extern 则表示此函数是外部函数 可供其他文件调用 2 在需要调用此函数的文件中 用extern声明所用的函数是外部函数 staticintfun inta intb externintfun inta intb 例8 13 C语言程序设计 39 例8 13用extern声明所用的函数 1 有一个字符串中存放若干字符 今输入一个字符 要求程序将该字符从字符串中删去 用外部函数实现 程序说明 在文件file1 c中定义主函数 主函数调用其它三个文件中定义的三个函数分别实现读入字符串 从一给定的字符串删去一个给定的字符 输出字符串的功能 C语言程序设计 40 例8 13用extern声明所用的函数 2 file1 c文件定义一个主函数 main externenter string char externdelete string char char externprint string char 以上3行声明在本函数中将要调用的在其他文件中定义的3个文件 charc str 80 enter string str scanf c c delete string str c print string str C语言程序设计 41 例8 13用extern声明所用的函数 3 file2 c文件定义函数 实现读入字符串 include stdio h externvoidenter string char s gets s 向字符数组输入字符串 file3 c文件定义函数 实现从字符串中删去一个 给定的字符 缺省extern的函数默认为外部函数 voiddelete string char s charch inti j for i j 0 s i i if s i ch s j s i s j 0 file4 c文件定义函数 实现输出字符串 voidprint string char s printf s s 运行情况 输入abcdefg输入c输出abdefg C语言程序设计 42 5 如何运行一个多文件的程序 用TurboC集成环境在MSC上运行编译连接用 include命令 返回主菜单 C语言程序设计 43 用TurboC集成环境 1 对运行例8 13程序举例 1 先后输入并编辑4个文件 并分别以文件名file1 c file2 c file3 c file4 c存储在磁盘上 2 在编译状态下 建立一个 项目文件 它不包括任何程序语句 而只包括组成程序的所有的文件名 即file1 c file2 c file3 c file4 c扩展名 c可以省略 4个文件顺序任意 可以连续写在同一行上 如这些源文件不在当前目录下 应指出路径 3 将以上内容存盘 文件名自定 但扩展名必须为 prj 在TurboC主菜单中选择Project菜单 按回车键后出现下拉菜单 找到其中的Projectname项并按回车键 在出现的对话框中输入项目文件名 C语言程序设计 44 用TurboC集成环境 2 4 按功能键F9 进行编译连接 系统先后将4个文件翻译成目标文件 并把它们连接成一个可执行文件a exe 5 按Ctrl F9键 即可运行可执行文件a exe C语言程序设计 45 用 include命令 将file2 c file3 c和file4 c包含到file1 c中 在file1 c中的开头加3行 include file2 c include file3 c include file4 c 在编译时 系统自动将3个文件放到main函数的前头 作为一个整体编译 C语言程序设计 46 作业 思考题变量的存储类别上机实验六 C语言程序设计 47 Theend C语言程序设计 48 说明 1 1 静态局部变量属于静态存储类别 在静态存储区内分配存储单元 在程序整个运行期间都不释放 而自动变量属于动态存储类别 占动态存储空间而不占静态存储区空间 函数调用结束即释放 2 对静态局部变量是在编译时赋初值的 以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值 而对自动变量赋初值 不是在编译时进行的 而是在函数调用时进行 每调用一次函数重新给一次初值 相当于执行一次赋值语句 3 如在定义局部变量时不赋初值的话 而对静态局部变量来说 编译时自动赋初值0 对数值型变量 或空字符 对字符变量 而对自动变量来说 如果不赋初值则它的值是一个不确定的值 这是因每次函数调用结束后存储单元已释放 下次调用时又重新另分配存储单元 而所分配的单元中的值是不确定的 C语言程序设计 49 说明 2 4 虽然静态局部变量在函数调用结束后还存在 但其他函数是不能引用它的 5 需要使用局部静态变量的情形 A需要保留函数上一次调用结束时的值 B如果初始化后 变量只被引用而不改变其值 则这时用静态变量比较方便 C语言程序设计 50 例8 8考察静态局部变量的值 1 f inta autob 0 staticc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (正式版)DB65∕T 4894-2025 《棉花苗期低温冷害等级》
- T-CIATCM 015-2019 骨伤科电子病历基本数据集
- (正式版)DB2327∕T 046-2020 《早熟鲜食马铃薯原种繁育技术规程》
- 淘宝课件运营
- 三年级思想品德下册 伸出温暖的手说课稿 首师大版
- 主题探究 畅想“地球2.0”教学设计初中地理中图版北京2024七年级上册-中图版北京2024
- 第五节 兔子的繁殖能力有多强-用递推法解决问题说课稿-2025-2026学年初中信息技术西交大版2014九年级上册-西交大版2014
- 生命安全 说课稿001
- Tat-IKIP-46-60-生命科学试剂-MCE
- Sumatriptan-Standard-生命科学试剂-MCE
- 内墙涂料分包施工合同
- 实验室装修工程设计书
- 2024-2025学年人教版八年级英语上册Unit 2 测试卷
- 退休人员出国探亲申请书
- 经阴道全子宫切除术专家共识(2024年版)解读
- 2024年新华东师大版七年级上册数学全册教案(新版教材)
- 《看图找关系》(教学设计)-2024-2025学年六年级上册数学北师大版
- 电商直播带货的营销策略手册
- (正式版)QC∕T 625-2024 汽车用涂镀层和化学处理层
- LYT 2241-2014 森林生态系统生物多样性监测与评估规范
- 2024年上海市中考语文试题卷(含答案)
评论
0/150
提交评论