C語言程序設(shè)計課件_第1頁
C語言程序設(shè)計課件_第2頁
C語言程序設(shè)計課件_第3頁
C語言程序設(shè)計課件_第4頁
C語言程序設(shè)計課件_第5頁
已閱讀5頁,還剩1269頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

C語言程式設(shè)計

第1章

C語言概述1.1C語言出現(xiàn)的歷史背景1.2C語言的特點1.3

簡單的C程式介紹1.4C程式的上機步驟1.5

習(xí)題1.1C語言出現(xiàn)的歷史背景C語言是國際上廣泛流行的電腦高級語言,既可用來寫系統(tǒng)軟體,也可用來寫應(yīng)用軟體。以下軟體是使用C語言開發(fā)的:DOSWINDOWSMicrosoftVisualStudioUNIX應(yīng)用軟體及遊戲

C語言的發(fā)展C語言的根源:ALGOL60(演算法語言,AlgorithmicLanguage)。1960年出現(xiàn)的ALGOL60是一種面向問題的高級語言,它離硬體比較遠,不宜用來編寫系統(tǒng)程式。1963年英國的劍橋大學(xué)推出了CPL(combinedprogramminglanguage)語言。CPL語言在ALGOL60的基礎(chǔ)上接近硬體一些,但規(guī)模比較大,難以實現(xiàn)。B語言:1967年英國劍橋大學(xué)的MatinRichards對CPL語言做了簡化,推出了BCPL(basiccombinedprogramminglanguage)語言。1970年美國貝爾實驗室的KenThompson以BCPL語言為基礎(chǔ),又做了進一步簡化,設(shè)計出了很簡單的而且很接近硬體的B語言(取BCPL的第一個字母),並用B語言寫了第一個UNIX操作系統(tǒng),在PDP

7上實現(xiàn)。1971年在PDP

11/20上實現(xiàn)了B語言,並寫了UNIX操作系統(tǒng)。但B語言過於簡單,功能有限。C語言:1972年至1973年間,貝爾實驗室的D.M.Ritchie在B語言的基礎(chǔ)上設(shè)計出了C語言(取BCPL的第二個字母)。C語言既保持了BCPL和B語言的優(yōu)點(精練,接近硬體),又克服了它們的缺點(過於簡單,數(shù)據(jù)無類型等)。最初的C語言只是為描述和實現(xiàn)UNIX操作系統(tǒng)提供一種工作語言而設(shè)計的。1973年,K.Thompson和D.M.Ritchie兩人合作把UNIX的90%以上用C改寫,即UNIX第5版。原來的UNIX操作系統(tǒng)是1969年由美國的貝爾實驗室的K.Thompson和D.M.Ritchie開發(fā)成功的,是用組合語言寫的。C語言改進:C語言多次做了改進,但主要還是在貝爾實驗室內(nèi)部使用。直到1975年UNIX第6版公佈後,C語言的突出優(yōu)點才引起人們的普遍注意。1977年出現(xiàn)了不依賴於具體機器的C語言編譯文本《可移植C語言編譯程序》,使C移植到其他機器時所需做的工作大大簡化了,這也推動了UNIX操作系統(tǒng)迅速地在各種機器上實現(xiàn)。例如VAX、AT&T等電腦系統(tǒng)都相繼開發(fā)了UNIX。隨著UNIX的日益廣泛使用,C語言也迅速得到推廣。C語言和UNIX可以說是一對孿生兄弟,在發(fā)展過程中相輔相成。1978年以後,C語言已先後移植到大、中、小、微型機上,已獨立於UNIX和PDP了?,F(xiàn)在C語言已風(fēng)靡全世界,成為世界上應(yīng)用最廣泛的幾種電腦語言之一。

以1978年發(fā)表的UNIX第7版中的C編譯程序為基礎(chǔ),BrianW.Kernighan和DennisM.Ritchie(合稱K&R)合著了影響深遠的名著《TheCProgrammingLanguage》,這本書仲介紹的C語言成為後來廣泛使用的C語言版本的基礎(chǔ),它被稱為標(biāo)準(zhǔn)C。1983年,美國國家標(biāo)準(zhǔn)化協(xié)會(ANSI)根據(jù)C語言問世以來各種版本對C的發(fā)展和擴充,制定了新的標(biāo)準(zhǔn),稱為ANSIC。ANSIC比原來的標(biāo)準(zhǔn)C有了很大的發(fā)展。K&R在1988年修改了他們的經(jīng)典著作《TheCProgrammingLanguage》,按照ANSIC標(biāo)準(zhǔn)重新寫了該書。1987年,ANSI又公佈了新標(biāo)準(zhǔn)—87ANSIC。1990年,國際標(biāo)準(zhǔn)化組織ISO(InternationalStandardOrganization)接受87ANSIC為ISOC的標(biāo)準(zhǔn)(ISO9899—1990)。目前流行的C編譯系統(tǒng)都是以它為基礎(chǔ)的。本書的敘述基本上以ANSIC為基礎(chǔ)。目前廣泛流行的各種版本C語言編譯系統(tǒng)雖然基本部分是相同的,但也有一些不同。在微型機上使用的有MicrosoftC、TurboC、QuickC、BORLANDC等,它們的不同版本又略有差異。1.2C語言的特點(1)語言簡潔緊湊,使用方便、靈活。C語言一共只有32個關(guān)鍵字,9種控制語句,程式書寫形式自由,主要用小寫字母表示,壓縮了一切不必要的成分。

(2)運算符豐富。C的運算符包含的範(fàn)圍很廣泛,共有34種運算符。C把括弧、賦值、強制類型轉(zhuǎn)換等都作為運算符處理,從而使C的運算類型極其豐富,運算式類型多樣化。靈活使用各種運算符可以實現(xiàn)在其他高級語言中難以實現(xiàn)的運算。(3)數(shù)據(jù)結(jié)構(gòu)豐富,具有現(xiàn)代化語言的各種數(shù)據(jù)結(jié)構(gòu)。C的數(shù)據(jù)類型有整型、實型、字元型、數(shù)組類型、指針類型、結(jié)構(gòu)體類型、共用體類型等。能用來實現(xiàn)各種複雜的數(shù)據(jù)結(jié)構(gòu)(如鏈表、樹、棧等)的運算。尤其是指針類型數(shù)據(jù),使用起來比PASCAL更為靈活、多樣。(4)具有結(jié)構(gòu)化的控制語句(如if…else語句、while語句、do…while語句、switch語句、for語句)。用函數(shù)作為程式的模組單位,便於實現(xiàn)程式的模組化。C是良好的結(jié)構(gòu)化語言,符合現(xiàn)代編程風(fēng)格的要求。(5)語法限制不太嚴(yán)格,程式設(shè)計自由度大。例如對數(shù)組下標(biāo)越界不做檢查,由程式編寫者自己保證程式的正確。對變數(shù)的類型使用比較靈活,例如整型數(shù)據(jù)與字元型數(shù)據(jù)可以通用。一般的高級語言語法檢查比較嚴(yán),能檢查出幾乎所有的語法錯誤。而C語言允許程式編寫者有較大的自由度,因此,放寬了語法檢查。程式員應(yīng)當(dāng)仔細檢查程式,保證其正確,而不要過分依賴C編譯程序去查錯。編一個正確的C程式可能會比編一個其他高級語言程式難一些。(6)C語言能進行位(bit)操作,能實現(xiàn)組合語言的大部分功能,可以直接對硬體進行操作。因此C既具有高級語言的功能,又具有低級語言的許多功能,可用來寫系統(tǒng)軟體。C語言的這種雙重性,使它既是成功的系統(tǒng)描述語言,又是通用的程式設(shè)計語言。有人把C稱為“高級語言中的低級語言”或“中級語言”,意為兼有高級和低級語言的特點。按此觀點可將各語言分類如下:高級:BASIC,FORTRAN,COBOL(COmmonBusiness-OrientedLanguage面向商業(yè)的通用語言),PASCAL,Ada,Modula-2;中級:C,FORTH,宏彙編;低級:組合語言一般仍習(xí)慣將C語言稱為高級語言,因為C程式也要通過編譯、連接才能得到可執(zhí)行的目標(biāo)程式,這是和其他高級語言相同的。

從掌握語言的難易程度來看,C語言比其他語言難一些。BASIC是初學(xué)者入門的較好的語言,F(xiàn)ORTRAN也比較好掌握。對科學(xué)計算多用FORTRAN或PL/Ⅰ;對商業(yè)和管理等數(shù)據(jù)處理領(lǐng)域,用COBOL為宜。C語言雖然也可用於科學(xué)計算和管理領(lǐng)域,但並不理想,C的特長不在這裏。對操作系統(tǒng)和系統(tǒng)實用程式以及需要對硬體進行操作的場合,用C語言明顯地優(yōu)越於其他高級語言,有的大型應(yīng)用軟體也用C語言編寫。從教學(xué)角度,由於PASCAL是世界上第一個結(jié)構(gòu)化語言,而曾被認(rèn)為是電腦專業(yè)的比較理想的教學(xué)語言。目前在數(shù)據(jù)結(jié)構(gòu)等課程中一般用PASCAL語言舉例。到目前為止基本上只是教學(xué)語言。C語言也是理想的結(jié)構(gòu)化語言,且描述能力強,同樣適於教學(xué)。操作系統(tǒng)課程多結(jié)合UNIX講解,而UNIX與C不可分,因此,C語言已經(jīng)成為被廣泛使用的教學(xué)語言。C除了能用於教學(xué)外,還有廣泛的應(yīng)用領(lǐng)域,因此更有生命力。PASCAL和其他高級語言的設(shè)計目標(biāo)是通過嚴(yán)格的語法定義和檢查來保證程式的正確性,而C則是強調(diào)靈活性,使程式設(shè)計人員能有較大的自由度,以適應(yīng)寬廣的應(yīng)用面??傊?,C語言對程式員要求較高。程式員使用C語言編寫程式會感到限制少,靈活性大,功能強,可以編寫出任何類型的程式。C語言已不僅用來編寫系統(tǒng)軟體,也用來編寫應(yīng)用軟體。1.3簡單的C程式介紹下麵先介紹幾個簡單的C程式,然後從中分析C程式的特性。例1.1main(){printf("ThisisaCprogram.\n");}

本程式的作用是輸出以下一行資訊:Thisisacprogram.

其中main表示“主函數(shù)”。每一個C程式都必須有一個main函數(shù)。函數(shù)體由大括弧{}括起來。本例中主函數(shù)內(nèi)只有一個輸出語句,printf是C語言中的輸出函數(shù)(詳見第4章)。雙引號(雙括?。﹥?nèi)的字串原樣輸出?!癨n”是換行符,即在輸出“Thisisacprogram.”後回車換行。語句最後有一分號。例1.2main()/*求兩數(shù)之和*/{inta,b,sum;/*這是定義變數(shù)*/a=123;b=456;/*以下3行為C語句*/sum=a+b;printf("sumis%d/n",sum);}

本程式的作用是求兩個整數(shù)a和b之和sum。/*……*/表示注釋部分,為便於理解,我們用漢字表示注釋,當(dāng)然也可以用英語或漢字拼音作注釋。注釋只是給人看的,對編譯和運行不起作用。注釋可以加在程式中任何位置。第2行是聲明部分,定義變數(shù)a和b,指定a和b為整型(int)變量。第3行是兩個賦值語句,使a和b的值分別為123和456。第4行使sum的值為a+b,第5行中“%d”是輸入輸出的“格式字串”,用來指定輸入輸出時的數(shù)據(jù)類型和格式(詳見第4章),“%d”表示“以十進位整數(shù)形式輸出”。在執(zhí)行輸出時,此位置上代以一個十進位整數(shù)值。printf函數(shù)中括弧內(nèi)最右端sum是要輸出的變數(shù),現(xiàn)在它的值為579(即123+456之值)。因此輸出一行資訊為sumis579.例1.3main()/*主函數(shù)*/{inta,b,c;/*聲明部分,定義變量*/scanf("%d,%d“,&a,&b);/*輸入變量a和b的值*/c=max(a,b);/*調(diào)用max函數(shù),將得到的值賦給c*/printf("max=%d",c);/*輸出c的值*/}intmax(intx,inty)/*定義max函數(shù),函數(shù)值為整型,形式參數(shù)x,y為整型*/{intz;/*max函數(shù)中的聲明部分,定義本函數(shù)中用到的變量z為整型*/if(x>y)z=x;elsez=y;return(z);/*將z的值返回,通過max帶回調(diào)用處*/}

本程式包括兩個函數(shù):主函數(shù)main和被調(diào)用的函數(shù)max。max函數(shù)的作用是將x和y中較大者的值賦給變數(shù)z。return語句將z的值返回給主調(diào)函數(shù)main。返回值是通過函數(shù)名max帶回到main函數(shù)的調(diào)用處。main函數(shù)中的scanf是“輸入函數(shù)”的名字(scanf和printf都是C系統(tǒng)提供的標(biāo)準(zhǔn)輸入輸出函數(shù))。程式中scanf函數(shù)的作用是輸入a和b的值。&a和&b中的“&”的含義是“取地址”,此scanf函數(shù)的作用是將兩個數(shù)值分別輸入到變數(shù)a和b的地址所標(biāo)誌的單元中,也就是輸入給變數(shù)a和b。這種形式是與其他語言不同的。它相當(dāng)於BASIC語言中的INPUTa,b或PASCAL語言中的Read(a,b)。&a和&b前面的“%d,%d”的含義與前相同,只是現(xiàn)在用於“輸入”。它指定輸入的兩個數(shù)據(jù)按十進位整數(shù)形式輸入。main函數(shù)中第4行為調(diào)用max函數(shù),在調(diào)用時將實際參數(shù)a和b的值分別傳送給max函數(shù)中的形式參數(shù)x和y。經(jīng)過執(zhí)行max函數(shù)得到一個返回值(即max函數(shù)中變數(shù)z的值),把這個值賦給變數(shù)c。然後輸出c的值。printf函數(shù)中雙引號內(nèi)的“max=%d”,在輸出時,其中“%d”將由c的值取代之,“max=”原樣輸出。程式運行情況如下:8,5

(輸入8和5給a和b)max=8(輸出c的值)

本例用到了函數(shù)調(diào)用、實際參數(shù)和形式參數(shù)等概念,我們只做了很簡單的解釋。讀者如對此不大理解,可以先不予以深究,在學(xué)到以後有關(guān)章節(jié)時,問題自然迎刃而解。通過以上幾個例子,可以看到:(1)C程式是由函數(shù)構(gòu)成的。一個C根源程式至少包含一個main函數(shù),也可以包含一個main函數(shù)和若干個其他函數(shù)。因此,函數(shù)是C程式的基本單位。被調(diào)用的函數(shù)可以是系統(tǒng)提供的庫函數(shù)(例如printf和scanf函數(shù)),也可以是用戶根據(jù)需要自己編制設(shè)計的函數(shù)(例如,例1.3中的max函數(shù))。C的函數(shù)相當(dāng)於其他語言中的副程式,用函數(shù)來實現(xiàn)特定的功能。程式中的全部工作都是由各個函數(shù)分別完成的。

編寫C程式就是編寫一個個函數(shù)。C的函數(shù)庫十分豐富,ANSIC建議的標(biāo)準(zhǔn)庫函數(shù)中包括100多個函數(shù),TurboC和MSC4.0提供300多個庫函數(shù)。C的這種特點使得容易實現(xiàn)程式的模組化。(2)一個函數(shù)由兩部分組成:①函數(shù)的首部,即函數(shù)的第一行。包括函數(shù)名、函數(shù)類型、函數(shù)屬性、函數(shù)參數(shù)(形參)名、參數(shù)類型。例如,例1.3中的max函數(shù)的首部為intmax(intx,

inty)↓↓↓↓

↓↓函數(shù)類型函數(shù)名函數(shù)參數(shù)類型函數(shù)參數(shù)名函數(shù)參數(shù)類型函數(shù)參數(shù)名

一個函數(shù)名後面必須跟一對圓括弧,函數(shù)參數(shù)可以沒有,如main()。②函數(shù)體,即函數(shù)首部下面的大括弧{……}內(nèi)的部分。如果一個函數(shù)內(nèi)有多個大括弧,則最外層的一對{}為函數(shù)體的範(fàn)圍。函數(shù)體一般包括:聲明部分:在這部分中定義所用到的變數(shù),如例1.3中main函數(shù)中的“inta,b,c;”。在第8章中還將會看到,在聲明部分中要對所調(diào)用的函數(shù)進行聲明。執(zhí)行部分:由若干個語句組成。當(dāng)然,在某些情況下也可以沒有聲明部分(例如,例1.1)。甚至可以既無聲明部分,也無執(zhí)行部分。如:dump(){}它是一個空函數(shù),什麼也不幹,但這是合法的。(3)一個C程式總是從main函數(shù)開始執(zhí)行的,而不論main函數(shù)在整個程式中的位置如何(main函數(shù)可以放在程式最前頭,也可以放在程式最後,或在一些函數(shù)之前,在另一些函數(shù)之後)。(4)C程式書寫格式自由,一行內(nèi)可以寫幾個語句,一個語句可以分寫在多行上。C程式?jīng)]有行號.(5)每個語句和數(shù)據(jù)定義的最後必須有一個分號。分號是C語句的必要組成部分。例如:c=a+b;分號不可少。即使是程式中最後一個語句也應(yīng)包含分號(這是和PASCAL語言不同的)。(6)C語言本身沒有輸入輸出語句。輸入和輸出的操作是由庫函數(shù)scanf和printf等函數(shù)來完成的。C對輸入輸出實行“函數(shù)化”。由於輸入輸出操作牽涉到具體的電腦設(shè)備,把輸入輸出操作放在函數(shù)中處理,就可以使C語言本身的規(guī)模較小,編譯程序簡單,很容易在各種機器上實現(xiàn),程式具有可移植性。當(dāng)然,不同的C語言系統(tǒng)需要對函數(shù)庫中的函數(shù)作不同的處理。不同的C系統(tǒng)除了提供函數(shù)庫中的標(biāo)準(zhǔn)函數(shù)外,還按照硬體的情況提供一些專門的函數(shù)。因此不同的系統(tǒng)所提供的函數(shù)個數(shù)和功能是有所不同的。(7)可以用/*……*/對C程式中的任何部分作注釋。一個好的、有使用價值的根源程式都應(yīng)當(dāng)加上必要的注釋,以增加程式的可讀性。1.4C程式的上機步驟

程式,就是一組電腦能識別和執(zhí)行的指令。每一條指令使電腦執(zhí)行特定的操作。程式可以用高級語言(例如QBASIC,F(xiàn)ORTRAN,PASCAL,C等)編寫。用高級語言編寫的程式稱為“根源程式”(sourceprogram)。從根本上說,電腦只能識別和執(zhí)行由0和1組成的二進位的指令,而不能識別和執(zhí)行用高級語言寫的指令。為了使電腦能執(zhí)行高級語言根源程式,必須先用一種稱為“編譯程序”的軟體,把根源程式翻譯成二進位形式的“目標(biāo)程式”,然後將該目標(biāo)程式與系統(tǒng)的函數(shù)庫和其他目標(biāo)程式連接起來,形成可執(zhí)行的目標(biāo)程式。圖1.1下麵分別就三種不同的環(huán)境下運行C程式作一簡單介紹。1.用TurboC運行C程式的步驟TurboC是在微機上廣泛使用的編譯程序。它具有方便、直觀、易用的介面和豐富的庫函數(shù)。它向用戶提供一個集成環(huán)境,把程式的編輯、編譯、連接和運行等操作全部集中在一個介面上進行,使用十分方便。為了能使用TurboC,必須先將TurboC編譯程序裝入磁片的某一目錄下,例如放在C盤根目錄下一級TC子目錄下。圖1.2(1)調(diào)用TurboC程式。如果用戶的當(dāng)前目錄是TurboC編譯程序所在的子目錄(例如TC子目錄),只需從鍵盤鍵入“tc”命令即可:C:\TC>tc

螢?zāi)簧铣霈F(xiàn)TurboC集成環(huán)境,見圖1.2所示。從圖1.2可以看到在集成環(huán)境的上部,有一行“主菜單”,其中包括下麵8個菜單項:

FileEditRunCompileProjectOptionDebugbreak/watch

用戶可以通過以上菜單項來選擇使用TurboC集成環(huán)境所提供的TurboC的各項主要功能。以上8個菜單項分別代表:檔操作、編輯、運行、編譯、專案檔、選項、調(diào)試、中斷/觀察等功能。用鍵盤上的“←”和“→”鍵可以選擇菜單條中所需要的菜單項,被選中的項以“反相”圖1.3形式顯示

(例如主菜單中的各項原來以白底黑字顯示,被選中時改為以黑底白字顯示)。此時若按回車鍵,就會出現(xiàn)一個下拉菜單。例如在選中“File”菜單並按回車鍵後,螢?zāi)簧稀癋ile”下麵出現(xiàn)下拉菜單,見圖1.3所示。它是一個子菜單,提供多項選擇??梢杂谩啊辨I選擇所需要的項。例如選擇“New”處,並按回車鍵,表示要建立一個新的C根源程式。

圖1.3

如果選擇“Load”,并按回車鍵,表示要調(diào)入一個已有的源文件,此時屏幕上出現(xiàn)一個對話框(見圖1.4)。要求你輸入該檔的名字。用戶可輸入該檔案名,例如:tc1.c,如果已存在此檔,則系統(tǒng)會將此檔調(diào)入記憶體並顯示在螢?zāi)簧?。此時自動轉(zhuǎn)為編輯(Edit)狀態(tài)。如果原來不存在此檔案名,則系統(tǒng)會建立一個以指定的名字命名的新檔。圖1.4(2)編輯原始檔案。在編輯(Edit)狀態(tài)下可以根據(jù)需要輸入或修改根源程式。(3)編譯根源程式。選擇“Compile”菜單並在其下拉菜單中選擇“CompiletoOBJ”,則進行編譯,得到一個尾碼為.obj的目標(biāo)程序(為方便起見,在一般書刊中,以上菜單的選擇以“Compile/CompiletoOBJ”表示)。然後再選菜單“Compile/LinkEXEfile”,進行連接操作,可得到一個后綴為.exe的可執(zhí)行檔。也可以將編譯和連接合為一個步驟進行。選菜單“Compile/MakeEXEfile”或按“F9”鍵,即可一次完成編譯和連接。在螢?zāi)簧蠒@示編譯或連接時有無錯誤和有幾個錯誤,見圖1.5所示。此時按任何一個鍵,圖1.5所顯示的“編譯資訊框”會圖1.5

消失,螢?zāi)簧蠒謴?fù)顯示根源程式,游標(biāo)停留在出錯之處。在螢?zāi)坏南掳氩糠诛@示出有錯誤的行和錯誤的原因。根據(jù)此信息修改根源程式。修改完畢認(rèn)為無錯後,再按“F9”,再次進行編譯和連接,如此反復(fù)進行到不顯示出錯為止。(4)執(zhí)行程式。按“F10”鍵,在窗口上部的主菜單中某一項處出現(xiàn)“反相”顯示(黑色亮塊)。FileEditRunCompileProjectOptionDebugBreak/watch

用“→”鍵將亮塊移到“Run”,按回車鍵,在其下拉菜單中選擇“Run”項,或直接按Ctrl+F9鍵,系統(tǒng)就會執(zhí)行已編譯好的目標(biāo)檔。此時,TC集成環(huán)境窗口消失,螢?zāi)簧巷@示出程式運行時輸出的結(jié)果。如果程式需要輸入數(shù)據(jù)(如例1.3),則應(yīng)在此時,從鍵盤輸入所需數(shù)據(jù),然後程式會接著執(zhí)行,輸出結(jié)果。如果發(fā)現(xiàn)運行結(jié)果不對,要重新修改根源程式,可以再按“F10”鍵,並用“←”使亮塊移到“Edit”處,

按回車鍵,即進入編輯狀態(tài),可以根據(jù)需要修改根源程式,並重複上述(2),(3),(4)步,直到得到正確結(jié)果為止。(5)可以用“Alt”和“X”鍵(同時按此兩鍵),脫離TurboC,回到DOS命令狀態(tài)。此時,可以用DOS命令顯示根源程式和運行程式:C>TYPEtc1.c

(列出根源程式清單)C>tc1

(執(zhí)行目標(biāo)程式tc1.exe)如果想再修改根源程式,可以重新執(zhí)行步驟(1),並輸入根源程式檔案名即可。2.在UNIX操作系統(tǒng)下運行C程式的步驟(1)用編輯程式

(如UNIX系統(tǒng)的文本行編輯程式ed,或螢?zāi)痪庉嫵淌絭i)將根源程式輸入電腦,經(jīng)修改認(rèn)為無誤後,存入檔系統(tǒng)。設(shè)用戶將原始檔案定名為f.c(C根源程式的尾碼一般定為“.c”)。(2)編譯。調(diào)用C編譯程序cc對原始檔案進行編譯。可打入命令:ccf.c

如果在編譯過程中發(fā)現(xiàn)根源程式有語法錯誤,則系統(tǒng)會輸出“出錯資訊”,告訴用戶第幾行有什麼樣的錯誤。用戶應(yīng)重新調(diào)用編輯程式,修改後再進行編譯。如此直到編譯通過為止。編譯時先生成一個組合語言程式(即將C根源程式翻譯成為一個組合語言程式),然後由編譯程序再將組合語言程式翻譯成機器指令程式,即目標(biāo)程式。目標(biāo)程式的檔案名與相應(yīng)的根源程式同名,但尾碼為“.o”(表示它是目標(biāo)檔),上述原始檔案f.c經(jīng)編譯後得到目標(biāo)程式f.o。(3)連接。將目標(biāo)程式和庫函數(shù)或其他目標(biāo)程式連接成可執(zhí)行的目標(biāo)程式。在UNIX系統(tǒng)下,連接是由cc自動完成的。最後得到可執(zhí)行檔,檔案名由系統(tǒng)自動確定為a.out。如果不想用系統(tǒng)定的檔案名a.out,也可以在編譯時自己指定可執(zhí)行檔案名。例如想指定為f.out,可以在編譯時打入以下命令:cc-of.outf.c

它的作用是將根源程式f.c編譯成可執(zhí)行程式,檔案名為f.out。(4)執(zhí)行程式。只需輸入可執(zhí)行檔案名即可。例如:a.out

(系統(tǒng)指定的檔案名)

或f.out

(用戶指定的檔案名)3.在DOS下用MicrosoftC6.0編譯程序運行C程式步驟

MicrosoftC是微軟公司為IBM系列微機開發(fā)的C編譯系統(tǒng)。MSC6.0版本提供了多個庫函數(shù)。老版本的MSC採用基於DOS平臺的命令行方式。MSC6.0增加了基於滑鼠和窗口的“程式員工作臺”(programmer'sworkbench,縮寫為PWB),它也是一個集成環(huán)境。MSC也是人們常用的C編譯系統(tǒng)之一。目前,大多數(shù)使用MSC的人習(xí)慣用命令行方式。因此我們在這裏只簡單地介紹命令行方式的用法。(1)編輯C根源程式。可以用任何全螢?zāi)痪庉嬒到y(tǒng)輸入和編輯根源程式。假設(shè)已輸入和編輯好的原始檔案名為a1.c。(2)編譯和連接。MSC提供了一個功能很強的CL命令,可一次完成程式的編譯和連接。CL是Compile和Link的第一個字母。用法如下:

CLa1.c

(對根源程式a1.c進行編譯和連接)如果在編譯和連接時出現(xiàn)“出錯資訊”,則需要重新編輯(修改)根源程式。編譯和連接完成後,產(chǎn)生一個可執(zhí)行檔a1.exe。

(3)執(zhí)行程式。只需輸入可執(zhí)行檔案名:a1

即可得到運行結(jié)果。以上步驟只需上機試一下,即可明白。例題1.讀入兩個整數(shù),輸出它們的積

設(shè)兩個整數(shù)分別為x,y,積為m;程式首先調(diào)用printf()函數(shù),輸出提示用戶輸入數(shù)據(jù)的提示資訊,然後調(diào)用scanf()函數(shù),為變數(shù)x和y輸入值;接著求x與y的積m;最後輸出m。

用演算法描述如下:

讀入兩個整數(shù),輸出它們的積

{

輸出提示用戶輸入數(shù)據(jù)的資訊;

輸入變數(shù)x和y的值;

m=x*y;

輸出m;

}

程式代碼如下:

#include<stdio.h>Main(){

intx,y,m;

/*定認(rèn)變數(shù)x,y,m*/

printf("Inputxandy\n");

/*提示用戶輸入數(shù)據(jù)*/

scanf("%d%d",&x,&y);

/*輸入x和y的值*/

m=x*y;

/*求m=x*y*/

printf("%d*%d=%d\n",x,y,m);

/*輸出結(jié)果x*y=m*/

}

程式執(zhí)行結(jié)果如下:

Inputxandy

21

30

x*y=630

例題2從兩個浮點數(shù)中找出大數(shù)

設(shè)兩個派出點數(shù)分別為x,y,它們中的大數(shù)為c;程式首先調(diào)用printf()函數(shù),輸出提示用戶輸入數(shù)據(jù)的提示資訊,然後調(diào)用scanf()函數(shù),為就是x和y輸入值;接著求x與y的大值並存入變數(shù)c;最後輸出c。

演算法描述如下:

從兩個浮點數(shù)中求大數(shù)

{

輸出提示用戶回值為據(jù)的資訊;

輸入變數(shù)x和y的值;

if(x>y)c=x;

else

c=y;

輸出c;

}

2.1C的數(shù)據(jù)類型一個程式應(yīng)包括以下兩方面內(nèi)容:(1)對數(shù)據(jù)的描述。在程式中要指定數(shù)據(jù)的類型和數(shù)據(jù)的組織形式,即數(shù)據(jù)結(jié)構(gòu)(datastructure)。(2)對操作的描述(操作步驟),也就是演算法(algorithm)。數(shù)據(jù)是操作的對象,操作的目的是對數(shù)據(jù)進行加工處理,以得到期望的結(jié)果。打個比方,廚師做菜肴,需要有菜譜。菜譜上一般應(yīng)包括:

①配料,指出應(yīng)使用哪些原料;

②操作步驟,指出如何使用這些原料按規(guī)定的步驟加工成所需的菜肴。面對同一些原料可以加工出不同風(fēng)味的菜肴。

作為程式設(shè)計人員,必須認(rèn)真考慮和設(shè)計數(shù)據(jù)結(jié)構(gòu)和操作步驟(即演算法)。因此,著名電腦科學(xué)家沃思(nikiklausWirth)提出一個公式數(shù)據(jù)結(jié)構(gòu)+演算法=程式實際上,一個程式除了以上兩個主要要素之外,還應(yīng)當(dāng)採用結(jié)構(gòu)化程式設(shè)計方法進行程式設(shè)計,並且用某一種電腦語言表示。因此,可以這樣表示:

程式=演算法(algorithm)+數(shù)據(jù)結(jié)構(gòu)(datastructure)+程式設(shè)計方法

+語言工具和環(huán)境

也就是說,以上4個方面是一個程式設(shè)計人員所應(yīng)具備的知識。在設(shè)計一個程式時要綜合運用這幾方面的知識。在本書中不可能全面介紹這些內(nèi)容,它們都屬於有關(guān)的專門課程範(fàn)疇。在這4個方面中,演算法是靈魂,數(shù)據(jù)結(jié)構(gòu)是加工對象,語言是工具,編程需要採用合適的方法。演算法是解決“做什麼”和“怎麼做”的問題。程式中的操作語句,實際上就是演算法的體現(xiàn)。演算法處理的對象是數(shù)據(jù),而數(shù)據(jù)是以某種特定的形式存在的(例如整數(shù)、實數(shù)、字元等形式)。不同的數(shù)據(jù)之間往往還存在某些聯(lián)繫(例如由若干個整數(shù)組成一個整數(shù)數(shù)組)。所謂數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)的組織形式。例如,數(shù)組就是一種數(shù)據(jù)結(jié)構(gòu)。不同的電腦語言所允許定義和使用的數(shù)據(jù)結(jié)構(gòu)是不同的。例如,c語言提供了“結(jié)構(gòu)體”這樣一種數(shù)據(jù)結(jié)構(gòu),而fortran語言就不提供這種數(shù)據(jù)結(jié)構(gòu)。處理同一類問題,如果數(shù)據(jù)結(jié)構(gòu)不同,演算法也會不同。例如,對10個整數(shù)排序和對由10個整數(shù)構(gòu)成的數(shù)組排序的演算法是不同的。因此,在考慮演算法時,必須注意數(shù)據(jù)結(jié)構(gòu)。實際上,應(yīng)當(dāng)綜合考慮演算法和數(shù)據(jù)結(jié)構(gòu),選擇最佳的數(shù)據(jù)結(jié)構(gòu)和演算法。

C語言的數(shù)據(jù)結(jié)構(gòu)是以數(shù)據(jù)類型形式出現(xiàn)的。c的數(shù)據(jù)類型如下:

基本類型:

整型,字元型,實型(浮點型,包括單精確度型,雙精度型),枚舉類型.

構(gòu)造類型:

數(shù)組類型,結(jié)構(gòu)體類型,共用體類型

指針類型

空類型

C語言中數(shù)據(jù)有常量與變數(shù)之分,它們分別屬於以上這些類型。由以上這些數(shù)據(jù)類型還可以構(gòu)成更複雜的數(shù)據(jù)結(jié)構(gòu)。例如利用指針和結(jié)構(gòu)體類型可以構(gòu)成表、樹、棧等複雜的數(shù)據(jù)結(jié)構(gòu)。在程式中對用到的所有數(shù)據(jù)都必須指定其數(shù)據(jù)類型。在本章中主要介紹基本數(shù)據(jù)類型。2.2常量與變數(shù)2.2.1常量和符號常量在程式運行過程中,其值不能被改變的量稱為常量。常量區(qū)分為不同的類型,如12,0,-3為整型常量,4.6、-1.23為實型常量,‘a(chǎn)’,‘d’為字元常量。常量一般從其字面形式即可判別。這種常量稱為字面常量或直接常量。

也可以用一個識別字代表一個常量,如:例2.1符號常量的使用。

#definePRICE30main(){intnum,total;num=10;total=num*PRICE;printf("total=%d",total);}

程式中用#define命令行定義PRICE代表常量30,此後凡在本文件中出現(xiàn)的PRICE都代表30,可以和常量一樣進行運算,程式運行結(jié)果為

total=300

有關(guān)#define命令行的詳細用法參見第8章。

這種用一個識別字代表一個常量的,稱為符號常量,即識別字形式的常量。請注意符號常量不同於變數(shù),它的值在其作用域(在本例中為主函數(shù))內(nèi)不能改變,也不能再被賦值。如再用以下賦值語句給PRICE賦值是錯誤的。

PRICE=40;

習(xí)慣上,符號常量名用大寫,變數(shù)用小寫,以示區(qū)別。使用符號常量的好處是:(1)含義清楚。如上面的程式中,看程式時從price就可知道它代表價格。因此定義符號常量名時應(yīng)考慮“見名知意”。在一個規(guī)範(fàn)的程式中不提倡使用很多的常數(shù),如:sum=15*30*23.5*43。在檢查程式時搞不清各個常數(shù)究竟代表什麼。應(yīng)儘量使用“見名知意”的變數(shù)名和符號常量。

(2)在需要改變一個常量時能做到“一改全改”。例如在程式中多處用到某物品的價格,如果價格用常數(shù)表示,則在價格調(diào)整時,就需要在程式中作多處修改,若用符號常量PRICE代表價格,只需改動一處即可。如:

#definePRICE35

在程式中所有以PRICE代表的價格就會一律自動改為35。2.2.2變數(shù)其值可以改變的量稱為變數(shù)。一個變數(shù)應(yīng)該有一個名字,在內(nèi)存中佔據(jù)一定的存儲單元。在該存儲單元中存放變數(shù)的值。請注意區(qū)分變數(shù)名和變數(shù)值這兩個不同的概念,見圖2.1。變數(shù)名實際上是一個符號地址,在對程式編譯連接時由系統(tǒng)給每一個變數(shù)名分配一個記憶體地址。在程式中從變數(shù)中取值,實際上是通過變數(shù)名找到相應(yīng)的記憶體地址,從其存儲單元中讀取數(shù)據(jù)。圖2.1和其他高級語言一樣,用來標(biāo)識變數(shù)名、符號常量名、函數(shù)名、數(shù)組名、類型名、檔案名的有效字元序列稱為識別字(identifier)。簡單地說,識別字就是一個名字。

C語言規(guī)定識別字只能由字母、數(shù)字和下劃線三種字元組成,且第一個字元必須為字母或下劃線。下麵列出的是合法的識別字,也是合法的變數(shù)名:

sum,average,-total,class,day,month,

student-name,tan,lotus-1-2-3,basic,li-ling

下麵是不合法的識別字和變數(shù)名:M.d.John,y123,#33,3d64,a>b

注意,大寫字母和小寫字母被認(rèn)為是兩個不同的字元。因此,sum和suM,class和class是兩個不同的變數(shù)名。一般,變數(shù)名用小寫字母表示,與人們?nèi)粘A?xí)慣一致,以增加可讀性。

ANSIC標(biāo)準(zhǔn)沒有規(guī)定識別字的長度(字元個數(shù)),但各個c編譯系統(tǒng)都有自己的規(guī)定。有的系統(tǒng)(如IBMPC的MSC)取8個字元,假如程式中出現(xiàn)的變數(shù)名長度大於8個字元,則只有前面8個字元有效,後面的不被識別。例如,有兩個變數(shù):student_name和student_number,由於二者的前8個字元相同,系統(tǒng)認(rèn)為這兩個變數(shù)是一回事而不加區(qū)別??梢詫⑺鼈兏臑閟tud_name和stud_num,以使之區(qū)別。

TurboC則允許32個字元。因此,在寫程式時應(yīng)瞭解所用系統(tǒng)對識別字長度的規(guī)定,以免出現(xiàn)上面的混淆。這種錯誤並不反映在編譯過程中(即語法無錯誤),但運行結(jié)果顯然不對。為了程式的可移植性(即在甲機器上運行的程式可以基本上不加修改,就能移到乙機器上運行)以及閱讀程式的方便,建議變數(shù)名的長度不要超過8個字元。如前所述,在選擇變數(shù)名和其他識別字時,應(yīng)注意做到“見名知意”,即選有含意的英文單詞(或其縮寫)作識別字,如count、name、day、month、total、country等,除了數(shù)值計算程式外,一般不要用代數(shù)符號(如a、b、c、x1、y1等)作變數(shù)名,以增加程式的可讀性。這是結(jié)構(gòu)化程式的一個特徵。本書在一些簡單的舉例中,為方便起見,仍用單字符的變數(shù)?如a、b、c等),請讀者注意不要在其他所有程式中都如此。在c語言中,要求對所有用到的變數(shù)作強制定義,也就是“先定義,後使用”,如例1.2、例1.3那樣。這樣做的目的是:

(1)凡未被事先定義的,不作為變數(shù)名,這就能保證程式中變數(shù)名使用得正確。例如,如果在定義部分寫了

intstudent;

而在執(zhí)行語句中錯寫成staent。如:

staent=30;在編譯時檢查出statent未經(jīng)定義,不作為變數(shù)名。輸出“變數(shù)statent未經(jīng)聲明”的資訊,便於用戶發(fā)現(xiàn)錯誤,避免變數(shù)名使用時出錯。(2)每一個變數(shù)被指定為一確定類型,在編譯時就能為其分配相應(yīng)的存儲單元。如指定a、b為int型,turboc編譯系統(tǒng)為a和b各分配兩個位元組,並按整數(shù)方式存儲數(shù)據(jù)。(3)指定每一變數(shù)屬於一個類型,這就便於在編譯時,據(jù)此檢查該變數(shù)所進行的運算是否合法。例如,整型變數(shù)a和b,可以進行求餘運算:a%b

%是“求餘”(見2.8節(jié)),得到a/b的餘數(shù)。如果將a、b指定為實型變數(shù),則不允許進行“求餘”運算,在編譯時會給出有關(guān)“出錯資訊”。2.3整型數(shù)據(jù)(integer)2.3.1整型常量的表示方法整型常量即整常數(shù)。c整常數(shù)可用以下三種形式表示:(1)十進位整數(shù)。如123,-456,0。(2)八進制整數(shù)。以0開頭的數(shù)是八進制數(shù)。如0123表示八進制數(shù)123,即(123)8,其值為:1×82+2×81+3×80,等於十進位數(shù)83。-011表示八進制-11,十進位數(shù)-9。(3)十六進制整數(shù)。以0x開頭的數(shù)是十六進制數(shù)。如0x123,代表十六進制數(shù)123,即(123)16=1×162+2×161+3×160=256+32+3=291。-0x12等於十進位數(shù)-18。2.3.2整型變數(shù)1.整型數(shù)據(jù)在內(nèi)存中的存放形式數(shù)據(jù)在內(nèi)存中是以二進位形式存放的。如果定義了一個整型變數(shù)i:

inti;/*定義為整型變數(shù)*/i=10;/*給i賦以整數(shù)10*/

十進位數(shù)10的二進位形式為1010,在微機上使用的c編譯系統(tǒng),每一個整型變數(shù)在內(nèi)存中占2個位元組。圖2.2(a)是數(shù)據(jù)存放示意圖。圖2.2(b)是數(shù)據(jù)在內(nèi)存中實際存放情況。圖2.2

實際上,數(shù)值是以補數(shù)(complement)表示的。一個正數(shù)的補數(shù)和其原碼的形式相同。圖2.2(b)就是用補數(shù)形式表示的。如果數(shù)值是負(fù)的,在內(nèi)存中如何用補數(shù)形式表示呢?求負(fù)數(shù)的補數(shù)的方法是:將該數(shù)的絕對值的二進位形式,按位取反再加1。例如求-10的補數(shù):①取-10的絕對值10;②10的絕對值的二進制形式為1010;③對1010取反得1111111111110101(一個整數(shù)占16位);④再加1得1111111111110110,見圖2.3。圖2.3

可知整數(shù)的16位中,最左面的一位是表示符號的,該位為0,表示數(shù)值為正;為1則數(shù)值為負(fù)。關(guān)於補數(shù)的知識不屬於本書的範(fàn)圍,但學(xué)習(xí)c語言的讀者應(yīng)該比學(xué)習(xí)其他高級語言的讀者對數(shù)據(jù)在內(nèi)存中的表示形式有更多的瞭解。這樣才能理解不同類型數(shù)據(jù)間轉(zhuǎn)換的規(guī)律。在本章稍後的敘述中還要接觸到這方面的問題。2.整型變數(shù)的分類整型變數(shù)的基本類型符為int??梢愿鶕?jù)數(shù)值的範(fàn)圍將變數(shù)定義為基本整型、短整型或長整型。在int之前可以根據(jù)需要分別加上修飾符(modifier):short(短型)或long(長型)。因此有以下三種整型變數(shù):

(1)基本整型,以int表示。

(2)短整型,以shortint表示,或以short表示。

(3)長整型,以longint表示,或以long表示。在turboc中一個int型的變數(shù)的值範(fàn)圍為-215~(215-1),即-32768~32767。在實際應(yīng)用中,變數(shù)的值常常是正的(如學(xué)號、庫存量、年齡、存款額等)。為了充分利用變數(shù)的表數(shù)範(fàn)圍,此時可以將變數(shù)定義為“無符號”類型。對以上三種都可以加上修飾符unsigned,以指定是“無符號數(shù)”。如果加上修飾符signed,則指定是“有符號數(shù)”。如果既不指定為signed,也不指定為unsigned,則隱含為有符號(signed)。實際上signed是完全可以不寫的。歸納起來,可以用以下6種整型變數(shù)。即:

有符號基本整型

[signed]int

無符號基本整型

unsignedint

有符號短整型

[signed]short[int]

無符號短整型

unsignedshort[int]

有符號長整型

[signed]long[int]

無符號長整型

unsignedlong[int]

如果不指定unsigned或指定signed,則存儲單元中最高位代表符號(0為正,1為負(fù))。如果指定unsigned,為無符號型,存儲單元中全部二進位(bit)用作存放數(shù)本身,而不包括符號。無符號型變數(shù)只能存放不帶符號的整數(shù),如123、4687等,而不能存放負(fù)數(shù),如-123、-3。一個無符號整型變數(shù)中可以存放的正數(shù)的範(fàn)圍比一般整型變數(shù)中正數(shù)的範(fàn)圍擴大一倍。如果在程式中定義a和b兩個變數(shù):

inta;

unsignedintb;

則變數(shù)a的數(shù)值範(fàn)圍為-32768~32767。而變數(shù)b的數(shù)值範(fàn)圍為0~65535。圖2.4(a)表示有符號整型變數(shù)a的最大值(32767)。圖2.4(b)表示無符號整型變數(shù)b的最大值(65535)。圖2.4

C標(biāo)準(zhǔn)沒有具體規(guī)定以上各類數(shù)據(jù)所占記憶體位元組數(shù),只要求long型數(shù)據(jù)長度不短於int型,short型不長於int型。具體如何實現(xiàn),由各電腦系統(tǒng)自行決定。如在微機上,int和short都是16位,而long是32位。在Vax750上,short是16位,而int和long都是32位,一般以一個機器字(word)存放一個int數(shù)據(jù)。前一階段,微機的字長一般為16位,故以16位存放一個整數(shù),但整數(shù)的範(fàn)圍太小,往往不夠用,故將long型定為32位。而Vax的字長為32位,以32位存放一個整數(shù),範(fàn)圍可達正負(fù)21億,已足夠用了,不必再將long型定為64位。所以將int和long都定為32位。通常的做法是:把long定為32位,把short定為16位,而int可以是16位,也可以是32位。這主要取決於機器字長。在微機上用long型可以得到大範(fàn)圍的整數(shù),但同時會降低運算速度,因此除非不得已,不要隨便使用long型。方括弧內(nèi)的部分是可以省寫的。例如signedshortint與short等價,尤其是signed是完全多餘的,一般都不寫signed。一個整數(shù)(以13為例)在存儲單元中的存儲情況,見圖2.5所示(假設(shè)使用的是微機上的c編譯系統(tǒng),如turboC、MsC)。圖2.53.整型變數(shù)的定義前面已提到,c規(guī)定在程式中所有用到的變數(shù)都必須在程式中定義,即“強制類型定義”。例如:

inta,b;(指定變數(shù)a、b為整型)

unsignedshortc,d;(指定變數(shù)c、d為無符號短整型)longe,f;(指定變數(shù)e、f為長整型)

對變數(shù)的定義,一般是放在一個函數(shù)的開頭部分的聲明部分(也可以放在函數(shù)中某一分程式內(nèi),但作用域只限它所在的分程式,這將在第6章介紹)。例2.2整型變數(shù)的定義與使用。

main(){inta,b,c,d;/*指定a、b、c、d為整型變數(shù)*/unsignedu;/*指定u為無符號整型變數(shù)*/a=12;b=-24;u=10;

c=a+u;d=b+u;

printf("a+u=%d,b+u=%d\n",c,d);

}運行結(jié)果為

a+u=22,b+u=-14

可以看到不同種類的整型數(shù)據(jù)可以進行算術(shù)運算。在本例中是int型數(shù)據(jù)與unsignedint型數(shù)據(jù)進行相加相減運算(有關(guān)運算的規(guī)則在本章2.7節(jié)仲介紹)。4.整型數(shù)據(jù)的溢出在turboc中一個int型變數(shù)的最大允許值為32767,如果再加1,會出現(xiàn)什麼情況?例2.3整型數(shù)據(jù)的溢出。

main()

{inta,b;

a=32767;b=a+1;printf("%d,%d",a,b);}運行結(jié)果為32767,-32768圖2.6

從圖2.6可以看到:變數(shù)a的最高位為0,後15位全為1。加1後變成第1位為1,後面15位全為0。而它是-32768的補數(shù)形式,所以輸出變數(shù)b的值為-32768。請注意:一個整型變數(shù)只能容納-32768~32767範(fàn)圍內(nèi)的數(shù),無法表示大於32767的數(shù)。遇此情況就發(fā)生“溢出”,但運行時並不報錯。它好像汽車的里程表一樣,達到最大值以後,又從最小值開始計數(shù)。所以,32767加1得不到32768,而得到-32768,這可能與程式編制者的原意不同。從這裏可以看到:c的用法比較靈活,往往出現(xiàn)副作用,而系統(tǒng)又不給出“出錯資訊”,要靠程式員的細心和經(jīng)驗來保證結(jié)果的正確。將變數(shù)b改成long型就可得到預(yù)期的結(jié)果32768。2.3.3整型常量的類型我們已知整型變數(shù)可分為int、shortint、longint和unsignedint、unsignedshort、unsignedlong等類別。那麼常量是否也有這些類別?在將一個整型常量賦值給上述幾種類別的整型變數(shù)時如何做到類型匹配?請注意以下幾點:

(1)一個整數(shù),如果其值在-32768~+32767範(fàn)圍內(nèi),認(rèn)為它是int型,它可以賦值給int型和longint型變數(shù)。

(2)一個整數(shù),如果其值超過了上述範(fàn)圍,而在-2147483648~+2147483647範(fàn)圍內(nèi),則認(rèn)為它是長整型,可以將它賦值給一個longint型變數(shù)。(3)如果某一電腦系統(tǒng)的c版本(例如turboc)確定shortint與int型數(shù)據(jù)在內(nèi)存中佔據(jù)的長度相同,則它的表數(shù)範(fàn)圍與int型相同。因此,一個int型的常量也同時是一個shortint型常量,可以賦給int型或shortint型變數(shù)。(4)一個整常量後面加一個字母u,認(rèn)為是unsignedint型,如12345u,在內(nèi)存中按unsignedint規(guī)定的方式存放(存儲單元中最高位不作為符號位,而用來存儲數(shù)據(jù),見圖2.4(b)。如果寫成-12345u,則先將-12345轉(zhuǎn)換成其補數(shù)53191,然後按無符號數(shù)存儲。(5)在一個整常量後面加一個字母l或l,則認(rèn)為是longint型常量。

例如123l、432l、0l等,這往往用於函數(shù)調(diào)用中。如果函數(shù)的形參為longint型,則要求實參也為longint型,此時用123作實參不行,而要用123l作實參。2.4實型數(shù)據(jù)(floatingpointnumbers)2.4.1實型常量的表示方法實數(shù)(realnumber)又稱浮點數(shù)(floating-pointnumber)。實數(shù)有兩種表示形式:

(1)十進位小數(shù)形式。它由數(shù)字和小數(shù)點組成(注意必須有小數(shù)點)。.123、123.、123.0、0.0都是十進位小數(shù)形式。

(2)指數(shù)形式。如123e3或123e3都代表123×103。但注意字母e(或e)之前必須有數(shù)字,且e後面的指數(shù)必須為整數(shù),如e3、2.1e3.5、.e3、e等都不是合法的指數(shù)形式。

一個實數(shù)可以有多種指數(shù)表示形式。例如123.456可以表示為123.456e0,12.3456e1、1.23456e2、0.123456e3、0.0123456e4、0.00123456e5等。把其中的1.23456e2稱為“規(guī)範(fàn)化的指數(shù)形式”,即在字母e(或e)之前的小數(shù)部分中,小數(shù)點左邊應(yīng)有一位(且只能有一位)非零的數(shù)字。例如2.3478e2、3.0999e5、6.46832e12都屬於規(guī)範(fàn)化的指數(shù)形式,而12.908e10、0.4578e3、756e0則不屬於規(guī)範(fàn)化的指數(shù)形式。一個實數(shù)在用指數(shù)形式輸出時,是按規(guī)範(fàn)化的指數(shù)形式輸出的。例如,指定將實數(shù)5689.65按指數(shù)形式輸出,必然輸出5.68965e+003,而不會是0.568965e+004或56.8965e+002。1.實型數(shù)據(jù)在內(nèi)存中的存放形式

在常用的微機系統(tǒng)中,一個實型數(shù)據(jù)在內(nèi)存中占4個位元組(32位)。與整型數(shù)據(jù)的存圖2.7儲方式不同,實型數(shù)據(jù)是按照指數(shù)形式存儲的。系統(tǒng)把一個實型數(shù)據(jù)分成小數(shù)部分和指數(shù)部分,分別存放。指數(shù)部分採用規(guī)範(fàn)化的指數(shù)形式。實數(shù)3.14159在內(nèi)存中的存放形式可以用圖2.7示意。2.4.2

實型變數(shù)圖2.7

圖中是用十進位數(shù)來示意的,實際上在電腦中是用二進位數(shù)來表示小數(shù)部分以及用2的冪次來表示指數(shù)部分的。在4個位元組(32位)中,究竟用多少位來表示小數(shù)部分,多少位來表示指數(shù)部分,標(biāo)準(zhǔn)C並無具體規(guī)定,由各C編譯系統(tǒng)自定。不少c編譯系統(tǒng)以24位表示小數(shù)部分(包括符號),以8位表示指數(shù)部分(包括指數(shù)的符號)。小數(shù)部分占的位(bit)數(shù)愈多,數(shù)的有效數(shù)字愈多,精度愈高。指數(shù)部分占的位數(shù)愈多,則能表示的數(shù)值範(fàn)圍愈大。2.實型變數(shù)的分類

C實型變數(shù)分為單精確度(float型)、雙精度(double型)和長雙精度型(longdouble)三類。ANSIC並未具體規(guī)定每種類型數(shù)據(jù)的長度、精度和數(shù)值範(fàn)圍。有的系統(tǒng)將double型所增加的32位全用於存放小數(shù)部分,這樣可以增加數(shù)值的有效位數(shù),減少舍入誤差。有的系統(tǒng)則將所增加的位(bit)用於存放指數(shù)部分,這樣可以擴大數(shù)值的範(fàn)圍。表2.2列出的是微機上常用的c編譯系統(tǒng)(如turboc,Msc,borlandc)的情況。應(yīng)當(dāng)了解,不同的系統(tǒng)會有差異。對每一個實型變數(shù)都應(yīng)在使用前加以定義。如:

float

x,y,(指定x、y為單精確度實數(shù))

doublez;(指定z為雙精度實數(shù))

longdoublet;(指定t為長雙精度實數(shù))

在初學(xué)階段,對longdouble型用得較少,因此我們不準(zhǔn)備作詳細介紹。讀者只要知道有此類型即可。3.實型數(shù)據(jù)的舍入誤差由於實型變數(shù)是由有限的存儲單元組成的,因此能提供的有效數(shù)字總是有限的,在有效位以外的數(shù)字將被舍去。由此可能會產(chǎn)生一些誤差。例如,a加20的結(jié)果顯然應(yīng)該比a大。請分析下麵的程式:例2.4實型數(shù)據(jù)的舍入誤差。

main()

{floata,b;

a=123456,789e5;

b=a+20;

printf("%f",b);

}

程式內(nèi)printf函數(shù)中的“%f”是輸出一個實數(shù)時的格式符。程式運行時,輸出b的值與a相等。原因是:a的值比20大很多,a+20的理論值應(yīng)是12345678920,而一個實型變數(shù)只能保證的有效數(shù)字是7位有效數(shù)字,後面的數(shù)字是無意義的,並不準(zhǔn)確地表示該數(shù)。

運行程式得到的a和b的值是12345678848.000000,可以看到前8位是準(zhǔn)確的,後幾位是不準(zhǔn)確的,把20加在後幾位上,是無意義的。應(yīng)當(dāng)避免將一個很大的數(shù)和一個很小的數(shù)直接相加或相減,否則就會“丟失”小的數(shù)。與此類似,用程式計算1.0/3*3的結(jié)果並不等於1。2.4.3實型常量的類型

C編譯系統(tǒng)將實型常量作為雙精度來處理。例如已定義一個實型變數(shù)f,有如下語句:f=2.45678*4523.65

系統(tǒng)將2.45678和4523.65按雙精度數(shù)據(jù)存儲(占64位)和運算,得到一個雙精度的乘積,然後取前7位賦給實型變數(shù)f。這樣做可以保證計算結(jié)果更精確,但是運算速度降低了。可以在數(shù)的後面加字母f或f(如1.65f,654.87f),這樣編譯系統(tǒng)就會按單精確度(32位)處理。一個實型常量可以賦給一個float型、double型或longdouble變數(shù)。根據(jù)變數(shù)的類型截取實型常量中相應(yīng)的有效位數(shù)字。假如a已指定為單精確度實型變數(shù):

floata;

a=111111.111;由於float型變數(shù)只能接收7位有效數(shù)字,因此最後兩位小數(shù)不起作用。如果a改為double型,則能全部接收上述9位數(shù)字並存儲在變數(shù)a中。2.5字元型數(shù)據(jù)(Character,Char-字元)

2.5.1字元常量

C的字元常量是用單引號(即撇號)括起來的一個字元。如‘a(chǎn)’,‘x’,‘d’,‘?’,‘’等都是字符常量。注意,‘a(chǎn)’和‘a(chǎn)’是不同的字元常量。除了以上形式的字元常量外,C還允許用一種特殊形式的字元常量,就是以一個“\”開頭的字元序列。例如,前面已經(jīng)遇到過的,在printf函數(shù)中的‘\n’,它代表一個“換行”符。這是一種“控制字元”,在螢?zāi)簧鲜遣荒茱@示的。在程式中也無法用一個一般形式的字元表示,只能採用特殊形式來表示。例2.5轉(zhuǎn)義字元的使用。

main()

{printf("abc\tde\rf\tg\n");printf("h\ti\b\bjk");

}程式中沒有設(shè)字元變數(shù),用printf函數(shù)直接輸出雙引號內(nèi)的各個字元。請注意其中的“轉(zhuǎn)義字元”。第一個printf函數(shù)先在第一行左端開始輸出“abc”,然後遇到“\t”,它的作用是“跳格”,即跳到下一個“製錶位置”,在我們所用系統(tǒng)中一個“製錶區(qū)”占8列。“下一製錶位置”從第9列開始,故在第9~11列上輸出“de”。

下麵遇到“\r”,它代表“回車”(不換行),返回到本行最左端(第1列),輸出字元“f”,然後遇“\t”再使當(dāng)前輸出位置移到第9列,輸出“g”。下麵是“\n”,作用是“使當(dāng)前位置移到下一行的開頭”。第二個printf函數(shù)先在第1列輸出字元“h”,後面的“\t”使當(dāng)前位置跳到第9列,輸出字母“i”,然後當(dāng)前位置應(yīng)移到下一列(第10列)準(zhǔn)備輸出下一個字元。下麵遇到兩個“\b”,“\b”的作用是“退一格”,因此“\b\b”的作用是使當(dāng)前位置回退到第8列,接著輸出字元“jk”。程式運行時在印表機上得到以下結(jié)果:

fab_c___gdeh______jik

注意在顯示幕上看到的結(jié)果與上述列印結(jié)果不同,是:

f_______gdeh______j_k

這是由於“\r”使當(dāng)前位置回到本行開頭,自此輸出的字元(包括空格和跳格所經(jīng)過的位置)將取代原來螢?zāi)簧显撐恢蒙巷@示的字元。所以原有的“abc”被新的字元“fg”代替,其後的“de”未被新字元取代。換行後先輸出“hi”,退兩格后再輸出“jk”,j后面的“”將原有的字符“i”取而代之。因此屏幕上看不到“i”。

_ab_c____de(新一Tab)

f______g

實際上,螢?zāi)簧贤耆闯淌揭筝敵隽巳康淖衷?,只是因為在輸出前面的字元後很快又輸出後面的字元,在人們還未看清楚之前,新的已取代了舊的,所以誤以為未輸出應(yīng)輸出的字元。而在印表機輸出時,不像顯示幕那樣會“抹掉”原字元,留下了不可磨滅的痕跡,它能真正反映輸出的過程和結(jié)果。2.5.2字元變數(shù)字元型變數(shù)用來存放字元常量,請注意只能放一個字元,不要以為在一個字元變數(shù)中可以放一個字串(包括若干字元)。字元變數(shù)的定義形式如下:

char

c1,c2;它表示c1和c2為字元型變數(shù),各可以放一個字元,因此在本函數(shù)中可以用下麵語句對c1、c2賦值:

c1='a';c2='b';在所有的編譯系統(tǒng)中都規(guī)定以一個位元組來存放一個字元,或者說一個字元變數(shù)在內(nèi)存中占一個位元組。2.5.3字元數(shù)據(jù)在內(nèi)存中的存儲形式及其使用方法將一個字元常量放到一個字元變數(shù)中,實際上並不是把該字元本身放到記憶體單元中去,而是將該字元的相應(yīng)的ASCII代碼放到存儲單元中。例如字元‘a(chǎn)’的ASCII代碼為97,‘b’為98,在內(nèi)存中變數(shù)c1、c2的值如圖2.8(a)所示。實際上是以二進位形式存放的,如圖2.8(b)所示。圖2.8

既然在內(nèi)存中,字元數(shù)據(jù)以ASCII碼存儲,它的存儲形式就與整數(shù)的存儲形式類似。這樣,在字元型數(shù)據(jù)和整型數(shù)據(jù)之間的轉(zhuǎn)換就比較方便了。一個字元數(shù)據(jù)既可以以字元形式輸出,也可以以整數(shù)形式輸出。以字元形式輸出時,需要先將存儲單元中的ASCII碼轉(zhuǎn)換成相應(yīng)字元,然後輸出。以整數(shù)形式輸出時,直接將ASCII碼作為整數(shù)輸出。也可以對字元數(shù)據(jù)進行算術(shù)運算,此時相當(dāng)於對它們的ASCII碼進行算術(shù)運算,只是將其一個位元組轉(zhuǎn)化為29位元組,然後參加運算。例2.6

向字元變數(shù)賦以整數(shù)。main(){charc1,c2;c1=97;c2=98;printf("%c%c\n",c1,c2);/*以字元形式輸出*/printf("%d%d\n",c1,c2);/*轉(zhuǎn)換為整數(shù)形式輸出*/

c1、c2被指定為字元變數(shù)。但在第3和第4行中,將整數(shù)97和98分別賦給c1和c2,它的作用相當(dāng)於以下兩個賦值語句:

c1='a';c2='b';

因為‘a(chǎn)’和‘b’的ASCII碼為97和98。在程式的第3和第4行是把97和98兩個整數(shù)直接存放到c1和c2的記憶體單元中。而c1=‘a(chǎn)’和c2=‘b’則是先將字元‘a(chǎn)’和‘b’化成ASCII碼97和98,然後放到記憶體單元中。二者的作用和結(jié)果是相同的。第5行輸出兩個字元a和b?!?c”是輸出字元時必須使用的格式符。程式第6行輸出兩個整數(shù)97和98。圖2.9程式運行時輸出如下:

ab9798

可以看到:字元型數(shù)據(jù)和整型數(shù)據(jù)是通用的。它們既可以用字符形式輸出(用%c),也可以用整數(shù)形式輸出(用%d),見圖2.9。但是應(yīng)注意字元數(shù)據(jù)只占一個位元組,它只能存放0~255範(fàn)圍內(nèi)的整數(shù)。例2.7

大小寫字母的轉(zhuǎn)換。main(){charc1,c2;

c1='a';

c2='b';c1=c1-32;c2=c2-32;printf("%c

%c",c1,c2);}運行結(jié)果為

AB

程式的作用是將兩個小寫字母a和b轉(zhuǎn)換成大寫字母a和b?!產(chǎn)’的ascii碼為97,而‘a(chǎn)’為65,‘b’為98,‘b’為66。從

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論