![c語言入門費下載_第1頁](http://file4.renrendoc.com/view/08201e5a066ffaad6b1e69c1d6248c9f/08201e5a066ffaad6b1e69c1d6248c9f1.gif)
![c語言入門費下載_第2頁](http://file4.renrendoc.com/view/08201e5a066ffaad6b1e69c1d6248c9f/08201e5a066ffaad6b1e69c1d6248c9f2.gif)
![c語言入門費下載_第3頁](http://file4.renrendoc.com/view/08201e5a066ffaad6b1e69c1d6248c9f/08201e5a066ffaad6b1e69c1d6248c9f3.gif)
![c語言入門費下載_第4頁](http://file4.renrendoc.com/view/08201e5a066ffaad6b1e69c1d6248c9f/08201e5a066ffaad6b1e69c1d6248c9f4.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
編譯環(huán)境設(shè)置好以后,就可以正式學(xué)習(xí)c語言了。ー、變量(一)、變量類型和表示方法1.什么是變量?一句話,變量是存儲數(shù)據(jù)的值的空間。由于數(shù)值的類型有多種,有整數(shù)、小數(shù)(浮點數(shù))、字符等等,那么對應(yīng)的變量就有整型變量、浮點型變量、字符型變量。變量還有其他的具體分類。整型變量還可具體分為無符號型、長整型和短整型。浮點型也可分為單精度型、雙精度型和長雙精度型。此外還可以分為靜態(tài)變量、外部變量、寄存器變量和自動存儲變量。這些數(shù)據(jù)類型我們在本節(jié)和后面的章節(jié)中都會陸陸續(xù)續(xù)介紹。那么變量我們總要給它取個名字吧,這個名字我們叫做標(biāo)識符。標(biāo)識符的命名有一定的規(guī)則:.標(biāo)識符只能由字母、數(shù)字和下劃線三類字符組成.第一個字符必須是字母(第一個字符也可以是下劃線,但被視作系統(tǒng)自定義的標(biāo)識符).大寫字母和小寫字母被認為是兩個不同的字符,如A和a是兩個不同的標(biāo)識符.標(biāo)識符可以任意長,但只有前32位有效。有些舊的C版本對外部標(biāo)識符的限制為6位。這是由于鏈接程序的限制所總成的,而不是C語言本身的局限性.標(biāo)識符不能是C的關(guān)鍵字.從上面的規(guī)則中,有個關(guān)鍵字的概念。那么什么叫關(guān)鍵字呢?從表面字意上也可以看出,關(guān)鍵字是C語言本身某些特性的ー個表示,是唯一的代表某ー個意思的。下面列出ANSI標(biāo)準(zhǔn)定義的32個C語言的關(guān)鍵字,這些關(guān)鍵字在以后的學(xué)習(xí)中基本上都會用到,到時再說它們的各自用法。autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhileC語言還包括一些不能用做標(biāo)識符的擴展關(guān)鍵字。asmcdecl_cs_ds_esfarhugeinterruptnearpascal_ss所以在以后的學(xué)習(xí)中,在給變量命名時要避開這些關(guān)鍵字。.TurboC2.0規(guī)定所有變量在使用前都必須加以說明。一條變量說明語句由數(shù)據(jù)類型和其后的ー個或多個變量名組成。變量說明的形式如下:類型〈變量表》;這里類型是指TurboC2.0的有效數(shù)據(jù)類型。變量表是ー個或多個標(biāo)識符名,每個標(biāo)識符之間用,分隔。(二)、整型變量整型變量是用來存儲整數(shù)的。整型變量又可具體分為好幾種,最基本的整型變量是用類型說明符int聲明的符號整型,形式如下:intCounter;這里int是類型說明符,Counter是變量的名字。整型變量可以是有符號型、無符號型、長型、短型或象上面定義的普通符號整型。整型是16位的,長整型是32位,短整型等價于整型。以下是幾種整型變量的聲明示例:longintAmount;/*長整型*/longAmount;/?長整型,等價于上面?/signedintTotal;/?有符號整型?/signedTotal;/*有符號整型,等價于上面*/unsignedintOffset;/?無符號整型?/unsignedOffset;/*無符號整型,等價于上面?/shortintSmallAmt;/?短整型?/shortSmallAmt;/?短整型,等價于上面*/unsignedshortintMonth;/?無符號短整型?/unsignedshortMonth;/*無符號短整型,等價于上面*/從上面的示例可以看出,當(dāng)定義長整型、短整型、符號整型或無符號整型時,可以省略關(guān)鍵字int。注明:.用signed對整型變量進行有符號指定是多余的,因為除非用unsigned指定為無符號型,否則整型都是有符號的。.當(dāng)一個變量有兒重特性時,聲明關(guān)鍵字的順序可以任意。以下兒種聲明是等價的:unsignedlongTl;longunsignedT2;unsignedlongintT3;unsignedintlongT4;longunsignedintT5;longintunsignedT6;intunsignedlongT7;intlongunsignedT8;(三)、浮點類型變量顧名思義,浮點類型變量是用來存儲帶有小數(shù)的實數(shù)的。C語言中有三種不同的浮點類型,以下是對這三種不同類型的聲明示例:floatAmount;/?單精度型?/doubleBigAmount;/?雙精度型?/longdoubleReallyBigAmount;/?長雙精度型?/這里Amount,BigAmount,ReallyBigAmount都是變量名。浮點型都是有符號的。(四)、字符型變量字符型變量中所存放的字符是計算機字符集中的字符。對于PC機上運行的C系統(tǒng),字符型數(shù)據(jù)用8位單字節(jié)的ASCI!碼表示。程序用類型說明符char來聲明字符型變量:charch;這條聲明語句聲明了一個字符型變量,標(biāo)識符為cho當(dāng)以這種形式聲明變量之后,程序可以在表達式中引用這個變量,關(guān)于語句和表達式的知識在后面將會介紹。字符數(shù)據(jù)類型事實上是8位的整型數(shù)據(jù)類型,可以用于數(shù)值表達式中,與其他的整型數(shù)據(jù)同樣使用。在這種情況下,字符型變量可以是有符號的,也可以是無符號的。對于無符號的字符型變量可以聲明為:unsignedcharch;除非聲明為無符號型,否則在算術(shù)運算和比較運算中,字符型變量一般作為8位有符號整型變量處理。還有其他的如指針型變量,void型變量,以后再介紹。二、常量常量的意思就是不可改變的量,是ー個常數(shù)。同變量一樣,常量也分為整型常量、浮點型常量、字符型常量,還有字符串常量、轉(zhuǎn)義字符常量和地址常量。(一)、整型常量整型常量可以是長整型、短整型、有符號型、無符號型。在TubboC2.0里有符號整型常量的范圍從ー32768到32767,無符號整型的為0到65535;有符號長整型的范圍為ー2147483648到2147483647。無符號長整型的范圍為。到4294967295。短整型同字符型??梢灾付ㄒ粋€整型常量為二進制、ハ進制或十六進制,如以下語句:-129,Oxl2fe,O177常量的前面有符號Ox,這個符號表示該常量是十六進制表示。如果前面的符號只有一個字母。,那么表示該常量是八進制。有時我們在常量的后面加上符號L或者U,來表示該常量是長整型或者無符號整型:22388L,0x4efb2L,40000U后綴可以是大寫,也可以是小寫。(二)、浮點型常量ー個浮點型常量由整數(shù)和小數(shù)兩部分構(gòu)成,中間用十進制的小數(shù)點隔開。有些浮點樹非常大或者非常小,用普通方法不容易表示,可以用科學(xué)計數(shù)法或者指數(shù)方法表示。下面是ー個實例:3.1416,1.234E-30,2.47E201注意在C語言中,數(shù)的大小也有一定的限制。對于float型浮點數(shù),數(shù)的表示范圍為ー3.402823E38到3.402823E38,其中ー1.401298E-45到1.401298E-45不可見。double型浮點型常數(shù)的表示范圍為ー1.79E308至リ1.79E308,其中一4.94E-324至リ4.94E-324不可見。在浮點型常量里我們也可以加上后綴。FloatNumber=l.6E10F;/?有符號浮點型?/LongDoubleNumber=3.45L;/?長雙精度型?/后綴可大寫也可小寫。說明:.浮點常數(shù)只有一種進制(十進制)。.所有浮點常數(shù)都被默認為double〇.絕對值小于1的浮點數(shù),其小數(shù)點前面的零可以省略。如:0.22可寫為.22,-0.0015E-3可寫為ー.0015E-3。.TurboC默認格式輸出浮點數(shù)時,最多只保留小數(shù)點后六位(三)、字符型常量字符型常量所表示的值是字符型變量所能包含的值。我們可以用ASCII表達式來表示一個字符型常量,或者用單引號內(nèi)加反斜杠表示轉(zhuǎn)義字符。'A','\x2f,AOB';其中:\x表示后面的字符是十六進制數(shù),'0表示后面的字符是八進制數(shù)。注意:在TurboC2.0中,字符型常量表示數(shù)的范圍是ー128到127,除非你把它聲明為unsigned,這樣就是0到255〇(四)、字符串常量字符串常量就是ー串字符用雙引號括起來表示。Hello,World!\nEnterselection:\aError!!!(五)、轉(zhuǎn)義字符上面我們見到的'x,\n,\a等等都是叫轉(zhuǎn)義字符,它告訴編譯器需要用特殊的方式進行處理。下面給出所有的轉(zhuǎn)義字符和所對應(yīng)的意義:轉(zhuǎn)義字符描述V單引號\雙引號\\反斜杠\0空字符\Onnnハ進制數(shù)\a聲音符\b退格符\f換頁符\n換行符\r回車符\t水平制表符\v垂直制表符\x十六進制符它們的具體用法我們到講輸出語句時再介紹。(六)、地址常量我們前面說的變量是存儲數(shù)據(jù)的空間,它們在內(nèi)存里都有對應(yīng)的地址。在C語言里可以用地址常量來引用這些地址,如下:&Counter,∑&是取地址符,作用是取出變量(或者函數(shù))的地址。在后面的輸入語句和指針里還會說明。這ー節(jié)所講到的變量和常量知識可以說是在一切程序中都要用到,特別是變量的聲明和命名規(guī)則。無論是加減乘除還是大于小于,都需要用到運算符,在C語言中的運算符和我們平時用的基本上都差不多。運算符包括賦值運算符、算術(shù)運算符、邏輯運算符、位邏輯運算符、位移運算符、關(guān)系運算符、自增自減運算符。大多數(shù)運算符都是二目運算符,即運算符位于兩個表達式之間。單目運算符的意思是運算符作用于單個表達式。(具體什么是表達式下一節(jié)再說)ー、賦值運算符賦值語句的作用是把某個常量或變量或表達式的值賦值給另ー個變量。符號為』,這里并不是等于的意思,只是賦值,等于用工ヨ表示。注意:賦值語句左邊的變量在程序的其他地方必須要聲明。得已賦值的變量我們稱為左值,因為它們出現(xiàn)在賦值語句的左邊;產(chǎn)生值的表達式我們稱為右值,因為她它們出現(xiàn)在賦值語句的右邊。常數(shù)只能作為右值。例如:count=5;total1=tota12=0;第一個賦值語句大家都能理解。第二個賦值語句的意思是把。同時賦值給兩個變量。這是因為賦值語句是從右向左運算的,也就是說從右端開始計算。這樣它先total2=0;然后total1=total2;那么我們這樣行不行呢?(totall=tota12)=0;這樣是不可以的,因為先要算括號里面的,這時totall=total2是ー個表達式,而賦值語句的左邊是不允許表達式存在的。二、算術(shù)運算符在C語言中有兩個單目和五個雙目運算符。符號功能+單目正-單目負?乘法/除法%取模+加法?減法下面是ー些賦值語句的例子,在賦值運算符右側(cè)的表達式中就使用了上面的算術(shù)運算符:Area=Height*Width;num=num1+num2/num3-num4;運算符也有個運算順序問題,先算乘除再算加減。單目正和單目負最先運算。取模運算符(%)用于計算兩個整數(shù)相除所得的余數(shù)。例如:a=7%4;最終a的結(jié)果是3,因為フ%4的余數(shù)是3。那么有人要問了,我要想求它們的商怎么辦呢?b=7/4;這樣b就是它們的商了,應(yīng)該是1。也許有人就不明白了,7/4應(yīng)該是1.75,怎么會是1呢?這里需要說明的是,當(dāng)兩個整數(shù)相除時,所得到的結(jié)果仍然是整數(shù),沒有小數(shù)部分。要想也得到小數(shù)部分,可以這樣寫7.0/4或者7/4.0,也即把其中ー個數(shù)變?yōu)榉钦麛?shù)。那么怎樣由一個實數(shù)得到它的整數(shù)部分呢?這就需要用強制類型轉(zhuǎn)換了。例如:a=(int)(7.0/4);因為7.0/4的值為L75,如果在前面加上(int)就表示把結(jié)果強制轉(zhuǎn)換成整型,這就得到了!o那么思考一下a=(float)(7/4);最終a的結(jié)果是多少?單目減運算符相當(dāng)于取相反值,若是正值就變?yōu)樨撝?若是負數(shù)就變?yōu)檎?。單目加運算符沒有意義,純粹是和單目減構(gòu)成一對用的。三、邏輯運算符邏輯運算符是根據(jù)表達式的值來返回真值或是假值。其實在C語言中沒有所謂的真值和假值,只是認為非。為真值,。為假值。符號功能&&邏輯與I!邏輯或!邏輯非例如:5!3;0II-2&&5;:4;當(dāng)表達式進行&&運算時,只要有一個為假,總的表達式就為假,只有當(dāng)所有都為真時,總的式子才為真。當(dāng)表達式進行II運算時,只要有一個為真,總的值就為真,只有當(dāng)所有的都為假時,總的式子オ為假。邏輯非。)運算是把相應(yīng)的變量數(shù)據(jù)轉(zhuǎn)換為相應(yīng)的真/假值。若原先為假,則邏輯非以后為真,若原先為真,則邏輯非以后為假。還有一點很重要,當(dāng)ー個邏輯表達式的后一部分的取值不會影響整個表達式的值時,后一部分就不會進行運算了。例如:a=2,b=1;allb-1;因為a=2,為真值,所以不管b-l是不是真值,總的表達式一定為真值,這時后面的表達式就不會再計算了。四、關(guān)系運算符關(guān)系運算符是對兩個表達式進行比較,返回一個真/假值。符號功能大于小于=大于等于=小于等于==等于!=不等于這些運算符大家都能明白,主要問題就是等于==和賦值=的區(qū)別了。ー些剛開始學(xué)習(xí)C語言的人總是對這兩個運算符弄不明白,經(jīng)常在ー些簡單問題上出錯,自己檢查時還找不出來??聪旅娴拇a:if(Amount=123) 很多新人都理解為如果Amount等于123,就怎么樣。其實這行代碼的意思是先賦值A(chǔ)mount=123,然后判斷這個表達式是不是真值,因為結(jié)果為!23,是真值,那么就做后面的。如果想讓當(dāng)Amount等于123才運行時,應(yīng)該if(Amount==123) 五、自增自減運算符這是ー類特殊的運算符,自增運算符++和自減運算符ー對變量的操作結(jié)果是增加1和減少1〇例如:—Couter;Couter—;++Amount;Amount++;看這些例子里,運算符在前面還是在后面對本身的影響都是ー樣的,都是加1或者減1,但是當(dāng)把他們作為其他表達式的一部分,兩者就有區(qū)別了。運算符放在變量前面,那么在運算之前,變量先完成自增或自減運算;如果運算符放在后面,那么自增自減運算是在變量參加表達式的運算后再運算。這樣講可能不太清楚,看下面的例子:num1=4;num2=8;a=++num1;b=num2++;a=++numl;這總的來看是一個賦值,把++numl的值賦給a,因為自增運算符在變量的前面,所以numl先自增加1變?yōu)?,然后賦值給a,最終a也為5。b=num2++;這是把num2++的值賦給b,因為自增運算符在變量的后面,所以先把num2賦值給b,b應(yīng)該為8,然后num2自增加1變?yōu)?。那么如果出現(xiàn)這樣的情況我們怎么處理呢?c=num1+++num2;到底是c=(numl++)+num2;還是c=numl+(++num2);這要根據(jù)編譯器來決定,不同的編譯器可能有不同的結(jié)果。所以我們在以后的編程當(dāng)中,應(yīng)該盡量避免出現(xiàn)上面復(fù)雜的情況。六、復(fù)合賦值運算符在賦值運算符當(dāng)中,還有一類C/C++獨有的復(fù)合賦值運算符。它們實際上是ー種縮寫形式,使得對變量的改變更為簡潔。Total=Total+3;乍ー看這行代碼,似乎有問題,這是不可能成立的。其實還是老樣子,士是賦值不是等于。它的意思是本身的值加3,然后在賦值給本身。為了簡化,上面的代碼也可以寫成:Total+=3;復(fù)合賦值運算符有下列這些:符號功能+=加法賦值-=減法賦值*=乘法賦值/=除法賦值%=模運算賦值?=左移賦值?=右移賦值&=位邏輯與賦值1=位邏輯或賦值ハ=位邏輯異或賦值上面的十個復(fù)合賦值運算符中,后面五個我們到以后位運算時再說明。那么看了上面的復(fù)合賦值運算符,有人就會問,到底Total=Total+3;與Total+=3;有沒有區(qū)別?答案是有的,對于A=A+1,表達式A被計算了兩次,對于復(fù)合運算符A+=l,表達式A僅計算了一次。一般的來說,這種區(qū)別對于程序的運行沒有多大影響,但是當(dāng)表達式作為函數(shù)的返回值時,函數(shù)就被調(diào)用了兩次(以后再說明),而且如果使用普通的賦值運算符,也會加大程序的開銷,使效率降低。七、條件運算符條件運算符(?:)是C語言中唯一的ー個三目運算符,它是對第一個表達式作真/假檢測,然后根據(jù)結(jié)果返回兩外兩個表達式中的ー個?!幢磉_式1〉?〈表達式2〉:く表達式3>在運算中,首先對第一個表達式進行檢驗,如果為真,則返回表達式2的值:如果為假,則返回表達式3的值。例如:a=(b>O)?b:-b;當(dāng)b>0時,a=b;當(dāng)b不大于0時,a=-b;這就是條件表達式。其實上面的意思就是把b的絕對值賦值給a。ハ、逗號運算符在C語言中,多個表達式可以用逗號分開,其中用逗號分開的表達式的值分別結(jié)算,但整個表達式的值是最后一個表達式的值。假設(shè)b=2,c=7,d=5,al=(++b,c-,d+3);a2=++b,c—,d+3;對于第一行代碼,有三個表達式,用逗號分開,所以最終的值應(yīng)該是最后一個表達式的值,也就是d+3,為8,所以a=8。對于第二行代碼,那么也是有三個表達式,這時的三個表達式為22=++限レイ+3,(這是因為賦值運算符比逗號運算符優(yōu)先級高)所以最終表達式的值雖然也為8,但a2=3。還有其他的如位邏輯運算符,位移運算符等等,我們等到講位運算時再說明。九、優(yōu)先級和結(jié)合性從上面的逗號運算符那個例子可以看出,這些運算符計算時都有一定的順序,就好象先要算乘除后算加減ー樣。優(yōu)先級和結(jié)合性是運算符兩個重要的特性,結(jié)合性又稱為計算順序,它決定組成表達式的各個部分是否參與計算以及什么時候計算。下面是C語言中所使用的運算符的優(yōu)先級和結(jié)合性:優(yōu)先級運算符結(jié)合性(最髙)()□->.自左向右!?++--+-*&sizeof自右向左*/%自左向右+?自左向右??自左向右<<=>>=自左向右==!=自左向右&自左向右A自左向右|自左向右&&自左向右I!自左向右?:自右向左=+=-=*=/=%=&=A=1=?=?=自右向左(最低),自左向右在該表中,還有一些運算符我們沒有介紹,如指針運算符、sizeof運算符、數(shù)組運算符]]等等,這些在以后的學(xué)習(xí)中會陸續(xù)說明的。前面幾節(jié)介紹了常量和變量、運算符、表達式和語句的概念,對它們的使用有了一個大概的了解。也許剛學(xué)程序的人會覺得有些枯燥,下面我們就來編寫第一個C語言程序。#definePI3.1416main()(floatRadius,Area;scanf(%f,&Radius);/*輸入半徑的值?/Area=PI*Radius*Radius;printf(%f\n,Area);/?輸出圓的面積?/).一個C語言程序,通常由帶有#號的編譯預(yù)處理語句開始。關(guān)于預(yù)處理我們在以后介紹,這里的#definePI3.1415926相當(dāng)于PI代表3.1416,下面在程序中遇到PL我們就用3.1416替代一下。在以后的程序中,在學(xué)習(xí)預(yù)處理之前,我們都將不使用預(yù)處理語句。.main()任何ー個完整的程序都需要main(),這是ー個函數(shù),具體什么是函數(shù),以后再講,這兒你就要記住就行。后面有一對{}把所有的語句都括在里面,表明那些語句都屬于main()里面。程序運行時從這個左大括號開始。.け里面的4行語句大家應(yīng)該都能明白,先定義兩個變量,ー個代表半徑,ー個代表面積,然后輸入半徑的值,然后求面積,最后在屏幕上輸出面積。程序到main。的那對{}的右大括號結(jié)束。求面積的語句Area=PI*Radius*Radius;相當(dāng)于Area=3.1416*Radius*Radius;(完全用3.1416替代PI)。具體程序從編寫到運行得到結(jié)果的步驟為:.雙擊tc.exe,進入TurboC2.0編譯界面.ALT+E進入編輯模式.書寫程序.F2存儲程序(也可進入File菜單,選擇save),第一次存儲需要寫上程序名稱(*.C),回車.ALT+F9編譯,如果有錯誤和警告,光標(biāo)停留在錯誤行,回車進行修改,修改后,回到4;沒有錯,下ー步.CTRL+F9連接和運行程序.用ALT+F5查看程序運行結(jié)果,任意鍵返回程序如何打開ー個已有的C文件:.雙擊tc.exe,進入TurboC2.0編譯界面.F3進入!oad狀態(tài),找到所要打開文件的目錄,找到文件,回車;后面都一樣。具體的有哪些快捷鍵及其它們的作用,請查看第一節(jié)概述。說明:.必須在程序的最開始部分定義所有用到的變量,例如這里的Area,Radius〇.變量的命名要盡量有意義,如用代表該意思的英文單詞、或者是漢語拼音,例如這里的Radius,Area,絕對禁止用毫無干系的字母,如a,b,c。例如下面的程序,雖然意思和上面的ー樣,但是看上去意思不明朗,時間長了,很可能忘記程序本身的意思。對于僅僅是控制程序運行,不代表實際意思時,可以用一些簡單字母。main()(floata,b;scanf(%f,&a);b=3.1416*a*a;printf(%f\n,b);).采用層次書寫程序的格式,要有合理的縮進,必要的時候要有空行,一行只書寫ー個語句。所有語句盡量不分行,除非太長(分行時變量、運算符,格式字符等等不能拆開),例如下面兩個程序看起來就不好看了,雖然它們的功能和前面是ー樣的。main(){floatRadius,Area;scanf(%f,&Radius);Area=3.1416*Radius*Radius;printf(%f\n,Area);}main()(floatRadius,Area;scanf(%f,%Radius);Area=3.1416*Radius*Radius;printf(%f\n,Area);).程序在適當(dāng)?shù)牡胤揭氓?……ッ注釋,它的意思表示在/**/里面的所有字符都不參加編譯。因為ー個較大的程序,經(jīng)過一段時間,有些地方可能連編程者都忘記了,增加注釋可以幫助恢復(fù)記憶,調(diào)試程序時,也容易找出錯誤。注釋也可以分行寫。.在書寫{}時要對齊。雖然不對應(yīng)也不影響程序運行,但對齊后方便以后檢查程序,也是為了美觀,特別是后面學(xué)到流程控制時,{}一定要對齊。程序設(shè)計方法:.從問題的全局出發(fā),寫出ー個概括性的抽象的描述。.定義變量,選取函數(shù),確定算法。算法這個東西不好說,遇到的問題多了,自然就會形成自己一整套的算法。.按照解決問題的順序把語句和函數(shù)在main()里面堆砌起來。ー個好的C程序員應(yīng)該做到:.在運行程序之前存盤.所有在程序中用到的常量都用預(yù)處理語句在程序開頭定義.所有在程序中用到的函數(shù)都在程序開頭聲明.頭文件的#ifndef.變量名和函數(shù)名使用有意思的英文單詞或漢語拼音.盡量少用全局變量或不用全局變量.采用層次的書寫程序格式,對for,while,if_else,do_while,switch_case等控制語句或他們的多重嵌套,采用縮格結(jié)構(gòu).所有對應(yīng)的{}都對齊.盡量用for,而不用while做記數(shù)循環(huán).盡量不用goto語句.一個函數(shù)不宜處理太多的功能,保持函數(shù)的小型化,功能單ー化.ー個函數(shù)要保持自己的獨立性,如同黑匣子ー樣,單進單出.函數(shù)的返回類型不要省略14用malloc()分配內(nèi)存空間時,以后一定要用free。釋放.打開文件后,記住在退出程序前要關(guān)閉.出錯情況的處理.寫上必要的注釋這里說的是一些基本的,經(jīng)常遇到的情況,還有其他很多要注意的地方,在實際編程中都會遇到.ー個表達式的返回值都可以用來判斷真假,除非沒有任何返回值的void型和返回?zé)o法判斷真假的結(jié)構(gòu)。當(dāng)表達式的值不等于〇時,它就是“真”,否則就是假。ー樣個表達式可以包含其他表達式和運算符,并且基于整個表達式的運算結(jié)果可以得到ー個真/假的條件值。因此,當(dāng)ー個表達式在程序中被用于檢驗其真/假的值時,就稱為ー個條件。ー、if語句if(表達式)語句1;如果表達式的值為非0,則執(zhí)行語句1,否則跳過語句繼續(xù)執(zhí)行下面的語句。如果語句1有多于一條語句要執(zhí)行時,必須使用{和}把這些語句包括在其中,此時條件語句形式為:if(表達式)語句體1;)例如:if(x>=0)y=x;if(allb&&c)(z=a+b;c+=z;)二、if--else語句除了可以指定在條件為真時執(zhí)行某些語句外,還可以在條件為假時執(zhí)行另外一段代碼。在C語句中利用else語句來達到這個木的。if(表達式)語句1;else語句2;同樣,當(dāng)語句1或語句2是多于ー個語句時,需要用{}把語句括起來。例如:if(x>=0)y=x;elsey=-x;三、if—elseif—else結(jié)構(gòu)。if(表達式1)語句1;elseif(表達式2)語句2;elseif(表達式3)語句3;else語句n;這種結(jié)構(gòu)是從上到下逐個對條件進行判斷,一旦發(fā)現(xiàn)條件滿點足就執(zhí)行與它有關(guān)的語句,并跳過其它剩余階梯;若沒有一個條件滿足,則執(zhí)行最后一個else語句no最后這個else常起著缺省條件的作用。同樣,如果每一個條件中有多于一條語句要執(zhí)行時,必須使用{和}把這些語句包括在其中。條件語句可以嵌套,這種情況經(jīng)常碰到,但條件嵌套語句容易出錯,其原因主要是不知道哪個if對應(yīng)哪個else〇例如:if(x>20llx<-10)if(y<=100&&y>x)printf(Good);elseprintf(Bad);對于上述情況,TurboC2.0規(guī)定:else語句與最近的ー個if語句匹配,上例中的else與if(y<=100&&y>x)相匹配。為了使else與if(x>20llx<-10)相匹配,必須用花括號。如下所示:if(x>20llx<-10)(if(y<=100&&y>x)printf(Good);)elseprintf(Bad);下面舉幾個例子:.輸入一個數(shù),如果大于。,輸出plus;如果是負數(shù),輸出negative;如果正好是。,則輸出zero。main()(floatnum;scanf(%f,&f);if(num>0)printf(plus\n);printf(negative\n);elseprintf(zero\n);)先定義兩個變量,然后輸入一個數(shù),然后判斷這個數(shù)的范圍,輸出對應(yīng)的字符串。.輸入一個數(shù)x,輸出y。其中y是x的絕對值。main()(floatx,y;scanf(%f,&x);if(x>=0)y=x;elsey=-x;printf(%f\n,y);)程序比較簡單,這兒就不分析了。其實TruboC2.0把ー些常用的功能都寫好了,我們只需要使用就可。例如求絕對值的功能在C的庫里面就有??聪旅娴?#includemath.hmain()floatx,y;scanf(%f,&x);y=fabs(x);/*求x的絕對值,然后賦值給y*/printf(%f\n,y);)這個程序和上面的程序完成的功能是ー模ー樣的,都是求絕對值??梢钥闯?用下面這個方法比上面就要好一些。由于fabs()是一個函數(shù),系統(tǒng)自帶的,所以在使用它的時候,我們必須把它所在的庫文件math.h包含都程序中,即程序最前面一行。類似的還有求開方sqrt(),求指數(shù)累exp()等等,這些與數(shù)學(xué)方面有關(guān)的函數(shù)都在math.h里面。具體哪些有哪些沒有,在什么庫里面,可以查看ー些手冊。.輸入x,輸出y,x和y滿足關(guān)系:x<-5y=x;-5<=x<ly=2*x+5;l<=x<4y=x+6;x>=4y=3*x-2;程序如下:main()floatx,y;scanf(%f,&x);if(x<-5)y=x;elseif(-5<=x&&x<l)y=2*x+5;elseif(l<=x&&x<4)y=x+6;elsey=3*x-2;printf(%f\n,y);)這里要說明兩點:.-5<=x&&x<1不能寫成一5<=x<l;l<=x&&x<4也不能寫成l<=x<4;在C語言中,不能認識連續(xù)不等式。.y=2*x+5不能寫成y=2x+5;y=3*x-2也不能寫成y=3x-2;這與我們平時所寫的方法不一樣。4.輸入三個數(shù)x,y,z,然后按從大到小輸出。main()floatx,y,z;scanf(%f%f%f,&x,&y,&z);if(x>=y&&x>=z)(printf(%f\t,x);if(y>=z)printf(%f\t%f\n,y,z);elseprintf(%f\t%f\n,z,y);)elseif(y>=x&&y>=z)(printf(%f\t,y);if(x>=z)printf(%f\t%f\n,x,z);elseprintf(%f\t%f\n,z,x);)else(printf(%f\t,z);if(x>=y)printf(%f\t%f\n,x,y);elseprintf(%f\t%f\n,y,x);說明:這是ー個典型的if語句嵌套結(jié)構(gòu),如果不使用括號,那么if和else的對應(yīng)關(guān)系就亂了。
四、switch—case語句在編寫程序時,經(jīng)常會碰到按不同情況分轉(zhuǎn)的多路問題,這時可用嵌套if-else-if語句來實現(xiàn),但if-else-if語句使用不方便,并且容易出錯。對這種情況,TurboC2.0提供了一個開關(guān)語句。開關(guān)語句格式為:switch(變量)(case常量1:語句1或空;case常量2:語句2或空;case常量case常量n:語句n或空;default:語句n+1或空;執(zhí)行switch開關(guān)語句時,將變量逐個與case后的常量進行比較,若與其中一個相等,則執(zhí)行該常量下的語句,若不與任何ー個常量相等,則執(zhí)行default后面的語句。注意:l.switch中變量可以是數(shù)值,也可以是字符,但必須是整數(shù)。.可以省略ー些case和default〇.每個case或default后的語句可以是語句體,但不需要使用{和}括起來。例如:main()(intx,y;scanf(%d,&x);witch(x)(case1:y=x+1;break;/?退出開關(guān)語句,遇到breakオ退出?/case4:y=2*x+l;break;default:y=x-;break;printf(%d\n,y);)從上面的例子可以看出,用開關(guān)語句編的程序一定可以用if語句做。那么在什么情況下需要用switch語句呢?一般在出現(xiàn)比較整的情況下或者能轉(zhuǎn)化成比較整數(shù)的情況下使用??聪旅娴睦?例子:一個學(xué)生的成績分成五等,超過90分的為公,,80-89的為70-79為'C,60-69為D',60分以下為E?,F(xiàn)在輸入ー個學(xué)生的成績,輸出他的等級。⑴.用if語句main()(floatnum;chargrade;scanf(%d,&num);if(num>=90)grade='A';elseif(num>=80&&num<89)grade='B';elseif(num>=70&&num<79)grade='C;elseif(num>=60&&num<69)grade='D";elsegrade='E';printf(%c,grade);)⑵用switch語句main()(intnum;chargrade;scanf(%d,&num);num/=10;switch(num)(case10:case9:grade='A';break;case8:grade='B';break;case7:grade='C;break;case6:grade='D';break;default:grade='E';break;)printf(%c,grade);)說明一點,并不是每個case里面有都語句,有時侯里面是空的,就好象這ー題。switch語句執(zhí)行的順序是從第一case判斷,如果正確就往下執(zhí)行,直到break:如果不正確,就執(zhí)行下ー個case0所以在這里,當(dāng)成績是100分時,執(zhí)行case10:然后往下執(zhí)行,grade='A';break;退出。想想看,這里為什么要用num/=10;?假設(shè)當(dāng)程序中有浮點數(shù)時怎么辦呢?TurboC2.0提供三種基本的循環(huán)語句:for語句、while語句和do-while語句。ー、循環(huán)語句(一)、for循環(huán)它的一般形式為:for(〈初始化〉;〈條件表過式〉;〈增量〉)語句;初始化總是ー個賦值語句,它用來給循環(huán)控制變量賦初值;條件表達式是ー個關(guān)系表達式,它決定什么時候退出循環(huán);增量定義循環(huán)控制變量每循環(huán)一次后按什么方式變化。這三個部分之間用;分開。例如:fbr(i=l;i<=10;i++)語句;上例中先給i賦初值1,判斷i是否小于等于10,若是則執(zhí)行語句,之后值增加1。再重新判斷,直到條件為假,即i〉10時,結(jié)束循環(huán)。注意:.for循環(huán)中語句可以為語句體,但要用{和}將參加循環(huán)的語句括起來。.for循環(huán)中的初始化、條件表達式和增量都是選擇項,即可以缺省,但;不能缺省。省略了初始化,表示不對循環(huán)控制變量賦初值。省略了條件表達式,則不做其它處理時便成為死循環(huán)。省略了增量,則不對循環(huán)控制變量進行操作,這時可在語句體中加入修改循環(huán)控制變量的語句。⑶.for循環(huán)可以有多層嵌套。例如:for(;;)語句;for(i=l;;i+=2)語句;for(j=5;;)語句;這些for循環(huán)語句都是正確的。main()(inti,j;printf(ij\n);for(i=0;i<2;i++)for(j=0;j<3;j++)printf(%d%d\n,i,j);輸出結(jié)果為:ij0001021011用for循環(huán)求1+2+ +100的和:main()(intsn=0,i;for(i=1;i<=100;i++)sn+=i;/*1+2+ +100*/printf(%d\n,sn);)從程序可以看出,使用循環(huán)語句可以大大簡化代碼。(二)、while循環(huán)它的一般形式為:while(條件)語句;while循環(huán)表示當(dāng)條件為真時,便執(zhí)行語句。直到條件為假オ結(jié)束循環(huán)。并繼續(xù)執(zhí)行循環(huán)程序外的后續(xù)語句。例如:#includestdio.hmain()(charc;c=ヘ〇,;/?初始化c*/while(c!='\n)/?回車結(jié)束循環(huán)?/c=getche();/?帶回顯的從鍵盤接收字符?/上例中,while循環(huán)是以檢查c是否為回車符開始,因其事先被初始化為空,所以條件為真,進入循環(huán)等待鍵盤輸入字符:一旦輸入回車,則c=、イ,條件為假,循環(huán)便告結(jié)束。與for循環(huán)ー樣,while循環(huán)總是在循環(huán)的頭部檢驗條件,這就意味著循環(huán)可能什么也不執(zhí)行就退出。注意:.在while循環(huán)體內(nèi)也允許空語句。例如:while((c=getche())!='\n');這個循環(huán)直到鍵入回車為止。.可以有多層循環(huán)嵌套。.語句可以是語句體,此時必須用{和}括起來。用while循環(huán)求1+2+ +100的和:main()(intsn=0,i=0;while(++i<=100)sn+=i;/?求1+2+ +10〇?/printf(%d\n,sn);(三)、do--while循環(huán)它的一般格式為:do(語句塊;)while(條件);這個循環(huán)與while循環(huán)的不同在于:它先執(zhí)行循環(huán)中的語句,然后再判斷條件是否為真,如果為真則繼續(xù)循環(huán);如果為假,則終止循環(huán)。因此,do-while循環(huán)至少要執(zhí)行一次循環(huán)語句。同樣當(dāng)有許多語句參加循環(huán)時;要用{和}把它們括起來。用do-while循環(huán)求1+2+ +100的和:main()(intsn=0,i=l;dosn+=i;/?求1+2+ +10〇?/while(++i<=100);printf(%d\n,sn);從上面三個程序看出,使用for,while和do-while求解同樣的問題,基本思路都差不多,只是在第一次計算時,注意初值。二、循環(huán)控制(一)、break語句break語句通常用在循環(huán)語句和開關(guān)語句中。當(dāng)break用于開關(guān)語句switch中時,可使程序跳出switch而執(zhí)行switch以后的語句;如果沒有break語句,則將成為ー個死循環(huán)而無法退出。break在switch中的用法已在前面介紹開關(guān)語句時的例子中碰到,這里不再舉例。當(dāng)break語句用于do-while、for、while循環(huán)語句中時,可使程序終止循環(huán)而執(zhí)行循環(huán)后面的語句,通常break語句總是與if語句聯(lián)在ー起。即滿足條件時便跳出循環(huán)。例如:main()(intsn=0,i;for(i=l;i<=100;i++)(if(i==51)break;/*如果i等于51,則跳出循環(huán)?/sn+=i;/*1+2+ +50*/)printf(%d\n,sn);可以看出,最終的結(jié)果是1+2+……+500因為在i等于51的時候,就跳出循環(huán)了。自己寫寫怎樣在while和do—while循環(huán)中增加break語句。注意:.break語句對if-else的條件語句不起作用。.在多層循環(huán)中,ー個break語句只向外跳ー層。例如:main()(inti,j;printf(ij\n);for(i=0;i<2;i++)for(j=0;j<3;j++)(if(j==2)break;printf(%d%d\n,i,j);))輸出結(jié)果為:ij00011011當(dāng)i==0,j==2時,執(zhí)行break語句,跳出到外層的循環(huán),i變?yōu)?〇(二)、continue語句continue語句的作用是跳過循環(huán)本中剩余的語句而強行執(zhí)行下一次循環(huán)。continue語句只用在for、while>do-while等循環(huán)體中,常與if條件語句ー起使用,用來加速循環(huán)。例如:main()(intsn=0,i;for(i=1;i<=100;i++)(if(i==51)continue;/*如果i等于51,則結(jié)束本次循環(huán)?/sn+=i;/*1+2+ +50+52+ +100*/)printf(%d\n,sn);)從程序中可以看出,continue語句只是當(dāng)前的值沒有執(zhí)行,也就是說當(dāng)前的值跳過去了,接著執(zhí)行下次循環(huán)。main()(inti,j;printf(ij\n);for(i=0;i<2;i++)for(j=0;j<3;j++)(if(j==l)continue;printf(%d%d\n,i,j);))輸出結(jié)果為:ij00021012(三)、goto語句goto語句是ー種無條件轉(zhuǎn)移語句,與BASIC中的goto語句相似。goto語句的使用格式為:goto標(biāo)號;其中標(biāo)號是TurboC2.0中一個有效的標(biāo)識符,這個標(biāo)識符加上一個:ー起出現(xiàn)在函數(shù)內(nèi)某處,執(zhí)行g(shù)ot。語句后,程序?qū)⑻D(zhuǎn)到該標(biāo)號處并執(zhí)行其后的語句。標(biāo)號既然是ー個標(biāo)識符,也就要滿足標(biāo)識符的命名規(guī)則。另外標(biāo)號必須與goto語句同處于ー個函數(shù)中,但可以不在ー個循環(huán)層中。通常got。語句與if條件語句連用,當(dāng)滿足某一條件時ー,程序跳到標(biāo)號處運行。got。語句通常不用,主要因為它將使程序?qū)哟尾磺?且不易讀,但在多層嵌套退出時ゝ用got。語句則比較合理。main()(intsn=0,i;for(i=1;i<=100;i++)(if(i==51)gotoloop;/?如果i等于51,則跳出循環(huán)?/sn+=i;/*1+2+ +50?/)loop:;printf(%d\n,sn);)可以看出,這兒的goto語句和break作用很類似。這兒的loop:;printf(%d\n,sn);也可以寫成loop:printf(%d\n,sn);main()intsn=O,i;for(i=l;i<=100;i++)(if(i==51)gotoloop;/?如果i等于51,則跳出本次循環(huán)?/sn+=i;/*1+2+ +50+52+ +10〇?/loop:;)printf(%d\n,sn);)可以看出這兒的loop語句和continue的作用類似。但是某些情況下又必須使用goto語句,否則會讓程序大大臃腫。如:main()(inti,j,k;printf(ijk\n);for(i=0;i<2;i++)for(j=0;j<3;j++)for(k=0;k<3;k++)(if(k==2)gotoloop;printf(%d%d%d\n,i,j,k);loop:;)輸出結(jié)果為:ijk000001如果不使用goto語句,而使用break,continue語句,應(yīng)該這樣main()(inti,j,k;printf(ij\n);for(i=0;i<2;i++)(for(j=0;j<3;j++)(for(k=0;k<3;k++)(if(k==2)break;printf(%d%d%d\n,i,j,k);if(k==2)break;)if(k==2)break;))輸出結(jié)果為:ijk000001所以在同時跳出多層循環(huán)時ー,應(yīng)該使用goto語句。記住,所有的goto語句其實都是可以用break,continue代替的。下面舉幾個例子:.求兩個整數(shù)的最大公約數(shù)。例如10和15的最大公約數(shù)是5。分析:最大公約數(shù)一定小于等于最小的那個數(shù)一半,同時能被兩數(shù)整除。main()(intnuml,num2,i,min;scanf(%d%d,&numl,&num2);min=numlfor(i=min/2;i>0;i-)if(num1%i==0&&num2%i==0)break;printf(最大公約數(shù)為%d\n,i);.求l!+2!+ +n!(n<10)main()(intn,i;longtemp=l,sn=0;/?從9!以后,所得的值就超過了int范圍?/scanf(%d,&n);for(i=l;i<=n;i++)(temp*=i;sn+=temp;/?如果沒有這ー步,求的就是n!*/)printf(%ld\n,sn);)那么想想,如果求1!+3!+5!+ +n!應(yīng)該怎么辦?.判斷ー個整數(shù)是不是素數(shù)(素數(shù)就是只能被本身和1整除的數(shù))。#includemath.hmain()intnum,i,flag=O;scanf(%d,&num);for(i=2;i(flag=O;/?標(biāo)志變量復(fù)位?/if(num%i==O)(flag=l;break;))if(flag==O)printf(是素數(shù)、n);elseprintf(不是素數(shù)'n);)可以說,在所有的C語言書上,都有判斷素數(shù)的例題。它的編程思想是:把ー個變量作為標(biāo)志變量,用來標(biāo)志是不是素數(shù);循環(huán)體是從2到sqrt(num),因為如果ー個數(shù)不是素數(shù)的話,一定能分解成num=numl*num2,它們中的最小值一定小于sqrt(num),所以循環(huán)的時候只要到sqrt(num)就可以了。同時要注意變量復(fù)位的問題。數(shù)組,顧名思義就是ー組同類型的數(shù)。ー、數(shù)組的聲明聲明數(shù)組的語法為在數(shù)組名后加上用方括號括起來的維數(shù)說明。本接僅介紹ー維數(shù)組。下面是一個整型數(shù)組的例子:intarray[10];這條語句定義了一個具有10個整型元素的名為array的數(shù)組。這些整數(shù)在內(nèi)存中是連續(xù)存儲的。數(shù)組的大小等于每個元素的大小乘上數(shù)組元素的個數(shù)。方括號中的維數(shù)表達式可以包含運算符,但其計算結(jié)果必須是一個長整型值。這個數(shù)組是ー維的。下面這些聲明是合法的:intoffset[5+3];floatcount[5*2+3];下面是不合法的:intn=10;intoffset,];/?在聲明時,變量不能作為數(shù)組的維數(shù)?/二、用下標(biāo)訪問數(shù)組元素intoffset[10];表明該數(shù)組是ー維數(shù)組,里面有10個數(shù),它們分別為offset[〇],offset。],offset[9]!千萬注意,數(shù)組的第一個元素下標(biāo)從0開始。ー些剛學(xué)編程的人員經(jīng)常在這兒犯ー些錯誤。offset[3]=25;上面的例子是把25賦值給整型數(shù)組offset的第四個元素。在賦值的時候,可以使用變量作為數(shù)組下標(biāo)。main()(inti,offset[10];for(i=0;i<l0;i++)scanf(%d,&offset[i]);for(i=9;i>=0;i—)printf(%d,offset[i]);printf(\n);)題目的意思是先輸入10個整數(shù),存入到數(shù)組中,然后反序輸出。三、數(shù)組的初始化前面說了,變量可以在定義的時候初始化,數(shù)組也可以。intarray[5]={1,2,3,4,5};在定義數(shù)組時,可以用放在ー對大括號中的初始化表對其進行初始化。初始化值的個數(shù)可以和數(shù)組元素個數(shù)一樣多。如果初始化的個數(shù)多于元素個數(shù),將產(chǎn)生編譯錯誤;如果少于元素個數(shù),其余的元素被初始化為〇。如果維數(shù)表達式為空時,那么將用初始化值的個數(shù)來隱式地指定數(shù)組元素的個數(shù),如下所式:intarray[]={1,2,3,4,5);這也表明數(shù)組array元素個數(shù)為5。main()(inti,array[]={1,3,5,7,9,11};for(i=0;i<5;i++)printf(%d,array[i]);printf(\n);)最終結(jié)果為13579四、字符數(shù)組整數(shù)和浮點數(shù)數(shù)組很好理解,在ー維數(shù)組中,還有一類字符型數(shù)組。chararray[5]={'H,,,E,,,L';L',,O'};對于單個字符,必須要用單引號括起來。又由于字符和整型是等價的,所以上面的字符型數(shù)組也可以這樣表示:chararray[5]={72,69,76,76,79};/?用對應(yīng)的ASCI!碼?/舉一個例子:main()(inti;chararray[5]={'H,,,E,,,L';L',,O'};for(i=0;i<5;i++)printf(%d,array[i]);printf(\n);最終的輸出結(jié)果為7269767679但是字符型數(shù)組和整型數(shù)組也有不同的地方,看下面的:chararray[]=HELLO;如果我們能看到內(nèi)部的話,實際上編譯器是這樣處理的:chararrayロ’〇',ヘ〇’};看上面最后ー個字符'、0',它是ー個字符常量,TurboC編譯器總是給字符型數(shù)組的最后自動加上ー個、。,這是字符的結(jié)束標(biāo)志。所以雖然HELLO只有5個字符,但存入到數(shù)組的個數(shù)卻是6個。但是,數(shù)組的長度仍然是5。inti;i=strlen(array);/?求字符串的長度,在string.h里面?/可以看出i仍然是5,表明最后的,'〇'沒有算。#includestring.hmain()(inti,j;chararray[]=O94387fdhgkdladhladaskdh;j=strlen(array);for(i=0;iprintf(\n);其實我們可以根據(jù)判斷‘、?!瘉磔敵鲎址?看下面的:main()(inti;chararray[]=094387fdhgkdladhladaskdh;for(i=0;array[i]!='\O';i++)printf(%c,array[i]);printf(\n);)舉幾個例子:.輸入10個整數(shù)存入數(shù)組中,然后把它們從小到大排列并放在同一數(shù)組中。(思路:先找出最小的,放在第一個位置,為了防止把原先的數(shù)覆蓋掉,可以把原先的第一個數(shù)和最小數(shù)的位置互換)。main()(intarray[10];inti,j,min,stmp;for(i=0;i<10;i++)scanf(%d,&array[i]);for(i=0;i<9;i++)min=array[i];for(j=i+1;j<1Oy++)if(min>array[j])/?里面的4行語句很重要?/(min=array[j];stmp=array[i];array[i]=array[j];array[j]=stmp;))for(i=0;i<10;i++)printf(%d,array[i]);printf(\n);)分析:先讓第一個值作為基準(zhǔn),如果后面有比它小的,那么就把這兩個數(shù)互換一下,同時把基準(zhǔn)換成小的值。兩個數(shù)互換應(yīng)該這樣(stmp=a;a=b;b=stmp;),而不是(a=b;b=a;),想想這是為什么?必須要用ー個變量作為橋梁。這種ー個ー個的把最小的放在前面的排序方法,我們形象的叫做冒泡法。.輸入一行字符存入數(shù)組,然后把他們反序存入到同一數(shù)組中。#includestdio.hmain()charc,stmp,array[80];inti=0,j;while((c=getchar())!=*\n')/?注意這兒的用法?/array[i++]=c;array[i]='\0';/?為什么要加‘、〇’?是否可以不加?*/for(j=i-l;j>=i/2;j—)(stmp=array[j];array[j]=array[i-1-j];array[i-l-j]=stmp;)for(i=0;array[i]!='\0';i++)printf(%c,array[i]);printf(\n);).ー個已經(jīng)排好序的數(shù)組,輸入ー個數(shù),利用二分法把這個數(shù)從原數(shù)組中刪除,數(shù)組順序保持不變。如原數(shù)組為1,3,5,7,9,11,13,15,17,19,待刪除的數(shù)為!3,則輸出為!,3,5,7,9,11,15,17,190二分法:每次都是判斷中間的數(shù)是否滿足要求,若滿足則刪除,若不滿足,則把該數(shù)當(dāng)作邊界,然后再找中點。例如這ー題,第一次的是10個數(shù)的中點,為11,發(fā)現(xiàn)11<13,則找11-19的中點15,發(fā)現(xiàn)!5>13,再找11-15的中點13,正好,則刪除。main()(intarray[10]={l,2,3,5,8,l5,20,30,100,200};intfirst=0,end=9,middle=(first+end)/2,num,i;scanf(%d,&num);while(array[middle]!=num)/?注意這里面的三行代碼?/(if(array[middle]>num)end=middle;elsefirst=middle;middle=(first+end)/2;)for(i=0;i<9;i++)(if(i>=middle)array[i]=array[i+1];printf(%d,array[i]);)printf(\n);)程序沒有考慮當(dāng)輸入的數(shù)在原先數(shù)組中沒有時怎么處理。如果要考慮這個問題,程序該怎么改動呢?高維數(shù)組有時、數(shù)組的維數(shù)并不止一維,例如一個記錄消費中心在第一季度里各個月的收入數(shù)據(jù)就可以用二維數(shù)組來表示。定義二維數(shù)組的方法是在ー維數(shù)組定義的后面再加上一個用方括號括起來的維數(shù)說明。例如:floatarray[3][8];實際上,這個數(shù)組可以看成3個連續(xù)的ー維數(shù)組,每個ー維數(shù)組具有8個元素。該數(shù)組在內(nèi)存中的存儲格式為最左邊的維數(shù)相同的元素連續(xù)存儲,也即按行存儲的。首先存儲第一行8個元素,其次是第二行,最后是第三行。main()(intarray[3][3]={1,2,3,4,5,6,7,8,9);inti,j;for(i=0;i<3;i++)(for(j=0;j<3;j++)printf(%3d);printf(\n);它的輸出結(jié)果為:123456789可以看出,二維數(shù)組元素是按行存儲的。我們也可以對數(shù)組進行賦值,而不是初始化。main()(intarray[3][3];inti,j;for(j=0;j<3;j++)for(i=0;i<3;i++)scanf(%d,&array[i][j]);for(i=0;i<3;i++)(for(j=0;j<3;j++)printf(%3d);printf(\n);))當(dāng)輸入123456789V回車〉輸出為:258369數(shù)組可以是二維、三維甚至是更高維數(shù)的,雖然C語言對維數(shù)的處理沒有上限,但是處理高維數(shù)組是很頭疼的事。一般盡量避免處理四維和四維以上的數(shù)組。下面看一個三維數(shù)組的例子:main()(intarray⑵⑶⑷;inti,j,k;for(i=0;i<2;i++)for(j=0;j<3;j++)for(k=0;k<4;k++)array[i][j][k]=i*12+j*4+k;)這個三維數(shù)組可以看成2個二維數(shù)組,每個二維數(shù)組又可以看成3個ー維數(shù)組??梢栽陬^腦里想象成兩個平行平面,每個平面內(nèi)有3*4個點。所以共有24個元素。二、字符串?dāng)?shù)組上面講的都是存放數(shù)值的,有一類數(shù)組,用來處理字符串的,我們叫字符串?dāng)?shù)組。其實字符串?dāng)?shù)組也是二維數(shù)組,只是它的特殊性,オ單獨拿出來說的。main()(chars[10][10];inti;for(i=0;i<lO;i++)scanf(%s,s[i]);)先看它的輸入特性,前面在說輸入語句的時候說過,遇到字符串輸入,可以不加&,,現(xiàn)在只要記住這個特性就可以,以后說指針的時候再講為什么。但是這兒為什么用s[i],可能很多人不太明白。我們定義的是二維數(shù)組,而輸入的時候,卻使用ー維數(shù)組的形式。這是因為字符串在內(nèi)存里地址可以用它的名字表示,就好象這種形式:main()(chars[10];scanf(%s,s);)定義的是ー維數(shù)組,輸入語句用變量形式表示一樣。通過前面的'%s形式可以看出,s[i]是ー個數(shù)組,所以s就是二維數(shù)組了。這里要注意一點,scanf()函數(shù)在輸入字符串時候不能支持空格,看下面的例子:main()(chars[3][10];inti;for(i=0;i<10;i++)scanf(%s,s[i]);for(i=0;i<3;i++)printf(%s\n,s[i]);)我們輸入:1111222233334444我們是想把!111賦值給s[0],22223333賦值給s[l],4444賦值給s[2]o可實際上編譯器是這樣做的,把1111賦值給s[0],把2222賦值給U],把3333賦值給s[2]。實際輸出:111122223333在輸入字符串的時候,如果使用scanf(),就把空格當(dāng)作下ー個輸入了。那么我們怎么解決這個問題呢?畢竟很多情況下,一行字符串肯定有空格出現(xiàn)的。我們使用新的函數(shù)gets()。這個函數(shù)是專門接受字符串輸入的,它跳過了空格的影響。把上面的輸入語言修改為gets(s[i])即可。我們定義了chars[3][10],超過10個字符肯定不行,如果少于10個字符,電腦怎么處理呢?電腦是在每個字符串的后面自動補上‘、O’,作為字符串的結(jié)束標(biāo)志。我們經(jīng)常在填寫ー些可選擇的內(nèi)容時經(jīng)常發(fā)現(xiàn),待選的字符串都是按字母排列好的,我們怎么用C語言實現(xiàn)這個功能?在C語言里,字符串的排序是按照字符的ASCII碼來的,如果第一個字符ー樣,則比較第二個,依次類推。main()(charsi[6]=addfgh,s2[5]=asdlg;inti;for(i=0;sl[i]!='\0'&&s2[i]!='\0';i++)(if(sl[i]<S2[I])(printf(sl<S2\N);exit(l);)elseif(sl[i]>s2[i])printf(sl>s2\n);exit(l);)else;}if(sl[i]=='\O'&&s2[i]!='\0')printf(sl<S2\N);elseif(s2[i]=='\0"&&sl[i]!='\O')printf(sl>s2\n);elseprintf(sl==s2\n);上面的例子就是比較兩個字符串大小的,先比較第一個,如果相同,接著比較第二個,如果不相同,則分出大小。一直往后比較,直到其中某ー個到‘、。’,你也可以先用strlen()函數(shù)找出最小的長度。exit。函數(shù)的作用是退出程序,具體它的用法可以看看相關(guān)資料。其實C語言把我們經(jīng)常需要的字符串處理函數(shù)都做好了,我們只需要調(diào)用它即可。如strcmp。用來比較、strcpy。用來拷貝等等??纯此鼈兊挠梅?#includestring.hmain()charsl[10],s2[10],s2[10];intk;gets(sl);gets(s2);k=strcmp(sl,s2);/?比較si和s2大小?/if(k==O)printf(sl==s2\n);elseif(k>0)printf(sl>s2\n);elseprintf(sl<S2\N);strcpy(s3,sl);/?把s!拷貝到s3*/printf(%s\n,s3);)可以看出,比較大小時,如果k<0,則slO,則sl>s2;如果k=0,則sl=s2o實際上這是ー個函數(shù),具體什么是函數(shù),以及為什么寫成那種形式,我們下節(jié)再說。這些函數(shù)都包含在string.h頭文件中,所以在程序的開頭,都要寫」:#includestring.h。字符串處理有很多函數(shù),你們可以看看相關(guān)的書,也可以看看TurboC的幫助。本節(jié)介紹C程序的基本單元一函數(shù)。函數(shù)中包含了程序的可執(zhí)行代碼。每個C程序的入口和出口都位于函數(shù)main。之中。main。函數(shù)可以調(diào)用其他函數(shù),這些函數(shù)執(zhí)行完畢后程序的控制又返回到main()函數(shù)中,main。函數(shù)不能被別的函數(shù)所調(diào)用。通常我們把這些被調(diào)用的函數(shù)稱為下層(lower-level)函數(shù)。函數(shù)調(diào)用發(fā)生時,立即執(zhí)行被調(diào)用的函數(shù),而調(diào)用者則進入等待狀態(tài),直到被調(diào)用函數(shù)執(zhí)行完畢。函數(shù)可以有參數(shù)和返回值。程序員一般把函數(shù)當(dāng)作“黑箱’’處理,并不關(guān)心它內(nèi)部的實現(xiàn)細節(jié)。當(dāng)然程序員也可以自己開發(fā)函數(shù)庫。說明一點,函數(shù)這ー節(jié)很重要,可以說ー個程序的優(yōu)劣集中體現(xiàn)在函數(shù)上。如果函數(shù)使用的恰當(dāng),可以讓程序看起來有條理,容易看懂。如果函數(shù)使用的亂七八糟,或者是沒有使用函數(shù),程序就會顯得很亂,不僅讓別人無法查看,就連自己也容易暈頭轉(zhuǎn)向??梢赃@樣說,如果超過100行的程序中沒有使用函數(shù),那么這個程序一定很羅嗦(有些絕對,但也是事實)。ー、函數(shù)的定義ー個函數(shù)包括函數(shù)頭和語句體兩部分。函數(shù)頭由下列三不分組成:函數(shù)返回值類型函數(shù)名參數(shù)表ー個完整的函數(shù)應(yīng)該是這樣的:函數(shù)返回值類型函數(shù)名(參數(shù)表)語句體:)函數(shù)返回值類型可以是前面說到的某個數(shù)據(jù)類型、或者是某個數(shù)據(jù)類型的指針、指向結(jié)構(gòu)的指針、指向數(shù)組的指針。指針概念到以后再介紹。函數(shù)名在程序中必須是唯一的,它也遵循標(biāo)識符命名規(guī)則。參數(shù)表可以沒有也可以有多個,在函數(shù)調(diào)用的時候,實際參數(shù)將被拷貝到這些變量中。語句體包括局部變量的聲明和可執(zhí)行代碼。我們在前面其實已經(jīng)接觸過函數(shù)了,如abs(),sqrt(),我們并不知道它的內(nèi)部是什么,我們只要會使用它即可。這ー節(jié)主要講解無參數(shù)無返回值的函數(shù)調(diào)用。二、函數(shù)的聲明和調(diào)用為了調(diào)用ー個函數(shù),必須事先聲明該函數(shù)的返回值類型和參數(shù)類型,這和使用變量的道理是ー樣的(有一種可以例外,就是函數(shù)的定義在調(diào)用之前,下面再講述)。看ー個簡單的例子:voida();/?函數(shù)聲明?/main()a();/?函數(shù)調(diào)用?/)voida()/?函數(shù)定義?/(intnum;scanf(%d,&num);printf(%d\n,num);)在main。的前面聲明了一個函數(shù),函數(shù)類型是void型,函數(shù)名為a,無參數(shù)。然后在main()函數(shù)里面調(diào)用這個函數(shù),該函數(shù)的作用很簡單,就是輸入ー個整數(shù)然后再顯示它。在調(diào)用函數(shù)之前聲明了該函數(shù)其實它和下面這個程序的功能是ー樣的:main()(intnum;scanf(%d,&num);printf(%d\n,num);可以看出,實際上就是把a()函數(shù)里面的所有內(nèi)容直接搬到main。函數(shù)里面(注意,這句話不是絕對的。)我們前面已經(jīng)說了,當(dāng)定義在調(diào)用之前時,可以不聲明函數(shù)。所以上面的程序和下面這個也是等價的:voida()(intnum;scanf(%d,&num);printf(%d\n,num);)main()(a();)因為定義在調(diào)用之前,所以可以不聲明函數(shù),這是因為編譯器在編譯的時候,已經(jīng)發(fā)現(xiàn)a是ー個函數(shù)名,是無返回值類型無參數(shù)的函數(shù)了。那么很多人也許就會想,那我們何必還要聲明這一步呢?我們只要把所有的函數(shù)的定義都放在前面不就可以了嗎?這種想法是不可取的,ー個好的程序員總是在程序的開頭聲明所有用到的函數(shù)和變量,這是為了以后好檢查。前面說了,在調(diào)用之前,必須先聲明函數(shù),所以下面的做法也是正確的(但在這里我個人并不提倡)。main()voida();a();)voida()(intnum;scanf(%d,&num);printf(%d\n,num);)一般來說,比較好的程序書寫順序是,先聲明函數(shù),然后寫主函數(shù),然后再寫那些自定義的函數(shù)。既然main。函數(shù)可以調(diào)用別的函數(shù),那么我們自己定義的函數(shù)能不能再調(diào)用其他函數(shù)呢?答案是可以的。看下面的例子:voida();voidb();main()(a();)voida()(b();)voidb()(intnum;scanf(%d,&num);printf(%d\n,num);)main。函數(shù)先調(diào)用a()函數(shù),而a()函數(shù)又調(diào)用b()函數(shù)。在C語言里,對調(diào)用函數(shù)的層數(shù)沒有嚴格的限制,我們可以往下調(diào)用100層、1000層,但是在這里我們并不提倡調(diào)用的層數(shù)太多(除非是遞歸),因為層數(shù)太多,對以后的檢查有一些干擾,函數(shù)調(diào)過來調(diào)過去,容易讓自己都暈頭轉(zhuǎn)向。某些人可能就不明白了,看上面的例子,好象使用函數(shù)后,程序變的更長了,更不讓人理解。當(dāng)然,我舉的這個例子的確沒有必要用函數(shù)來實現(xiàn),但是對于某些實際問題,如果不使用函數(shù),會讓程序變的很亂,這涉及到參數(shù)問題,我們下ー節(jié)再說。前面我們說的都是無參數(shù)無返回值的函數(shù),實際程序中,我們經(jīng)常使用到帶參數(shù)有返回值的函數(shù)。ー、函數(shù)參數(shù)傳遞.形式參數(shù)和實際參數(shù)函數(shù)的調(diào)用值把ー些表達式作為參數(shù)傳遞給函數(shù)。函數(shù)定義中的參數(shù)是形式參數(shù),函數(shù)的調(diào)用者提供給函數(shù)的參數(shù)叫實際參數(shù)。在函數(shù)調(diào)用之前,實際參數(shù)的值將被拷貝到這些形式參數(shù)中。.參數(shù)傳遞先看ー個例子:voida(int);/*注意函數(shù)聲明的形式?/main()(intnum;scanf(%d,&num);a(num);/?注意調(diào)用形式*/voida(intnum_back)/?注意定義形式?/(printf(%d\n,num_back);)在主函數(shù)中,先定義ー個變量,然后輸入一個值,在a()這個函數(shù)中輸出。當(dāng)程序運行a(num);這ー步時,把num的值賦值給num_back,在運行程序過程中,把實際參數(shù)的值傳給形式參數(shù),這就是函數(shù)參數(shù)的傳遞。形參和實參可能不只一個,如果多于ー個時,函數(shù)聲明、調(diào)用、定義的形式都要ーー對應(yīng),不僅個數(shù)要對應(yīng),參數(shù)的數(shù)據(jù)類型也要對應(yīng)。voida(int,float);main()(intnuml;floatnum2;scanf(%d,&numl);scanf(%f,&num2);a(numl,num2);)voida(intnuml_back,floatnum2_back)(printf(%d,%f\n,numl_back,num2_back);)上面的例子中,函數(shù)有兩個參數(shù),ー個是整型,ー個是浮點型,那么在聲明、調(diào)用、定義的時候,不僅個數(shù)要一樣,類型也要對應(yīng)。如果不對應(yīng),有可能使的編譯錯誤,即使沒錯誤,也有可能讓數(shù)據(jù)傳遞過程中出現(xiàn)錯誤。再看ー個例子:voida(int);main()(intnum;scanf(%d,&num);a(num);voida(intnum)(printf(%d\n,num);)看上面的例子,形式參數(shù)和實際參數(shù)的標(biāo)識符都是num,程序把實際參數(shù)num的值傳遞給形式參數(shù)num。有些人可能就不明白了,既然兩個都是num,為什么還要傳遞呢?干脆這樣不就行了嗎:voida();main()(intnum;scanf(%d,&num);a();printf(%d\n,num);)其實不然,這就要涉及到標(biāo)識符作用域的問題。作用域的意思就是說,哪些變量在哪些范圍內(nèi)有效。ー個標(biāo)識符在一個語句塊中聲明,那么這個標(biāo)識符僅在當(dāng)前和更低的語句塊中可見,在函數(shù)外部的其實地方不可見,其他地方同名的標(biāo)識符不受影響,后面我們會系統(tǒng)講解作用域的問題。在這兒你就要知道兩個同名的變量在不同的函數(shù)中是互不干擾的。前面將的都是變量與變量之間的值傳遞,其實函數(shù)也可以傳遞數(shù)組之間的值??聪旅娴睦?voida(int[]);main()(intarray[5],i;for(i=0;i<5;i++)scanf(%d,&array[i]);a(array);inti;for(i=0;i<5;i++)printf(%d\t,array[i]);printf(\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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三農(nóng)村義務(wù)教育實施方案
- 珠寶鑒定與評估技術(shù)作業(yè)指導(dǎo)書
- 居民采暖供用熱合同
- 信息安全防護技術(shù)作業(yè)指導(dǎo)書
- 2025年毫州考貨運資格證考試內(nèi)容
- 2025年延安道路運輸從業(yè)資格證考試
- 2025年銀川貨車從業(yè)資格證考試試題
- 2025年襄陽道路客貨運輸從業(yè)資格證模擬考試下載
- 電力資源整合合同(2篇)
- 電力公司勞動合同范本(2篇)
- 基于AI的自動化日志分析與異常檢測
- 浙江省浙南名校聯(lián)盟2023-2024學(xué)年高二上學(xué)期期中聯(lián)考數(shù)學(xué)試題(原卷版)
- 戰(zhàn)略管理與倫理
- 如何構(gòu)建高效課堂課件
- 虛擬化與云計算技術(shù)應(yīng)用實踐項目化教程 教案全套 第1-14周 虛擬化與云計算導(dǎo)論-騰訊云服務(wù)
- 徐金桂行政法與行政訴訟法新講義
- 瀝青拌合設(shè)備結(jié)構(gòu)認知
- 2023年北京高考政治真題試題及答案
- 復(fù)旦中華傳統(tǒng)體育課程講義05木蘭拳基本技術(shù)
- 北師大版五年級上冊數(shù)學(xué)教學(xué)課件第5課時 人民幣兌換
- 工程回訪記錄單
評論
0/150
提交評論