版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C語言與程序設(shè)計
TheCProgrammingLanguage
第5章函數(shù)與程序結(jié)構(gòu)
華中科技大學(xué)計算機(jī)學(xué)院
盧萍2/2/20231華中科技大學(xué)計算機(jī)學(xué)院C語言課程組第5章函數(shù)與程序結(jié)構(gòu)
結(jié)構(gòu)化編程和C程序的一般結(jié)構(gòu)函數(shù)的機(jī)制,包括函數(shù)定義、函數(shù)聲明、函數(shù)調(diào)用、變量的存儲類型、參數(shù)數(shù)目可變的函數(shù)等。2/2/20232華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.1C程序的一般結(jié)構(gòu)5.1.1結(jié)構(gòu)化程序設(shè)計結(jié)構(gòu)化編程是一種解決問題的策略,它包括如下2條編程標(biāo)準(zhǔn):(1)程序中的控制流應(yīng)該盡可能簡單。(2)應(yīng)該自頂向下地設(shè)計程序結(jié)構(gòu)。自頂向下設(shè)計也稱為逐步細(xì)化,即把一個問題按功能分解為若干子問題,如果子問題還較復(fù)雜,可將其繼續(xù)分解,直到分解成為容易求解的子問題為止。分解而來的每個子問題被稱為模塊,C中提供的函數(shù)機(jī)制完成每個模塊的編程任務(wù),即用函數(shù)編寫由分解而來的子問題的代碼。2/2/20233華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.1.2蒙特卡羅模擬:猜數(shù)游戲模擬算法是最基本的算法,例如,編程實現(xiàn)拋硬幣、擲骰子和玩牌等現(xiàn)實世界中的隨機(jī)事件要用模擬算法。在程序設(shè)計中,可使用隨機(jī)數(shù)函數(shù)來模擬現(xiàn)實中不可預(yù)測情況,這稱為蒙特卡羅模擬。隨機(jī)數(shù)以其不確定性和偶然性等特點(diǎn)在很多地方都有具體的用處。比如,軟件測試中,用于產(chǎn)生具有普遍意義的測試數(shù)據(jù),在加密系統(tǒng)中產(chǎn)生密鑰,在網(wǎng)絡(luò)中生成驗證碼等。在C語言中,用rand函數(shù)生成隨機(jī)數(shù),該函數(shù)稱為隨機(jī)數(shù)發(fā)生器,該發(fā)生器從稱為種子(一個無符號整型數(shù))的初始值開始用確定的算法產(chǎn)生隨機(jī)數(shù)。顯然,通過種子產(chǎn)生第一個隨機(jī)數(shù)后,后續(xù)的隨機(jī)序列也就是確定的了,這種依靠計算機(jī)內(nèi)部算法產(chǎn)生的“隨機(jī)”數(shù)稱為偽隨機(jī)數(shù)。由此可見,隨機(jī)數(shù)的產(chǎn)生依賴于種子,為了使程序在反復(fù)運(yùn)行時能產(chǎn)生不同的隨機(jī)數(shù),必須改變這個種子的值,這稱為初始化隨機(jī)數(shù)發(fā)生器,由函數(shù)srand來實現(xiàn)。2/2/20234華中科技大學(xué)計算機(jī)學(xué)院C語言課程組【例5.1】編寫一個猜數(shù)的游戲程序在這個游戲中,計算機(jī)產(chǎn)生一個1到1000之間的隨機(jī)數(shù),并把該數(shù)作為要猜的數(shù)。玩游戲者輸入所猜的數(shù),如果猜得不正確,繼續(xù)猜直到正確為止,同時計算游戲者猜數(shù)的次數(shù)。為了幫助游戲者一步一步得到正確答案,程序會不斷地發(fā)出信息“Toohigh”或“Toolow”。最后,程序向游戲者顯示游戲結(jié)果。2/2/20235華中科技大學(xué)計算機(jī)學(xué)院C語言課程組自頂向下的分解問題:既然是一個游戲程序,就應(yīng)該允許玩家反復(fù)玩多次,直到不想玩為止。同時,將玩一次游戲的任務(wù)分解成以下兩個子任務(wù):(1)計算機(jī)產(chǎn)生一個1到1000的隨機(jī)數(shù)供游戲者猜測;(2)游戲者猜數(shù),直至猜對。2/2/20236華中科技大學(xué)計算機(jī)學(xué)院C語言課程組主程序結(jié)構(gòu)do{ 計算機(jī)產(chǎn)生一個1到1000的隨機(jī)數(shù) 游戲者猜數(shù),直至猜對繼續(xù)玩嗎}while(繼續(xù));2/2/20237華中科技大學(xué)計算機(jī)學(xué)院C語言課程組自頂向下的分解子任務(wù)(1)①調(diào)用標(biāo)準(zhǔn)庫函數(shù)rand產(chǎn)生一個隨機(jī)數(shù);②將這個隨機(jī)數(shù)限制在1~1000之間。利用函數(shù),可以實現(xiàn)程序的模塊化,把程序中常用的一些算法或操作編成通用的函數(shù),以供隨時調(diào)用,大大簡化主函數(shù)的流程,使程序設(shè)計簡單和直觀,提高程序的易讀性和可維護(hù)性。把任務(wù)1設(shè)計成一個獨(dú)立的函數(shù),用函數(shù)GetNum(void)來實現(xiàn).2/2/20238華中科技大學(xué)計算機(jī)學(xué)院C語言課程組函數(shù)intGetNum(void)/****************************************************************函數(shù)名稱:GetNum函數(shù)功能:產(chǎn)生一個1到MAX_NUMBER之間的隨機(jī)數(shù),供游戲者猜測。函數(shù)參數(shù):無函數(shù)返回值:返回產(chǎn)生的隨機(jī)數(shù)****************************************************************/intGetNum(void) /*注意:后面無分號*/{ /*函數(shù)開始的標(biāo)志*/ intx; printf("Amagicnumberbetween1and%dhasbeenchosen.\n",MAX_NUMBER); x=rand(); /*調(diào)用標(biāo)準(zhǔn)庫函數(shù)rand產(chǎn)生一個隨機(jī)數(shù)*/ x=x%MAX_NUMBER+1; /*將這個隨機(jī)數(shù)限制在1~MAX_NUMBER之間*/ return(x); /*返回這個隨機(jī)數(shù)給調(diào)用者,*/} /*函數(shù)結(jié)束的標(biāo)志*/2/2/20239華中科技大學(xué)計算機(jī)學(xué)院C語言課程組在函數(shù)的頂端用“/*……*/”格式包含的部分是函數(shù)頭部注釋,包括函數(shù)名稱、函數(shù)功能、函數(shù)參數(shù)、函數(shù)返回值等內(nèi)容,如有必要還可增加作者、創(chuàng)建日期、修改記錄(備注)等相關(guān)項目。雖然函數(shù)頭部注釋在語法上不是必需的,但可以提高程序的質(zhì)量和可維護(hù)性,在程序設(shè)計時要遵從這一編程規(guī)范。GetNum是函數(shù)名,其后的void說明函數(shù)調(diào)用時不接收任何參數(shù),即沒有入口參數(shù),函數(shù)執(zhí)行完應(yīng)該返回所產(chǎn)生的隨機(jī)數(shù),即該隨機(jī)數(shù)是函數(shù)的出口參數(shù),函數(shù)名前的int說明出口參數(shù)的類型為整型。函數(shù)體內(nèi)的rand是接口stdlib.h中的一個函數(shù),它返回一個非負(fù)并且不大于常量RAND_MAX的隨機(jī)整數(shù),RAND_MAX的值取決于計算機(jī)系統(tǒng)。MAX_NUMBER是用#define定義的符號常量,其值為1000。當(dāng)執(zhí)行return語句時,其后表達(dá)式的值被帶回到調(diào)用函數(shù)中。2/2/202310華中科技大學(xué)計算機(jī)學(xué)院C語言課程組自頂向下的分解子任務(wù)(2)/*子任務(wù)2的程序段*/for(;;){輸入猜測的數(shù)if(猜對了)結(jié)束elseif(小了)輸出太小的提示else輸出太大的提示}將任務(wù)(2)也設(shè)計成一個獨(dú)立的函數(shù)GuessNum2/2/202311華中科技大學(xué)計算機(jī)學(xué)院C語言課程組函數(shù)voidGuessNum(intx)源程序\ex5_1.cGuessNum是函數(shù)名,括號里的“intx”說明該函數(shù)有一個入口參數(shù)x,其類型為整型,表示被猜測的神秘數(shù),游戲者如果猜對就直接屏幕輸出猜的次數(shù),無具體值返回,即函數(shù)無出口參數(shù),所以將函數(shù)值的類型說明為void。函數(shù)體內(nèi)有1條for(;;)循環(huán)語句,一直循環(huán)到執(zhí)行return語句時結(jié)束。2/2/202312華中科技大學(xué)計算機(jī)學(xué)院C語言課程組主函數(shù)main源程序\ex5_1.c用蒙特卡羅法模擬該猜數(shù)游戲,在開始玩游戲前,需要調(diào)用函數(shù)srand初始化隨機(jī)數(shù)種子,可以采用系統(tǒng)時間(由time函數(shù)得到)作為種子.函數(shù)time返回自1970年1月1日以來經(jīng)歷的秒數(shù),將該秒數(shù)賦值給種子變量,隨機(jī)數(shù)種子會隨著運(yùn)行程序的時間而改變,因而產(chǎn)生的隨機(jī)數(shù)是不可預(yù)見的.函數(shù)srand和rand的原型在stdlib.h中,函數(shù)time的原型在time.h中,需要在源程序的頭部包含這兩個頭文件.2/2/202313華中科技大學(xué)計算機(jī)學(xué)院C語言課程組結(jié)構(gòu)化程序設(shè)計的益處使程序編制方便,易于管理、修改和調(diào)試。增強(qiáng)了程序的可讀性、可維護(hù)性和可擴(kuò)充性,方便于多人分工合作完成程序的編制。函數(shù)可以公用,避免在程序中使用重復(fù)的代碼。提高軟件的可重用性,軟件的可重用性是轉(zhuǎn)向面向?qū)ο蟪绦蛟O(shè)計的重要因素。2/2/202314華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.1.3C程序的結(jié)構(gòu)C程序由一個或多個函數(shù)組成,其中有且只有一個main函數(shù),程序的執(zhí)行總是從main開始。除main以外的其它函數(shù)分兩類,一類是由系統(tǒng)提供的標(biāo)準(zhǔn)函數(shù)。另一類是需要由程序員自己編寫的函數(shù)(“自定義函數(shù)”)。組成一個C程序的各個函數(shù)可以編輯成多個C源文件,每一個C源文件含有一個或多個函數(shù)定義。各C源文件中要用到的一些外部變量說明、枚舉類型聲明、結(jié)構(gòu)類型聲明、函數(shù)原型和編譯預(yù)處理指令等可編輯成一個.h頭文件,然后在每個C文件中包含該頭文件.2/2/202315華中科技大學(xué)計算機(jī)學(xué)院C語言課程組每個源文件可單獨(dú)編譯生成目標(biāo)文件,組成一個C程序的所有源文件都被編譯之后,由連接程序?qū)⒏髂繕?biāo)文件中的目標(biāo)函數(shù)和系統(tǒng)標(biāo)準(zhǔn)函數(shù)庫的函數(shù)裝配成一個可執(zhí)行C程序。圖5.1顯示了C語言程序的基本結(jié)構(gòu)。2/2/202316華中科技大學(xué)計算機(jī)學(xué)院C語言課程組圖5.1C語言程序的基本結(jié)構(gòu)2/2/202317華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.2函數(shù)的定義與函數(shù)的聲明程序中若要使用自定義函數(shù)實現(xiàn)所需的功能,需要做三件事:①按語法規(guī)則編寫完成指定任務(wù)的函數(shù),即定義函數(shù);②有些情況下在調(diào)用函數(shù)之前要進(jìn)行函數(shù)聲明;③在需要使用函數(shù)時調(diào)用函數(shù)2/2/202318華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.2.1函數(shù)的定義函數(shù)定義的一般形式為:類型名函數(shù)名(參數(shù)列表){聲明部分語句部分}2/2/202319華中科技大學(xué)計算機(jī)學(xué)院C語言課程組類型名說明函數(shù)返回值(即出口參數(shù))的數(shù)據(jù)類型(簡稱為函數(shù)的類型或函數(shù)值的類型),可以是除數(shù)組以外的任何類型。當(dāng)返回值類型為void,函數(shù)將不返回任何值。參數(shù)列表說明函數(shù)入口參數(shù)的名稱、類型和個數(shù),它是一個用逗號分隔的變量名及其類型列表,它描述了在調(diào)用函數(shù)時函數(shù)所接收的參數(shù)。一個函數(shù)可能沒有參數(shù),在沒有參數(shù)的情況下,參數(shù)列表說明為void,否則必須明確地列出每一個參數(shù)的類型。2/2/202320華中科技大學(xué)計算機(jī)學(xué)院C語言課程組在參數(shù)列表中定義的參數(shù)稱為形式參數(shù)(簡稱形參),用以強(qiáng)調(diào)它作為占位符的角色。形參是函數(shù)要處理的數(shù)據(jù),在函數(shù)調(diào)用時要將實際值傳遞給形參。在定義變量時,相同類型的變量可以用一個數(shù)據(jù)類型關(guān)鍵字定義。但是,和變量定義不同的是,每一個形參都必須有數(shù)據(jù)類型和名字。例如:doublepower(intx,intn){…}/*正確的函數(shù)參數(shù)定義*/doublepower(intx,n){…} /*錯誤,n必須指定類型*/intGetNum(void){…} /*參數(shù)表為空的函數(shù)*/GetNum(void){…} /*C89中默認(rèn)返回int,但C99不允許*/良好的編程風(fēng)格是:在每個函數(shù)的頂端用“/*……*/”格式增加函數(shù)頭部注釋,如例5.1所示。為了節(jié)省篇幅,本書后面的例子采用簡化的注釋,希望讀者寫程序時按例5.1的格式寫頭部注釋。為函數(shù)命名時,要選擇有意義的名稱,以增加程序的可讀性,還可避免過多地使用注釋。Windows風(fēng)格函數(shù)名用小寫字母命名,每個詞的第一個字母大寫,通常用“動詞”或者“動詞+名詞”(動賓詞組)形式。2/2/202321華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.2.2函數(shù)的返回值return語句可以是如下兩種形式之一:(1)return;/*void函數(shù)*/(2)return表達(dá)式;/*非void函數(shù)*/void函數(shù)也可以不包含return語句。如果沒有return語句,當(dāng)執(zhí)行到函數(shù)結(jié)束的右花括號時,控制返回到調(diào)用處,把這種情況稱為離開結(jié)束。表達(dá)式值的類型應(yīng)該與函數(shù)定義的返回值類型一致,如果不相同,就把表達(dá)式值的類型自動轉(zhuǎn)換為函數(shù)的類型。
2/2/202322華中科技大學(xué)計算機(jī)學(xué)院C語言課程組函數(shù)返回的值,程序可以使用它,
也可以不使用它while(…){getchar();/*返回值不被使用*/c=getchar();/*返回值被使用*/…}2/2/202323華中科技大學(xué)計算機(jī)學(xué)院C語言課程組【例5.2】寫一個函數(shù)IsPrimeIsPrime判斷整數(shù)n是否為素數(shù)。如果n是素數(shù),則返回1;如果n不是素數(shù),則返回0。源程序\ex5_2.c在一個函數(shù)中可以有多個return語句,此種情況下的return語句通常被作為選擇語句的子句出現(xiàn),最終被執(zhí)行的只是其中的一個。因為,一旦某個return語句被執(zhí)行,控制立即返回到調(diào)用處,其后的代碼不可能被執(zhí)行。2/2/202324華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.2.3函數(shù)的聲明1.函數(shù)定義起函數(shù)聲明的作用要利用函數(shù)定義起函數(shù)聲明的作用,在調(diào)用函數(shù)之前,必須給出調(diào)用函數(shù)的函數(shù)定義。例如,將main函數(shù)的定義放在最后。#include<stdio.h>#include<stdio.h>#include<stdlib.h>#include<time.h>#defineMAX_NUMBER1000 intGetNum(void){…}voidGuessNum(intx){…}intmain(void){…}2/2/202325華中科技大學(xué)計算機(jī)學(xué)院C語言課程組2.函數(shù)原型函數(shù)定義出現(xiàn)在函數(shù)調(diào)用后被調(diào)用函數(shù)在其它文件中定義必須在函數(shù)調(diào)用之前給出函數(shù)原型。2/2/202326華中科技大學(xué)計算機(jī)學(xué)院C語言課程組函數(shù)原型的一般形式
類型名函數(shù)名(參數(shù)類型表);參數(shù)類型表通常是用逗號隔開的形參類型列表,而形參名可以省略。例如,voidGuessNum(int);等價于
voidGuessNum(intx);無參函數(shù)的函數(shù)原型參數(shù)表必須指定為void2/2/202327華中科技大學(xué)計算機(jī)學(xué)院C語言課程組函數(shù)原型的作用函數(shù)原型告訴編譯器函數(shù)返回值的數(shù)據(jù)類型,傳遞給函數(shù)的參數(shù)個數(shù)、參數(shù)類型和參數(shù)順序。編譯器用函數(shù)原型校驗函數(shù)調(diào)用,強(qiáng)制轉(zhuǎn)換傳遞的參數(shù)類型,從而避免錯誤的函數(shù)調(diào)用導(dǎo)致的致命運(yùn)行錯誤或微妙而難以檢測的非致命邏輯錯誤。例如,
printf("%.1f\n",sqrt(4));(1)包含了math.h,輸出2.0*/(2)沒有包含math.h,函數(shù)調(diào)用sqrt(4)不會產(chǎn)生正確的值。2/2/202328華中科技大學(xué)計算機(jī)學(xué)院C語言課程組3.遺漏函數(shù)原型編譯器首次遇到?jīng)]有聲明的函數(shù)調(diào)用時,將構(gòu)造一個缺省聲明并繼續(xù)編譯:intf();/*函數(shù)是int類型,但不給出參數(shù)表信息*/(1)函數(shù)類型不是int,給出一個錯誤提示:
Typemismatchinredeclarationof'f‘(2)函數(shù)類型是int,就不給出錯誤提示。編譯器對參數(shù)類型不作檢查,把正確類型的參數(shù)傳遞給函數(shù)是程序員的責(zé)任。假設(shè)函數(shù)f只有一個類型為int的參數(shù),函數(shù)調(diào)用f(2)會產(chǎn)生正確的值,而函數(shù)調(diào)用f(2.5)將產(chǎn)生錯誤的運(yùn)行結(jié)果。2/2/202329華中科技大學(xué)計算機(jī)學(xué)院C語言課程組良好的編程風(fēng)格在函數(shù)調(diào)用之前必須給出它的函數(shù)定義、函數(shù)原型或兩者都給出。引入標(biāo)準(zhǔn)頭文件的主要原因是它含有函數(shù)原型。2/2/202330華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.2.4新增關(guān)鍵字inline和_Noreturninline是C99增加的關(guān)鍵字,它用在函數(shù)定義的前面,告訴編譯器對該函數(shù)的調(diào)用進(jìn)行內(nèi)聯(lián)優(yōu)化,這意味著編譯器將采用插入的方式處理函數(shù)調(diào)用,而不是采用函數(shù)調(diào)用的方式,但是,這只是一個請求,編譯器可以忽略這個請求。只有支持C99的編譯器才能識別inline。_Noreturn是C11增加的關(guān)鍵字,它用在函數(shù)定義的前面,告訴編譯器這個函數(shù)不會返回到調(diào)用處,其結(jié)果是讓編譯器知道調(diào)用說明為_Noreturn的函數(shù)之后的代碼不可到達(dá)。2/2/202331華中科技大學(xué)計算機(jī)學(xué)院C語言課程組關(guān)鍵字inlineinlineintadd(inta,intb){returna+b;}那么,在程序編譯時,編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)的函數(shù)體來進(jìn)行替換。這將不會產(chǎn)生調(diào)用和返回所帶來的開銷,節(jié)約了時間,但是由于在編譯時函數(shù)體中的代碼被替代到程序中,因此會增加目標(biāo)程序代碼量,進(jìn)而增加空間開銷,可見它是以增加目標(biāo)代碼為代價而換取時間上的節(jié)省。2/2/202332華中科技大學(xué)計算機(jī)學(xué)院C語言課程組關(guān)于inlineinline函數(shù)僅僅是對編譯器的建議,最后能否真正內(nèi)聯(lián),看編譯器的意思,它如果認(rèn)為函數(shù)不復(fù)雜,能在調(diào)用點(diǎn)展開,就會真正內(nèi)聯(lián)。因為內(nèi)聯(lián)函數(shù)要在調(diào)用點(diǎn)展開,所以編譯器必須隨處可見內(nèi)聯(lián)函數(shù)的定義,否則,就成了非內(nèi)聯(lián)函數(shù)的調(diào)用了。所以,內(nèi)聯(lián)函數(shù)必須在調(diào)用之前定義,并且在每個調(diào)用了內(nèi)聯(lián)函數(shù)的文件中都要有該內(nèi)聯(lián)函數(shù)的定義,因此,通常將內(nèi)聯(lián)函數(shù)定義放在頭文件中共享。inline函數(shù)是可以被重復(fù)定義的。inline的使用是有限制的,內(nèi)聯(lián)函數(shù)應(yīng)該簡潔,只有幾個語句,如果語句較多,不適合定義為內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)體中,不能有循環(huán)語句、if語句或switch語句,否則,即使函數(shù)定義時使用了inline關(guān)鍵字,編譯器也會把該函數(shù)作為普通函數(shù)處理。2/2/202333華中科技大學(xué)計算機(jī)學(xué)院C語言課程組關(guān)鍵字_Noreturn_Noreturn用在函數(shù)定義的前面,告訴編譯器這個函數(shù)不會返回到調(diào)用處。例如:_Noreturnvoidf() /*f函數(shù)沒有返回,所以說明為_Noreturn*/{abort(); /*終止程序*/}_Noreturnvoidg(inti)/*假如
i<=0,將導(dǎo)致未定義的行為*/{if(i>0)abort();}2/2/202334華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.3函數(shù)調(diào)用與參數(shù)傳遞5.3.1函數(shù)調(diào)用1.函數(shù)調(diào)用的形式
函數(shù)名(實參列表)實參是一個表達(dá)式,對于無函數(shù),調(diào)用形式:
函數(shù)名()
2/2/202335華中科技大學(xué)計算機(jī)學(xué)院C語言課程組函數(shù)調(diào)用的形式(1)作為表達(dá)式語句出現(xiàn)。GuessNum();putchar(c);(2)作為表達(dá)式中的一個操作數(shù)出現(xiàn)。例如:c=getchar()magic=GetNum();(3)作為函數(shù)調(diào)用的一個實參出現(xiàn),即嵌套調(diào)用。printf("%10.0f",sqrt(x));while(putchar(getchar())!='#');2/2/202336華中科技大學(xué)計算機(jī)學(xué)院C語言課程組2.函數(shù)調(diào)用的執(zhí)行過程為了說明函數(shù)的調(diào)用過程,請看下面程序?!纠?.3】編寫程序?qū)崿F(xiàn)如下功能:分列整齊地顯示整數(shù)1到10的2至5次冪。輸出結(jié)果如下所示:IntSquareCubeQuarticQuintic11111248163239278124341664256102452512562531256362161296777674934324011680786451240963276898172965615904910100100010000100000源程序\ex5_3.c2/2/202337華中科技大學(xué)計算機(jī)學(xué)院C語言課程組程序分析該程序由主函數(shù)main和用戶自定義函數(shù)power組成。main函數(shù)在printf語句中嵌套調(diào)用了power函數(shù)。程序從main函數(shù)開始執(zhí)行,當(dāng)執(zhí)行到printf("%10.0f",power(i,j));時,首先調(diào)用函數(shù)power,這時系統(tǒng)為形參x和n分配2或4字節(jié)的存儲單元,將實參i的值傳遞給形參x,將實參j的值傳遞給形參n,然后把程序控制轉(zhuǎn)移到函數(shù)power,執(zhí)行其函數(shù)體內(nèi)的語句,其中的for語句計算xn,并把計算結(jié)果保存在變量p中,語句returnp;將程序控制返回到調(diào)用處(即main函數(shù)中的printf("%10.0f",power(i,j));語句),同時把p的值送回,至此,power函數(shù)調(diào)用執(zhí)行完畢,系統(tǒng)釋放形參所占據(jù)的存儲單元。程序從main函數(shù)調(diào)用點(diǎn)繼續(xù)執(zhí)行,輸出返回的p值。main函數(shù)用二重for循環(huán)結(jié)構(gòu)重復(fù)調(diào)用了power函數(shù)40次,每次傳遞給形參的值不同即可計算出題目要求的所有xn值(x=1~10,n=2~5)。2/2/202338華中科技大學(xué)計算機(jī)學(xué)院C語言課程組3.實參的求值順序?qū)崊⒌那笾淀樞蛴删唧w實現(xiàn)確定,有的按從左至右的順序計算,有的按從右至左的順序計算a=1;power(a,a++)----從左至右:power(1,1)----從右至左:power(2,1)(多數(shù))為了保證程序清晰、可移植,應(yīng)避免使用會引起副作用的實參表達(dá)式.2/2/202339華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.3.2參數(shù)的值傳遞參數(shù)的傳遞方式是“值傳遞”,實參的值單向傳遞給相應(yīng)的形參。如果實參、形參都是x,被調(diào)用函數(shù)不能改變實參x的值。2/2/202340華中科技大學(xué)計算機(jī)學(xué)院C語言課程組【例5.4】改寫例5.3來說明值傳遞概念。
源程序\ex5_4.c由于參數(shù)是值傳遞,power函數(shù)中的形參n可以當(dāng)普通的局部變量使用,被用作臨時變量,控制for的循環(huán)次數(shù),這樣就不再需要引入局部變量i,從而使程序更簡潔。主函數(shù)main中的局部變量可以與函數(shù)power的形參x、n同名,但它們的作用域不同,只能作用于定義它的函數(shù)。當(dāng)?shù)?次執(zhí)行函數(shù)調(diào)用power(x,n)時,把x的值(即1)傳遞給形參x,把n的值(即2)傳遞給形參n,在函數(shù)power內(nèi)改變了形參n的值(由2變化為0),但并不能改變函數(shù)main中變量n的值。2/2/202341華中科技大學(xué)計算機(jī)學(xué)院C語言課程組傳地址(引用)調(diào)用傳地址(引用)調(diào)用是將變量的地址傳遞給函數(shù),函數(shù)既可以使用,也可以改變實參變量的值。標(biāo)準(zhǔn)庫函數(shù)scanf就是一個引用調(diào)用的例子,通過地址實參返回一個或多個數(shù)據(jù)。程序員也可以定義這種帶有地址形參的函數(shù),這部分內(nèi)容將在第9章中介紹。2/2/202342華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.4作用域與可見性作用域和可見性是對一個問題的兩種角度的思考。作用域是指標(biāo)識符(變量或函數(shù))的有效范圍,也就是指程序正文中可以使用該標(biāo)識符的那部分程序段。有局部和全局兩種作用域,局部作用域表示只能在一定的范圍內(nèi)起作用,只能被一個程序塊訪問,全局作用域表示可以在整個程序的所有范圍內(nèi)起作用,可由程序中的部分或所有函數(shù)共享,程序塊是帶有說明的復(fù)合語句(包括函數(shù)體)。代碼中的變量,按照作用域可分為局部變量和全局變量。函數(shù)都是全局的。2/2/202343華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.4.1局部變量和全局變量局部變量:在函數(shù)內(nèi)部定義的變量,作用域是定義該變量的程序塊,程序塊是帶有說明的復(fù)合語句(包括函數(shù)體)。不同函數(shù)可同名,同一函數(shù)內(nèi)不同程序塊可同名。形式參數(shù)是局部變量。外部變量:在函數(shù)外部定義的變量,其作用域從其定義處開始一直到其所在文件的末尾,可由程序中的部分或所有函數(shù)共享。2/2/202344華中科技大學(xué)計算機(jī)學(xué)院C語言課程組extern聲明在函數(shù)中使用外部變量,一般要對該變量進(jìn)行引用性聲明,說明它的類型。只有在函數(shù)內(nèi)經(jīng)過引用性聲明的外部變量才能使用,外部變量的說明符為extern。但在一個外部變量定義之后的函數(shù)內(nèi)使用可不再加以extern聲明?!纠?.5】改寫例5.1,把magic定義為外部變量。這需要修改函數(shù)GuessNum的調(diào)用、原型和定義。源程序\ex5_5.c2/2/202345華中科技大學(xué)計算機(jī)學(xué)院C語言課程組程序分析magic是在函數(shù)外部定義的,它是外部變量,由于函數(shù)main和GuessNum使用了它,所以在這兩個函數(shù)中編寫了一條extern聲明語句,該聲明語句除了在前面加了關(guān)鍵字extern外,其余與該外部變量的定義相同。但是,在該例中,兩條extern聲明是多余的,均可以省略,因為magic的定義出現(xiàn)在函數(shù)main和GuessNum之前。2/2/202346華中科技大學(xué)計算機(jī)學(xué)院C語言課程組外部變量的定義性聲明和引用性聲明局部變量只有定義性聲明,沒有引用性聲明。而外部變量有定義性聲明和引用性聲明,兩者具有嚴(yán)格的區(qū)別。外部變量的定義必須在所有的函數(shù)之外,且只能定義一次,目的是為之分配存儲單元。外部變量的引用性聲明既可以出現(xiàn)在函數(shù)內(nèi),也可以出現(xiàn)在函數(shù)外,而且可以出現(xiàn)多次,僅用于通報變量的類型,并不分配存儲單元,只是表明在代碼中要按聲明的類型使用它。外部變量的初始化只能出現(xiàn)在其定義中。2/2/202347華中科技大學(xué)計算機(jī)學(xué)院C語言課程組外部變量PK形式參數(shù)在C程序的不同源文件之間,或者在同一源文件的不同函數(shù)之間必須共享變量時,外部變量是很有用的。函數(shù)之間的數(shù)據(jù)聯(lián)系除了通過形式參數(shù)外,也可以利用外部變量。從結(jié)構(gòu)化程序設(shè)計的觀點(diǎn)來看,不要過于依賴外部變量,因為這將使函數(shù)的獨(dú)立性降低。很難在其他程序中復(fù)用依賴于外部變量的函數(shù),為了在另一個程序中使用該函數(shù),必須帶上此函數(shù)需要的外部變量。在程序維護(hù)期間,如果改變外部變量(比方說改變它的類型),那么將需要檢查程序中的每個函數(shù),以確認(rèn)該變化如何對函數(shù)產(chǎn)生影響。如果外部變量被賦了錯誤的值,可能很難確定出錯的函數(shù)。在大多數(shù)情況下,對函數(shù)而言,通過形式參數(shù)進(jìn)行通信比通過外部變量通信的方法更好。這樣有助于提高函數(shù)的通用性,降低副作用。2/2/202348華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.4.2作用域規(guī)則(1)文件范圍。其作用域開始于文件開頭,結(jié)束于文件結(jié)尾。全局變量和函數(shù)具有文件作用域,從定義它們的位置開始一直到本文件結(jié)束。全局變量和函數(shù)如果在定義時使用了static存儲類關(guān)鍵字,它們的作用域只限定在本文件以內(nèi);如果在定義時沒有使用static存儲類關(guān)鍵字,它們的作用域可以通過extern聲明語句擴(kuò)展到定義點(diǎn)之前及其他文件,使得它們在定義之前可以使用,以及其他與定義所在文件不同的源文件中的函數(shù)也可以使用。關(guān)于static和extern的詳細(xì)用法,見5.5節(jié)。2/2/202349華中科技大學(xué)計算機(jī)學(xué)院C語言課程組(2)塊范圍。其作用域開始于左大花括號“{”,結(jié)束于右大花括號“}”。在復(fù)合語句內(nèi)定義的變量其作用域?qū)儆趬K范圍,就在定義該變量的塊內(nèi)。在函數(shù)的開始部分定義的變量和函數(shù)的形式參數(shù),其作用域也屬于塊范圍,就在定義該變量的函數(shù)內(nèi)部。在不同函數(shù)中的同名變量相互之間沒有任何關(guān)系。(3)函數(shù)原型范圍。在函數(shù)原型中說明的變量只在函數(shù)原型內(nèi)有效,開始于原型左括號“(”,結(jié)束于原型右括號“)”。(4)函數(shù)范圍。開始于函數(shù)體的左大花括號“{”,結(jié)束于函數(shù)體的右大花括號“}”。只有g(shù)oto語句的標(biāo)號屬于函數(shù)范圍,只能作用于同一函數(shù)內(nèi)。2/2/202350華中科技大學(xué)計算機(jī)學(xué)院C語言課程組區(qū)分外部變量的引用性聲明和定義性聲明外部變量的引用性聲明用于通報變量的性質(zhì)(主要是變量的類型)外部變量的定義性聲明除此以外還引起存儲分配。如果在函數(shù)外部有如下說明語句:intsp;這是外部變量的定義性聲明,一方面說明了sp的類型為int,另一方面系統(tǒng)還要為其分配2字節(jié)的存儲單元。而如下語句:externintsp;這是外部變量的引用性聲明,僅僅說明了sp是一個類型為int的外部變量,系統(tǒng)不會為其分配存儲單元。在一個程序中對一個外部變量只能在某個文件中定義一次,而外部變量的引用性聲明可以出現(xiàn)多次。外部變量的初始化只能出現(xiàn)在其定義中。2/2/202351華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.4.3可見性作用域的嵌套:程序塊可以多重嵌套,每個塊都可以定義自己的變量名。外層塊的變量名在內(nèi)層塊中是有效的。但是,如果一個變量名a同時出現(xiàn)在外層塊和內(nèi)層塊中,外層a的作用域包含了內(nèi)層a的作用域,這稱為作用域的嵌套。當(dāng)內(nèi)層的變量和外層的變量同名時,在內(nèi)層里,外層的變量暫時失去了可見性,是不可見的。2/2/202352華中科技大學(xué)計算機(jī)學(xué)院C語言課程組塊多重嵌套時變量的可見性外層塊的a在內(nèi)層塊不可見,在內(nèi)層塊中對a的修改不會影響到外層塊的a。因此,在進(jìn)入復(fù)合語句之前和退出復(fù)合語句之后輸出的a均為2。而變量b在內(nèi)層塊沒有重定義,它在整個函數(shù)體都可見。同樣地,全局變量和局部變量也可以同名。在局部變量的作用域內(nèi),全局變量不可見。2/2/202353華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.5存儲類型變量和函數(shù)都有兩個屬性:數(shù)據(jù)類型和存儲類型。函數(shù)的存儲類型決定函數(shù)的作用域,可使用的關(guān)鍵字有extern和static(5.9節(jié))。變量的存儲類型決定變量的作用域、存儲分配方式、生命周期和初始化方式,可使用的關(guān)鍵字有:auto、extern、static和register。
存儲分配方式:在何時、何處給變量分配存儲單元;
生命周期:變量在內(nèi)存中的存在期;
初始化方式:在定義變量時如果未顯示初始化,是否有缺省初值,如果有顯示初始化,賦初值操作如何執(zhí)行(執(zhí)行一次還是執(zhí)行多次)。2/2/202354華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.5.1存儲類型auto局部變量的缺省存儲類型是auto,稱自動變量autointa;/*等價于inta;也等價于autoa;*/
作用域:局部于定義它的塊,從塊內(nèi)定義之后直到該塊結(jié)束有效。存儲分配方式:動態(tài)分配方式,即在程序運(yùn)行過程中分配和回收存儲單元。生命周期:短暫的,只存在于該塊的執(zhí)行期間。初始化方式:定義時沒有顯示初始化,其初值是不確定的;有顯示初始化,則每次進(jìn)入塊時都要執(zhí)行一次賦初值操作。2/2/202355華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.5.2存儲類型extern外部變量的存儲類型是extern,但在定義時不使用關(guān)鍵字extern。外部變量的作用域:從定義之后直到該源文件結(jié)束的所有函數(shù),通過用extern做聲明,外部變量的作用域可以擴(kuò)大到整個程序的所有文件。存儲分配方式:靜態(tài)分配方式,即程序運(yùn)行之前,系統(tǒng)就為外部變量在靜態(tài)區(qū)分配存儲單元,整個程序運(yùn)行結(jié)束后所占用的存儲單元才被收回。生命周期:永久的,存在于整個程序的執(zhí)行期間。初始化方式:定義時沒有顯示初始化,初值0;有顯示初始化,只執(zhí)行一次賦初值操作。2/2/202356華中科技大學(xué)計算機(jī)學(xué)院C語言課程組【例5.6】關(guān)鍵字extern的用法修改例5.5,將整個程序放在兩個文件ex5_6_1.c和ex5_6_2.c中源程序\ex5_6_1.c源程序\ex5_6_2.c當(dāng)編寫大型程序時,構(gòu)造成多文件是很重要的,每個文件可以單獨(dú)編譯。2/2/202357華中科技大學(xué)計算機(jī)學(xué)院C語言課程組程序分析該程序包含2個源文件ex5_6_1.c和ex5_6_2.c,外部變量magic在ex5_6_1.c文件中定義,在ex5_6_2.c文件中必須聲明后才能使用它。ex5_6_2.c文件中的第4行代碼就是外部變量magic的聲明,extern告訴編譯器變量magic被定義在別處,可能在本文件中,也可能在另一個文件中,但編譯器并不知道它在哪個文件中定義,因此讓連接程序查找。如果連接程序找到了外部變量magic的正確的定義,它就會指明其位置,從而解決對該變量的引用。如果連接程序沒有找到magic的定義,它就會發(fā)出錯誤信息并且不生成可執(zhí)行文件。2/2/202358華中科技大學(xué)計算機(jī)學(xué)院C語言課程組2.外部函數(shù)函數(shù)一般是全局的,作用域?qū)儆谖募秶?,對程序的任何部分都是可見的,其默認(rèn)存儲類型是extern,這種函數(shù)稱為外部函數(shù)。在函數(shù)定義和函數(shù)原型中都可以使用關(guān)鍵字extern。例如:externdoublepower(int,int);是函數(shù)power的函數(shù)原型,其函數(shù)定義可為:externdoublepower(intx,intn){…}power是外部函數(shù),它可被本文件和其他文件中的函數(shù)調(diào)用。函數(shù)定義時一般省略extern,在其他需要調(diào)用它的文件中,一般用extern聲明。例如,例5.6的ex5_6_1.c文件中的函數(shù)原型常寫作:externintGetNum(void);externvoidGuessNum(void);2/2/202359華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.5.3存儲類型static關(guān)鍵字static有兩個重要而截然不同的用法:(1)用于定義局部變量,稱為靜態(tài)局部變量。(2)用于定義外部變量,稱為靜態(tài)外部變量。
存儲分配方式:靜態(tài)分配方式
生命周期:永久的,
缺省初值:0,只執(zhí)行一次靜態(tài)局部變量和自動變量有根本性的區(qū)別。靜態(tài)外部變量和外部變量區(qū)別:作用域不同。2/2/202360華中科技大學(xué)計算機(jī)學(xué)院C語言課程組1.靜態(tài)局部變量靜態(tài)局部變量的作用域和自動變量一樣,只作用于定義它的塊。由于靜態(tài)局部變量在程序執(zhí)行期間不會消失,因此,它的值有連續(xù)性,當(dāng)退出塊時,它的值能保存下來,以便再次進(jìn)入塊時使用。而自動變量的值在退出塊時都丟失了。如果定義時靜態(tài)局部變量有顯示初始化,只執(zhí)行一次賦初值操作,而自動變量每次進(jìn)入時都要執(zhí)行賦初值操作。2/2/202361華中科技大學(xué)計算機(jī)學(xué)院C語言課程組【例5.7】編程計算1!+2!+3!+4!+…n!將求階乘定義成函數(shù),由于n!=n*(n-1)!,可以直接利用上次調(diào)用后的值算出,使計算量最小。為了使局部變量的值在離開函數(shù)后能保存,必須在定義時加static,成為靜態(tài)局部變量。源程序\ex5_7.c2/2/202362華中科技大學(xué)計算機(jī)學(xué)院C語言課程組程序分析在函數(shù)fac內(nèi)的變量f是靜態(tài)局部變量。在第一次調(diào)用函數(shù)fac時,把f初始化為1,在退出函數(shù)時,f的值被保存在內(nèi)存中。當(dāng)再次調(diào)用函數(shù)時,就不會再對f進(jìn)行初始化,而使用上次退出函數(shù)時保存在內(nèi)存中的值。雖然無論使用與否,f都占據(jù)內(nèi)存,但是,變量f只能被函數(shù)fac訪問,其他函數(shù)不能訪問。請讀者思考,如果將f定義為自動變量(即去掉關(guān)鍵字static),程序的輸出結(jié)果如何?使用靜態(tài)局部變量是為了多次調(diào)用同一函數(shù)時使變量能保持上次調(diào)用結(jié)束時的結(jié)果。即靜態(tài)局部變量的值有記憶性。2/2/202363華中科技大學(xué)計算機(jī)學(xué)院C語言課程組2.靜態(tài)外部變量靜態(tài)外部變量和外部變量的區(qū)別是作用域的限制。靜態(tài)外部變量只能作用于定義它的文件,其它文件中的函數(shù)不能使用,外部變量用extern聲明后可以作用于其它文件。使用靜態(tài)外部變量的好處在于:當(dāng)多人分別編寫一個程序的不同文件時,可以按照需要命名變量而不必考慮是否會與其它文件中的變量同名,保證文件的獨(dú)立性。和局部變量能夠屏蔽同名的外部變量一樣,一個文件中的靜態(tài)外部變量能夠屏蔽其他文件中同名的外部變量。在靜態(tài)外部變量所在的文件中,同名的外部變量不可見。2/2/202364華中科技大學(xué)計算機(jī)學(xué)院C語言課程組【例5.8】偽隨機(jī)數(shù)發(fā)生器的實現(xiàn)與使用產(chǎn)生隨機(jī)序列需要給定初始種子,因此種子seed是各隨機(jī)數(shù)發(fā)生器函數(shù)所共享的變量,應(yīng)定義在函數(shù)外。而且,seed只提供給srandom、random和probability等產(chǎn)生隨機(jī)數(shù)的函數(shù)操作,并不希望任何其他函數(shù)訪問它們,因此將函數(shù)srandom、random和probability,以及它們所操作的種子seed設(shè)計在一個源文件ex5_8_1.c中,在定義seed時加上static,限制其作用域只在本文件內(nèi)。將函數(shù)main設(shè)計在另一個源文件ex5_8_2.c中。源程序\ex5_8_1.c源程序\ex5_8_2.c2/2/202365華中科技大學(xué)計算機(jī)學(xué)院C語言課程組程序分析以上程序由兩個文件組成,在文件ex5_8_1.c中定義了一個靜態(tài)外部變量seed,依賴變量seed的舊值,調(diào)用函數(shù)random和probability為變量seed產(chǎn)生一個新值。由于seed是靜態(tài)外部變量,它對本文件的這些函數(shù)來說是共享的,它的值在函數(shù)調(diào)用之間被保存下來了,但是,它對本文件來說是私有的,在文件ex5_8_2.c中不能用extern對seed做聲明,也不能在main函數(shù)中使用seed?,F(xiàn)在可以在文件ex5_8_2.c中調(diào)用這些隨機(jī)數(shù)發(fā)生器函數(shù)而不必?fù)?dān)心副作用。2/2/202366華中科技大學(xué)計算機(jī)學(xué)院C語言課程組3.靜態(tài)函數(shù)如果要把函數(shù)的作用域限制在定義它的文件中,在函數(shù)定義時必須使用關(guān)鍵字static,這種函數(shù)稱為靜態(tài)函數(shù)。例如:doublepower(int,int); /*power函數(shù)原型*/voidmain(void){ …/*函數(shù)power可被調(diào)用,但在其他文件不能被調(diào)用*/}staticdoublepower(intx,intn);/*靜態(tài)函數(shù)*/{ …}和靜態(tài)外部變量一樣,靜態(tài)函數(shù)也只作用于所在文件,不同文件中的靜態(tài)函數(shù)可以同名,保證文件的獨(dú)立性。2/2/202367華中科技大學(xué)計算機(jī)學(xué)院C語言課程組5.5.4存儲類型register用來定義局部變量,register建議編譯器把該變量存儲在計算機(jī)的高速硬件寄存器中,除此之外,其余特性和自動變量完全相同。使用register的目的是為了提高程序的執(zhí)行速度。程序中最頻繁訪問的變量,可聲明為register。 registerinti; /*等價于registeri;*/ for(i=0;i<=N;i++){ …}不可多必要時使
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 44937.4-2024集成電路電磁發(fā)射測量第4部分:傳導(dǎo)發(fā)射測量1 Ω/150 Ω直接耦合法
- 媒體娛樂公司估值考量要點(diǎn)
- 2024.0913推文-一步法elisa新品解讀
- 2024高中地理第五章區(qū)際聯(lián)系與區(qū)域協(xié)調(diào)發(fā)展第2節(jié)產(chǎn)業(yè)轉(zhuǎn)移-以東亞為例精練含解析新人教必修3
- 2024高中生物專題4酶的研究與應(yīng)用課題2探討加酶洗衣粉的洗滌效果課堂演練含解析新人教版選修1
- 2024高考地理一輪復(fù)習(xí)第十五單元區(qū)域生態(tài)環(huán)境建設(shè)練習(xí)含解析
- 2024高考化學(xué)一輪復(fù)習(xí)第八章水溶液中的離子平衡第三節(jié)鹽類的水解學(xué)案新人教版
- 2024高考化學(xué)二輪復(fù)習(xí)選擇題專項練四含解析
- 2024高考地理一輪復(fù)習(xí)特色篇六新穎等值線圖練習(xí)含解析
- (4篇)2024年有關(guān)一年級英語培優(yōu)補(bǔ)差的教學(xué)工作總結(jié)
- MOOC 有機(jī)化學(xué)(上)-北京師范大學(xué) 中國大學(xué)慕課答案
- 五年級上冊脫式計算100題及答案
- 讀書會熵減華為活力之源
- 二年級上學(xué)期數(shù)學(xué)
- GB/T 3098.5-2000緊固件機(jī)械性能自攻螺釘
- 康佳液晶電視企業(yè)文化(課堂PPT)
- 個人養(yǎng)老金:是什么、怎么繳、如何領(lǐng)PPT個人養(yǎng)老金基礎(chǔ)知識培訓(xùn)PPT課件(帶內(nèi)容)
- 雞鴨屠宰生產(chǎn)企業(yè)安全風(fēng)險分級管控資料
- 離子色譜法分析氯化物原始記錄 (1)
- 高等數(shù)學(xué)說課稿PPT課件(PPT 49頁)
- 造影劑腎病概述和性質(zhì)
評論
0/150
提交評論