计算机本科C语言第八章补充讲.ppt

上传人:za****8 文档编号:6272571 上传时间:2020-02-21 格式:PPT 页数:28 大小:222KB
返回 下载 相关 举报
计算机本科C语言第八章补充讲.ppt_第1页
第1页 / 共28页
计算机本科C语言第八章补充讲.ppt_第2页
第2页 / 共28页
计算机本科C语言第八章补充讲.ppt_第3页
第3页 / 共28页
点击查看更多>>
资源描述
一 程序运行时的内存分布 当一个程序被启动运行时 操作系统会给程序分配一块内存空间 这块内存空间用于存放程序运行过程中的数据 包括程序的执行代码 程序中定义的常量和变量等 根据存放内容的不同 这块内存可以分为四个区域 程序代码区 全局数据区 堆 栈 程序支配的 例 include includeintg voidmain intlocal int p p int malloc sizeof int p 3 scanf d d 二 函数调用的实现机制1 栈 是一种后进先出的数据结构 在内存中栈的操作是最先放到栈中的内容最后才释放 而最后进栈的内容最先释放 操作系统 函数main 函数a 函数b 一个函数总要等它调用的函数执行完之后才能结束 所以函数的调用和返回遵循的规律也是后进先出 后调用先结束 函数c 2 函数调用实现机制例 栈voidc voidb c voida b main a 上面程序运行过程中栈的变化 1 开始为空 2 系统调用主函数 则栈中为主函数的运行开辟一块空间 存放操作系统的运行状态 返回地址 主函数的形参和局部变量 main 开始运行 3 主函数调用a函数 则在存放主函数的栈空间上再为a 申请一块空间 存放main 的运行状态 返回地址和a函数的局部变量 a 开始运行 4 a 运行过程中调用b 则又在栈中申请一块空间 存放a 的运行状态 返回地址 b 的参数和局部变量 b 开始运行 5 b 运行过程中调用c 则又在栈中申请一块空间 存放c 的运行状态 返回地址 c 的参数和局部变量 c 开始运行 6 函数c 运行结束 根据栈顶存放的主调函数的运行状态和返回地址 程序返回到b 的调用处继续执行 同时释放c 所申请到的栈空间 7 依次类推 栈随着程序的运行不断地发生变化 当main 执行结束时 就返回到操作系统 栈空间完全释放 回到开始的空闲状态 从上面的示意图中可看出 1函数的调用和返回遵循的规律也是后进先出 后调用先结束 2每进行一次函数调用 系统都要进行如下操作 1 建立被调用函数的栈空间2 保存调用函数的运行状态和返回地址3 将实参的值传递给被调用函数4 将程序控制权交给被调用函数3当一个函数执行结束之后 系统又要完成以下操作 1 如果函数有返回值 将返回值放到一个临时的变量空间2 根据栈顶记录的信息 恢复调用函数的运行状态3 释放该函数栈顶空间4 根据主调函数的返回地址 继续主调函数的运行 main intn floaty printf nInputanumberplease scanf d 例10用递归方法求阶乘 栈内存空间 注意 1 虽然每个函数的信息都存放在栈中间 但是栈空间是由系统管理的 函数之间并不能互相访问局部变量 2 内存空间是有限的 栈空间是有限的 每次进行函数调用 都会花费一定的栈内存空间 如果设计的程序 不断地进行函数调用 最终会因为栈空间不够而导致程序运行出错 同样堆空间也是有限的 程序也不能无限制地动态申请空间 因此 在不再需要所申请的内存空间时 及时释放它们 所以设计程序时要确保内存的有效利用 第七章编程题一家公司有4名销售员 1 4 他们销售5种不同的产品 1 5 每名销售员在表格中记录每种售出的产品 每份表格应包含以下信息 销售员的编号产品号当天所售产品的总金额 includemain intt1 t2 分别代表销售员的号码和商品号码 inti k 用来作计数器 floatcount 4 5 0 0 用来求4位销售员每种商品的销售额 floatsum 4 0 0 用来求出每个销售员的销售总额 while 1 printf 请输入每名销售员的号码 while 1 保证输入的销售员的号码1 4和 1 scanf d printf 12345Total n 先输出提示 for i 0 i 3 i 循环四次 每行输出销售员号码和各种商品销售额和总额 printf 3d i 1 for k 0 k 4 k printf 2f count i k printf 2f sum i printf n 2通过循环按行顺序为一个5 5的二维数组a赋1 25的自然数 然后输出该数组的左下半三角 试编程 打印出来的是红色字体的内容 12345678910111213141516171819202122232425 includemain intt1 t2 a 5 5 n 1 for t1 0 t1 4 t1 for t2 0 t2 4 t2 a t1 t2 n for t1 0 t1 4 t1 for t2 0 t2 t1 t2 printf 4d a t1 t2 putchar n 3从键盘输入两个字符串a和b 要求不用库函数strcat把串b的前五个字符连接到串a中 如果b的长度小于5 则把b的所有元素都连接到a中 试编程 include defineN20 defineMN 20main chara M b N intt 0 m 0 m用来求出a数组中的有效字符个数 printf 请输入两个字符串分别存储于a和b数组中 n gets a gets b while a m 0 m while t 4 添加五个字符则需循环五次 if b t 0 break 不足五个字符则循环终止 a m t b t t a m t 0 puts a 7 2用选择法对10个整数排序 includemain inta 10 inti j t i j用来作循环变量 t用来作中间变量 inttemp 用来作中间变量 对两个元素起交换作用 printf 给数组中的十个元素赋值 n for i 0 ia j t j if t i temp a i a i a t a t temp putchar n for i 0 i 9 i printf 3d a i 7 4已有一个已排好序的数组 今输入一个数 要求按原来排序的规律将它插入数组中 include defineN11main inta N t number number用来接受从终端输入的数字 for t 0 ta t 1 a t number 要插入的数字是最大的 elsefor i 0 i number t N 1 while t i a t a t 1 t a i number break for t 0 t N t printf 3d a t 7 5将一个数组中的值按逆序存放 include defineN10main inta N i k i用来作计数器 k的值 inttemp for i 0 i N i scanf d 8 4写一函数 使给定的一个二维数组3 3转置 即行列转换 includevoidf ints 3 3 inti k temp for i 0 i 2 i for k 0 k 2 k scanf d voidmain f 8 6写一函数 将两个字符串连接 include defineM40 defineN20voidstringcat chara M b N inti 0 m 0 i和t作循环变量 m用来求a数组有效字符的个数 printf 请输入两个字符串赋给字符数组 scanf s s a b while a m 0 m while b i 0 a m i b i i a m i 0 printf n s n a voidmain stringcat 8 8写一函数 输入一个四位数 要求输出这4个数字字符 但每个数字间空一个空格 includevoidcount intn s 4 i 0 printf 请输入一个四位数 while 1 scanf d voidmain count 8 16写一函数 输入一个十六进制数 输出相应的十进制数 include include defineN10voidcount inti 0 chars N c while 1 c getchar if c 0 i 0 while s i 0 if s i 0 8 17用递归法将一个整数N转换成字符串 例如 输入483 就输出字符串 483 N的位数是不确定的 可以是任意的整数 includevoidconvert intn inti if i n 10 0 convert i putchar n 10 0 voidmain intnumber printf 请从终端输入一个整数 scanf d 8 18给出年 月 日 计算该日是该年的第N天 includeintleap intyear if year 4 0
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!