《C語言(第三版)》 課件 項(xiàng)目3、4 掌握 C 語言、應(yīng)用 C 語言_第1頁
《C語言(第三版)》 課件 項(xiàng)目3、4 掌握 C 語言、應(yīng)用 C 語言_第2頁
《C語言(第三版)》 課件 項(xiàng)目3、4 掌握 C 語言、應(yīng)用 C 語言_第3頁
《C語言(第三版)》 課件 項(xiàng)目3、4 掌握 C 語言、應(yīng)用 C 語言_第4頁
《C語言(第三版)》 課件 項(xiàng)目3、4 掌握 C 語言、應(yīng)用 C 語言_第5頁
已閱讀5頁,還剩260頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

03掌握C語言99任務(wù)1模擬“收款機(jī)”——順序結(jié)構(gòu)程序的設(shè)計(jì)任務(wù)2判斷正負(fù)數(shù)或0——條件和分支結(jié)構(gòu)程序的設(shè)計(jì)任務(wù)3打印九九乘法表——循環(huán)結(jié)構(gòu)程序的設(shè)計(jì)任務(wù)4輸出4×4矩陣——數(shù)組的使用任務(wù)5設(shè)計(jì)“計(jì)算器”——函數(shù)的使用任務(wù)6按順序輸出10種水果名稱——指針的使用任務(wù)7輸出學(xué)生成績——結(jié)構(gòu)體的使用任務(wù)8按面積售梯形板材——宏和預(yù)處理語句的使用100模擬“收款機(jī)”——順序結(jié)構(gòu)程序的設(shè)計(jì)任務(wù)1101學(xué)習(xí)目標(biāo)1.掌握C程序的基本結(jié)構(gòu)。2.理解各種順序結(jié)構(gòu)程序設(shè)計(jì)的理念。3.能運(yùn)用輸入、輸出語句編寫程序。4.掌握簡單的程序設(shè)計(jì)方法。102任務(wù)描述超市的收款機(jī)是代替人工收款的機(jī)器,它可以通過掃描各商品的條形碼,輸入和顯示商品份數(shù)、單價(jià)、總價(jià)和找零;每當(dāng)商品因打折等發(fā)生價(jià)格變化時(shí),只需稍微修改運(yùn)行程序就能自動(dòng)實(shí)現(xiàn)價(jià)格變動(dòng)。本任務(wù)用C程序來模仿收款機(jī),體會(huì)簡單修改程序即能滿足收款機(jī)功能調(diào)整需求的過程,從而掌握數(shù)據(jù)的表達(dá)、運(yùn)算、流程控制等基本內(nèi)容,進(jìn)一步了解C程序的設(shè)計(jì)思想和方法。103本任務(wù)“收款機(jī)”程序的具體要求為:現(xiàn)出售A、B、C、D、E、F這6種商品,其單價(jià)分別是10.50元、15.00元、18.00元、28.00元、40.20元、24.00元,其中F打6折。要求程序根據(jù)顧客購買的數(shù)量計(jì)算總價(jià),并根據(jù)顧客支付的金額計(jì)算找零,通過C語言程序進(jìn)行調(diào)試、運(yùn)行并顯示總價(jià)和找零的計(jì)算結(jié)果。104相關(guān)知識(shí)一、C語言程序基本結(jié)構(gòu)C語言程序是一種結(jié)構(gòu)化程序,它的基本組成是函數(shù),一個(gè)具體的程序任務(wù)可以分成若干部分,由函數(shù)分別定義和編碼,使程序模塊化。C語言程序一般由一個(gè)或者多個(gè)C函數(shù)組成,而函數(shù)又是由若干個(gè)C語句構(gòu)成,一個(gè)C語句則是由若干個(gè)基本單詞構(gòu)成。C語言程序的一般形式如下。105全局變量說明;main(){局部變量說明;語句;/*可以包含調(diào)用函數(shù)的語句。調(diào)用函數(shù)時(shí),程序跳轉(zhuǎn)到相應(yīng)函數(shù)的部分,函數(shù)結(jié)束后再跳轉(zhuǎn)回主函數(shù),接著執(zhí)行調(diào)用語句的下一個(gè)語句。主函數(shù)不可被調(diào)用*/}函數(shù)1(形式參數(shù)表)/*被調(diào)用函數(shù),可以被主函數(shù)調(diào)用。此外,函數(shù)間也可以106互相調(diào)用,甚至可以調(diào)用自身*/{

局部變量說明;

語句;}函數(shù)2(形式參數(shù)表){

局部變量說明;107

語句;}…函數(shù)

n(形式參數(shù)表){

局部變量說明;

語句;}1081.?C函數(shù)C函數(shù)是完成C程序某個(gè)整體功能的基本單位,它是相對(duì)獨(dú)立的程序段、過程或模塊。一個(gè)C程序由一個(gè)主函數(shù)和若干其他函數(shù)組成,所有的函數(shù)都具有相同的結(jié)構(gòu)。1092.?C語句C語句是完成某種功能函數(shù)的最小單位。C語句包括表達(dá)式語句、復(fù)合語句和空語句,都以分號(hào)結(jié)尾。(1)表達(dá)式語句。表達(dá)式語句由一個(gè)表達(dá)式加一個(gè)分號(hào)構(gòu)成。(2)復(fù)合語句。復(fù)合語句由多條語句組成,并且這些語句必須用大括號(hào)括起來。(3)空語句??照Z句中只有一個(gè)分號(hào),程序執(zhí)行空語句時(shí)不產(chǎn)生任何動(dòng)作,可以用來表示延時(shí),用戶在編程過程中應(yīng)謹(jǐn)慎使用空語句。1103.?基本單詞基本單詞是構(gòu)成C語句的最小單位,包括關(guān)鍵字(又稱保留字)、標(biāo)識(shí)符、常量、操作符和分隔符5種。4.?程序特點(diǎn)(1)C程序是由函數(shù)組成的,一個(gè)C程序必須包含一個(gè)main()函數(shù)(即主函數(shù)),此外可以包含若干個(gè)其他函數(shù),程序的全部工作由函數(shù)來完成。111(2)不論main()函數(shù)在什么位置,程序總是從main()函數(shù)開始執(zhí)行。(3)程序的書寫自由,一行可寫多條語句,一條語句也可以根據(jù)一定規(guī)則分行書寫。但是,最好是每一行書寫一條語句。(4)一般用小寫字母編寫語句,一條語句以分號(hào)結(jié)尾。(5)在每條C語句后用“/*…*/”表示注釋,注釋并不影響語句的功能,只起提示作用。112二、程序流程圖程序流程圖是算法的圖形表示法,它用圖的形式代替了算法的細(xì)節(jié),顯示從開始到結(jié)束的整個(gè)流程。傳統(tǒng)程序流程圖符號(hào)如圖所示。113

傳統(tǒng)程序流程圖符號(hào)目前流行的程序流程圖中,平行四邊形被矩形取代,表示連接點(diǎn)的小圓形也被省略。目前流行的程序流程圖如圖所示。右圖中所描述的是C語言常用的程序結(jié)構(gòu),根據(jù)輸入是否結(jié)束,程序的流程分成兩個(gè)不同的方向。由此可見,可以通過程序流程圖體現(xiàn)算法的細(xì)節(jié)、邏輯判斷,控制程序流程,讓程序根據(jù)不同的情況執(zhí)行相應(yīng)的語句。114目前流行的程序流程圖三、C程序設(shè)計(jì)的基本結(jié)構(gòu)1.?順序結(jié)構(gòu)順序結(jié)構(gòu)是一種從上向下依次執(zhí)行程序語句序列的線性結(jié)構(gòu),是最簡單的C程序設(shè)計(jì)結(jié)構(gòu),即從第一個(gè)語句開始,順序執(zhí)行各個(gè)語句,直到所有的語句都執(zhí)行完畢。順序結(jié)構(gòu)流程圖如圖a所示。115

流程圖a)順序結(jié)構(gòu)b)分支結(jié)構(gòu)c)循環(huán)結(jié)構(gòu)2.?分支結(jié)構(gòu)分支結(jié)構(gòu)是對(duì)一個(gè)問題給定的條件進(jìn)行判斷,根據(jù)判斷結(jié)果來選擇繼續(xù)執(zhí)行哪條語句。分支結(jié)構(gòu)流程圖如上圖b所示。3.?循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)比較復(fù)雜,是對(duì)給定的條件進(jìn)行判斷,根據(jù)判斷結(jié)果,C程序或者反復(fù)執(zhí)行某一段語句(稱為循環(huán)體),或者結(jié)束循環(huán)。循環(huán)結(jié)構(gòu)流程圖如上圖c所示。116四、數(shù)據(jù)的輸入輸出交互式程序大多以數(shù)據(jù)交換來完成,程序分為輸入、處理、輸出3個(gè)部分,在C語言中有完備的輸入輸出功能,其中使用較多的是格式輸入輸出函數(shù)、單字符輸入輸出函數(shù)、文件輸入輸出函數(shù)。1.?printf()函數(shù)printf()函數(shù)可以向屏幕輸出變量、常量、表達(dá)式的值,是一種比較常用的輸出函數(shù),它是系統(tǒng)提供的庫函數(shù),函數(shù)聲明包含于系統(tǒng)文件stdio.h中。在調(diào)用庫函數(shù)中的printf()函數(shù)時(shí),要先用編譯預(yù)處理命令#include<stdio.h>或#include"stdio.h"。117printf()函數(shù)的調(diào)用形式如下。printf("格式控制字符串",輸出項(xiàng)1,…,輸出項(xiàng)

n);printf()函數(shù)可以將不同類型的數(shù)據(jù)按一定的格式輸出,一個(gè)格式的說明必須由“%”開頭,以一種格式控制字符結(jié)束。printf()函數(shù)常用格式控制字符及其說明見下表,printf()函數(shù)附加格式字符及其說明見下表。118119printf(?)

函數(shù)常用格式控制字符及其說明120printf(?)函數(shù)附加格式字符及其說明2.?scanf_s()函數(shù)與printf()函數(shù)相似,scanf_s()函數(shù)是系統(tǒng)用于輸入的庫函數(shù),函數(shù)聲明同樣包含于stdio.h系統(tǒng)文件中,能夠從鍵盤上接收數(shù)據(jù)并且格式化賦給變量,讀入內(nèi)存。scanf_s()函數(shù)的一般調(diào)用形式如下。scanf_s("格式控制字符串",&輸入項(xiàng)1,…,&輸入項(xiàng)

n);在輸入單個(gè)字符(%c)或者字符串(%s)時(shí),后面需要加上其長度(字節(jié)數(shù)N),其調(diào)用形式如下。scanf_s("格式控制字符串",&輸入項(xiàng)1,N,…,&輸入項(xiàng)

n,N);上式表示其中的“輸入項(xiàng)1”和“輸入項(xiàng)

n”輸入了單個(gè)字符(%c)或者字符串(%s)。121使用scanf_s()函數(shù)時(shí),應(yīng)注意以下幾點(diǎn)。(1)scanf_s()函數(shù)中沒有精度控制,如語句“scanf_s("%7.2f",&a);”是非法的。不能用此語句指定輸入小數(shù)為兩位的實(shí)數(shù)。(2)“&a”表示的是變量a的內(nèi)存地址。scanf_s()函數(shù)要求給出變量地址,如給出變量名則會(huì)出錯(cuò)。如語句“scanf_s("%d",a);”是非法的。(3)輸入多個(gè)數(shù)值數(shù)據(jù)時(shí),若格式控制字符串中沒有非格式字符做輸入數(shù)據(jù)之間的間隔,則可用空格、Tab鍵或回車鍵做間隔。C程序編譯時(shí)碰到空格、Tab鍵、回車鍵或非法數(shù)據(jù)即認(rèn)為該數(shù)據(jù)結(jié)束。(4)輸入字符數(shù)據(jù)時(shí),若格式控制字符串中無非格式字符,則認(rèn)為所有輸入的字符均為有效字符。1223.?getchar()和putchar()函數(shù)getchar()函數(shù)和putchar()函數(shù)是用于單個(gè)字符的輸入和輸出的函數(shù),函數(shù)聲明也存在于系統(tǒng)文件stdio.h里,調(diào)用時(shí)比printf()函數(shù)和scanf_s()函數(shù)更簡捷。getchar()函數(shù)和putchar()函數(shù)調(diào)用形式如下。getchar(ch);putchar(ch);其中,ch可以是字符型常量、變量或整型變量。getchar()函數(shù)只能接收單個(gè)字符,輸入數(shù)字也按字符處理。輸入多于一個(gè)字符時(shí),getchar()函數(shù)只接收第一個(gè)字符。123判斷正負(fù)數(shù)或0——條件

和分支結(jié)構(gòu)程序的設(shè)計(jì)任務(wù)2124學(xué)習(xí)目標(biāo)1.能熟練使用if語句、if-else語句編寫條件選擇程序。2.能運(yùn)用嵌套if語句編寫程序。3.能使用switch語句等編寫多分支結(jié)構(gòu)程序。125任務(wù)描述所謂分支結(jié)構(gòu),和道路的岔路很相似。人們走到岔路口時(shí),會(huì)根據(jù)不同的條件要求,選擇不同的分岔行走。本任務(wù)要求對(duì)一個(gè)數(shù)是正數(shù)、負(fù)數(shù)還是0進(jìn)行判斷,即看到一個(gè)數(shù)后,如果判斷它是正數(shù),就顯示“Thisnumberisgreaterthan0.(這個(gè)數(shù)字大于零。)”,如果判斷它是負(fù)數(shù),就顯示“Thisnumberislessthan0.(這個(gè)數(shù)字小于零。)”,如果判斷它是0,則顯示“Thisnumberis0.(這個(gè)數(shù)字是零。)”。本任務(wù)的具體要求是,用嵌套if語句編寫程序,實(shí)現(xiàn)從鍵盤上輸入一個(gè)整數(shù),判斷這個(gè)整數(shù)是正數(shù)、負(fù)數(shù)還是0,并輸出結(jié)果。126相關(guān)知識(shí)一、分支結(jié)構(gòu)分支結(jié)構(gòu)是C語言3種基本結(jié)構(gòu)之一,也是結(jié)構(gòu)化程序設(shè)計(jì)必需的基本結(jié)構(gòu),分支結(jié)構(gòu)程序主要使用流程控制語句(也稱過程化語句)實(shí)現(xiàn)。主要的流程控制語句有if語句、if-else語句、switch語句以及條件表達(dá)式語句等。程序執(zhí)行到選擇結(jié)構(gòu)時(shí),首先進(jìn)行條件判斷,根據(jù)條件成立或不成立分別選擇相應(yīng)的語句執(zhí)行。不管執(zhí)行哪一個(gè)語句,執(zhí)行結(jié)束后,控制語句都轉(zhuǎn)移到同一個(gè)出口結(jié)束。分支結(jié)構(gòu)流程圖如圖所示。127128

分支結(jié)構(gòu)流程圖二、簡單的if語句1.?if語句的定義if語句是根據(jù)所給定的條件決定執(zhí)行的操作,是“二選一”的分支結(jié)構(gòu)語句,用于判斷某些條件是否滿足,若條件滿足,則轉(zhuǎn)移到if語句下的子程序段執(zhí)行,否則向下順序執(zhí)行。if語句的一般形式如下。if(表達(dá)式){

語句;}129if語句的流程圖如圖所示。if語句執(zhí)行流程時(shí),如果表達(dá)式的值為真(非0),則執(zhí)行其后的語句,否則不執(zhí)行。if語句中的表達(dá)式可以是任何能轉(zhuǎn)化為數(shù)值的表達(dá)式,一般為邏輯表達(dá)式或關(guān)系表達(dá)式等。130if語句流程圖2.?設(shè)計(jì)if語句設(shè)計(jì)if語句及其他分支結(jié)構(gòu)語句時(shí),應(yīng)注意以下幾個(gè)問題。(1)正確選擇條件或邏輯表達(dá)式作為分支的判斷條件。(2)根據(jù)需求繪制分支結(jié)構(gòu)流程圖。(3)按流程圖編寫程序。在if語句結(jié)構(gòu)中,對(duì)if語句的設(shè)計(jì)不同,將對(duì)程序的正確邏輯順序產(chǎn)生影響,同時(shí)也影響程序運(yùn)行的效率。當(dāng)if語句后的執(zhí)行語句僅有一條時(shí),可以省略大括號(hào),此時(shí)執(zhí)行語句可以放在“if(表達(dá)式)”語句的后面,也可以放在其下面。131三、if-else語句if-else語句又稱多分支結(jié)構(gòu),是由關(guān)鍵字if和else構(gòu)成的多分支結(jié)構(gòu)語句。if-else語句的一般形式如下。if(表達(dá)式){

語句1;}else{

語句2;}132if-else語句的執(zhí)行規(guī)則是若表達(dá)式的值為真(非0),則進(jìn)入if分支,執(zhí)行語句1,然后跳過else分支,繼續(xù)執(zhí)行else分支之后的語句,否則進(jìn)入else分支,執(zhí)行語句2。if-else語句流程圖如圖所示。當(dāng)語句1和語句2為單語句時(shí)可省略大括號(hào),當(dāng)有多條語句出現(xiàn)時(shí)必須加大括號(hào)。133if-else語句流程圖四、嵌套if語句在if語句中包含一個(gè)或多個(gè)if語句稱為嵌套if語句。嵌套if語句通常在較為復(fù)雜的多流分支結(jié)構(gòu)中使用。嵌套if語句的一般形式如下。if(條件表達(dá)式1){if(條件表達(dá)式2){

語句1;134

}else{

語句2;}}else{

語句3;}135嵌套if語句流程圖如圖所示。136嵌套if語句流程圖五、switch語句switch語句是多分支選擇語句。switch語句的一般形式如下。switch(表達(dá)式){case常量表達(dá)式1:

語句1;break;case常量表達(dá)式2:137

語句2;break;…case常量表達(dá)式n:

語句n;break;default:

語句(n+1);}138switch后面括號(hào)內(nèi)的表達(dá)式的值必須是整數(shù)類型。當(dāng)表達(dá)式值(判斷條件)與某個(gè)case后的常量相同時(shí),執(zhí)行相應(yīng)case分支語句,若無break語句,則一直向下執(zhí)行后面所有的分支語句而不再判斷case后的常量,直到所有case分支語句執(zhí)行完畢或遇到break為止;若有break語句,則直接跳到switch結(jié)構(gòu)的下一條語句執(zhí)行,即switch結(jié)構(gòu)的右大括號(hào)后面。通常情況下,如果不需要特殊的程序流程,對(duì)每個(gè)case分支都增加break語句即可。若所有的case分支中的常量表達(dá)式的值都沒有與switch后面括號(hào)內(nèi)表達(dá)式的值相等的,就執(zhí)行default后面的語句。switch語句流程圖如圖所示。139140switch語句流程圖打印九九乘法表——循環(huán)結(jié)構(gòu)程序的設(shè)計(jì)任務(wù)3141學(xué)習(xí)目標(biāo)1.掌握for循環(huán)語句的結(jié)構(gòu)。2.掌握do-while循環(huán)語句的結(jié)構(gòu)。3.掌握while語句的結(jié)構(gòu)。4.能應(yīng)用循環(huán)語句編寫循環(huán)結(jié)構(gòu)程序。142任務(wù)描述九九乘法表是中國人發(fā)明的用于快速計(jì)算乘法的口訣,早在春秋戰(zhàn)國時(shí)期就已經(jīng)被人們廣泛使用。在小學(xué)階段,背誦使用九九乘法表也是數(shù)學(xué)課中的必學(xué)內(nèi)容。如需要編程輸出打印九九乘法表,直接使用printf()函數(shù)逐個(gè)算式、逐行書寫代碼雖然可以實(shí)現(xiàn),但手動(dòng)輸入9行共45個(gè)算式,顯然是十分煩瑣的。仔細(xì)觀察九九乘法表可以發(fā)現(xiàn),它有很強(qiáng)的規(guī)律性,即它的行數(shù)、乘號(hào)前后的兩個(gè)數(shù)都是按一定規(guī)律遞增。像這種大量而重復(fù)的工作,恰恰是計(jì)算機(jī)程序最擅長解決的問題。輸出九九乘法表這個(gè)問題,用循環(huán)結(jié)構(gòu)設(shè)計(jì)程序就可以快速完成。循環(huán)結(jié)構(gòu)主要通過for、do-while、while等語句實(shí)現(xiàn)。143本任務(wù)的具體要求是用for循環(huán)語句編寫程序,應(yīng)用for循環(huán)語句控制行輸出和列輸出,使用printf()函數(shù)輸出控制格式,實(shí)現(xiàn)行列對(duì)齊,將如下九九乘法表輸出到屏幕上。144相關(guān)知識(shí)一、循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)是C語言3種基本結(jié)構(gòu)之一,是結(jié)構(gòu)化程序設(shè)計(jì)中最重要的結(jié)構(gòu),它的主要功能是重復(fù)執(zhí)行某些語句,解決程序中實(shí)現(xiàn)重復(fù)循環(huán)的問題。通常將重復(fù)執(zhí)行的語句稱為循環(huán)體,循環(huán)體的循環(huán)要在一定條件下終止。循環(huán)結(jié)構(gòu)流程圖如圖所示。145循環(huán)結(jié)構(gòu)流程圖C語言中提供4種循環(huán),即goto循環(huán)、while循環(huán)、do-while循環(huán)和for循環(huán)。4種循環(huán)可以用來處理同一問題,通常情況下它們可以互相替換,但最好不要使用goto循環(huán),因?yàn)閺?qiáng)制改變程序的順序經(jīng)常會(huì)給程序的運(yùn)行帶來不可預(yù)知的錯(cuò)誤。本書主要介紹for循環(huán)、while循環(huán)、do-while循環(huán)這3種循環(huán)結(jié)構(gòu)。146二、循環(huán)語句1.?for循環(huán)語句for循環(huán)語句的使用最為靈活,既可以用于循環(huán)次數(shù)已經(jīng)確定的情況,又可以用于循環(huán)次數(shù)不確定只給出循環(huán)結(jié)束條件的情況。for循環(huán)語句的一般形式如下。for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句;147其中,表達(dá)式1是初始表達(dá)式,用來給循環(huán)變量賦初值,一般是賦值表達(dá)式。也允許在for語句外給循環(huán)變量賦初值,此時(shí)在for循環(huán)語句中可以省略該表達(dá)式。表達(dá)式2是循環(huán)控制表達(dá)式,是循環(huán)條件,一般為關(guān)系表達(dá)式或邏輯表達(dá)式。表達(dá)式3是循環(huán)賦值表達(dá)式,用來修改循環(huán)變量的值,一般是賦值表達(dá)式。這3個(gè)表達(dá)式都可以是逗號(hào)表達(dá)式,即每個(gè)表達(dá)式都可由多個(gè)表達(dá)式組成。一般形式中的“語句”即為循環(huán)體。148for循環(huán)語句的語義如下。(1)計(jì)算表達(dá)式1的值。(2)計(jì)算表達(dá)式2的值,若值為真(非0)則執(zhí)行循環(huán)體一次,否則跳出循環(huán)。(3)循環(huán)體執(zhí)行結(jié)束后,再執(zhí)行表達(dá)式3,修改循環(huán)變量,轉(zhuǎn)回第2步重復(fù)執(zhí)行。在整個(gè)for循環(huán)過程中,表達(dá)式1只計(jì)算一次,表達(dá)式2和表達(dá)式3則可能計(jì)算多次。循環(huán)體可能多次執(zhí)行,也可能一次都不執(zhí)行。149for循環(huán)語句流程圖如圖所示。150for循環(huán)語句流程圖使用for循環(huán)語句時(shí),要注意以下幾點(diǎn)。(1)for循環(huán)語句中的各表達(dá)式都可省略,但分號(hào)間隔符不能少。(2)在循環(huán)變量已賦初值時(shí),可省去表達(dá)式1,如省去表達(dá)式2或表達(dá)式3則將造成無限循環(huán),這時(shí)必須在循環(huán)體內(nèi)添加break語句或exit語句,以強(qiáng)制結(jié)束循環(huán)。

(3)循環(huán)體可以是空語句。1512.?for循環(huán)語句的應(yīng)用【例

】應(yīng)用for循環(huán)語句編寫程序,求1至100自然數(shù)之和。152程序運(yùn)行結(jié)果如圖所示。153程序運(yùn)行結(jié)果3.?while循環(huán)語句while循環(huán)語句的特點(diǎn)是先判斷循環(huán)條件,再根據(jù)條件決定是否執(zhí)行循環(huán)體操作。while循環(huán)語句的一般形式如下。while(表達(dá)式)循環(huán)體;格式中的循環(huán)體可以是單個(gè)語句、空語句,也可以是復(fù)合語句。4.?while循環(huán)語句的應(yīng)用while循環(huán)語句中的表達(dá)式一般是關(guān)系表達(dá)式或邏輯表達(dá)式,只要表達(dá)式的值為真(非0),即可繼續(xù)循環(huán)。1545.?do-while循環(huán)語句do-while循環(huán)語句的執(zhí)行特點(diǎn)是先執(zhí)行循環(huán)體,然后判斷條件,根據(jù)條件決定是否繼續(xù)執(zhí)行循環(huán)。do-while循環(huán)語句的循環(huán)體至少要執(zhí)行一次。do-while循環(huán)語句的一般形式如下。do循環(huán)體while(表達(dá)式);155對(duì)于do-while循環(huán)語句,還應(yīng)注意以下幾點(diǎn)。(1)在for循環(huán)語句、while循環(huán)語句中,表達(dá)式后面都不能加分號(hào),在do-while循環(huán)語句的表達(dá)式后面則必須加分號(hào)。(2)do-while循環(huán)語句也可以組成多重循環(huán),而且也可以和while循環(huán)語句相互嵌套。(3)如果do和while之間的循環(huán)體由多個(gè)語句組成,也必須用“{}”括起來,組成一個(gè)復(fù)合語句。(4)do-while和while循環(huán)語句相互替換時(shí),要注意修改循環(huán)控制條件。1566.?do-while循環(huán)語句的應(yīng)用【例

】分析下列程序,給出運(yùn)行結(jié)果,并與上機(jī)運(yùn)行結(jié)果相比較。157循環(huán)體的輸出語句中,先執(zhí)行“x-=2”,然后輸出x的值,此時(shí)x的值為1。在判斷循環(huán)條件“!(--x)”時(shí),首先x的值減1,循環(huán)判斷條件變?yōu)?0。既然0表示假,則!0表示真,循環(huán)繼續(xù),此時(shí)x值為0。繼續(xù)執(zhí)行循環(huán)體的輸出語句,執(zhí)行“x-=2”之后,x值為-2。循環(huán)條件“!(--x)”不成立,停止循環(huán),x值為-3。執(zhí)行最后一句“printf("%d\n",x-=2);”輸出x值-5。程序運(yùn)行結(jié)果如圖所示。158程序運(yùn)行結(jié)果for循環(huán)語句也可與while語句、do-while循環(huán)語句相互嵌套,構(gòu)成多重循環(huán)。以下都是合法的嵌套。159160輸出4×4矩陣——數(shù)組的使用任務(wù)4161學(xué)習(xí)目標(biāo)1.理解一維數(shù)組、二維數(shù)組的基本概念。2.掌握數(shù)組類型變量的定義與引用。3.掌握數(shù)組元素的引用。4.能運(yùn)用數(shù)組編寫程序。162任務(wù)描述某公司要將全體員工的月薪發(fā)放信息建立電子檔案,如果只有5名員工,可以使用5個(gè)同類型變量。例如使用語句“intmark0,mark1,mark2,mark3,mark4;”定義5個(gè)整型變量,可以存放5名員工的信息,如果是幾百人、幾千人甚至幾萬人的大公司,則不可能這么一直寫下去。在實(shí)際程序設(shè)計(jì)和代碼編寫中,經(jīng)常會(huì)用到大批同類型數(shù)據(jù),處理這些數(shù)據(jù)要占用一大片連續(xù)內(nèi)存空間,于是數(shù)組應(yīng)運(yùn)而生。163用C語言提供的數(shù)組這一數(shù)據(jù)結(jié)構(gòu),可以很方便地解決大批同類型數(shù)據(jù)處理問題,這里的數(shù)據(jù)結(jié)構(gòu),可理解為數(shù)據(jù)的存放和管理方式。學(xué)習(xí)數(shù)組要思路清晰,循序漸進(jìn)。本任務(wù)要求了解一維數(shù)組、二維數(shù)組的基本概念,掌握數(shù)組類型變量的定義與引用,掌握數(shù)組元素的引用。本任務(wù)的具體要求為某班級(jí)一個(gè)學(xué)習(xí)小組4人,共同參加4門考試。編寫程序,輸入每名學(xué)生4門課程的成績,輸出小組每門課的平均成績。164相關(guān)知識(shí)數(shù)組是一些具有相同數(shù)據(jù)類型(如整數(shù)型、實(shí)數(shù)型、字符型等)的變量的有序集合。其特點(diǎn)是變量數(shù)量固定、元素?cái)?shù)據(jù)類型相同。和普通變量一樣,聲明一個(gè)數(shù)組時(shí),編譯器為數(shù)組分配內(nèi)存存儲(chǔ)空間,數(shù)組占據(jù)的內(nèi)存空間是連續(xù)的,因此,很容易計(jì)算數(shù)組占據(jù)的內(nèi)存大小和每個(gè)元素對(duì)應(yīng)的內(nèi)存首地址。所謂內(nèi)存首地址就是用于存放每個(gè)元素的內(nèi)存空間中第一個(gè)字節(jié)的內(nèi)存地址。知道元素內(nèi)存首地址和元素占據(jù)內(nèi)存的大小,計(jì)算機(jī)才可以計(jì)算出該元素所占據(jù)的內(nèi)存空間,才可以正確訪問該元素。對(duì)于不同數(shù)據(jù)類型的數(shù)組,元素所占據(jù)的內(nèi)存大小也不同,通常用sizeof運(yùn)算符計(jì)算特定類型元素所占據(jù)的內(nèi)存大小。165如果第1個(gè)元素在內(nèi)存中的地址為p,那么第M個(gè)元素(M不大于N)在內(nèi)存中的地址可表示為表達(dá)式“p+(M-1)*sizeof(short)”。常用的數(shù)組種類有一維數(shù)組、二維數(shù)組和三維數(shù)組等。其中一維數(shù)組用單下標(biāo)表示,二維數(shù)組用雙下標(biāo)表示。本任務(wù)將重點(diǎn)介紹一維數(shù)組和二維數(shù)組。166一、一維數(shù)組一維數(shù)組是用以存儲(chǔ)一維數(shù)列中數(shù)據(jù)的集合。一維數(shù)組也稱向量,用以組織具有一維順序關(guān)系的一組同類型數(shù)據(jù)。1.?一維數(shù)組的定義一維數(shù)組定義的一般形式如下。類型說明符

數(shù)組名[常量表達(dá)式];其中,“類型說明符”表示數(shù)組中所有元素的類型,可以是任意一種簡單類型、構(gòu)造類型或指針?!皵?shù)組標(biāo)識(shí)符”表示這個(gè)數(shù)組型變量的名稱,也稱數(shù)組名,命名規(guī)則與變量名一致。中括號(hào)(方括號(hào))“[]”是數(shù)組標(biāo)志,同時(shí)也是數(shù)組的重要組成部分,不能缺少。167“常量表達(dá)式”是中括號(hào)內(nèi)的表達(dá)式,必須是正的整型常量表達(dá)式,通常是一個(gè)整型常量。常量表達(dá)式定義了數(shù)組中存放的數(shù)據(jù)元素的個(gè)數(shù),即數(shù)組長度。如表達(dá)式“a[5]”中的5表示數(shù)組中有5個(gè)元素,下標(biāo)從0開始,到4結(jié)束。例如,定義一個(gè)一維數(shù)組可使用語句“inta[5];”,該代碼中的int表示數(shù)組元素的類型,a表示數(shù)組名,中括號(hào)中的5表示數(shù)組中包含的元素個(gè)數(shù)。在數(shù)組a[5]中只能引用a[0]、a[1]、a[2]、a[3]、a[4]而不能使用a[5],若使用a[5]會(huì)出現(xiàn)下標(biāo)越界的錯(cuò)誤。1682.?一維數(shù)組的初始化初始化數(shù)組是在定義數(shù)組變量的同時(shí)給其中的數(shù)組元素賦值。一維數(shù)組初始化的一般形式如下。類型說明符

數(shù)組名[常量表達(dá)式]={值1,值2,…,值

n};定義數(shù)組時(shí)可直接對(duì)全部的數(shù)組元素賦初值,即全部初始化。例如,初始化一維數(shù)組a的語句如下。該語句是將數(shù)組中的元素值依次放在一對(duì)大括號(hào)中,每個(gè)值之間用逗號(hào)分隔。經(jīng)過定義和初始化之后,

數(shù)組中的元素為a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5,a[5]=6。169二、二維數(shù)組下圖中的數(shù)組表示一個(gè)大小為M+1的一維數(shù)組,下圖中的數(shù)組表示一個(gè)大小為(M+1)*(N+1)的二維數(shù)組。170

一維數(shù)組二維數(shù)組1.?二維數(shù)組的定義二維數(shù)組的定義和一維數(shù)組類似,只是比一維數(shù)組多了一個(gè)常量表達(dá)式。二維數(shù)組定義的一般形式如下。數(shù)據(jù)類型說明符

數(shù)組名[常量表達(dá)式1][常量表達(dá)式2];其中“常量表達(dá)式1”表示第一維下標(biāo)的長度,“常量表達(dá)式2”表示第二維下標(biāo)的長度。對(duì)于二維數(shù)組array[n][m],其行下標(biāo)的取值范圍0~n-1,其列下標(biāo)的取值范圍0~m-1,該二維數(shù)組最大下標(biāo)元素是array[n-1][m-1]。1712.?二維數(shù)組的引用與一維數(shù)組相同,定義了二維數(shù)組后就可以用它存儲(chǔ)數(shù)據(jù)、管理數(shù)據(jù)。二維數(shù)組的元素也稱為雙下標(biāo)變量。引用二維數(shù)組元素的一般形式如下。數(shù)組名[下標(biāo)][下標(biāo)];下標(biāo)可以是整型常量或整型表達(dá)式,例如,對(duì)一個(gè)二維數(shù)組的元素進(jìn)行引用可使用表達(dá)式“a[1][2]”。1723.?二維數(shù)組的初始化二維數(shù)組同樣可以在聲明時(shí)利用初始值表進(jìn)行元素的初始化。二維數(shù)組還可以在初始化表達(dá)式中,加內(nèi)層大括號(hào)代表一行。此外,二維數(shù)組可對(duì)部分元素進(jìn)行初始化。將一個(gè)二維數(shù)組中全部元素初始化為0的最簡單的方式是使用語句“intnum[2][3]={0};”。當(dāng)聲明語句中提供全部元素的初始值時(shí),第1維的大小可以缺省。173在定義數(shù)組的同時(shí)對(duì)其進(jìn)行初始化,初始值表中的初值個(gè)數(shù)要少于或等于數(shù)組的長度。當(dāng)初值個(gè)數(shù)少于數(shù)組的長度時(shí),一維數(shù)組只能初始化前幾個(gè)元素,二維數(shù)組的初始化可跳過某些中間元素,給后面的元素賦值。數(shù)組元素在內(nèi)存中是連續(xù)排列的,對(duì)二維和更高維的方式,數(shù)組元素仍然是線性連續(xù)排列的,不同下標(biāo)的關(guān)系類似于數(shù)字的不同位數(shù),最左邊的下標(biāo)變化最慢,最右邊的下標(biāo)變化最快,理解數(shù)組的內(nèi)存模型有利于寫出高質(zhì)量的代碼。174設(shè)計(jì)“計(jì)算器”——函數(shù)的使用任務(wù)5175學(xué)習(xí)目標(biāo)1.熟練掌握函數(shù)的定義和調(diào)用,能使用函數(shù)嵌套調(diào)用和遞歸調(diào)用編寫程序。2.能正確使用形式參數(shù)和實(shí)際參數(shù)。3.理解內(nèi)部函數(shù)和外部函數(shù)的概念。4.掌握返回語句的用法。5.了解庫函數(shù)的應(yīng)用。176任務(wù)描述數(shù)學(xué)計(jì)算涉及公式或函數(shù),數(shù)學(xué)中的函數(shù)是指對(duì)任何一個(gè)變量x,都有一個(gè)y值與之對(duì)應(yīng),例如“y=x+1”。在C語言中,函數(shù)有更重要的意義,它不僅能計(jì)算,而且是程序的基本組成單位。本任務(wù)調(diào)用自定義函數(shù)設(shè)計(jì)“計(jì)算器”,展示、體現(xiàn)C語言中函數(shù)的功能及其應(yīng)用。本任務(wù)承載著C語言學(xué)習(xí)的重點(diǎn),從函數(shù)的概念、定義入手,通過實(shí)例深入學(xué)習(xí)函數(shù)的調(diào)用與返回、函數(shù)的參數(shù)傳遞機(jī)制;應(yīng)用函數(shù)解決實(shí)際問題,進(jìn)一步學(xué)習(xí)模塊化編程的方法。本任務(wù)的具體要求為編寫一個(gè)“計(jì)算器”程序,調(diào)用自定義函數(shù),實(shí)現(xiàn)分?jǐn)?shù)的加、減、乘、除4種運(yùn)算,測(cè)試并輸出“”的值。177相關(guān)知識(shí)一、函數(shù)1.?函數(shù)的概念函數(shù)是C程序的基本組成部分,完整的C程序由一個(gè)或多個(gè)函數(shù)組成??梢詫⒑瘮?shù)視為具備實(shí)現(xiàn)C語言某種功能的模塊,C語言也可稱為函數(shù)式語言。1782.?模塊化編程的理念C語言編寫的程序,只是入口和出口位于主函數(shù)之中,并不是所有的內(nèi)容都放在主函數(shù)中。通常情況下可以將一個(gè)程序劃分成若干個(gè)模塊,每一個(gè)模塊完成一部分功能,C程序的功能通過函數(shù)之間的調(diào)用來實(shí)現(xiàn)。不同的程序模塊可以由不同的人來完成,目的是方便規(guī)劃、編寫和調(diào)試,提高軟件開發(fā)效率。C語言中函數(shù)之間的關(guān)系是平行的,函數(shù)在被定義的時(shí)候是相互獨(dú)立的,在一個(gè)函數(shù)中不能再定義其他函數(shù)(稱為嵌套函數(shù))。函數(shù)之間是相互調(diào)用的關(guān)系,main()函數(shù)不能被調(diào)用。179二、函數(shù)的定義與聲明1.?函數(shù)的定義C程序中,函數(shù)定義的目的是讓編譯器知道函數(shù)的功能,函數(shù)的定義包括系統(tǒng)提供的標(biāo)準(zhǔn)函數(shù)和程序員自定義函數(shù)。系統(tǒng)提供的標(biāo)準(zhǔn)函數(shù)無須程序員定義,只需將包含該函數(shù)聲明的頭文件加在程序開頭,該函數(shù)就可以直接使用。函數(shù)定義有參數(shù)列表、返回類型、函數(shù)名和函數(shù)體4個(gè)要素。參數(shù)列表和返回類型對(duì)應(yīng)著數(shù)據(jù)的輸入輸出,函數(shù)名用于和程序中其他程序?qū)嶓w區(qū)分,函數(shù)體是一段可執(zhí)行的代碼塊,實(shí)現(xiàn)特定的算法或功能。180函數(shù)定義的一般形式如下。返回類型

函數(shù)名(參數(shù)列表){

函數(shù)體;}(1)參數(shù)列表。參數(shù)列表的一般形式如下。類型

變量名1,類型

變量名2,類型

變量名3,…若參數(shù)列表為空,需在括號(hào)內(nèi)注明void,告訴編譯器沒有參數(shù)。181(2)返回類型。返回類型用于指明函數(shù)輸出值的類型,如果沒有輸出值,返回類型為void。如果在函數(shù)定義時(shí)沒有注明返回類型,默認(rèn)為int。(3)函數(shù)名。函數(shù)名用于標(biāo)識(shí)該函數(shù),使之與其他函數(shù)區(qū)分開來,因此,函數(shù)名必須是合乎編譯器命名規(guī)則的標(biāo)識(shí)符。參數(shù)列表、返回類型和函數(shù)名統(tǒng)稱函數(shù)頭,與之對(duì)應(yīng)的是函數(shù)體。182(4)函數(shù)體。函數(shù)體是一段用于實(shí)現(xiàn)特定功能的代碼塊,比如局部變量聲明和其他執(zhí)行語句等。在函數(shù)體內(nèi)聲明的變量不能和參數(shù)列表中的變量同名。函數(shù)的定義是平行的,包括main()函數(shù)在內(nèi)。所謂“平行”,有兩層含義:一是不允許把一個(gè)函數(shù)定義在另一個(gè)函數(shù)內(nèi),即函數(shù)定義要在main()函數(shù)外部;二是函數(shù)定義放置的位置與main()函數(shù)無關(guān),即函數(shù)定義可以在main()函數(shù)之前,也可以在main()函數(shù)之后。183定義一個(gè)函數(shù)是為了調(diào)用,函數(shù)調(diào)用有兩種情況,第一種情況是“先定義,后調(diào)用”,第二種情況是“函數(shù)聲明+函數(shù)調(diào)用”?!跋榷x,后調(diào)用”是指函數(shù)定義和調(diào)用語句在同一個(gè)文件內(nèi),編譯器從函數(shù)定義中提取函數(shù)的參數(shù)列表、輸出類型等接口信息。1842.?函數(shù)的聲明函數(shù)調(diào)用第二種情況是“函數(shù)聲明+函數(shù)調(diào)用”,大多數(shù)情況下,函數(shù)的定義與函數(shù)的調(diào)用不在一個(gè)文件中,或者在一個(gè)文件中,調(diào)用在前,定義在后,這就需要在調(diào)用之前對(duì)函數(shù)聲明,告訴編譯器有此函數(shù)存在。函數(shù)聲明一般形式如下。返回類型

函數(shù)名(參數(shù)列表);例如語句“intmul(intx,inty);”。函數(shù)的聲明應(yīng)與此函數(shù)頭保持一致,否則,編譯器會(huì)報(bào)錯(cuò)。1853.?函數(shù)定義與聲明的區(qū)別(1)含義。函數(shù)的定義是用語句創(chuàng)建、編寫一個(gè)具有名字的新函數(shù),實(shí)現(xiàn)具體的函數(shù)功能。函數(shù)聲明是當(dāng)函數(shù)被調(diào)用時(shí),需要在調(diào)用之前對(duì)函數(shù)聲明,告訴編譯器有此函數(shù)存在。186(2)語法格式。函數(shù)定義的一般形式如下。返回類型

函數(shù)名(參數(shù)列表){

函數(shù)體;}函數(shù)聲明的一般形式如下。返回類型

函數(shù)名(參數(shù)列表);(3)與主函數(shù)的位置。函數(shù)的定義可以在主函數(shù)前,也可以在主函數(shù)后。函數(shù)的聲明必須在主函數(shù)前。187三、函數(shù)的返回機(jī)制1.?遇到“}”后返回函數(shù)返回的第一種方式是程序從開頭一直執(zhí)行到最后一句,當(dāng)所有語句都執(zhí)行完畢并遇到“}”后返回。1882.?返回語句定義函數(shù)是為了調(diào)用,以實(shí)現(xiàn)特定的功能。通常函數(shù)調(diào)用的目的是希望能夠得到一個(gè)計(jì)算結(jié)果,這就是函數(shù)的返回值。返回語句的一般形式如下。return(表達(dá)式);/*括號(hào)可以省略*/(1)在沒有返回值的函數(shù)中執(zhí)行返回語句“return0;”能立即結(jié)束所在的函數(shù)執(zhí)行,返回到調(diào)用的程序中去。(2)返回語句能夠?qū)⒑瘮?shù)返回值賦值給調(diào)用的表達(dá)式。(3)返回值類型以函數(shù)定義時(shí)返回值類型為準(zhǔn),系統(tǒng)默認(rèn)返回值類型為整型,返回值類型為void型的函數(shù)沒有返回值。189素?cái)?shù)是指除了1和它本身以外不再有其他因數(shù)的自然數(shù)。該程序中要求判斷素?cái)?shù),基本思路是自定義函數(shù)1sprime,該函數(shù)有一個(gè)整型參數(shù)num,函數(shù)的返回值表示num是否為素?cái)?shù)判斷結(jié)果,1表示num為素?cái)?shù),0表示num不是素?cái)?shù),返回值類型為整型。函數(shù)體通過循環(huán)判斷num是否存在整除的數(shù)據(jù),如果存在返回0,反之返回1。返回值由return()函數(shù)帶回到main()函數(shù)中。190四、函數(shù)的參數(shù)及其傳遞方式函數(shù)調(diào)用操作時(shí),多數(shù)情況下,主調(diào)函數(shù)和被調(diào)函數(shù)之間是數(shù)據(jù)傳遞關(guān)系。函數(shù)間通過參數(shù)傳遞數(shù)據(jù),函數(shù)利用接收的數(shù)據(jù)進(jìn)行操作。1.?形式參數(shù)和實(shí)際參數(shù)調(diào)用函數(shù)時(shí),涉及兩種參數(shù),即形式參數(shù)和實(shí)際參數(shù),兩者之間有聯(lián)系又有區(qū)別。(1)通過名稱理解。形式參數(shù)是形式上存在的參數(shù)。實(shí)際參數(shù)是實(shí)際存在的參數(shù)。191(2)通過作用理解。形式參數(shù)是指在定義函數(shù)時(shí),函數(shù)名后面括號(hào)中的變量,簡稱形參。在函數(shù)調(diào)用之前,傳遞給函數(shù)的值將被復(fù)制到這些形式參數(shù)中。實(shí)際參數(shù)是指在調(diào)用一個(gè)函數(shù)時(shí),也就是真正使用一個(gè)函數(shù)時(shí),函數(shù)名后面括號(hào)中的參數(shù),簡稱實(shí)參。函數(shù)的調(diào)用者提供給函數(shù)的參數(shù)就是實(shí)際參數(shù)。實(shí)際參數(shù)是表達(dá)式計(jì)算的結(jié)果,并且被復(fù)制給主調(diào)函數(shù)的形式參數(shù)。1922.?數(shù)組做函數(shù)參數(shù)【例

】編寫程序,定義一個(gè)數(shù)組,將賦值后的數(shù)組元素作為函數(shù)的實(shí)參進(jìn)行傳遞,當(dāng)函數(shù)的形參得到實(shí)參傳遞的數(shù)值后,將這些數(shù)值輸出。193程序運(yùn)行結(jié)果如圖所示。該程序在main()函數(shù)之前聲明需調(diào)用的函數(shù)。在main()函數(shù)的開始位置定義一個(gè)整型的數(shù)組和一個(gè)整型變量i,使用for語句,以變量i作為條件進(jìn)行循環(huán),對(duì)數(shù)組中的元素賦值,并且作為數(shù)組的下標(biāo)制定數(shù)組元素的位置。使用自定義的ShowMember()函數(shù)顯示數(shù)據(jù)。194

程序運(yùn)行結(jié)果數(shù)組名作為參數(shù)時(shí),數(shù)組的長度是不需要說明的(多余的說明可能導(dǎo)致編譯出錯(cuò))。因?yàn)楫?dāng)數(shù)組名作為函數(shù)參數(shù)時(shí),主調(diào)函數(shù)向被調(diào)用函數(shù)傳遞的并不是整個(gè)數(shù)組的所有元素值,而僅僅是這個(gè)數(shù)組的內(nèi)存首地址。由于數(shù)組在內(nèi)存中是順序存儲(chǔ),知道數(shù)組的首地址和元素的數(shù)據(jù)類型,計(jì)算機(jī)就可以計(jì)算出數(shù)組中任一個(gè)元素的內(nèi)存位置。195使用數(shù)組做函數(shù)參數(shù)時(shí)注意以下幾點(diǎn)。(1)用數(shù)組名做參數(shù),應(yīng)該在主調(diào)函數(shù)中定義數(shù)組。(2)實(shí)參數(shù)組與形參數(shù)組類型應(yīng)一致。(3)形參數(shù)組也可以不指定大小,在定義數(shù)組時(shí)在數(shù)組名后面跟一個(gè)空的中括號(hào)。(4)用數(shù)組名作函數(shù)參數(shù)時(shí),不是把數(shù)組元素的值傳遞給形參,而是把實(shí)參數(shù)組的起始地址傳遞給形參數(shù)組。196五、函數(shù)的調(diào)用方式在現(xiàn)實(shí)工作中,為了完成某項(xiàng)特殊的工作,需要一些特殊的工具,要先制作這個(gè)工具,然后使用。自定義函數(shù)就是用來完成編程工作的特殊工具,需要先定義,后使用,其使用的過程就是函數(shù)的調(diào)用。1.?函數(shù)的語句調(diào)用函數(shù)的語句調(diào)用是把函數(shù)作為一個(gè)語句進(jìn)行調(diào)用。函數(shù)的語句調(diào)用是最常用的調(diào)用函數(shù)的方式。函數(shù)的語句調(diào)用一般形式為函數(shù)加上分號(hào)。1972.?函數(shù)的表達(dá)式調(diào)用函數(shù)的表達(dá)式調(diào)用是指函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這時(shí)要求函數(shù)返回一個(gè)確定的值,這個(gè)值參加表達(dá)式的運(yùn)算。3.?函數(shù)的參數(shù)調(diào)用函數(shù)的參數(shù)調(diào)用是把函數(shù)作為另一個(gè)函數(shù)的實(shí)際參數(shù)調(diào)用,將函數(shù)返回值作為實(shí)際參數(shù)傳遞到函數(shù)中使用。函數(shù)的參數(shù)調(diào)用要求被調(diào)用函數(shù)必須有返回值。又如以下語句把調(diào)用函數(shù)max()的返回值作為printf()函數(shù)的實(shí)參來使用。1984.?函數(shù)的嵌套調(diào)用C語言中,函數(shù)的定義是互相平行、獨(dú)立的,定義函數(shù)時(shí),函數(shù)內(nèi)部不能再定義另一個(gè)函數(shù)。C語言不能嵌套定義函數(shù),但是允許嵌套調(diào)用函數(shù)。一個(gè)函數(shù)既可以被其他函數(shù)調(diào)用,也可以調(diào)用別的函數(shù),這就是函數(shù)的嵌套調(diào)用。嵌套調(diào)用函數(shù)的目的是完成某程序的子程序中某項(xiàng)功能,如同實(shí)際工作中逐級(jí)分配布置具體任務(wù)。199例如,學(xué)校里有許多項(xiàng)具體工作,校長把專業(yè)教學(xué)任務(wù)分配給各個(gè)學(xué)院,各院長把不同學(xué)科教學(xué)任務(wù)分配給各個(gè)教研室,各個(gè)教研室主任把具體學(xué)科教學(xué)任務(wù)分配給每位教師,每位教師按照教學(xué)要求完成教學(xué)任務(wù)。其過程如圖所示。200分配教學(xué)任務(wù)5.?函數(shù)的遞歸調(diào)用一個(gè)函數(shù)直接或間接調(diào)用該函數(shù)本身稱為函數(shù)的遞歸調(diào)用。函數(shù)的遞歸調(diào)用是C語言重要特點(diǎn)之一,當(dāng)一個(gè)問題具有遞歸關(guān)系時(shí),采用遞歸調(diào)用方式將使被處理的問題變得簡潔。201六、內(nèi)部函數(shù)與外部函數(shù)的使用1.?內(nèi)部函數(shù)內(nèi)部函數(shù)又稱為靜態(tài)函數(shù),它只能在定義它的文件中被調(diào)用,而不能被其他文件中的函數(shù)調(diào)用。如果在不同的文件中有同名的內(nèi)部函數(shù),這些同名的函數(shù)是互不干擾的。在定義內(nèi)部函數(shù)時(shí),要在函數(shù)返回值類型和函數(shù)名前面加上static作為關(guān)鍵字。定義內(nèi)部函數(shù)一般形式如下。static返回值類型

函數(shù)名(參數(shù)列表)2022.?外部函數(shù)函數(shù)在本質(zhì)上都具有外部性質(zhì),除了內(nèi)部函數(shù)之外,其余的函數(shù)都可以被其他文件中的函數(shù)調(diào)用。稱這樣的函數(shù)為外部函數(shù)。為了明確這種性質(zhì),可以在函數(shù)定義和調(diào)用時(shí)使用關(guān)鍵字extern進(jìn)行修飾。在使用一個(gè)外部函數(shù)時(shí),要先用關(guān)鍵字extern聲明所用的函數(shù)是外部函數(shù)。例如,函數(shù)頭可以寫成下面的形式。externAdd(intiNuml,intiNum2);這樣函數(shù)Add就可以被其他源文件調(diào)用。203七、庫函數(shù)的應(yīng)用1.?數(shù)學(xué)函數(shù)數(shù)學(xué)函數(shù)是C語言編譯系統(tǒng)提供的一種庫函數(shù)。在編寫C程序中經(jīng)常會(huì)應(yīng)用數(shù)學(xué)函數(shù)進(jìn)行求值運(yùn)算,得到數(shù)學(xué)函數(shù)的雙精度返回值。在使用數(shù)學(xué)函數(shù)時(shí),要先包含頭文件math.h。代碼中,先定義用來保存計(jì)算結(jié)果的變量,然后得到結(jié)果,最后通過輸出語句將結(jié)果輸出。數(shù)學(xué)函數(shù)功能眾多,例如,求絕對(duì)值的函數(shù)有abs()函數(shù)、labs()函數(shù)和fabs()函數(shù)三種。其中,abs()函數(shù)的功能是求整數(shù)絕對(duì)值,labs()函數(shù)的功能是求長整型絕對(duì)值,fabs()函數(shù)的功能是求浮點(diǎn)數(shù)(小數(shù))絕對(duì)值。2042.?字符檢測(cè)函數(shù)字符檢測(cè)函數(shù)也是C語言編譯系統(tǒng)提供的一種庫函數(shù)。在編寫C程序時(shí)用于檢測(cè)字母或檢測(cè)數(shù)字等,得到檢測(cè)的返回值。在使用字符檢測(cè)函數(shù)時(shí),要先引用頭文件ctype.h。常用的字符檢測(cè)函數(shù)有以下幾種。(1)isdigit()函數(shù)isdigit()函數(shù)的作用是測(cè)試字符是否為阿拉伯?dāng)?shù)字。其函數(shù)定義語句為“intisdigit(intc);”,其中只有參數(shù)c為阿拉伯?dāng)?shù)字0到9時(shí)才能返回真。205206(2)isalpha()函數(shù)isalpha()函數(shù)的作用是測(cè)試字符是否為英文字母,其函數(shù)定義語句為“intisalpha(intc);”。(3)isalnum()函數(shù)isalnum()函數(shù)的作用是測(cè)試字符是否為英文字母或數(shù)字,其函數(shù)定義語句為“intisalnum(intc);”,相當(dāng)于使用表達(dá)式“isalpha(c)||isdigit(c)”做測(cè)試。在編寫C程序時(shí),首先盡量考慮使用庫函數(shù),然后再考慮使用自定義函數(shù)。正確和靈活運(yùn)用庫函數(shù)能提高程序的質(zhì)量和編寫速度。按順序輸出10種水果名稱——指針的使用任務(wù)6207學(xué)習(xí)目標(biāo)1.掌握指針與地址的概念。2.掌握指針變量的定義、初始化及指針的運(yùn)算。3.掌握指針作為函數(shù)參數(shù)的應(yīng)用。4.掌握指針與數(shù)組、指針數(shù)組、二級(jí)指針等知識(shí)。208任務(wù)描述運(yùn)用指針編程是C語言主要的風(fēng)格之一。利用指針變量可以操作各種數(shù)據(jù)結(jié)構(gòu),很方便地使用數(shù)組和字符串,從而編寫出精練而高效的程序,指針豐富了C語言的功能。本任務(wù)是運(yùn)用指針變量輸入10種水果名稱,并按字母先后順序排列后輸出。本任務(wù)具體要求是以字符串的形式隨機(jī)輸入不同的水果名,應(yīng)用指針數(shù)組等知識(shí)編寫程序,把輸入的水果名稱排序,再按字母先后順序輸出這些水果名稱。209相關(guān)知識(shí)一、C語言中地址與指針的概念1.?地址的概念計(jì)算機(jī)中的數(shù)據(jù)存放在存儲(chǔ)器中,一般把存儲(chǔ)器中的一個(gè)或幾個(gè)字節(jié)稱為一個(gè)內(nèi)存單元,不同的數(shù)據(jù)類型所占用的內(nèi)存單元數(shù)不等,為了正確地訪問這些內(nèi)存單元,必須為每個(gè)內(nèi)存單元編上號(hào),根據(jù)一個(gè)內(nèi)存單元的編號(hào)就可以準(zhǔn)確地找到該內(nèi)存單元,內(nèi)存單元的編號(hào)也稱地址。一個(gè)內(nèi)存地址可能包含多個(gè)內(nèi)存單元。2102.?指針的基本概念指針是簡單變量、數(shù)組、函數(shù)等某個(gè)對(duì)象所占用的存儲(chǔ)單元的首地址。專門用來存放某種類型變量的首地址(指針值)的變量稱為該種類型的指針變量。對(duì)于一個(gè)內(nèi)存單元來說,內(nèi)存單元的地址即為指針,其中存放的數(shù)據(jù)是該內(nèi)存單元的內(nèi)容,內(nèi)存單元的指針和內(nèi)存單元的內(nèi)容是兩個(gè)不同的概念。211指針變量是C語言中數(shù)據(jù)類型的特殊變量,一個(gè)指針值是一個(gè)地址,一個(gè)指針變量可以被賦予不同的指針值。指針不僅可以是變量的地址,還可以是數(shù)組、數(shù)組元素、函數(shù)的地址。正確地使用指針,能夠有效地表示和處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu),特別有利于對(duì)動(dòng)態(tài)數(shù)據(jù)的管理。指針的概念比較復(fù)雜,而且用法也非常靈活,要想真正掌握它,就必須多思考、多實(shí)踐。212二、指針變量的定義和引用1.?指針變量的定義定義指針變量的目的是通過指針去訪問內(nèi)存單元。指針變量的值不僅可以是變量的地址,也可以是其他數(shù)據(jù)結(jié)構(gòu)的地址。在C語言中,一種數(shù)據(jù)類型或數(shù)據(jù)結(jié)構(gòu)往往都占有一組連續(xù)的內(nèi)存單元。用“地址”這個(gè)概念并不能很好地描述一種數(shù)據(jù)類型或數(shù)據(jù)結(jié)構(gòu),而“指針”雖然實(shí)際上也是一個(gè)地址,但它卻是一個(gè)數(shù)據(jù)結(jié)構(gòu)的首地址,它是“指向”一個(gè)數(shù)據(jù)結(jié)構(gòu)的,因而概念更為清楚,表示更為明確。213定義指針變量的一般形式如下。類型說明符*指針變量名;其中,“類型說明符”表示本指針變量所指向的變量的數(shù)據(jù)類型;“*”表示這是一個(gè)指針變量。一個(gè)指針變量只能指向同類型的變量,例如,v1定義為指向浮點(diǎn)型變量的指針后,不能時(shí)而指向一個(gè)浮點(diǎn)型變量,時(shí)而又指向一個(gè)字符型變量。214指針變量指向的變量要預(yù)先定義。指針變量的定義語句及其含義見下表。215指針變量的定義語句及其含義2.?指針變量的引用(1)指針運(yùn)算符。指針運(yùn)算符包括取地址運(yùn)算符“&”和取內(nèi)容運(yùn)算符“*”。取地址運(yùn)算符“&”是單目運(yùn)算符,其結(jié)合性為右結(jié)合性,其功能是取變量的地址。取內(nèi)容運(yùn)算符“*”是單目運(yùn)算符,其結(jié)合性為右結(jié)合性,用來表示指針變量所指的變量。需要注意的是指針運(yùn)算符“*”和指針變量定義中的指針說明符“*”是不同的,在指針變量定義中出現(xiàn)的“*”是類型說明符,表示其后的變量是指針類型,而在表達(dá)式中出現(xiàn)的“*”則是一個(gè)指針運(yùn)算符,表示指針變量所指的變量,即通過指針變量間接訪問指針指向的變量。216例如,i_pointer代表指針變量,而*i_pointer是i_pointer所指向變量的值,因此,下面兩個(gè)語句作用相同。第一個(gè)語句的含義是將8賦給變量i,第二個(gè)語句的含義是將8賦給指針變量i_pointer所指向的變量。指針變量同普通變量一樣,使用之前不僅要定義,而且必須賦予具體的值。指針變量的賦值只能賦予有效地址。217若指向整型變量的指針變量為a,把整型變量b的地址賦予a有兩種方式,即指針變量初始化的方式和賦值語句的方式。指針變量初始化的語句如下。賦值語句如下。218語句“inta=1,*b=&a;”中的“*b=&a;”表示指針變量b獲取了整型變量a的地址?!皃rintf("%d",*b);”語句表示輸出變量a的值。指針變量和一般變量一樣,其存儲(chǔ)的值是可以改變的。這時(shí)如果執(zhí)行賦值表達(dá)式“p2=p1”,就使p2與p1指向同一對(duì)象i,此時(shí)“*p2”就等價(jià)于i,而不是j。如果執(zhí)行表達(dá)式“*p2=*p1;”,則表示把p1指向的內(nèi)容賦給p2所指的區(qū)域。219(2)指針變量的運(yùn)算。1)賦值運(yùn)算。指針變量的賦值運(yùn)算,有以下幾種形式。①指針變量初始化賦值,例如以下語句。②把一個(gè)變量的地址賦予指向相同數(shù)據(jù)類型的指針變量,例如以下語句。220③把一個(gè)指針變量的值賦予指向相同類型變量的另一個(gè)指針變量,例如以下語句。④把數(shù)組的首地址賦予指向數(shù)組的指針變量,例如以下語句。221⑤把字符串的首地址賦予指向字符類型的指針變量,例如以下語句?;蛴贸跏蓟x值的方法寫為以下語句。⑥把函數(shù)的首地址賦予指向函數(shù)的指針變量,例如以下語句。2222)加減算術(shù)運(yùn)算。數(shù)組指針變量向前或向后移動(dòng)一個(gè)位置和地址加1或減1在概念上是不同的。因?yàn)閿?shù)組可以有不同的類型,各種類型的數(shù)組元素所占的字節(jié)長度是不同的,指針變量的加減運(yùn)算只能對(duì)數(shù)組指針變量進(jìn)行,對(duì)指向其他類型變量的指針變量作加減運(yùn)算是無意義的,例如以下語句。2233)兩個(gè)指針變量之間的運(yùn)算。只有指向同一數(shù)組的兩個(gè)指針變量之間才能進(jìn)行運(yùn)算,否則運(yùn)算無意義。兩指針變量進(jìn)行關(guān)系運(yùn)算是指向同一數(shù)組的兩指針變量進(jìn)行關(guān)系運(yùn)算,表示它們所指數(shù)組元素之間的位置關(guān)系。指針變量還可以與0比較。對(duì)指針變量賦0值和不賦值是不同的。指針變量未賦值時(shí),可以是任意值,它指向的是臟數(shù)據(jù)(未經(jīng)驗(yàn)證或不符合預(yù)期格式的數(shù)據(jù))。指針變量賦0值后,可以使用,只是它不指向具體的變量。224三、指針和函數(shù)1.?指針作為函數(shù)參數(shù)函數(shù)的參數(shù)不僅可以是整型、實(shí)型、字符型等數(shù)據(jù),還可以是指針類型數(shù)據(jù)。它的作用是將一個(gè)變量的地址傳送到另一個(gè)函數(shù)中。2252.?函數(shù)指針變量在C語言中,一個(gè)函數(shù)總是占用一段連續(xù)的內(nèi)存空間,而函數(shù)名就是該函數(shù)所占內(nèi)存空間的首地址。可以把函數(shù)的這個(gè)首地址賦予一個(gè)指針變量,使該指針變量指向該函數(shù)。通過指針變量就可以找到并調(diào)用這個(gè)函數(shù)。我們把這種指向函數(shù)的指針變量稱為函數(shù)指針變量。函數(shù)指針變量定義的一般形式如下。類型說明符(*指針變量名)();其中“類型說明符”表示被指函數(shù)的返回值的類型。“*”后面的變量是定義的指針變量名,最后的空括號(hào)表示指針變量所指的是一個(gè)函數(shù)。226調(diào)用函數(shù)指針變量的一般形式如下。(*指針變量名)(實(shí)參表)使用函數(shù)指針變量還應(yīng)注意以下兩點(diǎn)。第一,對(duì)函數(shù)指針變量進(jìn)行算術(shù)(指針)運(yùn)算是沒有意義的,這與數(shù)組指針變量不同。數(shù)組指針變量加減一個(gè)整數(shù)可使指針在內(nèi)存的數(shù)據(jù)存儲(chǔ)區(qū)移動(dòng)指向后面或前面的數(shù)組元素,而函數(shù)指針的移動(dòng)是在程序存儲(chǔ)空間變換地址,是無意義的。第二,函數(shù)調(diào)用中“(*指針變量名)”的兩邊的括號(hào)不可少,其中的“*”不應(yīng)該理解為求值運(yùn)算,在此處它只是一種表示符號(hào)。227函數(shù)指針變量形式調(diào)用函數(shù)的步驟如下。先定義函數(shù)指針變量,如程序中“int(*pmax)(inta,intb);”,定義pmax為函數(shù)指針變量。把被調(diào)函數(shù)的首地址賦予該函數(shù)指針變量,如程序中的語句“pmax=max;”。用函數(shù)指針變量形式調(diào)用函數(shù),如程序第18行的語句“z=(*pmax)(x,y);”。2283.?指針型函數(shù)函數(shù)類型是指函數(shù)返回值的類型。在C語言中允許一個(gè)函數(shù)的返回值是一個(gè)指針,這種返回指針值的函數(shù)稱為指針型函數(shù)。定義指針型函數(shù)的一般形式如下。類型說明符*函數(shù)名(形參表){…/*函數(shù)體*/}其中“類型說明符”表示返回的指針值所指向的數(shù)據(jù)類型,函數(shù)名之前加了“*”號(hào)表明這是一個(gè)指針型函數(shù),即返回值是一個(gè)指針。229四、指針和數(shù)組1.?通過指針引用數(shù)組C語言規(guī)定,如果指針變量p已指向數(shù)組中的一個(gè)元素,則p+1指向同一數(shù)組中的下一個(gè)元素。引入指針變量后,就可以用兩種方法來訪問數(shù)組元素。如果指針變量p的初值為&a[0],則“p+i”和“a+i”就是a[i]的地址,或者說它們指向a數(shù)組的第i個(gè)元素;“*(p+i)”或“*(a+i)”就是“p+i”或“a+i”所指向的數(shù)組元素,即a[i]。指向數(shù)組的指針變量也可以帶下標(biāo)。230根據(jù)以上敘述,引用一個(gè)數(shù)組元素可以用下標(biāo)法和指針法。(1)下標(biāo)法,即用a[i]形式訪問數(shù)組元素。(2)指針法,即采用“*(a+i)”或“*(p+i)”形式,用間接訪問的方法來訪問數(shù)組元素,其中a是數(shù)組名,p是指向數(shù)組的指針變量,其初值為p=a。2312.?指針變量、數(shù)組名分別做函數(shù)形參和實(shí)參指針變量、數(shù)組名做函數(shù)參數(shù)有四種情況。實(shí)參和形參都用數(shù)組名;實(shí)參用數(shù)組名,形參用指針變量;實(shí)參和形參都用指針變量;實(shí)參用指針變量,形參用數(shù)組名。(1)函數(shù)的實(shí)參和形參都是數(shù)組名。array為實(shí)參數(shù)組名,arr為形參數(shù)組名。數(shù)組名就是數(shù)組的首地址,實(shí)參向形參傳送數(shù)組名,實(shí)際上就是傳送數(shù)組的首地址,形參得到該地址后也指向同一數(shù)組。同樣,指針變量的值也是地址,數(shù)組指針變量的值即為數(shù)組某元素的地址,當(dāng)然也可作為函數(shù)的參數(shù)使用。232(2)實(shí)參用數(shù)組名,形參用指針變量。(3)實(shí)參和形參都用指針變量。main()函數(shù)中的指針變量p是有確定值的。即如果用指針變量做實(shí)參,必須先使指針變量有確定值,指向一個(gè)已定義的數(shù)組。(4)實(shí)參用指針變量,形參用數(shù)組名。函數(shù)sort()用數(shù)組名作為形參,也可改為用指針變量,這時(shí)函數(shù)體的其他語句不變,其首部可以改為語句“voidsort(int*x,intn)”。2333.?指向多維數(shù)組的指針(1)多維數(shù)組的地址。設(shè)有整型二維數(shù)組a[3][4]如下。它的定義語句如下。假設(shè)16位機(jī)器中數(shù)組a的首地址為0x1000。234前面介紹過,C語言允許把一個(gè)二維數(shù)組分解為多個(gè)一維數(shù)組來處理。因此數(shù)組a可分解為三個(gè)一維數(shù)組,即a[0]、a[1]和a[2]。每一個(gè)一維數(shù)組又含有四個(gè)元素,例如a[0]數(shù)組中含有a[0][0]、a[0][1]、a[0][2]、a[0][3]四個(gè)元素。235數(shù)組及數(shù)組元素的地址表示如下。從二維數(shù)組的角度來看,“a”是二維數(shù)組名,“a”代表整個(gè)二維數(shù)組的首地址,也是二維數(shù)組第1行的首地址,等于0x1000。表達(dá)式“a+1”代表第2行的首地址,等于0x1008?!癮[0]”是第一個(gè)一維數(shù)組的數(shù)組名和首地址,因此也為0x1000。表達(dá)式“*(a+0)”或“*a”是與a[0]等效的,它表示一維數(shù)組a[0]第0號(hào)元素的首地址,也為0x1000?!?a[0][0]”是二維數(shù)組a的0行0列元素地址,同樣是0x1000。由此可得出,表達(dá)式“a+i”“a[i]”“*(a+i)”是等價(jià)的。236(2)指向多維數(shù)組的指針變量。把二維數(shù)組a分解為一維數(shù)組a[0]、a[1]、a[2]之后,設(shè)p為指向二維數(shù)組的指針變量,可使用定義語句“int(*p)[4];”,它表示p是一個(gè)指針變量,它指向包含4個(gè)元素的一維數(shù)組。若p指向第一個(gè)一維數(shù)組a[0],其值等于a、a[0]或&a[0][0]等。而“p+i”則指向一維數(shù)組a[i]。從前面的分析可得出“*(p+i)+j”是二維數(shù)組i行j列的元素的地址,而“*(*(p+i)+j)”則是i行j列元素的值。237二維數(shù)組指針變量說明的一般形式如下。類型說明符(*指針變量名)[長度]其中“類型說明符”為所指數(shù)組的數(shù)據(jù)類型。“*”表示其后的變量是指針類型?!伴L度”表示二維數(shù)組分解為多個(gè)一維數(shù)組時(shí),一維數(shù)組的長度,也就是二維數(shù)組的列數(shù)。應(yīng)注意“(*指針變量名)”兩邊的括號(hào)不可少,如缺少括號(hào)則表示是指針數(shù)組,意義就完全不同了。2384.?指針數(shù)組的概念一個(gè)元素值為指針的數(shù)組即為指針數(shù)組。指針數(shù)組是一組有序的指針的集合。指針數(shù)組的所有元素都必須是具有相同存儲(chǔ)類型或指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組說明的一般形式如下。類型說明符*數(shù)組名[數(shù)組長度];其中“類型說明符”為指針值所指向的變量的類型。239通??捎靡粋€(gè)指針數(shù)組來指向一個(gè)二維數(shù)組。指針數(shù)組中的每個(gè)元素被賦予二維數(shù)組每一行的首地址,因此也可理解為指針數(shù)組中的每個(gè)元素指向一個(gè)一維數(shù)組。二維數(shù)組指針變量是單個(gè)的變量,其一般形式中“(*指針變量名)”兩邊的括號(hào)不可少。而指針數(shù)組類型表示的是多個(gè)指針(一組有序指針),在一般形式中“*指針數(shù)組名”兩邊不能有括號(hào)。2405.?指向指針的指針如果一個(gè)指針變量存放的是另一個(gè)指針變量的地址,則稱這個(gè)指針變量為指向指針的指針變量。通過指針訪問變量稱為間接訪問。由于指針變量直接指向變量,該指針變量中存放了一個(gè)目標(biāo)變量的地址,所以稱為“單級(jí)間址”。通過指向指針的指針變量來訪問變量則構(gòu)成“二級(jí)間址”。定義一個(gè)指向指針型數(shù)據(jù)的指針變量p可使用語句“char**p;”,其中p前面有兩個(gè)“*”號(hào),相當(dāng)于表達(dá)式“*(*p)”。顯然“*p”是指針變量的定義形式,如果沒有最前面的“*”,那就是定義了一個(gè)指向字符數(shù)據(jù)的指針變量,它前面又有一個(gè)“*”號(hào),表示指針變量p是指向一個(gè)字符指針型變量,“*p”就是p所指向的另一個(gè)指針變量。241五、指針和字符串1.?字符串的表示形式在C語言中,可以用兩種方法訪問一個(gè)字符串。(1)用字符數(shù)組存放一個(gè)字符串。(2)用字符串指針變量指向一個(gè)字符串。字符串指針變量的定義說明與指向字符型變量的指針變量的定義說明是相同的,只能按對(duì)指針變量的賦值不同來區(qū)別,對(duì)指向字符型變量的指針變量應(yīng)賦予該字符型變量的地址。2422.?字符串指針變量與字符數(shù)組的區(qū)別用字符數(shù)組和字符串指針變量都可實(shí)現(xiàn)字符串的存儲(chǔ)和運(yùn)算,但是兩者是有區(qū)別的。字符串指針變量本身是一個(gè)變量,用于存放字符串的首地址,而字符串本身是存放在以該首地址為首的一塊連續(xù)的內(nèi)存空間中,以“\0”字符作為字符串的結(jié)束。字符數(shù)組是由若干個(gè)數(shù)組元素組成的,這些數(shù)組元素是字符串中的字符。字符串指針變量的書寫方式可如以下語句。243可以寫為如下形式。而對(duì)字符數(shù)組的書寫方式可如以下語句。不能寫為如下形式。字符數(shù)組只能對(duì)字符數(shù)組的各元素逐個(gè)賦值。指針變量在未取得確定地址前使用是危險(xiǎn)的,容易引起錯(cuò)誤,C語言對(duì)指針變量賦值時(shí)要給以確定的地址。244輸出學(xué)生成績——結(jié)構(gòu)體的使用任務(wù)7245學(xué)習(xí)目標(biāo)1.能熟練使用結(jié)構(gòu)體變量、結(jié)構(gòu)體數(shù)組以及結(jié)構(gòu)體類型的指針,利用指針處理鏈表。2.了解共用體數(shù)據(jù)類型的特點(diǎn)。246任務(wù)描述在實(shí)際應(yīng)用中,一組數(shù)據(jù)往往具有不同的數(shù)據(jù)類型。例如,在學(xué)生成績單中,姓名應(yīng)為字符型數(shù)據(jù),學(xué)號(hào)可為整型或字符型數(shù)據(jù),年齡應(yīng)為整型數(shù)據(jù),性別應(yīng)為字符型數(shù)據(jù),成績可為整型或?qū)嵭蛿?shù)據(jù)。顯然不能用一個(gè)數(shù)組來存放這一組數(shù)據(jù),因?yàn)閿?shù)組中各元素的類型和長度都必須一致,以便編譯系統(tǒng)處理。為了解決這樣的問題,C語言中給出了另一種構(gòu)造數(shù)據(jù)類型——結(jié)構(gòu)體。本任務(wù)通過使用結(jié)構(gòu)體設(shè)計(jì)和編寫程序的實(shí)例,介紹結(jié)構(gòu)體變量、結(jié)構(gòu)體數(shù)組以及結(jié)構(gòu)體指針等的使用方法;了解利用指針處理鏈表的方法,了解共用體數(shù)據(jù)類型的特點(diǎn)。247本任務(wù)的具體要求是使用結(jié)構(gòu)數(shù)據(jù)類型,編寫“輸出學(xué)生成績單”的程序。學(xué)生成績單信息包括學(xué)號(hào)、小組、姓名以及三門課程成績(語文、計(jì)算機(jī)、英語)。“輸出學(xué)生成績”程序的主要功能是能按學(xué)號(hào)查詢學(xué)生的總分及平均分,且能查詢學(xué)生不及格科目,學(xué)生成績單見下表。248249學(xué)生成績單相關(guān)知識(shí)一、結(jié)構(gòu)體當(dāng)處理大量的同類型的數(shù)據(jù)時(shí),利用數(shù)組很方便。然而,在實(shí)際應(yīng)用中,常常有許多不同類型的數(shù)據(jù)也作為一個(gè)整體存在,如與日期有關(guān)的年、月、日,一個(gè)學(xué)生的信息等。如果能夠把這些有關(guān)聯(lián)的數(shù)據(jù)有機(jī)地結(jié)合起來并能利用一個(gè)變量來管理的話,將會(huì)大大提高對(duì)這些數(shù)據(jù)的處理效率。C語言中提供的名為結(jié)構(gòu)體的數(shù)據(jù)類型,就是用來描述這類數(shù)據(jù)的。2501.?結(jié)構(gòu)體的一般形式定義一個(gè)結(jié)構(gòu)體的一般形式如下。struct結(jié)構(gòu)體名{成員表列};其中,“成員表列”由若干個(gè)成員組成,每個(gè)成員都是該結(jié)構(gòu)體的一個(gè)組成部分。對(duì)每個(gè)成員也必須作類型說明,其形式如下。類型說明符

成員名;其中,“成員名”的命名應(yīng)符合標(biāo)識(shí)符的書寫規(guī)定。251例如以下語句的功能就是建立一個(gè)結(jié)構(gòu)體。252在這個(gè)結(jié)構(gòu)體定義中,結(jié)構(gòu)體名為report,該結(jié)構(gòu)體由4個(gè)成員組成。第一個(gè)成員為num,被定義為整型變量;第二個(gè)成員為name,被定義為字符數(shù)組;第三個(gè)成員為gender,被定義為字符型變量;第四個(gè)成員為score,被定義為實(shí)型變量。應(yīng)注意在括號(hào)后的分號(hào)是不可少的。結(jié)構(gòu)體定義之后,即可進(jìn)行結(jié)構(gòu)體變量說明。凡說明為結(jié)構(gòu)體report的變量都由上述4個(gè)成員組成。由此可見,結(jié)構(gòu)體是一種復(fù)雜的數(shù)據(jù)類型,是數(shù)目固定、類型不同的若干有序變量的集合。2532.?說明結(jié)構(gòu)體變量(1)先定義結(jié)構(gòu)體,再說明結(jié)構(gòu)體變量。例如:該段語句說明了兩個(gè)變量people1和people2為report結(jié)構(gòu)體類型。254C語言中也可以用宏定義一個(gè)符號(hào)常量來表示一個(gè)結(jié)構(gòu)體類型,例如以下語句。255(2)在定義結(jié)構(gòu)體的同時(shí)說明結(jié)構(gòu)體變量。例如:在定義結(jié)構(gòu)體的同時(shí)說明結(jié)構(gòu)體變量的一般形式如下。struct結(jié)構(gòu)體名{成員表列}變量名表列;256(3)直接說明結(jié)構(gòu)體變量。例如:直接說明結(jié)構(gòu)體變量的一般形式如下。struct{成員表列}變量名表列;2573.?結(jié)構(gòu)體變量成員的表示方法在程序中使用結(jié)構(gòu)體變量時(shí),往往不把它作為一個(gè)整體來使用。在C語言中除了允許具有相同類型的結(jié)構(gòu)體變量相互賦值以外,一般對(duì)結(jié)構(gòu)體變量的使用,包括賦值、輸入、輸出、運(yùn)算等都是通過結(jié)構(gòu)體變量的成員來實(shí)現(xiàn)的。表示結(jié)構(gòu)體變量成員的一般形式如下。結(jié)構(gòu)變量名.成員名如果成員本身也是一個(gè)結(jié)構(gòu)體,則必須逐級(jí)找到最低級(jí)的成員才能使用。2584.?結(jié)構(gòu)體變量的賦值結(jié)構(gòu)體變量的賦值就是給各成員賦值,可用輸入語句或賦值語句來完成。5.?結(jié)構(gòu)體變量初始化和其他類型變量一樣,結(jié)構(gòu)體變量可以在定義時(shí)進(jìn)行初始化賦值。6.?定義結(jié)構(gòu)體數(shù)組數(shù)組的元素也可以是結(jié)構(gòu)體類型的,因此可以構(gòu)成結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組的每一個(gè)元素都是具有相同結(jié)構(gòu)體類型的下標(biāo)結(jié)構(gòu)體變量。在實(shí)際應(yīng)用中,經(jīng)常用結(jié)構(gòu)體數(shù)組來表示具有相同數(shù)據(jù)結(jié)構(gòu)的一個(gè)群體。2597.?指向結(jié)構(gòu)體變量的指針變量一個(gè)指針變量用來指向一個(gè)結(jié)構(gòu)體變量時(shí),稱其為結(jié)構(gòu)體指針變量。結(jié)構(gòu)體指針變量中的值是所指向的結(jié)構(gòu)體變量的首地址。通過結(jié)構(gòu)體指針即可訪問該結(jié)構(gòu)體變量,這與數(shù)組指針和函數(shù)指針的情況是相同的。結(jié)構(gòu)體指針變量說明的一般形式如下。struct結(jié)構(gòu)體名*結(jié)構(gòu)體指針變量名與前面討論的各類指針變量相同,結(jié)構(gòu)體指針變量也必須先賦值后才能使用。賦值是把結(jié)構(gòu)體變量的首地址賦予該指針變量,不能把結(jié)構(gòu)體名賦予該指針變量。260結(jié)構(gòu)體名和結(jié)構(gòu)體變量是兩個(gè)不同的概念,不能混淆。結(jié)構(gòu)體名只能表示一個(gè)結(jié)構(gòu)體的形式,編譯系統(tǒng)并不對(duì)它分配內(nèi)存空間。只有當(dāng)某變量被說明為這種類型的結(jié)構(gòu)體時(shí),才對(duì)該變量分配內(nèi)存空間。有了結(jié)構(gòu)體指針變量,就能更方便地訪問結(jié)構(gòu)體變量的各個(gè)成員。其訪問的一般形式如下。(*結(jié)構(gòu)體指針變量).成員名或者采用如下形式。結(jié)構(gòu)體指針變量->成員名261結(jié)構(gòu)體成員有以下三種表示的形式。結(jié)構(gòu)體變量.成員名(*結(jié)構(gòu)體指針變量).成員名結(jié)構(gòu)體指針變量->成員名這三種用于表示結(jié)構(gòu)體成員的形式是完全等效的。2628.?指向結(jié)構(gòu)體數(shù)組的指針指針變量可以指向一個(gè)結(jié)構(gòu)體數(shù)組,這時(shí)結(jié)構(gòu)體指針變量的值就是整個(gè)結(jié)構(gòu)體數(shù)組的首地址。結(jié)構(gòu)體指針變量也可指向結(jié)構(gòu)體數(shù)組的一個(gè)元素,這時(shí)結(jié)構(gòu)體指針變量的值就是該結(jié)構(gòu)體數(shù)組元素的首地址。設(shè)ab為指向結(jié)構(gòu)體數(shù)組的指針變量,則ab指向該結(jié)構(gòu)體數(shù)組的0號(hào)元素,ab+1指向1號(hào)元素,ab+i則指向i號(hào)元素。這與普通指針數(shù)組的情況是一致的。263一個(gè)結(jié)構(gòu)體指針變量雖然可以用來訪問結(jié)構(gòu)體變量或結(jié)構(gòu)體數(shù)組元素的成員,但是不能使它指向一個(gè)結(jié)構(gòu)體數(shù)組元素的成員,也就是說不允許取一個(gè)成員的地址來賦予一個(gè)結(jié)構(gòu)體指針變量。因此,下面的賦值語句是錯(cuò)誤

溫馨提示

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

評(píng)論

0/150

提交評(píng)論