語言實(shí)例解析精粹_第1頁
語言實(shí)例解析精粹_第2頁
語言實(shí)例解析精粹_第3頁
語言實(shí)例解析精粹_第4頁
語言實(shí)例解析精粹_第5頁
已閱讀5頁,還剩395頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

在版編目(CIP)數(shù)C語言實(shí)例解析精粹/,,編著.—:人民郵電,2005.3ISBN7-115-13183-X Ⅱ.①曹…②林…③徐… Ⅲ.C語言-程序設(shè)計(jì)Ⅳ.TP312館CIP(2005)第017833號(hào)本書共分8篇,分別為基礎(chǔ)篇、數(shù)據(jù)結(jié)構(gòu)篇、數(shù)值計(jì)算與趣味數(shù)學(xué)篇、圖形篇、系統(tǒng)篇、常見試題解答篇、游戲篇和綜合實(shí)例篇,匯集了近200個(gè)實(shí)例,基本涵蓋了目前C語言編程申,同時(shí)程序代碼中融會(huì)了C語言的各種編程技巧,條理清晰,以方便讀者舉一反三,開發(fā)出本書適合具有初步C語言基礎(chǔ)的讀者閱讀,可作為高校相關(guān)專業(yè)的輔導(dǎo),也可作CC 徐慧 湯人民郵電市崇文區(qū)夕照寺街 電子函件 http 讀者密 開本 字?jǐn)?shù):706千 2005年3月第1印數(shù):1–5000 2005年3月第1次印ISBN7-115-13183-定價(jià):44.00元(附光盤 的計(jì)算機(jī)軟件設(shè)計(jì)中,無論開發(fā)技術(shù)如何發(fā)展,C語言作為一種基C語言,不VisualC++VisualC++.NET,BorlandC++Builder等開發(fā)工具都還遵循著標(biāo)準(zhǔn)C語言的基本語法。在很多嵌入式系統(tǒng)的軟件設(shè)計(jì)中,甚至都采用C語言來進(jìn)行開發(fā)。為什么對(duì)于C能讀懂別人編寫的代碼,而自己編寫程序時(shí)卻無所適從,往往不清楚通過程序語言的控制結(jié)構(gòu)如何將簡單的計(jì)算步驟串聯(lián)起來完成一項(xiàng)復(fù)雜的計(jì)算。提高程序設(shè)計(jì)能力的一個(gè)重要途徑是學(xué)習(xí)別人編寫的程序,從中掌握解決問題的方法和關(guān)鍵步驟,循序漸進(jìn),直至自己能夠找出算法并編寫程序。本書正是為了滿足CC語言實(shí)本書特200個(gè)實(shí)例的編程求解為線索,突出了對(duì)例題的分析、對(duì)知識(shí)速提高C語言的“程序設(shè)計(jì)能力”。主要內(nèi)基礎(chǔ)篇C語言編程的基礎(chǔ)知識(shí),包括第一個(gè)程序的建立,基制余弦曲線,計(jì)算高次方數(shù)的尾數(shù),求解數(shù),猜想,素?cái)?shù)幻方,的圖形篇——介紹如何使TurboC提供的圖形函數(shù),繪制基本的直線、圓弧,設(shè)置屏幕顏色、線條類型、填充類型;繪制直線類圖形、石、飄帶、腎形、心臟形、等圖案;繪制正多邊形、遞歸三角形、拋物樣條曲線等;實(shí)現(xiàn)圖形變換,VGA編程,分形圖,動(dòng)畫設(shè)計(jì)等。系統(tǒng)篇TurboC中的系統(tǒng)調(diào)用函數(shù),編寫屏幕窗口程序、獲取系統(tǒng)各類信息程序以及硬件參數(shù)程序等。常見試題解答篇—介紹一些常見的C語言考試試題的解答方法,比果拼盤問題、計(jì)算方差、統(tǒng)計(jì)符合特定條件的數(shù)、字符串倒置、部分排序、產(chǎn)品銷售記錄處理、求解三角方程、統(tǒng)綜合實(shí)例篇——介紹了綜合CAD系統(tǒng)、功能強(qiáng)大的文本編輯器、管理系統(tǒng)和進(jìn)銷存管理TurboC2.0BorlandC++3.1編譯器中調(diào)試通過。如果某些程序需要顯示VisualC++VisualC++.NETDOS下運(yùn)行,需要先運(yùn)行漢字環(huán)境,比如UCDOS。具體的使用方法參見“光盤使用說明”以及光盤中的相關(guān)文檔。本書在編寫過程中,參考了《TheCProgrammingLanguageInternet上的相關(guān)資源,技術(shù)支本書主要由、編寫,參加寫作的人員還有吳越、、續(xù)瑞瑞、、、等。在寫作過程中,我們力求精益求精,但難免存在一些不足之處,懇請(qǐng)讀者批評(píng)指正。如果您在使用本書時(shí)遇到問題,可以發(fā)il至jn nta n編20053 1第一個(gè)C程 通過指針比較整數(shù)大 2求整數(shù)之 指向數(shù)組的指 3比較實(shí)數(shù)大 尋找指定元素的指 4字符的輸 尋找相同元素的指 5顯示變量所占字節(jié) 數(shù)字轉(zhuǎn)換為羅馬數(shù) 6自增/自減運(yùn) 字符替 7數(shù)列求 從鍵盤讀入實(shí) 8乘法口訣 字符行排 9猜數(shù)字游 字符排 模擬ATM(自動(dòng)柜員機(jī))界 判斷字符串是否回 用一維數(shù)組統(tǒng)計(jì)學(xué)生成 的輸入輸 用二維數(shù)組實(shí)現(xiàn)矩陣轉(zhuǎn) 牌的結(jié)構(gòu)表 求解二維數(shù)組的最大/最小元 用“結(jié)構(gòu)”統(tǒng)計(jì)學(xué)生成 利用數(shù)組求前n個(gè)質(zhì) 報(bào)數(shù)游 編制萬年 模擬社會(huì)關(guān) 對(duì)數(shù)組元素排 統(tǒng)計(jì)文件的字符 任意進(jìn)制數(shù)的轉(zhuǎn) 同時(shí)顯示兩個(gè)文件的內(nèi) 判斷回文 簡單的文本編輯 求數(shù)組前n元 文件的字?jǐn)?shù)統(tǒng)計(jì)程 求解鋼材切割的最佳訂 學(xué)生成績管理程 插入排 排 實(shí)例 冒泡排 實(shí)例 快速排 實(shí)例 選擇排 實(shí)例 堆排 實(shí)例 歸并排 實(shí)例 基數(shù)排 實(shí)例 順序表插入和刪 實(shí)例 鏈表操 實(shí)例 雙鏈

實(shí)例 二叉樹遍 實(shí)例 浮點(diǎn)數(shù)轉(zhuǎn)換為字符 實(shí)例 漢諾塔問 實(shí)例 哈夫曼編 實(shí)例 圖的深度優(yōu)先遍 實(shí)例 圖的廣度優(yōu)先遍 實(shí)例 求解最優(yōu)交通路 實(shí)例 八皇后問 實(shí)例 騎士巡 實(shí)例 繪制余弦曲線和直線的迭 實(shí)例 計(jì)算高次方數(shù)的尾 實(shí)例 打魚還是曬 實(shí)例 怎樣存錢以獲取最大利 實(shí)例 實(shí)例 親密 實(shí)例 自守 實(shí)例 具有abcd=(ab+cd)2性質(zhì)的 實(shí)例 驗(yàn)證猜 實(shí)例 素?cái)?shù)幻 實(shí)例 百錢百雞問 實(shí)例 的數(shù)學(xué) 實(shí)例 三色球問 實(shí)例 手稿中的數(shù)學(xué) 實(shí)例 配對(duì)新郎和新 實(shí)例 約瑟夫問 實(shí)例 郵票組 實(shí)例 分糖 實(shí)例 波瓦松的分酒趣

實(shí)例 求π的近似 實(shí)例 奇數(shù)平方的有趣性 實(shí)例 角谷猜 實(shí)例 四方定 實(shí)例 卡布列克常 實(shí)例 尼科徹斯定 實(shí)例 牌自動(dòng)發(fā) 實(shí)例 常勝將 實(shí)例 搬山游 實(shí)例 兔子產(chǎn)子(菲波那契數(shù)列 實(shí)例 數(shù)字移 實(shí)例 多項(xiàng)式乘 實(shí)例 產(chǎn)生隨機(jī) 實(shí)例 堆棧四則運(yùn) 實(shí)例 遞歸整數(shù)四則運(yùn) 實(shí)例 復(fù)平面作 實(shí)例 繪制彩色拋物 實(shí)例 繪制正態(tài)分布曲 實(shí)例 求解非線性方

實(shí)矩陣乘法運(yùn) 求解線性方 n階方陣求 復(fù)矩陣乘

求定積 求滿足特異條件的數(shù) 超長正整數(shù)的加 繪制直 正方形螺旋拼塊圖 繪制 圖形法繪制 繪制圓 遞歸法繪制三角形圖 繪制橢 圖形法繪制橢 設(shè)置背景色和前景 拋物樣條曲 設(shè)置線條類 Mandelbrot分形圖 設(shè)置填充類型和填充顏 繪制布朗運(yùn)動(dòng)曲 圖形文本的輸 藝術(shù)清 石圖 矩形區(qū)域的顏色填 飄帶圖 VGA256色模式編 圓環(huán)圖 繪制藍(lán)天圖 腎形圖 屏幕檢測程 心臟形圖 運(yùn)動(dòng)的小車動(dòng) 漁網(wǎng)圖 動(dòng)態(tài)顯示位 圖 利用圖形頁實(shí)現(xiàn)動(dòng) 設(shè)置圖形方式下的文本類 圖形時(shí) 繪制正多邊 音樂動(dòng) 正六邊形螺旋圖 DOS系統(tǒng)中的息278 磁盤文 修改環(huán)境變量 刪 顯示系統(tǒng)文件 定義文本模 顯 內(nèi) 設(shè)計(jì)立體窗 實(shí)例 彩色彈出菜 實(shí)例 CMOS信息 實(shí)例 獲取BIOS設(shè)備列 實(shí)例 鎖住硬

實(shí)例 備份/恢復(fù)硬盤分區(qū) 實(shí)例 設(shè)計(jì)口令程 實(shí)例 程序自我保 實(shí)例 水果拼 實(shí)例 小孩吃 實(shí)例 刪除字符串中的特定字 實(shí)例 求解符號(hào)方 實(shí)例 計(jì)算方 實(shí)例 求取符合特定要求的素 實(shí)例 統(tǒng)計(jì)符合特定條件的 實(shí)例 字符串倒 實(shí)例 部分排 實(shí)例 產(chǎn)品銷售記錄處 實(shí)例 特定要求的字符編

實(shí)例 求解三角方 實(shí)例 新完全平方 實(shí)例 三重回文 實(shí)例 奇數(shù)方 實(shí)例 統(tǒng)計(jì)選 實(shí)例 同時(shí)整 實(shí)例 字符左右排 實(shí)例 符號(hào)算式求 實(shí)例 數(shù)字移 實(shí)例 統(tǒng)計(jì)最高成 實(shí)例 商人過河游 實(shí)例 吃數(shù)游 實(shí)例 游 實(shí)例 打字訓(xùn)練游 實(shí)例 雙人競走游

實(shí)例 迷宮探險(xiǎn)游 實(shí)例 迷你撞球游 實(shí)例 模擬掃雷游 實(shí)例 推箱子游 實(shí)例 五子棋游 實(shí)例 綜合CAD系 實(shí)例 功能強(qiáng)大的文本編輯

實(shí)例 管理系 實(shí)例 進(jìn)銷存管理系 礎(chǔ) 實(shí)例說CBorlandTurboC2.0C程序,在該程序中添加代碼,使其能夠輸出“oWorld!”的問候語。本實(shí)例重點(diǎn)介紹如何創(chuàng)建、編譯、調(diào)試和運(yùn)行C程序。程序運(yùn)行效果如圖1-1所示C語言程序的編譯器有很多,如TurboC2.0、TurboC3.0BorlandC+3.1VisualC+6.0VisualC++.NET等開發(fā)環(huán)境都可以編譯運(yùn)行C程序。其中,的【TurboC2.0 tc.exe。要在硬盤上安裝TC編譯器,可按如下步驟進(jìn)行

1-1C【1】將配套光盤【TurboC2.0 下的tc.exe文件拷貝到硬盤上,比如C盤 下【2】雙擊硬盤上的tc.exe文件,出現(xiàn)如圖1-2所示的自解壓文件【3】采用默認(rèn)的安 【C:單擊【安裝】按鈕,完成安裝1-2TurboC2.0實(shí)例解析安裝好TC編譯器之后,就可以按照如下步驟創(chuàng)建第一C程序【1】雙擊TC安 (比如【C:\TC )下的tc.exe程序,打開TC開發(fā)環(huán)境【2】此時(shí)TC編譯器會(huì)自動(dòng)創(chuàng)建NONAME.C的C程序1-3所示【3】在該文件中添加【程序代碼】中所示的內(nèi)打開如圖1-4所示的保存文件框,輸入保存路徑和文件名,按回車鍵,完成保存。1-3TC1-4【5】執(zhí)行菜單命令“Compile|CompiletoOBJ(1-5)將程序編譯OBJ對(duì)象文件,1-6所示是編譯1-7printf語句后面的用于表示語句結(jié)束的分號(hào)“;”去掉后出現(xiàn)的錯(cuò)誤1-51-6圖1-7編譯錯(cuò)的信【6】執(zhí)行菜單命令“Compile|MakeEXEFile”,生成可執(zhí)行文件,如1-81-8運(yùn)行結(jié)果見圖1-1。1-9【8】要查看程序運(yùn)行結(jié)果,可以執(zhí)行菜單命令“File|OSS 如圖1-10所示。在命令行下鍵入“exit”,可以返回TC開發(fā)環(huán)境。1-10程序代1】第一個(gè)C/*ThefirstCprogramme*/#include<stdio.h>{

/*包含標(biāo)準(zhǔn)輸入輸出頭文件/*主函數(shù) o /*打印輸出信息}歸納#include語句用于包含頭文件stdio.h,即定義標(biāo)準(zhǔn)輸入輸出函數(shù)每一個(gè)C程序必須有且只有一個(gè)main()主函數(shù),這樣程序運(yùn)行時(shí)才可以找到控制符“\n”來實(shí)現(xiàn),即printf(“HelloWorld!\n”);。TC編譯器使用的其他問題,可以通過運(yùn)行TC安裝下的Readme.exe幫助文件CTC編譯器中無法看到中文(看到的是亂碼但用記事本等其他文本閱讀工具打開,則可以看到中 實(shí)例說明12-12實(shí)例解析C語言提供的數(shù)據(jù)結(jié)構(gòu)是以數(shù)據(jù)類型形式出現(xiàn)的。C語言的數(shù)據(jù)類型可分為基本類型、構(gòu)造char),實(shí)型(即浮點(diǎn)型,分為單精度float和雙精度浮點(diǎn)doublefloat舉類型(變量關(guān)鍵字為enum。構(gòu)造類型包括數(shù)組、結(jié)構(gòu)體和共用體3種整型、字符型和實(shí)型都有常量和變量之分。比如12、0、3為整型常量,4.6、1.23為實(shí)型常用預(yù)定義#definePRICE30,這樣可提高程序的可讀性和可性。用nt用ortnt或tIBMPC(bit)和數(shù)的范圍如表2-1所示。整型變量的定義為intintunsignedshort/*a,b/*c,dlonglong /*e,f 即Short即Long 即unsignedunsignedunsigned在本例中,設(shè)兩個(gè)整數(shù)分別為x、y,它們的乘積為m;程序首先調(diào)用printf()函數(shù),提示用戶輸入數(shù)據(jù),然后調(diào)用scanf()函數(shù),輸入變量xy的值,接著求x與ym,最后輸出結(jié)果。{{}程序代碼/*Input/*Inputtwonumbers,outputtheproduct*/#include<stdio.h>{intx,y,m; /*定義整型變量x,y,m*/printf("Pleaseinputxandy\n");/*輸出提示信息*/ /*讀入兩個(gè)乘數(shù),賦給x,y變量 /*計(jì)算兩個(gè)乘數(shù)的積,賦給變量m*/printf("%d*%d=%d\n",x,y,m); /*輸出結(jié)果*/}歸納注釋本實(shí)例程序?qū)崿F(xiàn)的是兩個(gè)整數(shù)的簡單乘積,同樣的,也可以通過修改,實(shí)現(xiàn)簡單的整數(shù)四則n和n。pn()fopntf()和普通字符。格式字符串是以%開頭的,在%%%lTurboC中,格式字符串的一般形式為:[標(biāo)志][輸出最小寬度][.精度][長度](正數(shù)不輸出符號(hào))(不輸出前綴);(不輸出前綴);%e中較短的輸出寬度輸出單、雙精度實(shí)數(shù);s字符為+#4(正號(hào)或負(fù)號(hào)、d、uoxf0hl兩種,hl就是編譯器在內(nèi)存中a和b變量分配的地址。 實(shí)例說明13-13實(shí)例解析floatx,ydoublezfloatx,ydoublez/*x、y/*指定z為雙精度實(shí)數(shù)在一般系統(tǒng)中float型數(shù)據(jù)在內(nèi)存中占4個(gè)字節(jié)(32位double型數(shù)8個(gè)字節(jié)。單精度實(shí)數(shù)提7位有效數(shù)字,雙精度實(shí)15~16位有效數(shù)字,數(shù)值的范圍隨機(jī)器3x,y和它們中的大數(shù)c經(jīng)輸入的信息,通過條件運(yùn)算符來比較大小,得 c,最后輸出結(jié)果條件表達(dá)式的說條件表達(dá)式的執(zhí)行順序:先求解表達(dá)式1,若為真(非0)則求解表達(dá)式2,并將表達(dá)式21為假(0)33的值作為條件執(zhí)行結(jié)果就是將條件表達(dá)式的值賦max,即a,b中比較大的值賦maxmax。相當(dāng)于a>b?a:(b+1),而不等價(jià)于(a>b?a:b)+1條件運(yùn)算符的結(jié)合方向?yàn)椤白杂蚁蜃蟆薄O喈?dāng)于a>b?a:(c>d?c:d),如a=1,b=2,c=3,d=4,則條件表達(dá)式的值等于4123xx=0b。表達(dá)式2和表達(dá)式3的類型也可以不同,此如果x小于等y,則條件表達(dá)式1.5x大于y1,由于1.5為實(shí)型,比整型高,因此1轉(zhuǎn)換為1.0。程序代碼3】比較實(shí)數(shù)大小/*/*輸入兩個(gè)浮點(diǎn)數(shù),輸出其中較大的數(shù)#include<stdio.h>{floatprintf("Pleaseinputxandy:\n");printf("MAXof(%f,%f)is}/*變量定義/*提示用戶輸入數(shù)據(jù)/*c=max(x,y/*c歸納63-1的輸出結(jié)果為精確到6位。條件表達(dá)式在計(jì)算最大值最小值時(shí)比較方便,還可以計(jì)算3個(gè)數(shù)的最值,比如:max(x,y,z)=(x>y?x:y)>z?(x>y?x:y):z 實(shí)例說明14-14實(shí)例解析字符變量的定義是“charc1,c2;”,字符變量的c1='a'來賦值,也可以從鍵盤輸入,其c”。b'?'和55字符常量只能是單個(gè)字符,字符串常量則可以含一個(gè)或多個(gè)字符可以把一個(gè)字符常量賦予一個(gè)字符變量,但不能把一個(gè)字符串常量賦予一個(gè)字符變量 增加的一個(gè)字節(jié)中存放字符"\0" 中的情況是不同的。'a'在內(nèi)存中占一個(gè)字節(jié),可表示為a。"a"在內(nèi)存中占兩個(gè)字節(jié),可表示為a\0。題n函41 。dddxhhASCII代碼。如\101表示字母"A,\102表示字母"B",\134表示反斜線,\XOA表示換行等。本例先定義3個(gè)字符變量,用于保存輸入的字符,接著輸出字符串、轉(zhuǎn)義字符和字符變程序代碼/*輸入字符,輸出通過轉(zhuǎn)義字符控制的字符*/#include<stdio.h>/*輸入字符,輸出通過轉(zhuǎn)義字符控制的字符*/#include<stdio.h>{charprintf("Pleaseinputcharstoc1,c2,c3:\n");}歸納注釋程序中,首先輸出一個(gè)字符串,接著是“\n”回車換行;在第一列輸c1值之后就是“\n”;置(c2對(duì)齊,但下一轉(zhuǎn)義字符“\bc2c3值。 實(shí)例說明圖5-1所示。5-15實(shí)例解字節(jié)數(shù)也不TC編譯器中,一般整int變量2字節(jié),char變量占1字節(jié),short整型2字節(jié),long4字節(jié),float4字節(jié),double8字節(jié),longdouble8、1012程序先輸出提示信息,接著依次輸出各個(gè)類型變量所占的字節(jié)數(shù)程序代碼/*輸出不同類型所占的字節(jié)數(shù)*/#include<stdio.h>/*輸出不同類型所占的字節(jié)數(shù)*/#include<stdio.h>void{printf("Thebytesofthevariables/*TC2.02,VC4*/printf("int:%dbytes\n",sizeof(int));/*char型的字節(jié)數(shù)為1*/printf("char:%dbyte\n",sizeof(char));/*short2printf("short:%d/*long4printf("long:%d/*float4printf("float:%d/*double8printf("double:%d/*longdouble81012printf("longdouble:%dbytes\n",sizeof(long}歸納注釋so()nt1e。6自增/自減運(yùn)算實(shí)例說通過整型變量的自增運(yùn)算結(jié)果來顯示自增運(yùn)算符的使用方法。程序運(yùn)行結(jié)果如圖6- 所示6-16實(shí)例解析在使用上容易出錯(cuò)的是i++和i--。特別是當(dāng)它們出現(xiàn)在較復(fù)雜的表達(dá)式或語句中時(shí),常常難a、b、c和iai,接著賦值給b、ca、b、c,最后輸出i的各種自增自減運(yùn)算結(jié)果。程序代碼6】自增//*/*自增運(yùn)算符的應(yīng)用#include<stdio.h>{inta=5,b,c,i=10;/*變量定義初始化/*aba1/*b1,后賦給cprintf("a=%d,b=%d,c=/*輸出abcprintf("i,i++,i+%d,%d,%d\n",i,i++,i++)*i,i++,i+ /*i自增1,輸出i,此時(shí)i=12+1*/ /*i自減1,輸出i,i=13-1=12*/ /*輸出i=12,i自增1,i=13*/ /*輸出i=13,i自減1,i=12*//*i取出,加負(fù)號(hào),輸出-13,i}歸納計(jì)算最右邊i++i=10,再i1,此i=11,再計(jì)算中間的i++,即輸i=11,i1,此i=12,最后輸i=12。自增運(yùn)算符通常運(yùn)用與for,while等循環(huán)語句中,對(duì)循環(huán)變量進(jìn)行自 實(shí)例說明1+1+2+1+2+3+1+2+3+4+…+1+2+…+n的值。通過該實(shí)例,可以學(xué)if條件判斷語句for循環(huán)語句的應(yīng)用。程序運(yùn)行結(jié)果如圖7-1所示7-17實(shí)例解析if條件if if(x>y) 其中,if語句就是根x>y這個(gè)表達(dá)式的值來決定是否要執(zhí)行后printf語句,當(dāng)表達(dá)式的值為真(x>y)時(shí),就執(zhí)行,當(dāng)表達(dá)式的值為假(x≤y)時(shí),就跳過printf語句而直接執(zhí)行后面if(x>y)elseif(x>y)else如果x>y成立,則打印出x,否則打印出y。與第一if語句的不同之處在于,不論表達(dá)式的elseif(count>300)elseif(count>100)price=price=price= price=300500(elseif可以理解為否則如果,即在不大于500的條件下如果滿足大于300的條件,也就是300500之間那么price等于0.10;如果count的值在100300之間,那么price等0.05count0100之間,那么price等于0。這種形if語句比前兩種都要復(fù)雜,它能處理的分支也多,這個(gè)例子就能處理4個(gè)分支,而且分支的數(shù)目還可以無限擴(kuò)展。盡管if語句看起來很簡單,但在實(shí)際的應(yīng)用中還是有許多問題需要注(1)記在每個(gè)語句后面加分號(hào)。分號(hào)是C語句中不可缺少的部分,任何語句,不管它是不是作為if語句的一部分,結(jié)尾都要加上分號(hào)表示一個(gè)語句的結(jié)束。如果忘記在語句末尾加分號(hào),在一個(gè)if語句中又包含一個(gè)或if語句時(shí),就形成了嵌if語句嵌套if語句的一般形式ifif( if( 語句 if語句ifelse的匹配問題。記住一個(gè)原則:else語句總是與前面最近的未匹if語句相配對(duì)。按照這個(gè)原則,上面3else2if相匹配4else跟第1if相匹配6elseif( 語句 這種形式的程序很可能是3else1if相匹配,可事實(shí)上按else總是跟ifif({if( 語句 {}forfor(12for(123,然后轉(zhuǎn)到第②步;⑤執(zhí)for語句后面的語句化是個(gè)賦值語句,表達(dá)2作為循環(huán)的測試條件一般是關(guān)系表達(dá)式3作為循環(huán)前力是個(gè)增量表達(dá)式。這3個(gè)表達(dá)式都是可以省略的,但后面的分號(hào)“;”不能省。表達(dá)式1被省略相當(dāng)于循環(huán)變量的初始化被省略了,那么一般來說在for語句之前應(yīng)該給循環(huán)變量賦初值。執(zhí)行的時(shí)候,只是跳過“求解表達(dá)式1”這一步,其他都不變。如果作為循環(huán)測試條件的表達(dá)式2省略了,那么循環(huán)測試條件將被認(rèn)為是true,循環(huán)也就無休止地進(jìn)行下去。如果表達(dá)式3省略了,本實(shí)例程序先輸出提示信息,要求用戶輸入數(shù)列的項(xiàng)數(shù)n,接著通過if語句判斷所輸入的n是否大于等1(只有不小于1數(shù)列才有意義果小1,則程序直接返回退出。實(shí)例通過兩個(gè)for循環(huán)語句實(shí)現(xiàn)數(shù)列的求和。程序代碼/*計(jì)算數(shù)列的和/*計(jì)算數(shù)列的和#include<stdio.h>voidmain(){inti,j,n; /*i,jn*/longintsum=0,temp=0;/*定義數(shù)列的和及臨時(shí)變量*/printf("Pleaseinputanumberton:\n"); /*提示輸入數(shù)列項(xiàng)數(shù)*/ /*{printf("Thenmustbenolessthan /*提示輸入有誤}{}/*程序返回,退出/*循環(huán)計(jì)算數(shù)列的和printf("Thesumofthesequence(%d)is /*輸出數(shù)列的和}歸納注釋for語句的表達(dá)式1可以是設(shè)置循環(huán)變量初值的賦值表達(dá)式,也可以是與循環(huán)變量無關(guān)的其他表達(dá)式。比如“for(sum=0,i=1;i<=100;i++)sum=sum+I;”表達(dá)式可以是一個(gè)簡單的表達(dá)式,也可for語句前面就可以不必為sum賦初值了,程序看起來就更緊湊了。a<b&&x<y循環(huán)語句“寄生”在表達(dá)式2中的方法。比如:for(i=0;(c=getchar())!=’\n’;i+=c);表達(dá)2中有一個(gè)gha+=cSImain()函數(shù)可以返回一個(gè)自定義的值,返void類型時(shí),可return直接退出 實(shí)例說明圖8-1所示。8-18實(shí)例解析本程序設(shè)計(jì)主要思路是:先清屏,并在屏幕上顯示提示信息,說明本程序顯示的是乘法口訣表。接著,顯示橫軸1~9的數(shù)字和縱軸1~9的數(shù)字。最后,計(jì)算11~99,并在屏幕上顯示。{}程序代#include<stdio.h>#include<conio.h>voidmain(void){int#include<stdio.h>#include<conio.h>voidmain(void){inti,j,x,y; /**/printf("\n\n***PithyFormulaTableof/*輸出橫軸數(shù)字{gotoxy(x,y);/*移到指定的光標(biāo)位置*/printf("%2d",i); /*打印橫軸數(shù)字*//*輸出縱軸數(shù)字{ /*移到指定的光標(biāo)位置*/printf("%2d",i); /*打印縱軸數(shù)字*/y=/*1×1~9×9{{gotoxy(x,y);/*移到指定的光標(biāo)位置*/printf("%2d",i*j)**/}} Pressanykeytoquit...\n");}歸納注釋Screen行第一列。該函數(shù)的功能相當(dāng)于在DOS操作系統(tǒng)下,或者在Windows操作系統(tǒng)下令行模式 實(shí)例說明實(shí)現(xiàn)一個(gè)簡單的猜數(shù)字游戲,學(xué)while循環(huán)語句的用法。程序運(yùn)行結(jié)9-1所示9-19實(shí)例解析while循環(huán)語while語句的一般形式為 其中表達(dá)式是循環(huán)條件,語句為循環(huán)while語句的語義是:計(jì)算表達(dá)式的值,當(dāng)值為真(非0)時(shí),執(zhí)行循環(huán)體語句。使用語句應(yīng)注意以下幾點(diǎn)while語句中的表達(dá)式一般是關(guān)系表達(dá)或邏輯表達(dá)式,只要表達(dá)式的值為真(0)即可繼循環(huán)體如包含有一個(gè)以上的語句,則必須用{}允許whilewhile語句,從而形成雙重循環(huán)do-while語do-while語句的一般形式為dodo語句;其中語句是循環(huán)體,表達(dá)式是循環(huán)條do-while語句的語義是:先執(zhí)行循環(huán)體語句一次,再判別表達(dá)式的值,若為真(0)則繼do-whilewhiledo-whiledo-while至少要執(zhí)行一次循環(huán)體。而while是先判斷后執(zhí)行,如果條件不滿足,則一次循環(huán)體語句也不執(zhí)行。while語句和do-while語句一般可以相互改寫。對(duì)于do-while語句還應(yīng)注意在if語句和while語句中,表達(dá)式后面都不能加分號(hào),而在do-while語句的表達(dá)式后面do-whilewhiledo和while之間的循環(huán)體由多個(gè)語句組成時(shí),也必須用{}括起來do-whilewhile語句相互替換時(shí),要注意修改循環(huán)控制條件{}{}do-while語句也可與while,for語句相{}{}while循環(huán)語句控制輸入的過程,如果3次輸入錯(cuò)誤,則給出提示信息并退出程序。通過后,使用while語句控制程序流程,如果輸入的數(shù)值不等于程程序代碼9】猜數(shù)字游戲/*猜數(shù)字游戲 #include<stdio.h>#include<conio.h>voidmain(){intPassword=0,Number=0,price=58,i=0;clrscr();/*清屏*/printf("\n====ThisisaNumberGuessGame!====\n");/*提示信息*/while(Password!=1234) /*當(dāng)輸入 錯(cuò)誤時(shí)*/{if(i>=3)/*3就退出{printf("\nPleaseinputtherightpassword!\n");}puts("PleaseinputPassword:");scanf("%d",&Password);/* }while(Number!=price{

puts("Pleaseinputanumberbetween1and100**/printf("Yourinputnumberis}while!(Number>=1&&Number<=100**/if(Number>=90)/*90的情況*/{printf("TooBigger!Pressanykeytotry}elseif(Number>=70&&Number<90)/*比較大的情況{}elseif(Number>=1&&Number<=30)/*太小的情況{printf("TooSmall!Pressanykeytotry}elseif(Number>30&&Number<=50)/*比較小的情況{printf("Small!Pressanykeytotry}{if(Number==price{printf("OK!Youareright!Bye}elseif(Number<price)/*相差不多的情況{}elseelseif(Number>price}}}歸納U10ATM(自動(dòng)柜員機(jī))實(shí)例說明通過對(duì)自動(dòng)柜員機(jī)(ATM)界面的模擬來學(xué)習(xí)switch語句的用法。程序運(yùn)行結(jié)果如圖10-10-1ATM10-2在主界面中選【1.Quary10-3在主界面中選【2.Credit10-4在存款界面中選【2.$10010-5在主界面中選【3.Debit10-6在取款界面中選【3.$50010-7在主界面中選擇【4.Return實(shí)例解switch語switchswitch語句又叫開關(guān)語句。switch語句是專門用來處理多分;都可以用嵌套的if語句,也就是第3種形式的if語句來處理,但如果分支較多,就顯得嵌套的層數(shù)太多了,程序冗長且可讀性降低。switch語句就是專門為了解決多分支的問題而設(shè)計(jì)的。switch語句的一般形式如下{casecase..case}其中,default是可有可無的switch語句的執(zhí)行過程是這樣的:計(jì)算表達(dá)式的值,判斷變量或表達(dá)式的值是否等于常量表2,……依此類推,直到結(jié)束。如果沒有相等的則執(zhí)defaultn+1(如果有的話。在語句1~n執(zhí)行的過程中,若遇到break,則直接跳出switch,不再對(duì)下面的case語句進(jìn)行判斷。,程序代碼10ATM 歸納注釋本實(shí)例程序在每個(gè)do-while語句中都控制了輸入的有效數(shù)值,保證switch語句判斷時(shí),變量所包含的值不超出所有case的情況,因此沒有用default語句。本程序中大量用到puts語句,用于將一個(gè)字符串輸出在屏幕上。也可以用printf語句實(shí)現(xiàn)。本程序中的界面采用“=|”來做成方框的形式,以增加美觀的效果。也可以采*”、“$”等其他符11用一維數(shù)組統(tǒng)計(jì)學(xué)生成績實(shí)例說明1111-111實(shí)例解inta[10];floatb[15];charc[20]; inta[10];floatb[15];charc[20]; intint常量表達(dá)式中可以包括常量和符號(hào)常量,不能包括變量。也就是說,不允許對(duì)數(shù)組的大intnum;intnum;inta[num];一維數(shù)組的初始對(duì)數(shù)組元素的初始化可以用以下方法實(shí)現(xiàn)staticstaticint將數(shù)組元素的初始值依次放在一對(duì)大經(jīng)過上面的定義和初始化之后a[7]=7,a[8]=8,a[9]=9staticstaticint值,后5個(gè)元素的值默認(rèn)都為0。staticintstaticint如果要使數(shù)組中全部元素staticintstaticintstaticstaticint可以寫成 staticint 25a0 staticint 本實(shí)例利用一維數(shù)組班級(jí)學(xué)生的學(xué)號(hào),語文、數(shù)學(xué)、外語等各科成績,并求出各學(xué)生的平均分。程序首先要求輸入班級(jí)人數(shù)(最大為50,然后要求輸入程序代碼11 歸納注釋for循環(huán)。例如,可以用for循環(huán)對(duì)一維數(shù)組初始化,利用for循環(huán)對(duì)一維數(shù)組的值進(jìn)行運(yùn)算等。在循環(huán)的基礎(chǔ)上,可以 實(shí)例說明維數(shù)組。程序運(yùn)行結(jié)果如圖12-1所示。12-112實(shí)例解析二維數(shù)組定義的一般形式為類型說明符數(shù)組名類型說明符數(shù)組名[常量表達(dá)式][常量表達(dá)式int例int二維數(shù)組的元素也稱為雙下標(biāo)變量,二維數(shù)組的元a[3,4]或者a[2*2-1,3+1]的形式。數(shù)組元素可以出現(xiàn)在表達(dá)式中,也可以被賦值在使用數(shù)組元素時(shí),應(yīng)該注意下標(biāo)值應(yīng)在已定義的數(shù)組大小范圍內(nèi)。定義a為3×4的數(shù)組,它可用的行下標(biāo)值最大為2,列坐標(biāo)值最大為3。用a[3][4]則超過了數(shù)組的定義范圍。下標(biāo)變量和數(shù)組說明在形式中有些相似,但兩者具有完全不同的含義。數(shù)組說明的方括號(hào)中二維數(shù)組的初始可以用下面的方法對(duì)二維數(shù)組初始化staticstaticintstaticstaticint staticstaticint它的作用是只對(duì)各行第一列的元素賦初值,其余元素值自動(dòng)設(shè) 0。賦初值后數(shù)組各元素為

50 50也可以對(duì)各行中的某一元素賦初值staticstaticint初始化后的元素如下

0005 0005 staticintstaticint

0 0staticint3行不賦初值。也可以2行不賦初staticintstaticstaticintstaticintstaticint staticstaticint這樣的寫法,能通知編譯系統(tǒng)數(shù)組共有3行。數(shù)組各元素為

00 00并將其轉(zhuǎn)置存入數(shù)組B,最后輸出矩陣B的值。程序代碼12/*/*用二維數(shù)組實(shí)現(xiàn)矩陣的轉(zhuǎn)置#include#defineROW3/*矩陣的行數(shù)*/#defineCOL4/*矩陣的列數(shù)*/{intmatrixA[ROW][COL],matrixB[COL][ROW];/**/inti,j;/*清屏printf("EnterelementsofthematrixA,");for(i=0;i<ROW;i++{for(j=0;j<COL;j++{/*提示信息 /*A}}for(i=0;i<ROW;i++{for(j=0;j<COL;j++{matrixB[j][i]= /*轉(zhuǎn)置}}}/*Bfor(i=0;i<COL;i++){for(j=0;j<ROW;j++{}}printf("\nPressAnyKeytoQuit...}歸納3×4矩陣的轉(zhuǎn)置,通過改變行列的數(shù)目,可以實(shí)現(xiàn)更大規(guī)模的矩陣的轉(zhuǎn)置,并且 實(shí)例說明n行n列的二維整數(shù)數(shù)組中,按以下要求選出兩個(gè)數(shù)。首先從每行選出最大數(shù),再從選出運(yùn)行結(jié)果如13-1所示。13-113實(shí)例解析ann個(gè)大數(shù)中選出最小數(shù),可以用以下算[算 1]在二維整數(shù)數(shù)組中,從每行選出最大數(shù),再從選出的大數(shù)中選出最小{/*{/*minmax標(biāo)記*/{{for(max=a[row][0],col=1;col<n;col++*row行選出最大數(shù)*/if(min>max)/*row行的最小數(shù)*/}printf("Theminimum umnumbersis%d\n",min)}從每行選出最小數(shù),再從選出的n個(gè)小數(shù)中選出最大數(shù),有如下的算{/*maxmin標(biāo)記*/{for(min=a[row][0],col=1;col<n;col++)/*row行選出最小數(shù)*/} umofminimum{/*maxmin標(biāo)記*/{for(min=a[row][0],col=1;col<n;col++)/*row行選出最小數(shù)*/} umofminimumnumbersis}程序代碼13】求解二維數(shù)組的最大//*/*計(jì)算二維數(shù)組的最大最小值*/#defineMAXN20int{intmin, 最小值*/max; 最大值introw,col,n;printf("Pleaseinputtheorderofthematrix:\n");/*輸入方陣的階次printf("Pleaseinputtheelementsofthematrix,\nfroma[0][0]to{/*從每行選出最大數(shù)*/if(min>max)/*保存至row*/}}printf("Theminimumumnumberis{/*每行選出最小數(shù)for(min=a[row][0],col=1;col<n;col++)/*row*/if(max<min)/*row*/} umofminimumnumbersis%d\n",max);printf("\nPressanykeytoquit...\n");}歸納本例中,實(shí)現(xiàn)數(shù)組元素輸入的語句也可以改為scanf(“%d”,a[row]+col) 利用數(shù)組求前n個(gè)質(zhì)實(shí)例說明圖14-1所示。14-114實(shí)例解析求得的質(zhì)數(shù)個(gè)數(shù)為pc。求前n個(gè)質(zhì)數(shù)的過程可用以下算法描述:[算法]n個(gè)質(zhì){調(diào)整m,使m為下一個(gè)質(zhì)數(shù);}}輸出primes[0]primes[pc-}為調(diào)整m使它是下一個(gè)質(zhì)數(shù),可按順序用已求得的質(zhì)數(shù)primes[k]去測試它對(duì)m如果m能被某個(gè)primes[k]整除,則m是合數(shù),讓m增2,并重新從第一個(gè)質(zhì)數(shù)開始對(duì)它測試。數(shù)m為質(zhì)數(shù)的條件是存在一個(gè)k,使得primes[0]至primes[k-1]不能整除m,且“primes[k]*{k=1;/*不必用primes[0]=2}程序代碼14n#define#defineN50{intprimes[N];intpc,m,k;printf("\nThefirstdprimenumbersare:\n",N);primes[0]=2;/*2是第一個(gè)質(zhì)數(shù)*/m=3;/*3開始*/{}}printf("\n\nPressanykeytoquit...\n 歸納注釋本例應(yīng)用數(shù)組primes[]來已經(jīng)找到的前n1個(gè)質(zhì)數(shù),再通過對(duì)第n1個(gè)質(zhì)數(shù)加2,并測試是否能n1個(gè)質(zhì)數(shù)整除來尋n個(gè)質(zhì)數(shù),從而可以nn可以足夠大(取決于int型數(shù)據(jù)的取值范圍,可以改為long型數(shù)組,以便求取的質(zhì)數(shù)。n個(gè)質(zhì)數(shù),n用宏定義來實(shí)現(xiàn),也可以通過用戶的輸入來進(jìn)行。比如定義一個(gè)最大的數(shù)以便定義數(shù)組“#defineMAX1000”,數(shù)組intprimes[MAX],n則由用戶輸入。 實(shí)例說明5115-115實(shí)例解利用自定義的函數(shù)()和g()求出該年一月一日的星期,由閏年的判定條件,確定該年是否是閏年。為了便于按星期輸出各月的月歷,引入三維數(shù)組的日期表intdte12[67]。其中,12表示126677序?qū)⒏髟碌娜掌谔顚懙饺掌诒碇?,各月的天?shù)按月取自數(shù)組dy_b1167~124程序代碼15】編制萬年歷/*/**/#include"stdio.h"longintf(intyear,intif(month<3)returnyear-1;elsereturn}longintg(intif(month<3)returnmonth+13;elsereturn}longintn(intyear,intmonth,int{return}intw(intyear,intmonth,int{}intintdaytbl[{intsw,leap,i,j,k,wd,day;intyear;/*年*/chartitle[]="SUNMONTUEWEDTHUFRIprintf("Pleaseinputtheyearwhosecalendaryouwanttoknow*輸入年*/date[i][j][k]=0;/*0*/for(i=0;i<12;i++)/*一年12個(gè)月*/for(wd=0,day=1;day<=dayif(sw==0)wd++;/*7天一行,星期天開始新的一行}TheCalendarofYear%d=====================|\n|",year);for(wd=0,k=0;k<7;k++)/*6wd!=0*/printf("%2d%s%2d%s|\n|",i+1,title,i+7,title);{ /*左欄為第i+1i+7月*/else else printf("}puts("\nPressanykeytoquit...");}歸納VisualC+6.0TC2.0中,由于命令行窗口的高度限在程序中,也可以將12個(gè)月的日歷分6次輸出,此時(shí)在輸出完兩個(gè)月的日歷后,應(yīng)添加如下語句scanf("%*c");/*鍵入回車輸出下一個(gè)月的日歷*/,以便按回車?yán)^續(xù)輸出后面的日歷。 實(shí)例說本實(shí)例對(duì)一個(gè)一維整型數(shù)組進(jìn)行排序,使其元素的順序按從小到大排列,即0 面,正數(shù)在后面。通過此例子,可以學(xué)習(xí)數(shù)組的。程序運(yùn)行結(jié)果如圖16-1 16-116函數(shù)rest(intaintn)可以實(shí)現(xiàn)對(duì)具有naa[]的元素依次,如果a[i]大于0,則將a[i]與最后一個(gè)元素交換,同時(shí),最后一個(gè)元素指向最后第二個(gè);如 {{}else{a[i]a[low]low1,i}}程序代碼16】對(duì)數(shù)組元素排序rest(intrest(inta[],int{int{{}elsei++**/{/*a[i]a[low]交換,隨之low1,i1*/}}}ints[]={8,4,0,-1,6,0,-main(*rest{int /*清屏printf("\nThearrybeforerestis:\n");printf("\nThearryafterrestis:\n");printf("\nPressanykeytoquit...\n");}歸納有關(guān)數(shù)列排序、查找等操作和算法在數(shù)據(jù)結(jié)構(gòu)篇中將會(huì)詳細(xì)介紹本實(shí)例主函數(shù)中的 數(shù)組也可以由用戶輸入,此時(shí)應(yīng)當(dāng)先提示輸入數(shù)組中元素個(gè)數(shù),再通 實(shí)例說明將一個(gè)無符號(hào)整數(shù)轉(zhuǎn)換為任意d進(jìn)制數(shù)(2≤d≤16。程序運(yùn)行結(jié)果如17-1所示17-117實(shí)例解nd的余數(shù),就能得nd進(jìn)制數(shù)的最低位數(shù)字,重復(fù)上述步n0,依次得到n的d進(jìn)制數(shù)表示的最低位至最數(shù)字。由各位數(shù)字取出相應(yīng)字符,就能得到n的d進(jìn)主函數(shù)用于測試trans函數(shù),要求輸入一個(gè)待轉(zhuǎn)換的正整數(shù),接著調(diào)用trans函數(shù)進(jìn)行轉(zhuǎn)換,并輸出該正整數(shù)的2~16進(jìn)制數(shù)轉(zhuǎn)換結(jié)果。程序代碼17/*/*transnd(2<=d<=16)s*/#defineMsizeof(unsignedint)*8inttrans(unsignedn,intd,char{staticchardigits[]=" ABCDEF"**/charbuf[M+1];intj,i=M;{ /*s*/return0;/*不合理的進(jìn)制,函數(shù)返回0*/}{ /*將工作數(shù)組中的字符串 到s*//*/*s[j]=buf[i*/returnj;}/*trans(*/{unsignedintnum=intcharstr[33];inti;puts("Pleaseinputanumbertotranslate:");printf("Thenumberyouinputis%d.\nThetranslationresultsare:\n",num);{printf("%5d=%s(%d)\n",num,str,scale[i]);printf("%5d=>(%d)Error!}printf("\nPressanykeytoquit...\n");}歸納本實(shí)例將0~F等16個(gè)字符在靜態(tài)字符數(shù)組里,通過該靜態(tài)字符數(shù)組的來實(shí)現(xiàn)任意 實(shí)例說明判定正整數(shù)n的d進(jìn)制表示形式是否是回文數(shù)。程序運(yùn)行結(jié)18-1所示18-118實(shí)例解回文數(shù)就是順著看和倒著看相同的數(shù)。例如,n=2,它的十進(jìn)制表示是回文數(shù);n=27,它1(256316)設(shè)判斷是否為回文數(shù)的函數(shù)circle(intn,indd),它有兩nd。其n為要判定是否為回文數(shù)的整數(shù),dnd進(jìn)制表示。為判定n是否是d進(jìn)制表示形式中的回文數(shù),有兩種辦法:一是順序譯出n的d進(jìn)制表示的各位數(shù)字,然后首末對(duì)應(yīng)位數(shù)字兩兩比較,若對(duì)應(yīng)位都相同,則nd進(jìn)制表示形式中的回文數(shù),否則n不是回文數(shù);二是首先nd進(jìn)制的各位數(shù)字,然后把譯出的各位數(shù)字將低位當(dāng)按d進(jìn)制的轉(zhuǎn)換方法譯成一個(gè)整數(shù),若n是回文n相等;否則,n不是回文數(shù)。下面的函數(shù)是參照方法二編寫的,參照程序代碼/*circle/*circlend*/intcircle(intn,intd){ints=0,m=n;{}return}/*maincircle*/intnum[]={232,27,851};intscale[]={2,10,16};{inti,j;printf("%d->(%d)isaCircleNumber!\n",num[i],scale[j]);printf("%d->(%d)isnotaCircleNumber!\n",num[i],scale[j]);printf("\nPressanykeytoquit...\n");}歸納注釋本實(shí)例中主函數(shù)中的待判斷的數(shù),也可以由用戶從鍵盤輸入,并要求輸入相應(yīng)的所d 求數(shù)組前n元實(shí)例說編制遞歸函數(shù)來求取數(shù)組的前n個(gè)元素的和,從而求取該數(shù)組的所有元素的和。程序運(yùn)行結(jié)果如圖19-1所示。19-119實(shí)例解析編制一個(gè)遞歸函數(shù)sum(inta[],intn),求已知數(shù)組a[]的前n個(gè)元素的和。數(shù)組a[]的前n個(gè)元素的和為sum=a[n-1]+. 數(shù)組a[]的前n個(gè)元和是a[n-1]加上數(shù)組a[]的前n-1個(gè)元素的和,即當(dāng)n>0時(shí)sum(a,n)=a[n-1]+sum(a,n1)n=0時(shí),sum(a,0)=0程序代碼【程序19】求數(shù)組前n個(gè)元intint{inti;printf("\nThearryis:\n");printf("%dprintf("\nSUMofthearryis:%d\n",sum(a,sizeof(a)/sizeof(a[0])));printf("\nPressanykeytoquit...\n");}sum(inta[],int{returnreturna[n-1]+sum(a,n-}歸納此時(shí),可以編寫函longsumofseq(intn)來求取數(shù)列的n項(xiàng)的和。該函數(shù)的實(shí)現(xiàn)代碼longsumofseq(intn){if(n==1)return1;elsereturnsumofseq(n-1)+n*(n-1)/2;}在編寫遞歸求解的函數(shù)時(shí),要注意遞歸求解的邊界條件。比如本例中,當(dāng)n≤0時(shí)就返回0。能是n=1和n=2時(shí)的值。 實(shí)例說明本實(shí)例求取線性鋼材切割的最佳訂單。程序運(yùn)行結(jié)果如圖20-120-120實(shí)例解析ii程序代20#include<stdio.h>#defineN20#defineDELTA2intbestlen;intbestsele[N];intsele[N];intn;intinttotal;{inti;printf("\nPleaseentertotallengthofthesteel:\n");/*輸入鋼材總長printf("\nPleaseenternumberoforder:\n");/**/printf("\nPleaseentertheorders:\n");/*輸入各訂單*/bestlen=0;/*最佳解的初值*/sele[i]=bestsele[i]=0;/*try();/*調(diào)用函數(shù)求解*/for(i=0;i<n;i++*printf("order%dlength=%d\n",i+1,orderlen[i]);printf("\nPressanykeytoquit...");}{intfor(len=i=0;i<n;i++**/if(len-DELTA<=total*注意最后一段可能不需要切割{if(bestlen<{/**/bestlen=len;}for(i=0;i<n;i++**/{sele[i]=1*做選中嘗試}}}歸納 實(shí)例說明程序運(yùn)行結(jié)果如圖21-1所示21-1實(shí)例解析指針的概指針是C語言中廣泛使用的一種數(shù)據(jù)類型。運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用在計(jì)算機(jī)中,所有的數(shù)據(jù)都是存放在器中的。一般把器中的一個(gè)字節(jié)稱為一個(gè)內(nèi)存21內(nèi)存單元的指針和內(nèi)存單元的內(nèi)容是兩個(gè)不同的概念。可以用一個(gè)通俗的例子來說明它們之就是某個(gè)內(nèi)存單元的地址或稱為某內(nèi)存單元的指針。設(shè)有字符變量C,其內(nèi)容為“K(ASCII碼為這種情況稱PC,或PC的指針。嚴(yán)格地說,一個(gè)指針是一個(gè)地址,是一既然指針變量的值是一個(gè)地址,那么這個(gè)地址不僅可以是變量的地址,也可以是其他數(shù)據(jù)結(jié)。地址,但它卻是一個(gè)數(shù)據(jù)結(jié)構(gòu)的首地址,它是“指向”一個(gè)數(shù)據(jù)結(jié)構(gòu)的,因而概念更為清楚,表指針變量的類對(duì)指針變量的類型說明包3 類型說明符*變量名 p1究竟指向哪一個(gè)整型變量,應(yīng)由向p1賦予的地址來決定。staicintstaicint*p2/*p2是指向靜態(tài)整型變量的指針變量*/float*p3;/*p3是指向浮點(diǎn)變量的指針變量*/char*p4;/*p4是指向字符變量的指針變量應(yīng)該注意的是,一個(gè)指針變量只能指向同類型的p3只能指向浮點(diǎn)變量,不能時(shí)而指向 如&a變示變量a的地址,&b表示變量b的地址。變量本身必須預(yù)先。假設(shè)有指向整 的地址賦予p可以有以下兩種方式intintintinta;intinta;int*p;不允許把一個(gè)數(shù)賦予指針變量,故下面的賦值是錯(cuò)誤intint*p;*。指針變量只能進(jìn)行賦值運(yùn)算和部分算術(shù)運(yùn)算及關(guān)系運(yùn)算取地址運(yùn)算符取地址運(yùn)算符&是單目運(yùn)算符,其結(jié)合性為自右至左,其功能是取變量的地址。scanf函數(shù)及取內(nèi)容運(yùn)算符運(yùn)*不同。在指針變量說明中,“*”是類型說明符其后的變量是指針類型。而表達(dá)式中出現(xiàn)的{inta=5,*p=&a;printf("%d",*p);}則是一個(gè)運(yùn)算符,用以表示指針變量所{inta=5,*p=&a;printf("%d",*p);}表示指針變量p取得了整型變量a的地址。本語句表示輸出變量a的值指針變量的賦值運(yùn)算有以下幾種形式①指針變量初始化賦值,前面已介 把一個(gè)變量的地址賦予指向相同數(shù)據(jù)類型的指針變量。例如intpb=pa;/*a的地址賦予指針變量intpa=&a;/*a 由于pa,pb intpb=pa;/*a的地址賦予指針變量intpa=&a;/*aintintpa=a;錯(cuò)誤 無效。數(shù)組名表示數(shù)組的首地址,故可賦予指向數(shù)組的指針變量pa=&a[0];/*pa=&a[0];/*當(dāng)然也可采取初始化賦值的intint 把字符串的首地址賦予指向字符類型的指針例如“char*pc;pc="clanguage";”或用初始化賦值的方法寫為“char*pc="CLanguage";”這int(*pf)();pf=f;/*f為函數(shù)名 把函數(shù)的地址賦予指向函數(shù)的指int(*pf)();pf=f;/*f為函數(shù)名對(duì)于指向數(shù)組的指針變量,可以加上或減去一個(gè)n。設(shè)pa是指向數(shù)組a的指針變量,則pa+n,pa-n,pa++,++pa,pa--,--pan的意義是把指針指向的當(dāng)前位置(指向某數(shù)組元素)向前或向后移動(dòng)n個(gè)位置。應(yīng)該注意,數(shù)組指針變量向前或向后移動(dòng)一個(gè)位置和地址加1或減1在概念上是不同的。因向后移動(dòng)1個(gè)位置表示指針變量指向下一個(gè)數(shù)據(jù)元素的首地址,而不是在原地址基礎(chǔ)上加1。intpa=a;/*paintpa=a;/*pa指向數(shù)組a,也是指向a[0]*/pa=pa+2/*pa指向a[2]pa的值為&pa[2]*/指針變量的加減運(yùn)算只能對(duì)數(shù)組指針變量進(jìn)行,對(duì)指向其他類型變量的指針變量做加減運(yùn)算兩指針變量相減所得之差是兩個(gè)指針?biāo)笖?shù)組元間相差的元素個(gè)數(shù)。實(shí)際上是兩個(gè)指針(地址)相減之差再除以該數(shù)組元素的長度(字節(jié)數(shù)。例pf1pf2是指向同一浮點(diǎn)數(shù)組的兩個(gè)指指向同一數(shù)組的兩指針變量進(jìn)行關(guān)系運(yùn)算可表示它們所指數(shù)組元間的關(guān)系程序代碼21】變量所占的字節(jié)數(shù){int /*3intint*xp= /*xp,xxp指向x*yp= /*yp,yyp指向y*zp=&z; /*zp,zzp指向z*/intt;printf("\nPleaseinputx,y,z:\n"); /*通過變量的指針,為變量輸入值*/if(*xp>*yp)/*通過指向變量的指針 變量的值*/{/*變量的值*xp=*yp;/*通過指向變量x的指針 變量x的值 /*通過指向變量y的指針 變量y的值}if(*xp>*zp)/*通過指向變量的指針 變量的值{ /*x的指針*xp=*zp;/*x的指針 /*z的指針變量x的值x的值變量z的值}if(*yp>*zp)/*通過指向變量的指針{ /*通過指向變量的指針變量的值變量的值*yp=*zp;/*通過指向變量y的指針 變量y的值 變量z的值}printf("x=%d\ty=%d\tz=%d\n",x,y,z);printf("\nPressanykeytoquit...\n");}歸納x>y,與指針有關(guān)的類型說明如下所示(以整型為例int /*iint*p; /*p為指向整型數(shù)據(jù)的指針變量*/inta[n]; /*定義整型數(shù)組a,它有n個(gè)元素*/int*p[n]; /*定義指針數(shù)組p,它由n個(gè)指向整型數(shù)據(jù)的指針元素組成*/int(*p)[n]; /*p為指向含n個(gè)元素的一維數(shù)組的指針變量*/int /*fint*p(); int(*p)(); /*p為指向函數(shù)的指針,該函數(shù)返回一個(gè)整型值*/int /*p是一個(gè)指針變量,它指向一個(gè)指向整型數(shù)據(jù)的指針變量 實(shí)例說明程序運(yùn)行結(jié)果如圖22-1所示。22-1實(shí)例解程序先輸出提示說明信息,接著依次輸出各個(gè)類型變量所占的字節(jié)數(shù)程序代碼inta[inta[#defineNsizeofa/sizeofa[0]{int *p/*指針變量*/ printf("a[%d]\t=%d\t",j,a[j]);printf("*p\t=printf("*(p+%d)\t=%d\t",j,*(p+j));printf("p[-%d]\t=%d\t",j,p[-j]);printf("\nPressanykeytoquit...\n");}歸納注釋指向數(shù)組的指針變量稱為數(shù)組指針變量。一個(gè)數(shù)組是由連續(xù)的一塊內(nèi)存單元組成的。數(shù)組名就是這塊連續(xù)內(nèi)存單元的首地址。一個(gè)數(shù)組也是由各個(gè)數(shù)組元素(下標(biāo)變量)組成的。每個(gè)數(shù)組個(gè)元素的地址賦予它若要使指針變量i號(hào)元i元素的首地址賦予它,或把數(shù)組i賦予它。設(shè)組a的首地址,也是0號(hào)元素a[0]的首地址。pa+1、a+1、&a[1]均指向1號(hào)元素a[1]。類推可知a+i、a+i、&a[i]ia[i]pa是變量,而a,&a[i]都是常量。引入指針變量后,就可以用兩種方法來數(shù)組元素了。第法為下標(biāo)法,即用a[i]形式訪問數(shù)組元素。第二種方法為指針法,即采用*(pa+i)形式,用間接的方法來數(shù)組元素。 實(shí)例說明程序運(yùn)行結(jié)果如23-1所示。23-1實(shí)例解析設(shè)要編制的函數(shù)為“intsearch(int*apt,intn,intkey)apt為給定的數(shù)表的首元素的指針;的下標(biāo),如數(shù)表中沒有值為key的元素,則函數(shù)返回1值。intintsearch(int*apt,/*已知數(shù)表的首元指針*/intn,/*數(shù)表中元素個(gè)數(shù)*/intkey)/*要尋找的值{int*p;returnp-apt;/*返回找到元素的下標(biāo)*/return-1;}find()返回找到的元素的指針。int*find(int*apt,/*已知數(shù)表的首元指針*/intn,/*數(shù)表中元素個(gè)數(shù)*/intkey)/*要尋找的值{int*p;returnp;/*返回找到元素的指針*/returnNULL;int*find(int*apt,/*已知數(shù)表的首元指針*/intn,/*數(shù)表中元素個(gè)數(shù)*/intkey)/*要尋找的值{int*p;returnp;/*返回找到元素的指針*/returnNULL;}程序代碼23】尋找指定元素的指針#include#includeintsearch(int*apt,/*已知數(shù)表的首元指針*/intn,/*數(shù)表中元素個(gè)數(shù)*/intkey)/*要尋找的值{int*p;returnp-apt;/*返回找到元素的下標(biāo)*/return-1;}int*find(int*apt,/*已知數(shù)表的首元指針*/intn,/*數(shù)表中元素個(gè)數(shù)*/intkey)/*要尋找的值{int*p;returnp;/*返回找到元素的指針*/returnNULL;}int{inti,key;printf("Theelementsofarrayais:\n");printf("printf("\nTheaddressofa[0]is:%d.\n",&a[0]);puts("\nPleaseinputthekeynumberyouwanttosearch:");printf("\nThelabelnumberofthekeynumber%dinthearrayis:printf("\nTheprintf("\nThepointvalueofthekeynumber%dinthearrayis:%d.",key,find(a,puts("\n\nPressanykeytoquit...");}歸納+(50)2=414 實(shí)例說明124-124實(shí)例解析n和n量b讓a和b順的程序代碼24】尋找相同元素的指針#defineNULL0int*search2(int*pa,int*pb,intan,int{intca=pa;cb=pb;/*ca=pa;cb=pb;/*為ca、cb設(shè)定初值*/ {elseif(*ca>*cb)/*1的當(dāng)前元素>2的當(dāng)前元素else/*1的當(dāng)前元素==2的當(dāng)前元素 returnca;/*返回在這兩個(gè)數(shù)表中找到相等元素}return}main()/*只是為 函數(shù)search2({intinta[intb[puts("Theelementsofarrayais:");printf("puts("\nTheelementsofarraybis:");printf("vp=search2(a,b,sizeofa/sizeofa[0],sizeofb/sizeofif(vp)printf("\nThefirstsamenumberinbotharraysis%d\n",*vp);elseprintf("Notfound!\n");puts("\nPressanykeytoquit...\n");}歸納本例子程序在主函數(shù)中,通過調(diào)用s2()函數(shù)返回的是第一個(gè)相同元素的指針,即該元素vp 實(shí)例說明編寫一個(gè)將整數(shù)n(1≤n≤9999)轉(zhuǎn)化成羅馬數(shù)字表示的程序程序運(yùn)行的結(jié)果如圖25-1所示1~22的數(shù)字都轉(zhuǎn)換為羅馬數(shù)字,并顯示出來。如圖25-2所示則是輸入“25.exe2000”后的運(yùn)行結(jié)果 圖25-1輸入“25.exe22”的運(yùn)行結(jié) 圖25-2輸入“25.exe2000”的運(yùn)行結(jié)實(shí)例解析10x10就用幾個(gè)x為了便于程序處理,將數(shù)與對(duì)應(yīng)的羅馬數(shù)字表示分存在兩個(gè)數(shù)組中。轉(zhuǎn)換時(shí),從盡可能的始轉(zhuǎn)的字能前相后于于0該考300x和3,即xxi。程序還能檢查參數(shù)的合理性,并將完成轉(zhuǎn)換的工作和檢查的工作分別由兩個(gè)函數(shù)完成程序代碼【程序25】數(shù)字轉(zhuǎn)換為羅馬數(shù)#include#include<stdio.h>#defineROWS4#defineCOLSintcharmain(intargc,char*argv[{intlow,high;charroman[25]; printf("Usage:romandecimalnumber\n");/*運(yùn)行程序需帶整數(shù)參數(shù)}{}}{toroman(low,roman);}}checknum(intval)/*檢查參數(shù)合理性{{printf("Thenumbermustbeinrange1..9999.\n");}}toroman(intdecimal,charroman[])/*將整數(shù)轉(zhuǎn)換成羅馬數(shù)字表示{intpower,index;{}}}歸納main1~n的所有數(shù)都轉(zhuǎn)換為羅馬數(shù)字并輸出。修改某些 實(shí)例說明編制一個(gè)字符rep(char*s,char*s1,char*s2),實(shí)現(xiàn)將已知字符s中所有屬于字符s1中的字符都s2中的對(duì)應(yīng)字符代替。程序運(yùn)行結(jié)26-1所示26-126實(shí)例解析例如設(shè)字符s,s1,s2分別為如下所示 chars[]"="ABCABC",s1[]="AC",s2[]= 則調(diào)用函數(shù)rep(s,s1,s2)將使字符串 的內(nèi)容變?yōu)?xByxBy"為了實(shí)現(xiàn)上述要求,可用一個(gè)循環(huán)順序字符串s中的字符,并檢查該字符是否在字符串s1中出現(xiàn),若不在字s1中出現(xiàn),則略過該字符;若在字符串s1中出現(xiàn),則用字符串s2中的對(duì)應(yīng)字符代替s中的字符。程序代碼26】字符替換#include#include<stdio.h>#defineMAX50rep(char*s,char*s1,char{char 字符串s中的每個(gè)字符{{for(p=s1;*p&&*p!=*s;p++);/*s1中出現(xiàn)if(*p)*s=*(p-s1+s2);/*s1s2s中的字符*/}}main()/*示意程序{chars[MAX];/*="ABCABC";*/chars1[MAX],s2[MAX];puts("Pleaseinputthestringfors:");puts("Pleaseinputthestringfors1:");puts("Pleaseinputthestringfors2:");puts("Thestringofsafterdis ceis:");puts("\nPressanykeytoquit...");}歸納word必備的基本功能,本例程序?qū)崿F(xiàn)了較為復(fù)雜的替 實(shí)例說明readreal(double*rp)。函數(shù)將讀入的實(shí)數(shù)字符列轉(zhuǎn)換成實(shí)數(shù)后,利用指數(shù)參數(shù)rp,將實(shí)數(shù)存于指針?biāo)赶虻淖兞?rp。程序運(yùn)行結(jié)果如圖27-1所示。27-127實(shí)例解函數(shù)在返回之前,將最后讀入的結(jié)束實(shí)數(shù)字符列的字符返還給系統(tǒng),以便隨后讀字符時(shí)能再次讀入該字符。函數(shù)若能正常讀入實(shí)數(shù),函數(shù)返回整數(shù)1;如果函數(shù)在讀入過程中,未遇數(shù)字符之前,遇到不能構(gòu)成數(shù)字的情況,函數(shù)返回1,表示未讀到實(shí)數(shù)。在輸入實(shí)數(shù)時(shí),在實(shí)數(shù)之前可以有個(gè)數(shù)不定的空白類字符,組成實(shí)數(shù)的字符列有數(shù)的符號(hào)字?jǐn)?shù) 整數(shù)部數(shù) 整數(shù)部分?jǐn)?shù) 整數(shù)部分.小數(shù)部數(shù) .小數(shù)部上述實(shí)數(shù)形式說明,在實(shí)數(shù)轉(zhuǎn)換過程中,同一字符在不同情況下會(huì)有不同的意義。為標(biāo)記當(dāng)共有以下多種不同情況:正準(zhǔn)備開始轉(zhuǎn)換、轉(zhuǎn)換了數(shù)的符號(hào)字符、正在轉(zhuǎn)換實(shí)數(shù)的整數(shù)部分、0表示正準(zhǔn)備開始轉(zhuǎn)換,還未遇到任何與實(shí)數(shù)有關(guān)的字符;狀態(tài)變量為1表示已遇數(shù)的符號(hào)字符;狀態(tài)變量2表示正在轉(zhuǎn)換實(shí)數(shù)的整數(shù)部分;狀態(tài)變量為3有小數(shù)部分;狀態(tài)變量為4表示在轉(zhuǎn)換整數(shù)部分之后遇小數(shù)點(diǎn),這種情況可以沒有小數(shù)部分;狀態(tài)變量為5(ERR)6(OK)成數(shù)的符號(hào)字符、數(shù)字符、小數(shù)點(diǎn)、其他字符等幾類,各狀態(tài)遇各類字符后,應(yīng)變成的新狀態(tài),如下所示。數(shù)數(shù)字小數(shù)01231232243444下面的程序?qū)⑻幚頂?shù)的符號(hào)、轉(zhuǎn)換整數(shù)部分、轉(zhuǎn)換小數(shù)部分等工作都編寫成函數(shù),它們?cè)谧xR或OK程序代碼27】從鍵盤讀入實(shí)數(shù) 歸納歸納drel或 實(shí)例說明8128-128實(shí)例解析首先要統(tǒng)計(jì)字符行內(nèi)單字個(gè)數(shù)、字符行內(nèi)的空白字符數(shù)。然后計(jì)算出單字之間應(yīng)平均分配的插完行,符著再個(gè)述當(dāng)2程序代碼28】字符行排版 本實(shí)例中用到的轉(zhuǎn)換函數(shù)表是一個(gè)函數(shù)指針數(shù)組。該數(shù)組是二維數(shù)組,其元素是指sign、integer、decimal

溫馨提示

  • 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)論