




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、21世紀(jì)高等院校規(guī)劃教材實(shí)用C語言程序設(shè)計(jì)教程 本章首先介紹算法和程序的概念以及程序設(shè)計(jì)的一般過程,然后介紹C語言的特點(diǎn)、C語言程序的結(jié)構(gòu),其次介紹Turbo C 2.0集成環(huán)境下的上機(jī)操作過程,最后介紹算法流程圖和N-S盒圖以及結(jié)構(gòu)化程序設(shè)計(jì)的概念。學(xué)習(xí)本章的目的是使讀者對C語言和程序設(shè)計(jì)有一個概略的了解,并掌握上機(jī)運(yùn)行簡單程序的操作步驟。 第1章 程序設(shè)計(jì)及C語言概述 第1章程序設(shè)計(jì)及C語言概述 1.1 算法與程序設(shè)計(jì)1.2 C語言的特點(diǎn) 1.3 C語言程序的結(jié)構(gòu) 1.4 TURBO C上機(jī)操作 1.5 流程圖及N-S盒圖1.6 結(jié)構(gòu)化程序設(shè)計(jì)概要 1.1 算法與程序設(shè)計(jì)1.1.1 算法
2、1.1.2 程序1.1.3 程序設(shè)計(jì)語言1.1.4 程序設(shè)計(jì)的一般過程 1.1.1 算法 計(jì)算機(jī)解決問題所依據(jù)的步驟稱為計(jì)算機(jī)算法,或簡稱算法。請看下面幾個例子。【例1-1】計(jì)算1+2+3+100,可采取以下兩種算法中的一種。算法一。可以設(shè)兩個變量(變量是指其值可以改變的量),一個變量代表和(s),一個變量代表加數(shù)(i),用循環(huán)算法表示如下:第一步:0s,1i。第二步:s+is。第三步:i+1i。第四步:如果i100,轉(zhuǎn)第二步;否則,轉(zhuǎn)第五步。第五步:輸出結(jié)果s,結(jié)束。算法二只有兩步:第一步:100101/2s。第二步:輸出s,結(jié)束。 【例1-2】判斷一個大于等于3的正整數(shù)是不是素?cái)?shù)。所謂素?cái)?shù)
3、是指除了1和該數(shù)本身之外,不能被其他任何整數(shù)整除的數(shù),例如23是素?cái)?shù),因?yàn)樗荒鼙?,3,4,21,22整除。 判斷素?cái)?shù)的方法很簡單,例如判斷n(n3)是不是素?cái)?shù),只需將n作為被除數(shù),將2到(n-1)各個整數(shù)輪流作除數(shù),作除法運(yùn)算,如果都不能被整除(余數(shù)不為0),則n是素?cái)?shù)。算法表示如下: 第一步:輸入n的值。第二步:i作除數(shù),2i。第三步:n除以i,得余數(shù)r。第四步:如果r=0,表示n能被i整除,則打印n不是素?cái)?shù),轉(zhuǎn)第七步;否則執(zhí)行第五步。第五步:i+1i。第六步:如果in-1,返回第三步;否則打印n是素?cái)?shù),轉(zhuǎn)第七步。第七步:結(jié)束。 算法的屬性:1有窮性有窮性是指一個算法的操作步驟必須是有限
4、的和合理的,即在合理的范圍之內(nèi)結(jié)束算法。例如求整數(shù)累加和的算法,由于整數(shù)本身是個無限集合,如果不限定其范圍,會導(dǎo)致求解步驟是無限的。又例如,計(jì)算機(jī)執(zhí)行某個算法需要幾千年,雖然是有限的,但卻是不合理的。當(dāng)然,究竟什么算“合理”,并沒有嚴(yán)格標(biāo)準(zhǔn),由人們的常識和需要而定。2確定性 算法中每個操作步驟都應(yīng)當(dāng)是明確的,而不應(yīng)是含糊的、模棱兩可的。在計(jì)算機(jī)算法中最忌諱的是歧義性,所謂“歧義性”是指可以被理解為兩種或多種可能的含義。因?yàn)橛?jì)算機(jī)至今還沒有主動思維的能力,如果給定的條件不確定,計(jì)算機(jī)就無法執(zhí)行。例如,“計(jì)算3月1日是一年中的第幾天”,這個問題是不確定的,因?yàn)闆]有指明哪一年,不知道是不是閏年,閏年
5、和平年2月份的天數(shù)不一樣,所以無法執(zhí)行。 3有零個或多個輸入 執(zhí)行算法時需要從外界獲得必要信息的操作稱為輸入。輸入的數(shù)據(jù)個數(shù)根據(jù)算法確定。例如計(jì)算1100累加和的算法不需要輸入;計(jì)算n!的算法需要輸入n的值;計(jì)算m和n的最大公約數(shù)和最小公倍數(shù)則需要輸入m和n兩個數(shù)的值。 4有一個或多個輸出執(zhí)行算法得到的結(jié)果就是算法的輸出,沒有輸出的算法是沒有意義的。最常見的輸出形式是屏幕顯示或打印機(jī)輸出,但并非惟一的形式。執(zhí)行算法的目的就是為了求解,“解”就是輸出。 5有效性 算法中的每一個步驟都應(yīng)當(dāng)有效地執(zhí)行,并得到確定的結(jié)果。例如當(dāng)b=0時,a/b是不能有效執(zhí)行的。又例如,在C語言中,“a%b”中的a和b
6、都必須是整型數(shù)據(jù),否則也不能有效執(zhí)行。 算法有優(yōu)劣之分,一般希望用簡單的和運(yùn)算步驟少的算法。因此,為了有效地進(jìn)行解題,不僅要保證算法正確,還要考慮算法的質(zhì)量,選擇合適的算法。 1.1.2 程序 用計(jì)算機(jī)語言描述的算法稱為計(jì)算機(jī)程序,或簡稱程序。只有用計(jì)算機(jī)語言描述的算法才能在計(jì)算機(jī)上執(zhí)行。換言之,只有計(jì)算機(jī)程序才能在計(jì)算機(jī)上執(zhí)行。人們編寫程序之前,為了直觀或符合人類思維方式,常常先用其他方式描述算法,然后再翻譯成計(jì)算機(jī)程序。 1.1.3程序設(shè)計(jì)語言 人類社會中有多種語言交流工具,每種語言又都有它的語法規(guī)則。人和計(jì)算機(jī)通信需要通過計(jì)算機(jī)語言。計(jì)算機(jī)語言是面向計(jì)算機(jī)的人造語言,是進(jìn)行程序設(shè)計(jì)的工具
7、,因此也稱程序設(shè)計(jì)語言。程序設(shè)計(jì)語言可以分為機(jī)器語言、匯編語言、高級語言。高級語言種類繁多(據(jù)統(tǒng)計(jì)有上千種),曾經(jīng)引起廣泛關(guān)注和使用的高級語言有FORTRAN、BASIC、Pascal和C等命令式語言(或稱過程式語言);有LISP、PROLOG等陳述式語言;還有當(dāng)前流行的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,例如C+、Java、Visual C+、Visual Basic、Delphi、PowerBuilder等。 計(jì)算機(jī)硬件能直接執(zhí)行的是機(jī)器語言程序。匯編語言也稱符號語言,用匯編語言編寫的程序稱匯編語言程序。計(jì)算機(jī)硬件不能識別和直接運(yùn)行匯編語言程序,必須由“匯編程序”將其翻譯成機(jī)器語言程序后才能識別和運(yùn)行
8、。同樣,高級語言程序也不能被計(jì)算機(jī)硬件直接識別和執(zhí)行,必須把高級語言程序翻譯成機(jī)器語言程序才能執(zhí)行。語言處理程序就是完成這個翻譯過程的,按照處理方式的不同,可以分為解釋型程序和編譯型程序兩大類。C語言采用編譯程序,即把用C語言寫的“源程序”編譯成“目標(biāo)程序”,再通過連接程序的連接,生成“可執(zhí)行程序”才能運(yùn)行。具體過程將在1.4節(jié)中詳細(xì)說明。 1.1.4 程序設(shè)計(jì)的一般過程 1建立數(shù)學(xué)模型 2算法描述 3編寫程序 4程序測試 1.2 C語言的特點(diǎn) C語言是一種高級語言,和其他高級語言相比,具有以下特點(diǎn)。 1兼有低級語言的功能 2結(jié)構(gòu)化的程序設(shè)計(jì)語言 3語言比較簡潔緊湊 4運(yùn)算符豐富 5數(shù)據(jù)結(jié)構(gòu)豐
9、富 6語法限制不太嚴(yán)格,書寫格式比較自由 7目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高 1.3 C語言程序的結(jié)構(gòu) 1.3.1 C語言程序的一般形式 【例1-4】下面程序的功能是:首先在屏幕上輸出英文提示“Please enter a number:”,然后等待用戶輸入一個數(shù),當(dāng)用戶輸入一個數(shù)并按回車鍵后,計(jì)算機(jī)計(jì)算出以此數(shù)為半徑的圓的面積,并在屏幕上輸出The area is 。“”表示對應(yīng)的圓面積值。#define PI 3.1416 area(float r) /*求面積的函數(shù)開始*/ float a; /*定義實(shí)型變量a*/ a=PI*r*r; /*計(jì)算面積并賦給變量a*/ printf(The a
10、rea is %f,a); /*輸出結(jié)果*/ main() /*主函數(shù)開始*/ float r; /*定義實(shí)型變量r*/ printf(Please enter a number: );/*輸出提示信息*/ scanf(%f,&r); /*等待輸入數(shù)給r*/ area(r); /*調(diào)用函數(shù)area()*/ 任何一個C程序都是由一個或多個函數(shù)構(gòu)成的,一個C程序中至少必須存在一個主函數(shù)main()。它是程序運(yùn)行開始時被調(diào)用的一個函數(shù)。C語言程序的一般形式如圖1-1的矩形框中所示。其中f1至fN代表用戶定義的函數(shù)。 預(yù)處理命令和全局性的聲明main() 局部變量聲明 語句序列 f1()局部變量聲明
11、語句序列 f2()局部變量聲明 語句序列 fn()局部變量聲明 語句序列 圖1-1 C程序的一般形式1.3.2 C程序中的主要成分1.3.2.1 預(yù)處理命令 預(yù)處理命令是程序中那些以符號 # 開頭的命令。C語言中常用的預(yù)處理命令有三類:文件包含、宏定義和條件編譯。例1-4的程序中#define PI 3.1416 就是宏定義命令,它的作用是為字符串“3.1416”起了一個名字,后邊凡是用到3.1416時都可以用PI去代替。1.3.2.2 函數(shù) 函數(shù)通常用于描述相對獨(dú)立的功能,每個函數(shù)都具有嚴(yán)格定義的格式,可以有參數(shù)和返回值。一個程序中除了一個必須取名為main的主函數(shù),其余函數(shù)可以取任何有意義
12、的名字。一個函數(shù)在執(zhí)行過程中可以調(diào)用其他函數(shù),也可以調(diào)用自己(稱為遞歸,詳見5.4節(jié))。任何函數(shù)(包括主函數(shù)main)都由函數(shù)首部和函數(shù)體兩部分組成。(1)函數(shù)的首部,即函數(shù)的第一行,對函數(shù)進(jìn)行說明,包括函數(shù)類型(可默認(rèn))、函數(shù)名、函數(shù)參數(shù)表(形參表)。 (2)函數(shù)體。函數(shù)首部之后的第一個大括號和與之配對的大括號之間的部分為函數(shù)體(大括號必須配對使用,如果一個函數(shù)內(nèi)有多對大括號,則最外面的一對大括號是函數(shù)體的范圍)。 函數(shù)體一般由說明部分和可執(zhí)行語句構(gòu)成。 1.3.2.3 輸入與輸出 輸入輸出是指程序與用戶進(jìn)行的數(shù)據(jù)或信息的交換,程序離不開輸入和輸出功能,用戶通過輸入為程序提供初始數(shù)據(jù),程序通
13、過輸出產(chǎn)生運(yùn)行結(jié)果。C語言中沒有定義輸入、輸出方法,但在程序中可以調(diào)用實(shí)現(xiàn)輸入輸出功能的庫函數(shù)。例1-3中的scanf()就是調(diào)用輸入函數(shù),等待用戶從標(biāo)準(zhǔn)輸入設(shè)備上輸入數(shù)據(jù)同時賦給相應(yīng)的變量。例1-3和例1-4中的printf()都是調(diào)用輸出函數(shù),從標(biāo)準(zhǔn)設(shè)備(顯示器)上輸出運(yùn)行結(jié)果。 1.3.2.4 語句 語句由單詞按照一定的語法規(guī)則構(gòu)成。例1-4中函數(shù)內(nèi)部的每一行都是一條語句。 C語言中有多種類型的語句,由這些語句構(gòu)成函數(shù),再由函數(shù)構(gòu)成程序。在1.2節(jié)“C語言的特點(diǎn)”中已提到,C語言程序的書寫格式比較自由,稱為無格式語言,但要注意以下幾點(diǎn): (1)程序中每個語句都必須以分號“;”結(jié)束,分號是
14、語句的一部分。 (2)允許一行內(nèi)寫幾條語句,也允許一條語句寫在幾行上。為了便于閱讀程序,最好一條語句占一行。如果一條語句很長,可以寫成幾行。 1.3.2.5 注釋 程序中提倡使用注釋。一個高質(zhì)量的程序,源程序中都應(yīng)該加上必要的注釋,以增強(qiáng)程序的可讀性,這對程序員和用戶都有很大的幫助。C語言的注釋格式為:/*/在例1-3和例1-4中凡是以“/*”和“*/”括起來的文字都是注釋。使用注釋時需要注意以下幾點(diǎn): (1)注釋可以單獨(dú)占一行,也可以跟在語句后面。 (2)“/*”和“*/”必須成對使用,并且“/”和“*”以及“*”和“/”之間不能有空格,否則會出錯。 (3)如果注釋內(nèi)容在一行寫不下,可以另起
15、一行繼續(xù)寫。 (4)注釋中允許使用漢字。在非中文操作系統(tǒng)下,看到的是一串亂碼,但不影響程序運(yùn)行。 因?yàn)橛?jì)算機(jī)不能識別和執(zhí)行C語言源程序,必須先用“編譯程序”把源程序翻譯成計(jì)算機(jī)能識別和執(zhí)行的二進(jìn)制指令形式的“目標(biāo)程序”;第三步把目標(biāo)程序與系統(tǒng)的函數(shù)庫以及其他目標(biāo)程序連接起來,形成可執(zhí)行的目標(biāo)程序;最后運(yùn)行“可執(zhí)行程序”得到結(jié)果。結(jié)果是否正確需要經(jīng)過驗(yàn)證,如果結(jié)果不正確則需要進(jìn)行調(diào)試。調(diào)試程序往往比編寫程序更困難、更費(fèi)時間。圖1-2表示了C程序編輯、編譯、連接和運(yùn)行的全過程。1.4 Turbo C上機(jī)操作C源程序目標(biāo)程序可執(zhí)行程序結(jié)果編輯(利用編輯程序)編譯(利用C編譯程序)連接(利用連接程序)
16、運(yùn)行圖1-2 C程序編輯、編譯、連接、運(yùn)行全過程 1.4.1 安裝Turbo C 為了使用Turbo C,需要先將其裝入磁盤的某一目錄下,例如放在C盤的根目錄下一級TC子目錄中。1.4.2 啟動 、退出Turbo C 在MS-DOS方式下,如果用戶已進(jìn)入Turbo C所在的子目錄,例如C盤根目錄下的TC子目錄,則只需從鍵盤輸入“tc”并按回車鍵。即 C:TCtc退出Turbo C有兩種方法: 菜單法:先選File主項(xiàng),再選Quit子項(xiàng)并按回車鍵。 快捷鍵法:Alt+X(按住Alt鍵,再按X鍵,之后同時放開)。1.4.3 編輯、編譯、連接、運(yùn)行的基本操作 有關(guān)C程序的編輯、編譯、連接和運(yùn)行的操作
17、需要熟練掌握,因?yàn)榫帉懙某绦蚴欠裾_只能通過上機(jī)檢驗(yàn),這就要求多編程序、多上機(jī),在編寫和調(diào)試程序的實(shí)踐中積累經(jīng)驗(yàn)。這里 1.4.3.1 建立新的C源程序并運(yùn)行 進(jìn)入Turbo C環(huán)境時,F(xiàn)ile為當(dāng)前項(xiàng),其他情況下按功能鍵F10激活主菜單,選中File主項(xiàng)。此時按回車鍵打開下拉子菜單,選擇New并按回車鍵,自動轉(zhuǎn)換為編輯(Edit)狀態(tài),便可輸入源程序。例如: main() int a,b; a=2; b=3; printf(dn,a+b); 輸入完檢查無誤后進(jìn)行編譯、連接、運(yùn)行,有兩種方法:程序執(zhí)行結(jié)果:5 1分步完成 按F9鍵或選擇執(zhí)行菜單中Compile主項(xiàng)的Make EXE File項(xiàng)
18、,如果沒有錯誤,則Turbo C自動完成當(dāng)前編輯的源程序文件的編譯、連接,生成可執(zhí)行文件;如果源程序有語法錯誤,系統(tǒng)將在屏幕中央的Compiling(編譯)窗口底部提示:“Error:Press any key”(錯誤:按任意鍵)。 按一下空格鍵,屏幕下端的Message(消息)窗口被激活,顯示錯誤或警告信息,光帶停在第一條信息上,同時Edit(編輯)窗口中也有一條光帶,它總是停在源代碼中編譯錯誤的相應(yīng)位置。 在消息窗口中用上下鍵移動光帶時,編輯窗口中的光帶也隨之移動,始終跟蹤源代碼中的錯誤位置。 2一次完成 編輯好源程序文件檢查無誤后,使用快捷鍵F9(Ctrl+F9),便可一次完成編譯、連接
19、、運(yùn)行。當(dāng)然,如果源程序有錯誤,也會提示錯誤信息,等待修改。程序能夠運(yùn)行并不一定是正確的,因?yàn)橛?jì)算機(jī)對程序中的邏輯錯誤無法判斷,例如把加號(+)寫成減號(-),大于號()寫成小于號(),語法上沒有錯誤,可以運(yùn)行,但結(jié)果不正確。如何查看結(jié)果呢? 選擇并執(zhí)行Run主項(xiàng)中的User Screen項(xiàng)或使用快捷鍵Alt+F5即可顯示運(yùn)行結(jié)果。按任意鍵返回編輯窗口。 如果結(jié)果與預(yù)期的不一樣,則可能有邏輯錯誤,需要仔細(xì)分析、檢查、修改,每次修改之后都要重新編譯、連接、運(yùn)行,直至結(jié)果正確為止。1.4.3.2 編輯、修改已有C源程序 選擇并執(zhí)行File主項(xiàng)中的Load項(xiàng)(或F3鍵),屏幕上出現(xiàn)一個對話框,如圖1
20、-5所示。 圖1-5 Turbo C 打開文件 如果知道文件名,直接輸入文件名,若該文件存在,系統(tǒng)就將它調(diào)入內(nèi)存并顯示在屏幕上,自動轉(zhuǎn)為編輯狀態(tài),便可對它進(jìn)行修改。如果指定的文件不存在,則給出一個空白編輯窗口,以供輸入新的源程序。 如果忘記了已有程序的文件名,可以按回車鍵,打開當(dāng)前目錄下后綴為.C的所有文件的文件名窗口,用方向鍵選定需要的文件名,按回車鍵,則該文件被調(diào)入內(nèi)存并顯示在屏幕上,在編輯狀態(tài)下對它進(jìn)行修改、編譯、連接和運(yùn)行。 1.5 流程圖及N-S盒圖 1.5.1 用流程圖表示算法流程圖是用一組框圖符號表示各種操作,也稱框圖。用流程圖表示算法直觀形象,易于理解。美國國家標(biāo)準(zhǔn)化協(xié)會ANS
21、I(American National Standard Institute)規(guī)定的一些常用流程圖符號,已為各國程序工作者普遍采用,如圖1-6所示。 圖1-6 常用流程圖符號起止框 輸入輸出框 判斷框 處理框 流程線 連接點(diǎn)【例1-5】計(jì)算1+2+3+4+100的流程圖見圖1-7。【例1-6】判斷一個大于等于3的數(shù)是不是素?cái)?shù)的流程圖見圖1-8。 打印n不是素?cái)?shù)開始i=2輸入n令r為n除以i的余數(shù)r=0 ?i=i+1in/2打印n是素?cái)?shù)結(jié)束YNYN開始s=0i=1i=i+1s=s+i輸出si100結(jié)束NY圖1-7 求1100累加和的流程圖 圖1-8 判斷素?cái)?shù)的流程圖1.5.2 用N-S盒圖表示算
22、法 N-S圖是美國學(xué)者I.Nassi和B.Shneiderman提出的一種新的流程圖形式(N和S是兩位學(xué)者的英文姓名的首字母)。在N-S圖中完全去掉了流程線,全部算法寫在一個矩形框內(nèi),在該框內(nèi)還可以包含其他的從屬于它的框,即由一些基本框組成一個大框。 N-S圖用圖1-9所示的符號表示三種基本結(jié)構(gòu)。(a)順序結(jié)構(gòu) (b)選擇結(jié)構(gòu) (c)當(dāng)型循環(huán)結(jié)構(gòu) (d)直到型循環(huán)結(jié)構(gòu) 圖1-9 三種基本結(jié)構(gòu)的N-S圖符號 AB條件 成立 不成立 A B當(dāng)條件成立直到條件不成立 A A直到條件不成立 除上述雙分支選擇結(jié)構(gòu)以外,還有多分支的選擇結(jié)構(gòu),如圖1-10所示,當(dāng)表示條件的值等于“值i”時執(zhí)行Ai框。雖然這
23、種結(jié)構(gòu)可以利用雙分支的嵌套來實(shí)現(xiàn),但C語言以及多數(shù)高級語言都提供了直接實(shí)現(xiàn)這種結(jié)構(gòu)的語句。 條件值1值2值nA1A2An圖1-10 多分支選擇結(jié)構(gòu) 前面的例1-5計(jì)算1到100累加和、例1-6判斷是否素?cái)?shù)的算法如圖1-12、圖1-13所示。 i=1,n=0當(dāng)i50 輸入score score60 N Y n=n+1 i=i+1i=1,s=0當(dāng)i100 輸出ss=s+Ii=i+1圖1-11統(tǒng)計(jì)及格人數(shù) 圖1-12 計(jì)算累加和 輸入n i=2 r=(n除以i的余數(shù)) Y r=0 N 輸出“n不是素?cái)?shù)” i=i+1 r0并且in/2 Y r0 N 輸出“n是素?cái)?shù)”圖1-13 判別n是否素?cái)?shù)1.6 結(jié)
24、構(gòu)化程序設(shè)計(jì)概要 一個結(jié)構(gòu)化程序應(yīng)符合以下標(biāo)準(zhǔn): (1)程序僅由順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)等三種基本結(jié)構(gòu)組成,基本結(jié)構(gòu)可以嵌套。 (2)每種基本結(jié)構(gòu)都只有一個入口和一個出口,即一端進(jìn),一端出。這樣的結(jié)構(gòu)置于其他結(jié)構(gòu)之間時,程序的執(zhí)行順序必然是從前一結(jié)構(gòu)的出口到本結(jié)構(gòu)的入口,經(jīng)本結(jié)構(gòu)內(nèi)部的操作,到達(dá)本結(jié)構(gòu)的惟一出口。 (3)程序中沒有死循環(huán)(不能結(jié)束的循環(huán)叫死循環(huán))和死語句(程序中永遠(yuǎn)執(zhí)行不到的語句叫死語句)。 C語言規(guī)定函數(shù)不允許嵌套定義,但可以嵌套調(diào)用。在定義函數(shù)時調(diào)用了另一個函數(shù),在執(zhí)行程序時如果1.6.2 結(jié)構(gòu)化程序設(shè)計(jì)方法遵循的原則 結(jié)構(gòu)化程序設(shè)計(jì)方法遵循的原則是:自頂向下,逐步求精
25、;模塊化設(shè)計(jì);結(jié)構(gòu)化編程。下面分別說明。1.6.2.1 自頂向下,逐步求精 把一個較大的復(fù)雜問題分解成若干相對獨(dú)立而又簡單的小問題,只要解決了這些小問題,整個問題也就解決了。如圖1-14所示。 主(功能)模塊模塊a模塊b模塊a2模塊b1模塊c模塊c1模塊a1模塊a3模塊b2模塊c2模塊c3圖1-14 自頂向下逐步求精示例 1.6.2.2 模塊化設(shè)計(jì)模塊化程序設(shè)計(jì)早在低級語言時期就已經(jīng)出現(xiàn)。但卻在結(jié)構(gòu)化程序設(shè)計(jì)的發(fā)展中得到充實(shí)、提高和完善。因此,它也是結(jié)構(gòu)化程序設(shè)計(jì)的組成部分。一般而言,模塊化設(shè)計(jì)是把復(fù)雜的算法或程序,分解成若干相對獨(dú)立、功能單一、甚至可供其他程序調(diào)用的模塊。在引入結(jié)構(gòu)化程序設(shè)計(jì)
26、之后,這些模塊不僅與通常所說的子算法、子程序或子過程有著相似的概念,是一種可供調(diào)用、相對獨(dú)立的程序段,而且必須是由三種基本結(jié)構(gòu)組成。整個系統(tǒng)猶如積木一般,由各個模塊組合而成。如圖1-15所示,各功能模塊用矩形框表示,實(shí)線箭頭表示模塊之間的調(diào)用關(guān)系,虛線箭頭表示返回。 mainABCD圖1-15 模塊化結(jié)構(gòu)示意圖 進(jìn)行模塊化設(shè)計(jì)時,注意在不同模塊中提取功能相同的部分,作為一個獨(dú)立的子模塊。這樣可以縮短程序,提高模塊的復(fù)用率。設(shè)計(jì)模塊時要盡量減小模塊間的耦合度(模塊間的相互依賴性),增大內(nèi)聚度(模塊內(nèi)各成分的相互依賴性)。耦合度越小,模塊相互間的獨(dú)立性就越大。內(nèi)聚度越大,模塊內(nèi)部各成分間的聯(lián)系就越
27、緊密,其功能也就越強(qiáng)。 程序中的子模塊,在C語言中通常用函數(shù)實(shí)現(xiàn),每個函數(shù)完成一個特定功能。根據(jù)經(jīng)驗(yàn)每個函數(shù)一般以50行以下為宜(打印時不超過一頁),這樣的規(guī)模便于組織,也便于閱讀。 1.6.2.3 結(jié)構(gòu)化編程 所謂結(jié)構(gòu)化編程是指利用高級語言提供的相關(guān)語句實(shí)現(xiàn)三種基本結(jié)構(gòu),每個基本結(jié)構(gòu)具有惟一的出口和入口,整個程序由三種基本結(jié)構(gòu)組成,程序中不用goto之類的語句。goto語句也稱轉(zhuǎn)移語句,用它可以改變程序中語句的執(zhí)行次序。1.6.3 結(jié)構(gòu)化程序設(shè)計(jì)舉例 下面以一個具體實(shí)例說明自頂向下,逐步求精的應(yīng)用。【例1-7】試從所有3位數(shù)的自然數(shù)中,選出滿足下列條件中一個或兩個的數(shù): (1)素?cái)?shù)。(2)“
28、水仙花數(shù)”。所謂“水仙花數(shù)”是指一個三位數(shù),其各位數(shù)字立方和等于該數(shù)本身。例如,153是一個水仙花數(shù),因?yàn)?53=13+53+33。解:所有三位數(shù)的自然數(shù)為100999間的數(shù),在其中尋找滿足條件的數(shù)。各種可能的條件為:1)素?cái)?shù)。2)水仙花數(shù)。3)素?cái)?shù)水仙花數(shù)。采用模塊化設(shè)計(jì)方法,系統(tǒng)結(jié)構(gòu)如圖1-16所示。 主模塊找出素?cái)?shù)模塊找出水仙花數(shù)模塊找出水仙花素?cái)?shù)模塊素?cái)?shù)判定模塊水仙花數(shù)判定模塊圖1-16 模塊化設(shè)計(jì)示意圖 1.6.3.1 主模塊算法設(shè)計(jì) 主模塊可謂一級求精模塊,用算法結(jié)構(gòu)化流程圖表示,如圖1-17所示。 開始顯示菜單1. 找素?cái)?shù); 2. 找水仙花數(shù); 3. 找水仙花素?cái)?shù)輸入類型代號(1
29、3)123在100999中找所有的素?cái)?shù)在100999中找所有的水仙花數(shù)在100999中找所有的水仙花素?cái)?shù)圖1-17 主模塊一級求精N-S圖 在圖1-17中,可對最下面的三個框進(jìn)一步求精,從左到右的二級求精分別如圖1-18、圖1-19和圖1-20所示。 用圖1-18、圖1-19、圖1-20代替圖1-17的相應(yīng)部分,可得到主模塊的二級求精N-S圖。這時,二級求精已經(jīng)到了實(shí)現(xiàn)級,不再需要進(jìn)一步求精。下面討論子模塊“素?cái)?shù)判定”和“水仙花數(shù)判定”的設(shè)計(jì)。1.6.3.2 子模塊的設(shè)計(jì)1素?cái)?shù)判定模塊的設(shè)計(jì)素?cái)?shù)判定模塊的N-S圖如圖1-21所示。輸出標(biāo)題“prime between 100 and 999”
30、n=100,101,999 調(diào)用素?cái)?shù)判定模塊prime Y n素?cái)?shù)嗎? N 輸出n 圖1-18 找出所有素?cái)?shù)二級求精N-S圖輸出標(biāo)題“l(fā)otus numbers between 100 and 999” n=100,101,999 調(diào)用水仙花數(shù)判定模塊lotus Y n是水仙花數(shù)嗎? N 輸出n 圖1-19 找出所有水仙花數(shù)二級求精N-S圖2水仙花數(shù)判定模塊的設(shè)計(jì)水仙花數(shù)判定模塊的N-S圖如圖1-22所示。 輸出標(biāo)題“l(fā)otus prime between 100 and 999” n=100,101,999 調(diào)用素?cái)?shù)判定模塊prime和水仙花數(shù)判定模塊lotus Y n是水仙花數(shù)和素?cái)?shù)嗎?
31、N 輸出n 圖1-20 找出所有水仙花素?cái)?shù)二級求精N-S圖 2jn/2 Y n除以j的余數(shù)=0? N 返回0(n為非素?cái)?shù)標(biāo)志) 返回1(n為素?cái)?shù)標(biāo)志)圖1-21 素?cái)?shù)判定算法N-S圖 i=n/100 n這個數(shù)百位上的數(shù)字 j=(n-i*100)/10 n這個數(shù)十位上的數(shù)字 k=(n除以10取余) n這個數(shù)個位上的數(shù)字 m=i3+j3+k3 Y n=m? N 返回1(n為水仙花數(shù)標(biāo)志) 返回0(n為非水仙花數(shù)標(biāo)志) 圖1-22 水仙花數(shù)判定算法N-S圖 計(jì)算機(jī)算法處理的對象是數(shù)據(jù),而數(shù)據(jù)是以某種特定形式存在的。例如整數(shù)、實(shí)數(shù)、字符等,不同的形式對應(yīng)不同的數(shù)據(jù)類型。本章介紹的常數(shù)、變量,可以比作日
32、常語言中的單字,表達(dá)式可以比作詞匯或短語,而運(yùn)算符可比作連詞或介詞等輔助詞匯。學(xué)習(xí)本章的目的是要掌握C語言的常用詞匯要素,為學(xué)習(xí)C語言各種語句做好必要的準(zhǔn)備。第2章 C語言中的表達(dá)式第2章 C語言中的表達(dá)式2.1 C語言的數(shù)據(jù)類型2.2 常量和變量2.3 整型數(shù)據(jù)2.4 實(shí)型數(shù)據(jù)2.5 字符型數(shù)據(jù)1.6 系統(tǒng)函數(shù) 2.1 C語言的數(shù)據(jù)類型 數(shù)據(jù)類型明顯或隱含地規(guī)定了在程序執(zhí)行期間變量或表達(dá)式所有可能的取值范圍,以及在這些值上允許進(jìn)行的操作。因此一種數(shù)據(jù)類型是一個值的集合和定義在這個值集上的一組操作的總稱。例如,C語言中的整型變量,其值集是某個區(qū)間上的整數(shù)(區(qū)間大小依賴不同的計(jì)算機(jī)),定義在其上
33、的操作為:加、減、乘、除、取模等算術(shù)運(yùn)算。不同類型的數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中的表示方式不同,而且一般來講,所占內(nèi)存空間的位數(shù)也不同。 C語言的各種數(shù)據(jù)類型可用圖2-1表示。 基本類型數(shù)據(jù)類型字符型整型實(shí)型雙精度實(shí)型空類型聚合類型指針類型用戶自定義類型數(shù)組類型結(jié)構(gòu)體類型共用體類型枚舉類型位段類型圖2-1 C語言的數(shù)據(jù)類型 2.2 常量和變量2.2.1 常量和符號常量2.2.1.1 常量 在程序運(yùn)行過程中,其值不能被改變的量稱為常量,常量又叫常數(shù)。常量區(qū)分為不同的類型,如100,0,-8為整型常量,25.32,0.142為實(shí)型常量,A,B是字符型常量。從常量的字面形式即可判別其值,因此也稱這種常量為字面
34、常量或直接常量。2.2.1.2 符號常量 也可以用一個符號(標(biāo)識符)代表一個常量,例如: #define MAXNUM 1000 #define TRUE 1 #define FALSE 0 以上三個命令行定義了三個符號常量MAXNUM、TRUE和FALSE,此后凡在本程序中出現(xiàn)的MAXNUM都代表1000,TRUE都代表1,F(xiàn)ALSE都代表0,它們可以和常量一樣進(jìn)行運(yùn)算。 符號常量的定義格式如下: #define 符號常量 常量 2.2.2 標(biāo)識符與變量2.2.2.1 標(biāo)識符 在C 語言中,標(biāo)識符是對變量、符號常量、函數(shù)、數(shù)組、文件等用戶定義對象的命名。標(biāo)識符的長度可以是一個或多個字符。絕大
35、多數(shù)情況下,標(biāo)識符的第一個字符必須是英文字母或下劃線,隨后的字符必須是字母、數(shù)字或下劃線。不能以數(shù)字打頭,不能使用其他符號。下面是一些正確或錯誤標(biāo)識符命名的示例。正確標(biāo)識符 錯誤標(biāo)識符 weight 2x length a|#b color2 red!color _save _$123 ANSI(美國國家標(biāo)準(zhǔn)化協(xié)會)建議標(biāo)準(zhǔn)規(guī)定,標(biāo)識符長度可以任意,但是外部名必須能由前6個字符惟一地區(qū)分。這里外部名指的是在連接過程中所涉及的標(biāo)識符,其中包括文件間共享的函數(shù)名和全局變量名。這是因?yàn)閷δ承﹥H識別前6個字符的編譯程序而言,下面的外部名將被當(dāng)作同一個標(biāo)識符處理。 number1 number2 num
36、ber3 ANSI 標(biāo)準(zhǔn)還規(guī)定內(nèi)部名必須至少能由前31個字符惟一地區(qū)分。內(nèi)部名指的是僅出現(xiàn)在定義該標(biāo)識符的文件中的那些標(biāo)識符。 各個C編譯系統(tǒng)都有自己的規(guī)定。這樣,在實(shí)際工作中應(yīng)查閱編譯程序的用戶手冊,以確定實(shí)際使用的C語言編譯程序究竟識別標(biāo)識符的前多少位字符。例如Turbo C允許標(biāo)識符為32個字符;MS C則取八個字符,假如程序中出現(xiàn)的變量名長度大于八個字符,則只有前面八個字符有效,后面的不被識別。為了程序的可移植性以及閱讀程序的方便,建議變量名的長度不要超過八個字符。 C語言中的字母是有大小寫區(qū)別的,因此true 、True 和TRUE是三個不同的標(biāo)識符。 標(biāo)識符不能和C語言的關(guān)鍵字相同
37、,也不能和用戶已編制的函數(shù)或C語言庫函數(shù)同名。 關(guān)于C語言的關(guān)鍵字和C語言庫函數(shù),讀者可參閱附錄2和附錄3。2.2.2.2 變量 在程序運(yùn)行中,其值可改變的量稱為變量。一個變量有一個名字,在內(nèi)存中占據(jù)一定的存儲單元,用以存放變量的值。變量名和變量值這兩個不同的概念。變量名是一個符號地址,程序編譯連接時由系統(tǒng)給每一個變量名分配一個內(nèi)存地址。從變量中取值,實(shí)際上是通過變量名找到相應(yīng)的內(nèi)存地址,從其存儲單元中讀取數(shù)據(jù)。 變量和符號常量的命名都遵循標(biāo)識符的命名規(guī)則,習(xí)慣上人們將變量名中的字母用小寫表示,符號常量中的字母用大寫表示。 C語言系統(tǒng)本身也使用變量名,一般都是以下劃線開頭的,為了區(qū)別,用戶程序
38、中的變量名一般都不以下劃線開頭。 在C語言中,要求對所有用到的變量都作強(qiáng)制定義,也就是“先定義,后使用”。例如,下面兩句分別定義了兩個整型變量a、b和三個實(shí)型變量x、y、z。 int a,b; float x,y,z; 以上兩句中,int和float稱為類型說明符,屬于C語言的關(guān)鍵字,分別表示整型和實(shí)型(或稱浮點(diǎn)型)。C語言有五種基本數(shù)據(jù)類型:字符型、整型、實(shí)型、雙精度實(shí)型和空類型。定義這五種類型的變量時須使用的類型說明符分別為char、int、float、double和void。 表2-1給出了五種基本數(shù)據(jù)類型的長度和范圍。 類型長度(位)范圍備注 char 80255 int 16-327
39、6832767float 32約精確到6位數(shù)數(shù)值大小由具體機(jī)型和編譯系統(tǒng)而定double 64約精確到12位數(shù)數(shù)值大小由具體機(jī)型和編譯系統(tǒng)而定void 0無值2.2.2.3 類型修飾符 除void類型外,基本類型的前面可以有各種修飾符。修飾符用來改變基本類型的意義,以便更準(zhǔn)確地適應(yīng)各種情況的需求。 類型修飾符signed、unsigned、short和long是C語言的關(guān)鍵字,signed、unsigned、short和long適用于字符和整數(shù)兩種基本類型,而long還可用于double型(注意,由于long float與double意思相同,所以ANSI標(biāo)準(zhǔn)刪除了多余的long float)
40、。 整數(shù)的默認(rèn)定義是有符號數(shù),所以signed這一用法是多余的,但仍允許使用。 某些C編譯系統(tǒng)允許將unsigned用于浮點(diǎn)型,如unsigned float。但這一用法降低了程序的可移植性,故建議一般不要采用。 有符號和無符號整數(shù)的區(qū)別是對整數(shù)最高位的解釋不同。若指定一個有符號整數(shù),那么C編譯程序生成代碼時將整數(shù)最高位作為符號標(biāo)志。若符號標(biāo)志是0,則數(shù)值為正;若為1,則數(shù)值為負(fù)。例如: 127的二進(jìn)制數(shù)為0000000011111111 -127的二進(jìn)制數(shù)為1000000011111111 注意這里是用“原碼”形式來說明問題,而大多數(shù)計(jì)算機(jī)采用“補(bǔ)碼”形式,所以實(shí)際上(-127)的表示與上式
41、不同,不過,關(guān)于符號標(biāo)志的用法還是相同的。2.3整型數(shù)據(jù) 2.3.1 整型常量2.3.1.1 不同進(jìn)制數(shù)的使用 在C語言中,整型常數(shù)既可以用十進(jìn)制數(shù)表示,也可以用八進(jìn)制和十六進(jìn)制表示。 十進(jìn)制整數(shù)的表示與通常在算術(shù)中的表示一樣,例如:321,+321,-147,0等。 八進(jìn)制整數(shù)必須以數(shù)字0開頭,例如0123表示八進(jìn)制數(shù)123,即(123)8,等于十進(jìn)制數(shù)83。-011表示八進(jìn)制數(shù)-11,即十進(jìn)制數(shù)-9。 十六進(jìn)制整數(shù)必須以0 x(數(shù)字0加小寫字母x)開頭,例如0 x123,代表16進(jìn)制數(shù)(123)16,等于十進(jìn)制數(shù)291。-0 x20A表示十六進(jìn)制數(shù)-20A,等于十進(jìn)制數(shù)-522。 2.3.
42、1.2 不同類型的整型常量 整型變量可細(xì)分為int、short int、long int、unsigned int、unsigned short、unsigned long等類別。那么常量是否也有這些類別?在將一個整型常量賦值給上述幾種類別的整型變量時如何做到類型匹配?在多數(shù)微機(jī)中,請注意以下幾點(diǎn): (1)一個整型常數(shù),如果其不超出兩個字節(jié)表示的有符號數(shù)的范圍,即其值在-32768+32767范圍內(nèi),系統(tǒng)認(rèn)為它是int型,程序中可將它賦值給int型和long int型變量。 (2)一個整型常數(shù),如果其超出了上述范圍,但不超出四個字節(jié)表示的有符號數(shù)的范圍,即其值在-2147483648+2147
43、483647范圍內(nèi),則認(rèn)為它是長整型。可以將它賦值給一個long int型變量。 (3)在Turbo C等編譯系統(tǒng)中,確定short int型與int型數(shù)據(jù)在內(nèi)存中占據(jù)的長度相同,所以這兩種類型的數(shù)值范圍也相同。一個int型的常量也同時是一個short int型常量,可以賦給int型或short int型變量。所以在這些系統(tǒng)中,不需使用short int型變量。 (4)常量無unsigned型。但一個非負(fù)值的整數(shù)可以賦值給unsigned int型變量,只要它的范圍不超過變量的取值范圍即可。例如,將60000賦給一個unsigned int型變量是可以的,而將70000賦給該變量是不行的(溢出
44、)。 (5)在一個整常數(shù)后面加一個小寫字母l或大寫字母L,則認(rèn)為是long型常量。例如-123l、123L、0L、0775L、0 x9EL等。這往往用于函數(shù)調(diào)用中,如果函數(shù)的形參為long型,則要求實(shí)參也為long 型,此時用456作實(shí)參不行,必須用456L作實(shí)參。 2.3.2 整型變量2.3.2.1 整型數(shù)據(jù)在內(nèi)存中的存放形式 在計(jì)算機(jī)中數(shù)是用二進(jìn)制表示的,把一個數(shù)連同其符號在計(jì)算機(jī)中加以數(shù)值化,這樣的數(shù)稱為機(jī)器數(shù),機(jī)器數(shù)可以用不同的碼制(原碼、補(bǔ)碼)表示。采用原碼時真值與機(jī)器數(shù)之間的轉(zhuǎn)換直觀簡便,采用補(bǔ)碼時轉(zhuǎn)換煩瑣但運(yùn)算規(guī)則簡單。多數(shù)計(jì)算機(jī)采用補(bǔ)碼表示法。2.3.2.2 整型變量的分類 可
45、以根據(jù)數(shù)值的范圍將整型變量分為基本整型、短整型或長整型。基本整型,類型說明符為int。短整型,類型說明符為short int或short。長整型,類型說明符為long int或long。(1)有符號基本整型 signed int。(2)有符號短整型 signed short int。(3)有符號長整型 signed long int。(4)無符號基本整型 unsigned int。(5)無符號短整型 unsigned short int。(6)無符號長整型 unsigned long int。 類型占字節(jié)數(shù)取值范圍 int2字節(jié)-3276832767 short2字節(jié)-3276832767 l
46、ong4字節(jié)-21474836482147483647unsigned int2字節(jié)065535unsigned short2字節(jié)065535unsigned long4字節(jié)04294967295表2-2 ANSI標(biāo)準(zhǔn)定義的整數(shù)類型 2.3.2.3 整型變量的定義 C語言規(guī)定所有用到的變量都必須在程序中定義。這和Basic、FORTRAN不同,而和Pascal相類似。例如: int a,b; long c,d; unsigned e,f,g; 以上三條定義語句,分別定義了兩個整型變量,兩個長整型變量,三個無符號整型變量。 對變量的定義,一般是放在一個函數(shù)的開頭的聲明部分。 【例2-1】 mai
47、n() int a ; unsigned int b; long c; unsigned long d; a=-100; b=60000; c=-2123456789; d=4123456789; printf(a=%d,b=%u,c=%ld,d=%lu,a,b,c,d); 運(yùn)行結(jié)果為a=-100,b=60000,c=-2123456789,d=4123456789【例2-2】下列程序運(yùn)行時發(fā)生整型數(shù)據(jù)的溢出。 main() ( int x,y; x=32767; y=x+1; printf(%d,%d,x,y); 運(yùn)行結(jié)果 32767,32768 請注意:一個整型變量只能容納-3276832
48、767范圍內(nèi)的數(shù),無法表示大于32767的數(shù)。遇到這種情況就發(fā)生“溢出”,但運(yùn)行時并不報(bào)錯。它好像鐘表一樣,達(dá)到最大值12點(diǎn)以后,又從最小值開始計(jì)數(shù)。所以,32767加1得不到32768,而得到-32768。這種結(jié)果一般不是程序員所需要的。為了避免此類現(xiàn)象的發(fā)生,了解不同類型變量的取值范圍是必要的。 2.4.1 實(shí)型常量的表示方法 實(shí)型常數(shù)也稱為浮點(diǎn)數(shù),在C語言中實(shí)型常數(shù)只使用十進(jìn)制數(shù)表示,它的書寫方式有兩種: (1)小數(shù)形式。 它是由整數(shù)、小數(shù)點(diǎn)、小數(shù)三部分組成,最多只能省略其中的整數(shù)或小數(shù)部分,但不能二者都省略,也不能省略小數(shù)點(diǎn)。例如123.,-.123,1.23,-1.23,12.0,0
49、.,.0,0.0都是合法的十進(jìn)制小數(shù)形式。2.4 實(shí)型數(shù)據(jù)(2)指數(shù)形式。 它是由尾數(shù)、字母e或E、指數(shù)三部分組成。尾數(shù)可以是一個十進(jìn)制小數(shù)形式,也可以是一個整數(shù)形式,如123e-3或123E-3都代表12310-3的值。注意字母e(或E)之前必須有數(shù)字,且后面指數(shù)必須為整數(shù),如-0.32E-2,2E4,-.23E-2,.0E3,0.E-5,0E0等都是合法的指數(shù)形式,而E-5,.E2,12.3E5.4卻是非法的指數(shù)形式。 一個實(shí)數(shù)可以有多種指數(shù)表示形式。例如123.456可以表示為,123456e-3,0.123456e3,1.23456e2等。其中的1.23456e2稱為“規(guī)范化的指數(shù)形式
50、”。即在字母e(或E)之前的小數(shù)部分中,小數(shù)點(diǎn)左邊應(yīng)有一位(只能有一位)非零的數(shù)字。一個實(shí)數(shù)在用指數(shù)形式輸出時,是按規(guī)范化的指數(shù)形式輸出的。例如,將實(shí)數(shù)654.321按指數(shù)形式輸出,必然輸出6.54321E+002,而不會是0.654321E+003或654.321E+000。2.4.2 實(shí)型變量2.4.2.1 實(shí)型數(shù)據(jù)在內(nèi)存中的存放形式 與整型數(shù)據(jù)的存儲方式不同,實(shí)型數(shù)據(jù)是按指數(shù)形式存儲的。系統(tǒng)把一個實(shí)型數(shù)據(jù)分成尾數(shù)部分和指數(shù)部分分別存放。實(shí)型數(shù)據(jù)在內(nèi)存中小數(shù)點(diǎn)位置不是固定的,或者說是浮動的,故這種表示法稱為浮點(diǎn)表示法。2.4.2 實(shí)型變量2.4.2.1 實(shí)型數(shù)據(jù)在內(nèi)存中的存放形式 與整型數(shù)
51、據(jù)的存儲方式不同,實(shí)型數(shù)據(jù)是按指數(shù)形式存儲的。系統(tǒng)把一個實(shí)型數(shù)據(jù)分成尾數(shù)部分和指數(shù)部分分別存放。實(shí)型數(shù)據(jù)在內(nèi)存中小數(shù)點(diǎn)位置不是固定的,或者說是浮動的,故這種表示法稱為浮點(diǎn)表示法。2.4.2.2 實(shí)型變量的定義 對每一個實(shí)型變量都應(yīng)在使用前加以定義。如 float x,y; 上述語句定義了兩個實(shí)型變量x和y,每個變量的值在內(nèi)存中一般占4個字節(jié)。 2.4.2.3 實(shí)型數(shù)據(jù)的舍入誤差由于實(shí)型變量是由有限的存儲單元組成的,因此能提供的有效數(shù)字總是有限的。在有效范圍以外的數(shù)字將被舍去。由此可能會產(chǎn)生一些誤差。請分析下面的程序:【例2-3】分析實(shí)型數(shù)據(jù)的舍入誤差。 main() float a; a=12
52、345.6789; printf(n%f,a); printf(n%e,a);在Turbo C中程序運(yùn)行結(jié)果為:12345.6787111.234568e+002 程序內(nèi)printf()函數(shù)中的“%f”是輸出一個實(shí)數(shù)時的格式符,這種情況下默認(rèn)小數(shù)點(diǎn)后保留6位數(shù)字。變量a的理論值應(yīng)是12345.6789,而一個實(shí)型變量只能保證7位有效數(shù)字,即從第一個非零數(shù)字算起,前7位有效,后面的數(shù)字無意義。運(yùn)行程序得到的值是12345.678711,可以看到,前8位是正確的,后幾位不正確。 printf函數(shù)中的“%e”是用指數(shù)形式輸出一個實(shí)數(shù)時的格式符,這種情況下默認(rèn)e前面部分小數(shù)點(diǎn)后保留6位小數(shù),保證7位有
53、效數(shù)字。輸出結(jié)果1.234568e+002中的8是四舍五入得來的。 2.4.3 雙精度型數(shù)據(jù) 實(shí)型也稱為單精度實(shí)型或單精度浮點(diǎn)型。雙精度型也稱為雙精度實(shí)型或雙精度浮點(diǎn)型。2.4.3.1 雙精度常數(shù) 雙精度常數(shù)的書寫方式與實(shí)型常數(shù)的書寫方式完全相同,有十進(jìn)制小數(shù)形式和指數(shù)形式兩種。 雙精度數(shù)據(jù)比實(shí)型數(shù)據(jù)的范圍廣、精度高。多數(shù)C編譯系統(tǒng)(例如Turbo C、MS C)將單精度實(shí)型常量作為雙精度來處理。 將一個實(shí)型常數(shù)賦給一個雙精度變量不會有什么問題,反之,將一個超出實(shí)數(shù)范圍或精度的雙精度常數(shù)賦給一個實(shí)型變量,系統(tǒng)會截取該常數(shù)的一部分賦值給變量,這樣得到的結(jié)果會與原值不符。2.4.3.2 雙精度數(shù)據(jù)
54、在內(nèi)存中的表示形式 ANSI并未具體規(guī)定每種類型數(shù)據(jù)的長度、精度和數(shù)值范圍。在微機(jī)上,雙精度變量的值在內(nèi)存中的長度一般比單精度實(shí)型的大一倍,即占8個字節(jié)。表2-3列出微機(jī)上常用的C編譯系統(tǒng)(如Turbo C,MS C,Borland C)中實(shí)型數(shù)據(jù)的情況。 類型二進(jìn)制位數(shù)有效數(shù)字?jǐn)?shù)值范圍float326710-371038double64151610-30710308long double128181910-4931104932表2-3 實(shí)型和雙精度型數(shù)據(jù) 2.4.3.3 雙精度變量的定義 雙精度類型標(biāo)識符double前還可加修飾符long,long double 比double型的精度更高,
55、表示的數(shù)值范圍更大。 2.5 字符型數(shù)據(jù) 2.5.1 字符常量 C語言的字符常量是用單引號()括起來的單個字符。例如A,!,#,a,* 等都是字符常量。 除字符常量外,在C語言中,將“”開頭的特定字符串稱為“轉(zhuǎn)義字符”,意思是將反斜杠后面的字符串轉(zhuǎn)換成另外的意義。例如n代表的“換行”符,在程序中無法用一個一般形式的字符表示,類似的還有r,b,t等。常用的轉(zhuǎn)義字符如表2-4所示。 轉(zhuǎn)義字符含義ASCII代碼(十進(jìn)制)n換行,將當(dāng)前位置移到下一行開頭10t水平制表(跳到下一個Tab位置)9b退格,將當(dāng)前位置移到前一格8r回車,將當(dāng)前位置移到本行開頭13反斜杠字符“”92單引號字符39”雙引號字符3
56、4ddd一到三位八進(jìn)制數(shù)ddd代表的字符ddd (八進(jìn)制)xhh一到兩位十六進(jìn)制數(shù)hh代表的字符hh(十六進(jìn)制)表2-4 轉(zhuǎn)義字符及其作用 例如,字符常數(shù)A有三種等價的表示形式:即A、101和x41。試看下面程序例子: main() printf(A,101,x41); 程序運(yùn)行結(jié)果為 A, A, A 在C語言中有些不能顯示的控制符也有三種等價的形式,例如回車控制符可寫為n、12或xA。但有些控制符只有兩種等價的形式,例如,ASCII碼為0的控制字符(即“空操作”字符),可寫為0或x0。【例2-4】下面程序中使用了幾種轉(zhuǎn)義字符。 main() printf(abxbcdtefghtijkln)
57、; printf(xxxxxxxxrmnoptqrstuvwxn); 程序運(yùn)行時在顯示屏上得到以下結(jié)果: abcd efgh ijkl mnop qrst uvwx 2.5.2 字符變量 字符變量用來存放字符常量,一個字符變量只能放一個字符。字符變量的定義形式如下:char 變量名表列;例如:char c1,c2;定義了兩個字符型變量c1和c2,各放一個字符,例如將字符常量A和B分別賦給它們,可用下面語句: c1=A; c2=B;【例2-5】將字符數(shù)據(jù)以不同的方式輸出。 main() char c1,c2; c1=A; c2=B; printf(%c,%cn,c1,c2); printf(%d
58、,%d,c1,c2); 程序運(yùn)行結(jié)果為A,B65,66【例2-6】大小寫字母的轉(zhuǎn)換。main()char c1,c2,c3,c4; c1=A; c2=B; c3=c1+32; c4=c2+32; printf(%c,%c,c3,c4);運(yùn)行結(jié)果為a,b2.5.3 字符串常量 字符串常量簡稱為“字符串”。在C語言中,字符串就是用兩個雙引號()括起來的若干個字符。例如China、88383872、AJ200都是字符串。要特別注意雙引號是作為字符串的標(biāo)記,所以在字符串中使用雙引號必須用轉(zhuǎn)義字符“”。例如,ABCD是表示“ABCD”這一串字符的。 一個字符串中所有字符的個數(shù)稱為該字符串的長度,其中每個
59、轉(zhuǎn)義字符只能當(dāng)作一個字符。例如,字符串China、0618、ABCD、101102x43x44的長度分別為5、4、6、4。 雖然在內(nèi)存中每個字符只占一個字節(jié),但C語言規(guī)定,每個字符串在內(nèi)存中占用的字節(jié)數(shù)等于字符串的長度+1。其中最后一個字節(jié)存放的字符稱為“空字符”,其ASCII碼為0。書寫時常用轉(zhuǎn)義字符“0”來表示,在C語言中稱為字符串結(jié)束標(biāo)志。“0”是一個ASCII碼為0的字符,從ASCII代碼表中可以看到ASCII碼為0的字符是“空操作字符”,即它不引起任何控制動作,也不顯示字符。例如字符串A和AB的長度分別為1和2,它們在內(nèi)存中分別占兩個和三個字節(jié)。 注意,A和A是不同的,前者是字符串常
60、量,是用雙引號括住的,在內(nèi)存中占用兩個字節(jié);后者是字符常量,是用單引號括住的,在內(nèi)存中只占一個字節(jié)。不能把一個字符串賦給一個字符變量。 在C語言中沒有專門的字符串變量。如果想將一個字符串存放在變量中以便保存,必須使用字符數(shù)組,即用一個字符型數(shù)組來存放一個字符串,數(shù)組中每一個元素存放一個字符。這將在第4章介紹。2.6 系統(tǒng)函數(shù) 2.6.1 簡例【例2-7】假設(shè)根據(jù)自變量x不同的值求下式的值: x7+sinx-log10(x+3) 在C語言中可使用以下程序: #include main() float x,y; scanf(%f,&x); y=pow(x,7)+sin(x)-log10(x+3);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 礦石浮選工藝優(yōu)化-石墨滑石選礦考核試卷
- 畜禽繁殖力與遺傳改良研究考核試卷
- 紡織材料與纖維的研究與發(fā)展考核試卷
- 電腦系統(tǒng)優(yōu)化與提速技巧考核試卷
- 筆的制造生產(chǎn)計(jì)劃編制與執(zhí)行考核試卷
- 嘉興南湖學(xué)院《Python數(shù)據(jù)分析與應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 昆明理工大學(xué)津橋?qū)W院《CAD制圖》2023-2024學(xué)年第二學(xué)期期末試卷
- 咸陽市2025年三年級數(shù)學(xué)第二學(xué)期期末學(xué)業(yè)水平測試試題含解析
- 日照職業(yè)技術(shù)學(xué)院《國際商務(wù)創(chuàng)業(yè)策劃案例分析》2023-2024學(xué)年第二學(xué)期期末試卷
- 寧德市周寧縣2024-2025學(xué)年數(shù)學(xué)四年級第二學(xué)期期末考試試題含解析
- “皖南八校”2024-2025學(xué)年高一第二學(xué)期期中考試-生物(乙)及答案
- 血站安全與衛(wèi)生培訓(xùn)課件
- 人教版四年級數(shù)學(xué)下冊期中期中測試卷(提優(yōu)卷)(含答案)
- 巖土真實(shí)考試題及答案
- 高考前的“加速度”高三下學(xué)期期中家長會
- 畢業(yè)設(shè)計(jì)(論文)-板材碼垛機(jī)器人機(jī)械結(jié)構(gòu)設(shè)計(jì)
- 銷售人員合同范文
- 網(wǎng)絡(luò)安全教育主題班會
- 福建省泉州市2023年第29屆WMO競賽六年級數(shù)學(xué)下學(xué)期競賽試卷
- 各國貨幣知識
評論
0/150
提交評論