- 新編C語(yǔ)言程序設(shè)計(jì)教程
- 錢雪忠 呂瑩楠 高婷婷主編
- 13353字
- 2019-08-02 16:53:29
第1章 C語(yǔ)言概述
C語(yǔ)言功能豐富、表達(dá)能力強(qiáng)、使用靈活方便、應(yīng)用面廣、目標(biāo)程序效率高、可移植性好,既具有低級(jí)語(yǔ)言的許多特點(diǎn),又具有高級(jí)語(yǔ)言的優(yōu)點(diǎn),既適于編寫系統(tǒng)軟件,又能方便地用來編寫應(yīng)用軟件。20世紀(jì)90年代以來,C語(yǔ)言迅速在全世界普及推廣。目前,它仍然是最優(yōu)秀的程序設(shè)計(jì)語(yǔ)言之一。
學(xué)習(xí)重點(diǎn)和難點(diǎn):
● C語(yǔ)言介紹與語(yǔ)言的特點(diǎn)
● C語(yǔ)言程序結(jié)構(gòu)
● 程序運(yùn)行環(huán)境
讀者在學(xué)習(xí)本章后,將對(duì)C語(yǔ)言及C語(yǔ)言程序有初步認(rèn)識(shí),并能開展C語(yǔ)言程序的運(yùn)行與實(shí)踐。
1.1 程序設(shè)計(jì)語(yǔ)言簡(jiǎn)介
語(yǔ)言?程序?程序設(shè)計(jì)?
自從第一臺(tái)計(jì)算機(jī)誕生以來,程序設(shè)計(jì)語(yǔ)言和程序設(shè)計(jì)方法不斷發(fā)展。
語(yǔ)言是思維的載體。人和計(jì)算機(jī)打交道,必須要解決“語(yǔ)言”溝通的問題。計(jì)算機(jī)并不能理解和執(zhí)行人們使用的自然語(yǔ)言,而只能接受和執(zhí)行二進(jìn)制的指令。計(jì)算機(jī)能夠直接識(shí)別和執(zhí)行的這種指令,稱為機(jī)器指令,這種機(jī)器指令的集合就是機(jī)器語(yǔ)言指令系統(tǒng),簡(jiǎn)稱為機(jī)器語(yǔ)言。為了解決某一特定問題,需要選用指令系統(tǒng)中的某一些指令,將其按要求選取并組織起來就組成一個(gè)“程序”。如下程序是8086指令系統(tǒng)對(duì)應(yīng)的二進(jìn)制代碼程序,能完成兩個(gè)十六進(jìn)制數(shù)相加的功能:
換言之,一個(gè)程序是完成某一特定任務(wù)的一組指令序列,或者說,為實(shí)現(xiàn)某一算法的指令序列稱為“程序”,機(jī)器世界中真正存在的就是這樣的二進(jìn)制程序。
用機(jī)器語(yǔ)言編制的程序雖然能夠直接被計(jì)算機(jī)識(shí)別、執(zhí)行,但是機(jī)器語(yǔ)言本身隨不同類型的機(jī)器而異,所以可移植性差,而且機(jī)器語(yǔ)言本身難學(xué)、難記、難懂、難修改,給使用者帶來極大的不便。于是,為了繞開機(jī)器指令,克服機(jī)器指令程序的缺陷,人們提出了程序設(shè)計(jì)語(yǔ)言的構(gòu)想,即使用人們熟悉、習(xí)慣的語(yǔ)言符號(hào)來編寫程序,最好是直接使用人們交流的自然語(yǔ)言來編程。在過去的幾十年中,人們創(chuàng)造了許多介于自然語(yǔ)言和機(jī)器指令之間的程序設(shè)計(jì)語(yǔ)言。按語(yǔ)言的級(jí)別大致可分為:匯編語(yǔ)言(低級(jí))和高級(jí)語(yǔ)言(第三代、第四代、……)。
匯編語(yǔ)言的特點(diǎn)是使用一些“助記符號(hào)”來替代那些難懂難記的二進(jìn)制代碼,所以匯編語(yǔ)言比機(jī)器指令便于理解和記憶,但它和機(jī)器語(yǔ)言的指令基本上又是一一對(duì)應(yīng)的,兩者都針對(duì)特定的計(jì)算機(jī)硬件系統(tǒng),可移植性差,因此稱它們都是“面向機(jī)器的低級(jí)語(yǔ)言”。為了直觀地了解匯編語(yǔ)言程序,如下給出一段實(shí)現(xiàn)X、Y兩個(gè)16位二進(jìn)制數(shù)相加的8086匯編程序:
高級(jí)語(yǔ)言類似自然語(yǔ)言(主要是英語(yǔ)),由專門的符號(hào)根據(jù)詞匯規(guī)則構(gòu)成單詞,由單詞根據(jù)句法規(guī)則構(gòu)成語(yǔ)句,每種語(yǔ)句有確切的語(yǔ)義并能由計(jì)算機(jī)解釋。高級(jí)語(yǔ)言包含許多英語(yǔ)單詞,有“自然化”的特點(diǎn);高級(jí)語(yǔ)言書寫計(jì)算式子接近于熟知的數(shù)學(xué)公式的規(guī)則;高級(jí)語(yǔ)言與機(jī)器指令完全分離,具有通用性,一條高級(jí)語(yǔ)言語(yǔ)句常常相當(dāng)于幾條或幾十條機(jī)器指令。所以,高級(jí)語(yǔ)言的出現(xiàn),給程序設(shè)計(jì)從形式和內(nèi)容上都帶來了重大變革,大大方便了程序的編寫,提高了可讀性。例如:BASIC、C、Visual Basic(簡(jiǎn)稱VB)、Visual C++(簡(jiǎn)稱VC++)、VB.NET、C#.NET、Java等都是高級(jí)語(yǔ)言。高級(jí)語(yǔ)言一般能細(xì)分為第三代高級(jí)語(yǔ)言、第四代高級(jí)語(yǔ)言、……,分類依據(jù)是高級(jí)語(yǔ)言的邏輯級(jí)別、表達(dá)能力、接近自然語(yǔ)言的程度等。如Turbo C 2.0(簡(jiǎn)稱TC)為第三代高級(jí)語(yǔ)言,而VB 6.0、VC++6.0、C#、VB.NET、Java等可認(rèn)為是第四代高級(jí)語(yǔ)言。第四代高級(jí)語(yǔ)言一般是具有面向?qū)ο筇匦浴⒕哂锌焖倩蜃詣?dòng)生成部分應(yīng)用程序能力的高級(jí)語(yǔ)言,它表達(dá)能力強(qiáng),編寫程序效率高,更接近人的使用語(yǔ)言,高一級(jí)別的語(yǔ)言一般具有低一級(jí)別語(yǔ)言的語(yǔ)言表達(dá)能力。如下是輸入兩個(gè)整數(shù)并隨即顯示兩整數(shù)之和的Turbo C 2.0語(yǔ)言程序:
顯然,高級(jí)語(yǔ)言程序要比面向機(jī)器的低級(jí)語(yǔ)言易懂、明了、簡(jiǎn)短得多。
應(yīng)該看到的是,高級(jí)語(yǔ)言是不斷發(fā)展變化的,不斷有新的更好的語(yǔ)言產(chǎn)生,同時(shí)也有舊的且功能差而不再實(shí)用的語(yǔ)言消亡。但C語(yǔ)言自產(chǎn)生以來,已歷經(jīng)40余年,依然具有強(qiáng)大的生命力與活力,該語(yǔ)言依然是當(dāng)今最熱門、最實(shí)用的高級(jí)語(yǔ)言之一。
1.2 C語(yǔ)言發(fā)展過程
在學(xué)習(xí)C語(yǔ)言之前,首先來介紹一下C語(yǔ)言的歷史。
C語(yǔ)言是一門通用的、模塊化、程序化的編程語(yǔ)言,被廣泛應(yīng)用于操作系統(tǒng)和應(yīng)用軟件的開發(fā)。由于其高效和可移植性,適應(yīng)于不同硬件和軟件平臺(tái),深受開發(fā)人員的青睞。
1.C語(yǔ)言早期發(fā)展
1969~1973年,AT&T貝爾實(shí)驗(yàn)室開始了C語(yǔ)言的最初研發(fā)。根據(jù)C語(yǔ)言的發(fā)明者丹尼斯·里奇(Dennis Ritchie)說,C語(yǔ)言最重要的研發(fā)時(shí)期是在1972年。
1970年,美國(guó)貝爾實(shí)驗(yàn)室的Ken Thompson以BCPL(Basic Combined Programming Language)語(yǔ)言為基礎(chǔ),設(shè)計(jì)出很簡(jiǎn)單且很接近硬件的B語(yǔ)言(取BCPL的首字母),并且用B語(yǔ)言寫了第一個(gè)UNIX操作系統(tǒng)。
1972年,美國(guó)貝爾實(shí)驗(yàn)室的D.M.Ritchie在B語(yǔ)言的基礎(chǔ)上最終設(shè)計(jì)出了一種新的語(yǔ)言,他取了BCPL的第二個(gè)字母作為這種語(yǔ)言的名字,即C語(yǔ)言。為此,C語(yǔ)言的祖先是BCPL語(yǔ)言。
C語(yǔ)言的誕生是和UNIX操作系統(tǒng)的開發(fā)密不可分的,原先的UNIX操作系統(tǒng)都是用匯編語(yǔ)言寫的,1973年UNIX操作系統(tǒng)的核心用C語(yǔ)言改寫,從此以后,C語(yǔ)言成為編寫操作系統(tǒng)的主要語(yǔ)言。
2.ANSIC標(biāo)準(zhǔn)
20世紀(jì)70~80年代,C語(yǔ)言被廣泛應(yīng)用,從大型主機(jī)到小型微機(jī),也衍生了C語(yǔ)言的很多不同版本。
為統(tǒng)一C語(yǔ)言版本,1983年美國(guó)國(guó)家標(biāo)準(zhǔn)局(American National Standards Institute,簡(jiǎn)稱ANSI)成立了一個(gè)委員會(huì),來制定C語(yǔ)言標(biāo)準(zhǔn)。1989年C語(yǔ)言標(biāo)準(zhǔn)被批準(zhǔn),被稱為ANSI X3.159-1989“Programming Language C”。這個(gè)版本的C語(yǔ)言標(biāo)準(zhǔn)通常被稱為ANSI C(C89)。目前,幾乎所有的開發(fā)工具都支持ANSI C標(biāo)準(zhǔn),它是C語(yǔ)言用得最廣泛的一個(gè)標(biāo)準(zhǔn)版本。
3.C99標(biāo)準(zhǔn)
在ANSI C標(biāo)準(zhǔn)確立之后,C語(yǔ)言的規(guī)范在很長(zhǎng)一段時(shí)間內(nèi)都沒有大的變動(dòng)。1995年,WG14小組對(duì)C語(yǔ)言進(jìn)行了一些修改,成為后來的1999年發(fā)布的ISO/IEC 9899:1999標(biāo)準(zhǔn),通常被稱為C99標(biāo)準(zhǔn)。但是各個(gè)公司對(duì)C99標(biāo)準(zhǔn)的支持所表現(xiàn)出來的興趣不同。當(dāng)GCC和其他一些商業(yè)編譯器支持C99標(biāo)準(zhǔn)的大部分特性時(shí),微軟和Borland卻似乎對(duì)此不感興趣。
4.ISO發(fā)布C語(yǔ)言標(biāo)準(zhǔn)新版本
ISO(International Organization for Standardization)于2011年4月正式公布C語(yǔ)言新的國(guó)際標(biāo)準(zhǔn)草案,之前被命名為C1X的新標(biāo)準(zhǔn)將被稱為ISO/IEC 9899:2011(C11版)。新的標(biāo)準(zhǔn)修訂了C11版本,提高了對(duì)C++的兼容性,并將新的特性增加到C語(yǔ)言中。
新功能包括支持多線程,基于ISO/IEC TR 19769:2004規(guī)范下支持Unicode,提供更多用于查詢浮點(diǎn)數(shù)類型特性的宏定義和靜態(tài)聲明功能等。根據(jù)草案規(guī)定,最新發(fā)布的標(biāo)準(zhǔn)草案修訂了許多特性,支持當(dāng)前的編譯器。
5.C語(yǔ)言對(duì)其他語(yǔ)言的影響
很多編程語(yǔ)言都深受C語(yǔ)言的影響,比如C++(以前是C語(yǔ)言的一個(gè)擴(kuò)展)、C#、Java、PHP、Javascript、Perl、LPC和UNIX的C Shell。也正因?yàn)镃語(yǔ)言的影響力,掌握C語(yǔ)言的人再學(xué)其他編程語(yǔ)言,大多能很快上手,觸類旁通。
6.目前C語(yǔ)言的商用版本
目前最流行的C語(yǔ)言有以下幾種:①M(fèi)icrosoft C或稱MS C;②Borland C(簡(jiǎn)稱BC)或Turbo C;③Win-TC;④AT&T C;⑤Objective-C。這些C語(yǔ)言版本不僅實(shí)現(xiàn)了ANSI C標(biāo)準(zhǔn)(C89版),而且在此基礎(chǔ)上各自作了一些擴(kuò)充,使之更加方便與實(shí)用。
1.3 C語(yǔ)言是優(yōu)秀的程序語(yǔ)言
早期的C語(yǔ)言主要是用于UNIX系統(tǒng)。由于C語(yǔ)言的強(qiáng)大功能和各方面的優(yōu)點(diǎn)逐漸為人們認(rèn)識(shí),到了20世紀(jì)80年代,C開始進(jìn)入其他操作系統(tǒng),并很快在各類大、中、小和微型計(jì)算機(jī)上得到了廣泛的使用,成為當(dāng)代最優(yōu)秀的程序設(shè)計(jì)語(yǔ)言之一。
1.C語(yǔ)言的優(yōu)點(diǎn)
(1)語(yǔ)言簡(jiǎn)潔,使用方便靈活
C語(yǔ)言是現(xiàn)有程序設(shè)計(jì)語(yǔ)言中規(guī)模最小的語(yǔ)言之一,而小的語(yǔ)言體系往往能設(shè)計(jì)出較好的程序。C語(yǔ)言的關(guān)鍵字很少,ANSI C標(biāo)準(zhǔn)一共只有37個(gè)關(guān)鍵字,9種控制語(yǔ)句,壓縮了一切不必要的成分。C語(yǔ)言的書寫形式比較自由,表達(dá)方法簡(jiǎn)潔,使用一些簡(jiǎn)單的方法就可以構(gòu)造出相當(dāng)復(fù)雜的數(shù)據(jù)類型和程序結(jié)構(gòu)。
(2)可移植性好
用過匯編語(yǔ)言的讀者都知道,即使是功能完全相同的一種程序,對(duì)于不同的單片機(jī),必須采用不同的匯編語(yǔ)言來編寫,這是因?yàn)閰R編語(yǔ)言完全依賴于單片機(jī)硬件。而現(xiàn)代社會(huì)中新硬件的更新?lián)Q代速度非常快,如果每接觸一種新的單片機(jī)就要學(xué)習(xí)一次新的匯編語(yǔ)言,那么我們將沒有多少時(shí)間真正用于產(chǎn)品開發(fā)。
C語(yǔ)言是通過編譯得到可執(zhí)行代碼的,統(tǒng)計(jì)資料表明,不同機(jī)器上的C語(yǔ)言編譯程序80%的代碼是公共的,C語(yǔ)言的編譯程序便于移植,從而使在一種單片機(jī)上使用的C語(yǔ)言程序可以不加修改或稍加修改即可方便地移植到另一種結(jié)構(gòu)類型的單片機(jī)上。
(3)數(shù)據(jù)結(jié)構(gòu)類型豐富,表達(dá)能力強(qiáng)
C語(yǔ)言具有豐富的數(shù)據(jù)結(jié)構(gòu)類型,可以根據(jù)需要采用整型、實(shí)型、字符型、數(shù)組類型、指針類型、結(jié)構(gòu)類型、共用體類型、枚舉類型等多種數(shù)據(jù)類型來實(shí)現(xiàn)各種復(fù)雜數(shù)據(jù)結(jié)構(gòu)的運(yùn)算。C語(yǔ)言還具有多種運(yùn)算符,靈活使用各種運(yùn)算符可以實(shí)現(xiàn)其他高級(jí)語(yǔ)言難以實(shí)現(xiàn)的運(yùn)算。
(4)運(yùn)算符多,表達(dá)方式靈活
C語(yǔ)言提供了多達(dá)34種運(yùn)算符,并把括號(hào)、賦值、逗號(hào)等都作為運(yùn)算符處理,它們可以組成各種表達(dá)式,還可采用多種方法來獲得表達(dá)式的值,從而使用戶在程序設(shè)計(jì)中具有更大的靈活性。C語(yǔ)言的語(yǔ)法規(guī)則不太嚴(yán)格,程序的書寫格式自由靈活,主要用小寫字母來編寫,而小寫字母是比較容易閱讀的,這些都充分體現(xiàn)了C語(yǔ)言靈活、方便和實(shí)用的特點(diǎn)。
(5)可進(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)
C語(yǔ)言以函數(shù)作為程序設(shè)計(jì)的基本單位,C語(yǔ)言程序中的函數(shù)相當(dāng)于匯編語(yǔ)言中的子程序。C語(yǔ)言對(duì)于輸入和輸出的處理也是通過函數(shù)調(diào)用來實(shí)現(xiàn)的。各種C語(yǔ)言編譯器都會(huì)提供一個(gè)函數(shù)庫(kù),其中包含有許多標(biāo)準(zhǔn)函數(shù),如各種數(shù)學(xué)函數(shù)、標(biāo)準(zhǔn)輸入、輸出函數(shù)等。此外,C語(yǔ)言還具有自定義函數(shù)的功能,用戶可以根據(jù)自己的需要編寫自定義函數(shù)。實(shí)際上C語(yǔ)言程序就是由許多個(gè)函數(shù)組成的,一個(gè)函數(shù)相當(dāng)于一個(gè)程序模塊,因此C語(yǔ)言可以很容易地進(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)。
(6)可以直接操作計(jì)算機(jī)硬件
C語(yǔ)言具有直接訪問單片機(jī)物理地址的能力,可以直接訪問片內(nèi)或片外存儲(chǔ)器,還可以進(jìn)行各種位(bit)操作。
(7)生成的目標(biāo)代碼效率高
眾所周知,匯編語(yǔ)言程序目標(biāo)代碼的效率是最高的,這就是為什么匯編語(yǔ)言仍是編寫計(jì)算機(jī)系統(tǒng)軟件的重要工具的原因。但是統(tǒng)計(jì)表明,對(duì)于同一個(gè)問題,用C語(yǔ)言編寫的程序生成代碼的效率僅比用匯編語(yǔ)言編寫的程序低10%~20%。
2.C語(yǔ)言的不足
盡管C語(yǔ)言具有很多的優(yōu)點(diǎn),但和其他任何一種程序設(shè)計(jì)語(yǔ)言一樣也有其自身的缺點(diǎn),如不能自動(dòng)檢查數(shù)組的邊界,各種運(yùn)算符的優(yōu)先級(jí)別太多,某些運(yùn)算符具有多種用途,比學(xué)習(xí)其他高級(jí)語(yǔ)言要困難一些等。
但總的來說,C語(yǔ)言的優(yōu)點(diǎn)遠(yuǎn)遠(yuǎn)超過它的缺點(diǎn)。所以,C語(yǔ)言有很廣闊的應(yīng)用領(lǐng)域。
3.C語(yǔ)言的應(yīng)用領(lǐng)域
1)應(yīng)用軟件。Linux操作系統(tǒng)中的應(yīng)用軟件都是使用C語(yǔ)言編寫的,安全性非常高。
2)對(duì)性能要求嚴(yán)格的領(lǐng)域。一般對(duì)性能有嚴(yán)格要求的領(lǐng)域都是用C語(yǔ)言編寫的,比如網(wǎng)絡(luò)程序的底層和網(wǎng)絡(luò)服務(wù)器端底層、地圖查詢等。
3)系統(tǒng)軟件和圖形處理。C語(yǔ)言具有很強(qiáng)的繪圖能力和可移植性,并且具備很強(qiáng)的數(shù)據(jù)處理能力,可以用來編寫系統(tǒng)軟件、制作動(dòng)畫、繪制二維圖形和三維圖形等。
4)數(shù)字計(jì)算。相對(duì)于其他編程語(yǔ)言,C語(yǔ)言是數(shù)字計(jì)算能力超強(qiáng)的高級(jí)語(yǔ)言。
5)嵌入式設(shè)備開發(fā)。手機(jī)、PDA等時(shí)尚消費(fèi)類電子產(chǎn)品內(nèi)部的應(yīng)用軟件、游戲等,很多都是采用C語(yǔ)言進(jìn)行嵌入式開發(fā)的。
6)游戲軟件開發(fā)。利用C語(yǔ)言可以開發(fā)很多游戲,比如推箱子、貪吃蛇等。
1.4 C語(yǔ)言與C++的關(guān)系
C語(yǔ)言是C++語(yǔ)言的基礎(chǔ),C++是在C的基礎(chǔ)上增加了新的面向?qū)ο罄碚摚瑑烧咴诤芏喾矫媸羌嫒莸摹R虼耍莆樟薈語(yǔ)言,再進(jìn)一步學(xué)習(xí)C++就能以一種熟悉的語(yǔ)法來學(xué)習(xí)面向?qū)ο蟮恼Z(yǔ)言,從而達(dá)到事半功倍的效果。
C語(yǔ)言是一種結(jié)構(gòu)化語(yǔ)言,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)。C程序的設(shè)計(jì)首要考慮的是如何通過一個(gè)過程,對(duì)輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過程(事務(wù))控制)。
C++首要考慮的是如何構(gòu)造一個(gè)對(duì)象模型,讓這個(gè)模型能夠契合與之對(duì)應(yīng)的問題域,這樣就可以通過獲取對(duì)象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務(wù))控制。所以C與C++的最大區(qū)別在于它們用于解決問題的思想方法不一樣。之所以說C++比C更先進(jìn),是因?yàn)椤?span id="pzcgsrb" class="bold">設(shè)計(jì)這個(gè)概念已經(jīng)被融入到C++之中”。
C語(yǔ)言與C++的區(qū)別有很多,下面是簡(jiǎn)要概述:
1)全新的程序設(shè)計(jì)思維,C語(yǔ)言是面向過程的,而C++是面向?qū)ο蟮摹?/p>
2)C語(yǔ)言有標(biāo)準(zhǔn)的函數(shù)庫(kù),它們是松散的,只是把功能相同的函數(shù)放在一個(gè)頭文件中;而C++對(duì)于大多數(shù)的函數(shù)都是緊密集成的,特別是C語(yǔ)言中沒有C++中的API,這些API是對(duì)Window系統(tǒng)的大多數(shù)API的有機(jī)組合,是一個(gè)集體。
3)C++中的圖形處理和C語(yǔ)言的圖形處理有很大的區(qū)別。C語(yǔ)言中的圖形處理函數(shù)基本上是不能用在C++中的,C語(yǔ)言標(biāo)準(zhǔn)中也不包括復(fù)合或復(fù)雜的圖形處理功能。
4)C和C++中都有結(jié)構(gòu)的概念,但是在C語(yǔ)言中結(jié)構(gòu)只有成員變量,無成員方法,而在C++的結(jié)構(gòu)中,它可以有自己的成員變量和成員函數(shù)。C語(yǔ)言中結(jié)構(gòu)的成員變量是公共的,都可以訪問;而在C++中沒有加限定符的均為私有的,而非公共的。
5)C++與C語(yǔ)言相比,可以寫更多更好的程序,比如寫基于DOS的程序、寫DLL、寫控件、寫系統(tǒng)。
6)C語(yǔ)言對(duì)程序文件的組織是松散的,幾乎是全要程序處理;而C++對(duì)文件的組織是以工程為總領(lǐng),各文件分類明確并匯集于工程中。
7)C++中的IDE(集成開發(fā)環(huán)境)很智能,和VB一樣,有的功能可能比VB還強(qiáng)。C++可以自動(dòng)生成想要的程序結(jié)構(gòu),節(jié)省很多時(shí)間。C++中的附加工具也有很多,可以進(jìn)行系統(tǒng)分析、查看API和控件等。C++調(diào)試功能也很強(qiáng)大,并且方法多樣。
但是,C++功能雖強(qiáng),它是以C語(yǔ)言為基礎(chǔ)的,也就是說學(xué)習(xí)掌握C語(yǔ)言才是首要的。
1.5 初識(shí)簡(jiǎn)單的C語(yǔ)言程序
為了說明C語(yǔ)言程序結(jié)構(gòu)的特點(diǎn),先看以下幾個(gè)程序。這幾個(gè)程序由易到難,表現(xiàn)了C語(yǔ)言程序在組成結(jié)構(gòu)上的特點(diǎn)。雖然有關(guān)內(nèi)容還未介紹,但可從這些例子中直觀地了解到組成一個(gè)C語(yǔ)言程序的基本部分和書寫格式等。
【例1-1】 顯示“Hello,World!”。
注意:程序行后用“/*…*/”或“//”引出的內(nèi)容為注釋部分,起到說明語(yǔ)句或程序的作用,程序不執(zhí)行此部分。
說明:main是主函數(shù)的函數(shù)名,表示這是一個(gè)主函數(shù)。每一個(gè)C語(yǔ)言程序都必須有且只能有一個(gè)主函數(shù)(main函數(shù))。調(diào)用printf函數(shù)的功能是把要輸出的內(nèi)容在顯示器上顯示。printf函數(shù)是一個(gè)由系統(tǒng)定義的標(biāo)準(zhǔn)函數(shù)(即庫(kù)函數(shù)),可在程序中直接調(diào)用。
【例1-2】 輸入數(shù)x,計(jì)算sin(x)的值。程序的每個(gè)語(yǔ)句功能由注釋可知。
說明:此段程序的功能是從鍵盤輸入一個(gè)數(shù)x,求x的正弦值,然后輸出結(jié)果。
在main()之前的兩行稱為預(yù)處理命令(詳見后面)。預(yù)處理命令還有其他幾種,這里的include稱為文件包含命令,其意義是把尖括號(hào)<>或引號(hào)""內(nèi)指定的文件包含到本程序中,成為本程序的一部分。被包含的文件通常是由系統(tǒng)提供的,其擴(kuò)展名為h,因此也稱為頭文件或首部文件。C語(yǔ)言的頭文件中包括了各個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù)的函數(shù)原型,因此凡是在程序中調(diào)用一個(gè)庫(kù)函數(shù)時(shí),一般都要包含該函數(shù)原型所在的頭文件。在本例中,使用了3個(gè)庫(kù)函數(shù):輸入函數(shù)scanf、正弦函數(shù)sin、輸出函數(shù)printf。sin函數(shù)是數(shù)學(xué)函數(shù),其頭文件為math.h文件,因此在程序的主函數(shù)前用include命令包含了math.h。scanf函數(shù)和printf函數(shù)是標(biāo)準(zhǔn)輸入/輸出函數(shù),其頭文件為stdio.h,因此在主函數(shù)前也用include命令包含了stdio.h文件。
需要說明的是,C語(yǔ)言規(guī)定對(duì)scanf和printf這兩個(gè)函數(shù)可以省去對(duì)其頭文件的包含命令。所以,在本例中也可以刪去第二行的包含命令#include<stdio.h>。
在例題中的主函數(shù)體中又分為兩部分,一部分為說明部分(可選),另一部分為執(zhí)行部分。說明部分包括對(duì)變量的類型定義或函數(shù)聲明等。【例1-1】中未使用任何變量,因此無說明部分。
C語(yǔ)言規(guī)定,源程序中所有用到的變量都必須先說明,后使用,否則將會(huì)出錯(cuò)。這一點(diǎn)是編譯型高級(jí)程序設(shè)計(jì)語(yǔ)言的一個(gè)共同特點(diǎn),與解釋型的BASIC語(yǔ)言不同。說明部分是C語(yǔ)言程序結(jié)構(gòu)中很重要的組成部分。
【例1-2】 中使用了兩個(gè)變量x與s,用來表示輸入的自變量和sin函數(shù)值。由于sin函數(shù)要求這兩個(gè)量必須是雙精度浮點(diǎn)型,故用類型說明符double來說明這兩個(gè)變量。
說明部分后的4行為執(zhí)行部分或稱為執(zhí)行語(yǔ)句部分,用以完成程序的功能。執(zhí)行部分的第一行是輸出語(yǔ)句,調(diào)用printf函數(shù)在顯示器上輸出提示字符串,請(qǐng)操作人員輸入自變量x的值。第二行為輸入語(yǔ)句,調(diào)用scanf函數(shù),接受鍵盤上輸入的數(shù)并存入變量x中。第三行是調(diào)用sin函數(shù)并把函數(shù)值賦予變量s。第四行是用printf函數(shù)輸出變量s的值,即x的正弦值。程序結(jié)束。
在前兩個(gè)例子中用到了C語(yǔ)言輸入函數(shù)(scanf)和輸出函數(shù)(printf),這里簡(jiǎn)單介紹一下它們的格式,以便下面使用。
scanf和printf這兩個(gè)函數(shù)分別稱為格式輸入函數(shù)和格式輸出函數(shù)。其意義是按指定的格式輸入、輸出值。因此,這兩個(gè)函數(shù)在括號(hào)中的參數(shù)表都由以下兩部分組成:“格式控制串”,“參數(shù)表”。其中,“格式控制串”是一個(gè)字符串,必須用雙引號(hào)括起來,它表示輸入、輸出量的數(shù)據(jù)類型。各種類型的格式表示法可參閱第4章。在printf函數(shù)中還可以在格式控制串內(nèi)出現(xiàn)非格式控制字符,這時(shí)它們?cè)陲@示屏幕上將原文照印。“參數(shù)表”中給出了輸入或輸出的量,當(dāng)有多個(gè)量時(shí),用逗號(hào)間隔。
例如:“printf("sin(%lf)=%lf\n",x,s);”,其中%lf為格式控制字符串,表示按雙精度浮點(diǎn)數(shù)處理。它在格式串中出現(xiàn)兩次,對(duì)應(yīng)x和s兩個(gè)變量。其余字符為非格式字符,則照原樣輸出到屏幕上。
【例1-3】 從文件infile.txt或鍵盤輸入x,y兩整數(shù),經(jīng)處理后,輸出兩數(shù)、兩數(shù)中的最大值與最小值到屏幕和輸出文件outfile.txt中。
注意:一個(gè)C語(yǔ)言程序可由一個(gè)、兩個(gè)或多個(gè)C源程序文件組成,如下程序設(shè)計(jì)分成兩個(gè)源程序文件(若運(yùn)行包含多文件的程序有困難時(shí),可以先作為一個(gè)文件運(yùn)行)。
說明:本程序由3個(gè)函數(shù)組成,main主函數(shù)、max函數(shù)和min函數(shù),且函數(shù)之間是并列關(guān)系,可從主函數(shù)中調(diào)用其他函數(shù)。max函數(shù)的功能是比較兩個(gè)數(shù),然后把較大的數(shù)返回給主函數(shù),而min函數(shù)把較小的數(shù)返回給主函數(shù)。max函數(shù)和min函數(shù)是用戶自定義函數(shù)。因此,在主函數(shù)中要給出函數(shù)聲明(程序第6、7行),其中min函數(shù)還來自另一個(gè)源文件,為此是外部函數(shù)聲明。可見,在程序的說明部分中,不僅可以有變量說明,還可以有內(nèi)部和外部函數(shù)的聲明。本程序還涉及對(duì)文件的打開、輸入、輸出和關(guān)閉等操作。關(guān)于函數(shù)與文件的詳細(xì)內(nèi)容將在本書第8章和第11章介紹。
【例1-3】 中程序的執(zhí)行過程是,首先嘗試打開infile.txt,若打開文件失敗,則在屏幕上顯示提示串,請(qǐng)用戶從鍵盤上輸入兩個(gè)整數(shù),按〈Enter〉鍵后由scanf函數(shù)語(yǔ)句接收這兩個(gè)數(shù)賦給變量x,y;若文件存在并打開成功,則自動(dòng)由fscanf函數(shù)語(yǔ)句從該輸入文件中讀取兩個(gè)整數(shù)(為讀取正確,要求在程序所在目錄中先建立infile.txt輸入文件,該文件首行有空格隔開的兩個(gè)整數(shù)),讀后關(guān)閉文件。然后程序調(diào)用max函數(shù)和min函數(shù),并把x,y的值及max函數(shù)得到的最大值、min函數(shù)得到最小值分別輸出到屏幕上和輸出文件outfile.txt中。程序運(yùn)行后觀察屏幕上顯示結(jié)果及outfile.txt文件中的輸出內(nèi)容,查看運(yùn)行結(jié)果是否正確。
本程序故意分成兩個(gè)文件組織存放,只是想讓讀者盡早了解C語(yǔ)言支持多文件的程序結(jié)構(gòu)。實(shí)際上,本程序完全可以在一個(gè)文件中編輯存放、編譯、連接與運(yùn)行。
1.6 C程序的結(jié)構(gòu)特點(diǎn)
C程序的完整結(jié)構(gòu)如圖1-1所示。其結(jié)構(gòu)特點(diǎn)如下:
1)一個(gè)C語(yǔ)言程序可以由一個(gè)或多個(gè)程序文件組成。
2)每個(gè)程序文件可由預(yù)處理命令(include命令僅為其中的一種)、全局變量定義、變量或函數(shù)聲明、一個(gè)或多個(gè)函數(shù)等組成。預(yù)處理命令等通常應(yīng)放在源文件或源程序的最前面。
3)一個(gè)C語(yǔ)言程序不論由多少個(gè)文件組成,都有且僅有一個(gè)main函數(shù),即主函數(shù)。
4)每個(gè)C語(yǔ)言函數(shù)通常由函數(shù)首部(如int max(int a,int b))、函數(shù)體組成。函數(shù)體一般又包括局部變量定義與函數(shù)聲明等組成的定義與聲明部分和由程序執(zhí)行語(yǔ)句等組成的執(zhí)行部分(如min函數(shù)所示)。
5)C程序的每一個(gè)語(yǔ)句都必須以分號(hào)(;)結(jié)尾。但預(yù)處理命令、函數(shù)頭和花括號(hào)“}”之后不能加分號(hào)。
6)標(biāo)識(shí)符與關(guān)鍵字之間必須至少加一個(gè)空格以示間隔。若已有明顯的間隔符,也可不再加空格。
由上可知,C程序的基本組成單位是函數(shù),函數(shù)可分為main主函數(shù)、庫(kù)函數(shù)(編譯系統(tǒng)提供)、自定義函數(shù)(用戶自己定義)3類。
圖1-1 C程序的完整結(jié)構(gòu)
1.7 C程序的書寫規(guī)則
從書寫清晰,便于閱讀、理解和維護(hù)的角度出發(fā),在書寫程序時(shí)應(yīng)遵循以下規(guī)則:
1)一個(gè)語(yǔ)句(包括說明語(yǔ)句)占一行。
2)用{}括起來的部分,通常表示程序的某一層次結(jié)構(gòu)。{}一般與該結(jié)構(gòu)語(yǔ)句的第一個(gè)字母對(duì)齊,并且{與}括號(hào)符一般分別單獨(dú)占一行。
3)低一層次的語(yǔ)句或說明可比高一層次的語(yǔ)句或說明縮進(jìn)若干空格后書寫,以便看起來更加清晰,增加程序的可讀性。
4)程序中應(yīng)添加必要的注釋,便于程序的閱讀與理解。
1.8 C語(yǔ)言字符集與詞匯
1.C語(yǔ)言的字符集
字符是組成語(yǔ)言的最基本的元素。C語(yǔ)言字符集由字母、數(shù)字、空白符、標(biāo)點(diǎn)和特殊字符組成。在字符常量、字符串常量和注釋中還可以使用漢字或其他可表示的圖形符號(hào)。
1)字母:小寫字母a~z共26個(gè),大寫字母A~Z共26個(gè)。
2)數(shù)字:0~9共10個(gè)。
3)空白符:空格符、制表符、換行符等統(tǒng)稱為空白符,它們只在字符常量和字符串常量中起作用。在其他地方出現(xiàn)時(shí),只起間隔作用,編譯程序?qū)λ鼈兒雎圆挥?jì)。因此,在程序中是否使用空白符,對(duì)程序的編譯不發(fā)生影響,但在程序中適當(dāng)?shù)牡胤绞褂每瞻追麑⒃黾映绦虻那逦院涂勺x性。
4)標(biāo)點(diǎn)和特殊字符
另外,C語(yǔ)言可使用轉(zhuǎn)義字符,具體見表1-1:
表1-1 C語(yǔ)言轉(zhuǎn)義字符表
2.C語(yǔ)言的詞匯
在C語(yǔ)言中使用的詞匯分為6類:標(biāo)識(shí)符、關(guān)鍵字、運(yùn)算符、分隔符、常量、注釋符。
(1)標(biāo)識(shí)符
在程序中使用的變量名、函數(shù)名、標(biāo)號(hào)等統(tǒng)稱為標(biāo)識(shí)符。除庫(kù)函數(shù)的函數(shù)名由系統(tǒng)定義外,其余都由用戶自定義。C語(yǔ)言規(guī)定,標(biāo)識(shí)符只能是字母(A~Z,a~z)、數(shù)字(0~9)、下畫線(_)組成的字符串,并且其第一個(gè)字符必須是字母或下畫線。
例如,以下標(biāo)識(shí)符是合法的:a,x,x3,BOOK_1,sum5。
以下標(biāo)識(shí)符是非法的:3s(以數(shù)字開頭);s*T(出現(xiàn)非法字符*);-3x(以減號(hào)開頭);bowy-1(出現(xiàn)非法減號(hào)字符-)。
在使用標(biāo)識(shí)符時(shí)還必須注意以下幾點(diǎn):
1)標(biāo)準(zhǔn)C語(yǔ)言不限制標(biāo)識(shí)符的長(zhǎng)度,但它受各種版本的C語(yǔ)言編譯系統(tǒng)限制,同時(shí)也受到具體機(jī)器的限制。例如在某版本C語(yǔ)言中規(guī)定標(biāo)識(shí)符前八位有效,當(dāng)兩個(gè)標(biāo)識(shí)符前八位相同時(shí),則被認(rèn)為是同一個(gè)標(biāo)識(shí)符。
2)在標(biāo)識(shí)符中,大小寫是有區(qū)別的。例如,Book和book是兩個(gè)不同的標(biāo)識(shí)符。
3)標(biāo)識(shí)符雖然可由程序員隨意定義,但它是用于標(biāo)識(shí)某個(gè)量的符號(hào)。因此,命名應(yīng)盡量有相應(yīng)的意義,以便于閱讀理解,做到“顧名思義”。
4)用戶定義的標(biāo)識(shí)符不應(yīng)與系統(tǒng)關(guān)鍵字相同,用戶定義的標(biāo)識(shí)符也不應(yīng)與系統(tǒng)已定義使用的一些標(biāo)識(shí)符相同(盡管可能沒有語(yǔ)法錯(cuò)誤而可以使用),如main,define,printf(庫(kù)函數(shù)名),stdio等。
(2)關(guān)鍵字
關(guān)鍵字是由C語(yǔ)言規(guī)定的具有特定意義的字符串,通常也稱為保留字。C語(yǔ)言的關(guān)鍵字分為以下幾類。
1)類型說明符:用于定義或說明變量、函數(shù)或其他數(shù)據(jù)結(jié)構(gòu)的類型。如前面例題中用到的int,double等。
2)語(yǔ)句定義符:用于表示一個(gè)語(yǔ)句的功能。如例1-3中用到的if…else就是條件語(yǔ)句的語(yǔ)句定義符。
3)其他(如const,sizeof等)。
最新ANSI C標(biāo)準(zhǔn)關(guān)鍵字一共有37個(gè)關(guān)鍵字。
注意:預(yù)處理命令字include,define,ifdef,ifndef等,以及庫(kù)函數(shù)名printf,scanf等均不是系統(tǒng)關(guān)鍵字,而是系統(tǒng)已定義標(biāo)識(shí)符。
(3)運(yùn)算符
C語(yǔ)言中含有相當(dāng)豐富的運(yùn)算符,它由一個(gè)或多個(gè)字符組成。運(yùn)算符與變量、函數(shù)一起組成表達(dá)式,表示各種運(yùn)算功能。
(4)分隔符
在C語(yǔ)言中采用的分隔符有逗號(hào)和空格兩種。逗號(hào)主要用在類型說明和函數(shù)參數(shù)表中,分隔各個(gè)變量。空格多用于語(yǔ)句各單詞之間,作間隔符。在關(guān)鍵字與標(biāo)識(shí)符之間必須要有一個(gè)以上的空格符作間隔,否則將會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤。例如把int a;寫成inta;,C編譯器會(huì)把inta當(dāng)成一個(gè)標(biāo)識(shí)符處理,其結(jié)果必然出錯(cuò)。
(5)常量
C語(yǔ)言中使用的常量可分為數(shù)字常量、字符常量、字符串常量、符號(hào)常量、轉(zhuǎn)義字符等。
(6)注釋符
C語(yǔ)言的一種注釋符是以“/*”開頭并以“*/”結(jié)尾的串,在“/*”和“*/”之間的即為注釋,注釋內(nèi)容可以跨行。“/*…*/”注釋能出現(xiàn)在程序的各個(gè)位置,能滿足各種注釋的要求。具體可參見【例1-3】。
C語(yǔ)言的另一種注釋符是以“//”開始的單行注釋(說明:有的C語(yǔ)言版本如Win-TC不一定支持此種注釋符),“//”到行末(行末以換行符為結(jié)束標(biāo)記)的內(nèi)容均為注釋,但注釋內(nèi)容不能跨行,本注釋可占一行并出現(xiàn)在語(yǔ)句的右側(cè)來注釋本語(yǔ)句。當(dāng)注釋內(nèi)容一行寫不下時(shí),可以用連續(xù)的多個(gè)“//”注釋來實(shí)現(xiàn)。具體可參見【例1-1】和【例1-2】。
程序編譯時(shí),不對(duì)注釋作任何處理。注釋可出現(xiàn)在程序中的任何位置,用來向用戶提示或解釋程序的意義。在調(diào)試程序中,對(duì)暫不使用的語(yǔ)句也可用注釋符標(biāo)注起來,使翻譯跳過這些語(yǔ)句不作處理,待調(diào)試結(jié)束后再按需去掉注釋符。
1.9 運(yùn)行C程序
運(yùn)行C程序必須經(jīng)過編輯(c或cpp文件)、編譯(obj文件)、連接(exe文件)、運(yùn)行等過程,連接得到可執(zhí)行的程序文件后,運(yùn)行程序得到運(yùn)行結(jié)果。
1.上機(jī)實(shí)踐的重要性
C語(yǔ)言程序設(shè)計(jì)是一門實(shí)踐性很強(qiáng)的課程,該課程的學(xué)習(xí)有其自身的特點(diǎn),學(xué)習(xí)者必須通過大量的編程訓(xùn)練,在實(shí)踐中掌握程序設(shè)計(jì)語(yǔ)言,培養(yǎng)程序設(shè)計(jì)的基本能力,并逐步理解和掌握程序設(shè)計(jì)的思想和方法。具體地說,通過上機(jī)實(shí)踐,應(yīng)該達(dá)到以下幾點(diǎn)要求:
1)使學(xué)習(xí)者能很好地掌握一種程序設(shè)計(jì)開發(fā)環(huán)境的基本操作方法(例如:Visual C++6.0(簡(jiǎn)稱VC++6.0)、Turbo C 2.0、Win-TC等),掌握應(yīng)用程序開發(fā)的一般步驟。
2)在程序設(shè)計(jì)和調(diào)試程序的過程中,可以幫助學(xué)習(xí)者進(jìn)一步理解教材中各章節(jié)的主要知識(shí)點(diǎn),特別是一些語(yǔ)法規(guī)則的理解和運(yùn)用,程序設(shè)計(jì)中的常用算法與構(gòu)造及其應(yīng)用,也就是所謂的“在編程中學(xué)習(xí)編程”。
3)通過上機(jī)實(shí)踐,提高程序分析、程序設(shè)計(jì)和程序調(diào)試的能力。程序調(diào)試是一個(gè)程序員最基本的技能,不會(huì)調(diào)試程序的程序員不可能編制出好的軟件。通過不斷地積累經(jīng)驗(yàn),摸索各種比較常用的技巧,可以提高編程的效率和程序代碼的質(zhì)量。
2.上機(jī)實(shí)踐的準(zhǔn)備工作
上機(jī)前需要做好如下準(zhǔn)備工作,以提高上機(jī)實(shí)踐的效率。
1)在計(jì)算機(jī)上安裝一種C程序設(shè)計(jì)開發(fā)工具,并學(xué)會(huì)基本的操作方法。
2)復(fù)習(xí)與本次實(shí)踐相關(guān)的教學(xué)內(nèi)容和主要知識(shí)點(diǎn)。
3)準(zhǔn)備好編程題程序流程圖為主的程序算法和全部源程序代碼,并且先進(jìn)行人工程序檢查與模擬運(yùn)行。
4)對(duì)程序中有疑問的地方做出標(biāo)記,充分估計(jì)程序運(yùn)行中可能出現(xiàn)的問題,以便在程序調(diào)試過程中給予關(guān)注與修改。
5)準(zhǔn)備好運(yùn)行和調(diào)試程序所需的數(shù)據(jù)。
3.上機(jī)實(shí)踐的基本步驟
上機(jī)實(shí)踐可以按如下基本步驟來進(jìn)行:
1)運(yùn)行C程序設(shè)計(jì)開發(fā)工具,進(jìn)入程序設(shè)計(jì)開發(fā)環(huán)境。
2)新建一個(gè)程序文件,輸入準(zhǔn)備好的程序。
3)不要立即進(jìn)行編譯和連接,應(yīng)該首先仔細(xì)檢查剛剛輸入的程序,如有錯(cuò)誤及時(shí)改正,保存文件后再進(jìn)行編譯和連接。
4)如果在編譯和連接的過程中發(fā)現(xiàn)錯(cuò)誤,根據(jù)系統(tǒng)的提示從第一個(gè)錯(cuò)誤開始(因?yàn)橐粋€(gè)錯(cuò)誤會(huì)引發(fā)多個(gè)錯(cuò)誤點(diǎn),后續(xù)錯(cuò)誤與前面錯(cuò)誤往往是有關(guān)聯(lián)的),逐個(gè)找出出錯(cuò)語(yǔ)句的位置和原因。全部或部分錯(cuò)誤得到改正后,再進(jìn)行編譯,然后查錯(cuò),編譯正確后再進(jìn)行連接。若連接有錯(cuò),同樣的再查找錯(cuò)誤并改正,直到最終成功為止。
5)運(yùn)行程序,如果運(yùn)行結(jié)果不正確,修改程序可能有邏輯錯(cuò)誤的語(yǔ)句,反復(fù)調(diào)試直到結(jié)果正確為止。
6)保存源程序和相關(guān)資源。
7)對(duì)學(xué)生來說,實(shí)驗(yàn)后應(yīng)提交實(shí)驗(yàn)報(bào)告,主要內(nèi)容應(yīng)包括程序清單、調(diào)試數(shù)據(jù)和運(yùn)行結(jié)果,還應(yīng)該包括對(duì)運(yùn)行結(jié)果的分析、評(píng)價(jià)與收獲體會(huì)等內(nèi)容。
4.上機(jī)實(shí)踐的運(yùn)行環(huán)境
C語(yǔ)言的編譯系統(tǒng)由不同的軟件廠商開發(fā),目前已有多種不同的C語(yǔ)言編譯系統(tǒng)及其編程環(huán)境,如Turbo C 2.0(16位字符界面編譯系統(tǒng))、Win-TC(16位圖形界面編譯系統(tǒng))、Visual C++6.0(32位圖形界面編譯系統(tǒng))、Borland C++4.5、Symantec C++6.1、VS.NET集成環(huán)境(微軟較新開發(fā)平臺(tái))和GCC4.0(Linux開源系統(tǒng)及其編程)等。
說明:Win-TC是Turbo C 2.0(簡(jiǎn)稱TC 2.0)的一種擴(kuò)展形式,是一個(gè)TC 2.0 Windows平臺(tái)開發(fā)工具。該軟件使用TC 2.0為內(nèi)核,提供Windows平臺(tái)的開發(fā)界面,因此也就支持Windows平臺(tái)下的功能,例如剪切、復(fù)制、粘貼和查找替換等,并可用鼠標(biāo)來操作。而且在功能上也有它的特色,如語(yǔ)法加亮、C內(nèi)嵌匯編、自定義擴(kuò)展庫(kù)的支持等,使用起來比TC 2.0方便些。
VC++6.0是集程序編輯、編譯及調(diào)試為一體的集成編程環(huán)境,至少包括新建程序文件、保存文件、打開文件、編譯、運(yùn)行、查看運(yùn)行結(jié)果等操作功能。
以上多種不同的C語(yǔ)言編程環(huán)境對(duì)C語(yǔ)言的編譯功能大同小異,一般都提供對(duì)C語(yǔ)言程序的編輯、編譯、連接與運(yùn)行功能,并且往往把這些功能集成到一個(gè)操作界面,呈現(xiàn)出功能豐富、操作便捷、直觀易用等特點(diǎn)。
需要注意的是:C語(yǔ)言集成開發(fā)環(huán)境或編譯系統(tǒng)一般只支持英文,只有在漢化后才能使用漢字串,支持漢字處理。
應(yīng)選用哪一種編譯環(huán)境呢?本書將主要選用Visual C++6.0集成開發(fā)環(huán)境來開展實(shí)踐,若不便安裝Visual C++6.0,本書也適用于輕量型的Win-TC環(huán)境、Turbo C 2.0環(huán)境等來編輯、編譯、連接與運(yùn)行程序。另外,對(duì)于在VS.NET與Linux環(huán)境里運(yùn)行C程序也應(yīng)有所了解。絕大多數(shù)的C語(yǔ)言程序是可以順暢地運(yùn)行于多種不同的環(huán)境里的。
1.10 本章小結(jié)
本章簡(jiǎn)單介紹了程序設(shè)計(jì)語(yǔ)言的發(fā)展變化、C語(yǔ)言的發(fā)展與特點(diǎn)、C語(yǔ)言與C++的區(qū)別和聯(lián)系、C語(yǔ)言程序的總體結(jié)構(gòu)及程序組成要素等。讀者在學(xué)習(xí)本章后,能對(duì)C語(yǔ)言有個(gè)總體上的認(rèn)識(shí),對(duì)C語(yǔ)言程序有個(gè)大體把握。實(shí)踐操作方面,要逐步掌握C語(yǔ)言程序的上機(jī)操作方法,對(duì)本章的3個(gè)簡(jiǎn)單程序能上機(jī)運(yùn)行、熟悉與再認(rèn)識(shí)。
1.11 習(xí)題
一、選擇題
1.一個(gè)C程序的執(zhí)行是從( )。
A.本程序的main()函數(shù)開始,到main()函數(shù)結(jié)束
B.本程序的main()函數(shù)開始,到本程序文件的最后一個(gè)函數(shù)結(jié)束
C.本程序文件的第一函數(shù)開始,到本程序main()函數(shù)結(jié)束
D.本程序文件的第一個(gè)函數(shù)開始,到本程序文件的最后一個(gè)函數(shù)結(jié)束
2.C語(yǔ)言程序的基本單位是( )。
A.程序 B.字符 C.語(yǔ)句 D.函數(shù)
3.以下敘述正確的是( )。
A.在C程序中,main()函數(shù)必須位于程序的最前面
B.在對(duì)一個(gè)C程序進(jìn)行編譯的過程中,可發(fā)現(xiàn)注釋中的拼寫錯(cuò)誤
C.C語(yǔ)言本身沒有輸入/輸出語(yǔ)句
D.C程序的每行中只能寫一條語(yǔ)句
4.以下敘述不正確的是( )。
A.一個(gè)C源程序可由一個(gè)或多個(gè)函數(shù)組成
B.C程序的基本組成單位是函數(shù)
C.一個(gè)C源程序必須包含一個(gè)main()函數(shù)
D.在C程序中,注釋說明只能位于一條語(yǔ)句的后面
5.在一個(gè)C語(yǔ)言程序中,下列說明正確的是( )。
A.main()函數(shù)必須出現(xiàn)在固定位置 B.main()函數(shù)可以在任何地方出現(xiàn)
C.main()函數(shù)必須出現(xiàn)在所有函數(shù)之后 D.main()函數(shù)必須出現(xiàn)在所有函數(shù)之前
6.對(duì)C語(yǔ)言的特點(diǎn),下面描述不正確的是( )。
A.C語(yǔ)言兼有高級(jí)語(yǔ)言和低級(jí)語(yǔ)言的雙重特點(diǎn),執(zhí)行效率高
B.C語(yǔ)言既可以用來編寫應(yīng)用程序,又可用來編寫系統(tǒng)軟件
C.C語(yǔ)言的可移植性較差
D.C語(yǔ)言是一種結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言
7.C語(yǔ)言程序的擴(kuò)展名為( )。
A.exe B.obj C.c D.cpp
8.C語(yǔ)言中語(yǔ)句的結(jié)束符是( )。
A., B.; C.。 D.;
9.編譯程序的功能為( )。
A.建立并修改程序 B.將C語(yǔ)言源程序編譯成目標(biāo)程序
C.調(diào)試程序 D.命令計(jì)算機(jī)執(zhí)行指定的操作
10.二進(jìn)制代碼程序?qū)儆冢?)。
A.面向機(jī)器語(yǔ)言 B.面向問題語(yǔ)言 C.面向過程語(yǔ)言 D.面向匯編語(yǔ)言
二、簡(jiǎn)答題
1.什么是語(yǔ)言?語(yǔ)言分幾類?各有什么特點(diǎn)?
2.匯編語(yǔ)言與高級(jí)語(yǔ)言有何區(qū)別?
3.什么是程序?
4.C語(yǔ)言中為何要加注釋語(yǔ)句?
5.C語(yǔ)言程序包括哪些部分?一個(gè)C語(yǔ)言函數(shù)一般又由哪幾部分組成?
實(shí)驗(yàn)1 初識(shí)運(yùn)行環(huán)境和運(yùn)行過程
一、實(shí)驗(yàn)?zāi)康?/h4>
1.了解C程序設(shè)計(jì)編程環(huán)境Visual C++6.0(簡(jiǎn)寫VC++6.0),掌握運(yùn)行一個(gè)C程序設(shè)計(jì)的基本步驟,包括編輯、編譯、連接和運(yùn)行。
2.了解C語(yǔ)言程序的基本組成,能夠模仿編寫簡(jiǎn)單的C程序。
3.了解程序調(diào)試的思想,能找出并改正C程序中的語(yǔ)法錯(cuò)誤。
二、實(shí)驗(yàn)內(nèi)容
1.在“我的電腦”某磁盤上新建一個(gè)文件夾,用于存放C程序,文件夾名字自定。
2.運(yùn)行示例
在屏幕上顯示一個(gè)短句“Hello,World!”。源程序如下:
運(yùn)行結(jié)果:Hello,World!
基本步驟:
1)啟動(dòng)VC++6.0。選擇“開始”→“程序”→“Microsoft Visual Studio 6.0”→“Microsoft Visual C++6.0”命令,進(jìn)入VC++6.0編程環(huán)境。
2)新建文件(*.c或*.cpp)。選擇“文件”→“新建”命令,彈出“新建”對(duì)話框,單擊“文件”選項(xiàng)卡,選擇“C++Source Files”,修改文件保存“目錄”和“文件”(文件名),單擊“確定”。
3)編輯和保存(注意:源程序一定要在英文狀態(tài)下輸入,即字符標(biāo)點(diǎn)都要在半角狀態(tài)下,同時(shí)注意大小寫,一般都用小寫)。在編輯窗口輸入源程序,然后選擇“文件”→“保存”或“文件”→“另存為”命令。
4)編譯(*.obj)。選擇“編譯”或“組建”→“編譯”命令或按〈Ctrl+F7〉快捷鍵,在彈出的工作區(qū)對(duì)話框中,單擊“是”按鈕。
5)連接(*.exe)。選擇“編譯”或“組建”→“組建”命令或按〈F7〉快捷鍵。
6)運(yùn)行。選擇“編譯”或“組建”→“執(zhí)行”命令或按〈Ctrl+F5〉快捷鍵或按〈F5〉。
7)關(guān)閉程序工作區(qū)。選擇“文件”→“關(guān)閉工作區(qū)(或空間)”命令。
8)打開文件。選擇“文件”→“打開”命令。
9)查看C源文件、目標(biāo)文件和可執(zhí)行文件的存放位置
一般源文件在保存目錄下,目標(biāo)文件和可執(zhí)行文件在“保存目錄\Debug”中。
3.編寫程序
編寫程序在屏幕上顯示一個(gè)短句“This is my first C program.”。
4.錯(cuò)誤程序調(diào)試示范
在屏幕上顯示一個(gè)短句“Welcome to you!”。帶有錯(cuò)誤的源程序如下:
操作步驟:
1)按照實(shí)驗(yàn)“2.運(yùn)行示例”中介紹的步驟1)~3)輸入上述源程序并保存。
2)編譯。選擇“編譯”或“組建”→“編譯”(或按〈Ctrl+F7〉組合鍵)命令,信息窗口中顯示編譯錯(cuò)誤提示,如圖1-2所示。
圖1-2 編譯錯(cuò)誤提示1
3)找出錯(cuò)誤,在信息窗口中依次雙擊提示信息,編輯窗口就會(huì)出現(xiàn)一個(gè)箭頭指向程序出錯(cuò)的位置,一般在箭頭的當(dāng)前行或上一行,可以找到出錯(cuò)語(yǔ)句。
圖1-2顯示出錯(cuò)位置為第4行,出錯(cuò)信息說明:Welcome是一個(gè)未定義的變量,但Welcome并不是變量,出錯(cuò)的原因是Welcome前少了一個(gè)雙引號(hào)。
4)改正錯(cuò)誤,重新編譯,得到如圖1-3所示編譯錯(cuò)誤提示:“}”前少了分號(hào)(;)。
5)再次改正錯(cuò)誤,在“}”前即printf()后加上“;”(英文狀態(tài)),重新編譯,顯示正確。
6)連接,選擇“編譯”或“組建”→“組建”(〈F7〉)命令,出現(xiàn)如圖1-4所示的連接錯(cuò)誤提示,即缺少主函數(shù)。
7)改正錯(cuò)誤,即把“mian”改為“main”后,重新連接,信息窗口顯示連接正確。
8)運(yùn)行,選擇“編譯”或“組建”→“執(zhí)行”(〈Ctrl+F5〉)命令,觀察結(jié)果是否與要求一致。
圖1-3 編譯錯(cuò)誤提示2
圖1-4 連接錯(cuò)誤提示
5.改錯(cuò),改正下列程序中的錯(cuò)誤。
帶有錯(cuò)誤的源程序:
三、實(shí)驗(yàn)報(bào)告要求
將實(shí)驗(yàn)中的源程序、運(yùn)行結(jié)果、實(shí)驗(yàn)中遇到的問題和解決問題的方法,以及實(shí)驗(yàn)過程中的心得體會(huì)都寫在實(shí)驗(yàn)報(bào)告上。后續(xù)實(shí)驗(yàn)報(bào)告要求相同。
- 商務(wù)英語(yǔ)翻譯理論與實(shí)踐運(yùn)用探索
- EDA技術(shù)與Verilog HDL設(shè)計(jì)
- 蘭州大學(xué)外國(guó)語(yǔ)學(xué)院211翻譯碩士英語(yǔ)[專業(yè)碩士]歷年考研真題及詳解
- 商務(wù)禮儀實(shí)務(wù)
- 自然語(yǔ)言處理導(dǎo)論
- 大學(xué)生國(guó)防與安全教育
- 新編國(guó)際商務(wù)談判
- 中國(guó)傳媒大學(xué)外國(guó)語(yǔ)學(xué)院245二外俄語(yǔ)歷年考研真題及詳解
- 立體構(gòu)成藝術(shù)
- Power BI財(cái)務(wù)大數(shù)據(jù)分析
- 民事訴訟法(第二版)
- 民事訴訟法教程
- 2020年管理類聯(lián)考綜合能力考試歷年真題與典型題詳解—邏輯分冊(cè)
- 機(jī)電專業(yè)英語(yǔ)
- 大連海事大學(xué)外國(guó)語(yǔ)學(xué)院357英語(yǔ)翻譯基礎(chǔ)[專業(yè)碩士]歷年考研真題及詳解