




已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第一章 C語言程序設(shè)計初步,1.1程序與程序設(shè)計語言,1.1.1 常量 一提起計算機,人們就會聯(lián)想到鍵盤、顯示器和主機。其實,應(yīng)用要早得多、并一直流傳至今的計算機工具是算盤(見圖1.1)。那么,現(xiàn)代電子計算機與算盤的最大區(qū)別在哪里呢?關(guān)鍵在于現(xiàn)代計算機可以自動完成計算過程,而算盤進行的計算過程是在人的撥動下才能進行。,圖1.1 算盤,那么,為什么現(xiàn)代計算機可以自動完成計算過程呢?這 首先要從程序說起。程序?qū)嶋H上是一個非常普通的概念:按照一定的順序安排的工作步驟??梢哉f,做任何事情都有相應(yīng)的程序。做的事情不同,要求的效果不同,程序就不同。例如,用同樣的原料,采用不同的程序,會做出不同的菜肴來。 一種工具能夠自動工作,一是要有記憶功能,能夠記住程序;二是具有按照程序控制相關(guān)部件操作的能力。如果能讓算盤記住做某種計算的口訣和計算的數(shù)據(jù),并且有能按照口訣控制算珠自動運動的機制,則只要發(fā)出開始執(zhí)行的命令,算盤就會自動完成計算。 可惜這樣的機制并沒有在算盤中實現(xiàn)。但是,卻有另外一種機器卻在這方面向前推進了一步。這就是明朝末年宋應(yīng)星在其天工開物中記載的中國古代提花機(見圖1.2)。,圖1.2 中國古代的提花機,中國提花機大約出現(xiàn)于西漢末年(公元前)。它采用用絲線結(jié)成的“花本”(花版)控制經(jīng)線起落,以織成要求的圖樣。這是最早的程序控制思想。后來,提花機沿著絲綢之路傳到歐洲,歷經(jīng)改進,1805年法國人Joseph Jacquard制造成功用穿孔卡片(見圖1.3)控制連桿(橫針),用有孔和無孔進一步控制經(jīng)線起落的提花機。,圖1.3 穿孔卡片,穿孔卡片把程序控制技術(shù)向前推進了一步。這一技術(shù)被一位英國數(shù)學(xué)家Charles Babbage(見圖1.4)引入到了計算機中機,用有孔和無孔的組合來表示數(shù)據(jù)和程序。,圖1.4 英國數(shù)學(xué)家Charles Babbage,18世紀(jì)末,法國數(shù)學(xué)界調(diào)集大批數(shù)學(xué)家,組成了人工手算的流水線,經(jīng)過長期艱苦奮斗,終于完成了17卷數(shù)學(xué)用表的編制,但是,手工計算出的數(shù)據(jù)出現(xiàn)了大量錯誤。這件事情強烈刺激了Babbage。1812年20歲的Babbage開始計算機的研制工作,他要把函數(shù)表的復(fù)雜算式轉(zhuǎn)化為差分運算,用簡單的加法代替平方運算,快速編制不同函數(shù)的數(shù)學(xué)用表,并將這種機器稱為“差分機”。經(jīng)過十年的努力,終于于1822年完成了第一臺差分機,可以處理3個不同的5位數(shù),計算精度達到6位小數(shù)。1833年他又開始投身于一種“會分析的機器”分析機的研制中。他把機器設(shè)計成三個部分,一是用來儲存數(shù)據(jù)信息的“倉庫(The Store)”,二是進行數(shù)據(jù)運算處理的“工場(The mill)”,三是使用穿孔卡片來輸入程序并用穿孔卡片輸出數(shù)據(jù)。 這臺機器雖然沒有制造成功,但它的工作原理程序存儲控制為今天的計算機奠定了基礎(chǔ): (1)任何工具的工作,都是由程序控制的; (2)只有工具具有了記憶程序的功能,并具有了按照程序進行自我控制的功能,該工具才能自動工作。,1.1.2 計算機程序設(shè)計語言 程序要需要用某種形式(語言)來描述。例如,用算盤進行計算,程序是用口訣描述的,珠算的語言是口訣?,F(xiàn)代計算機的程序則是用計算機程序設(shè)計語言來描述的。從計算機誕生到今天,程序設(shè)計語言也在伴著計算機技術(shù)的進步不斷升級換代。 1. 機器語言 一種CPU的指令系統(tǒng),也稱該CPU的機器語言,它是該CPU可以識別的一組由0和1序列構(gòu)成的指令碼。下面是某CPU指令系統(tǒng)中的兩條指令: 1 0 0 0 0 0 0 0 (進行一次加法運算) 1 0 0 1 0 0 0 0 (進行一次減法運算) 用機器語言編程序,就是從所使用的CPU的指令系統(tǒng)中挑選合適的指令,組成一個指令系列。這種程序雖然可以被機器直接理解和執(zhí)行,卻由于它們不直觀,難記、難認(rèn)、難理解、不易查錯,只能被少數(shù)專業(yè)人員掌握,同時編寫程序的效率很低,質(zhì)量難以保證。這種繁重的手工方式與高速、自動工作的計算機極不相稱。這種方式僅使用于計算機出現(xiàn)的初期(使用穿孔紙帶的時期)的編程(用有孔、無孔,分別代表1、0),現(xiàn)在已經(jīng)不再使用,2. 匯編語言 為減輕人們在編程中的勞動強度,20世紀(jì)50年代中期人們開始用一些“助記符號”來代替0,1碼編程。如前面的兩條機器指令可以寫為 A+B A或ADD A,B A-B 個樣 A或SUB A,B 這種用助記符號描述的指令系統(tǒng),稱為符號語言或匯編語言。 用匯編語言編程,程序的生產(chǎn)效率及質(zhì)量都有所提高。但是匯編語言指令是機器不能直接識別、理解和執(zhí)行的。用它編寫的程序經(jīng)檢查無誤后,要先翻譯成機器語言程序才能被機器理解、執(zhí)行。這個翻譯轉(zhuǎn)換過程稱為“代真”。代真后得到的機器語言程序稱為目標(biāo)程序(object program),代真以前的程序,稱為源程序(source program)。由于匯編語言指令與機器語言指令基本上具有一一對應(yīng)的關(guān)系,所以匯編語言源程序的代真可以由匯編系統(tǒng)以查表的方式進行。 匯編語言與機器語言,都是依CPU的不同而異,它們都稱為面向機器的語言。用面向機器的語言編程,可以編出效率極高的程序。但是程序員用它們編程時,不僅要考慮解題思路,還要熟悉機器的內(nèi)部結(jié)構(gòu),并且要“手工”地進行存儲器分配。這種編程的勞動強度仍然很大,給計算機的普及推廣造成很大的障礙。,2. 高級語言 匯編語言和機器語言是面向機器的,不同類型的計算機所用的匯編語言和機器語言是不同的。1954年出現(xiàn)的FORTRAN語言以及隨后相繼出現(xiàn)的其它高級語言,開始使用接近人類自然語言的、但又消除了自然語言中的二義性的語言來描述程序。這些高級語言使人們開始擺脫進行程序設(shè)計必須先熟悉機器的桎梏,把精力集中于解題思路和方法上。 第一種高級語言是1954年問世的FORTRAN語言。此后不久,不同風(fēng)格、不同用途、不同規(guī)模、不同版本的面向過程的高級語言便風(fēng)涌而起。據(jù)統(tǒng)計,全世界已有2500種以上的計算機語言,其中使用較多的有近百種。圖1.5為幾種廣泛流行的高級語言的發(fā)展變遷情況。,圖1.5 幾種廣泛流行的高級語言的發(fā)展變遷情況,1.1.3 高級語言程序的開發(fā)過程 一般來說,程序開發(fā)的一般過程有如圖1.6所示幾個步驟。,圖1.6 高級語言程序的開發(fā)過程,1. 分析 一般來說,一個具體的問題要涉及許許多多的方面,這是問題的復(fù)雜性所在。為了便于求解,往往要忽略一些次要方面。這種通過忽略次要方面,而找出解題規(guī)律,就稱為建立模型。 2. 建立模型,表現(xiàn)模型 表現(xiàn)模型就是用一種符號-語言系統(tǒng)來描述模型。一般來說,模型的表現(xiàn)會隨著對問題抽象程度的加深和細化,不斷由領(lǐng)域特色向計算機可解釋、執(zhí)行靠近,中間也可能采用一些其他的符號系統(tǒng),如流程圖等,直到最后用一種計算機程序設(shè)計語言描述出來。 3. 源程序的編輯 源程序的編輯就是在某種字處理環(huán)境下,用具體的程序設(shè)計語言書寫并修改的過程。為此就要掌握一種計算機程序設(shè)計語言。還要應(yīng)用一種專用程序編輯器或通用的文字編輯器進行。,4. 程序的編譯(或解釋)與鏈接 寫出一個高級語言程序后,并不是就可以立即拿來執(zhí)行。要讓機器直接執(zhí)行,還要將它翻譯成由機器可以直接辨認(rèn)并可以執(zhí)行的機器語言程序。為區(qū)別它們,把用高級語言寫的程序(文件)稱為源程序(文件),把機器可以直接辨認(rèn)并執(zhí)行的程序(文件)稱為可執(zhí)行程序(文件)。這一過程一般分為兩步: 第1步:在程序編輯過程中輸入到源文件中的是一些字符碼,但是機器可以直接處理的是0、1信息。為此,首先要將源程序文件翻譯成0、1碼表示的信息,并用相應(yīng)的文件保存。這種保存0、1碼信息的文件稱為目標(biāo)程序文件。由源文件翻譯成目標(biāo)文件的過程稱為編譯。在編譯過程中,還要對源程序中的語法和邏輯結(jié)構(gòu)進行檢查。編譯任務(wù)是由稱做編譯器(compiler)的軟件完成的。目標(biāo)程序文件還不能被執(zhí)行,它們只是一些目標(biāo)程序模塊。,第2步:將目標(biāo)程序模塊以及程序所需的系統(tǒng)中固有的目標(biāo)程序模塊(如執(zhí)行輸入輸出操作的模塊)鏈接成一個完整的程序。經(jīng)正確鏈接所生成的文件才是可執(zhí)行文件。完成鏈接過程的軟件稱為鏈接器(linker)。 圖1.7為編譯和鏈接過程的示意圖。 程序在編譯、鏈接過程中,也可能發(fā)現(xiàn)錯誤。這時要重新進入編輯器進行編輯。,圖1.7 編譯和鏈接過程的示意圖,5. 程序的測試與調(diào)試 經(jīng)編譯、鏈接的程序文件,生成可執(zhí)行文件,就可以讓計算機執(zhí)行了。但是,并不是就可以得到預(yù)期的結(jié)果而交付用戶使用了,因為程序仍然會存在某些錯誤。因此,每一個人編寫出一個程序后,在正式交付使用前,總要試通一下?!霸囃ā本褪窃囘\行程序,也就是對程序進行測試。 測試是以程序通過編譯、沒有語法和鏈接上的錯誤為前提,目的是找出程序中可能存在的錯誤并加以改正。因此,應(yīng)該測試程序在不同情況下運行的情況,輸入不同的數(shù)據(jù)可以檢測出程序在不同情況下運行的情況。測試的數(shù)據(jù)應(yīng)是以“程序是會有錯誤的”為前提精心設(shè)計出來的,而不是隨心所欲地亂湊而成的。它不僅應(yīng)含有被測程序的輸入數(shù)據(jù),而且還應(yīng)包括程序執(zhí)行它們后預(yù)期的結(jié)果。每次測試都要把實際的結(jié)果與預(yù)期的結(jié)果相比較,以觀察程序是否出錯。,6. 編寫程序文檔 經(jīng)過了問題分析、設(shè)計、程序編碼、測試后,程序開發(fā)的工作基本上結(jié)束了。但是,這時還不能交付使用。因為,隨著程序規(guī)模的增大和日益復(fù)雜化,程序的使用和運行也越來越不那么直接,用戶要運行程序,還需要知道許多信息,如: 程序的功能 需要輸入的數(shù)據(jù)類型、格式和取值范圍 需要使用的文件數(shù)量、名稱、內(nèi)容以及存放位置等 程序運行需要的軟、硬件環(huán)境 程序的裝入、啟動方法以及交互方式等。 為此,程序開發(fā)者需要向用戶提供這些資料稱為程序使用說明書或用戶文檔。需要說明的是,在許多軟件中,這些內(nèi)容已經(jīng)部分或全部地以“readme”或“help”的形式提供。 目前,程序文檔已經(jīng)成為軟件開發(fā)產(chǎn)品的必要部分。文檔在程序使用和維護中的重要性也改變了軟件的概念,使之由早期的“軟件是計算機程序的總稱”演化為“軟件是計算機的程序連同計算機化的文檔的總稱?!?7. 程序的維護 程序交付用戶使用之后,并不是萬事大吉了。由于多種原因,還可能要對程序進行修改。交付之后對程序的修改稱為程序的維護。維護程序的原因主要有: 原來的程序沒有完全滿足用戶要求; 用戶要求的改變; 程序中遺留有錯誤,在運行中被發(fā)現(xiàn)。 程序的維護可以由開發(fā)者進行,也可能是由別人進行。為能便于程序的維護,開發(fā)者應(yīng)當(dāng)提供必要的技術(shù)資料,并且要保證程序的可讀性好能讓人看懂。,1.2 C語言及其標(biāo)準(zhǔn),1.2.1 C語言的出現(xiàn) C語言是目前程序設(shè)計領(lǐng)域中最有影響力的一種程 序設(shè)計語言。可是,它卻是“漫不經(jīng)心”地開發(fā)出 來的。 20世紀(jì)60年代,Bell實驗室的Ken Thompson (見圖1.8)著手開發(fā)后來對計算機產(chǎn)生了巨大影 響的UNIX操作系統(tǒng)。為了描述UNIX,Thompson 首先將當(dāng)時的一種專門用來描述系統(tǒng)程序的BCPL 語言改進為他稱為B的語言。1970年Thompson發(fā) 表了用匯編語言和B語言寫成的PDP-7上實現(xiàn)UNIX 的初版。,1971年,Dennis Ritchie(見圖1.8)開始協(xié)助Thompson開發(fā)UNIX。他對B語言做了進一步的充實和完善,加入數(shù)據(jù)類型和新的句法,于1972年推出了一種新型程序設(shè)計語言C語言(取BCPL的第2個字母)。為了使UNIX操作系統(tǒng)推廣,1977年Dennis M.Ritchie 發(fā)表了不依賴于具體機器系統(tǒng)的C語言編譯文本可移植的C語言編譯程序。于是,C語言是借助UNIX操作系統(tǒng)的翅膀而起飛的,UNIX操作系統(tǒng)也由于C而得已快速移植落地生根,兩者相輔相承,成就了軟件開發(fā)史上歷時30年的時代。,圖1.8 Thompson(左)和Ritchie(中)于1999 年接受當(dāng)時美國總統(tǒng)克林頓授予的國家技術(shù)勛章,1971年,Dennis Ritchie(見圖1.8)開始協(xié)助Thompson開發(fā)UNIX。他對B語言做了進一步的充實和完善,加入數(shù)據(jù)類型和新的句法,于1972年推出了一種新型程序設(shè)計語言C語言(取BCPL的第2個字母)。為了使UNIX操作系統(tǒng)推廣,1977年Dennis M.Ritchie 發(fā)表了不依賴于具體機器系統(tǒng)的C語言編譯文本可移植的C語言編譯程序。于是,C語言是借助UNIX操作系統(tǒng)的翅膀而起飛的,UNIX操作系統(tǒng)也由于C而得已快速移植落地生根,兩者相輔相承,成就了軟件開發(fā)史上歷時30年的時代。,圖1.8 Thompson(左)和Ritchie(中)于1999 年接受當(dāng)時美國總統(tǒng)克林頓授予的國家技術(shù)勛章,1978年Brian W.Kernighian和Dennis M.Ritchie出版了名著The C Programming Language,從而使C語言成為目前世界上流行最廣泛的高級程序設(shè)計語言。以后,又有多種程序設(shè)計語言在C語言的基礎(chǔ)上產(chǎn)生,如C+、Visual C+、Java、C#等。,1.2.2 C語言的標(biāo)準(zhǔn) C語言的靈活性、豐富性、可移植性很快得到了普遍的承認(rèn),接著適合于各種不同操作系統(tǒng)(UNIX,MS-DOS,CP/M-80,86等)和不同機種(字長為8bit32bit)的C語言編譯系統(tǒng)相繼出現(xiàn)。1982年美國國家標(biāo)準(zhǔn)局(ANSI)語言標(biāo)準(zhǔn)化委員會成立了一個委員會開始著手進行C語言的標(biāo)準(zhǔn)化工作,并于1983年公布了第一個C語言標(biāo)準(zhǔn)草案(83 ANSI C)。1989年,ASNI又發(fā)布了一個完整的C語言標(biāo)準(zhǔn)ANSI X3.159-1989,通常稱做“ANSI C”,簡稱“C89”。1990年,國際標(biāo)準(zhǔn)組織ISO/JEC JTC1/SC22/WG14采納了C89,做了少編輯性修改后,以國際標(biāo)準(zhǔn)ISO/IEC 9899:1990發(fā)布,通常稱其為 “C90”,它同C89基本相同。 1995年,WG14對C89做了兩處技術(shù)修訂和一個擴充。人們將其稱為“C89增補1”或“C95”。同時,WG14開始著手對C標(biāo)準(zhǔn)做全面修訂,并于1999年完成獲得通過,形成正式的C語言標(biāo)準(zhǔn),命名為ISO/IEC 9899:1999,簡稱“C99”。 本書將基于C99介紹C 語言程序設(shè)計的基本方法。目前各廠家所提供的所有C編譯系統(tǒng)都還未實現(xiàn)C99所建議的功能。為了讀者能實際運行C程序,本書所介紹的程序都是符合ASNI C標(biāo)準(zhǔn)并能在大多數(shù)C編譯系統(tǒng)通過和運行的程序。但在文字?jǐn)⑹鲋?,會介紹C99所增加的新功能,以使讀者今后能順利地過渡到用C99編程。,1.3 C語言概要,1.3.1 函數(shù) 任何一部機器都是用部件組裝而成的。計算機程序和機器一樣,也是由一些部件構(gòu)建起來的。C語言程序部件是函數(shù)。也就是說,設(shè)計C語言程序就是設(shè)計它的構(gòu)成函數(shù)。 下面舉例說明C語言程序中的函數(shù)是什么樣的。 例1.1 一個輸出一串字符的C程序。,/* 文件名:ex010101.c */ # include int main(void) printf(Programming is fun.); /* 輸出一串字符 */ return 0; /* 向操作系統(tǒng)返回一個數(shù)字0 */ ,這是一個非常簡單的C語言程序,它的執(zhí)行結(jié)果是顯示一行字符: Programming is fun. 說明: (1)這里 是一個函數(shù)。這個函數(shù)的名字為“main”。這個名字是專用的,表示這個函數(shù)是“主函數(shù)”。所謂主函數(shù),就是執(zhí)行這個程序時,由操作系統(tǒng)直接調(diào)用的函數(shù)。每一個C語言程序必須也只能有一個主函數(shù)。,int main (void) ,(2)函數(shù)名后面的圓括號用于表示參數(shù)。一般說來,用函數(shù)進行計算,需要給定參數(shù)。但是廣義的計算也可以沒有參數(shù)而只執(zhí)行一個過程。在C語言程序中,參數(shù)部分寫為“void”,表示該函數(shù)沒有參數(shù),只執(zhí)行一個過程?!皏oid”可以省寫,如程序第一行可寫為: int main() 在許多教材和程序中,可以常常見到這種形式的主函數(shù)首行。但是,C標(biāo)準(zhǔn)建議寫上void,使含義清晰。在本書的程序中都是寫成main(void) 形式的。 (3)再后面的一對花括號中的部分稱為函數(shù)體,用來表明該函數(shù)的功能是如何實現(xiàn)的。通常,函數(shù)體用一些語句表述。C語言規(guī)定語句必須用分號結(jié)束。先分析下面的語句: printf(Programming is fun.); 它的功能是調(diào)用編譯系統(tǒng)提供的函數(shù)庫中的一個函數(shù)printf(),來輸出后面的一串字符。函數(shù)printf的使用比較復(fù)雜,后面將陸續(xù)介紹。,(4)函數(shù)名前面的“int”表明函數(shù)的返回值是一個整數(shù)。有的操作系統(tǒng)(如Unix)要求在執(zhí)行一個程序后應(yīng)向系統(tǒng)返回一個整數(shù)值,如程序正常執(zhí)行和結(jié)束,應(yīng)返回0,否則返回一個非0值。因此,需要將main函數(shù)指定為int(整型),同時在函數(shù)體的最后寫一返回語句: return 0; 它的功能是向調(diào)用者(操作系統(tǒng))返回0值,表示主函數(shù)正常結(jié)束(也就是程序正常結(jié)束)。此語句必須寫在函數(shù)體的最后一行才有意義,因為只要執(zhí)行到這條語句,就表達程序正常結(jié)束,向操作系統(tǒng)返回一個0,如果程序未執(zhí)行到這個返回語句就非正常結(jié)束了,就不會向操作系統(tǒng)返回0。操作系統(tǒng)會據(jù)此作出相應(yīng)的處理。,有的操作系統(tǒng)(如DOS,Windows)并無程序必須返回整數(shù)的要求,因此,可以不指定main函數(shù)為整型。這時可在main函數(shù)的前面加上void,如 void main(void) 或 void main() 表示main函數(shù)是無類型的,不返回任何類型的值。顯然在main函數(shù)的最后也不必寫返回語句“return 0;”。讀者可以在其他教材或程序中看到這種形式的main函數(shù)。 以上兩種用法都是是合法的、有效的,編程者可以根據(jù)情況決定。為了使程序具有一般性,采用以下形式 int main(void) 并在函數(shù)體最后有“return 0;”語句。,(5)程序最前面的 # include 是一種在程序編譯之前要處理的內(nèi)容,稱為編譯預(yù)處理命令。編譯預(yù)處理命令還有一些,它們都用“#”開頭,并且不用分號結(jié)束,所以不是C語言的語句。這里的編譯預(yù)處理命令稱為文件包含命令,它的作用是在編譯之前把程序中需要使用關(guān)于系統(tǒng)定義的函數(shù)printf()的一些信息文件stdio.h包含進來。用“.h”作為后綴的文件稱為頭文件。 (6)“/* */”中的文字用于做一些說明注釋,讓讀程序的人容易讀懂。例如,注釋 /* 文件名:ex1_01.c */ 是告訴讀程序的人,這個程序的源代碼用文件ex1_01保存。而其他兩個注釋是對其左面兩條語句功能的說明。 上面的程序只由一個函數(shù)組成(在主函數(shù)中又調(diào)用了庫函數(shù)printf()。在例1.2中將介紹由兩個函數(shù)組成的程序。,例1.2 計算兩個整數(shù)(2,3)相加的結(jié)果,/* 文件名:ex010201.c */ # include int add (int ,int ); /* 聲明后面將要使用函數(shù)add() */ int main (void) int s; /* 聲明后面使用的變量s是整型的 */ s = add(2,3); /* 調(diào)用add()進行計算,并用s接收*/ printf(“The sum is:%d”, s); /* 輸出s的值 */ return 0; int add (int a,int b) /* 函數(shù)add()的定義 */ int sum; /* 定義一個整數(shù)sum,用于存放和 */ sum = a + b; /* 將a和b求和,并把結(jié)果送sum */ return sum; /* 返回sum的值到調(diào)用者 */ ,說明 (1)圖1.9表明了該程序的執(zhí)行過程。為了清晰,僅列出了執(zhí)行語句。,圖1.9 程序ex1_02的執(zhí)行過程, 經(jīng)過編譯、鏈接后的C語言程序就成為一個可執(zhí)行文件。例如,程序的ex1_02的默認(rèn)可執(zhí)行文件名為“ex1_02.exe”。若要執(zhí)行這個程序,只要在操作系統(tǒng)的命令執(zhí)行環(huán)境中打入這個文件名,系統(tǒng)就會開始執(zhí)行這個程序。對于C語言程序而言,首先從調(diào)用主函數(shù)開始。 在主函數(shù)main中,第一個語句是 s = add(2,3); 但是,這個語句的執(zhí)行要分如下步驟才能完成。 調(diào)用函數(shù)add(),同時將數(shù)據(jù)2和3分別傳送給函數(shù)add()中的變量a和b; 使用表達式a + b進行加法計算。 將和用“=”)送給函數(shù)add()中的變量sun中。注意“=”是賦值操作符,不是等號。C語言中的等號是“=”。 用return語句將sum的值返回的函數(shù)add()的調(diào)用處。 將函數(shù)add()的返回值送給主函數(shù)中的變量s。, 執(zhí)行函數(shù)printf(),輸出下面的內(nèi)容: The sun is 5 這個語句的執(zhí)行也需要如下多個步驟才能實現(xiàn): 圓括號中的引號中的“The sum is:”要求原樣輸出。 圓括號中的引號中的“%”表示后面的字符“d”是一個格式字符,要求將雙引號后面的表達式的值,按照整型數(shù)據(jù)輸出。 函數(shù)printf()將流程返回到調(diào)用處。printf()也有返回值(成功返回輸出的字符個數(shù);失敗時,返回一個負(fù)整數(shù)),但是一般不用。 執(zhí)行main()中的返回語句return,用“0”向操作系統(tǒng)送回“平安”信號。,(2)變量及其類型 本例中的s和sum都稱為變量。變量是程序中被命名的數(shù)據(jù)實體,并且它的值是可以改變的。同時,為了便于計算與存儲,C語言中程序中所使用的每個數(shù)據(jù)都被規(guī)范化了。這種數(shù)據(jù)的規(guī)范稱為數(shù)據(jù)類型。 本例中使用語句 int s; 和 int sum; 的作用就是聲明了兩個變量s和sum名字和類型(用“int”表明它們是整型數(shù)據(jù))。變量在使用之前都要先行聲明。,(3)函數(shù)的聲明 本例中的 int add(int,int ); 稱為函數(shù)聲明。函數(shù)聲明的作用是讓編譯器知道該函數(shù)的原型(包括返回類型、參數(shù)個數(shù)和類型,以便對調(diào)用語句進行語法檢查。如果定義在調(diào)用前,從定義可以直接獲得這些信息,就可以不寫聲明;如果調(diào)用在定義之前,則需要一個原型聲明說明這些信息。 對于編譯系統(tǒng)提供的庫函數(shù),它們的定義不在程序中,因此需要給出相應(yīng)的原型聲明。為了方便使用,系統(tǒng)把某些類型的庫函數(shù)的原型聲明寫在某個頭文件中,程序員只要把要求的頭文件用文件包含語句寫在程序中函數(shù)調(diào)用之前,就等于把原型聲明寫在了函數(shù)調(diào)用之前。這就是使用函數(shù)printf(),必須在其前寫一條#include 的原因。,(4)關(guān)于printf()函數(shù)的參數(shù) printf()函數(shù)的參數(shù)有兩部分:前面的用雙引號引起的部分稱為“控制串”??刂拼梢恍┳址M成,這些字符可以分成兩類:第一類字符可以直接顯示出來,第二類字符作為格式說明符使用?;蛘哒f,除了格式說明符之外的字符,都是可以直接顯示的。格式說明符是由“%”開頭,后面跟著的是格式碼。本例中的“d”就是格式碼,它后面輸出的數(shù)據(jù)按照帶符號十進制輸出。其他格式說明符將陸續(xù)介紹。,(5)關(guān)于賦值運算 在C語言中,符號“=”稱為賦值運算符,它的作用是把后面(右面)的值,送到其前(左面)的變量(左值)中。一定不要將其當(dāng)作是等號。在C語言中,等號是“=”。 例1.3 計算一個數(shù)的正弦值的C語言程序。,/* 文件名:ex010301.c */ # include include int main(void) float x; /*定義x為實型變量*/ x = sin(0.19199); /*調(diào)用sin函數(shù) */ printf(%fn,x); /*調(diào)用printf函數(shù),輸出x的值*/ ,程序的執(zhí)行結(jié)果如下:,0.190813,說明: (1)“float x;”是聲明:x是一個實型變量。 (2)“x = sin(0.19199)”可執(zhí)行一次函數(shù)調(diào)用,求出0.19199弧度的正弦值,并賦給實型變量x。sin()是一個庫函數(shù),math.h是其要求的頭文件。 (3)printf()中的格式說明符“%f”,指定一個實型格式輸出(前面介紹的%d是整型數(shù)據(jù)格式符)。通常輸出的數(shù)據(jù)在小數(shù)后有6位數(shù)字;小數(shù)點前的數(shù)字位數(shù)不指定,根據(jù)實際值的位數(shù)輸出。格式說明符的類型要與后面要輸出的數(shù)據(jù)類型相一致。 (4)printf()中的“n”稱為轉(zhuǎn)義字符序列,前面加了反斜桿后,“n”不再作為字符,而是作為一條換行命令使用。轉(zhuǎn)義字符還有一些,以后陸續(xù)介紹。,從這一小節(jié)可以得出如下結(jié)論: C語言程序是由函數(shù)組成的。 設(shè)計C語言程序時,一個必須設(shè)計的函數(shù)是主函數(shù)。C語言的執(zhí)行是從系統(tǒng)調(diào)用主函數(shù)開始的。 主函數(shù)的部分功能也可以通過其他子函數(shù)補充實現(xiàn)。子函數(shù)應(yīng)當(dāng)首選從函數(shù)庫中的函數(shù);函數(shù)庫中沒有時??梢钥紤]自行設(shè)計。 使用庫函數(shù)時,要用文件包含命令將需要的頭文件包含到程序中調(diào)用該庫函數(shù)之前。,1.3.2 C語言的標(biāo)準(zhǔn) 由前一小節(jié)中的例子可以看出,在C語言程序中,函數(shù)下面的組成單位是語句。在C99中,基本的語句有表達式語句、流程控制語句和塊語句。 1. 表達式語句 C語言程序的具體計算過程是由表達式完成的。表達式是由運算符(如上述+,=等)、變量(如上述s,sum,a,b,x等)和常量(如上述2,3,0.19199等)組成。前面使用過的 s = add(2,3) sum = a + b x=sin(0.19199) 都是表達式。表達式加上語句結(jié)束符(分號)就構(gòu)成表達式語句。學(xué)習(xí)C語言程序設(shè)計,必須掌握正確地使用變量、常量和運算符的表示方法和使用規(guī)則。 變量和常量的使用涉及它們的數(shù)據(jù)類型、表示(命名)規(guī)則等,后面要專門介紹。,C語言中的運算符種類很多,正確地使用這些運算符,有三點需要注意: 它們的含義。特別要區(qū)分一個運算符符號在C語言中和在普通數(shù)學(xué)中的意義的不同。如“=”。 優(yōu)先級,即在一個表達式中存在多個運算符時,進行運算的先后順序。 結(jié)合性,即在一個表達式中有多個優(yōu)先級別相同的運算符時,先進行哪個運算符的運算。例如,在表達式2*3/5(在C語言中,“*”為乘運算符?!?”為除運算符)中,先進行除呢,還是先進行乘。在這個表達式中,好像對運算結(jié)果沒有影響,但有時是有影響的。 關(guān)于這些問題,后面將專門介紹。,2. 流程控制語句 一般說來,程序中的語句是按照書寫順序執(zhí)行的。但是,有些情況下,需要改變默認(rèn)的執(zhí)行順序,例如像圖1.10(a)那樣要從兩個或多個語句中挑選一個語句執(zhí)行,或者像圖1.10(b)那樣要重復(fù)執(zhí)行某一個語句或語句塊。前者稱為選擇控制,后者稱為重復(fù)控制。,(a)選擇結(jié)構(gòu) (b)重復(fù)結(jié)構(gòu) 圖1.10 兩種基本的流程控制結(jié)構(gòu),下面給出兩個實例。 例1.4 由鍵盤輸入兩個數(shù),輸出其中的大數(shù)。 本例中函數(shù)max2()的執(zhí)行過程如圖1.11所示。,圖1.11 函數(shù)max2()的執(zhí)行過程,程序如下:,/* 文件名:ex010401.c */ #include float max2(float x,float y) float max; if(x = y) /* 選擇判斷 */ max = x; /* 條件滿足進行的運算*/ else max = y; /* 條件不符進行的運算*/ printf(“The max is:%f”,max); int main(void) float a,b; printf(“Input two real numbers:n”); /* 輸入提示 */ scanf(“%f%f”, ,說明: (1)本例的函數(shù)max2()中有一個選擇結(jié)構(gòu),條件是“x = y”。滿足該條件,則執(zhí)行運算max = x;不滿足,則執(zhí)行運算max = y。這樣,就在max中保存了x和y中的大者。 (2)在主函數(shù)中,函數(shù)scanf(“%f %f”,&a,&b)的功能是從鍵盤上輸入兩個實數(shù),分別存放到地址&a和&b中。地址&a和&b是變量a和b地址,“&”是一個運算符。用于計算其后面變量的地址。 (3)在函數(shù)scanf(“%f%f”,&a,&b)中,“%f”表示要輸入的數(shù)據(jù)是實型數(shù)據(jù)。也就是說,格式說明符的類型,要與輸入數(shù)據(jù)的類型一致。另外,鍵入的兩個數(shù)據(jù)之間應(yīng)當(dāng)以空格、制表符(按Tab鍵)或回車分隔。 程序運行時的情形如下:,Input two real numbers: 1.235 2.345 The max is: 2.345,例1.5 求的值。 程序如下:,/* 文件名:ex010501.c */ #include int sigma(int n) int i = 0,sum = 0; while(i = n) i +; sum = sum + i; renturn sum; int main(void) int m,total; scanf(“%d”, ,說明: (1)聲明,int i = 0,sum = 0;,有兩個功能:一是定義了兩個整型變量;二是對兩個整型變量設(shè)定了初值。這稱為變量的初始化。變量在沒有初始化時并且也沒有執(zhí)行賦值操作之前,其值是不確定的。為了避免使用這些不確定的值,應(yīng)當(dāng)盡量在變量定義的同時對其進行初始化。 一般說來,存放和的變量的初始值應(yīng)當(dāng)為0,而存放積的變量的初始值應(yīng)當(dāng)為1。,(2)在本例中,函數(shù)sigma()用來計算。計算的方法 是: 先設(shè)置sum的初值為0、i的初值為0。 用表達式“i +”將自增1,相當(dāng)于執(zhí)行操作:i = i + 1。 每執(zhí)行一次i的自增1,執(zhí)行一次sum = sum + i。 用流程圖表示如圖1.12所示。,圖1.12 函數(shù)sigma()的執(zhí)行過程,除了上述兩種控制語句外,C語言還提供了其他一些控制語句,以后會專門介紹。,3. 塊語句 塊語句也稱為復(fù)合語句,就是用一對花括號將一組語句括起來。在一個塊語句中可以包括若干聲明和若干語句。在例1.8的函數(shù)sigma()中,while下面的用花括號括起的兩個語句,就組成一個塊語句。塊語句在語法上相當(dāng)于一條語句。因此,當(dāng)語法上需要一個語句,而一個語句又不能滿足需要時,就必須使用塊語句。,1.3.3 名字與聲明 1. 標(biāo)識符與關(guān)鍵字 標(biāo)識符也稱為名稱。變量的名字、函數(shù)的名字、文件的名字等,都是關(guān)鍵字。在C語言程序中,所使用的標(biāo)識符應(yīng)當(dāng)符合如下的詞法規(guī)則: (1)標(biāo)識符是大小寫字母、數(shù)字和下劃線組成的序列,但不能以數(shù)字開頭。例如,下面是合法的C標(biāo)識符: a A Ab _Ax _aX A_x abcd 但是下列不是合法的C標(biāo)識符: 5_A(數(shù)字打頭) A-3(含非法字符) (2)C語言區(qū)別同一字母的大小寫,如abc與abC被看作識不同的名標(biāo)識符。 (3)C89要求C編譯器能識別的標(biāo)識符長度為不少于31個有效字符,C99要求C編譯器能識別的標(biāo)識符長度為不少于63個有效字符。一個標(biāo)識符中超過了這個長度的字符可能會不被辨認(rèn)。例如在符合C99的系統(tǒng)中,當(dāng)兩個標(biāo)識符的前63個字符都相同時,不管后面的有效字符是否相同,都可能被當(dāng)作同一個標(biāo)識符。,(4)普通標(biāo)識符不能使用對于系統(tǒng)有特殊意義的名稱。這些對系統(tǒng)有特殊意義的名稱稱為關(guān)鍵字。表1.1為C99關(guān)鍵字。,表1.1 C99關(guān)鍵字,在一個程序中,往往要使用大量的名字。大量的名字的使用,可能會造成名字的沖突和使用錯誤。為此,除了上述詞法規(guī)則外,人們還總結(jié)了在程序中使用“好”名字的一些原則: (1)盡量做到“見名知義”,以增加程序的可讀性。 (2)盡量避免使用容易混淆的字符,例如 0(數(shù)字)-O(大寫字母)-o(小寫字母) 1(數(shù)字)-I(大寫字母)-i(小寫字母) 2(數(shù)字)-Z(大寫字母)-z(小寫字母) (3)名字不要太短,一般函數(shù)名盡量使用動賓結(jié)構(gòu),如PrintCalendar、IsPrime等。 (4)許多國外的Windows程序員還采用匈牙利人Charles Simonyi提出的將類型作為變量名前綴的命名方法通常稱為匈牙利命名法。表1.2為部分常用匈牙利前綴。,表1.2 部分常用匈牙利前綴,2. 聲明 在程序中,有許多東西是需要系統(tǒng)為其開辟存儲空間的,例如變量、函數(shù)類型定義等。它們都有自己的名字,并且要在內(nèi)存中獨立存儲,為此可以將它們稱做程序?qū)嶓w。那么,如何建立它們的名字與實體之間的關(guān)聯(lián)呢?這就是聲明的作用。 聲明也稱為說明,它的作用非常重要,包括如下一些: 告訴編譯器,一個名字是與哪個實體聯(lián)系,不能張冠李戴。 告訴編譯器,也要程序員明白這個實體的類型。 告訴編譯器,這個實體什么時候建立?在什么范圍內(nèi)可以使用? 前面已經(jīng)使用過了變量和函數(shù)的聲明。所以,例1.2中的 int s; 就是建立變量名s與它的實體之間的關(guān)聯(lián)。 在一個語句塊中關(guān)于聲明的進一步用法,后面還要陸續(xù)介紹。目前要牢記的是,在使用一個程序?qū)嶓w之前,一定要讓編譯器知道該程序?qū)嶓w的屬性。 在C99之前,對變量和函數(shù)的聲明不作為語句(盡管它們也是用分號結(jié)尾),它們必須出現(xiàn)在C語句的前面(聲明的位置必須集中寫在語句之前)。C99改變了這一做法,它吸取了C+的做法,聲明不必集中放在執(zhí)語句之前,可以出現(xiàn)在程序中的任意行。這樣,C語句就有執(zhí)行語句和非執(zhí)行語句之分。聲明是非執(zhí)行語句,表達式語句和流程控制語句是執(zhí)行語句。,1.3.4 變量及其賦值 1. 變量 變量(variable)是一種程序?qū)嶓w。它具有一個值,并且這個值是可以通過程序操作改變的。 2. 變量的賦值運算 在C語言中,符號“=”稱為賦值運算符,它連接了左右兩個操作數(shù)(即運算量):右操作數(shù)也稱右值,可以是一個表達式,左操作數(shù)也稱左值(lvalue),只能是變量。賦值操作的過程是把右操作數(shù)的值先轉(zhuǎn)換成左操作數(shù)(變量)的類型,并把該值存放到左操作數(shù)(變量)中。例如,int a; a = 2.6; printf(“%d”,a);,結(jié)果為,2,這是因為計算機在執(zhí)行上述語句時,首先將2.6舍去小數(shù)部分截尾(truncation)成整型,賦值給變量a。,應(yīng)當(dāng)注意,賦值運算符是“=”。這個符號不是等號。例如,int a = 2, b = 3; a = a + b;,的操作是把表達式a + b的值(2 + 3)送到(賦值給)變量a。即經(jīng)上述操作后,變量的a的值由2變?yōu)?。圖1.13表明這一操作過程:先計算a + b的值,然后把這個結(jié)果送到變量a中。于是,變量a的值由2變?yōu)?。,圖1.13 a = a + b的操作過程,賦值運算符具有“自右至左” 的結(jié)合性,例如,int a = 0,b = 0,c = 0; a = b = c = 5 + 3;,相當(dāng)于,int a,b,c; a = (b =(c = (5 + 3));,即先計算把5 + 3 的值,得8,賦值給變量c;再把變量c的值(8)賦值給變量b;最后把變量b的值(8)賦值給變量a。圖1.14表明這一操作過程。執(zhí)行的結(jié)果,a、b、c三個變量中的值均為8。也就是說,從一個變量向另一個變量賦值后,原來變量中的值并不會消失或改變。所以,賦值操作相當(dāng)于拷貝,而不是移動。,(c) 執(zhí)行操作b = c = 5 + 3后變量a、b、c的值,(b)執(zhí)行操作c = 5 + 3后變量a、b、c的值,(a) 操作前變量a、b、c的值,(d)執(zhí)行操作a = b = c = 5 + 3后變量a、b、c的值,圖1.14 a = b = c = 5 + 3的操作過程,1.3.5 算術(shù)運算 算術(shù)運算是一切計算的基礎(chǔ),也是大家都認(rèn)為非常熟悉的。但是對于高級程序設(shè)計語言尤其是C語言中的算術(shù)運算符,還需要有一個再學(xué)習(xí)的過程。C語言中的算術(shù)運算符與普通數(shù)學(xué)中的算術(shù)運算符有如下一些不同。 運算符符號有所不同。 種類有所不同。 結(jié)合性可能會破壞交換率。 1. C語言的基本算術(shù)運算符 表1.3為C語言中的基本算術(shù)運算符及其說明。,表1.3 C語言中的基本算術(shù)運算符及其說明,說明: (1)這幾個算術(shù)運算符的運算對象有兩個,所以也稱為雙目算術(shù)運算符。 (2)這幾個算術(shù)運算符的優(yōu)先級別為:*、/、%高于+、-。并且它們都比賦值運算符的優(yōu)先級別高。所以,在一個表達式中有賦值運算符,也有算術(shù)運算符時,不使用圓括號,可以先進行算術(shù)運算,后進行賦值運算。 (3)這幾個算術(shù)運算符均為“自左至右”。 (4)需要特別注意的是整數(shù)除和模運算的結(jié)果都是整 數(shù)。 例1.6 分析下面的程序的執(zhí)行結(jié)果。,/* 文件名:ex010601.c */ #include int main(void) printf (“300 * 2 / 3 = %dn“,300 * 2 / 3); printf (“2 / 3 * 300 = %dn“,2 / 3 * 300); return 0; ,觀察上面的程序,按照交換率,似乎它們的計算結(jié)果應(yīng)該相同。但是,非常遺憾!結(jié)果完全不同:,300 * 2 / 3 = 200 2 / 3 * 300 = 0,原因在于算術(shù)運算符具有自左至右的結(jié)合性,即對于第1個表達式語句,執(zhí)行的順序為: 300 * 2 = 600,600 / 3 = 200 對于第2個表達式語句,執(zhí)行的順序則為: 2 / 3 = 0(注意是整數(shù)相除),0 * 300 = 0 因此,使用整數(shù)除,應(yīng)當(dāng)特別小心。,2. 自反算術(shù)賦值運算符 前面介紹過這樣的賦值表達式: a = a + b 它的作用是將變量a的值加上變量b的值,再送回到變量a中?;蛘哒f是將變量a的值增加一個變量b的值。這樣類似的運算很多。為此C語言為這種運算提供了一種簡潔形式: a + = b 這樣,就可以用一個復(fù)合運算符代替原來的兩個運算符。這種復(fù)合運算符稱為自反算術(shù)賦值運算符。除自反加以外,還有下列一些: - = (自反減賦值) * = (自反乘賦值) / = (自反除賦值) % = (自反模賦值) 自反算術(shù)賦值的結(jié)合方向與賦值運算符一樣,為自右向左。另外,它的優(yōu)先級別相當(dāng)?shù)?,與賦值是同一級別。例如表達式語句:,c = b * = a + 2;,相當(dāng)于如下兩個表達式語句:,b = b * (a + 2); c = b;,3. 自加和自減運算 自反算術(shù)賦值運算中有兩種更特殊的情況,即: i = i + 1 即 i += 1 和 i = i - 1即 i -= 1 這是兩種極為常用的操作。把i稱為計數(shù)器,用來記錄完成某一工作的次數(shù)。C語言為它們專門提供了兩個更簡潔的運算符: i +或+ i 和 i -或- i 前一種(i +和i -)稱為后綴形式;后一種(+ i和- i)稱為前綴形式,都稱為自加或自減運算符。,例如:,int i = 5; i +; y = i;,與,int i = 5; + i; y = i;,兩段程序執(zhí)行的結(jié)果i值都為6,y的值也都為6。但是把它們引用在表達式中就表現(xiàn)出區(qū)別了。例如:,int i = 5; x = i +; /* 相當(dāng)于 x = i; i = i + 1;*/ y = i;,的執(zhí)行結(jié)果為:x為5,y為6。即后綴方式是“先引用后增值”。而,int i = 5; x = +i; /* 相當(dāng)于 x = i = i + 1; */ y = i;,的執(zhí)行結(jié)果為:x為6,y為6。即前綴方式是“先增值后引用”。 自加和自減運算符的結(jié)合方向是“自右至左”,它的運算對象只能是整型變量而不能是表達式或常數(shù)。例如:5 +或(x + y) +是錯誤的。,4. 正負(fù)號運算符 正負(fù)號運算符為+(正號)和-(負(fù)號),它們是一元運算符。例如,-5和+65。它們的優(yōu)先級別高于*、/運算符。例如: -a * b 先使a變符號再乘以b。其實正負(fù)號運算相當(dāng)于一次算術(shù)賦值運算,例如: -a 相當(dāng)于a = 0 a -a * b 相當(dāng)于(0 - a) * b 它的結(jié)合方向為自右至左。綜上所述,凡賦值運算符及其變種(包括自反算術(shù)賦值運算符、自加自減運算符和正負(fù)號運算符)的結(jié)合方向都是自右至左的。,1.3.6 賦值類運算符的副作用及限制 在程序設(shè)計中,效率與易讀性是一對主要矛盾。人們?yōu)榱颂岣叱绦虻男?,往往要使用技巧把程序?qū)懙帽M可能簡潔一些。但這樣就降低了程序的可讀性和可理解性??勺x性差的后果是易于隱藏錯誤,難于糾正錯誤,不易維護,降低了程序的可靠性。鑒于“軟件危機”的教訓(xùn),現(xiàn)代人們進行程序設(shè)計時要遵守的基本規(guī)范是:可靠性第一,效率第二。為保證可靠性第一,就要清晰易讀第一。這就要求進行程序設(shè)計時,把程序?qū)懙们逦锥恍3鯇W(xué)者從一開始就應(yīng)當(dāng)培養(yǎng)這個良好的程序設(shè)計風(fēng)格。 C語言允許在一個表達式中使用一個以上的賦值類運算符(包括賦值符,自反算術(shù)賦值符,自加、自減運算符等)。這種靈活性在給程序帶來簡潔性的同時也會引起副作用。這種副作用表現(xiàn)在兩個方面. 1. 費解、易于誤解對人的副作用 下面是容易引起誤解的兩個例子。 c = b* = a + 2;容易誤解為 b *= a; c = b + 2; x = i + +j;應(yīng)該理解為x =(i + +) + j呢?還是x = i +(+ + j)呢?實際上C編譯
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 離婚房產(chǎn)居住權(quán)保留與子女撫養(yǎng)權(quán)及共同債務(wù)分擔(dān)合同
- 木材物流運輸保險理賠與環(huán)境保護合同
- 公共建筑能耗監(jiān)控平臺升級項目合同補充條款
- TTT培訓(xùn)技巧精要
- 生物制藥純化技術(shù)專利授權(quán)與市場推廣及研發(fā)合同
- 海外留學(xué)簽證代辦服務(wù)及安全保障合同
- 外貿(mào)公司單證員勞務(wù)派遣及市場調(diào)研合同
- 國際工程項目合同風(fēng)險評估與咨詢合同
- 互聯(lián)網(wǎng)股權(quán)收益互換及合作運營協(xié)議
- 專利許可使用補充協(xié)議
- NB/T 10956-2022礦用往復(fù)式注漿泵
- GB/T 6417.1-2005金屬熔化焊接頭缺欠分類及說明
- GB/T 26251-2010氟和氟氮混合氣
- 無機化學(xué)氧族元素課件
- 儲煤場管理制度(6篇)
- 線描畫基本功教學(xué)課件
- 齒軌卡軌車課件
- 醫(yī)院工會經(jīng)費使用與管理辦法、制度規(guī)則
- 重癥胰腺炎(1)課件
- 克拉潑改進型電容三點式振蕩器
- 介入導(dǎo)管室耗材準(zhǔn)備及管理
評論
0/150
提交評論