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

下載本文檔

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

文檔簡介

《C語言程序設(shè)計》教案

項目1第一個c語言程序章節(jié)分析:本章主要講解C預(yù)言的發(fā)展、特點,C語言的基本結(jié)構(gòu),C語言的上機步驟,并能夠進行簡單的輸入輸出。教學(xué)內(nèi)容:1、C語言的發(fā)展特點;2、C程序的基本結(jié)構(gòu)3、C程序的開發(fā)過程4、C程序的上機步驟5、簡單的輸入輸出教學(xué)重點:1、C程序的基本結(jié)構(gòu)2、C程序的開發(fā)過程3、C程序的上機步驟教學(xué)難點1、C程序的上機步驟2、C程序的基本結(jié)構(gòu)課時分配:4課時導(dǎo)入新課:C語言是一種通用的程序設(shè)計語言,具有表達簡明、使用靈活、結(jié)構(gòu)化的流程控制、豐富的數(shù)據(jù)結(jié)構(gòu)和操作符集合、良好的程序可移植性和高效率的目標(biāo)代碼特征,是各工科類程序設(shè)計的必修課程。第一講一、C語言概述(一)C語言的發(fā)展和特點1、C語言的發(fā)展C語言的發(fā)展大致可分為3個階段:(1)C語言的誕生(1970-1973)C語言是1972年貝爾實驗室在B語言的基礎(chǔ)上設(shè)計出來的。(2)C語言的發(fā)展(1973-1988)(3)C語言的成熟(1988年至今)2、C語言的特點(1)用C語言編寫的程序非常簡潔C語言只有32個關(guān)鍵字,9種控制語句,程序書寫格式自由。它壓縮了其它高級語言中的冗余的部分,表1-1是C語言同Pascal語言和Basic語言的比較。(2)運算符非常豐富C語言有豐富的運算符,共34種運算符和15個等級的運算優(yōu)先順序。C語言還把括號、賦值、強制類型轉(zhuǎn)換等都作為運算符處理。如此豐富的運算符使運算表達式簡潔多樣化,且編譯處理也統(tǒng)一簡單。靈活地使用這些運算符可以實現(xiàn)在其它語言中難以實現(xiàn)的運算。(3)數(shù)據(jù)結(jié)構(gòu)豐富C語言中的數(shù)據(jù)類型有整型、實型、字符型、數(shù)組類型、指針類型、結(jié)構(gòu)體類型等,能夠用來實現(xiàn)非常復(fù)雜的數(shù)據(jù)結(jié)構(gòu)的運算,特別是指針類型,使用起來更是靈活、多樣。因此,C語言具有較強的數(shù)據(jù)處理能力。(4)具有結(jié)構(gòu)化的控制語句C語言提供了if-else、for、while、switch等結(jié)構(gòu)化控制語句,便于采用自上而下、逐步細(xì)化的結(jié)構(gòu)化程序設(shè)計方法,符合現(xiàn)代編程風(fēng)格的要求。(5)程序設(shè)計自由度大C語言的語法限制不太嚴(yán)格,如對數(shù)組下標(biāo)越界不作檢查,各種類型的變量可以通用等。C語言允許程序編寫者有較大的自由度,因此放寬了語法檢查。程序員應(yīng)當(dāng)仔細(xì)檢查程序,保證其正確,而不要過分依賴C編譯程序去差錯。(6)比較接近硬件與系統(tǒng)C語言能實現(xiàn)匯編語言的大部分功能,如允許直接訪問地址、能進行位運算、可以直接對硬件進行操作等。(7)程序執(zhí)行效率高生成的目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高,一般只比匯編語言生成的代碼效率低10%~20%。(8)可移植性好C語言基本上不用修改就可用于各種型號的計算機和各種操作系統(tǒng)。二、C語言程序的基本結(jié)構(gòu)下面先介紹幾個簡單的C程序,從中分析C程序的特性。例1輸出一條信息。main(){printf("Thisismyfirstprogram.\n");}運行結(jié)果:Thisismyfirstprogram.程序分析:這個程序的運行結(jié)果是在屏幕上輸出一行字符。其中main()被稱作“主函數(shù)”,在任何一個C程序中都必須有一個且只有一個main()函數(shù)。這個main()函數(shù)中可以有很多語句,用一對大括號括起來。我們這個程序中,只有一條語句。這條語句是一個輸出函數(shù),作用是向屏幕上輸出信息。它將""之間的內(nèi)容完整的輸出到屏幕?!癨n”表示換行符,它的作用是將光標(biāo)移到下一行的開始。語句后面有一個分號,表示該語句結(jié)束,這個分號是必不可少的。例2計算兩個數(shù)的和。main()

/*主函數(shù)*/{intx,y,sum;/*定義變量*/x=1999;y=1;

/*給變量賦值*/sum=x+y;

/*求和*/printf("Thesumis%d",sum);/*輸出*/}運行結(jié)果:Thesumis2000程序分析:這個程序是求x與y的和sum,并將結(jié)果輸出到屏幕上。程序中以“/*”開頭到“*/”結(jié)尾之間的內(nèi)容表示注釋,注釋部分不參與也不影響程序的運行,這些注釋只是用來幫助人們閱讀程序的,注釋部分可以加在程序的任何部分。第三行是變量定義,說明了三個整型變量x、y和sum。第四行是賦值語句,給變量x和y賦值。第五行將x+y的和送入變量sum中。第六行是將結(jié)果輸出到屏幕,“%d”表示“十進制整數(shù)類型”,在執(zhí)行輸出時在這個位置上將用一個十進制的整型數(shù)值代替,這個程序中用sum的值2000來代替%d這個位置上的內(nèi)容。例3由用戶輸入兩個整數(shù),計算并輸出兩個數(shù)中最大的一個。main()

/*主函數(shù)*/{intx,y,z;

/*定義變量*/scanf("%d,%d",&x,&y);

/*從鍵盤輸入兩個數(shù)*/z=max(x,y);

/*找出最大的一個數(shù)并賦給Z*/printf("TheMaxnumberis%d",z);/*輸出*/}intmax(intx,inty){intz;if(x>y)z=x;

/*如果X大于Y就將X的值賦給Z*/elsez=y;

/*否則就將Y的值賦給Z*/return(z);運行結(jié)果:3,5↙TheMaxnumberis5程序分析:這個程序包括兩個函數(shù),一個是主函數(shù)main(),另一個是用戶自定義函數(shù)max(),求出兩個整數(shù)x,y中最大的一個數(shù)。在執(zhí)行時,先由scanf()函數(shù)(C語言提供的標(biāo)準(zhǔn)輸入函數(shù))從鍵盤讀取兩個數(shù)字,“%d,%d”用于指出輸入的兩個數(shù)據(jù)按十進制整數(shù)輸入,&x和&y中的“&”表示“地址”,scanf()函數(shù)是將兩個數(shù)值分別輸入到變量x和y地址所標(biāo)志的單元中來完成x和y值的輸入。這時由用戶從鍵盤上輸入3,5↙(“↙”表示回車鍵),此時x被賦值3,y被賦值5。然后執(zhí)行第五行,將x和y的值傳入max函數(shù)中。在max函數(shù)中經(jīng)過判斷后,z中的值就是兩個數(shù)的最大值。用return語句將z的值當(dāng)做函數(shù)的返回值。此時程序又回到第五行,將max函數(shù)的返回值賦值給變量z。第六行,將變量z的值輸出到屏幕上。運行結(jié)果:3,5↙TheMaxnumberis5程序分析:這個程序包括兩個函數(shù),一個是主函數(shù)main(),另一個是用戶自定義函數(shù)max(),求出兩個整數(shù)x,y中最大的一個數(shù)。在執(zhí)行時,先由scanf()函數(shù)(C語言提供的標(biāo)準(zhǔn)輸入函數(shù))從鍵盤讀取兩個數(shù)字,“%d,%d”用于指出輸入的兩個數(shù)據(jù)按十進制整數(shù)輸入,&x和&y中的“&”表示“地址”,scanf()函數(shù)是將兩個數(shù)值分別輸入到變量x和y地址所標(biāo)志的單元中來完成x和y值的輸入。這時由用戶從鍵盤上輸入3,5↙(“↙”表示回車鍵),此時x被賦值3,y被賦值5。然后執(zhí)行第五行,將x和y的值傳入max函數(shù)中。在max函數(shù)中經(jīng)過判斷后,z中的值就是兩個數(shù)的最大值。用return語句將z的值當(dāng)做函數(shù)的返回值。此時程序又回到第五行,將max函數(shù)的返回值賦值給變量z。第六行,將變量z的值輸出到屏幕上。從以上3個例子,可以看到C程序有以下結(jié)構(gòu)特征。1、C程序是由函數(shù)構(gòu)成的。一個程序至少要有一個主函數(shù)main()(main()函數(shù)必須且只有一個),也可以包含一個main()函數(shù)和若干個其它的函數(shù)。因此函數(shù)是C程序的基本單位。C語言中提供了豐富的函數(shù),被稱作庫函數(shù)。標(biāo)準(zhǔn)C中提供了一百多個庫函數(shù),TurboC和MSC中提供了三百多個庫函數(shù)。C程序的函數(shù)式結(jié)構(gòu)使得C程序非常容易實現(xiàn)模塊化,便于閱讀和維護。2、一個函數(shù)由兩大部分組成。第一部分是函數(shù)的說明部分,如函數(shù)的名稱,函數(shù)的返回值類型,函數(shù)的參數(shù)及類型。3、C程序總是從main()函數(shù)開始執(zhí)行,不論main()函數(shù)在程序的什么地方,也就是說,可以將main()函數(shù)放在程序的任何位置。4、C程序的書寫格式比較自由,可以在一行上寫若干語句,也可以在多行上寫一條語句。5、每個語句后面都必須要有一個分號,分號是C語言中必要的組成部分。6、C語言中沒有專門的輸入、輸出語句,輸入輸出是通過scanf()和printf()兩個庫函數(shù)實現(xiàn)的。7、C程序中可以用/**/對任何部分進行注釋,好的程序都要有必要的注釋,以提高程序的可讀性。從書寫清晰,便于閱讀、理解、維護的角度出發(fā),在書寫程序時應(yīng)遵循以下規(guī)則:1、一個說明或一個語句占一行。2、用{}括起來的部分,通常表示了程序的某一層次結(jié)構(gòu)。{}一般與該結(jié)構(gòu)語句的第一個字母對齊,并單獨占一行。例如:{printf("Thisismyfirstprogram.\n");}3、低一層次的語句或說明可比高一層次的語句或說明縮進若干格后書寫。以便看起來更加清晰,增加程序的可讀性。在編程時應(yīng)力求遵循這些規(guī)則,以養(yǎng)成良好的編程風(fēng)格。三、C程序的開發(fā)過程具體過程如下:1、編輯。將源程序編輯后,以文本形式保存到磁盤中。源程序文件名由用戶自己選定,但擴展名必須為“.c”,例如“f.c”。2、編譯。編譯的功能是調(diào)用“編譯程序”將已經(jīng)編輯好的源程序翻譯成二進制的目標(biāo)代碼。系統(tǒng)對源程序進行編譯的同時,還對源程序的語法進行檢查。當(dāng)發(fā)現(xiàn)錯誤時,會在屏幕上列出錯誤的位置和種類。此時要再次使用編輯工具對源程序進行排錯修正。如果源程序沒有語法錯誤,編譯后將產(chǎn)生一個與源程序同名,以“.obj”(在MS-DOS系統(tǒng)下)為擴展名的目標(biāo)程序。例如,編譯源程序f.c,將產(chǎn)生目標(biāo)程序f.obj。3、連接。編譯后產(chǎn)生的目標(biāo)程序還不能直接運行,因為每一個模塊往往都是單獨編譯的,需要把各模塊編譯后得到的目標(biāo)程序與系統(tǒng)提供的標(biāo)準(zhǔn)庫函數(shù)等連接后才能運行。連接過程是使用系統(tǒng)提供的“連接程序”進行的,連接后產(chǎn)生以“.exe”(在MS-DOS系統(tǒng)下)為擴展名的可執(zhí)行程序,例如“f.exe”。4、運行??蓤?zhí)行目標(biāo)程序生成后,就可以在操作系統(tǒng)的支持下運行。若執(zhí)行結(jié)果達到預(yù)期的目的,則開發(fā)工作到此完成。否則,要進一步檢查修改源程序,再經(jīng)過“編輯→編譯→連接”的過程,直到取得正確的運行結(jié)果為止。c程序書寫格式(1)c程序的每一條語句都必須以分號“;”結(jié)束。(2)程序行的書寫格式自由,既允許1行內(nèi)寫幾條語句,也允許1條語句分寫在幾行上。(3)為避免遺漏必須配對使用的符號,例如注釋符號、函數(shù)體的起止標(biāo)識符(花括號)圓括號等。(4)關(guān)健語句要有使用注釋,C系統(tǒng)不對注釋符進行編譯。C語言的注釋格式為:/*……*/。“/*”和“*/”必須成對使用,且“/”和“*”、以及“*”和“/”之間不能有空格,否則都出錯。注釋的位置,可以單占1行,也可以跟在語句的后面。(5)用{}括起來的部分,通常表示了程序的某一層次結(jié)構(gòu)。{}一般與該結(jié)構(gòu)語句的第一個字母對齊,并單獨占一行。(6)低一層次的語句或說明可比高一層次的語句或說明縮進若干格后書寫。以便看起來更加清晰,增加程序的可讀性。四、簡單的輸入與輸出一個完整的計算機程序,常常要具備輸入/輸出功能。但C語言本身沒有實現(xiàn)輸入/輸出的語句,必須調(diào)用系統(tǒng)函數(shù)完成。(一)、格式化輸入/輸出函數(shù)1、輸出函數(shù)printf()格式:printf(“輸出格式”,輸出項系列)2、輸入函數(shù)scanf()格式:scanf(“輸入格式”,輸入項系列)(二)字符輸入/輸出函數(shù)1、字符輸入函數(shù)getchar()格式:C=getchar();2、字符輸出函數(shù)putchar()格式:putchar(c)作業(yè):1、C程序的書寫格式是什么樣的?2、C程序的執(zhí)行過程是什么樣的?3、編寫程序,輸出“helloword”!小結(jié):本講主要介紹了C語言的發(fā)展特點,基本結(jié)構(gòu),以及C程序的基本格式,C程序開發(fā)的過程等,重點掌握C程序的開發(fā)過程,輸入與輸出字符等,并能熟練應(yīng)用。

項目2C語言編程基礎(chǔ)章節(jié)分析:本章將首先討論C語言中與數(shù)據(jù)描述有關(guān)的問題,包括數(shù)據(jù)與數(shù)據(jù)類型、常量和變量等。然后介紹C語言對數(shù)據(jù)運算的有關(guān)規(guī)則,包括運算類型、運算符和表達式等。教學(xué)內(nèi)容:1、正確掌握C語言各種數(shù)據(jù)類型。2、運算符、運算符的優(yōu)先級及結(jié)合規(guī)則。3、了解不同類型數(shù)據(jù)間的轉(zhuǎn)換原則教學(xué)重點:1、C語言的數(shù)據(jù)類型。2、常量和變量。3、C語言表達式,教學(xué)難點1、C語言的數(shù)據(jù)類型。2、C語言表達式,課時分配:4課時導(dǎo)入新課:程序處理的對象是數(shù)據(jù),編寫程序也就是描述對數(shù)據(jù)的處理過程。在寫程序的過程中必然要涉及數(shù)據(jù)本身的描述問題。第一講一、C語言的數(shù)據(jù)類型計算機的基本功能是處理數(shù)據(jù)。所以任何程序設(shè)計都要涉及兩個問題:問題一:對“數(shù)據(jù)”的描述。在程序中需要指定數(shù)據(jù)的類型及數(shù)據(jù)的組織形式,即數(shù)據(jù)結(jié)構(gòu)。問題二:對“動作”的描述。指對數(shù)據(jù)的加工處理步驟與過程,也就是算法。數(shù)據(jù)是操作對象,操作的目的是對數(shù)據(jù)進行加工處理,以得到預(yù)期的結(jié)果。數(shù)據(jù)是程序的基本部分,如果沒有數(shù)據(jù),程序就無法運行;僅有數(shù)據(jù),而無任何動作,程序也無任何意義。對于相同的數(shù)據(jù)進行不同的加工得到的結(jié)果也不同,所以程序設(shè)計人員在進行程序設(shè)計時必須認(rèn)真考慮應(yīng)如何選擇和設(shè)計合適的數(shù)據(jù)結(jié)構(gòu)和合理的、最佳的操作步驟(算法)。因此,著名的計算機科學(xué)家沃思(NikiklausWirth)提出了一個公式:數(shù)據(jù)結(jié)構(gòu)+算法=程序C語言中,數(shù)據(jù)結(jié)構(gòu)是以數(shù)據(jù)類型的形式來體現(xiàn)的,數(shù)據(jù)類型指數(shù)據(jù)的內(nèi)在存儲方式。C語言提供了豐富的數(shù)據(jù)類型,如圖1所示。C語言中數(shù)據(jù)有常量與變量之分,它們分別屬于圖1所示的這些類型。二、常量在程序運行過程中,其值不能被改變的量稱為常量。常量在程序中不需要進行任何說明就可以直接使用,因為常量本身就隱含了它的類型。常量可以是不同類型的數(shù)據(jù),如:123、-5、8為整型常量;5.4、0.432為實型常量;‘a(chǎn)’、‘d’為字符常量。C語言中有4種基本常量:整型常量、實型常量、字符常量和字符串常量。此外,C語言中還經(jīng)常使用兩種表現(xiàn)形式不同的常量:轉(zhuǎn)義字符常量和符號常量。1.整型常量整型常量也稱整數(shù),包括正整數(shù)、負(fù)整數(shù)和零。在C語言中,整型常量有三種表示形式:(1)十進制。十進制整常數(shù)沒有前綴,其數(shù)碼為0~9。以下各數(shù)是合法的十進制整常數(shù):237;-568;65535;1627。以下各數(shù)是不合法的十進制整常數(shù):023(不能有前導(dǎo)0);23D(含有非十進制數(shù)碼)。(2)八進制(以數(shù)字0開頭)。即以0作為八進制數(shù)的前綴。數(shù)碼取值為0~7。八進制數(shù)通常是無符號數(shù)。以下各數(shù)是合法的八進制數(shù):015(十進制為13);0101(十進制為65);0177777(十進制為65535)。以下各數(shù)是不合法的八進制數(shù):256(無前綴0);03A2(包含了非八進制數(shù)碼);-0127(出現(xiàn)了負(fù)號)。(3)十六進制(以數(shù)字0加字母x或X開頭)。其數(shù)碼取值為0~9,A~F或a~f。以下各數(shù)是合法的十六進制整常數(shù):0X2A(十進制為42);0XA0(十進制為160);0XFFFF(十進制為65535)。以下各數(shù)是不合法的十六進制整常數(shù):5A(無前綴0X);0X3H(含有非十六進制數(shù)碼)。在程序中是根據(jù)前綴來區(qū)分各種進制數(shù)的。因此在書寫常數(shù)時不要把前綴弄錯造成結(jié)果不正確。整型常數(shù)的后綴在16位字長的機器上,基本整型的長度也為16位,因此表示的數(shù)的范圍也是有限定的。十進制無符號整常數(shù)的范圍為0~65535,有符號數(shù)為-32768~+32767。八進制無符號數(shù)的表示范圍為0~0177777。十六進制無符號數(shù)的表示范圍為0X0~0XFFFF或0x0~0xFFFF。如果使用的數(shù)超過了上述范圍,就必須用長整型數(shù)來表示。長整型數(shù)是用后綴“L”或“l(fā)”來表示的。例如:十進制長整常數(shù)158L(十進制為158);358000L(十進制為-358000)。八進制長整常數(shù)012L(十進制為10);077L(十進制為63)0200000L(十進制為65536)。十六進制長整常數(shù)0X15L(十進制為21);0XA5L(十進制為165);0X10000L(十進制為65536)。長整數(shù)158L和基本整常數(shù)158在數(shù)值上并無區(qū)別。但對158L,因為是長整型量,C編譯系統(tǒng)將為它分配4個字節(jié)存儲空間。而對158,因為是基本整型,只分配2個字節(jié)的存儲空間。因此在運算和輸出格式上要予以注意,避免出錯。無符號數(shù)也可用后綴表示,整型常數(shù)的無符號數(shù)的后綴為“U”或“u”。例如:358u,0x38Au,235Lu均為無符號數(shù)。前綴,后綴可同時使用以表示各種類型的數(shù)。如0XA5Lu表示十六進制無符號長整數(shù)A5,其十進制為165。2.實型常量實型常量即實數(shù),在C語言中又稱浮點數(shù),其值有兩種表達形式:(1)十進制小數(shù)形式。由數(shù)字和小數(shù)點組成,例如,3.14159,9.8,-12.567等。(2)指數(shù)形式。這種形式用來表示一些比較大或比較小的數(shù)值,這種形式也由三部分組成,它們是實數(shù)部分、字母E或e、整數(shù)部分。例如,123x1022可以表示為123E22或123e22。25E-2相當(dāng)于25x10-2,1.24e3相當(dāng)于1.24x103等。用指數(shù)形式表示實型數(shù)據(jù)時,在C語言中有如下語法規(guī)定:字母e或E之前必須要有數(shù)字。字母e或E之后的指數(shù)必須為整型。在字母e或E的前后以及數(shù)字之間不得插入空格。例如,e6、-2.432E0.5、5.234125e(3+6)、.e5、2.543543E13等都是不合法的指數(shù)形式。3.字符常量字符常量是用單引號‘’括起來的一個字符。例如,‘A’、‘1’、‘+’等都是字符常量。以下是幾點說明:(1)其中單引號只作為定界符使用,并不是字符常量的組成部分,也就是說在輸出字符常量時,一對單引號并不被輸出。(2)被一對單引號括起來的字符不允許是單引號或反斜杠,即‘'’、‘\’。(3)在C語言中,字符常量具有數(shù)值,這個值就是該字符的ASCⅡ代碼值。如‘A’的值為65,‘a(chǎn)’的值為97,‘?’的值為63。(4)字符常量在機器內(nèi)以整型常量的形式存放(占相同內(nèi)存單元)。因此,字符常量與整型常量等價。也就是說,字符常量可以像整數(shù)一樣,在程序中參與各種運算。例如:a=‘D’+8;b=‘?’+‘X’;他們分別相當(dāng)于下例運算:a=68+8;b=63+88;(5)利用字符常量“既代表一個字符,又具有這個字符的代碼值”這一特性,可以方便地實現(xiàn)程序中的一些功能。例如,需判斷從鍵盤輸入的一個字符是否為英文小寫字母,或判斷一個字符是否為數(shù)字字符等。解決此類問題的辦法就是進行字符的比較,如果邏輯表達式c>=‘a(chǎn)’&&c<=‘z’為真(&&代表“并且”含義),則說明c的ASCⅡ碼值介于‘a(chǎn)’與‘z’之間,而26個小寫字母的編碼值是順序遞增的,所以說明字符c為小寫字母。同理,如果c>=‘0’&&‘9’為真,則說明c是數(shù)字字符。4.轉(zhuǎn)義字符除了以上形式的字符常量外,C語言還允許用一種特殊的字符常量,即轉(zhuǎn)義字符。轉(zhuǎn)義字符以反斜線"\"開頭,后跟一個或幾個字符。轉(zhuǎn)義字符具有特定的含義,不同于字符原有的意義,故稱“轉(zhuǎn)義”字符。例如前面遇到的printf函數(shù)的格式串中用到的“\n”就是一個轉(zhuǎn)義字符,其意義是“回車換行”。轉(zhuǎn)義字符主要用來表示那些用一般字符不便于表示的控制代碼。表1常用轉(zhuǎn)義字符功能\n回車換行,將光標(biāo)從當(dāng)前位置移到下一行開頭\t橫向跳到下一制表位置,相當(dāng)于TAB鍵\b退格,光標(biāo)從當(dāng)前位置向左退一格\r回車不換行,光標(biāo)從當(dāng)前位置移到本行開頭\f換頁,將光標(biāo)從當(dāng)前位置移到下一頁開頭\\反斜線符"\"\′單引號符\〞雙引號符\?問號\ddd1~3位八進制數(shù)所代表的字符\xhh1~2位十六進制數(shù)所代表的字符下面分別詳述上表中轉(zhuǎn)義字符的各種用途。(1)表1中的前5個轉(zhuǎn)義字符只用于輸入輸出語句中控制設(shè)備的動作,而不作任何顯示。如控制輸出設(shè)備“換行”、“換頁”、“退格”、“回車”等??梢越栌眠@種手段輸出某些專用字符以達到控制終端設(shè)備的目的?!纠?】轉(zhuǎn)義字符的使用。main(){Printf(“boy\tgirl\n”);Printf(“︺12︺3\t︺45\r6\t7”);}運行結(jié)果:boy︺︺︺︺︺girl612︺3︺︺︺745 程序分析:①程序中的第一個printf()函數(shù)先在第1行的第1列位置輸出“boy”,然后遇到\t,它的作用是橫行跳格,即跳到下一個TAB位置,在我們所用的計算機系統(tǒng)中,一個TAB位置占8列,下一個TAB位置從第9列開始,故在第9~12列上輸出“girl”。下面遇到\n,它代表回車換行,所以當(dāng)前輸出位置移至第2行的第1列處。②在第2行的開始輸出“︺12︺3”,然后遇到\t,當(dāng)前輸出位置跳到第9列,在9、10、11這3列位置上輸出“︺45”。下面遇到\r,它代表回車但不換行,所以返回到本行第1列輸出字符“6”,然后遇到\t,再使當(dāng)前輸出位置;移到第9列,輸出“7”。③注意第2行在顯示屏上最后看到的結(jié)果與上述打印機結(jié)果不同,為:6︺︺︺︺︺︺︺745這是由于\r使當(dāng)前位置回到本行開頭,自此輸出的字符(包括空格和跳格所經(jīng)過的位置)將取代原來屏幕上該位置上顯示的字符。所以原有的“︺12︺3︺︺︺︺”被新的字符“6︺︺︺︺︺︺︺7”代替,其后的“45”未被新字符取代。實際上,屏幕上完全按程序要求輸出了全部的字符,只是在輸出前面的字符后又很快輸出后面的字符,在你未看清之前,新的字符已取代了舊的字符,所以誤以為屏幕沒輸出應(yīng)輸出的字符。(2)表1中的“\\”、“\’”、“\””分別代表單斜杠“\”、單引號“‘”及雙引號“””。例如:printf(“\”\\Isay:\’Goodby!\’\\\”\n”);輸出結(jié)果為:“\Isay:’Goodby!’\”(3)表1中后面兩個轉(zhuǎn)義字符是用ASCII碼值(八進制和十六進制)表示一個字符。例如‘\101’代表ASCII碼(十進制數(shù))值為65的字符A?!纠?】用轉(zhuǎn)義字符輸出可打印字符和不可打印字符。main(){printf("\x4F\x4B\x21\n");/*等價于printf("OK!\n");*/printf("\101\x62\n");}運行結(jié)果:OK!Ab5.字符串常量字符串常量是用一對雙引號括起來的字符序列。如"Howdoyoudo"、"Goodmorning"都是字符串常量。(1)字符串長度字符串中所含字符的個數(shù)稱為字符串長度。長度為0的字符串(即一個字符都沒有的字符串)稱為空串,表示為“”(一對緊連的雙引號)。(2)字符串的存儲C語言規(guī)定:在存儲字符串常量時,由系統(tǒng)在字符串的末尾自動加一個\0作為字符串的結(jié)束標(biāo)志。如果有一個字符串為CHINA,則它在內(nèi)存中的實際存儲為如圖2-1所示:圖1“CHINA”的實際存儲結(jié)構(gòu)最后一個字符\0是系統(tǒng)自動加上的。字符常量與字符串常量的區(qū)別:①定界符不同:字符常量使用單引號,而字符串常量使用雙引號。②長度不同:字符常量的長度固定為1,而字符串常量的長度可以是0,也可以是某個整數(shù)。③存儲要求不同:字符常量存儲的是字符的ASCII碼值,而字符串常量除了要存儲有效的字符外,還要存儲一個結(jié)束標(biāo)志'\0'。注意:在源程序中書寫字符串常量時,不必加結(jié)束字符\0,系統(tǒng)會自動加上。6.符號常量在C語言中,可以用一個標(biāo)識符來表示一個常量,稱之為符號常量。符號常量在使用之前必須先定義,其一般形式為:#define標(biāo)識符常量表達式<或字符串>,其中#define是一條預(yù)處理命令,也稱為宏定義命令,其功能是把該標(biāo)識符定義為其后的常量值。一經(jīng)定義,以后在程序中所有出現(xiàn)該標(biāo)識符的地方均代之以該常量值。習(xí)慣上符號常量的標(biāo)識符用大寫字母,變量標(biāo)識符用小寫字母,以示區(qū)別。【例3】符號常量的使用#definePI3.1415926#defineR5

main(){

floats;

s=PI*R*R;

printf("s=%f\n",s);

}運行結(jié)果:s=78.539815程序分析:本程序在主函數(shù)之前由宏定義命令定義PI為3.1415926,定義R為5,在程序中即以3.1415926代替PI,以5代替R。s=PI*R*R等效于s=3.14159*5*5。關(guān)于符號常量有幾點說明:(1)一個#define語句只能定義一個符號常量,并且只占據(jù)一個書寫行。(2)由于符號常量定義式不是C語句,所以行尾沒有分號。(3)符號常量不是變量,它所代表的值在整個作用域內(nèi)不能再改變。也就是說,在程序中,不能再用賦值語句對它重新賦值。使用符號常量的好處有兩點:(1)含義清楚。如上例程序中,看程序時從PI就可知道它代表圓周率3.1415926。因此定義符號常量名時應(yīng)考慮“見名知意”,以增強程序的可讀性。(2)在需要改變一個常量時能做到“一改全改”。例如在程序中多次用到半徑R,如果半徑用常數(shù)表示,則在半徑調(diào)整時,就需要在程序中作多次修改,若用符號常量R代表半徑,只需要改動一處即可。如:#defineR7則程序中所有以R代表的半徑就會一律自動改為7。作業(yè):1、編程求圓的面積。2、將A,B,轉(zhuǎn)換成小寫字母。3、常量的定義小結(jié)本節(jié)主要講解了數(shù)據(jù)的基本類型,常量的定義方法,常量的分類以及常量的應(yīng)用方法。

第二講上節(jié)課講解了數(shù)據(jù)的基本類型,以及常量的定義及應(yīng)用(回顧),本節(jié)主要講解變量的定義、變量的應(yīng)用以及數(shù)據(jù)類型的轉(zhuǎn)換。一、變量1、變量和變量的地址變量是指在程序執(zhí)行過程中其值可以被改變的量。每一個變量都有一個名字,變量的命名應(yīng)符合標(biāo)識符的規(guī)定,按照“見名知意”的原則自由命名。一個變量在內(nèi)存中占據(jù)一定的存儲單元,在該存儲單元中存放變量的值。當(dāng)程序需要處理該變量時,就到存儲單元中讀取其值。為了便于存儲管理,給每個存儲單元分配一個序號,這個序號就是地址。對變量的操作(讀或?qū)懀┮罁?jù)地址進行。換句話說,在程序中從變量中取值,實際上是通過變量名找到相應(yīng)的內(nèi)存地址,從其存儲單元中讀取數(shù)據(jù)。例如,變量y的值為6,而y的地址為1800H(十六進制),則1800H號存儲空間中存儲的內(nèi)容是數(shù)值6。如果變量在一個存儲單元存不下,則可以使用多個存儲單元。當(dāng)使用多個存儲單元時,以第一個存儲單元的地址(首地址)作為變量的地址。2、變量的定義在C語言中,任何一個變量在使用之前都必須首先定義它的名字,并說明它的數(shù)據(jù)類型。也就是說,變量使用前必須先定義,即指定變量名,說明變量數(shù)據(jù)類型。變量定義的實質(zhì)是按照變量說明的數(shù)據(jù)類型為變量分配相應(yīng)空間的存儲單元,在該存儲單元中存放變量的值。C語言中,變量使用時遵循“先定義,后使用”的原則。變量定義一般格式:數(shù)據(jù)類型變量名表;如:inta;說明了一個整型變量,變量名為a。對變量定義說明如下:(1)數(shù)據(jù)類型:C語言的合法數(shù)據(jù)類型。如int、short、char、float、double等。(2)變量名表:變量名是C語言合法的標(biāo)識符。變量名表可以包含多個變量名,彼此之間使用逗號分開,表示同時定義若干個具有相同數(shù)據(jù)類型的變量,如:floata,b;(3)變量定義語句可以出現(xiàn)在變量使用之前的任何位置,通常放在函數(shù)體開頭部分。3、整型變量變量可以和數(shù)據(jù)類型結(jié)合起來分類,如整型變量、實型變量、字符變量、數(shù)組變量、指針變量等。整型變量是指整數(shù)的變量。整型變量可分為以下幾類:(1)基本型,類型說明符為int,在內(nèi)存中占2個字節(jié),其取值為基本整常數(shù)。(2)短整型,類型說明符為shortint或short,所占字節(jié)和取值范圍均與基本型相同。(3)長整型,類型說明符為longint或long,在內(nèi)存中占4個字節(jié),其取值為長整常數(shù)。在實際應(yīng)用中,變量的值常常是正的,如學(xué)號、年齡、銷售量等。為了充分利用變量的表數(shù)范圍,此時可以將變量定義為“無符號”類型。對以上三類都可以加上修飾符unsigned,以指定是“無符號數(shù)”。(4)無符號型,無符號型又可分為:無符號整型,

以unsignedint或unsigned表示。無符號短整型,以unsignedshortint或unsignedshort表示。無符號長整型,以unsignedlongint或unsignedlong表示。若不指定為無符號型,缺省的即為有符號型(signed)。無符號整型變量只能存放不帶符號的整數(shù),如5、728,而不能存放負(fù)數(shù),如-5,-728。C標(biāo)準(zhǔn)沒有具體規(guī)定以上各類數(shù)據(jù)所占內(nèi)存字節(jié)數(shù),各種機器在處理上有所不同。以IBMPC為例,整型中各類型符及含義如表2-2所示。變量的字節(jié)數(shù)反映變量存儲值的范圍。例如,對于Turbo

C而言,由于int型變量占2個字節(jié),因而int型變量所能存儲的值的范圍是-32768~32767。如果變量的取值可能超過這個范圍,則要考慮選擇其它的類型,否則可能會發(fā)生數(shù)據(jù)溢出錯誤。值得注意的是,在數(shù)學(xué)中,整數(shù)是一個無限集合,但在特定的機器系統(tǒng)中,所表示數(shù)的范圍是有限的。另外,假設(shè)長整數(shù)數(shù)值為268L,它和基本整型常數(shù)268在數(shù)值上并無區(qū)別。但對于268L來講,它是長整型,系統(tǒng)將為它分配4個字節(jié)的存儲空間。而對于基本整型常數(shù)268,系統(tǒng)只分配2個字節(jié)的存儲空間。因此,在運算和輸出格式上要予以注意,以免出錯?!纠?】整型變量的定義和使用。

main()/*求兩數(shù)和主函數(shù)*/{inta,b,c;/*說明a、b為整型變量*/a=32767;/*為變量a賦最大值*/b=3;/*為變量b賦值*/c=a+b;/*計算a+b并將結(jié)果賦值給變量c*/printf("c=%d\n",c);}/*輸出變量c的值*/運行結(jié)果:c=-32766程序分析:而本程序的運行結(jié)果應(yīng)該是:c=32770,可實際運行結(jié)果卻如上顯示。顯然這個結(jié)果是錯誤的,但系統(tǒng)沒有提示出錯。為什么會出現(xiàn)這種情況呢?圖2-2是該程序運行后變量a、b、c中的存儲情況。由圖中可見,a和b的值都沒有超出整型數(shù)的表示范圍,而a加b后應(yīng)得到32770,這個數(shù)已經(jīng)超出了整型數(shù)的表示范圍,稱為溢出。但這種溢出在內(nèi)存變量c中的表現(xiàn)形式正好是數(shù)值-32766的補碼形式,當(dāng)輸出變量c的內(nèi)容時自然就輸出了-32766,造成結(jié)果錯誤。這就是數(shù)據(jù)溢出導(dǎo)致的結(jié)果。對于這種問題,系統(tǒng)往往不給出錯誤提示,而是要靠正確使用類型說明來保證其正確性。所以要求對數(shù)據(jù)類型的使用要仔細(xì),對運算結(jié)果的數(shù)量級要有基本估計。如果把上述程序作以下修改:main(){longa,b,c;/*說明a、b、c為長整型變量*/a=32767;b=3;c=a+b;printf("c=%ld\n",c);/*按長整型格式輸出變量c的值*/}即把變量a、b、c定義為長整型,就可以得到正確的運行結(jié)果。請思考:如果只把c定義為長整型,a和b還保持整型,結(jié)果會怎樣?在C程序中,要注意常量與變量的類型匹配問題,例如上述程序中變量c的結(jié)果是正整數(shù)32770,與之匹配的有l(wèi)ongint型,還有unsignedint、unsignedshortint和unsignedlongint等所有無符號整型,因為32770是正數(shù),又沒有超出所有無符號整型數(shù)的表示范圍。而int或shortint型是不能與之匹配的,否則會產(chǎn)生溢出。4.實型變量實型變量是指值為實數(shù)的變量,分為單精度(float)、雙精度(double)和長雙精度(longdouble)三種類型。實型變量的存儲長度、取值范圍和精度如表2-3所示。實型變量的定義,只需在說明語句中指明實型數(shù)據(jù)類型和相應(yīng)的變量名即可。例如:floata,b;/*說明變量a,b為單精度型實數(shù)*/doublec,d;/*說明變量c,d為雙精度型實數(shù)*/longdoublee,f/*說明變量e,f為長雙精度型實數(shù)*/使用實型變量時特別要注意數(shù)據(jù)的舍入誤差。由于實型變量是用有限的存儲單元存儲的,因此能提供的有效數(shù)位總是有限的,在有效位之外的數(shù)字將被舍去。【例2】實型數(shù)據(jù)的誤差問題main(){floata;/*說明變量a為單精度型*/doubleb;/*說明變量b為雙精度型*/a=12345.6789;/*為a賦值*/b=0.1234567891234567899e15;/*為b賦值*/printf("a=%f,b=%f\n",a,b);/*輸出變量a、b的值*/}運行結(jié)果:a=12345.678711,b=123456789123456.797000程序分析:程序為單精度變量a和雙精度變量b分別賦值,并不經(jīng)過任何運算就直接輸出變量a,b的值。理想結(jié)果應(yīng)該是照原樣輸出,即:a=12345.6789,b=0.1234567891234567899e15但運行該程序,實際輸出結(jié)果是:a=12345.678711,b=123456789123456.797000由于實型數(shù)據(jù)的有效位是有限的,程序中變量a為單精度型,只有7位有效數(shù)字,所以輸出的前8位是準(zhǔn)確的,第9位以后的數(shù)字“711”是無意義的。變量b為雙精度型,可有15~16位的有效位,所以輸出的前16位是準(zhǔn)確的,第17位以后的數(shù)字“97000”是無意義的。由此可見,由于機器存儲的限制,使用實型數(shù)據(jù)會產(chǎn)生一些誤差,運算次數(shù)愈多,誤差積累就愈大,所以要注意實型數(shù)據(jù)的有效位,合理使用不同的類型,盡可能減少誤差。5.字符型變量字符型變量用于存放字符常量,即一個字符型變量可放一個字符,所以一個字符型變量占用1個字節(jié)的內(nèi)存容量。說明字符型變量的關(guān)鍵字是char,使用時只需在說明語句中指明字符型數(shù)據(jù)類型和相應(yīng)的變量名即可。例如:chars1,s2;/*定義s1,s2為字符型變量*/s1='A';/*為s1賦字符常量'A'*/s2='a';/*為s2賦字符常量'a'*/因為字符型數(shù)據(jù)在內(nèi)存中占用一個字節(jié),所以有符號字符型數(shù)據(jù)的取值范圍為-128~127,無符號字符型數(shù)據(jù)的取值范圍為0~255,ASCII字符中的標(biāo)準(zhǔn)字符ASCII代碼值為0~127。在TurboC語言中,字符型數(shù)據(jù)在操作時將按整型數(shù)據(jù)處理,也就是說字符型數(shù)據(jù)與整型數(shù)據(jù)之間可以通用。一個字符型數(shù)據(jù)既可以以字符形式輸出,也可以以整數(shù)形式輸出?!?c”用以輸出字符本身,“%d”用以輸出字符的ASCII代碼值?!纠?】字符型變量的賦值與輸出

main(

){charch1;

unsignedcharch2;

ch1='A';

ch2=254;

printf("%c~%d\n",ch1,ch1);printf("%c~%d\n",ch2,ch2);}運行結(jié)果:

A~65■~254程序分析:從例2.6可看出,因為ch2定義為unsignedchar,它的ASCII碼值為254,輸出字符“■”和整數(shù)“254”是正確的。試問,如果將ch2定義為char,結(jié)果又將會怎樣?從ASCII代碼表中可以看到每一個大寫字母比它相應(yīng)的小寫字母的ASCII代碼值小32。即‘A’等于‘a(chǎn)’–32【例4】大寫字母轉(zhuǎn)換成相對應(yīng)的小寫字母

main(

){charc1,c2;

c1='A';

c2='B';

c1=c1+32;

c2=c2+32;

printf("%c

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

a

b該程序的作用是將兩個大寫字母轉(zhuǎn)換成相對應(yīng)的小寫字母。6.變量的初始化在程序中常常需要對變量賦初值,以便使用變量。語言程序中可有多種方法,其中在定義時賦以初值的方法,這種方法稱為初始化。在變量說明中賦初值的一般形式為:類型說明符變量1=值1,變量2=值2,……;例如:inta=5;floatx=3.2,y=3f,z=0.75;charch1='K',ch2='P';對變量的初始化有以下幾點說明。(1)變量初始化有點類似于賦值語句,但又不完全相同。賦值語句在程序運行中執(zhí)行該賦值語句時才對變量置值。變量初始化則是在分配變量的存儲空間時立即置值。例如:inta=5;相當(dāng)于:inta;/*只指定a為整型變量*/a=5;

/*一個賦值語句,將5賦予變量a*/(2)在定義變量時,可以給其中一個變量賦初值,也可以同時給多個變量賦初值。例如:int

i=10,k;/*指定i和k為整型變量,i初值為10*/

chara=‘A’,b=‘B’;/*指定a和b勻為字符型變量,初值分別為'A'和'B'*/可以給部分變量賦初值,如:inta=8,b='A',c,d;如果對幾個變量賦以同一個初值時,不能寫成:Int

a=b=5;而應(yīng)寫成:Int

a=5,b=5;(3)在C程序中,字符型數(shù)據(jù)和整型數(shù)據(jù)可以通用,那么在給整型變量賦初值時,初值可以是一個整型數(shù)據(jù),也可以是一個字符型數(shù)據(jù)。例如:inta=65;等價于:

inta=‘A’;同樣,在給字符型變量賦初值時,初值可以是一個字符型數(shù)據(jù),也可以是一個整型數(shù)據(jù)。例如:char

a='a';

等價于

char

a='\141';等價于

char

a=97;二、各類數(shù)值型數(shù)據(jù)間的混合運算C語言規(guī)定,基本類型數(shù)據(jù)可以混合運算。前面已提到,字符型數(shù)據(jù)可以與整型通用,故整型、實型、字符型間可以混合運算。例如以下表達式:'A'+10-5.78是合法的。C語言還規(guī)定,在進行運算時,不同類型的數(shù)據(jù)要先轉(zhuǎn)換成同一類型,然后才能進行運算。轉(zhuǎn)換分自動轉(zhuǎn)換和強制轉(zhuǎn)換(人工轉(zhuǎn)換),這里只介紹自動轉(zhuǎn)換的規(guī)則,如下圖所示。圖中橫向向左的箭頭表示必定的轉(zhuǎn)換,縱向的箭頭表示當(dāng)運算對象為不同類型時轉(zhuǎn)換的方向。注意縱向箭頭方向只表示數(shù)據(jù)類型級別的高低,由低向高轉(zhuǎn)換,而不要理解為int型必須先轉(zhuǎn)換成unsigned型,再轉(zhuǎn)成long型,再轉(zhuǎn)換成double型。自動轉(zhuǎn)換遵循以下規(guī)則:(1)若參于運算量的類型不同,則先轉(zhuǎn)換成同一類型,然后進行運算。(2)轉(zhuǎn)換按數(shù)據(jù)長度增加的方向進行,以保證精度不降低。例如int型和long型運算時,先把int型轉(zhuǎn)換成long型后再進行運算。(3)所有的實型數(shù)據(jù)運算都是以雙精度進行的,即使僅含有float單精度量運算的表達式,也要先轉(zhuǎn)換成double型,再做運算,結(jié)果double型。(4)char型和short型參與運算時,必須先轉(zhuǎn)換成int型,結(jié)果為int型。例如有一表達式式:

'A'+10-5.78運算次序為①進行'A'+10的運算,先將'A'轉(zhuǎn)換成整數(shù)65,運算結(jié)果為75。②進行75-5.78的運算,由于式中有實型,所以先把75和5.78均轉(zhuǎn)換成double型(在小數(shù)點后加若干個0即75.00…0,5.7800…0)后再運算,結(jié)果double型?!纠?】數(shù)據(jù)混合運算舉例。

main()

{

int

i;

float

x,y;

char

c;

i=2;x=3.0;c='A';

y=2.0+i*c+x;

printf("y=%f\n",y);

}運行結(jié)果:y=135.000000程序分析:語句“y=2.0+i*c+x;”中有int、float、char三種類型的數(shù)據(jù),它們可以混合運算,運算時將按照上面所述規(guī)則進行,“A”字符將以ASCII代碼值65與變量i相乘得130,然后將130轉(zhuǎn)換成實型數(shù)據(jù)參與后面的x相加運算。用來表示各種運算的符號稱為運算符。運算符必須要有運算對象。只有一個運算對象的運算符稱單目運算符;有兩個運算對象的運算符稱雙目運算符;有三個運算對象的運算符稱三目運算符。用運算符把運算對象連接起來所組成的運算式稱為表達式。作業(yè):1、下列數(shù)據(jù)中屬于字符串常量的是

c

。A.ABC

B.'ABC'

C."abc"

D.'a'2、下列數(shù)據(jù)中屬于字符常量的是

b。A."A"

B.'\\'

C.w

D.''3、在C語言中,下列哪個是合法的實型常量

c

。A.378e

B.

E-2

C.

1.3145e2

D.2684、下列不合法的變量名為(

a

)。 A.int

B.int1

C.name_1

D.name05、在C語言中,char型數(shù)據(jù)在內(nèi)存中的存儲形式是

b

。

A.BCD碼

B.ASCII代碼值C.內(nèi)碼值

D.十進制代碼值6、執(zhí)行語句“x=(a=5,b=a--);”后,整型變量x,a,b的值依次為

。

A.5,4,4

B.5,4,5

C.5,5,4

D.4,5,47、表達式“25%3/2”值為

。

A.0

B.0.5

C.2

D.1 D)若干子程序組成8、運算符+、=、*、>=中,優(yōu)先級最高的運算符是(

)。A.+

B.=

C.*

D.>=9、下列程序的運行結(jié)果是__________main(

)

{chara,b;

a='0';b='5';

printf("%d,%d,%c,%c\n",a,b,a,b);}10、下列程序的運行結(jié)果是_____

main(

)

{char

c1='a',c2='b',c3='c',c4='\101',c5='\116';

printf("a%cb%c\tc%c\tabc\n",c1,c2,c3);

printf("\t\b%c%c",c4,c5);}11、下列程序的運行結(jié)果是_______main(

)

{int

b=65536;

printf("%d",b);

}12、下列程序的運行結(jié)果是_____________

main(

)

{inti,j,m,n;

i=8;j=10;

m=++i;

n=j++;

printf("%d,%d,%d,%d\n",i,j,m,n);

}總結(jié):本項目主要介紹了數(shù)據(jù)的基本類型,常量和變量的定義,使用方法,數(shù)據(jù)類型的轉(zhuǎn)換等內(nèi)容,這也是C語言程序的基本要素,為后期學(xué)習(xí)C編程打下基礎(chǔ)。

第3講運算符的種類很豐富,可分為以下幾類:1、算術(shù)運算符用于各類數(shù)值運算。包括加(+)、減(-)、乘(*)、除(/)、求余(或稱模運算,%)、自增(++)自減(--)共七種。2、關(guān)系運算符用于比較運算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六種。3、邏輯運算符用于邏輯運算。包括與(&&)、或(||)、非(!)三種。4、位操作運算符參與運算的量,按二進制位進行運算。包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。5、賦值運算符用于賦值運算,分為簡單賦值(=)、復(fù)合算術(shù)賦值(+=,-=,*=,/=,%=)和復(fù)合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。6、條件運算符這是一個三目運算符,用于條件求值(?:)。7、逗號運算符用于把若干表達式組合成一個表達式(,)。8、指針運算符用于取內(nèi)容(*)和取地址(&)二種運算。9、求字節(jié)數(shù)運算符用于計算數(shù)據(jù)類型所占的字節(jié)數(shù)(sizeof)。10、特殊運算符有括號(),下標(biāo)[],成員(→,.)等幾種。一、算術(shù)運算符算術(shù)運算符包括基本算術(shù)運算符和自增、自減運算符,其中基本算術(shù)運算符簡稱算術(shù)運算符。1、基本算術(shù)運算符基本算術(shù)運算符的運算對象、運算規(guī)則與結(jié)果、結(jié)合性如表所示:兩個單目運算符都是出現(xiàn)在運算對象的前面。例如+5的結(jié)果是正整數(shù)5,-5的結(jié)果是負(fù)整數(shù)5。雙目運算符中的加(+)、減(-)、乘(*)運算和普通算術(shù)運算中加法、減法和乘法相同。雙目運算符除(/)與運算對象的數(shù)據(jù)類型有關(guān)。兩個整數(shù)相除結(jié)果為整數(shù),例如7/3的結(jié)果為2,舍棄小數(shù)部分。若兩個運算對象中有一個或兩個都是實型,則運算結(jié)果為實型。雙目運算符模(%)的運算對象必須為整型數(shù)據(jù),結(jié)果是整除后的余數(shù)。運算結(jié)果的符號如何確定,在不同的系統(tǒng)中是不同的,在TurboC中運算結(jié)果的符號與被除數(shù)相同。例如7%3、7%-3的結(jié)果均為1(商分別為2、-2);-7%3、-7%-3的結(jié)果均為-1(商分別為-2、2)。2、算術(shù)表達式用算術(shù)運算符和括號將運算對象連接起來的,符合C語法規(guī)則的式子,稱算術(shù)表達式。例如:15/2-8%5*1.0是一個合法的算術(shù)運算表達式。在計算機語言中,算術(shù)表達值規(guī)律與數(shù)學(xué)中的四則運算的規(guī)律類似。在對它進行運算時,首先分清楚哪些運算符先運算,哪些運算符后運算,即按優(yōu)先級由高到低運算;當(dāng)優(yōu)先級相同時再按其結(jié)合性來運算。上式中/、%、*運算符相同,均高于減(-)運算符,它們的結(jié)合性均為從左到右。(1)在C語言中,所有實型的運算都以雙精度方式進行的。若是單精度數(shù),則在尾數(shù)部分補0,使之轉(zhuǎn)化為雙精度數(shù)。(2)雙目運算符兩側(cè)運算數(shù)的類型必須一致,才能進行操作,所得結(jié)果的類型與運算數(shù)的類型一致。例如1.0/2.0,其運算結(jié)果為0.5;而1/2其運算結(jié)果為0。(3)如果一個運算符兩則的數(shù)據(jù)類型不同,系統(tǒng)則會自動進行類型轉(zhuǎn)換,使兩者具有同一種類型,然后進行運算。當(dāng)然也可以人為進行數(shù)據(jù)類型的強制轉(zhuǎn)換,其格式如下:(數(shù)據(jù)類型符)(表達式)其功能是將“表達式”的值轉(zhuǎn)換成“數(shù)據(jù)類型符”所表示的數(shù)據(jù)類型。對強制類型轉(zhuǎn)換應(yīng)注意以下幾點:(1)若表達式僅是單個常量或變量,則常量或變量不必用圓括號括起來;若是含有運算符的表達式,則必須加圓括號。例如:(float)n

/*表示將表達式n的值轉(zhuǎn)換float類型*/(int)n+m

/*表示將n的值轉(zhuǎn)換成int型后再與m進行相加運算*/(int)(n+m)/*表示先對n和m進行加運算,再將運算結(jié)果轉(zhuǎn)換成int型*/(2)參與運算的常量或變量的類型自動轉(zhuǎn)換是臨時的,它僅產(chǎn)生一個臨時的、類型不同的數(shù)據(jù)參加運算,其常量或變量的原類型和值均不改變。(3)類型轉(zhuǎn)換將占用系統(tǒng)時間,過多的轉(zhuǎn)換將降低程序的運行效率。在設(shè)計程序時應(yīng)盡量選擇好數(shù)據(jù)類型,以減少不必要的類型轉(zhuǎn)換?!纠?】算術(shù)運算符應(yīng)用舉例。

main(

)

{

inta=5,b=8,c;

float

f=15.78;c=(int)f-a%b;

printf("c=%d\n",c);

printf("f=%f\n",f);

}運算結(jié)果:c=10f=15.780000f變量的類型仍為float型,數(shù)值大小仍為15.783、自增、自減運算符自增(++)、自減(--)運算符的作用是分別使變量值自增1和自減1,均為單目運算符。自增、自減運算既可以放在運算對象的前面(稱前輟),也可以放在運算對象的后面(稱后輟),前輟和后輟的功能略有不同。自增、自減運算符和運算對象可組成的表達式如下:++x

/*先使x的值增加1,然后再使用增加了值后的x*/--x

/*先使x的值減小1,然后再使用減小了值后的x*/x++

/*先使用x,然后再使x的值增加1*/x--

/*先使用x,然后再使x的值減小1*/x++,++x(或x--,--x)均可以使x的值增加1(或減小1),相當(dāng)于x=x+1(或x=x-1)。但x++和++x有不同之處。例如,設(shè)x初值為5,則下列語句m的值是不同的:m=x++;/*表示將x的值5賦給m后,x再加1變?yōu)?*/m=++x;/*表示x的值先加1后變成6,再將新值6賦給m*通過上述我們可以看到,對于x++和++x,當(dāng)它們出現(xiàn)在其它表達中時,要特別注意它們的運算規(guī)則,否則將會得到錯誤的結(jié)果。對于++、--運算符,我們應(yīng)注意以下幾點:(1)++、--運算符只能用于變量,而不能用于常量或表達式,例如8++,(x+y)--均是不合法的。(2)++、--運算符是單目運算符,優(yōu)先級高于雙目基本算術(shù)運算符,而低于括號()運算符,結(jié)合性為從右到左。(3)++、--運算符的運算對象為字符型、整型、指針型變量或數(shù)組元素,運算結(jié)果的數(shù)據(jù)類型同運算對象的類型一致。(4)當(dāng)出現(xiàn)難以區(qū)分的若干個“+”或“-”組成運算符串時,C語言規(guī)定:從左到右取盡可能多的符號組成運算符。例如,設(shè)整型變量a、b的值均為5,則:a+++b;應(yīng)理解為(a++)+b,結(jié)果為10,運算后a為6,b不變。ab;應(yīng)理解為(a--)-b,結(jié)果為0,運算后a為4,b不變。(5)在printf(

)函數(shù)中,實參數(shù)的求值順序,各系統(tǒng)不一樣。在多數(shù)系統(tǒng)中對函數(shù)的求值順序是從右到左。例如,i初值為5。printf("%d,%d",i,i++);輸出結(jié)果為:6,5(6)不要在一個表達式中對同一個變量進行多次諸如i++或++i等運算。例如:(a++)+(a++)+(a++);有的系統(tǒng)按照從左到右順序求解括弧內(nèi)的運算,求完第一個括弧的值后,實現(xiàn)a的自加,a值變?yōu)?,再依次求第二個、第三個括弧的值,結(jié)果表達式相當(dāng)于5+6+7,即18。而另一些系統(tǒng)(如Turboc)把5作為表達式中所有a的值,因此3個a相加,得表達式的值為15,在求出整個表達式的值后再實現(xiàn)自加3次,a的值變?yōu)?。不同的編譯系統(tǒng)對這樣的表達式將作不同的處理,因而得到的結(jié)果也各不相同。應(yīng)該避免出現(xiàn)這種有歧義、可讀性差的語句,程序中盡量不要出現(xiàn)這種現(xiàn)象。【例2】自增、自減運算的應(yīng)用。

main(

)

{

inti,j;i=3;

printf("j=%d\n",j=i++);

printf("i=%d\n",i);printf("j=%d\n",j=++i);

printf("i=%d",i);

}運行結(jié)果:j=3i=4j=5i=5二、賦值運算在C程序中,要將某個值賦給一個變量,通常用到賦值運算符。1、賦值運算符賦值符號“=”就是賦值運算符,基功能是將一個數(shù)據(jù)賦給一個變量。例如“a=5”、“x=y+z”都能進行賦值運算,可將一個常量或一個表達式的值賦給一個變量。賦值運算符的左側(cè)必須是變量,右側(cè)為一個表達式。賦值運算符(=)不等于數(shù)學(xué)中的“等號”,這里不是等同的關(guān)系,而是進行“賦值”操作。賦值運算符的結(jié)合性是從右到左。賦值運算符的優(yōu)先級如下(優(yōu)先級逐漸降低):算術(shù)運算符→關(guān)系運算符→雙目邏輯運算符→賦值運算符在做賦值運算時,盡量做到賦值號兩側(cè)的數(shù)據(jù)類型一致,若不一致,則賦值時會自動進行類型轉(zhuǎn)換。但這種轉(zhuǎn)換與前面講的轉(zhuǎn)換不相同,此處所講的轉(zhuǎn)換是將賦值運算符右側(cè)表達式的值轉(zhuǎn)換成與左側(cè)變量相同的類型。在C語言的賦值表達式中,轉(zhuǎn)換的原則是:(1)將實型數(shù)據(jù)賦給整型變量時,舍棄實數(shù)的小數(shù)部分。例如I為整型變量,執(zhí)行“i=5.78”的結(jié)果是使i的值為5。(2)將整型數(shù)據(jù)賦給實型變量時,數(shù)值不變,將以實數(shù)形式(在整數(shù)后添上小數(shù)點及若干個0)存儲到變量中。(3)將一個double型數(shù)據(jù)賦給float變量時,截取其前面7位有效數(shù)字,存放到float變量的存儲單元中。相反,將一個float型數(shù)據(jù)賦給double變量時,數(shù)值不變,有效數(shù)擴展到16位。(4)字符型數(shù)據(jù)賦給整型變量時,只將字符數(shù)據(jù)(8位)放到整型變量低8位中,高8位補0或補1有兩種情況。①如所用系統(tǒng)將字符處理為無符號的量或?qū)nsignedchar型變量賦值,則高8位補0。例如,將字符‘\376’賦給int型變量,如圖(a)所示。②如所用系統(tǒng)(如TurboC)將字符處理為帶符號的,則高8位補字符最高位數(shù)0或1。如下圖(b)所示。(5)將一個整型數(shù)據(jù)賦給一個char型變量時,只將其低8位原封不動地送到char型變量中。如圖所示。(6)將unsignedint型數(shù)據(jù)賦給longint型變量時,只需將高位補0即可。將一個unsignedint型數(shù)據(jù)賦給一個占字節(jié)數(shù)相同的整型變量時,只要將unsigned型變量在內(nèi)存中的內(nèi)容原樣送入非unsigned型變量的內(nèi)存中。(7)將帶符號的int型數(shù)據(jù)賦給long型變量時,只將int型數(shù)據(jù)放入long型變量的低字節(jié)中,高字節(jié)全部補int數(shù)據(jù)型的符號位??傊?,不同類型的整型數(shù)據(jù)間的賦值均按存儲單元中的存儲形式直接傳送。由于C語言使用靈活,在不同類型數(shù)據(jù)間賦值時,常常會出現(xiàn)意想不到的結(jié)果,而編譯系統(tǒng)并不提示出錯,全靠程序員人為來找出問題?!纠?】將無符號數(shù)據(jù)賦給有符號變量的應(yīng)用。

main()

{

unsigned

a=65535;

int

b;

b=a;

printf("%d\n",b);}運行結(jié)果:-1程序分析:因為unsigned型變量a的值為65535,它在內(nèi)存中是以16個“1”存放的。當(dāng)將a的值賦給int型變量b時,只需將a內(nèi)存中內(nèi)容原樣復(fù)制到b內(nèi)存中??紤]到b為有符號型,內(nèi)存中最高位是“1”認(rèn)為是負(fù)數(shù),是以補碼形式存放的。在用“%d”形式輸出b值,要將補碼形式轉(zhuǎn)換成原碼后再輸出,所以輸出2、復(fù)合式賦值運算符C語言中提供了另一種賦值運算符,例如:+=、-=、*=、/=、%=都是復(fù)合式賦值運算符。它們把算術(shù)運算和賦值運算兩者結(jié)合在一起作為一個復(fù)合運算符,以達到簡化書寫程序和提高運算效率的目的。例如,可以有:a+=b+c

等價于a=a+(b+c)a-=b+c

等價于a=a-(b+c)a*=b+c

等價于a=a*(b+c)a/=b+c

等價于a=a/(b+c)a%=b+c

等價于a=a%(b+c)當(dāng)然,如果上述五個運算符的右側(cè)是一個變量或一個常量,在將轉(zhuǎn)換成基本的賦值符形式時,就可以不加括弧。例如:a%=b

可寫成a=a%(b)或a=a%b。凡是雙目運算符,都可以與賦值運算符一起合成復(fù)合式賦值運算符。C語言規(guī)定除了可以使用以上五種外,還可以使用下面五種(將在后面章節(jié)中介紹):<<=、>>=、&=、|=、^=算術(shù)自反賦值運算符在書寫時,兩個運算符間不能有空格。算術(shù)自反賦值運算符和賦值運算符是同級別的,結(jié)合性是從右到左。3、賦值表達式由賦值運算符或自反賦值運算符(復(fù)合賦值運算符)將一個變量和一個表達式連接起來的式子稱為賦值表達式。具體構(gòu)成規(guī)則一般形式如下:變量

賦值運算符

表達式。其運算過程是:先計算表達式的值,然后將該值賦給左側(cè)變量,整個賦值表達式的值就等于左側(cè)變量的值。例如“a=5+3”,先計算表達式“5+3”的值為8,然后將此值8賦給左側(cè)變量a,整個表達式的值也為8。對賦值表達式有幾點說明:(1)上述一般形式的賦值表達式中的“表達式”可以是算術(shù)表達式、賦值表達式等,當(dāng)然也可以是一個常量或一個變量,例如,a=b=c=10。由于賦值運算符的結(jié)合性為從右到左,因此,這個表達式等價于a=(b=(c=10))。經(jīng)過連續(xù)賦值后,a,b,c的值都是10,但最后表達式值是a的值為10。(2)賦值表達式也可以包含復(fù)合賦值運算符。例如:a+=a-=a*a;也是一個賦值表達式。如果a初值為5,此賦值表達式的求解步驟如下:先進行“a-=a*a”的運算,它相當(dāng)于a=a-(a*a)=5-(5*5)=5-25=-20。再進行“a+=-20”的運算,它相當(dāng)于a=a+(-20)=-20-20=-40。(3)賦值表達式在C程序中使用相當(dāng)靈活,它可以出現(xiàn)在其它語句中,例如:printf("%d",a=b);在這一個語句中完成了賦值和輸出雙重功能。(4)在賦值表達式x=x中,雖然賦值運算符兩側(cè)均為x,但含義不同。賦值運算符右側(cè)的x表示變量x所代表的存儲單元中的值,左側(cè)的x表示以x為標(biāo)識的存儲單元。對于n=n+1是合法的賦值表達式,其作用是取變量n中的值加1后再放入變量n中,即使變量n中的值增加1。(5)用賦值運算符可以實現(xiàn)兩個變量值的互換。例如要交換變量a,b的值,可用:t=a;a=b;b=t;(通過中間單元實現(xiàn))a=a+b;b=a-b;a=a-b;(a,b最好為同一類型的整型或字型)(6)在賦值表達式后加一分號(;)就成了語句。賦值語句和賦值表達式是不同的,賦值表達式是一種表達式,它可以出現(xiàn)在任何允許表達式出現(xiàn)的地方。作業(yè):1、下列數(shù)據(jù)中屬于字符串常量的是

。A.ABC

B.'ABC'

C."abc"

D.'a'2、下列數(shù)據(jù)中屬于字符常量的是

。A."A"

B.'\\'

C.w

D.''3、在C語言中,下列哪個是合法的實型常量

。A.378e

B.

E-2

C.

1.3145e2

D.2684、下列不合法的變量名為(

)。 A.int

B.int1

C.name_1

D.name05、在C語言中,char型數(shù)據(jù)在內(nèi)存中的存儲形式是

。

A.BCD碼

B.ASCII代碼值C.內(nèi)碼值

D.十進制代碼值6、執(zhí)行語句“x=(a=5,b=a--);”后,整型變量x,a,b的值依次為

A.5,4,4

B.5,4,5

C.5,5,4

D.4,5,47、表達式“25%3/2”值為

。

A.0

B.0.5

C.2

D.1小結(jié)本節(jié)主要講解了算術(shù)運算符及算術(shù)表達式,賦值運算符和賦值表達式,并通過案例加深理解。

第4講上節(jié)課講解了算術(shù)運算符和賦值運算符(回顧),本節(jié)主要講關(guān)系運算符,邏輯運算符以及位運算等。一、邏輯運算包括:1。&&邏輯與2。||邏輯或3。!邏輯非邏輯運算符用于對包含關(guān)系運算符的表達式進行合并或取非對于使用邏輯運算符的表達式,返回0表示“假”,返回1表示“真”。關(guān)于邏輯運算符的解釋請注意:任何使用兩個字符做符號的運算符,兩字符之間不應(yīng)有空格,即將==寫成==是錯誤的。假設(shè)一個程序在同時滿足條件a<10和b==7時,必須執(zhí)行某些操作。應(yīng)使用關(guān)系運算符和邏輯運算符“與”來寫這個條件的代碼。用&&表示“與”運算符,該條件代碼如下:(a<10)&&(b==7);類似地,“或”是用于檢查兩個條件中是否有一個為真的運算符。它由兩個連續(xù)的管道符號(||)表示。如果上例改為:如果任一語句為真,則程序需執(zhí)行某些操作,則條件代碼如下:(a<10)||(b==7);第三個邏輯運算符“非”用一個感嘆號(!)表示。這個運算符對表達式的真值取反。例如,如果變量s小于10,程序程序需執(zhí)行某些操作,則條件代碼如下:(s<10)或(!(s>=10))//s不大于等于10關(guān)系運算符和邏輯運算符的優(yōu)先級一般都低于算術(shù)運算符。例如,5>4+3的計算與5>(4+3)運算符是一樣的,即先計算4+3,再執(zhí)行關(guān)系運算。此表達示的結(jié)果為“假”,即,將返回0。下面的語句printf("%d",5>4+3);將輸出0可以總結(jié)為:&&的結(jié)果是真真為真。||的結(jié)果是假假為假。二、位運算符包括:1。&位與符2。|位或符3。^位異或符4。~位取反符以操作數(shù)12為例。位運算符將數(shù)字12視為1100。位運算符將操作數(shù)視為位而不是數(shù)值。數(shù)值可以是任意進制的:十進制、八進制或十六進制。位運算符則將操作數(shù)轉(zhuǎn)化為二進制,并相應(yīng)地返回1或0。位運算符將數(shù)字視為二進制值,并按位進行相應(yīng)運算,運算完成后再重新轉(zhuǎn)換為數(shù)字。例如:表達式10&15表示(1010&1111),它將返回表示1010的值10。因為真真得真,或者是11得1,同位全是1結(jié)果也是1表達式10|15表示(1010|1111),它將返回表示1111的值15。假假得假。全零得零。表達式10^15表示(1010^1111),它將返回表示0101的值5。此時是同性相斥,相同的就為假。表達式~10表示(~1010),它將返回表示0101的值-11。此號好理解,按位取反三、逗號運算符和逗號表達式逗號運算符(也稱順序求值)用逗號(,)表示,是雙目運算符,其運算對象是表達式。逗號表達式就是用逗號把若干個表達式連接起來的式子。例如:3+5,6+9。逗號表達式的一般形式為:表達式1,表達式2,…,表達式n。逗號運算符的優(yōu)先級在C語言的所有運算符中最低,結(jié)合性是從左到右。逗號表達式中的“表達式”可以是任何表達式,也就是說逗號運算符的運算對象可以是任何類型的表達式。逗號表達式的求解過程是:依次求解表達式1、表達式2、…、表達式n,整個逗號表達式的值等于表達式n的值。例如,表達式:a=3,6*5它相當(dāng)于(a=3),6*5,在求解過程中使得a的值均為3,整個表達式的值為30。又如表達式:a=2*5,a*4它相當(dāng)于(a=2*5),a*4,在求解過程中,先求解a=2*5,再求解a*4,使得變量a的值為10,而整個表達式的值為10*4,即為40。其實,逗號表達式無非是把若干個表達式“串聯(lián)起來”。請注意并不是任何地方出現(xiàn)的逗號都是作為逗號運算符,例如函數(shù)參數(shù)也是用逗號來間隔。例如:printf("%d,%d%d\n",(a,b,c),b,c);其中“(a,b,c)”為一個逗號表達式,它的值等于c的值;而“(a,b,c),b,c”不是逗號表達式,而是三個參數(shù):“(a,b,c)”、“b”、“c”。C語言的表達式類型相當(dāng)豐富,這使得C語言表達式能力強,因而C語言使用靈活,適應(yīng)性強?!緦嵗?】分析以下程序的輸出結(jié)果。#include<stdio.h>#include<string.h>main(){chars[]="a'\n\\\'\r\b";printf("%d,%d\n",sizeof(s),strlen(s));}程序分析:字符串s由‘a(chǎn)’、‘b’、‘\n’、‘\\’、‘\’‘、’\r‘、’\b‘這7個字符組成,strlen(s)表示字符串長度,故長度為7,但字符串本身有一個結(jié)束標(biāo)志‘\0’,所以,s的長度為7,在內(nèi)存中占用8個字節(jié)。運行結(jié)果:8,7【實例2】分析以下程序的輸出結(jié)果。#include<stdio.h>main(){shortinta=32767,b;b=a+1;printf("a=%d,b=%d\n",a,b);}程序分析:a與b均為短整數(shù),占兩個字節(jié).a(chǎn)=32767,a的補碼:0111111111111111,b的補碼=a的補碼+1=0111111111111111+1=10000000000000000,則b的原值=-(1111111111111111+1)=-(10000000000000000)=-32768.運行結(jié)果:a=32767,b=-32768【實例3】分析以下程序的輸出結(jié)果。#include<stdio.h>main(){inta,b,x;x=(a=3,b=a--);printf("x=%d,a=%d,b=%d\n",x,a,b);}程序分析:對于x=(a=3,b=a--);語句,右邊是一個逗號表達式。先執(zhí)行a=3,再執(zhí)行b=a--,a=2,b=3,返回b即3,x=3。運行結(jié)果:x=3,a=2,b=3【實例4】分析以下程序的輸出結(jié)果。#include<stdio.h>main(){intn=2;n+=n-=n

溫馨提示

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

評論

0/150

提交評論