語句允許嵌套但嵌套的層數不宜太多在實際編程時應適當控製嵌套層數(4)if,。,層為宜語句嵌套時子句與的匹配原則與其上麵距它最近且尚未匹配(2~3)。if,elseif:,,的配對為明確匹配關係避免匹配錯誤強烈建議將內嵌的語句一律用花括號括if。,,:if,起來。
3?switch語句用來實現多分支結構的程序設計語句的基本格式是switch:第章選擇結構程序設計463switch表達式case常量表達式1語句1breakcase常量表達式2語句2break??
default語句n後麵常量表達式僅起語句標號作用並不進行條件判斷係統一旦找到入口標號case,。,就從此標號開始執行不再進行標號判斷,。
習題一選擇題、為了避免嵌套語句的二義性語言規定總是組成配對關係1?if?else,Celse()。
縮排位置相同的在其之前未配對的A?ifB?if在其之前未配對的最近的同一行上的C?ifD?if選擇合法的語句設2?if(intx,a,b,c;)()。
A?if(a≠b)x++;B?if(a<=b)x++;C?if(a<>b)x++;D?if(a≥b)x++;在語言的語句中用作判斷的表達式為3?Cif,()。
關係表達式邏輯表達式A?B?
算術表達式任意表達式C?D?
若有以下語句組則輸出結果是4?,()。
intx=0ifx++<0printf"%d"--xprintf"%d"x++A?-1B?1C?-1-1D?-10下列條件語句中功能與其他語句不同的是5?,()。
ifaprintf"%dn"xelseprintf"%dn"yA?\\ifaprintf"%dn"yelseprintf"%dn"xB?==0\\ifaprintf"%dn"xelseprintf"%dn"yC?=0\\ifaprintf"%dn"xelseprintf"%dn"yD?==0\\以下程序段運行後的值是6?,x()。
intabxca=b=c=0語言程序設計案例教程64Cx=35ifax--elseifbifcx=3elsex=4A?34B?4C?35D?3以下程序的輸出結果是7?()。
maininta=2b=-1c=2ifa<bifb<0c=0elsec++printf"%d\n"cA?0B?1C?2D?3二填空題、以下程序執行後輸出結果是1?。
mainintpa=5ifp=a=0printf"%d\n"pelseprintf"%d\n"p+2以下程序的運行結果是2?。
main第章選擇結構程序設計465intx=1y=1switchxcase1switchycase0printf"yis0.\n"breakcase1printf"yis1.\n"breakdefaultprintf"yisunknown.\n"breakcase2printf"Idothis.\n"以下程序的運行結果是3?。
mainintaba=3b=5switcha-1case0+=case1b4case2case3b=4?
case4b+=4defaultb/=4printf"%d%d\n"ab以下程序對輸入的大寫英文字母按字母表的順序循環後移個位置輸出如變4?,3。A成變成請填空D,YB,。
maincharcc=getcharifelseif語言程序設計案例教程66Cputcharc三編程題、求方程ax2bxc1?++=0。
從鍵盤輸入任意字符判斷該字符是數字大寫字母還是小寫字母2?,、。
編寫程序輸入一個整數打印出它是奇數還是偶數3?,,。
計算個人工資所得的納稅額4?。
納稅額計算方法如下:元以內不納稅超過元的部分為應納稅部分計算辦法為應納稅部分1200,1200,:元稅率為應納稅部分稅率應納稅部分稅率≤500,5%;500<≤2000,10%;2000<≤5000,應納稅部分稅率應納稅部分稅率15%;5000<≤20000,20%;20000<,25%。
第5章循環結構程序設計在許多問題中需要用到循環控製例如要輸入全校學生成績求若幹個數之和迭代。,;;求根等幾乎所有實用的程序都包含有循環循環結構是結構化程序設計的基本結構之。。
一它和順序結構選擇結構共同作為各種複雜程序的基本結構單元因此熟練掌握選擇,、。,結構和循環結構的概念及使用是程序設計的最基本要求。
用語句(1)while;用語句(2)do?while;用語句(3)for;用語句和語句構成循環(4)gotoif。
5?1任務3———公司員工薪水計算問題公司需要計算每一位員工的薪水實行的是計時工資製按照實際工作的時間小時,,()與每小時的報酬計算員工所得薪水並統計出公司支付的總薪水,。
分析解決這個問題首先需要知道公司的員工數量用變量表示每個員工的工作時,,number,間及每小時的報酬多位員工薪水的計算是一件重複的工作可以通過循環(hours)(rate)。,來實現。
數據需要循環變量i輸入數據intnumber/存放員工數/??
floathoursrate/存放工作時間每小時報酬數/,?,?
輸出數據floatpay/每個員工的薪水/??
floatpayroll/公司支付的總薪水/??
設計獲取數據公司的員工數循環取得各個員工的工作時間和每小時報酬數(1):,。
語言程序設計案例教程68C循環體內容:計算員工的薪水①:pay=hours?rate。
顯示員工的薪水②。
統計公司支付總薪水③:payroll+=pay。
顯示公司支付總薪水(2)。
程序流程圖如圖所示51。
圖51任務3流程圖實現通過獲取員工數循環變量時依次獲得員工信息計算出員工薪水並合計,i<number,,,計算出公司支付總薪水。
#include<stdio.h>mainintinumberfloathoursratepay=0doublepayroll=0printf"\n請輸入公司員工數"scanf"%d"&number第章循環結構程序設計569fori=0i<numberi++printf"\n工作時間"scanf"%f"&hoursprintf"\n每小時工作報酬¥"scanf"%f"&ratepay=hoursrate?printf"\n薪水是¥%f"paypayroll+=payprintf"\n所有員工薪水計算完畢"printf"\n公司支付總薪水是¥%.2f\n"payroll運行結果:請輸入公司員工數3↙工作時間68↙每小時工作報酬¥10.00↙薪水是¥680.00工作時間8↙每小時工作報酬¥30.00↙薪水是¥240.00工作時間12↙每小時工作報酬¥80.00↙薪水是¥960.00所有員工薪水計算完畢公司支付總薪水是¥1880.00測試通過設置多組模擬數據進行程序測試發現輸入的員工數必須要大於相關的工作時,0,間與每小時工作報酬須是正數程序運行的結果才有意義,。
5?2while語句語句用來實現當型循環結構其一般形式如下while“”。:while表達式語句當表達式為非時執行語句中的內嵌語句其流程圖見圖其特點是先0,while。52。:語言程序設計案例教程70C判斷表達式後執行語句,。
圖52while語句執行圖圖53例51流程圖100例51求n【】n=。
∑1用流程圖表示算法見圖,53。
根據流程圖寫出程序:mainintnsum=0n=1whilen<=100/while條件滿足時執行循環體/??sum=sum+nn++printf"%d\n"sum需要注意:循環體如果包含一個以上的語句應該用花括號括起來以複合語句形式出現如(1),,。
果不加花括號則語句的範圍隻到後麵第一個分號處例如本例中語句,whilewhile。,while中如無花括號則語句範圍隻到,while“sum=sum+n;”。
在循環體中應有使循環趨向於結束的語句例如在本例中循環結束的條件是(2)。,因此在循環體中應該有使增值以最終導致的語句本程序中用“n>100”,nn>100,“n++;”語句來達到此目的如果無此語句則的值始終不改變循環永不結束。,n,。
5?3do?while語句語句的特點是先執行循環體語句然後判斷循環條件是否成立其一般形式為do?while,。:第章循環結構程序設計571do循環語句while表達式它是這樣執行的先執行一次指定的循環體語句然後判別表達式當表達式的值為:,,非真時返回重新執行循環體語句如此反複直到表達式的值等於為止此時循0(“”),,,0,環結束可以用圖表示其流程。54。
圖54do?while語句圖55例52流程圖100例52用語句求n【】do?whilen=。
∑1先畫出流程圖見圖,55。
程序如下:mainintnsum=0n=1dosum=sum+nn++whilen<=100printf"%d\n"sum圖56do?while變化圖語言程序設計案例教程72C可以看到對同一個問題可以用語句處理也可以用語句處理:while,do?while。do?while語句結構可以轉換成結構圖可以改畫成圖形式二者完全等價而圖while。5456,。5中線框部分就是一個結構可見結構是由一個語句加一個結構構6while。,do?whilewhile成的若圖中表達式的值為真則圖也與圖等價因為都要先執行一次語。53,5356(句)。
在一般情況下用語句和用語句處理同一問題時若二者的循環體部分,whiledo?while,是一樣的它們的結果也一樣如例和例程序中的循環體是相同的得到的結果,。5152,也相同但是如果後麵的表達式一開始就為假值時兩種循環的結果是不同的。while(0),。
例53和循環的比較【】whiledo?while。
(1)mainintsum=0iscanf"%d"&iwhilei<=10sum=sum+ii++printf"sum=%d\n"sum運行情況如下:1↙sum=55再運行一次:11↙sum=0(2)mainintsum=0iscanf"%d"&ido=+sumsumii++whilei<=10printf"sum=%d\n"sum運行情況如下:第章循環結構程序設計5731↙sum=55再運行一次:11↙sum=11可以看到當輸入的值小於或等於時二者得到的結果相同而當時二者:i10,。i>10,結果就不同了這是因為此時對循環來說一次也不執行循環體表達式為。while,(“i<=10”假而對循環語句來說則要執行一次循環可以得到結論當後麵的表達式),do?while。:while的第一次的值為真時兩種循環得到的結果相同否則二者結果不相同指二者具有相同,。,(的循環體的情況)。
5?4for語句語言中的語句使用最為靈活不僅可以用於循環次數已經確定的情況而且可以Cfor,,用於循環次數不確定而隻給出循環結束條件的情況它完全可以代替語句,while。
語句的一般形式為for:for表達式1表達式2表達式3語句它的執行過程如下:求解表達式(1)1。
求解表達式若其值為真值為非則執行語句中指定的內嵌語句然後執(2)2,(0),for,行下麵第步若為假值為則結束循環轉到第步3。(0),,5。
求解表達式(3)3。
轉回上麵第步繼續執行(4)2。
循環結束執行語句下麵的一個語句(5),for。
可以用圖來表示語句的執行過程57for。
圖57for語句執行過程語言程序設計案例教程74C語句最簡單的應用形式也是最易理解的形式如下for,:for循環變量賦初值循環條件循環變量增值語句例如:fori=1i<=100i++sum=sum+i它的執行過程與圖完全一樣可以看到它相當於以下語句53。:i=1whilei<=100sum=sum+ii++顯然用語句簡單方便對於以上語句的一般形式也可以改寫為循環,for、。for,while的形式:表達式1while表達式2語句表達式3說明:語句的一般形式中的表達式可以省略此時應在語句之前給循環變量(1)for“1”,for賦初值注意省略表達式時其後的分號不能省略如。1,。for(;i<=100;i++)sum=sum+i;執行時跳過求解表達式這一步其他不變,“1”,。
如果表達式省略即不判斷循環條件循環無終止地進行下去也就是認為表達(2)2,,。
式始終為真見圖2。58。
例如:fori=1i++sum=sum+i表達式是一個賦值表達式表達式空缺它相當於1,2。:i=1while1sum=sum+1i++第章循環結構程序設計575圖58表達式2缺省表達式也可以省略但此時程序設計者應另外設法保證循環能正常結束如(3)3,。:fori=1i<=100sum=sum+ii++在上麵的語句中隻有表達式和表達式而沒有表達式的操作不放在for,12,3。i++for語句的表達式的位置處而作為循環體的一部分效果是一樣的都能使循環正常結束3,,,。
可以省略表達式和表達式隻有表達式即隻給循環條件如(4)13,2,。:fori<=100whilei<=100sum=sum+isum=sum+i相當於i++i++在這種情況下完全等同於語句可見語句比語句功能強除了可以給,while。forwhile,出循環條件外還可以賦初值使循環變量自動增值等,,。
三個表達式都可省略如(5),:for語句相當於:while1語句即不設初值不判斷條件認為表達式為真值循環變量不增值無終止地執行循,(2),。
環體。
表達式可以是設置循環變量初值的賦值表達式也可以是與循環變量無關的其(6)1,他表達式如。:forsum=0i<=100i++sum=sum+i表達式也可以是與循環控製無關的任意表達式3。
表達式和表達式可以是一個簡單的表達式也可以是逗號表達式即包含一個以上13,,語言程序設計案例教程76C的簡單表達式中間用逗號間隔如,。:forsum=0i=1i<=100i++sum=sum+i或:fori=0j=100i<=ji++j--k+=ij?
表達式和表達式都是逗號表達式各包含兩個賦值表達式即同時設兩個初值使13,,,兩個變量增值執行情況見圖,59。
在逗號表達式內按自左至右順序求解整個逗號表達式的值為其中最右邊的表達式的,值如。:fori=1i<=100i++i++sum=sum+i相當於:fori=1i<=100i=i+2sum=sum+i圖59兩個初值兩個變量增值圖510未知循環次數、表達式一般是關係表達式如或邏輯表達式如但也可以是(7)(i<=100)(a<b&&x<y),數值表達式或字符表達式隻要其值為非零就執行循環體分析下麵兩個例子,,。:foricgetcharnic①(=0;(=())!=?\?;+=);在表達式中先從終端接收一個字符賦給然後判斷此賦值表達式的值是否不等於2c,換行符如果不等於就執行循環體此語句的執行過程見圖它的作?\n?(),?\n?,。for510,用是不斷輸入字符將它們的碼相加直到輸入一個換行符為止,ASCII,。
注意此語句的循環體為空語句把本來要在循環體內處理的內容放在表達式中:for,3,作用是一樣的可見語句功能強可以在表達式中完成本來應在循環體內完成的操作。for,。
forcgetcharn②(;(=())!=?\?;)printf"%c"c(,);隻有表達式而無表達式和表達式其作用是每讀入一個字符後立即輸出該字2,13。
第章循環結構程序設計577符直到輸入一個換行符為止請注意從終端鍵盤向計算機輸入時是在按鍵以後,。,,Enter才送到內存緩衝區中去的運行情況如下。:Computer↙輸入Computer輸出而不是:CCoommppuutteerr即不是從終端輸入一個字符馬上輸出一個字符而是按鍵後數據送入內存緩衝,Enter區然後每次從緩衝區讀一個字符再輸出該字符,,。
從上麵介紹可以知道語言中的語句比其他語言如中的,Cfor(BASIC,PASCAL)FOR語句功能強得多可以把循環體和一些與循環控製無關的操作也作為表達式或表達式。13出現這樣程序要短小簡潔但過分地利用這一特點會使語句顯得雜亂可讀性降低建,。for,,議不要把與循環控製無關的內容放到語句中for。
5?5循環嵌套一個循環體內又包含另一個完整的循環結構稱為循環嵌套內嵌的循環中還可以嵌,。
套循環這就是多層循環各種語言中關於循環嵌套的概念都是一樣的,。。
例54假設有個班每班有名學生分別求出各班成績的平均分【】6,20,。
要計算個班個學生的考試成績平均分隻需要把輸入學生成績和累加學生成(1)120,績這兩條命令重複執行遍就可得到該班的成績和再除以該班人數就得到該班平均分20,,。
輸出個班的平均值可用如下代碼實現1,:s=0forn=1n<=20n++scanf"%f"&x/輸入學生成績/??s=s+x//累加學生成績??
pritnf"%f\n"s/20/計算並輸出該班成績平均值/??
要得到個班的平均成績隻需將上麵的程序運行遍即在上麵程序的外麵再(2)6,6。
加一層循環表示班數。i。
fori=1i<=6i++輸出1個班的平均值程序如下:語言程序設計案例教程78Cmainintm=0n=0floats=0x=0fori=1i<=6i++/循環計算6個班的平均成績/??s=0forn=1n<=20n++/循環輸入20個學生成績/??scanf"%f"&x/輸入學生成績/??s=s+x/累加學生成績/??printf"%f\n"s/20/計算並輸出該班成績平均值/??注意:上麵程序語句的循環體內又包含了另一個循環這種形式稱為循環嵌套(1)forfor,。
由於每一個班的成績求和都是存放在變量中因此當要輸入下一個班的成績時(2)s,,先要對變量清零所以不能放在外層循環體外s。s=0。
對於需要輸入較多的數據在程序設計中最好加入一些提示信息如請輸入班(3),,“××××號學生成績使程序與用戶之間有較好的親和力也便於數據輸入程序修改如下:”,,。:mainintinfloats=0x=0fori=1i<=6i++s=0forn=1n<=20n++printf"Input%dclassno.%d"in/輸入提示信息/??scanf"%f"&xs=s+xprintf"%dclassaverage%f\n"is/20例55打印如圖所示的圖形【】511。
第章循環結構程序設計579圖511三角形星圖512長方形星如果打印的圖形每行都打印個星共打印行如圖所示用一條循環程(1)5,5(512),序就可實現:fori=1i<6i++/i確定打印的行數/??printf"\n"?????
但題目要求圖形每行打印的星的個數不同第行打印個星第行打印個。11,22星第行打印個星所以用一條確定打印個星的語句不能實現該功能……55。5。
要實現每行打印不同個數的星隻能用程序來控製輸出星的個數用下麵的循環(2),。
語句便能實現這個功能當時該循環被執行一次打印出個星當時該循環被,i=1,,1;i=2,執行次打印出個星每次循環結束輸出個換行符即每輸出一行就換行所以隻要2,2;,1,。
從增加到就能輸出所要求的圖形代碼如下i15,,:forj=1j<=ij++/j確定打印星的個數/??
printf""?printf"\n"/打印完一行星後輸出一個換行符/??
要實現從增加到隻需在上麵的循環語句外再加上一層循環(3)i15,“for(i=1;i<6;即可i++)”。
程序如下:mainintijfori=1i<=5i++/i確定打印的行數/??forj=1j<=ij++/j確定打印的個數/???printf""?printf"\n"/打印完一行後輸出一個換行/???注意:語言程序設計案例教程80C內層循環的循環條件不是一個確定的值是與外層循環變量有關的所以內層循環(1),,體的執行次數每次都不同。
外層循環決定要打印的行數內層循環決定一行打印的星數要注意每一行星打(2),。
印完後要輸出一個換行符。
例56公雞元隻母雞元隻小雞元隻元錢買隻雞且每種【】51,31,13,100100,雞都要有問可以各買多少隻並輸出所有可能的方案,,。
假設可以買隻公雞隻母雞隻小雞根據以上給出的條件可以列出以下兩(1)x,y,z;,個方程式:xyz++=100{xyz/5+3+3=100個方程式解不出個未知數這是一個不定方程但可以采用假設的方法假設買23,,,1隻公雞隻母雞隻小雞算算是否要花元再假設買隻公雞隻母雞隻小,1,98,100;1,2,97雞再判斷是否要花元如果正好元這就是一種方案逐一改變買公雞母雞和,100。100,。、小雞的數從中找出滿足元的方案這種算法稱為枚舉法也稱窮舉法這種方法若由,100,,。
人工來完成會很麻煩但這種算法由計算機來完成卻很容易,。
隻雞並且每種雞都要有所以公雞最少要買隻最多可以買隻同樣母(2)100,,1,98,,雞最少也要買隻最多可以買隻小雞數可根據公式得到要使每種情況1,98,z=100-x-y。
都測試到可以采用二重循環來實現,。
forx=1x<=98x++fory=1y<=98y++z=100-x-yif5x+3y+z/3==100??
輸出公雞母雞小雞數、、考慮到小雞元隻所以小雞數應是的倍數判斷條件改為(3)13,3,“z%3==0&&5?x+3?y+z/3==100”。
程序如下:mainintxyz==++forx1x<98x/公雞數的變化範圍/??
fory=1y<=98y++/母雞數的變化範圍/??z=100-x-y/計算出小雞數/??
第章循環結構程序設計581ifz%3==0&&5x+3y+z/3==100/判斷是否用100元錢/????
printf"cock=%dhen=%dchicken=%d\n"xyz運行結果:cock=4hen=18chicken=78cock=8hen=11chicken=81cock=12hen=4chicken=84注意:元即使都買公雞最多也隻能買隻何況還要買母雞和小雞所以公雞數隻(1)100,20,,能從變化到同樣母雞數也隻能從變化到合理的選擇循環次數將提高程序119。,132。,的運行效率程序修改如下。:mainintxyzforx=1x<=19x++/公雞數的變化範圍/??fory=1y<=32y++/母雞數的變化範圍/??z=100-x-y/計算出小雞數/??ifz%3==0&&5x+3y+z/3==100??
printf"cock=%dhen=%dchicken=%d\n"xyz本題不管將公雞數作為外循環變量還是將母雞數作為外循環變量都能輸出所有(2),,方案但程序的執行效率不一樣本程序中需要執行次執行次但如果,。“x=1”1,“y=1”19,將母雞數作為外循環變量需要執行次執行次多執行次賦值語句,“y=1”1,“x=1”32,13,會降低效率。
5?6goto語句以及用goto語句構成循環語句為無條件轉向語句它的一般形式為goto,:goto語句標號語句標號用標識符表示它的命名規則與變量名相同即由字母數字和下劃線組成其,,、,第一個字符必須為字母或下劃線不能用整數來作標號例如是合法的而。。:gotolabel_1;,是不合法的結構化程序設計方法主張限製使用語句因為濫用語句將goto123;。goto,goto語言程序設計案例教程82C使程序流程無規律可讀性差但也不是絕對禁止使用語句一般來說可以有兩種、。goto。,用途:與語句一起構成循環結構(1)if。
從循環體中跳轉到循環體外但在語言中可以用語句和語句見(2),Cbreakcontinue(節跳出本層循環和結束本次循環語句的使用機會已大大減少隻是需要從多層5.7)。goto,循環的內層循環跳到外層循環外時才用到語句但是這種用法不符合結構化原則一goto。,般不宜采用隻有在不得已例如能大大提高效率時才使用,()。
100例57用語句和語句構成循環求n【】ifgoto,n=。
∑1此題的算法是比較簡單的可以直接寫出程序,:mainintisum=0=i1loopifi<=100sum=sum+ii++gotoloopprintf"%d\n"sum運行結果:5050這裏用的是當型循環結構當滿足時執行花括號內的循環體請讀者自“”,“i<=100”。
己畫出流程圖。
5?7break語句和continue語句語句5?7?1break在節中已經介紹過用語句可以使流程跳出結構繼續執行語句4.3breakswitch,switch下麵的一個語句實際上語句還可以用來從循環體內跳出循環體即提前結束循環。,break,,接著執行循環下麵的語句如。:forr=1r<=10r++第章循環結構程序設計583area=pirr??
ifarea>100breakprintf"%f"area計算到時的圓麵積直到麵積大於為止從上麵的循環可以r=1r=10,(area)100。for看到當時執行語句提前結束循環即不再繼續執行其餘的幾次循環:area>100,break,,。
語句的一般形式為break:break語句不能用於循環語句和語句之外的任何其他語句中breakswitch。
語句5?7?2continue一般形式為:continue其作用為結束本次循環即跳過循環體中下麵尚未執行的語句接著進行下一次是否執,,行循環的判定。
語句和語句的區別是語句隻結束本次循環而不是終止整個循continuebreak:continue,環的執行而語句則是結束整個循環過程不再判斷執行循環的條件是否成立如果;break,。
有以下兩個循環結構:(1)while表達式1?if表達式2break?(2)while表達式1?if表達式2continue?程序的流程圖如圖所示而程序的流程如圖所示請注意圖(1)513,(2)514。
和圖中當表達式為真時流程的轉向513514“2”。
語言程序設計案例教程84C圖513break語句圖514continue語句例58把之間的不能被整除的數輸出【】100~2003。
mainintnforn=100n<=200n++ifn%3==0continueprintf"%d"n當能被整除時執行語句結束本次循環即跳過函數語句隻有n3,continue,(printf),n不能被整除時才執行函數3printf。
當然例中的循環體也可以改用一個語句處理,58:ifn%3=0printf"%d"n我們在程序中用語句無非是為了說明語句的作用continuecontinue。
5?8小型案例問題一位建築師需要編寫一個程序來估算太陽能式房屋的采光麵積采光麵積的確定需要。
第章循環結構程序設計585考慮很多因素包括一年中最冷的月份的平均采暖度天數室內外平均溫差與該月天數的,(乘積房屋麵積每平方英尺需要的熱能房屋麵積以及采光方法的效率該程序要訪問),,,。
兩個數據文件包含的數字表示的是個月該建築位置的平均采暖度天數:hdd.txt12;solar.txt包含的是每個月太陽的平均日照強度指太陽投射到指定位置每平方英尺上的射線等級()。
每個文件的第一項代表的是月份的數據第二項代表的是月份的數據依此類推1,2,。
分析采光麵積的估算公式為(A):heatlossA=energyresource是熱能需求房屋麵積和采暖度天數的乘積可以通過采光方法的效率乘以heatloss、。
平均日照強度再乘以天數來計算必需的熱源,。
在本書前麵所介紹的所有程序中程序的數據都是從兩個輸入源鍵盤或者數據文件,()輸入的而本程序中將使用三個輸入源兩個數據文件和鍵盤文件的知識在第章詳。:(“”11細講解下麵來確定問題的數據需求並寫出初始算法)。。
數據需求問題輸入平均采暖度天數文件平均日照強度文件heatdegdays/平均采暖度天數/__??
coldestmon/最冷的月份數字/_?(1-12)?
solarinsol/最冷月的平均日照強度/_??
heatingreq/每平方英尺所需熱能/_??
efficiency/采光效率/??
floorspace/房屋麵積/_??
程序變量energyresrc/在最冷的月份可用的太陽能/_?,?
問題輸出heatloss/在最冷的月份損失的熱能/_??
collectarea/估算的采光麵積/_??
設計初始算法確定最冷的月份以及該月的平均采暖度天數(1),。
找出這個最冷月份的每平方英尺的平均日照強度(2)。
從用戶那裏獲取其他問題輸入和(3):heating_req、efficiencyfloor_space。
估算所需的采光麵積(4)。
語言程序設計案例教程86C顯示結果(5)。
如圖中的結構圖所示步驟應該設計為一個單獨的函數函數應該515,2。nth_item從文件中找到與最冷月份對應的數據步驟和步驟很簡單隻有步驟和步驟solar.txt。35,1需要進一步細化4。
圖515計算采光麵積的結構圖步驟1細化在細化步驟中要引入個新的變量一個計數器用於跟蹤在平均采暖度天數文3———ct,件中的位置一個整型變量用於記錄文件狀態還有一個整型變量用於順序保存;,;next_hdd,每個采暖度天數的值。
增加的程序變量ct/跟蹤在平均采暖度天數文件中的位置/??
status/記錄文件狀態/??
nexthdd/保存每個采暖度天數的值/_??
從采暖度天數文件中掃描第個值保存到中並將(1.1)1,heat_deg_days,coldest_mon初始化為1。
將初始化為(1.2)ct2。
從該文件中掃描一個值放在中並保存(1.3)next_hdd,status。
隻要不是錯誤數據或者到達文件末尾就重複下麵的步驟(1.4),:如果大於(1.5)next_hddheat_deg_days。
將複製到中(1.6)next_hddheat_deg_days。
將複製到中(1.7)ctcoldest_mon。
加(1.8)ct1。
從該文件掃描一個值放在中並保存(1.9)next_hdd,status。
步驟4細化和相乘得出(4.1)heating_req、floor_spaceheat_deg_daysheat_loss。
第章循環結構程序設計587轉換為百分比和最冷月份的天數相乘得出(4.2)efficiency()、solar_insolenergy_resrc。
除以得出將結果四舍五入到最接近的整數(4.3)heat_lossenergy_resrccollect_area。
平方英尺()。
實現應該開發一個單獨的函數來找出步驟所需要的某月份的天數4.2。
輸入文件hdd.txt:995900750400180201010602906101051輸入文件solar.txt:5007501100149019002100205015501200900500500函數函數和很簡單在此不再詳細解釋隻在下麵程序中列出下nth_itemdays_in_month,,。
麵是完整的程序能大略地估算出特定地理位置上太陽能式房屋的采光麵積,。
#include<stdio.h>intdays_in_monthintintnth_itemFILEint?mainintheat_deg_dayssolar_insolcoldest_monheating_reqeffi?ciencycollect_areactstatusnext_hdddoublefloor_spaceheat_lossenergy_resrcFILEhdd_file?FILEsolar_file?hdd_file=fopen"hdd.txt""r"fscanfhdd_file"%d"&heat_deg_days=coldest_mon1ct=2status=fscanfhdd_file"%d"&next_hddwhilestatus==1ifnext_hdd>heat_deg_daysheat_deg_days=next_hddcoldest_mon=ct++ctstatus=fscanfhdd_file"%d"&next_hdd語言程序設計案例教程88Cfclosehdd_filesolar_file=fopen"solar.txt""r"solar_insol=nth_itemsolar_filecoldest_monfclosesolar_fileprintf"\nWhatistheapproximateheatingrequirementBtu/"printf"degreedayft^2\nofthistypeofconstruction\n=>"scanf"%d"&heating_reqprintf"\nWhatpercentofsolarinsolationwillbeconver?ted"printf"tousableheat\n=>"scanf"%d"&efficiencyprintf"Whatisthefloorspaceft^2\n=>"scanf"%lf"&floor_spaceenergy_resrc=efficiency0.01solar_insoldays_in_month???coldest_moncollect_area=intheat_loss/energy_resrc+0.5printf"Toreplaceheatlossof%.0fBtuinthe"heat_lossprintf"coldestmonthmonth%d\nwithavailable"coldest_monprintf"solarinsolationof%dBtu/ft^2/day"solar_insolprintf"andanXnefficiencyof%dpercentof"efficiencyprintf"useasolarcollectingareaof%d"collect_areaprintf"ft^2.\n"return0intdays_in_monthintmonth_numberintansswitchmonth_number第章循環結構程序設計589case2ans=28breakcase4case6case9case11ans=30breakdefaultans=31returnansintnth_itemFILEdata_fileintn?intiitemfori=1i<=ni++fscanfdata_file"%d"&itemreturnitem運行示例:WhatistheapproximateheatingrequirementBtu/degreedayft^2ofthistypeofconstruction=>9↙Whatpercentofsolarinsolationwillbeconvertedtousableheat=>60↙Whatisthefloorspaceft^2=>1200↙Toreplaceheatlossof11350800Btuinthecoldestmonthmonth12withavailablesolarinsolationof500Btu/ft^2/dayandaneffi?ciencyof60percentuseasolarcollectingareaof1221ft^2測試該程序是英國太陽能應用的一個實例根據實際的數據測試在不同的半球相關的每。,,個月平均采暖度天數和每個月太陽平均日照強度都會有很大的不同致使得出的結果有較,大的差距但估算采光麵積的基本算法是一樣的,。
5?9小結本章介紹了循環結構程序設計語言中用語句語句和語句均能。Cwhile、do?whilefor語言程序設計案例教程90C實現循環控製結合使用語句語句和語句還可以改變程序的執行流。break、continuegoto,程提前退出循環或提前結束本次循環本章需要學習的重點有,。:循環的一般格式為(1)while:while表達式循環體其特點是先判斷表達式的值且值為非時執行其後的循環體:,0。
循環又稱直到型循環它的一般格式為(2)do?while,:do循環體while表達式其特點是先執行循環體然後再判斷表達式的值:,。
循環的一般格式為(3)for:for表達式1表達式2表達式3循環體其特點是根據循環變量的取值和條件進行重複運算:。
語句和語句對循環控製的影響是不同的語句是結束整個循(4)breakcontinue:break環過程不先判斷執行循環的條件是否成立而語句隻結束本次循環並不終止整,;continue,個循環的執行。
在語言中標號可以是任意合法的標識符當在標識符後麵加一個冒號如(5)C,,,該標識符就成了一個語句標號在語言中語句標號必須是標識符因“class1:”、“step1:”,。,,此不能簡單地使用等形式標號可以和變量同名“3:”、“5:”。。
語句稱為無條件轉向語句其一般格式為(6)goto,:goto語句標號語句的作用是使程序無條件地轉移到語句標號所標識的語句處並從該語句繼續goto,執行。
循環嵌套指在一個循環體內還可以包含另一個完整的循環語句前麵介紹的三類(7)。
循環都可以相互嵌套循環的嵌套可以多層但每一層循環在邏輯上必須完整,,。
習題一選擇題、語言中與語句的主要區別是1?C,whiledo?while()。
的循環體至少無條件執行一次A?do?while允許從外部跳到循環體內B?do?while的循環體至少無條件執行一次C?while的循環控製條件比的嚴格D?whiledo?while若有以下程序2?:第章循環結構程序設計591main==intx1a0doa=a+1whilexx--則語句執行的次數是a=a+1()。
A?0B?1有限次C?2D?
以下程序的輸出結果是3?()。
mainintn=9whilen>6n--printf"%d"nA?987B?876C?8765D?9876下麵關於語句的正確描述為4?for()。
語句隻能用於循環次數已經確定的情況A?for語句是先執行循環體語句再判斷表達式B?for,在語句中不能用語句跳出循環體C?for,break在語句的循環體語句中可以包含多條語句但必須用大括號括起來D?for,,以下程序執行後輸出號的個數是5?,“#”()。
mainintijfori=1i<5i++forj=2j<=ij++printf"#"A?0B?4語言程序設計案例教程92CC?6D?7二填空題、以下程序的輸出結果是1?。
mainintx=23doprintf"%d"x--whilex以下程序的輸出結果是2?。
mainintifori=0i<3i++switchicase1pritnf"%d"icase2printf"%d"idefaultprintf"%d"i以下程序的輸出結果是3?。
maininta=1b=0fora<3a++switcha++case1b--case2b++case3b+=3breakprintf"%d"b第章循環結構程序設計593以下程序段執行後的值是的值是的值是4?,i,j,k。
intabcdijka=10===bcd5i=j=k=0fora>b++bi++whilea>++cj++dok++whilea>d++三編程題、編程求以下公式的值1?。
s=1+1/(1?2)+1/(2?3)+…+1/(n?(n+1))編程打印所有的水仙花數所謂水仙花數是指一個位數其各位數字的立方和等2?。3,於該數如是一個水仙花數因為333。:153,153=1+5+3。
輸入兩個正整數和求最大公約數和最小公倍數3?mn,。
編程打印出以下圖案4?。
???????
?????
???
?
第6章數組數組是一種數據類型不同於整型實型這些基本的數據類型它與結構體類型共用體,、,、類型一樣屬於構造類型的數據構造類型的數據是由基本數據類型按照一定規則組成的。。
數組中的每一個數據稱為一個數組元素每一個元素都屬於同一個數據類型用統一的數組,,名和不同的下標來表示每一個元素本章主要介紹如何定義和使用數組。。
6?1任務4———用冒泡法對10個數排序問題數據查找與排序是編寫程序時經常遇到的問題現在假設一個班有名同學要求編。10,寫程序對他們在一次考試中的數學成績由高到低進行排序。
分析對n個數據進行排序需要對數據比較大小將數據按大小順序進行排列最後打印輸,,,出因此解決問題的核心方法為第步將待排序的數據按照隨機順序排列將第個數。:1,,1與第個數進行比較若第個數較大則將兩數交換位置反之保持兩數原來的位置不2,1,;,變這樣經過第步處理後就能保證第個位置是大數第步將新順序數據中的第。,12。2,2個數與第個數進行比較采用第步介紹的方法進行數據的再次排序經過n步的3,1……-1處理可以將最大的數排到第n個位置將除去最大數後剩下的n個數按照前述的方法,。-1進行排序經過n步處理後可以將第二大的數據排到第n個位置如此經過n,-2,-1……,-1輪的排序便可將所有n個數據按由小到大的順序排好,。
數據需求問題輸入an/存放成績數據/[];??
問題輸出an/存放排列好的數據/[];??
算法設計根據以上分析用流程圖來表示算法,61。
第章數組695圖61冒泡排序法流程圖實現根據本節任務提出的問題設由流程圖寫出程序定義數組長度為那麼數,n=10,。10,組中的元素可表示為其中存放第個同學的數學成績存放第a[0]~a[9],a[0]1,a[9]10個同學的數學成績程序如下。:#include<stdio.h>maininta10intijtempprintf"put10numbers\n"fori=0i<10i++scanf"%d"&aiprintf"\n"forj=0j<9j++fori=0i<9-ji++ifai>ai+1temp=aiai=ai+1ai+1=temp語言程序設計案例教程96Cprintf"Thesortednumbersis\n"fori=0i<10i++printf"%d"aiprintf"\n"運行情況如下:Input10numbers40956378887293688399↙Thesortednumbersis406368727883889395996?2一維數組一維數組的定義6?2?1一維數組的定義方式為:類型說明符數組名常量表達式其中:類型說明符表示數組元素的數據類型可以為基本數據類型中的任意一種(1),;數組名的命名規則與變量相同遵循標識符的命名規則(2),;方括號括起來的常量表達式表示數組中元素的個數即數組的長度(3),;常量表達式可以包含常量和符號常量但不能是變量語言中不允許對數組的(4),。C大小進行動態的定義即數組的大小不能在程序中隨意改變,。
數組的定義方法如:intbuffer10表示定義了一個元素個數為的數組數組元素為整數類型數組元素分別為10buffer,。
buffer[0]、buffer[1]、buffer[2]、buffer[3]、buffer[4]、buffer[5]、buffer[6]、buffer[7]、buffer注意數組元素的下標都是從開始的不是數組中的元素[8]、buffer[9]。,0,buffer[10]。
如下所示為數組錯誤的定義方法:intnn++intbuffern第章數組697一維數組元素的引用6?2?2數組在使用之前也需要先定義語言中規定隻能逐個引用數組元素而不能一次引。C,用整個數組字符串除外數組元素的表示形式為()。:數組名下標下標可以是整型常量或整型表達式也可以是在數組元素引用前有固定值的已定義整,型變量如,:intibuffer9=buffer0+buffer2i+3-buffer24??
例61數組元素的引用【】。
#include<stdio.h>mainintia10fori=0i<10i++scanf"%d"&ai/從終端給數組元素賦值/??fori=9i>=0i--printf"%d"ai/數組元素的引用/??運行結果如下:9876543210↙0123456789一維數組的初始化6?2?3在應用數組的過程中常需要對數組進行初始化方法主要有以下幾種,:在定義數組時對數組元素進行賦值例如(1),:inta10=12345678910將初值按照賦值對象的順序排列在花括號以內並以逗號隔開這樣數組元素。,a[0]~的初值分別為a[9]:a[0]=1,a[1]=2,…,a[9]=10。
隻給出一部分元素的賦值例如(2),:inta10=12345定義的數組有個元素前個元素初值分別為a10,5a[0]~a[4]a[0]=1,a[1]=2,…,後個元素的初值為a[4]=5,50。
如果想對一個數組中的所有元素賦相同的初值可以寫成(3),:inta10=1111111111語言程序設計案例教程98C但不能寫成:inta10=110?
對全部數組元素賦初值時可以不指定數組長度例如(4),,:inta=12345表示定義了一個數組長度為的整型數組初值分別為5,a[0]=1,a[1]=2,a[2]=3,a但如果提供的初值個數與數組長度不一致則不能如例中省略數組長度[3]=4,a[4]=5。,進行初始化應參照第種方法,2。
一維數組的應用6?2?4例62用數組來求以內數的階乘【】10。#include<stdio.h>mainintina10longtemp=1printf"Inputthenumber\n"scanf"%d"&n/輸入待求階乘的整數/??
fori=0i<ni++ai=i+1fori=0i<ni++temp=tempai?printf"%d=%ld\n"ntemp運行情況如下:Inputthenumber9↙9=3628806?3二維數組二維數組的定義6?3?1二維數組的定義格式為:類型說明符數組名常量表達式常量表達式其中要說明的是:數組名後常量表達式個數表示數組的維數語言允許定義和使用多維(1)“[]”,C第章數組699數組;對於二維數組第一個常量表達式表示二維數組的行第二個常量表達(2),“[]”“”,“[式表示二維數組的列如就表示定義了一個數組名為的行]”“”。“inta[3][4];”a3×4(34列的二維數組);二維數組中元素的表示方法(3):以為例可以將二維數組看成是一種特殊的一維數組它裏麵的元素又“inta[3][4];”,,是一些一維數組如可以將二維數組看作是隻有個元素的一維數組即。a3,a[0]、a[1]、a這個元素又是各自擁有個元素的一維數組結構如圖所示[2],34。62。
a[0]---a[0][0]a[0][1]a[0][2]a[0][3]a[3][4]{a[1]---a[1][0]a[1][1]a[1][2]a[1][3]a[2]---a[2][0]a[2][1]a[2][2]a[2][3]圖62二維數組結構語言中二維數組的元素在內存中的存儲順序是按行存放的即先存儲第一行接(4)C,,著存儲第二行依此類推如中個元素的存儲順序為,。a[3][4]12:a[0][0]→a[0][1]→a[0][2]→a[0][3]→a[1][0]→a[1][1]→a[1][2]→a[1][3]→a[2][0]→a[2][1]→a[2][2]→a[2][3]。
多維數組的定義規則和二維數組類似如(5),:floata334表示定義了一個三維數組元素個數為個其中各元素在內存中存放的順,3×3×4=36,序為:a[0][0][0]→a[0][0][1]→a[0][0][2]→a[0]a[0][3]→a[0]a[1][0]→a[0]a[1][1]→a[0]a[1][2]→a[0]a[1][3]→a[0]a[2][0]→a[0]a[2][1]→a[0]a[2][2]→a[0]a[2][3]→a[1][0][0]→a[1][0][1]→a[1][0][2]→a[1]a[0][3]→a[1]a[1][0]→a[1]a[1][1]→a[1]a[1][2]→a[1]a[1][3]→a[1]a[2][0]→a[1]a[2][1]→a[1]a[2][2]→a[1]a[2][3]→a[2][0][0]→a[2][0][1]→a[2][0][2]→a[2]a[0][3]→a[2]a[1][0]→a[2]a[1][1]→a[2]a[1][2]→a[2]a[1][3]→a[2]a[2][0]→a[2]a[2][1]→a[2]a[2][2]→a[2]a[2][3]二維數組元素的引用6?3?2二維數組的元素表示形式為:數組名下標下標如表示第行第列的元素下標可以是整型表達式如a[2][3],34。,a[1?2][3-1]。
注意不能寫成或的錯誤形式a[2,3]a[1?2,3-1]。
數組元素可以出現在表達式中也可以被賦值如,,:b01=a123?
在使用數組元素時應注意下標值在已定義的數組大小範圍之內取值從開始數組,,0。
語言程序設計案例教程100C中最後一個元素的下標應為定義數組時的常量表達式如有定義-[]1。:inta34那麼數組中最後一個元素為或是不存在的所以讀者,a[2][3],a[3][?]a[?][4]。
應注意區分定義中的和引用中的前者是定義數組的維數和大小後者a[3][4]a[3][4],,是一個元素具體的數據注意元素不是所定義的數組中的元素()。:“a[3][4]”a[3][4]。
二維數組的初始化6?3?3二維數組初始化的方法主要有以下幾種:分行給二維數組賦初值如(1)。:inta34=123456789101112把第個花括號內的數據賦給第一行的元素第個花1a[0][0]、a[0][1]、a[0][2],2括號內的數據賦給第二行的元素即按行賦初值a[1][0]、a[1][1]、a[1][2]…。
可以將所有數據寫在一個花括號內係統將按數組排列順序對逐個元素賦值如(2),。:inta34=123456789101112這種賦值方法與第一種類似但不直觀數據太多時容易遺漏也不易檢查,,,。
可以對部分元素賦值如(3)。:inta34=123其作用是對每行第列數據進行賦值其餘元素自動為賦值後各元素的值為1,0。:éùê1000úêúê2000ú?ê?ú3000也可以對各行中的某一個或幾個元素進行賦值:inta34=1020009這樣初始化後各元素的值為,:éùê1000úêúê0200ú?ê?ú0009這樣的初始化方法適用於非元素較少時的賦值不必將所有的寫出來隻需輸入少0,0,量的數據即可。
也可以隻對某幾行元素賦初值:inta34=102初始化後各元素的值為,:第章數組6101éùê1000úêúê0200ú?ê?ú0000沒有對第行進行賦值取值自動為也可以對第行不賦值3,0。2:inta34=102如果對全部元素都賦初值則定義數組時對第一維的長度可以不指定但第二維的(4),,長度不能省如。:inta34=123456789101112等價於:inta4=123456789101112係統會根據數據的總個數來分配存儲空間一共個數據每行個顯然能確定一共:12,4,行3。
在定義時也可以隻對部分元素賦初值而省略第一維的長度但應分行賦值如,。:inta4=12345這種寫法也能告訴編譯係統數組共有行賦值後各元素的值為,3,:éùê1230úêúê0000ú?ê?ú4500二維數組的應用6?3?4例63使用二維數組求如下矩陣的轉置矩陣【】。
??
???14÷a=?123÷b=è???25÷456è?
36程序如下:語言程序設計案例教程102C#include<stdio.h>maininta23=123456intb32ijprintf"arraya\n"==++fori0i<1iforj=0j<=2j++printf"%5d"aijbji=aijprintf"\n"printf"arrayb\n"fori=0i<=2i++forj=0j<=1j++printf"%5d"bijprintf"\n"第章數組6103例64在給定的數組中找出與輸入數據一樣的數據並給出所在的行號和列號【】,。
先畫出流程圖見圖。63。
圖63例64流程圖語言程序設計案例教程104C根據流程圖寫出程序:#include<stdio.h>maininta34=123456789-506intijnintflag=0printf"inputyournumber\n"scanf"%d"&nfori=0i<=2i++forj=0j<=3j++ifaij==nflag=1printf"row=%dcolum=%d\n"ijifflag==0printf"cantfindthenumber"?運行情況如下:inputyournumber6↙row=1colum=1row=2colum=36?4字符數組字符數組的定義及初始化6?4?11?字符數組的定義用來存放字符數據的數組稱為字符數組字符數組中的一個元素存放一個字符字符。。
數組的定義方法與前麵介紹的數組定義方法類似如。:charc12第章數組6105c0=Hc1=ec2=lc3=lc4=oc5=c6=w??????????????c7=oc8=rc9=lc10=dc11=??????????
定義了名為的字符數組元素個數為定義後數組的狀態如圖所示c,12。64。
Helloworld!
圖64字符數組存儲狀態也可以使用整型數據類型來定義字符數組:intc5但這樣定義將本來一個字節的字符數據采用兩個字節來存放浪費了存儲空間,。
也可以定義二維字符數組:charc252?字符數組的初始化數組的初始化方法與前麵介紹的數組初始化方法規則類似如,:charc12=Helloworld????????????????????????
如果初值個數大於數組定義的範圍則編譯器會提示語法錯誤如果初值個數小於數,。
組範圍則將初值按順序賦給前麵的元素剩下的元素自動定義為空字符如,,(?\0?)。:charc8=Helloc??????????????
數組賦值後狀態如圖所示65:c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]Helloc\0圖65字符數組賦值後的狀態二維字符數組與二維數組的初始化方法類似:charc55=??????????????????????????????????????????????
這個行列字符數組組成了一個鑽石平麵圖形具體程序見例55。66。
字符數組元素的引用6?4?2可以通過引用字符數組中的元素來得到其中的一個字符,。
例65打印輸出一個字符串【】。
#include<stdio.h>maincharc12=Helloworld????????????????????????
語言程序設計案例教程106Cintifori=0i<12i++printf"%c"ciprintf\n??運行結果:Helloworld例66打印輸出一個鑽石圖形【】。
mainchardiamond5=??????????????????????????????????????????????intijfori=0i<5i++forj=0j<5j++printf"%c"diamondijprintf"\n"運行結果為:?
???????
字符串數組6?4?3在語言中字符串也作為字符數組在存放稱為字符串數組例就是用一個一C,,。65維數組存放一個字符串中的字符在使用字符串數組的過程中我們常常關心的是字符串。,的實際長度而不是數組的長度例如定義一個字符數組來存放接收的字符串數據長度為。,,而實際接收到的字符串數據隻有為了測定字符串的實際長度語言規定了一255,100。,C個字符串結束標誌用字符來表示如果一個字符串中第個字符為則字符“”,?\0?。,10?\0?,串中有效字符為個即在對字符串進行測定過程中若遇到表示字符串結束其前9。,?\0?,,麵的字符個數就是字符串的長度。
係統編譯器對字符串常量也自動加一個作為結束符例如?\0?。:charc="Hello"第章數組6107在係統內存中存放情況為:Hello\0圖66數組c存儲情況有了結束標誌字符數組的長度就顯得不那麼重要隻要根據的位置來判斷?\0?,。?\0?
字符串是否結束而不是根據數組的長度來決定字符串的長度但要注意的是定義字符串,。,數組長度的時候要根據實際字符串的長度保證數組長度大於實際字符串的長度如果一,。
個字符串數組需要先後存放幾個不同長度的字符串則應保證數組長度大於最長的字符串,的長度。
要說明的是字符串結束標誌表示碼為的字符在碼中是一個:?\0?ASCII0,ASCII,?\0?
不能顯示的字符表示空操作符意味著什麼也不做這樣采用作為結束標,“NULL”,。,?\0?
誌既不會產生附加操作又不會增加有效字符隻作為一個提供識別的標誌,,。
在字符串的打印輸出與初始化過程中必須考慮的作用,?\0?。
我們之前用過的語句:printf"Helloworld\n"作用是輸出一個字符串函數執行的過程是每輸出一個字符都要判斷下一個字。printf,符是否為遇就結束輸出?\0?,?\0?。
對於字符串數組的初始化我們可以采用如下的方法,:charc="Hello"或省略花括號:charc="Hello"係統在給定義的數組進行初始化時會自動在有效字符後麵加上那麼字符串數組,?\0?,的長度為這與如下的字符數組是等價的6。:charc=Hello\0????????????
而下麵的數組是不同的:charc=Hello??????????
如果有:charc10="Hello"數組的前個字符是第個字符是後個字符為空字符其c5?H?,?e?,?l?,?l?,?o?,6?\0?,4。
在內存中的存儲情況如圖所示67。
Hello\0\0\0\0\0圖67數組c存儲情況要說明的是字符串數組並不要求它的最後一個字符為甚至可以不包括如以,?\0?,?\0?,語言程序設計案例教程108C下的字符串數組定義和初始化是完全合法的:charc5=Hello??????????
是否使用根據需要而定但由於係統對字符串常量總是自動加一個因此為?\0?。?\0?,了使處理方法一致便於測定字符串的實際長度以及在程序中作相應的處理在字符數組,,,中也常常人為地加上一個如?\0?。:charc=Hello\0????????????
字符數組的輸入與輸出6?4?4字符數組的輸入輸出主要有兩種方法:用格式符逐個輸入輸出(1)“%c”。
用格式符按字符串輸入輸出(2)“%s”。
如:charc6scanf"%s"cprintf"%s"c注意:輸出時遇結束且輸出字符中不包含(1),?\0?,?\0?。
格式輸出字符串時函數的輸出項是字符數組名而不是元素名(2)“%s”,printf(),。
例如:charc6="China"輸出時以下兩種寫法都是對的:printf"%s"cprintf"%c"c0以下寫法是不對的:printf"%s"c0格式輸出時即使數組長度大於字符串長度遇也結束(3)“%s”,,?\0?。
例如:charc10="China"printf"%s"c/隻輸出5個字符China/??
格式輸出時若數組中包含一個以上遇第一個時結束(4)“%s”,?\0?,?\0?。
輸入時遇回車鍵結束但獲得的字符中不包含回車鍵本身而是在(5),,(0x0D,0x0A),字符串末尾添因此定義的字符數組必須有足夠的長度以容納所輸入的字符如輸?\0?。,,(,入個字符定義的字符數組至少應有個元素5,6)。
一個函數輸入多個字符串輸入時以空格鍵作為字符串間的分隔(6)scanf,“”。
例如:第章數組6109charstr15str25str35scanf"%s%s%s"str1str2str3輸入數據↙:Howareyou?
被賦值的數據如圖str1、str2、str368。
How\0\0are\0\0you?\0圖68數組str1str2str3存儲情況、、若改成:charstr13scanf"%s"str輸入:Howareyou?
結果僅被輸入數組的賦值情況如圖:“How”str,str69。
How\0\0\0\0\0\0\0\0\0\0圖69數組str賦值情況如要想獲得全部輸入包含空格及其以後的字符程序可設計為str(),:charc13intifori=0i<13i++ci=getchar語言中數組名代表該數組的起始地址因此函數中不需要地址運算符(7)C,,,scanf()“&”。
例如:charstr13scanf"%s"str以下寫法就是不對的:scanf"%s"&str字符串數組處理函數6?4?5為了方便編程者對字符串的處理在編譯器的函數庫中包含了一些字符串的函數,C,熟練地利用這些函數對於程序員的字符串處理是很有好處的下麵介紹幾種常用的函數,。:1?字符串輸出函數puts字符數組:()作用是將一個字符串以結束輸出到終端如果已定義名為的字符串數組(?\0?)。str1,且初始化為則應用“helloworld!”,:語言程序設計案例教程110Cputsstr1其結果是在終端上輸出由於可以用函數輸出字符串因此函helloworld!。printf,puts數用的並不多用函數可以輸出帶轉義字符的字符串例如。puts。:charstr="hello\nworld"putsstr輸出:helloworld在輸出時將字符串結束標誌轉換成即輸出完字符串後換行?\0??\n?,。
2?字符串輸入函數gets字符數組:()作用是從終端輸入一個字符串到字符串數組並返回一個表示字符數組起始地址的函,數值如執行下麵的函數。:getsstr從鍵盤輸入回車computer,。
作用是將這個字符送給字符串數組函數返回值?c?,?o?,?m?,?p?,?u?,?t?,?e?,?r?,?\0?9str,是字符串數組的起始地址當然一般利用函數的目的是向字符串數組輸入一str。,getsstr個字符串而並不關心其函數返回值,。
注意和函數隻能輸入和輸出一個字符串不能寫成:putsgets,:putsstr1str2或getsstr1str23?字符串連接函數strcat字符串數組1字符串數組2:(,)是字符串連接的縮寫作用是連接兩個字符串數組中的字符串strcatstringcatenate()。,把字符串連接到字符串的後麵連接成的新字符串存放在字符串數組中函數調用21,1。
後得到一個表示字符串數組地址的返回值例如1。:charstr120="Thisis"charstr2="anexample"printf"%s"strcatstr1str2連接前後的數組內容狀況如圖所示610。
str1:Thisis\0\0\0\0\0\0\0\0\0\0\0\0str2:anexample\0str1:Thisisanexample\0\0圖610連接前後的字符串存儲狀況注意:字符串數組必須有足夠的長度以便能裝下串接後的新字符串(1)1,。
連接前兩個字符串的後麵都有一個連接後將第一個字符串後麵的去掉(2)?\0?,?\0?,第章數組6111隻在最後保留一個?\0?。
4?字符串複製函數strcpy字符數組1字符數組2:(,)是字符串複製的縮寫作用是將字符串複製到字符串數組中strcpystringcopy()。21去例如。:charstr110str2="hello"執行:strcpystr1str2的狀態如圖所示str1611。
hello!\0\0\0\0圖611複製後的數組str1存儲狀況注意:字符串數組必須有足夠的長度以容納複製進來的字符串字符串數組(1)“1”,。“1”的長度應不小於字符串數組的長度2。
字符串數組必須寫成數組名形式如字符串數組可以是字符串數(2)“1”(str1),“2”組名也可以是一個字符串常量如,,:strcpystr1"hello"複製時連同字符串後麵的一起複製到字符串數組中(3)?\0?1。
不能用賦值語句將一個字符串常量或字符串數組賦給一個字符串數組如下麵兩(4),種寫法都是不合法的:str1="hello"str1=str2而隻能用函數進行字符串的整體賦值用賦值符號隻能是將一個字符賦給一個strcpy。
字符型變量或字符數組元素。
可以用函數將字符串前麵若幹個字符複製到字符數組中去如(5)strncpy21。:strncpystr1str22作用是將中前麵個字符複製到中去取代中前麵個字符str22str1,str12。
5?字符串比較函數strcmp字符串1字符串2:(,)是字符串比較的縮寫功能是對字符串進行比較並返回一個strcmpstringcompare()。,結果。
例如:strcmpstr1str2strcmpstr1"beijing"strcmp"shanghai""wuhan"語言程序設計案例教程112C函數對字符串的比較規則為對兩個字符串自左至右逐個字符的碼進行比較直:ASCII,到出現不同的字符或遇到為止如果字符串全部相同則認為相等若出現不同的字?\0?。。
符則以第一個不同的字符的比較結果為準如,。:?A?<?B?,?C?<?c?,?3?>?!?,"girl">"boy","Women"<"men"。
比較的結果由函數返回值帶回具體規則如下。:如果兩字符串相等函數返回值為(1),0;如果字符串字符串函數返回值為正數(2)1>2,;如果字符串字符串函數返回值為負數(3)1<2,。
例67比較字符串的大小【】str1、str2。
#include<string.h>#include<stdio.h>mainvoidintresultcharstr1="compare"charstr2="computer"result=strcmpstr1str2ifresult==0printf"string1isequaltostring2\n"elseifresult>0printf"string1isgreaterthanstring2\n"elseprintf"string1islessthanstring2\n"運行結果如下:string1islessthanstring2注意判斷兩個字符串不能采用以下的方法:,:ifstr1==str2printfstring1isequaltostring2else?而應該采用函數根據返回值來判斷strcmp,:ifstrcmpstr1str2==0printf"?"第章數組61136?字符串長度函數strlen字符數組:()是字符串長度的縮寫作用是測試字符串的長度函數返回值為strlenstringlength()。,字符串的實際長度有效字符個數不包括在內如(),?\0?。:charstr115="helloworld"運行如下:printf"%d"strlenstr1輸出結果為11。
7?字符串小寫函數strlwr字符串:()是字符串小寫的縮寫作用是將字符串中大寫字母換成小寫strlwrstringlowercase()。
字母。
8?字符串大寫函數strupr字符串:()是字符串大寫的縮寫作用是將字符串中小寫字母換成大寫struprstringuppercase()。
字母。
以上介紹的種字符串處理函數屬於庫函數並非語言本身的組成部分而是人們8,C,為了方便程序的編寫和移植而設計的供大家使用的公共函數一般在文件中進行、。string.h了聲明使用這些函數時應包含文件值得說明的是不同的語言編譯係統對,string.h。,C,庫函數的定義和功能設計都有所不同使用時應仔細查庫函數手冊,。
6?5小型案例問題通過鍵盤輸入一個英文句子存入電腦再輸入一個英文單詞判斷英文單詞是句子中的,,第幾個單詞。
分析解題思路為先測試單詞的序號包括識別一個單詞計算是第幾個單詞接著將第二次輸:,、;入的單詞與當前單詞進行比較若字符全部相同則記錄當前單詞的序號並進行打印輸出,,。
如何測試單詞的序號單詞的序號可以由空格出現的次數來決定連續的空格看作一?(個空格一行開頭的空格不統計如果測出某一個字符為非空字符而前一個字符為空字,)。
符則表示開始了一個新單詞此時加如果當前字符為非空字符而前一個字符也為,,num1。
非空字符則表示還是當前單詞沒有新單詞產生前一個字符是否為空字符可以由看,,。flag出如果表示當前字符為非空字符則表示當前字符為空字符。flag=1,,flag=0,。
句子中的單詞與第二次輸入的單詞進行比較判斷新單詞開始後將當前單詞的各個字:,符取出與輸入的單詞進行比較如果字符相等則將加如果等於輸,,equal_num1,equal_num入單詞的長度而且下一個字符為空字符則確認相同輸出單詞序號一旦發現字符不相,,,。
等而且當前字符為空字符則將清零以準備好與下一個單詞進行比較,i,。
語言程序設計案例教程114C數據需求問題輸入strn/存放一個英文句子/1[];??
strn/存放英文單詞/2[];??
問題輸出num/單詞在英文句子中的位置/;??
算法設計根據以上分析用流程圖來表示算法,612。
圖612案例算法流程圖第章數組6115實現程序如下:#include<stdio.h>#include<string.h>mainintijklenflag=0equal_numintnum=0charcexist=0e_flag=0charstr150charstr210printf"Inputasentence\n"getsstr1printf"Inputaword\n"getsstr2len=strlenstr2forj=0c=str1j=\0j++??ifc==flag=0??elseifflag==0flag=1num++ifstr2i++==str1jequal_num++elseifflag==0/新單詞開始被比較單詞計數清零/??i=0equal_num=0ifequal_num==lenifc=str1j+1==/字符全部相同並且下一個字符為空???字符確認/?printf"Thenumberoftheword\n"printf"%d\n"numi=0equal_num=0exist=1語言程序設計案例教程116Celsei=0equal_num=0ifexist=1printf"Cantfindtheword\n"?運行情況如下:InputasentenceThisisanexampleofc↙Inputawordexample↙Thenumberoftheword4程序中變量作為循環變量變量用來記錄比較次數用來記錄單詞的序號,j;i;num;flag用來測試當前字符是否空字符空字符是新單詞開始的一個關鍵信號如果為非空字符(),,置用來記錄相同字符個數用來表示查詢結果如果查詢到單詞則flag1;equal_num;exist,,置否則為1,0。
6?6小結本章通過任務及案例介紹了數組的相關知識主要包括一維數組二維數組字符數組,、、以及字符串數組相關內容。
重點要掌握的有:一維數組的定義及使用方法注意常量表達式應使用方括號不能使用圓括號(1)。,,。
二維數組的定義和使用方法掌握二維數組在內存中的存儲情況(2)。。
字符數組及字符串數組的定義及初始化方法特別應注意字符數組在內存中的存(3)。
儲情況。
字符串處理函數的應用掌握常用的個字符串處理函數熟悉各函數的函數名(4)。8,、入口參數和出口參數。
習題一選擇題、給出以下定義1?:charx="abcdefg"chary=abcdefg??????????????
第章數組6117則正確的敘述為()。
數組和數組等價數組和數組的長度相同A?XYB?XY數組的長度大於數組的長度數組的長度小於數組的長度C?XYD?XY則數組第一維的大小是2?inta[][3]={1,2,3,4,5,6,7};a()。
A?1B?2C?3D?4不能把字符串賦給數組的語句是3?:Hello!b()。
A?charb[10]={?H?,?e?,?l?,?l?,?o?,?!?};B?charb[10];b="Hello!";C?charb[10];strcpy(b,"Hello!");D?charb[10]="Hello!";若有以下說明4?:inta12=123456789101112charc=adg??
則數值為的表達式是4()。
A?a[g-c]B?a[4]C?a[?d?-?c?]D?a[?d?-c]以下程序的輸出結果是5?()。
mainintp?intix33=987654321p=&x11fori=0i<4i+=2printf"%d"piA?52B?51C?53D?97執行下麵的程序段後變量中的值為6?,k()。
intk=3s2s0=kk=s110?
不定值A?B?33C?30D?10設有數組定義則數組所占的空間為7?:chararray[]="China";array()。
個字節個字節A?4B?5個字節個字節C?6D?7二填空題、以下程序不使用函數進行字符串的拷貝請填空1?strcpy,。
maincharstr180str280inti語言程序設計案例教程118Cprintf"inputstr2\n"scanf"%s"str2fori=0i<=_______i++str1i=str2iprintf"str1%s\n"str1下麵程序的功能是實現將一個字符串中的所有大寫字母轉換為小寫字母並輸出2?。
請補充完整。
例如當字符串為,"ThisIsacProgram"輸出:"thisisacprogram"maincharstr80="ThisIsacProgram"intiprintf"Stringis%s\n"strfori=0stri=\0i++??ifstri>=A&&stri<=Z????
printf"Resultis%s\n"str三編程題、統計全班某門功課成績的平均分數和最高分數假設全班人數為人1?(10)。
編寫一個程序將兩個字符串串接起來不能使用字符串連接函數2?,,。
編寫程序用選擇法對個整數按從小到大的順序排序3?,10。
第7章函數本章開始講述程序設計的一個重要概念函數在開始本章講解之前請大家注意———。,一些概念的準確定義避免引起混淆函數是語言組織程序的方式在日常工作中是必,。C,須用到而且使用頻率也是最高的。
7?1任務5———從身份證號碼中間提取出生日期性別年齡等信息、、問題在你所遇到的某個項目中需要將身份證號碼中的出生日期性別年齡等信息提取、、出來。
分析身份證號碼用位身份證號碼分位和位這裏我們隻考慮位的身(IDCode)18(1815,18份證號碼的字符串表示提取出來的日期用三個整數分別表示年份月份),(Date)(Year)、和日期提取出來的性別用和表示分別代表女性和男性年齡(Month)(Day),(Gender)01,,根據當前年份減去出生年份得到(Age)。
如位的身份證號碼18:450104197710101516位為地區代碼其中位數為各省級政府的代碼位數為地市級政府(1)1~6,1、2,3、4、的代碼位數為縣區級政府代碼,5、6、。
位為出生年份位如(2)7~10(4),1977。
位為出生月份如(3)11~12,10。
位為出生日期如(4)13~14,10。
第位為順序號為縣區級政府所轄派出所的分配碼每個派出所分配碼為(5)15~17,、,個連續號碼例如其中單數為男性分配碼雙數為女性分配碼如遇同年同10,“150~159”,,,月同日有兩人以上時順延第二第三第四第五個分配碼。、、、。
位為校驗位識別碼通過複雜公式算出普遍采用計算機自動生成(6)18(),,。
數據需求問題輸入IDCode/身份證號碼/??
問題輸出Year/年份/??
Month/月份/??
語言程序設計案例教程120CDay/日/??
Gender/性別/??
Age/年齡/??
相關公式年齡當前年份出生年份=-設計主函數流程圖和函數流程圖如圖所示ChangeStrToInt71。
圖71主函數流程圖和ChangeStrToInt函數流程圖根據任務要求輸入的身份證號碼是字符串即字符數組首先根據身份證號碼的意,(),義提取出表示出生年份的字符子串如這個過程中使用,“1977”,char?GetSubString函數實現然後將得到的字符串轉換為對應的整數(char?str,intbegin,intend),1977。
算法這裏涉及的算法相對比較簡單程序為了獨立運行沒有使用頭文件中涉及的,,string.h求字符串子串的函數和求字符串長度函數係統函數strsubstrlen。
實現/程序源代碼文件命名為demo0701.c/??#include"stdio.h"第章函數7121#include"string.h"#include"stdlib.h"/將字符串轉換成整數/??
intChangeStrToIntcharstrintresult=0/下麵的代碼中把數組名當作指針變量來使用/??forstr=\0str++???/將字符表示的數字轉換成對應的整數數字?
並拚接成對應的整數/?=+-resultresult10str48??
returnresult/從字符串中取出對應的子串/??
/如字符串"ABCDE"取出第2個字符開始到第4個字符結束得到字符串"?BCD"/?charGetSubStringcharstrintbeginintend??charresult?inti/為局部變量申請內存/??result=charmalloc80?//用空字符填充字符串??
fori=0i<80i++=resulti0/取子串/??
fori=begin-1i<=end-1i++resulti-begin+1=strireturnresultvoidGetIDCodeInfocharidCodeintcurrentYearintyearint??
monthintdayintageintgender????/GetSubStringidCode710是函數調用語句/??
/把一個函數調用的結果作為另外一個函數調用語句的實際參數/??
語言程序設計案例教程122C/稱為函數的嵌套調用/??
year=ChangeStrToIntGetSubStringidCode710?month=ChangeStrToIntGetSubStringidCode1112?day=ChangeStrToIntGetSubStringidCode1314?age=currentYear-year??ifChangeStrToIntGetSubStringidCode1517%2==0gender=0?elsegender=1?maincharidCode30=""intyearmonthdayagecurrentYear=2009genderyear=month=day=age=gender=0printf"輸入18位的身份證號碼如429004197507022369"getsidCodeGetIDCodeInfoidCodecurrentYear&year&month&day&age&genderprintf"\n輸入身份證號碼為%s\n當前年份為%d\n\t出生日期為%4d/2d%2d\n\t年齡%d\n\t性別%s"idCodecurrentYearyearmonthdayagegender==0"女""男"getch測試運行程序結果:第章函數7123輸入18位的身份證號碼如429004197507022369429004197007222351輸入身份證號碼為429004197007222351當前年份為2009出生日期為1970/7/22年齡39年齡男7?2函數的概念函數是語言組織程序的基本單位用來把實現一個功能相關的代碼組織在一起方C,,便功能的劃分同時一個函數定義好之後可以多次調用減少了代碼的書寫量。,,,。
函數的分類有如下幾種方式。
按函數的出處劃分為係統函數和用戶自定義函數如函數用來求字符串中。strlen(),字符的個數在頭文件中給出如函數用來向操作係統申請內存區在,string.h;malloc(),,頭文件中給出這樣的函數在使用的時候無須自己書寫代碼就可以直接使用隻要stdlib.h。,使用編譯指令包含對應的頭文件即可自定義函數要求用戶自己給出函數的定義inlcude。,才能夠使用這樣的函數稱為自定義函數如程序代碼中間的,,demo0701.cChangeStrToInt、和函數GetSubStringGetIDCodeInfo。
按函數的參數不同劃分為有參函數和無參函數如果一個函數在調用的時候不需要給。
出參數這樣的函數稱為無參函數反之稱為有參函數比如中間的,,。demo0701.cChangeStr?
函數函數定義為這裏的就是定義了一個參ToInt,intChangeStrToInt(charstr[]),charstr[]數則函數是一個有參函數如函數其作用是等待用戶輸入一個,ChangeStrToInt。getch(),鍵就是一個無參函數,。
按是否有返回值劃分為有返回值函數和無返回值函數如果一個函數的返回值為。void類型表示這個函數不需要返回一個值給函數的調用者則這樣的函數稱為無返回值的函,,數反之稱為有返回值函數如我們書寫一個函數用來提示用戶敲任意鍵之後繼續程序的,。,運行代碼可以寫為,:voidwaitInfomationprintf"\n..."請輸入回車繼續運行程序getch這個函數就沒有返回值函數稱為無返回值函數比如中,waitInfomation()。demo0701.c間的函數最後返回了一個整數值就是一個有返回值的函數ChangeStrToInt(),,。
庫函數的使用7?2?1庫函數是係統已經寫好了供用戶直接調用的函數庫函數針對不同的編譯係統所提,。,語言程序設計案例教程124C供的函數多少也不完全一樣函數名稱和參數定義也會不完全一樣要注意的是調用庫函,。,數一定要引用定義庫函數的頭文件如要使用中定義的函數求一個字符串。,string.hstrlen的長度就需要在文件的開始位置加上彙編指令或者寫成,“#inlcude"string.h"”“#include<附錄給出了語言常用的庫函數的列表string.h>”。2C。
函數的定義7?2?2函數的定義就是給出函數的所有內容是完成函數功能的所有的程序塊其一般格式為,。:函數類型函數名稱形式參數表/函數首部/??
說明語句部分可執行語句部分/函數體/??說明:其中第一行函數類型函數名稱形式參數表稱為函數首部其他部分稱為函(1)“()”,數體注意函數首部後麵無分號函數體必須用大括號對括起來。,,。
函數的類型表示函數執行之後返回的數據的類型如果函數不需要返回值的(2)。
時候函數類型寫成類型如果省略函數類型不寫係統會把函數類型當作,void。,int類型。
函數名稱是一個標識符同一個程序中函數的名稱不能相同這和其他語言可能(3),,不同。
函數首部的小括號是語法的一部分必須出現即便是沒有形式參數小括號也不(4),,,能省略。
形式參數用於調用函數和被調用函數之間的數據傳遞調用函數通過實際參數把(5)。
數據傳遞給形式參數形式參數在係統調用之前不在內存中隻有在調用後才出現注意,,。:當有多個形式參數的時候如不能省略書寫即不能寫成(:voidfun(intx,inty)),(voidfun(intx,y))。
例71寫函數求的和【】,1+2+3+…+100。
第章函數7125#include<stdio.h>intsummationintnintisumfori=1sum=0i<=ni++sum+=ireturnsumvoidmainintsumintnn=100sum=summationnprintf"1+2+...+100=%d\n"sum程序運行結果:1+2+...+100=5050說明程序從主函數開始運行當運行到語句時程序跳轉到函數:,sum=summation(n);,去執行並把實參的值賦給形參這裏雖然實參的名稱和形參的名intsummation(intn),nn,稱相同但是它們處在不同的內存區可以當作是兩個完全不同的變量函數執行完成之後,,。
回到語句繼續往下執行並把語句中變量的值作為函sum=summation(n);,returnsum;sum數值傳送給語句中的變量這一條語句是,sum=summation(n);sum。sum=summation(n);函數調用語句。
函數的聲明7?2?3在寫得比較好的語言代碼中函數在使用之前先聲明函數聲明使得編譯器能夠檢C,。
查函數定義時的參數類型和函數調用時的參數類型之間不合法的類型轉換參數個數和函,數定義時參數個數的差別一般用函數定義時函數的首部後麵加分號作為函數的聲明可。。
以省略函數形參的變量名稱。
一般形式如下:函數類型函數名形式參數表比如代碼中的函數的聲明可以寫成demo0702.csummation:語言程序設計案例教程126Cintsummationintn也可以寫成:intsummationint如果程序中函數的定義出現在第一次調用該函數之前那麼函數的定義可以起到聲明,的作用也就是說這時可以省略函數的聲明還有一種情況可以省略聲明就是函數的返,,。,回值是整型數值類型的時候可以省略聲明。
7?3函數的參數和返回值函數的參數7?3?1如果一個函數需要接收參數那麼在定義函數的時候必須事先定義可以接收這些參數,值的參數這就是函數的形式參數形參定義放在函數定義後麵的括號中代碼,,。Demo0702.的函數還可以寫成下麵的形式c。
intsummationnintnintisumfori=1sum=0i<=ni++sum+=ireturnsum函數的形式參數可以當作函數內的局部變量使用。
函數的返回值7?3?2函數終止執行返回到調用該函數的程序時可能有兩種情況一是函數的最後一條語句,,執行完畢另外一種情況就是遇到語句語句有種可能的用法,return。return3。
return終止函數的執行;。
returnx終止函數的運行並返回x的值;。
returnx終止函數的運行並返回x的值要注意return隻是一個關鍵字而();。,,不是函數。
除函數類型為之外的所有函數都需要有返回值void。
在寫程序的時候用到函數的有種類型3。
第一種是簡單的計算類型這種函數被專門設計成對函數的參數執行一定的操作並。,第章函數7127將計算的結果返回比如庫函數和。sqrt()sin()。
第二種類型的函數是對信息進行處理並返回一個表示信息處理成功還是失敗的值,。
如庫函數用來將信息寫入到文件磁盤文件中如果寫入成功返回寫入成功的信息fwrite(),,條數如果寫入失敗返回與要求寫入信息條數不等的數值,,。
第三種函數沒有返回值這類函數是過程化不會產生需要返回的值比如係統函數。,。
它用來輸出一些信息雖然這種函數有時也返回了值而這個值並不是非返回不可printf(),,,的有用值。
如果函數在語句中返回的值的類型與函數類型不一致會進行強製類型轉換轉return,,換成函數類型的值。
7?4函數的參數傳遞方式在計算機語言中將參數傳遞到子程序中的方法有兩種第一種稱為值傳遞這種方法,。,把參數的值複製給子程序的形式參數第二種稱為地址傳遞這種方法把參數的地址複製。,給形式參數。
值的傳遞7?4?1在值傳遞方式中由於形式參數得到的值是實際參數的一個副本所以對於形式參數,,,的值的修改不會影響到實際參數的值,。
例72下麵的代碼嚐試通過將兩個形式參數的值互換達到交換實際參數值的功【】能不能成功,。
#include<stdio.h>voidswapValueintxintyinttemptemp=xx=yy=tempmainintxyx=3y=5printf"\n交換前x=%dy=%d"xyswapValuexyprintf"\n交換後x=%dy=%d\n"xy語言程序設計案例教程128C程序運行結果:交換前x=3y=5交換後x=3y=5地址的傳遞7?4?2在地址傳遞方式中仍然是把實際參數的值複製給形式參數但是參數的值是一個地,,址在子程序中通過地址來存取實際參數所指向的地址的值這就意味著通過對形式參數。。
所指向的值的修改可以影響到實際參數所指向的值,。
例73編寫函數實現兩個數的交換【】,。
#includestdiohvoidswapintxintzz=x0x0=x1x1=zmaininta2=12prinf"\n交換前a0=%da1=%da1=%d\n"a0a1swapaprintf"交換後a0=%da1=%d\n"a0a1說明:數組名就是數組首元素的地址我們可以通過傳遞數組名的方法來修改數組元素的值,。
程序運行結果:交換前a0=1a1=2交換後a0=2a1=1例74編寫函數將一維數組的數組元素倒置【】,。
第章函數7129#include<stdio.h>#defineN10voidconvertintdataintifori=0i<N/2i++inttt=dataidatai=dataN-i-1dataN-i-1=tvoidprintDataintdataintiprintf"\n"fori=0i<Ni++printf"%d\t"dataimainintdata=1234567890printf"轉置前"printDatadataconvertdataprintf"轉置後"printDatadata程序運行結果:轉置前1234567890轉置後0987654321語言程序設計案例教程130C7?5函數的調用函數的調用方式可以分為一般調用嵌套調用和遞歸調用類、3。
函數的一般調用7?5?1如例中的對於有返回值的函數還可以如例中的74printData(data);,,71sum=方式調用把函數調用的結果直接作為一個值賦給其他變量對於有返回值的函summation(n);,。
數來說如果不需要使用函數調用的值也可以直接調用讓函數執行一次如,,,。summation(n);。
函數的嵌套調用7?5?2函數的嵌套調用是指在一個函數調用語句中函數的實際參數是一個函數調用的結果,。
例75求三個整數中間的最大數的值【】。
#include<stdio.h>intmaxintxintymainintabcintmaxva=3b=4c=5maxv=maxmaxabc/這裏就是max函數的嵌套調用/??printf"最大值為%d\n"maxvintmaxintxintyreturnx>yxy程序運行結果:最大值5函數的遞歸調用7?5?3函數的遞歸調用是指在一個函數的定義中又調用了這個函數本身遞歸調用也稱循環。
定義遞歸就是用自身來定義某事的過程。。
我們可以用一個簡單的公式來表示可以使用遞歸來完成的函數:第章函數7131函數類型fun數據類型nif滿足遞歸出口條件return結果else轉換為更加簡單的調用例76求的值【】n!。
如果我們用來表示則時時fun(n)=n!,n=1,fun(1)=1;n>1,fun(n)=n?fun(n-1)。
#include<stdio.h>longfunintnvoidmainintnn=5printf"%ld\n"funnlongfunintnlongretifn==1/遞歸結束條件/??ret=1elseret=nfunn-1/遞歸公式/???
returnret程序運行結果:1207?6變量的作用域和存儲類型變量的作用域7?6?1變量的作用域是指變量有定義的程序部分即變量能夠使用的代碼範圍根據變量的,。
作用域把變量分為全局變量和局部變量。
語言程序設計案例教程132C1?局部變量局部變量是在函數中定義的變量其使用範圍在它所存在的語句塊中間局部變量也稱,,內部變量局部變量不需要說明因為其不能跨越編譯單元函數的形式參數當作局部變。,。
量使用。
2?全局變量全局變量是在任何一個函數外部定義的變量其使用範圍在其定義之後的所有函數,。
其作用域內的函數都可以訪問全局變量如果一個局部變量和一個全局變量的名稱相同那,,麼在該局部變量的作用域內局部變量將會屏蔽全局變量,。
變量的存儲類型7?6?2語言支持種存儲類型它們是這些說明符告訴編譯器C4,extern、static、register、auto。
如何存儲相應的變量。
一般定義方法:存儲類型數據類型標識符1?auto類型是表示自動類的關鍵字在函數內部定義的變量如果不指定其存儲類型那麼就auto,,,是自動類存儲變量也可以在定義變量的時候加上關鍵字如。auto,:autodoublex;。
自動變量在使用中須注意:自動變量的作用域局限於定義它的語句塊或函數出了其作用域其值即從內存(1)。,中撤銷。
不同語句塊中的變量可以同名同名變量不會使用相同的內存單元(2)auto。。
函數的形參具有自動變量的屬性但是不允許對形參使用關鍵字(3),auto。
2?register類型用關鍵字修飾的變量是寄存器變量它隻能用來修飾局部變量寄存器變量的register,。
值存放在寄存器中存放在寄存器中的變量具有更高的運行速度可以對一段時期內反複使,,用的局部變量定義為寄存器變量比如循環變量寄存器變量的數據類型隻有,。char、short、和指針類型unsignedint、int。
3?extern類型關鍵字修飾的變量是外部變量語言允許單獨編譯一個程序的各個模塊然extern。C,後鏈接起來這樣可以加速編譯和管理大型的項目所以必須提供一種方法讓所有的文件了,,解程序所需要的全局變量解決的方法就是在一個文件中聲明所有應用程序需要的全局。,變量然後在使用的文件中使用來聲明,extern。
例77演示不同文件中的使用【】extern。
在源代碼文件中輸入如下代碼Demo70601.C:第章函數7133#include<stdio.h>ints/定義全局變量/??main/由於函數是在另外一個編譯單元中定義而不是在本文件中定義所以在聲明的?
時候加上了extern修飾./?externprocprocprintf"%d\n"s在同一個項目的另外一個源代碼文件中輸入如下代碼Demo70602.C:externints/聲明全局變量s/??/編寫用來處理全局變量的函數proc/??voidprocs=100程序運行結果:100當聲明為變量創建存儲空間時稱為定義通常語句是聲明而不是定義如果,。,extern,(一個聲明包含了初始化那麼就是定義它隻是簡單地告訴編譯器該定義已經存在於程,)。