計(jì)算機(jī)本科C語言第八章補(bǔ)充講.ppt
《計(jì)算機(jī)本科C語言第八章補(bǔ)充講.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《計(jì)算機(jī)本科C語言第八章補(bǔ)充講.ppt(28頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
一 程序運(yùn)行時(shí)的內(nèi)存分布 當(dāng)一個(gè)程序被啟動(dòng)運(yùn)行時(shí) 操作系統(tǒng)會(huì)給程序分配一塊內(nèi)存空間 這塊內(nèi)存空間用于存放程序運(yùn)行過程中的數(shù)據(jù) 包括程序的執(zhí)行代碼 程序中定義的常量和變量等 根據(jù)存放內(nèi)容的不同 這塊內(nèi)存可以分為四個(gè)區(qū)域 程序代碼區(qū) 全局?jǐn)?shù)據(jù)區(qū) 堆 棧 程序支配的 例 include includeintg voidmain intlocal int p p int malloc sizeof int p 3 scanf d d 二 函數(shù)調(diào)用的實(shí)現(xiàn)機(jī)制1 棧 是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu) 在內(nèi)存中棧的操作是最先放到棧中的內(nèi)容最后才釋放 而最后進(jìn)棧的內(nèi)容最先釋放 操作系統(tǒng) 函數(shù)main 函數(shù)a 函數(shù)b 一個(gè)函數(shù)總要等它調(diào)用的函數(shù)執(zhí)行完之后才能結(jié)束 所以函數(shù)的調(diào)用和返回遵循的規(guī)律也是后進(jìn)先出 后調(diào)用先結(jié)束 函數(shù)c 2 函數(shù)調(diào)用實(shí)現(xiàn)機(jī)制例 棧voidc voidb c voida b main a 上面程序運(yùn)行過程中棧的變化 1 開始為空 2 系統(tǒng)調(diào)用主函數(shù) 則棧中為主函數(shù)的運(yùn)行開辟一塊空間 存放操作系統(tǒng)的運(yùn)行狀態(tài) 返回地址 主函數(shù)的形參和局部變量 main 開始運(yùn)行 3 主函數(shù)調(diào)用a函數(shù) 則在存放主函數(shù)的??臻g上再為a 申請一塊空間 存放main 的運(yùn)行狀態(tài) 返回地址和a函數(shù)的局部變量 a 開始運(yùn)行 4 a 運(yùn)行過程中調(diào)用b 則又在棧中申請一塊空間 存放a 的運(yùn)行狀態(tài) 返回地址 b 的參數(shù)和局部變量 b 開始運(yùn)行 5 b 運(yùn)行過程中調(diào)用c 則又在棧中申請一塊空間 存放c 的運(yùn)行狀態(tài) 返回地址 c 的參數(shù)和局部變量 c 開始運(yùn)行 6 函數(shù)c 運(yùn)行結(jié)束 根據(jù)棧頂存放的主調(diào)函數(shù)的運(yùn)行狀態(tài)和返回地址 程序返回到b 的調(diào)用處繼續(xù)執(zhí)行 同時(shí)釋放c 所申請到的??臻g 7 依次類推 棧隨著程序的運(yùn)行不斷地發(fā)生變化 當(dāng)main 執(zhí)行結(jié)束時(shí) 就返回到操作系統(tǒng) 棧空間完全釋放 回到開始的空閑狀態(tài) 從上面的示意圖中可看出 1函數(shù)的調(diào)用和返回遵循的規(guī)律也是后進(jìn)先出 后調(diào)用先結(jié)束 2每進(jìn)行一次函數(shù)調(diào)用 系統(tǒng)都要進(jìn)行如下操作 1 建立被調(diào)用函數(shù)的??臻g2 保存調(diào)用函數(shù)的運(yùn)行狀態(tài)和返回地址3 將實(shí)參的值傳遞給被調(diào)用函數(shù)4 將程序控制權(quán)交給被調(diào)用函數(shù)3當(dāng)一個(gè)函數(shù)執(zhí)行結(jié)束之后 系統(tǒng)又要完成以下操作 1 如果函數(shù)有返回值 將返回值放到一個(gè)臨時(shí)的變量空間2 根據(jù)棧頂記錄的信息 恢復(fù)調(diào)用函數(shù)的運(yùn)行狀態(tài)3 釋放該函數(shù)棧頂空間4 根據(jù)主調(diào)函數(shù)的返回地址 繼續(xù)主調(diào)函數(shù)的運(yùn)行 main intn floaty printf nInputanumberplease scanf d 例10用遞歸方法求階乘 棧內(nèi)存空間 注意 1 雖然每個(gè)函數(shù)的信息都存放在棧中間 但是棧空間是由系統(tǒng)管理的 函數(shù)之間并不能互相訪問局部變量 2 內(nèi)存空間是有限的 ??臻g是有限的 每次進(jìn)行函數(shù)調(diào)用 都會(huì)花費(fèi)一定的棧內(nèi)存空間 如果設(shè)計(jì)的程序 不斷地進(jìn)行函數(shù)調(diào)用 最終會(huì)因?yàn)闂?臻g不夠而導(dǎo)致程序運(yùn)行出錯(cuò) 同樣堆空間也是有限的 程序也不能無限制地動(dòng)態(tài)申請空間 因此 在不再需要所申請的內(nèi)存空間時(shí) 及時(shí)釋放它們 所以設(shè)計(jì)程序時(shí)要確保內(nèi)存的有效利用 第七章編程題一家公司有4名銷售員 1 4 他們銷售5種不同的產(chǎn)品 1 5 每名銷售員在表格中記錄每種售出的產(chǎn)品 每份表格應(yīng)包含以下信息 銷售員的編號(hào)產(chǎn)品號(hào)當(dāng)天所售產(chǎn)品的總金額 includemain intt1 t2 分別代表銷售員的號(hào)碼和商品號(hào)碼 inti k 用來作計(jì)數(shù)器 floatcount 4 5 0 0 用來求4位銷售員每種商品的銷售額 floatsum 4 0 0 用來求出每個(gè)銷售員的銷售總額 while 1 printf 請輸入每名銷售員的號(hào)碼 while 1 保證輸入的銷售員的號(hào)碼1 4和 1 scanf d printf 12345Total n 先輸出提示 for i 0 i 3 i 循環(huán)四次 每行輸出銷售員號(hào)碼和各種商品銷售額和總額 printf 3d i 1 for k 0 k 4 k printf 2f count i k printf 2f sum i printf n 2通過循環(huán)按行順序?yàn)橐粋€(gè)5 5的二維數(shù)組a賦1 25的自然數(shù) 然后輸出該數(shù)組的左下半三角 試編程 打印出來的是紅色字體的內(nèi)容 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從鍵盤輸入兩個(gè)字符串a(chǎn)和b 要求不用庫函數(shù)strcat把串b的前五個(gè)字符連接到串a(chǎn)中 如果b的長度小于5 則把b的所有元素都連接到a中 試編程 include defineN20 defineMN 20main chara M b N intt 0 m 0 m用來求出a數(shù)組中的有效字符個(gè)數(shù) printf 請輸入兩個(gè)字符串分別存儲(chǔ)于a和b數(shù)組中 n gets a gets b while a m 0 m while t 4 添加五個(gè)字符則需循環(huán)五次 if b t 0 break 不足五個(gè)字符則循環(huán)終止 a m t b t t a m t 0 puts a 7 2用選擇法對10個(gè)整數(shù)排序 includemain inta 10 inti j t i j用來作循環(huán)變量 t用來作中間變量 inttemp 用來作中間變量 對兩個(gè)元素起交換作用 printf 給數(shù)組中的十個(gè)元素賦值 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已有一個(gè)已排好序的數(shù)組 今輸入一個(gè)數(shù) 要求按原來排序的規(guī)律將它插入數(shù)組中 include defineN11main inta N t number number用來接受從終端輸入的數(shù)字 for t 0 ta t 1 a t number 要插入的數(shù)字是最大的 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將一個(gè)數(shù)組中的值按逆序存放 include defineN10main inta N i k i用來作計(jì)數(shù)器 k的值 inttemp for i 0 i N i scanf d 8 4寫一函數(shù) 使給定的一個(gè)二維數(shù)組3 3轉(zhuǎn)置 即行列轉(zhuǎn)換 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寫一函數(shù) 將兩個(gè)字符串連接 include defineM40 defineN20voidstringcat chara M b N inti 0 m 0 i和t作循環(huán)變量 m用來求a數(shù)組有效字符的個(gè)數(shù) printf 請輸入兩個(gè)字符串賦給字符數(shù)組 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寫一函數(shù) 輸入一個(gè)四位數(shù) 要求輸出這4個(gè)數(shù)字字符 但每個(gè)數(shù)字間空一個(gè)空格 includevoidcount intn s 4 i 0 printf 請輸入一個(gè)四位數(shù) while 1 scanf d voidmain count 8 16寫一函數(shù) 輸入一個(gè)十六進(jìn)制數(shù) 輸出相應(yīng)的十進(jìn)制數(shù) 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用遞歸法將一個(gè)整數(shù)N轉(zhuǎn)換成字符串 例如 輸入483 就輸出字符串 483 N的位數(shù)是不確定的 可以是任意的整數(shù) includevoidconvert intn inti if i n 10 0 convert i putchar n 10 0 voidmain intnumber printf 請從終端輸入一個(gè)整數(shù) scanf d 8 18給出年 月 日 計(jì)算該日是該年的第N天 includeintleap intyear if year 4 0- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 計(jì)算機(jī) 本科 語言 第八 補(bǔ)充
鏈接地址:http://m.szxfmmzy.com/p-6272571.html