版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C語言程序設(shè)計(jì)教程第一講C語言概述1.1C語言發(fā)展概述1.2C語言的特點(diǎn)1.3簡單的C語言程序1.4C程序上機(jī)步驟2.1常量和變量1.1C語言發(fā)展概述C語言是在1972年至1973年間由美國的貝爾實(shí)驗(yàn)室的M.D.Ritchie和K.Thompson以及英國劍橋大學(xué)的M.Richards等為描述和實(shí)現(xiàn)UNIX操作系統(tǒng)而設(shè)計(jì)的。最初的C語言是附屬于UNIX的操作系統(tǒng)環(huán)境,而它的產(chǎn)生卻可以更好地描述UNIX操作系統(tǒng)。時至今日,C語言已獨(dú)立于UNIX操作系統(tǒng)。它已成為微型、小型、中型、大型和超大型(巨型)計(jì)算機(jī)通用的一種程序設(shè)計(jì)語言。隨著C語言的不斷發(fā)展、應(yīng)用和普及,目前,C語言已經(jīng)能夠在多種操作系統(tǒng)下運(yùn)行,實(shí)用的C語言編譯系統(tǒng)種類繁多,如MicrosoftC、TurboC等。1.2C語言的特點(diǎn)C語言能夠成為目前廣泛的高級設(shè)計(jì)語言之一,完全是由其語言特點(diǎn)決定的。(1)語言基本組成部分緊湊簡潔。(2)C語言運(yùn)算符豐富,表達(dá)能力強(qiáng)。(3)C語言數(shù)據(jù)結(jié)構(gòu)豐富,結(jié)構(gòu)化好。(4)具有結(jié)構(gòu)化的控制語句。(5)C語言提供了某些接近匯編語言的功能。(6)C語言程序所生成的目標(biāo)代碼質(zhì)量高。(7)C語言程序可移植性好。C語言的弱點(diǎn):(1)運(yùn)算符的優(yōu)先級較復(fù)雜,不容易記憶(2)C語言的語法限制不太嚴(yán)格,一定程度上降低了某些安全性。例1.3編寫計(jì)算長為a,寬為b的長方形面積s的C程序。/*filenamea3.c*/#include“stdio.h”main(){inta,b,s;/*定義a,b,s三個整形變量*/printf(“a,b=?”);scanf(“%d,%d”,&a,&b);/*讀入兩個整數(shù),存入變量a和b中*/s=a*b;/*計(jì)算長方形的面積s的值*/printf(“s=%d\n”,s);/*輸出面積s的值*/}編譯a3.c程序,并執(zhí)行文件名為a3.exe,執(zhí)行結(jié)果為:C:\>a3a,b=?20,10S=2001.3簡單的C語言程序。1.3.1C語言程序的構(gòu)成例1.1編寫一個C語言程序,顯示一個字符串“goodmorning,class!”。/*filenamea1.c*/main(){printf(“goodmorning,class!\n”);}編譯a1.c程序,并執(zhí)行文件a1.exe,執(zhí)行結(jié)果為C:>a1Goodmorning,class!(加下劃線部分為需輸入內(nèi)容,下同)例1.2將兩個整數(shù)之和顯示出來。/*filenamea2.c*/main(){inta,b,sum;/*定義a,b,sum三個整形變量*/a=100;b=200;/*給變量a和b賦值*/sum=a+b;/*計(jì)算a和b和,存入變量sum中*/printf(“sum=%d\n”,sum);/*輸出sum的值*/}編譯a2.c程序,并執(zhí)行文件a2.exe,執(zhí)行結(jié)果為C:\>a2Sum=3001.3.2C語言程序的特點(diǎn)(1)C程序是由函數(shù)構(gòu)成的,其中至少包括一個函數(shù)main()。(2)函數(shù)體是由左右花括號{}括起來的部分。(3)C語言中的每個基本語句都以“;”結(jié)束。(4)C語言書寫格式自由,一行內(nèi)可以寫一個語句,也可以寫多個語句。(5)#include語句是編譯預(yù)處理語句,其作用是將由雙引號或尖括號括起來的文件內(nèi)容讀入該語句位置處。對程序說明:(1)可用/*…*/對C程序中的任何部分作注釋。(2)C語言中所有變量都必須先定義類型,然后再使用。(3)一個C語言程序通過函數(shù)之間的相互調(diào)用來實(shí)現(xiàn)相應(yīng)的功能。即可以是系統(tǒng)提供的庫函數(shù),也可以是根據(jù)需要自己定義的函數(shù)。1.4C語言上機(jī)步驟運(yùn)行環(huán)境:DOC操作系統(tǒng)下的TurboC編輯編譯連接執(zhí)行開始結(jié)束有錯?有錯?.C源文件.OBJ目標(biāo)文件.EXE可執(zhí)行文件是是否否1.4.1C程序上機(jī)步驟1.編輯:在TurboC環(huán)境下。將C語言源程序通過鍵盤輸入到計(jì)算機(jī)中,并以文件形式存盤,源程序都是以.C為擴(kuò)展名。2.編譯:通過編輯程序?qū)⒃闯绦蜉斎氲接?jì)算機(jī)后,需要經(jīng)過C語言編譯器將其生成目標(biāo)程序。得到的目標(biāo)文件都是以.OBJ為文件擴(kuò)展名。3.連接:經(jīng)過編譯后生成的目標(biāo)文件需經(jīng)過連接后才能生成可執(zhí)行代碼。其擴(kuò)展名是.EXE。所謂連接,是將目標(biāo)文件和庫函數(shù)或其他目標(biāo)程序連接成可執(zhí)行的目標(biāo)程序。4.執(zhí)行:連接后源程序的目標(biāo)程序就是可執(zhí)行文件了。在DOC系統(tǒng)下,只要鍵入可執(zhí)行文件名,按回車鍵就可以了。1.4.2TurboC系統(tǒng)菜單主菜單信息窗編輯窗快速參考行文件操作編輯運(yùn)行編譯項(xiàng)目文件選項(xiàng)調(diào)試中斷/觀察1.TurboC的主屏幕和主菜單功能2.文件菜單及功能裝入一個新文件裝入文件列表中的文件新建存盤另存為顯示文件列表顯示目錄暫時退出退出2.1常量和變量2.1.1常量:在程序運(yùn)行過程中其值不能被改變的量。2.1.2變量:在程序運(yùn)行過程中其值可以被改變的量。標(biāo)識符:用來標(biāo)識變量名、符號常量名、函數(shù)名、數(shù)組名、類型名、文件名的有效字符序列。1.標(biāo)識符的有關(guān)規(guī)定:(1)由英文字母、數(shù)字、下劃線組成,且第一個字符必須是字母或下劃線,一般不超過8個字符;(2)大小寫字母的含義不同。(3)不能使用C語言中的關(guān)鍵字做標(biāo)識符,(4)用戶取名時,應(yīng)當(dāng)盡量遵循“簡潔明了”和見名知意的原則。2.變量名的有關(guān)規(guī)定:(1)使用變量名前,一定先定認(rèn),后使用,否則不能做為變量名。(2)每一個變量屬于一種類型,便于在編譯時據(jù)此檢查該變量所進(jìn)行的運(yùn)算是否合法。(3)變量名的定義:存儲屬性、數(shù)據(jù)類型、變量名表3.數(shù)據(jù)類型2.2整型數(shù)據(jù)2.2.1整型常量(1)十進(jìn)制整數(shù):數(shù)碼直接開頭的十進(jìn)制數(shù)。如1234,-234。(2)八進(jìn)制整數(shù):以0開頭的常量是八進(jìn)制數(shù)。如011=(11)8(3)十六進(jìn)制整數(shù):以0x開頭的數(shù)是十六進(jìn)制。如0x123即(123)16例2.1三種進(jìn)制表示方法的轉(zhuǎn)換源程序a1.cmain(){Intx=1246,y=01246,z=0x1246;Printf(“%d,%d,%d\n”,x,y,z);Printf(“%o,%o,%o\n”,x,y,z);Printf(“%x,%x,%x\n”,x,y,z);}C:\>a11246,678,46782336,1246,111064de,2a6,12462.2.2整型變量原則:使用變量前,先定義,后使用。(1)基本型:用int表示;(2)短整型:用shortint或short表示;(3)長整型:用longint或long表示;(4)無符號型:無符號整型:用unsignedint或unsigned表示;無符號短整型:用unsignedshortint或unsignedshort表示;無符號長整型:用unsignedlongint或unsignedlong表示;2.2.3整型變量使用
不同的整型數(shù)據(jù),應(yīng)根據(jù)其特性和取值范圍,將其定義成不同類型的整型變量。例2.2不同類型的數(shù)據(jù)進(jìn)行算術(shù)運(yùn)算。源程序a2.cMain(){Inta,b,s1,s2;Unsignedx;a=10;b=-30;x=20;S1=a+x;s2=b+x;Printf(“a+x=%d,b+x=%d\n”,s1,s2);}C:\>a2運(yùn)行結(jié)果為a+x=30,b+x=-102.2.3整型變量使用
不同的整型數(shù)據(jù),應(yīng)根據(jù)其特性和取值范圍,將其定義成不同類型的整型變量。例2.3整型數(shù)據(jù)各類型所能表示的范圍源程序a3.cmain(){inta,b;longc,d;unsignede,f;a=32767;b=1;c=2147483647;d=1;e=65535;f=1;Printf(“int:%d,%d,\n”,a,a+b);Printf(“l(fā)ong:%d,%ld\n”,c,c+d);Printf(“unsigned:%u,%u\n”,e,e+f);}C:\>a3運(yùn)行結(jié)果為Int:372767,-32768Long:2147483647,-2147483648Unsigned:65535,02.3字符型數(shù)據(jù)2.3.1字符型常量字符常量是由一對單引號括起來的單個字符構(gòu)成,例如:‘A’,‘b’,’2’,’%’’;’等。一個字符型常量是該字符集中對應(yīng)的編碼值:‘0’~‘9’的ASCⅡ編碼值是48~57。顯然‘0’與數(shù)字0是不同的。2.3.2字符型變量字符型數(shù)據(jù)分為兩類:一般字符類型(char)和無符號字符類型(unsignedchar)。例2.4字符型數(shù)據(jù)與整型數(shù)據(jù)可以通用源程序a3.cMain(){charc1,c2;Printf(“%c,%c\n”,c1,c2);Printf(“%d,%d\n”,c1,c2);}C:\>a4運(yùn)行結(jié)果為A,B65,662.3.3字符串常量
字符串常量是由一對雙引號括起來的字符序列,例:“fsdf”,”A”等。字符串常量中不能直接包括單引號、雙引號和反斜杠“\“。字符串常量與字符常量的區(qū)別:(1)字符串常量是用雙引號括起來的字符序列。(2)字符串常量有串尾標(biāo)記”\0”;(3)字符串常量允許擴(kuò)展表示法;(4)C語言中沒有專門的字符串變量。字符串如果需要存放在變量中,需要用字符型數(shù)組來存放。注意:不要將單個字符組成的字符串常量與字符常量混淆?!產(chǎn)’為字符串常量,不能把一個字符串常量賦給一個字符變量。例如:下面的用法都是錯誤的:Charc1,c2;C1=“a”C2=“CHINA”;字符‘\0’由系統(tǒng)自動加入到每個字符串的結(jié)束處,不必由編程人員加入。字符串“CHINA”在內(nèi)存中的存放形式如下圖,其長度是六個字節(jié),而不是5個字節(jié)。字符‘\0’所對應(yīng)的ASCⅡ值為0,即“空”字符。2.4浮點(diǎn)型數(shù)據(jù)2.4.1浮點(diǎn)型常量浮點(diǎn)型常量有兩種表示形式。十進(jìn)制數(shù)形式它是由數(shù)字和小數(shù)組成,如:3.14159,-7.2,8.9指數(shù)法形式如:180000.0用指數(shù)法可表示為1.8e5,1.8稱為尾數(shù),5稱為指數(shù)。
0.00123用指數(shù)法可表示為1.23e-3注意:(1)字母e或E之前(即尾數(shù)部分)必須是有數(shù)字的。(2)e或E后面的指數(shù)部分必須是整數(shù)。如:e-3,9.8e3.1,e5都是不合法的。2.4.2浮點(diǎn)型變量(實(shí)型變量)
把帶有小數(shù)點(diǎn)的數(shù)稱為浮點(diǎn)數(shù),或?qū)嵭蛿?shù)。浮點(diǎn)型變量又稱為實(shí)型變量,按能表示數(shù)的精度,分為:單精度浮點(diǎn)型變量和雙精度浮點(diǎn)型變量,其定認(rèn)方法如下:floata,b;/*單精度變量的定義*/doublec,d;/*雙精度變量的定義*/單精度:占4個字節(jié),有效位為7位,數(shù)值范圍為10-37~1038雙精度:占8個字節(jié),有效位為15~16位,數(shù)值范圍約為10-307~10308浮點(diǎn)型常量不存在單精度型和雙精度型之分。2.6運(yùn)算符及表達(dá)式C語言運(yùn)算符可以分為:算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符。2.6.1算術(shù)運(yùn)算符和算術(shù)表達(dá)式1.算術(shù)運(yùn)算符:加、減、乘、除及取模即:+,-,*,/,%來表示。C語言規(guī)定:(1)模運(yùn)算符%,僅用于整型變量或整型常量。(2)優(yōu)先級:一個表達(dá)式中如有多個運(yùn)算符,則計(jì)算先后次序?yàn)橄鄳?yīng)運(yùn)算符的優(yōu)先級高的優(yōu)先。乘、除、模優(yōu)先級高于加、減的優(yōu)先級。(3)結(jié)合方向:是一個運(yùn)算對象兩側(cè)的運(yùn)算符的優(yōu)先級別相同時,應(yīng)遵循的處理規(guī)則。算術(shù)運(yùn)算符的結(jié)合方向是從左至右;賦值運(yùn)算符的結(jié)合方向是從右至左。算術(shù)表達(dá)式:由算術(shù)運(yùn)算符、括號以及操作對象組成的符號C語言語法規(guī)則的表達(dá)式稱為算術(shù)表達(dá)式。2.6.2賦值語句1.賦值運(yùn)算符語言的賦值運(yùn)算符是“=”,它的作用是賦值運(yùn)算符右邊表達(dá)式的值賦給其左邊的變量。例如:a=10,x=a+5,前者是把常量10賦給變量a,后者是將表達(dá)式a+5的值賦給變量x.注意:如果“=”兩側(cè)的類型不一致,在賦值時要進(jìn)行類型轉(zhuǎn)換。例如a=b,執(zhí)行該語句時,b的結(jié)果轉(zhuǎn)換為a的類型后才能進(jìn)行賦值運(yùn)算。2.復(fù)合賦值運(yùn)算符C語言允許在賦值運(yùn)算符“=“之前加上其它運(yùn)算符,以構(gòu)成其復(fù)合運(yùn)算符。復(fù)合運(yùn)算符多數(shù)為雙目。復(fù)合運(yùn)算符有:+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=例:a+=2等價于a=a+2x*=y+5等價于x=x*(y+5)x%=8等價于x=x%8賦值運(yùn)算符都是自右向左執(zhí)行。3.賦值語句與賦值表達(dá)式賦值語句最簡單的形式是:<變量>=<表達(dá)式>;功能:是賦值運(yùn)算符右邊的“表達(dá)式”的值賦給左邊的變量。賦值表達(dá)式也可以包含復(fù)合的賦值運(yùn)算符,例:如果a=10,表達(dá)式a+=a-=a*a的值為-180。其步驟為:(1)先進(jìn)行a-=a*a的計(jì)算,它相當(dāng)于a=a-a*a=10-10*10=-90.(2)再進(jìn)行a+=-90的計(jì)算,它相當(dāng)于a=a+(-90)=-90-90=-180.4.自增自減運(yùn)算符i++(或i--)表示在使用該表達(dá)式值之后將i值加1(或減1)。++i(或--i)表示在使用該表達(dá)式值之前將i值加1(或減1)。說明:(1)++和--僅適用于變量,不能用于常量或表達(dá)式。(2)++和--運(yùn)算符的結(jié)合方向是“至右向左”。Main(){inta=100;printf(“a++=%d\n”,a++);printf(“++a=%d\n”,++a);printf(“a--=%d\n”,a--);printf(“--a=%d\n”,--a);}輸出結(jié)果:a++=100++a=102a--=102--a=1002.6.3關(guān)系運(yùn)算符和關(guān)系表達(dá)式1.關(guān)系運(yùn)算符關(guān)系運(yùn)算符均為兩目運(yùn)算符。共有六種:>大于<小于>=大于等于<=小于等于==
等于!=
不等于關(guān)系運(yùn)算符要求兩個操作數(shù)是同一種數(shù)據(jù)類型,其結(jié)果為一邏輯值,即關(guān)系成立時,其值為真(true),用非0值表示;關(guān)系不成立時,其值為假(false),用0表示。關(guān)系運(yùn)算符的優(yōu)先級借低于算術(shù)運(yùn)算符,關(guān)系運(yùn)算符==和!=低于前四種運(yùn)算符,并且結(jié)合方向均為自左至右。2.關(guān)系表達(dá)式由關(guān)系運(yùn)算符將兩個表達(dá)式連接起來的有意義的式子稱為關(guān)系表達(dá)式。如:a+b<c-6先進(jìn)行a+b和c-6兩個算術(shù)表達(dá)式的運(yùn)算,得到兩個值后再進(jìn)行比較,從現(xiàn)而求出關(guān)系表達(dá)式的值。其值為0或非0。關(guān)系表達(dá)式的值是一個邏輯值,即“真”或“假”。用1表示“真”,用0表示“假”。如:a=4,b=1,C=a>b;c的值為1,若a=1,b=8,x=a>b;x的值為0。2.6.4邏輯運(yùn)算符和邏輯表達(dá)式1.邏輯運(yùn)算符邏輯運(yùn)算符有“&&“(邏輯與)、”||“(邏輯或)和”!“(邏輯非)三種。邏輯運(yùn)算符的操作對象為零或非零整數(shù)值,見表2.4.表2.4邏輯運(yùn)算規(guī)則數(shù)據(jù)a數(shù)據(jù)ba&&ba||b!a!bTTTTFFTFFTFTFTFTTFFFFFTT邏輯表達(dá)式由邏輯運(yùn)算符和其操作對象組成表達(dá)式稱為邏輯表達(dá)式。2.6.5位運(yùn)算符位(bit)運(yùn)算是C語言的一大特色,可直接對構(gòu)成內(nèi)存的基本單位“字節(jié)”(byte)進(jìn)行按位操作。按位與(&)操作規(guī)則:參加運(yùn)算的兩個運(yùn)算量,如果兩個相應(yīng)的位均為1,則該位的結(jié)果為1,否則為0,見表2.5
表2.5接位與運(yùn)算量10101運(yùn)算量20011結(jié)果0001例如:(1)清零。(2)取一個數(shù)中的某些位。高位清零:
0010110110011100&00000000111111110000000010011100低位清零:
0010110110011100
&11111111000000000010110100000000按位或(|)操作規(guī)則:參加運(yùn)算的兩個運(yùn)算量,其相應(yīng)的位中只有一個為1,則該位的結(jié)果為1,否則為0。表2.6按位或運(yùn)算量10101運(yùn)算量20011結(jié)果0111例如:(1)01000001
|0010100101101001(2)01000001
|0000000001000001(3)01000011
|1111111111111111(4)01000001
|1011111011111111例如:將某一個數(shù)的某些位置為1。一個整數(shù)a,要將其低字節(jié)全置為1,即低字節(jié)為11111111,可將該數(shù)與255(十六進(jìn)制為FF,二進(jìn)制為11111111)按按位或即可。按位異或(^)操作規(guī)則:參加運(yùn)算的兩個運(yùn)算量,當(dāng)相應(yīng)位相同時,其結(jié)果在該位為0,相應(yīng)位不同時,其結(jié)果在該位為1,即按位相加,但不進(jìn)位。表2.7 按位異或運(yùn)算量10101運(yùn)算量20011結(jié)果0110(1)使指定位翻轉(zhuǎn)。即由1變?yōu)?,由0變?yōu)?。例:
01100110^0000111101101001
(2)不使用臨時變量,交換兩個值。方法為:若有兩個數(shù)a和b,通過下面的賦值語言可將a和b的值互換:a=a^b;b=b^a;b=a^b;4.按位求反(~)操作規(guī)則:運(yùn)算符~是一個單目運(yùn)算符,用來對一個數(shù)二進(jìn)制表示按位求反,即瘵0變成1,將1變成0。表2.8按位求反運(yùn)算量01結(jié)果10例:~0110100110010110將一個數(shù)的某些位變?yōu)?。方法是:瘵該數(shù)a與~b按位求與,此處的b為這樣的一個數(shù),即要求a中變?yōu)?的那些位均為1,其余位均為0。如要將a的最低位變?yōu)?,則可使用下述表達(dá)式實(shí)現(xiàn)。A=a&~15.左移(<<)操作規(guī)則:將一個數(shù)的各二進(jìn)制位全部左移若干位,左移后,右邊的這些位用0填補(bǔ),左邊移出的位舍棄不用。例:a=a<<2;若a=15,即二進(jìn)制00001111,左移兩位后變?yōu)?0111100。若再向左移4位,則變?yōu)?1000000。將一個數(shù)左移1位,相當(dāng)于該數(shù)乘以2,左移2位相當(dāng)于該數(shù)乘以4。如上例中a=15,則a=a<<2,此時a=15*4=60。但是這種情況僅指左移時沒有1被移出去的情況,左移運(yùn)算要比乘法運(yùn)算快得多。6.右移(>>)操作規(guī)則:將一個數(shù)的各二進(jìn)制位全部右移若干位,右移后,右邊移出的位被舍棄,而左邊的填補(bǔ)分兩種情況:(1)該數(shù)為無符號數(shù),則高位補(bǔ)0。例:a=a>>2;右a=15,二進(jìn)制為00001111,右移兩位后為00000011。(2)該數(shù)為有符號數(shù),若原來的符號位為0(最高位為0,即正數(shù))則高位補(bǔ)0,若原來的符號位為1(即表示該數(shù)為負(fù)數(shù)),高位補(bǔ)0或1,取決于所使用的計(jì)算機(jī)系統(tǒng)。有的系統(tǒng)補(bǔ)0,稱為邏輯右移,有的系統(tǒng)補(bǔ)1,稱為算術(shù)右移。例:a:1000110110000111a>>1:0100011011000011(邏輯右移)a>>1:1100011011000011(算術(shù)右移)2.6.6其他運(yùn)算符逗號運(yùn)算符逗號運(yùn)算符為“,“。逗號表達(dá)式是用逗號運(yùn)算符把兩個表達(dá)式組合成的一個表達(dá)式。其一般形式為〈表達(dá)式1〉,〈表達(dá)式2〉說明:(1)逗號表達(dá)式的執(zhí)行過程是:先求表達(dá)式1的值,再求表達(dá)式2的值,表達(dá)式2的值就是整個逗號表達(dá)式的值。(2)一個逗號表達(dá)式可以與另一個表達(dá)式構(gòu)成一個新逗號表達(dá)式。(3)逗號運(yùn)算符是所有運(yùn)算符中級別最低的。(4)逗號表達(dá)式常用于for語句中,它可以表達(dá)多個初值或多個步長增量。逗號表達(dá)式的一般形式可以擴(kuò)展為〈表達(dá)式1〉,〈表達(dá)式2〉,〈表達(dá)式3〉,……〈表達(dá)式N〉表達(dá)式n的值是整個表達(dá)式的值。條件運(yùn)算符條件運(yùn)算符是一個三目運(yùn)算符,把三表達(dá)式組合成一個表達(dá)式。其一般形式為〈表達(dá)式1〉?〈表達(dá)式2〉:〈表達(dá)式3〉;功能:計(jì)算〈表達(dá)式1〉的值,如果該值為真(非0值),則計(jì)算〈表達(dá)式2〉的值,并且該值即為條件表達(dá)式值。若〈表達(dá)式1〉的值為假(0),則計(jì)算〈表達(dá)式3〉的值,并將該值作為條件表達(dá)式的值。說明:(1)條件運(yùn)算符優(yōu)先級別高于賦值運(yùn)算符,低于關(guān)系運(yùn)算符和算術(shù)運(yùn)算符。(2)條件運(yùn)算符結(jié)合方向是“自右至左”。(3)〈表達(dá)式1〉與〈表達(dá)式2〉、〈表達(dá)式3〉類型可以不同。3.Sizeof運(yùn)算符sizeof運(yùn)算符是測試變量、表達(dá)式或類型名所占用的字節(jié)數(shù)。有兩種用法。sizeof〈表達(dá)式〉:測試表達(dá)式所占用的字節(jié)數(shù)。sizeof〈表達(dá)式〉:測試類型名所占用的字節(jié)數(shù)。例如:sizeof(float)其值為4。sizeof運(yùn)算符可以出現(xiàn)的表達(dá)式中。main(){inta=4;floadb=5.6;printf(“%d,%d\n”,sizeof(a),sizeof(b));}輸出結(jié)果:2,42.7數(shù)據(jù)類型轉(zhuǎn)換
在內(nèi)存中,字符是以系統(tǒng)中所使用字符的編碼值形式存儲的,C語言允許字符型數(shù)據(jù)和整型數(shù)據(jù)之間通用一個字符型數(shù)據(jù),即可以以字符形式輸出,也可以以整型形式輸出,同時,字符型數(shù)據(jù)可能賦給整型變量,整型數(shù)據(jù)也可以賦給字符型變量,只是當(dāng)整型變量數(shù)據(jù)的大小超過字符型變量的表示范圍時,需要截取相應(yīng)的有效位。除字符型數(shù)據(jù)和整型數(shù)據(jù)之間可以通用之外,不同類型的數(shù)據(jù)在進(jìn)行混合運(yùn)算時,往往需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。因此類型轉(zhuǎn)換有兩種方式:一種是自動類型轉(zhuǎn)換;另一種是強(qiáng)制類型轉(zhuǎn)換。2.7.1自動類型轉(zhuǎn)換在進(jìn)行計(jì)算時,首先將不同類型的數(shù)據(jù)轉(zhuǎn)換成同一類型,然后進(jìn)行計(jì)算不同類型數(shù)值轉(zhuǎn)換規(guī)則:DoublefloatLongUnsignedIntchar,short2.7.2強(qiáng)制類型轉(zhuǎn)化強(qiáng)制類型轉(zhuǎn)化的一般形式如下所示:(強(qiáng)制的類型名)〈變量〉例如:(int)(a+b),將a+b的結(jié)果強(qiáng)制轉(zhuǎn)換成int型;
(float)a/b,將a的結(jié)果強(qiáng)制轉(zhuǎn)換成float型后,再進(jìn)行計(jì)算。注意:經(jīng)強(qiáng)制類型轉(zhuǎn)換后,得到的是一個所需類型的中間變量,原來變量的類型并沒有發(fā)生任何變化。3.1數(shù)據(jù)的輸入3.1.1字符輸入函數(shù)getchar格式:getchar()功能:從鍵盤上接收輸入的一個字符。例如:
charc;┆c=getchar()其中c是字符型或整型變量。例1:從鍵盤輸入一個字符,并將其存入字符型變量c中。#include”stdio.h”Main(){charc;C=getchar();}3.1.2格式輸入函數(shù)scanf格式:scanf(格式控制,地址表);功能:用來輸入任何類型數(shù)據(jù),可同時輸入多個類型或不同類型數(shù)據(jù)。格式控制:是由雙括號括起來字符串,主要是由“%”和格式符組成表3.1Scanf函數(shù)格式字符格式字符功能d輸入十進(jìn)制整數(shù)o輸入八進(jìn)制整數(shù)x輸入十六進(jìn)制整數(shù)c輸入單個字符s輸入字符串fe輸入浮點(diǎn)數(shù)(小數(shù)或指數(shù)形式)hd,ho,hx輸入短整型數(shù)據(jù)ld,lo,lx輸入長整型數(shù)據(jù)lf,le輸入長浮點(diǎn)型數(shù)據(jù)(雙精度)2.地址表Scanf函數(shù)中的“地址表”部分是由變量的地址組成的,如果有多個變量,則各變量之間用逗號隔開。地址運(yùn)算符為“&“,如變量a的地址可以寫為&a。例3.2用scanf函數(shù),從鍵盤上輸入一個整型數(shù)、一個浮點(diǎn)數(shù)和一個字符,分別存入變量i、f和c中。#include”stdio.h”main(){inti;floatf;charc;scanf(“%d,%f,%c”,&I,&f,&c);printf(“i=%d,f=%f,c=%c”,i,f,c);}說明:(1)在scanf函數(shù)“格式控制”部分中的每個格式說明符都必須在“地址表列”中有一個變量與之對應(yīng)格式說明符必須要與相應(yīng)變量的類型一致。(2)當(dāng)格式說明符之間沒有任何字符時,在輸入數(shù)據(jù)時,兩個數(shù)據(jù)之間要使用“空格”、“Tab”或“回車”鍵做間隔;如果格式說明符之間包含其它字符,則輸入數(shù)據(jù)時,應(yīng)輸入與這些字符相同的字符做間隔,如:
Scanf(“%d,%f,%c”,&i,&f,&c);
在輸入數(shù)據(jù)時,應(yīng)采用如下形式:20,7.8,a(3)可以在格式說明符的前面指定輸入數(shù)據(jù)所占的列數(shù),系統(tǒng)將自動按此列數(shù)來截取所需的數(shù)據(jù),如:
scanf(%2d%3d”,&x,&y);當(dāng)用戶輸入78985時,系統(tǒng)將自動地將78賦給變量x,將985賦給變量y。這種方式也可用于字符型數(shù)據(jù)的輸入。(4)應(yīng)該特別注意的是,scanf函數(shù)中的“地址表列”部分應(yīng)當(dāng)中變量的地址,而不是變量名。3.2數(shù)據(jù)的輸出3.2.1字符輸出函數(shù)putchar數(shù)據(jù)的輸出一般是以終端顯示器(屏幕)為處理對象。格式:向終端輸出一個字符。說明:變量c可以是字符型,也可以是整型。例3.3從鍵盤輸入一個字符,在屏幕上顯示出來。#include”stdio.h”main(){charc;c=getchar();/*從鍵盤輸入一個字符*/putchar(c);/*在屏幕上顯示一個字符*/}putchar函數(shù)也可以輸出一些特殊字符(控制字符),如:putchar(‘\n’)作用是輸出一個“換行”字符。3.2.2格式控制函數(shù)printf格式:printf(格式控制,輸出表);功能:輸出任何類型的數(shù)據(jù)。1.格式控制“格式控制”部分與scanf函數(shù)的相似,也是由雙引號括起來的字符串,主要包括格式說明和需要原樣輸出的字符?!案袷秸f明”:由“%”和格式符組成,如%c和%f等,作用是將要輸出的數(shù)據(jù)轉(zhuǎn)換為指定格式后輸出。printf函數(shù)中使用的格式字符見表3.2。表3.2printf函數(shù)格式字符格式字符功能d按十進(jìn)制形式輸出帶符號的整數(shù)(正數(shù)前無+號)o按八進(jìn)制形式無符號輸出(無前導(dǎo)o)x按十六進(jìn)制形式無符號輸出(無前導(dǎo)ox)u按十進(jìn)無符號形式輸出c按字符形式輸出一個字符f按十進(jìn)形式輸出單、雙精度浮點(diǎn)數(shù)(默認(rèn)6位小數(shù))e按指數(shù)形式輸出單、雙精度浮點(diǎn)數(shù)s輸出以‘\o’結(jié)尾的字符串ld長整型輸出lo長八進(jìn)制整型輸出lx長十六進(jìn)制整型輸出lu按無符號長整型輸出m格式字符按寬度m輸出,右對齊-m格式字符按寬度m輸出,左對齊m,n格式字符按寬度m,n位小,或裁取字符串前n個字符輸出,右對齊-m,n格式字符按寬度m,n位小,或裁取字符串前n個字符輸出,左對齊注意:格式字符必須小寫輸出表printf函數(shù)中的“輸出表”部分由表達(dá)式組成,這些表達(dá)式應(yīng)與“格式控制”字符串中的格式說明符的類型一一對應(yīng),若“輸出表”中有多個表達(dá)式,則每個表達(dá)式之間應(yīng)由逗號隔開。例3.4從鍵盤輸入一個整數(shù)和一個浮點(diǎn)數(shù),并在屏幕上顯示出來。#include”stdio.h”main(){inti;floatf;scanf(“%d,%f”,&i,&f);printf(“i=%d,f=%f”,I,f);}執(zhí)行此程序,按格式輸入數(shù)據(jù):50,8,9i=50,f=8.900000說明:(1)printf函數(shù)中的“格式控制”字符串中的每一個格式說明符,都必須與“輸出表”中的某一個變量相對應(yīng),如上述程序中的“%”與i對應(yīng);“%f”與f對應(yīng),而且格式說明符應(yīng)當(dāng)與其所對應(yīng)變量的類型一致。若要顯示“%”字符,則應(yīng)在“格式控制”字符串中連寫兩個“%”,如:Printf(“x=%d%%”,100/4);將顯示:x=25%。(2)對格式說明符c、d、s和f等,可以指定輸出字段的寬度。%md:m為指定的輸出字段的寬度。如果數(shù)據(jù)的位數(shù)大于m,則按實(shí)際位數(shù)輸出,否則輸出時向右對齊,左端補(bǔ)以“空格”符。%mc:m為指定的輸出字段的寬度。若m大于一個字符的寬度,則輸出時向右對齊,左端補(bǔ)以“空格”符。%mc:m為輸出時字符串所占的列數(shù)。如果字符串的長度(字符個數(shù))大于m,則按字符串的本身長度輸出,否則,輸出時字符串向右對齊,左端補(bǔ)以“空格”符。%-ms:mr的意義同上。如果字符串的長度小于m,則輸出時字符串向左對齊,右端補(bǔ)以“空格”符。%m.nf:m為浮點(diǎn)數(shù)據(jù)所占的總列數(shù)(包括小數(shù)點(diǎn)),n為小數(shù)點(diǎn)后面的位數(shù)。如果數(shù)據(jù)的長度小于m,則輸出時向右對齊,左端補(bǔ)以“空格”符。%-m.nf:m、n的意義同上。如果數(shù)據(jù)的長度小于m,則輸出向左對齊,右端補(bǔ)以“空格”符。(3)除了格式說明符及其輸出字段的寬度外,在“格式控制”字符中的其他字符,將按原樣輸出。(4)在顯示數(shù)據(jù)時,可以不指定輸出字段的寬度,而直接利用系統(tǒng)隱含的輸出寬度。3.3應(yīng)用舉例例3.5分析下列程序,觀察運(yùn)行結(jié)果。main(){charch=‘a(chǎn)’;inta=98;unsignedb=1000;longc=123456789;floatx=3.14;doubley=1.2345678;pPrintf(“(1)a=%d,a=%c,ch=%d,ch=%c\n”,a,a,ch,ch);printf(“(2)b=%u\n”,b);printf(“(3)c=%ld\n”,c);printf(“(4)x=%f,y=%f\n”,x,y);printf(“(5)x=%e,y=%e\n”,x,y);printf(“(6)y=%e10.2f\n”,y);}運(yùn)行的結(jié)果為(1)a=98,a=b,ch=97,ch=ab=1000C=123456789X=3.140000,y=1.234567x=3.14000e+00,y=1.23456e+00Y=1.23例3.6從鍵盤上輸入一個大寫字母,把它轉(zhuǎn)換面小寫字母,然后顯示出來。#include”stdio.h”main(){charx1,x2;printf(“x1=?\n”);scanf(“%c”,&x1);x2=x1+32;printf(“%c,%c\n”,x1,x2);}運(yùn)行結(jié)果x1=?AA,a例3.7分別輸入一個浮點(diǎn)數(shù),一個整數(shù),一個字符型數(shù)。#include“stdio.h”main(){floatf;intI;charc;scanf(“%f%d%c”,&f,&I,&c);printf(“%f%d%c”,f,I,c);}第四章條件語句結(jié)構(gòu)化程序的三種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu):是指每個程序都是按照語句的書寫順序依次執(zhí)行的。選擇分支結(jié)構(gòu):是指通過對特定條件的判斷,來選擇一個分支執(zhí)行。循環(huán)結(jié)構(gòu):循環(huán)是指在給定條件下,重復(fù)執(zhí)行某段程序,直到不滿足條件為止。4.1語句和復(fù)合語句表達(dá)式語句:一個表達(dá)式的后面跟隨一個分號構(gòu)成的語句。如:x=x+a;說明:分號“;”是語句的終結(jié)符,而不是語句的分隔符即分號是語句的最末組成部分。復(fù)合語句:由左右花括號括起來的語句;形式:{說明部分;語句部分}一個復(fù)合語句在語法上等同于一個語句,在程序中,凡是單個語句能夠出現(xiàn)的地方,都可以出現(xiàn)復(fù)合語句。一個復(fù)合語句又可以出現(xiàn)在其他復(fù)合語句內(nèi)部。在復(fù)合語句的后面必須有一個分號,做為該語句的終結(jié)符。4.2if語句If語句是條件選擇語句,它是通過對給定條件的判斷,來決定所要執(zhí)行的操作。4.2.1if語句的三種形式If語句的第一種形式格式:if(表達(dá)式)〈語句〉功能:首先計(jì)算表達(dá)式的值,若表達(dá)式的值為“真”(為非0),則執(zhí)行語句,若表達(dá)式的值為“假”(為0),不執(zhí)行語句。例如:If(x>y)printf(“%d”,x);表達(dá)式語句假(0)真(非0)2.If語句的第二種形式格式:if(表達(dá)式)〈語句1〉
else〈語句2〉功能:首先計(jì)算表達(dá)式的值,若表達(dá)式的值為“真”(為非0)。則執(zhí)行語句1,若表達(dá)式的值為“假”(為0),則執(zhí)行語句2。例如:if(x>y)printf(“%d”,x);elseprintf(“%d”,y);語句1表達(dá)式語句2真假3.If語句的第三種形式格式:if(表達(dá)式1)〈語句1〉elseif(表達(dá)式2)〈語句2〉elseif(表達(dá)式3)〈語句3〉
┆elseif(表達(dá)式n)〈語句n〉else〈語句n+1〉功能:首先計(jì)算表達(dá)式的值,若第n個表達(dá)式的值為“真”(為非0),則執(zhí)行語句n,若所有的表達(dá)式的值都為“假”(為0),則執(zhí)行語句n+1。其流程圖如下:表達(dá)式1表達(dá)式2表達(dá)式3表達(dá)式4真真真真假假假假語句1語句2語句3語句4語句5例如:if(score>89)grade=‘5’;elseif(score>74)grade=‘4’;elseif(score>59)grade=‘3’;elsegrade=‘2’;說明:(1)if語句中的表達(dá)式可以是C語言的合法表達(dá)式。(2)第二種、第三種格式的if語句中,在每個else前面有一個分號,整個語句結(jié)束處也有一個分號。這是由于分號是C語句中不可缺少的部分,這個分號是if語句中的內(nèi)嵌語句所要求的。(3)在if和else后面可以只含有一個內(nèi)嵌的操作語句,也可以含有多個操作語句,此時應(yīng)用花括號“{}“將幾個語句括起來,構(gòu)成一個復(fù)合語句。例4.1將兩個數(shù)中較大者賦給s。main(){inta,b,s;a=10;b=20;if(a>b)s=a;elses=b;printf(“s=%d\n”,s);}執(zhí)行結(jié)果:s=20例4.2比較兩個數(shù),按由大到小輸出。main(){inta,b,x,y;a=10;b=20;if(a>b){x=a;y=b;}else{x=b;y=a;}printf(“x=%d,y=%d\n”,x,y);}執(zhí)行結(jié)果:x=20,y=104.2.2if語句的嵌套在if語句中又包含一個或多個if語句,稱為if語句的嵌套。一般形式如下:if()if()〈語句1〉
else〈語句2〉elseif()〈語句3〉
else〈語句4〉if()if()〈語句1〉elseif()〈語句2〉
else〈語句3〉說明:(1)if與else的配對關(guān)系,從最內(nèi)層開始,else總是與離它最近的未曾配對的if配對。(2)if與else的個數(shù)最好相同,從內(nèi)層到外層一一對應(yīng),以避免出錯。(3)如果if與else的個數(shù)不相同,可以用花括號來確定配對關(guān)系。例如:If(){if()〈語句1〉}else
〈語句2〉這時{}限定了內(nèi)嵌if語句的范圍,因此else與第一個if配對。內(nèi)嵌if內(nèi)嵌if內(nèi)嵌if例4.3有一函數(shù)-1(x<0)y=0(x=0)1(x>0)編一程序,輸入一個x值,輸出y值。main(){intx,y;scanf(“%d”,&x);if(x<0)y=-1;elseif(x==0)y=0;elsey=1;printf(“x=%d,y=%d\n”,x,y);}4.2.3條件運(yùn)算符如果if語句的形式如下所示:if(表達(dá)式1)
x=〈表達(dá)式2〉;elsex=〈表達(dá)式2〉;無論表達(dá)式1為“真”還是為“假”,都只執(zhí)行一個賦值語句且給同一個變量賦值??梢岳脳l件運(yùn)算符,將這種語句簡單地用如下語句來表示。
x=〈表達(dá)式1〉?〈表達(dá)式2〉:〈表達(dá)式3〉;說明:即當(dāng)表達(dá)式1的值為“真”時,將表達(dá)式2的值賦給變量x;當(dāng)表達(dá)式1的值為“假”時,將表達(dá)式3的值賦給變量x。如:a=5,b=10,c=20;x=a>b?c*b:c/b;因?yàn)閍>b為假,則x=c/b=2。例4.4輸入兩個數(shù),并將其中較大者顯示出來。#include“stdio.h”main(){inta,b,max;scanf(“%d%d”,&a,&b);max=(a>b)?a:b;printf(“max=%d”,max);}條件運(yùn)算符也可以嵌套使用,如:Grade=(score>=90)?’A’:(score<=70)?’C’:’B’;當(dāng)score>=90時,將字符‘A’賦給變量grade;當(dāng)score<=70時,將字符‘C’賦給變量grade;否則將字符‘B’賦給變量grade.4.3switch語句Switch語句是多分支選擇語句,其一般形式如下:Switch(表達(dá)式)
{case〈常量表達(dá)式1〉:〈語句1〉
case〈常量表達(dá)式2〉:〈語句2〉
┆case〈常量表達(dá)式n〉:〈語句n〉
default:〈語句n+1〉
}可同時省略switch語句的執(zhí)行過程是:首先計(jì)算switch后面圓括號內(nèi)表達(dá)式的值,若此值等于某個case后面的常量表達(dá)式的值,則轉(zhuǎn)向該case后面的語句去執(zhí)行;若表達(dá)式的值不等于任何case后面的常量表達(dá)式的值,則轉(zhuǎn)向default后面的語句去執(zhí)行,如果沒有default部分,則將不執(zhí)行switch語句中的任何語句,而直接轉(zhuǎn)到switch語句后面的語句去執(zhí)行。說明:(1)switch后面圓括號內(nèi)的表達(dá)式的值和case后面的常量表達(dá)式的值,都必須是整型的或字符型的,不允許是浮點(diǎn)型的。(2)同一個switch語句中的所有case后面的常量表達(dá)式的值都必須互不相同。(3)switch語句中的case和default的出現(xiàn)次序是任意的,也就是說default也可以位于case的前面,且case的次序也不要求按常量表達(dá)式的大小順序排列。(4)由于switch語句中的“case常量表達(dá)式”部分只起標(biāo)號的作用,而不進(jìn)行條件判斷,所以,在執(zhí)行完某個case后的語句后,將自動轉(zhuǎn)到該語句后面的語句去執(zhí)行,直到遇到switch語句的右花括號或“break”語句為此,而不再進(jìn)行條件判斷。所以在執(zhí)行完一個case分支后,一般應(yīng)跳出switch語句,轉(zhuǎn)到下一條語句執(zhí)行,這樣可在一個case的結(jié)束后,下一個case開始前,插入一個break語句,一但執(zhí)行到braek語句,將立即跳出switch語句,如:如:Switch(n){case1:x=1;case2:x=2;}當(dāng)n=1時,將連續(xù)執(zhí)行下面兩個語句:X=1;X=2;如:Switch(n){case1;x=1;Braek;Case2;X=2Braek}(5)每個case的后面即可以是一個句號,也可以是多個語句,當(dāng)是多個語句的時候,也不需要用花括號括起來。(6)多個case的后面可以共用一組執(zhí)行語句,如:Switch(n);{Case1:Case2:x=10;braet
┆}它表示當(dāng)n=1或n=2時,都執(zhí)行下列兩個語句:X=10;Braek;例4.5從鍵盤輸入一個月份(1~12),并顯示該月份的英文名稱#include”stdio.h”Main(){intmonth;scanf(“%d”,&month);switch(month){case1:printf(“January”);braek;case2:printf(“February”);braek;case3:printf(“March”);braek;case4:printf(“April”);braek;case5:printf(“May”);braek;case6:printf(“June”);braek;case7:printf(“July”);braek;case8:printf(“August”);braek;case9:printf(“September”);braek;case10:printf(“October”);braek;case11:printf(“November”);braek;case12:printf(“Decmeber”);braek;Default:printf(“DataError!”);Break;}}4.4應(yīng)用舉例例4.6輸入一個數(shù)值,求出它的平方根,若為負(fù)數(shù)時,求出它的復(fù)數(shù)平方根。#include“stdio.h”#include“math.h”main(){intn;floatroot;printf(“enteranumber:\t”);scanf(“%d”,&n);if(n>=0);{root=sqrt(n);printf(“sqrt(%d)=%f”,n,root);}else{root=sqrt(abs(n));printf(“sqrt(%d)=%fi”,n,root);}}例4.7求兩個數(shù)中最小值。#include“stdio.h”main(){intx,y,min;printf(“entertwointegers:\n”);acanf(“%d,%d,&x,&y);min=x<y?x:y;printf(“Min=%d”,min);}例4.8從鍵盤輸入一個操作符并進(jìn)行相應(yīng)和操作。#include“stdio.h”main(){intx=10,y=5,z;charop;scanf(“%c”,&op);switch(op){case’+’:z=x+y;braek;case’-’:z=x-y;braek;case’*’:z=x*y;braek;case’/’:z=x/y;braek;default:printf(“OperaterError!”);}printf(%d%c%d=%d”,x,op,y,z);}5.2while循環(huán)語句用while語句來實(shí)現(xiàn)“當(dāng)型”循環(huán)結(jié)構(gòu)。格式:while(表達(dá)式)〈語句〉/*循環(huán)體部分*/功能:當(dāng)表達(dá)式的值為非0時,執(zhí)行while語句中的循環(huán)體。結(jié)構(gòu)流程圖如圖所示。表達(dá)式語句0非0說明:(1)循環(huán)體如果包含一個以上語句,應(yīng)該用花括弧括起來,以復(fù)合語句的形式出現(xiàn),否則while語句范圍只到while后面第一個分號處。(2)在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句,即設(shè)置修改循環(huán)條件的語句。(3)while語句的特點(diǎn)是先判斷表達(dá)式的值,然后執(zhí)行循環(huán)體中的語句,如果表達(dá)式的值一開始為假(值為0),退出循環(huán),并轉(zhuǎn)入下一語句去執(zhí)行。例5.2求s=1+2+3+…100的值。結(jié)構(gòu)流程圖如右圖。main(){inti,s=0;i=1;While(i<=100);{s=s+1;i++;}printf(“s=%d”,s);}運(yùn)行結(jié)果s=5050i=1s=s+1i=i+1i≤100真假5.3do-while循環(huán)語句do-while循環(huán)語句,用來實(shí)現(xiàn)“直到型”循環(huán)結(jié)構(gòu)。格式:do<語句>while(表達(dá)式)
功能:先執(zhí)行〈語句〉,后判斷表達(dá)式的值。它的執(zhí)行過程是:先執(zhí)行一次指定的語句,然后判斷表達(dá)式的值,當(dāng)表達(dá)式的值為非零(”真“)時,返回重新執(zhí)行該語句,如此反復(fù),直到表達(dá)式的值等于0為此止,此時循環(huán)結(jié)束。0(假)語句表達(dá)式非0(真)說明:(1)用while語句和用do-while語句處理同一問題時,若二者的循環(huán)體部分一樣,其結(jié)果也一樣。但在while后面的表達(dá)式一開始就為假(0值)時,兩種循環(huán)的結(jié)果是不同的。(2)如果do-while語句的循環(huán)體部分是多個語句組成的話,則必須用左右花括號括起來,使其形成復(fù)合語句。main(){inti,s=0;scanf(“%d”,&i);do{s=s+i;i++;}while(i<=10);Printf(“s=%d”,s);}運(yùn)行情況如下:1S=55Main(){intI,s=0;Scanf(“%d”,&i);While(i<=10);{s=s+I;i++;}Printf(“s=%d”,s);}運(yùn)行情況如下:1S=55例5.3while和do-while循環(huán)的比較課堂練習(xí)5.1main(){inti=1,s=1;while(i<=25){s=s+2*I;i++;}printf(“%d\n”,s);}5.4for循環(huán)語句格式:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)〈語句〉執(zhí)行過程:(1)先計(jì)算表達(dá)式1的值;(2)然后計(jì)算表達(dá)式2的值,若結(jié)果為真(非0),則執(zhí)行后面的循環(huán)體各語句,若假,則結(jié)束循環(huán)。(3)進(jìn)行表達(dá)式3的計(jì)算,至此完成一次循環(huán)。(4)再次計(jì)算表達(dá)式2的值,開始再次循環(huán),直到計(jì)算表達(dá)式2的值為0,中止循環(huán)。循環(huán)變量賦初值循環(huán)條件循環(huán)變量增量循環(huán)體部分求解表達(dá)式1求解表達(dá)式3for語句的下一語句語句表達(dá)式2假真說明:(1)for語句中條件測試總是在循環(huán)開始時進(jìn)行;如果循環(huán)體部分是多個語句組成的,則必須用左、右花括號括起來,使其成為一個復(fù)合語句。(2)for語句中的表達(dá)式1和表達(dá)式3即可以是一個簡單的表達(dá)式,也可以是逗號連接的多個表達(dá)式,此時的逗號作為運(yùn)算符使用。如:for(s=0,i=1;i<=100;i++)s=s+i;或:for(i=1,j=100;i<=j;i++,j--)k=i+j;
在逗號表達(dá)式內(nèi)按自左至右順序求解,整個逗號表達(dá)式的值為其中最右邊的表達(dá)式的值。如:for(i=1;i<=100;i++,i++)s=s+i;相當(dāng)于:for(i=1;i<=100;i=i+2)s=s+i;(3)for語句的一般形式中的“表達(dá)式1”可以省略,此時應(yīng)在for語句之前給循環(huán)變量同賦初值。注意省略表達(dá)式1時,其后的分號不能省略。如:for(;i<=100;i++)s=s+i;執(zhí)行時,跳過“解表達(dá)式1”這一步,其它不變。(4)如果表達(dá)式2省略,即不判斷循環(huán)條件,循環(huán)無終止地進(jìn)行下去。也就是認(rèn)為表達(dá)式2始終為真。例如:for(i=1;;i++)s=s+i;相當(dāng)于:i=1;while(1){s=s+I;i++;}(5)表達(dá)式3也可以省略,但此時程序設(shè)計(jì)應(yīng)另外設(shè)法保證循環(huán)能正常結(jié)束。如:for(i=1;i<=100;){s=s+I;i++;}(6)可以省略表達(dá)式1和表達(dá)式3,只有表達(dá)式2,即只給循環(huán)條件。例:for(;i<=100;){s=s+i;i++;}相當(dāng)于:while(i<=100){s=s+i;i++;}(7)3個表達(dá)式都可以省略,如:for(;;)語句相當(dāng)于:while(1)語句即不設(shè)初值,不判斷條件(認(rèn)為表達(dá)式2為真值),循環(huán)變量不增值,無終止地執(zhí)行循環(huán)體。(8)表達(dá)式1可以是設(shè)置循環(huán)變量初值的賦值表達(dá)式,也可以是與循環(huán)變量無關(guān)的其它表達(dá)式。如:for(s=0;i<=100;i++)s=s+i;表達(dá)式3也可以是與循環(huán)控制無關(guān)的任意表達(dá)式。(9)表達(dá)式2一般是關(guān)系表達(dá)式(如i<=100)或邏輯表達(dá)式(如a<b&&x<y),但也可以是數(shù)值表達(dá)式或字符表達(dá)式,只在其值為非0,就執(zhí)行循環(huán)體。分析下面的例子:for(i=0;(c=getchar())!=‘\n’;i+=c);for(;(c=getchar()!=‘\n’;)printf(“%c”,c);例5.4用for語句,求s=1+2+3+…+100的值。main(){inti,s=0;for(i=1;i<=100;i=i+1)s=s+i;printf(“s=%d”,s);}運(yùn)行結(jié)果S=50505.5循環(huán)的嵌套一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu),稱為循環(huán)的嵌套。三種循環(huán):while循環(huán)、do-while循環(huán)和for循環(huán)可以互相嵌套。如下面的幾種形式都是合法的。(1)while(){…while(){…}}(2)do{…do{…}while();
}while();(3)for(;;){…for(;;){…}}(5)for(;;){…while(){…}}(4)while(){…do{…}while();…}(6)do{…for(;;){}…} while();5.6幾種循環(huán)的比較(1)4種循環(huán)可以用來處理同一問題,一般性況下它們可以互相代替。(2)while和do-while循環(huán),只在while后面指定循環(huán)條件,在循環(huán)體中包含反復(fù)執(zhí)行的操作語句,包括使循環(huán)趨于結(jié)束的語句。(3)用while和do-while循環(huán)時,循環(huán)變量初始化的操作應(yīng)在while和do-while語句之前完成。為了語句可以在表達(dá)式1中實(shí)現(xiàn)循環(huán)的初始化。(4)while和for循環(huán)是先判斷表達(dá)式的值,后執(zhí)行循環(huán)體各語句;而do-while循環(huán)是先執(zhí)行循環(huán)體各語句,后判斷表達(dá)式的值。(5)對while循環(huán)、do-while循環(huán)和for循環(huán),可以用break語句跳出循環(huán),用continue語句結(jié)束本次循環(huán),而對用if語句構(gòu)成的循環(huán),不能用braek語句和繼續(xù)語句進(jìn)行控制。5.7break語句和continue語句5.7.1break語句格式:break;功能:該語句可以使程序運(yùn)行時中途退出一個循環(huán)體。說明:在幾種循環(huán)中,主要是在循環(huán)次數(shù)不能預(yù)先確定的情況下使用break語句,在循環(huán)體中增加一個分支結(jié)構(gòu)。當(dāng)某個條件成立時,由break語句退出循環(huán)體,從而結(jié)束循環(huán)過程。
例5.6求圓的面積#definePI3.1415926main(){intr;floats;for(r=1;r<10;r++);{s=PI*r*r;if(s>100)break;}printf(“s=%f,s);}}說明:(1)braek語句不能用于循環(huán)語句和開關(guān)語句之外的任何其它語句。(2)在多重循環(huán)的情況下,使用break語句時,僅僅退出包含break語句的那層循環(huán)體,即break語句不能使程序控制退出一層以上的循環(huán)。5.7.2continue語句格式:continue;功能:結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,繼續(xù)進(jìn)行下一次循環(huán)。說明:continue語句只結(jié)束本次循環(huán),而不是終止整個循環(huán)的執(zhí)行。而break語句則是結(jié)束循環(huán),不再進(jìn)行判斷。如下圖所示:表達(dá)式1表達(dá)式2語句語句While循環(huán)的下一個語句假假真真break表達(dá)式1表達(dá)式2語句語句While循環(huán)的下一個語句假假真真continue例5.7輸出100~200中不能被7整除的數(shù)。main(){intn;for(n=100;n<=200;n++){if(n%7==0)continue;printf(“%d”,n);}5.8應(yīng)用舉例例5.8輸出1~20中能被3整除的數(shù),并求出它們的和。main(){intn,s=0;for(n=1;n<=20;n++)if(n%3==0){s=s+n;printf(“%d,”,n);}printf(“\ns=%d”,s);}運(yùn)行結(jié)果:3,6,9,12,15,18S=63例5.9用公式π/4=1-1/3+1/5-1/7+…求π的近似值,直到最后一項(xiàng)的絕對值小于10-6為止。#include”mach.h”main(){ints;floatn,t,pi;t=1;p=0;n=1.0;s=1;while((fabs(t))>=1e-6){pi=pi+t;n=n+2;s=-s;t=s/n;}pi=pi*4;printf(“pi=%10.6f\n”,pi);}運(yùn)行結(jié)果pi=3.141397例5.10求Fibonacci數(shù)列:1,1,2,3,5,8,…前20個數(shù)。f1=1(n=1)f2=1(n=2)fn=fn-1+fn-2(n>=3)程序如下:main(){longintf1,f2;inti;f1=1;f2=1;for(i=1;i<=10;i++){printf(“%8ld%8ld“,f1,f2);if(i%2==0)printf(“\n”);f1=f1+f2;f2=f2+f1;}}運(yùn)行結(jié)果11235813213455891442333776109871597258441816765數(shù)組:是有序并具有相同性質(zhì)的數(shù)據(jù)的集合,它是某種類型的數(shù)據(jù),按照一定的順序組成的。數(shù)組屬于構(gòu)造類型。當(dāng)處理大量的、同類型的數(shù)據(jù)時,利用
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 限位片課程設(shè)計(jì)
- 閥塊課程設(shè)計(jì)
- 齒輪嚙合課程設(shè)計(jì)
- 心理教育課程設(shè)計(jì)研究-洞察分析
- 透視表系列課程設(shè)計(jì)
- 自動擋掛擋教學(xué)課程設(shè)計(jì)
- 課程設(shè)計(jì)像識別
- 足球運(yùn)球繞桿課程設(shè)計(jì)
- GB/T 45151-2024城市配送網(wǎng)絡(luò)體系建設(shè)指南
- GB/T 29301-2024靜電復(fù)印(包括多功能)設(shè)備用鼓粉盒
- 期末 (試題) -2024-2025學(xué)年人教PEP版(2024)英語三年級上冊
- DB34∕T 4010-2021 水利工程外觀質(zhì)量評定規(guī)程
- 納米復(fù)合材料的增韌增能機(jī)制
- 圖書館前臺接待工作總結(jié)
- 衛(wèi)生院藥品管理制度
- 神經(jīng)外科進(jìn)修匯報課件
- 2024老年人靜脈血栓栓塞癥防治中國專家共識(完整版)
- 騰訊營銷師認(rèn)證考試題庫(附答案)
- 鄰近鐵路營業(yè)線施工安全監(jiān)測技術(shù)規(guī)程 (TB 10314-2021)
- 四年級上冊脫式計(jì)算100題及答案
- 資本市場與財務(wù)管理
評論
0/150
提交評論