




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章C語言概述本章主要介紹C語言程式的結構和書寫規則,以及TurboCV2.0的基本操作。1.1C語言的發展簡史和特點1.2C語言程式的結構與書寫規則1.3TurboCV2.0的基本操作1.1C語言的發展簡史和特點1.C語言的誕生與發展(1)在C語言誕生以前,系統軟體主要是用組合語言編寫的。由於組合語言程式依賴於電腦硬體,其可讀性和可移植性都很差;但一般的高級語言又難以實現對電腦硬體的直接操作(這正是組合語言的優勢),於是人們盼望有一種兼有組合語言和高級語言特性的新語言。(2)C語言是貝爾實驗室於70年代初研製出來的,後來又被多次改進,並出現了多種版本。80年代初,美國國家標準化協會(ANSI),根據C語言問世以來各種版本對C語言的發展和擴充,制定了ANSIC標準(1989年再次做了修訂)。本書以ANSIC新標準來介紹。(3)目前,在微機上廣泛使用的C語言編譯系統有MicrosoftC、TurboC、BorlandC等。雖然它們的基本部分都是相同的,但還是有一些差異,所以請大家注意自己所使用的C編譯系統的特點和規定(參閱相應的手冊)。本書選定的上機環境是TCV2.0(DOS操作系統)。
2.C語言的特點
C語言同時具有組合語言和高級語言的優勢。(1)語言簡潔、緊湊,使用方便、靈活。(2)運算符極其豐富。共有34種運算符。(3)數據結構豐富。C的數據類型有整形、實型、字元型、數組類型、指針類型、結構體類型、共用體類型等。(4)具有結構化的控制語句。IF……ELSE(5)語法限制不太嚴格、程式設計自由度大。(6)生成的目標代碼品質高,程式執行效率高。(7)可移植性好(較之組合語言)。(8)可以直接操縱硬體。
3.在C語言中,除實現順序、選擇和迴圈三種基本結構等的9條控制語句外,輸入輸出操作均由標準庫函數(不是C語言的組成部分)來實現。所以學習C語言,不僅要學習這9條控制語句和各種運算符,而且要學習並掌握常用標準庫函數的使用。[Return]
1.2C語言程式的結構與書寫規則1.2.1C語言程式的總體結構
一個完整的C語言程式,必須是由一個main()函數(又稱主函數)和若干個其他函數結合而成的,或僅由一個main()函數構成。[案例1.1]僅由main()函數構成的C語言程式。/*案例代碼檔案名:AL1_1.C*//*功能:僅由main()函數構成的C語言程式示例*/main(){printf(“ThisisaCprogram.\n”);}程式運行結果:
ThisisaCprogram.[程式演示][案例1.2]由main()函數和1個其他函數max()構成的C語言程式。/*案例代碼檔案名:AL1_2.C*//*功能:由main()函數和1個其他函數max()構成的C語言程式示例*/intmax(intx,inty){return(x>y?x:y);}main(){intnum1,num2;printf(“Inputthefirstintegernumber:”);scanf(“%d”,&num1);printf(“Inputthesecondintegernumber:”);scanf(“%d”,&num2);printf(“max=%d\n”,max(num1,num2));}程式運行情況:
Inputthefirstintegernumber:6←┘Inputthesecondintegernumber:9←┘max=9[程式演示][案例1.3]改寫[案例1.2],交換main()函數和max()函數的前後位置。根源程式略。程式運行情況:
Inputthefirstintegernumber:6←┘Inputthesecondintegernumber:9←┘max=9結論:1.函數是C語言程式的基本單位。main()函數的作用,相當於其他高級語言中的主程序;其他函數的作用,相當於副程式。2.C語言程式總是從main()函數開始執行。一個C語言程式,總是從main()函數開始執行,而不論其在程式中的位置。當主函數執行完畢時,亦即程式執行完畢。習慣上,將主函數main()放在最前頭。3.C語言本身沒有輸入輸出語句。輸入輸出是由庫函數完成的。
1.2.2函數的一般結構
任何函數(包括主函數main())都是由函數說明和函數體兩部分組成。其一般結構如下:
[函數類型]函數名(函數參數表)函數說明部分
{說明語句部分;執行語句部分;函數體部分
}
1.使用的語法符號約定
[...]──方括號表示可選(即可以指定,也可以缺省)
……──省略號表示前面的項可以重複
|──多(含2)中選1
2.函數說明由函數類型(可缺省)、函數名和函數參數表三部分組成,其中函數參數表的格式為:數據類型形參[,數據類型形參2……]例如,[案例1.2]中的函數max(),其函數說明各部分如圖1-1所示。函數類型函數名函數參數表↓↓↓
intmax(intx,inty)↓↓
函數參數類型圖1-1函數說明部分結構圖注意:在舊標準中,函數可以缺省參數表。3.函數體函數體由大括弧{}括起來。函數體一般由說明語句和可執行語句兩部分構成:(1)說明語句部分說明語句部分由變數定義、自定義類型定義、自定義函數說明、外部變數說明等組成。
(2)可執行語句一般由若干條可執行語句構成。圖1-2是[案例1.2]的main()函數體的示意圖。/*主函數main()*/main(){intnum1,num2;變數定義部分
printf(“Inputthefirstintegernumber:”);scanf(“%d”,&num1);printf(“Inputthesecondintegernumber:”);可執行語句部分函數體
scanf(“%d”,&num2);printf(“max=%d\n”,max(num1,num2));}
圖1-2函數體結構示意圖
4.說明(1)函數體中的變數定義語句,必須在所有可執行語句之前。下麵程式中變數定義語句“intmax;”的位置是非法的:main(){intx,y; /*變數定義語句:定義2個整型變數x、y*/x=3; /*可執行的賦值語句:將3賦值給變數x*/y=6; /*可執行的賦值語句:將6賦值給變數y*/
intmax; /*變數定義語句:出現在可執行的賦值語句“x=3;”和“y=6;”之後,非法!*/max=x>y?x:y;printf(“max=%d\n”,max);}解決辦法很簡單,請讀者自己思考。(2)如果不需要,也可以缺省變數定義語句和執行語句。如:dump(){}
它是一個空函數,什麼也不幹。1.2.3根源程式書寫格式1.所有語句都必須以分號“;”結束,函數的最後一個語句也不例外。2.程式行的書寫格式自由,既允許1行內寫幾條語句,也允許1條語句分寫在幾行上。例如,[案例1.2]的主函數main(),也可改寫成如下所示的格式:……main(){intnum1,num2;printf(“Inputthefirstintegernumber:”);scanf(“%d”,&num1);printf(“Inputthesecondintegernumber:”);scanf(“%d”,&num2);printf(“max=%d\n”,max(num1,num2));}如果某條語句很長,一般需要將其分寫在幾行上。3.允許使用注釋。C語言的注釋格式為:/*……*/例如,在[案例1.1]和[案例1.2]中,以及本節其他部分給出的根源程式中,凡是用“/*”和“*/”括起來的字元,都是注釋。(1)“/*”和“*/”必須成對使用,且“/”和“*”、以及“*”和“/”之間不能有空格,否則都出錯。
技巧:為避免遺漏必須配對使用的符號,例如注釋符號、函數體的起止識別字(花括弧)、圓括號等等,在輸入時,可連續輸入這些起止識別字,然後再在其中進行插入來完成內容的編輯。在起止識別字嵌套時,以及相距較遠時,這樣做更有必要。
(2)注釋的位置,可以單占1行,也可以跟在語句的後面。(3)如果1行寫不下,可另起1行繼續寫。(4)注釋中允許使用漢字。在非中文操作系統下,看到的是一串亂碼,但不影響程式運行。
[Return]1.3TurboCV2.0的基本操作1.運行一個C語言程式的一般過程2.TC的啟動、退出與命令菜單3.編輯並保存一個C語言根源程式4.編譯、連接──單個根源程式檔5.運行與查看結果6.編輯下一個新的根源程式[Return]1.運行一個C語言程式的一般過程
TurboC是一個集根源程式編輯、編譯、連接、運行與調試於一體、用菜單驅動的集成軟體環境。
運行一個C語言程式的一般過程:(1)啟動TC,進入TC集成環境。(2)編輯(或修改)根源程式。(3)編譯。如果編譯成功,則可進行下一步操作;否則,返回(2)修改根源程式,再重新編譯,直至編譯成功。(4)連接。如果連接成功,則可進行下一步操作;否則,根據系統的錯誤提示,進行相應修改,再重新連接,直至連接成功。(5)運行。通過觀察程式運行結果,驗證程式的正確性。如果出現邏輯錯誤,則必須返回(2)修改根源程式,再重新編譯、連接和運行,直至程式正確。(6)退出TC集成環境,結束本次程式運行。[Return]2.TC的啟動、退出與命令菜單
(1)啟動TurboC:tc←┘[畫面演示]啟動TurboC後,其主菜單條橫向排列在螢幕頂端,並被啟動,其中File主項成為當前項。主菜單的下麵,是Edit(編輯)窗口和Message(消息)窗口。兩個窗口中,頂端橫線為雙線顯示的,表示該窗口是活動窗口。編輯窗口的頂端為狀態行,其中:.Line1Col1:顯示游標所在的行號和列號,即游標位置。.Insert:表示編輯狀態處於“插入”。當處於“改寫”狀態時,此處為空白。.d:NONAME.C:顯示當前正在編輯的檔案名。顯示為“NONAME.C”時,表示用戶尚未給檔命名。螢幕底端是7個功能鍵的說明,以及NumLock鍵的狀態(顯示“NUM”時,表示處於“數字鍵”狀態;空白,表示“控制鍵”狀態)。
(2)命令菜單的使用
1)按下功能鍵F10,啟動主菜單。如果主菜單已經被啟動,則直接轉下一步。
2)用左、右方向鍵移動光帶,定位於需要的主項上,然後再按回車鍵,打開其子菜單(縱向排列)。
3)用上、下方向鍵移動光帶,定位於需要的子項上,回車即可。執行完選定的功能後,系統自動關閉菜單。注意:菜單啟動後,又不使用,可再按F10/Esc鍵關閉,返回原來狀態。
(3)退出TurboC
退出TC有兩種方法:
1)菜單法:File|Quit(先選擇File主項,再選擇並執行Quit子項)
2)快捷鍵法:Alt+“X”(先按下Alt鍵並保持,再按字母鍵X,然後同時放開)[Return]3.編輯並保存一個C語言根源程式
(1)啟動主菜單,選擇並執行File|Load項(快捷鍵鍵:F3)。(2)在“LoadFileName”窗口,輸入根源程式檔案名。檔案名的輸入有兩種方法:直接輸入和選擇輸入。1)直接輸入按照檔案名的組成字串,逐個字元輸入即可。如果是已經存在的檔,系統就在編輯窗口顯示該檔的內容,可供編輯、修改。如果是新檔,則給出一個空白編輯窗口,可供輸入新的根源程式。如果該檔不在當前目錄下,則需要冠以路徑名和(或)盤符。2)選擇檔(僅適用於已經存在的根源程式檔)①空回車,打開當前目錄下、尾碼為.C的所有檔的檔案名窗口。②用上、下、左、右方向鍵,將光帶定位於所需的檔案名上。③按回車鍵。
(3)常用編輯操作在編輯根源程式過程中,隨時都可以按F2鍵(或File|Save),將當前編輯的檔存盤,然後繼續編輯。這是一個良好的習慣!關於線上幫助:在任何窗口(或狀態)下,按F1鍵啟動活動窗口(或狀態)的線上幫助:.下一頁──PageDown,返回上一頁──PageUp.關閉線上幫助、返回原窗口(或狀態)──Esc.返回前一個線上幫助屏──Alt+F1(無論線上幫助是否被啟動).查詢庫函數的線上幫助資訊──^F1:將游標移到需要查詢函數名的首字元上,然後鍵入^F1,即可獲得該庫函數的線上幫助資訊。注:為簡化描述,用“^”代表“Ctrl”鍵。^Fn就是Ctrl+Fn,下同。[Return]
4.編譯、連接──單個根源程式檔
選擇並執行Compile|MakeEXEFile項(快捷鍵:F9),則TC將自動完成對當前正在編輯的根源程式檔的編譯、連接,並生成可執行檔。如果根源程式有語法錯誤,系統將在螢幕中央的“Compiling”(編譯)窗口底端提示“Error:Pressanykey”(錯誤:按任意鍵)。此時,按空格鍵,螢幕下端的“Message”(消息)窗口被啟動,顯示出錯(或警告)資訊,光帶停在第一條消息上。這時“Edit”(編輯)窗口中也有一條光帶,它總是停在編譯錯誤在源代碼中的相應位置。注意:當用上、下鍵移動消息窗口中的光帶時,編輯窗口中的光帶也隨之移動,始終跟蹤源代碼中的錯誤位置![Return]
5.運行與查看結果
(1)運行當前正在編輯的根源程式檔選擇並執行Run|Run項(快捷鍵:^F9),程式運行結束後,仍返回到編輯窗口。當你認為自己的根源程式不會有編譯、連接錯誤時,也可直接運行(即跳過對根源程式的編譯、連接步驟)。這時,TC將一次完成從編譯、連接到運行的全過程。(2)查看運行結果選擇並執行Run|UserScreen項(快捷鍵:Alt+F5)。查看完畢後,按任一鍵返回編輯窗口。如果發現邏輯錯誤,則可在返回編輯窗口後,進行修改;然後再重新編譯、連接、運行,直至正確為止。[Return]
6.編輯下一個新的根源程式
選擇並執行File|New項即可。如果螢幕提示如下確認資訊:
NONAME.Cnotsaved.Save?(Y/N)如果需要保存當前正在編輯的根源程式,則鍵入“Y”,進入下一步操作;否則,鍵入“N”(不保存),跳轉到(2)。(1)系統提示換名:
<d:><path>\NONAME.C直接輸入你給根源程式檔起的名字即可。(2)系統給出一個空白的編輯窗口,可以開始編輯下一個新的根源程式。[Return]2.1演算法的概念為解決一個問題而採取的方法,就稱為“演算法”。2.2簡單演算法的舉例:例1:求12345。
12345
1000。2.3演算法的特徵
(1)有窮性 (2)確定性 (3)有零個或多個輸入 (4)有一個或多個輸出 (5)有效性2.4怎樣表示一個演算法用自然語言表示演算法、用流程圖表示演算法、用N—S流程圖表示演算法2.4.1用自然語言表示演算法例2.5對一個大於或等於3的正整數,判斷它是不是素數?所謂素數,是指除了1和該數本身之外,不能被其他任何整數整除的數。判斷一個數N是否為素數,將N作為被除數,將2到(N-1)G各個整數輪流作為除數,如果都不能被整除,則N為素數。演算法如下:①:輸入N的值②:2I(I作為除數)③:N被I除,得餘數R④如果R=0,表示N能被I整除,則列印N”不是素數”,演算法結束;否則執行⑤⑤I+1I⑥如果I≤N-1,返回③;否則列印N”是素數”,然後結束。注意:實際n2n/2甚至缺點:文字冗長,易出現“歧義性”,語言不太嚴格,難判斷。2.4.2用流程圖表示演算法例1:當X≥0時,輸出他本身X,否則輸出-X。X≥0?列印X列印-XYN例2:求5!
例3:判斷素數優缺點:直觀形象、清楚。但佔用篇幅較多,複雜時費時又不方便。開始1t2it×iti+1ii>5結束ny開始輸入N2iN/2的餘數
rr=0?i+1ii>列印n“是素數結束列印n“不是素數”nyyn2.4.3用N—S流程圖表示演算法一個演算法通常有三種結構:順序結構、選擇結構、迴圈結構1、順序結構:2、選擇結構:3、迴圈結構:(1)當型迴圈結構:(2)直到型迴圈結構:ABP成立不成立AB當P1成立
AA直到p1成立例1:求5!例2:將50名學生成績高於80分的
學號和成績列印出來。1t2it×iti+1i直到i>5列印t1i輸入ni,cjii+1I直到i>501I
cji80是否輸出ni,cjii+1i直到i>50例3:求1-+-+∙∙∙∙∙∙+-例4:求素數-1sum2d1sign(-1)×signsignsign×termSum+term
sumd+1d直到d>100列印sum輸入n0w2iN/i的餘數RR=0是否1wi+1i直到i>或w0w=0是否輸出n是素數輸出n不是素數2.4.4用偽代碼表示演算法2.4.5用電腦語言表示演算法求5!Main(){inti,t;t=1;i=2;while(I<=5){t=t*i; i=i+1; }Printf(“%d”,t);}2.5結構化程式設計方法
用三種基本結構組成的程式必然是結構化的程式。這種程式便於編寫、閱讀、修改和維護。具體說,採用以下方法保證得到結構化的程式。1、自頂向下;2、逐步細化;3、模組化設計;4、結構化編碼3.1程式設計概述一個程式應包括對數據的描述和對數據處理的描述。
对数据的描述,即数据结构。数据结构是计算机学科的核心课程之一,有许多专门著作论述,本课程就不再赘述。
在C語言中,系統提供的數據結構,是以數據類型的形式出現的。
基本類型數據類型
構造類型
指針類型空類型
[Return]整形字元型實型(浮點型)——單精確度型、雙精度型枚舉類型數組類型結構體類型共用體類型3.2常量和變數3.2.1常量
1.常量的概念
在程式運行過程中,其值不能被改變的量稱為常量。
2.常量的分類
(1)整型常量:12、0、-3(2)實型常量:4.5、-1.456(3)字元常量:‘a’、’g’、’h’(4)符號常量:#definePRICE30
常量的類型,可通過書寫形式來判別。3.2.2變數1.變數的概念在程式運行過程中,其值可以被改變的量稱為變數。2.變數的兩個要素#definePRICE30Main(){intnum,total;Num=10;Total=num*PRICE;Print(“total=%d”,total);}(1)變數名。每個變數都必須有一個名字──變數名。(2)變數值。變數值存儲在內存的存儲單元中。在程式中,通過變數名來引用變數的值。3.識別字命名規則(1)有效字元:只能由字母、數字和下劃線組成,且以字母或下劃線開頭。(2)有效長度:隨系統而異,但至少前8個字元有效。如果超長,則超長部分被捨棄。例如,由於student_name和student_number的前8個字元相同,有的系統認為這兩個變數,是一回事而不加區別。在TCV2.0中,變數名(識別字)的有效長度為1~32個字元,缺省值為32。A10(3)C語言的關鍵字不能用作變數名。(4)C語言對英文字母的大小敏感,即同一字母的大小寫,被認為是兩個不同的字元。習慣上,變數名和函數名中的英文字母用小寫,以增加可讀性。思考題:在C語言中,變數名total與變數名TOTAL、ToTaL、tOtAl等是同一個變數嗎?識別字命名的良好習慣──見名知意:所謂“見名知意”是指,通過變數名就知道變數值的含義。通常應選擇能表示數據含義的英文單詞(或縮寫)作變數名,或中文拼音字頭作變數名。例如,name/xm(姓名)、sex/xb(性別)、age/nl(年齡)、salary/gz(工資)。4.變數的定義與初始化在C語言中,要求對所有用到的變數,必須先定義、後使用;且稱在定義變數的同時進行賦初值的操作為變數初始化。(1)變數定義的一般格式數據類型變數名[,變數名2……];例如,floatradius,length,area;
(2)變數初始化的一般格式[存儲類型]數據類型變數名[=初值][,變數名2[=初值2]……];例如,floatradius=2.5,length,area;intx;x=5;
[Return]3.3整型數據3.3.1整型常量1.三種表示形式:整型常量即整常數,在C語言中可用三種形式表示:(1)十進位。例如10、36。(2)八進制(以數字0開頭)。例如012。(3)十六進制(以數字0+小寫字母x開頭)。例如0x36。3.3.2整型變數
1.整形數據在內存中的存儲形式:數值是以補數形式表示的。正數是其本身負數將該數的絕對值的二進位形式,按位取反再加1
2.分類根據佔用記憶體位元組數的不同,整型變數又分為4類:(1)基本整型(類型關鍵字為int)。(2)短整型(類型關鍵字為short[int])。(3)長整型(類型關鍵字為long[int])。(4)無符號整型。無符號型又分為無符號基本整型(unsigned[int])、無符號短整型(unsignedshort)和無符號長整型(unsignedlong)三種,只能用來存儲無符號整數。3.佔用記憶體位元組數與值域
上述各类型整型变量占用的内存字节数,随系统而异。在16位操作系統中,一般用2位元組表示一個int型變數,且long型(4位元組)≥int型(2位元組)≥short型(2位元組)。顯然,不同類型的整型變數,其值域不同。4.類型匹配規則類型匹配規則為:一個整型常量,可以賦給能容納下其值的整型變數。例如:其值在-215--(215-1)的整型常量,可以賦給int型變數和longint型變數;其值在-231——(231-1)的整型常量,就只能賦給longint型變數。注意:常量無unsigned型。但一個非負整型常量,只要它的值不超過相應變數的值域(即取值範圍),也可以賦給unsigned型變數。類型其值範圍賦給的變數Int-32768~+32767Int,longintLongint-2147483648~+2147483647如:12345L、0LLongint[Short]int-32768~+32767Int,shotintUnsignedint以補數形式存儲如:1234u5.不同種類的整形數據可以進行算術運算。例:Main() {inta,b,c,d; Unsignedu; A=12;b=-24;u=10; C=a+u;d=b+u; Printf(“a+u=%d,b+u=%d\n”,c,d); }6.整形數據的溢出:
Main() {inta,b; a=32767; b=a+1; printf(“%d,%d”,a,b); }[Return]運行結果:a+u=32,b+u=-14運行結果:32767,-327683.4實型數據3.4.1實型變數
C語言的實型變數,分為兩種:
(1)單精確度型。類型關鍵字為float,一般占4位元組(32位)、提供7位有效數字。其值範圍:-3.4×10-38——3.4×1038
(2)雙精度型。類型關鍵字為double,一般占8個位元組、提供5~16位有效數字。其值範圍:-1.7×10-308——1.7×10308
(3)長雙精度型。類型關鍵字為longdouble,一般占16個位元組、提供18~19位有效數字。其值範圍:-1.2×10-4932——1.2×1049323.4.2實型常量
1.表示形式
實型常量即實數,在C語言中又稱浮點數,其值有兩種表達形式:
(1)十進位形式。例如3.14、9.8。(2)指數形式:<尾數>E(e)<整型指數>。例如3.0E+5等。但注意字母E之前必須有數字,且E後面的指數必須為整數。
2.關於類型
實型常量分float型和double型。一個實型常量,可以賦給一個實型變數(float型或double型)。
[Return]3.實型數據在內存中的存儲形式4.實型數據的舍入誤差:main(){floata,b;a=123456.789e5;b=a+20;printf("%f\n%f\n",a,b);}+.5648121
數符號小數部分指數+.5648121015.64812運行結果:12345678848.00000012345678848.000000a,b的值相同。由於有效數字是7位。因此應避免一個很大的數與很小的數相加、減,否則丟失很小的數。3.5字元型數據3.5.1字元常量1.字元常量的定義:用一對單引號括起來的單個字元,稱為字元常量。例如,‘A’、‘1’、‘+’等。2.轉義字元:C語言還允許使用一種特殊形式的字元常量,就是以反斜杠“\”開頭的轉義字元。見表注意:如果反斜杠或單引號本身作為字元常量,必須使用轉義字元:‘\\’、‘\’‘。[案例3.1]用轉義字元輸出可列印字元和不可列印字元。
/*案例代碼檔案名:AL3_2.C*/
/*程序功能:用转义字符输出可打印字符和不可打印字符*/main()
{printf(“\x4F\x4B\x21\n”);/*等价于printf(“OK!\n”);*/
printf(“\x15\xAB\n”);
}程式運行結果如下:OK!§½
[程式演示]
字元形式含義ASCII代碼\n換行,將當前位置移到下一行開頭10\t水準製錶(跳到下一個TAB位置)9\b退格,將當前位置移到前一列8\r回車,將當前位置移到本行開頭13\f換頁,將當前位置移到下頁開頭12\\反斜杠字元“\”92\'單撇號字元39\"雙撇號字元34\ddd1到3位8進制數所代表的字元\xhh1到2位16進制數所代表的字元轉義字元及含義
3.5.2字元變數字元變數的類型關鍵字為char,一般佔用1位元組記憶體單元。1.變數值的存儲
字元變數用來存儲字元常量。將一個字元常量存儲到一個字元變數中,實際上是將該字元的ASCII碼值(無符號整數)存儲到記憶體單元中。例如,charch1,ch2; /*定義兩個字元變數:ch1,ch2*/ch1=’a’;ch2=’b’;/*給字元變數賦值*/2.特性字元數據在內存中存儲的是字元的ASCII碼──一個無符號整數((0-255),其形式與整數的存儲形式一樣(如圖2-4所示),所以C語言允許字元型數據與整型數據之間通用。(1)一個字元型數據,既可以字元形式輸出,也可以整數形式輸出。
(1)一個字元型數據,既可以字元形式輸出,也可以整數形式輸出。[案例3.2]字元變數的字元形式輸出和整數形式輸出。
/*案例代碼檔案名:AL3_3.C*/
/*程序功能:用字符形式和整数形式输出字符变量*/
main()
{charch1,ch2;
ch1='a';ch2='b';printf(“ch1=%c,ch2=%c\n”,ch1,ch2);
printf(“ch1=%d,ch2=%d\n”,ch1,ch2);
}
程序运行结果:ch1=a,ch2=b
ch1=97,ch2=98[程式演示](2)允許對字元數據進行算術運算,此時就是對它們的ASCII碼值進行算術運算。
[案例3.4]字元數據的算術運算。
/*案例代碼檔案名:AL3_4.C*/
/*程序功能:字符数据的算术运算*/
main()
{charch1,ch2;
ch1=‘a’;ch2=‘B’;/*字母的大小寫轉換*/
printf(“ch1=%c,ch2=%c\n”,ch1-32,ch2+32);
/*用字符形式输出一个大于256的數值*/
printf("ch1+200=%d\n",ch1+200);
printf("ch1+200=%c\n",ch1+200);
printf("ch1+256=%d\n",ch1+256);
printf("ch1+256=%c\n",ch1+256);
}程式運行結果:ch1=A,ch2=bch1+200=297ch1+200=)ch1+256=353ch1+256=a
[程式演示]3.5.3字串常量1.字串常量的概念和字串長度字串常量是用一對雙引號括起來的若干字元序列。字串中字元的個數稱為字串長度。長度為0的字串(即一個字元都沒有的字串)稱為空串,表示為“”(一對緊連的雙引號)。例如,“Howdoyoudo.”、“Goodmorning.”等,都是字串常量,其長度分別為14和13(空格也是一個字元)。
如果反斜杠和雙引號作為字串中的有效字元,則必須使用轉義字元。例如:(1)C:\msdos\v6.22→"C:\\msdos\\v6.22"
(2)Isay:"Goodbye!"→"Isay:\"Goodbye!\"“2.字串的存儲C語言規定:在存儲字串常量時,由系統在字串的末尾自動加一個‘\0’作為字串的結束標誌。注意:在根源程式中書寫字串常量時,不必加結束字元‘\0’,否則畫蛇添足。
如果有一個字串為“CHINA”,則它在內存中的實際存儲如下所示:最後一個字元'\0'是系統自動加上的,它佔用6位元組而非5位元組記憶體空間。CHINA\0綜上所述,字元常量'A'與字串常量"A"是兩回事:(1)定界符不同:字元常量使用單引號,而字串常量使用雙引號;(2)長度不同:字元常量的長度固定為1,而字串常量的長度,可以是0,也可以是某個整數;(3)存儲要求不同:字元常量存儲的是字元的ASCII碼值,而字串常量,除了要存儲有效的字元外,還要存儲一個結束標誌’\0’。[Return]3.6算術運算符與算術運算式在C語言中,除控制語句和輸入輸出函數外,其他所有基本操作都作為運算符處理。
1.五種基本算術運算符
+、-(減法/取負)、*、/、%(求餘數)(1)關於除法運算/C語言規定:兩個整數相除,其商為整數,小數部分被捨棄。例如,5/2=2。但出現負數時,結果向零靠近。例-5/3=-1,7/-3=-2。(2)關於求餘數運算%要求兩側的運算元均為整型數據,否則出錯。
2.運算式和算術運算式(1)運算式的概念用運算符和括弧將運算對象(常量、變數和函數等)連接起來的、符合C語言語法規則的式子,稱為運算式。
單個常量、變數或函數,可以看作是運算式的一種特例。將單個常量、變數或函數構成的運算式稱為簡單運算式,其他運算式稱之為複雜運算式。(2)算術運算式的概念運算式中的運算符都是算術運算符。例如,3+6*9、(x+y)/2-1等,都是算術運算式。良好的根源程式書寫習慣:在運算式中,在雙目運算符的左右兩側各加一個空格,可增強程式的可讀性。請比較運算式“(x+y)/2–1”與“(x+y)/2–1”,您認為哪個的可讀性更好一些?3.運算符的優先順序與結合性(1)C語言規定了運算符的優先順序和結合性。所謂結合性是指,當一個運算元兩側的運算符具有相同的優先順序時,該運算元是先與左邊的運算符結合,還是先與右邊的運算符結合。自左至右的結合方向,稱為左結合性。反之,稱為右結合性。結合性是C語言的獨有概念。除單目運算符、賦值運算符和條件運算符是右結合性外,其他運算符都是左結合性。(2)運算式求值1)按運算符的優先順序高低次序執行。例如,先乘除後加減。2)如果在一個運算對象(或稱運算元)兩側的運算符的優先順序相同,則按C語言規定的結合方向(結合性)進行。例如,算術運算符的結合方向是“自左至右”,即:在執行“a–b+c”時,變數b先與減號結合,執行“a-b”;然後再執行加c的運算。4.數據類型轉換(1)在C語言中,整型、實型和字元型數據間可以混合運算(因為字元數據與整型數據可以通用)。如果一個運算符兩側的運算元的數據類型不同,則系統按“先轉換、後運算”的原則,首先將數據自動轉換成同一類型,然後在同一類型數據間進行運算。轉換規則如下:高doublefloat
long
unsigned
低intchar,short注意:箭頭方向只表示數據類型由低向高轉換,不要理解為int型先轉換成unsigned型,再轉換成long型,最後轉換成double型。(2)除自動轉換外,C語言也允許強制轉換。數據類型強制轉換的一般格式為:
(要轉換成的數據類型)(被轉換的運算式)當被轉換的運算式是一個簡單運算式時,外面的一對圓括號可以缺省。例如,(double)a(等價於(double)(a))/*將變數a的值轉換成double型*/(int)(x+y) /*將x+y的結果轉換成int型*/(float)5/2(等價於(float)(5)/2)/*將5轉換成實型,再除以2(=2.5)*/(float)(5/2) /*將5整除2的結果(2)轉換成實型(2.0)*/注意:強制轉換類型得到的是一個所需類型的中間量,原運算式類型並不發生變化。例如,(double)a只是將變數a的值轉換成一個double型的中間量,其數據類型並未轉換成double型。[Return]3.7賦值運算與賦值運算式1.賦值運算賦值符號“=”就是賦值運算符,它的作用是將一個運算式的值賦給一個變數。賦值運算符的一般形式為:變數=賦值運算式
例如,x=5
y=(float)5/2
如果運算式值的類型,與被賦值變數的類型不一致,但都是數值型或字元型時,系統自動地將運算式的值轉換成被賦值變數的數據類型,然後再賦值給變數。
思考題:假設變數num的數據類型為float,其值為2.5,則執行“num=(int)num”後,num的值等於多少?2.複合賦值運算複合賦值運算符是由賦值運算符之前再加一個雙目運算符構成的。複合賦值運算的一般格式為:變數雙目運算符=運算式└──┬──┘複合賦值運算符它等價於:變數=變數雙目運算符(運算式)。當運算式為簡單運算式時,運算式外的一對圓括號才可缺省,否則可能出錯。例如,x+=3 /*等價於x=x+3*/y*=x+6 /*等價於y=y*(x+6),而不是y=y*x+6*/X%=y+3/*等價於x=x%(y+3),而不是x=x%y+3*/C語言規定的10種複合賦值運算符如下:+=,-=,*=,/=,%=; /*複合算術運算符(5個)*/&=,^=,|=,<<=,>>=; /*複合位運算符(5個)*/3.賦值運算式由賦值運算符或複合賦值運算符,將一個變數和一個運算式連接起來的運算式,稱為賦值運算式。(1)一般格式變數(複合)賦值運算符運算式(2)賦值運算式的值任何一個運算式都有一個值,賦值運算式也不例外。被賦值變數的值,就是賦值運算式的值。例如,“a=5”這個賦值運算式,變數a的值“5”就是它的值。A=(b=5)b=5;a=b;(自右向左結合)A=b=c=5a,b,c值均為5。Printf(“%d”,a=b);賦值運算式可以出現在其他語句中。(輸出、迴圈語句等。)[Return]3.8C語言特有的運算和運算符3.8.1自增(++)、自減(--)運算
1.作用
自增運算使單個變數的值增1,自減運算使單個變數的值減1。
2.用法與運算規則
自增、自減運算符都有兩種用法:
(1)前置運算──運算符放在變數之前:++變數、--變數++i,--i,先使變數的值增(或減)1,然後再以變化後的值參與其他運算,即先增減、後運算。
(2)後置運算──運算符放在變數之後:變數++、變數--.i++,i--.變數先參與其他運算,然後再使變數的值增(或減)1,即先運算、後增減。
[案例3.5]自增、自減運算符的用法與運算規則示例。/*案例代碼檔案名:AL2_4.C*//*程式功能:自增、自減運算符的用法與運算規則示例*/main(){intx=6,y;printf("x=%d\n",x); /*輸出x的初值*/y=++x; /*前置運算*/printf("y=++x:x=%d,y=%d\n",x,y);y=x--; /*後置運算*/printf("y=x--:x=%d,y=%d\n",x,y);}程式運行結果:x=6y=++x:x=7,y=7y=x--:x=6,y=7 [程式演示]思考題:如果將案例“y=++x;”語句中的前置運算改為後置(y=x++;),“y=x--;”語句中的後置運算改為前置(y=--x;),程式運行結果會如何?3.說明(1)自增、自減運算,常用於迴圈語句中,使迴圈控制變數加(或減)1,以及指針變數中,使指針指向下(或上)一個地址。(2)自增、自減運算符,不能用於常量和運算式。例如,5++、--(a+b)等都是非法的。(3)++、--的結合方向是自右至左。(4)在運算式中,連續使同一變數進行自增或自減運算時,很容易出錯,所以最好避免這種用法。如:Print(“%d,%d”,i,i++);最好寫成j=i++;Printf(“%d,%d”,j,i);3.8.2逗號運算(,)及其運算式C語言提供一種用逗號運算符“,”連接起來的式子,稱為逗號運算式。逗號運算符又稱順序求值運算符。1.一般形式運算式1,運算式2,……,運算式n2.求解過程自左至右,依次計算各運算式的值,“運算式n”的值即為整個逗號運算式的值。例如,逗號運算式“a=3*5,a*4”的值=60:先求解a=3*5,得a=15;再求a*4=60,所以逗號運算式的值=60。又例如,逗號運算式“(a=3*5,a*4),a+5”的值=20:先求解a=3*5,得a=15;再求a*4=60;最後求解a+5=20,所以逗號運算式的值=20。注意:並不是任何地方出現的逗號,都是逗號運算符。很多情況下,逗號僅用作分隔符號。[Return]總結:C語言的數據類型整型、實型、字元型、字串型(其無變數)。
注:各數據類型的值域及在內存的存儲形式。賦值語句和賦值運算式算術運算符和算術運算式(+,-,*,/,++,--)注:其優先順序別及結合性。逗號運算符和逗號運算運算式(運算式1,運算式2,……運算式n)作業:P663.5、3.6、3.7、3.8、3.9、
3.10、閱讀程式:1、寫出程式的運行結果。#include<stdio.h>Main(){shortinta=32767,b;b=a+1;Printf(“a=%d,b=%d\n”,a,b);}結果:a=32767,b=-32768b的補數=a的補數+1a的補數=0111111111111111b的補數=a的補數+1=1000000000000000B的原值=-(1111111111111111+1)=-(1000000000000000)=-32768。本題考查的是整數的記憶體存儲方式。2、寫出下列程式的功能。#include<stdio.h>main(){doubled;printf("輸入一個double數:");scanf("%lf",&d);d=d*100;d=d+0.5;d=(int)d;d=d/100;printf("保留兩位小數:%g\n",d);}輸入一個double類型的數,使該數保留小數點後兩位,對第3位小數進行四捨五入運算。3、寫出下列程式的功能#include<stdio.h>main(){intn,b1,b2,b3,b4;printf("輸入一個小於10000的正整數:");scanf("%d",&n);b1=n%10;n=n/10;b2=n%10;n=n/10;b3=n%10;n=n/10;b4=n%10;printf("各位上的數字分別為:%d%d%d%d\n",b4,b3,b2,b1);}輸入一個小於10000的正整數,求各位上的數字4、寫出下列程式的功能#include<stdio.h>main(){charc1='c',c2='h',c3='i',c4='n',c5='a';c1+=4;c2+=4;c3+=4;c4+=4;c5+=4;printf("密碼是%c%c%c%c%c",c1,c2,c3,c4,c5);}將China譯成密碼Glmre5、分析程式的運行結果:#include<stdio.h>#include<math.h>main(){charc1='a';inta=1;intc;c=c1+a;printf("%c\n",c1);printf("%d\n",a);printf("%d",c);}a1984.1C語句概述
C語句可以分5類控制語句,完成一定的控制功能有9種。If()~else~6)ContinueBreak7)For()~Switch8)While()~Goto9)Do~while()Return如:if(x>y)z=x;elsez=y;函數調用語句,printf(“thisisacstatement.”);運算式語句:a=3;i++;x+y;空語句:;有時做轉向點或循環體或什麼也不做。可以用{}把一些語句括起來成為複合語句。
{z=x+y;t=z/100;Printf(“%f”,t);}例:已知圓的半徑,求圓的面積、周長。開始輸入半徑rS=3.14*r*rL=2*3.14*r輸出s、l結束main(){floatr,s,l;}scanf("%f",&r);s=3.14*r*r;l=2*3.14*r;Printf("圓的面積=%f,圓的周長=%f",s,l);4.2賦值語句
和數據輸入輸出的概念及在C語言中的實現
4.2.1賦值語句“=”是一個運算符就可以有運算式.√If((a=b)>0)t=a;×If((a=b);>0)t=a;4.2.2數據輸入輸出的概念及在C語言中的實現輸入、輸出的概念C語言不提供輸入輸出語句,輸入輸出的操作是由函數來實現的。C語言函數庫中有一批“標準輸入輸出函數”putchar,getchar,printf,scanf,puts,gets等。在使用C語言庫函數時,要用預編譯命令“#include”將有關的“頭檔”包括到用戶原始檔案中。使用標準輸入輸出函數時,要用到“stdio.h”檔。檔開頭要寫
#include<stdio.h>
或#include“stdio.h”4.3單個字元輸入輸出——getchar()和putchar()函數4.3.1單個字元的輸出──putchar()函數[案例4.3.1]putchar()函數的格式和使用方法。/*案例代碼檔案名:AL4_3_1.C*//*功能:說明putchar()函數的格式和使用方法。*/#include"stdio.h" /*編譯預處理命令:檔包含*/main(){charch1='N',ch2='E',ch3='W';putchar(ch1);putchar(ch2);putchar(ch3); /*輸出*/putchar('\n');putchar(ch1);putchar('\n'); /*輸出ch1的值,並換行*/putchar('E');putchar('\n'); /*輸出字元'E',並換行*/putchar(ch3);putchar('\n');} [程式演示]
程式運行結果如下:
NEWNEW1.putchar()函數的格式:
putchar(ch);
其中ch可以是一個字元變數或常量,也可以是一個轉義字元。
2.putchar()函數的作用:向終端輸出一個字元。(1)putchar()函數只能用於單個字元的輸出,且一次只能輸出一個字元。另外,從功能角度來看,printf()函數可以完全代替putchar()函數。(2)在程式中使用putchar()函數,務必牢記:在程式(或檔)的開頭加上編譯預處理命令(也稱包含命令),即:
#include"stdio.h"
表示要使用的函數,包含在標準輸入輸出(stdio)頭檔(.h)中。4.3.2單個字元的輸入──getchar()函數[案例4.3.2]說明getchar()函數的格式和作用。/*案例代碼檔案名:AL4_3_2.C*//*功能:說明getchar()函數的格式和作用。*/#include"stdio.h" /*檔包含*/main(){charch;printf("Pleaseinputtwocharacter:");ch=getchar(); /*輸入1個字元並賦給ch*/putchar(ch);putchar('\n');putchar(getchar()); /*輸入一個字元並輸出*/putchar('\n');} [程式演示]
程式運行情況如下:
Pleaseinputtwocharacters:ab↙ab1.getchar()函數的格式:getchar();2.getchar()函數的作用:從系統隱含的輸入設備(如鍵盤)輸入一個字元。另外,從功能角度來看,scanf()函數可以完全代替getchar()函數。(1)getchar()函數只能用於單個字元的輸入,一次輸入一個字元。(2)程式中要使用getchar()函數,必須在程式(或檔)的開頭加上編譯預處理命令:
#include"stdio.h“[Return]4.4格式化輸出——printf()函數printf()函數的作用:向電腦系統默認的輸出設備(一般指終端或顯示器)輸出一個或多個任意類型的數據。
4.4.1printf()函數的一般格式
[案例4.4.1]已知圓半徑radius=1.5,求圓周長和圓面積。
/*案例代碼檔案名:AL4_4_1.C。*/
main()
{floatradius,length,area,pi=3.1415926;
radius=1.5;
length=2*pi*radius; /*求圆周长*/
area=pi*radius*radius; /*求圆面积*/
printf(“radius=%f\n”,radius); /*输出圆半径*/
printf(“length=%7.2f,area=%7.2f\n”,length,area); /*输出圆周长、面积*/
}
[程式演示]
程式運行結果如下:
radius=1.500000length=9.42,area=7.07 printf()函數的一般格式如下:printf(“格式控制"[,輸出項表]);1.格式控制:“格式字串”也稱“轉換控制字串”,可以包含三種字元:(1)格式指示符。格式指示符的一般形式如下:%[標誌][寬度][.精度][類型]
(2)轉義字元(3)普通字元──除格式指示符和轉義字元之外的其他字元。格式字串中的普通字元,原樣輸出。2.輸出項表輸出項表是可選的。如果要輸出的數據不止1個,相鄰2個之間用逗號分開。下麵的printf()函數都是合法的:(1)printf("Iamastudent.\n"); (2)printf("%d",3+2);
(3)printf("a=%fb=%5d\n",a,a+3); 必須強調:“格式字串”中的格式指示符,必須與“輸出項表”中、輸出項的數據類型一致,否則會引起輸出錯誤。
printf格式字元格式字元說明d,I以帶符號的十進位形式輸出整數(正數不輸出符號)0以八進制無符號形式輸出整數(不輸出前導符0)X,x以十六進制無符號形式輸出整數(不輸出前導符0X),用X則輸出十六進制的a~f時以小寫形式輸出,用X時,則以大寫字母輸出。f以無符號十進位形式輸出整數c以字元形式輸出,只輸出一個字元s輸出字串f以小數形式輸出單、雙精度數,隱含輸出6位小數E,e以指數形式輸出實數,用e時指數以“e”表示如1.2e+02,用E時指數以“E”表示如1.2E+03G,g選用%f或%e格式中輸出寬度較短的一種格式,不輸出無意義的0,用G時,若以指數形式輸出,則指數以大寫表示Printf的附加格式說明字元字元說明字母l用於長整形整數,可加在格式符d、0、x、u前面m(代表一個正整數)數據最小寬度n(代表一個正整數)對實數,表示輸出n位小數,對字串,表示截取的字元個數-輸出的數字或字元在域內向左靠4.4.2格式指示符
輸出不同類型的數據,要使用不同的類型轉換字元。
1.類型轉換字元d──以帶符號的十進位整數形式輸出。
[案例3.2]類型轉換字元d的使用。/*案例代碼檔案名:AL4_4_2.C。*/main(){intnum1=123;longnum2=123456;/*用3種不同格式,輸出int型數據num1的值*/printf(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《动画角色传奇》课件
- 高校课堂教学技术与艺术:赵伶俐博士教授课件解析与实践
- 南阳农业职业学院《管道设备工程计量与计价课程设计》2023-2024学年第二学期期末试卷
- 天津医科大学《艺术形象发展史论》2023-2024学年第一学期期末试卷
- 山东省潍坊市重点中学2025年高三第二学期第一次调研测试物理试题含解析
- 四川省安岳县周礼中学2025年高三高考最后冲刺化学试题含解析
- 辽宁民族师范高等专科学校《中医妇科学针灸》2023-2024学年第一学期期末试卷
- 文山壮族苗族自治州砚山县2024-2025学年三年级数学第二学期期末经典试题含解析
- 江苏省射阳县2025届高三全真历史试题模拟试卷(17)含解析
- 江苏省泰州市兴化市顾庄学区2024-2025学年初三3月学情调研测试数学试题试卷含解析
- 《同分母分数加减法》教学课件人教新课标
- 产业经济学第三版(苏东水)课后习题及答案完整版
- 初中综合实践课程标准
- 首件检验记录表(标准样版)
- 中建六局建设发展公司责任目标管理考核办法
- 太阳能光伏发电系统PVsyst运用
- 调频发射机项目建议书范文
- 压实沥青混合料密度(表干法)自动计算
- 管桩水平承载力计算
- 博硕BSL2236OAC全自动说明书(触摸屏)
- 施工日志填写范本
评论
0/150
提交评论