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

下載本文檔

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

文檔簡(jiǎn)介

C語言程式設(shè)計(jì)

第1章

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

簡(jiǎn)單的C程式介紹1.4C程式的上機(jī)步驟1.5

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

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

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

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

以1978年發(fā)表的UNIX第7版中的C編譯程序?yàn)榛A(chǔ),BrianW.Kernighan和DennisM.Ritchie(合稱K&R)合著了影響深遠(yuǎn)的名著《TheCProgrammingLanguage》,這本書仲介紹的C語言成為後來廣泛使用的C語言版本的基礎(chǔ),它被稱為標(biāo)準(zhǔn)C。1983年,美國國家標(biāo)準(zhǔn)化協(xié)會(huì)(ANSI)根據(jù)C語言問世以來各種版本對(duì)C的發(fā)展和擴(kuò)充,制定了新的標(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)雖然基本部分是相同的,但也有一些不同。在微型機(jī)上使用的有MicrosoftC、TurboC、QuickC、BORLANDC等,它們的不同版本又略有差異。1.2C語言的特點(diǎn)(1)語言簡(jiǎn)潔緊湊,使用方便、靈活。C語言一共只有32個(gè)關(guān)鍵字,9種控制語句,程式書寫形式自由,主要用小寫字母表示,壓縮了一切不必要的成分。

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

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

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

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

本程式的作用是求兩個(gè)整數(shù)a和b之和sum。/*……*/表示注釋部分,為便於理解,我們用漢字表示注釋,當(dāng)然也可以用英語或漢字拼音作注釋。注釋只是給人看的,對(duì)編譯和運(yùn)行不起作用。注釋可以加在程式中任何位置。第2行是聲明部分,定義變數(shù)a和b,指定a和b為整型(int)變量。第3行是兩個(gè)賦值語句,使a和b的值分別為123和456。第4行使sum的值為a+b,第5行中“%d”是輸入輸出的“格式字串”,用來指定輸入輸出時(shí)的數(shù)據(jù)類型和格式(詳見第4章),“%d”表示“以十進(jìn)位整數(shù)形式輸出”。在執(zhí)行輸出時(shí),此位置上代以一個(gè)十進(jìn)位整數(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)用處*/}

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

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

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

編寫C程式就是編寫一個(gè)個(gè)函數(shù)。C的函數(shù)庫十分豐富,ANSIC建議的標(biāo)準(zhǔn)庫函數(shù)中包括100多個(gè)函數(shù),TurboC和MSC4.0提供300多個(gè)庫函數(shù)。C的這種特點(diǎn)使得容易實(shí)現(xiàn)程式的模組化。(2)一個(gè)函數(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ù)名

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

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

FileEditRunCompileProjectOptionDebugbreak/watch

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

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

圖1.3

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

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

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

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

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

(執(zhí)行目標(biāo)程式tc1.exe)如果想再修改根源程式,可以重新執(zhí)行步驟(1),並輸入根源程式檔案名即可。2.在UNIX操作系統(tǒng)下運(yùn)行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對(duì)原始檔案進(jìn)行編譯。可打入命令:ccf.c

如果在編譯過程中發(fā)現(xiàn)根源程式有語法錯(cuò)誤,則系統(tǒng)會(huì)輸出“出錯(cuò)資訊”,告訴用戶第幾行有什麼樣的錯(cuò)誤。用戶應(yīng)重新調(diào)用編輯程式,修改後再進(jìn)行編譯。如此直到編譯通過為止。編譯時(shí)先生成一個(gè)組合語言程式(即將C根源程式翻譯成為一個(gè)組合語言程式),然後由編譯程序再將組合語言程式翻譯成機(jī)器指令程式,即目標(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自動(dòng)完成的。最後得到可執(zhí)行檔,檔案名由系統(tǒng)自動(dòng)確定為a.out。如果不想用系統(tǒng)定的檔案名a.out,也可以在編譯時(shí)自己指定可執(zhí)行檔案名。例如想指定為f.out,可以在編譯時(shí)打入以下命令:cc-of.outf.c

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

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

或f.out

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

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

CLa1.c

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

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

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

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

用演算法描述如下:

讀入兩個(gè)整數(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從兩個(gè)浮點(diǎn)數(shù)中找出大數(shù)

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

演算法描述如下:

從兩個(gè)浮點(diǎn)數(shù)中求大數(shù)

{

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

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

if(x>y)c=x;

else

c=y;

輸出c;

}

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

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

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

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

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

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

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

基本類型:

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

構(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)。在程式中對(duì)用到的所有數(shù)據(jù)都必須指定其數(shù)據(jù)類型。在本章中主要介紹基本數(shù)據(jù)類型。2.2常量與變數(shù)2.2.1常量和符號(hào)常量在程式運(yùn)行過程中,其值不能被改變的量稱為常量。常量區(qū)分為不同的類型,如12,0,-3為整型常量,4.6、-1.23為實(shí)型常量,‘a(chǎn)’,‘d’為字元常量。常量一般從其字面形式即可判別。這種常量稱為字面常量或直接常量。

也可以用一個(gè)識(shí)別字代表一個(gè)常量,如:例2.1符號(hào)常量的使用。

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

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

total=300

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

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

PRICE=40;

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

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

#definePRICE35

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

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

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

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

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

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

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

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

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

intstudent;

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

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

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

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

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

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

可知整數(shù)的16位中,最左面的一位是表示符號(hào)的,該位為0,表示數(shù)值為正;為1則數(shù)值為負(fù)。關(guān)於補(bǔ)數(shù)的知識(shí)不屬於本書的範(fàn)圍,但學(xué)習(xí)c語言的讀者應(yīng)該比學(xué)習(xí)其他高級(jí)語言的讀者對(duì)數(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中一個(gè)int型的變數(shù)的值範(fàn)圍為-215~(215-1),即-32768~32767。在實(shí)際應(yīng)用中,變數(shù)的值常常是正的(如學(xué)號(hào)、庫存量、年齡、存款額等)。為了充分利用變數(shù)的表數(shù)範(fàn)圍,此時(shí)可以將變數(shù)定義為“無符號(hào)”類型。對(duì)以上三種都可以加上修飾符unsigned,以指定是“無符號(hào)數(shù)”。如果加上修飾符signed,則指定是“有符號(hào)數(shù)”。如果既不指定為signed,也不指定為unsigned,則隱含為有符號(hào)(signed)。實(shí)際上signed是完全可以不寫的。歸納起來,可以用以下6種整型變數(shù)。即:

有符號(hào)基本整型

[signed]int

無符號(hào)基本整型

unsignedint

有符號(hào)短整型

[signed]short[int]

無符號(hào)短整型

unsignedshort[int]

有符號(hào)長整型

[signed]long[int]

無符號(hào)長整型

unsignedlong[int]

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

inta;

unsignedintb;

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

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

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

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

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

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

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

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

}運(yùn)行結(jié)果為

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

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

main()

{inta,b;

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

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

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

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

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

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

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

一個(gè)實(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ù)點(diǎn)左邊應(yīng)有一位(且只能有一位)非零的數(shù)字。例如2.3478e2、3.0999e5、6.46832e12都屬於規(guī)範(fàn)化的指數(shù)形式,而12.908e10、0.4578e3、756e0則不屬於規(guī)範(fàn)化的指數(shù)形式。一個(gè)實(shí)數(shù)在用指數(shù)形式輸出時(shí),是按規(guī)範(fàn)化的指數(shù)形式輸出的。例如,指定將實(shí)數(shù)5689.65按指數(shù)形式輸出,必然輸出5.68965e+003,而不會(huì)是0.568965e+004或56.8965e+002。1.實(shí)型數(shù)據(jù)在內(nèi)存中的存放形式

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

實(shí)型變數(shù)圖2.7

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

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

float

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

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

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

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

main()

{floata,b;

a=123456,789e5;

b=a+20;

printf("%f",b);

}

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

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

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

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

floata;

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

2.5.1字元常量

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

main()

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

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

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

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

char

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

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

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

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

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

ab9798

可以看到:字元型數(shù)據(jù)和整型數(shù)據(jù)是通用的。它們既可以用字符形式輸出(用%c),也可以用整數(shù)形式輸出(用%d),見圖2.9。但是應(yīng)注意字元數(shù)據(jù)只占一個(gè)位元組,它只能存放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);}運(yùn)行結(jié)果為

AB

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論