版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、c語言程序設(shè)計(jì)15第十四講下1 C語言編程是一項(xiàng)技藝,需要多年的歷語言編程是一項(xiàng)技藝,需要多年的歷 練才能達(dá)到較為完善的境界!練才能達(dá)到較為完善的境界! -摘自摘自Expert C Programming c語言程序設(shè)計(jì)15第十四講下2 高級語言程序設(shè)計(jì)高級語言程序設(shè)計(jì) 主講教師:賈彩燕主講教師:賈彩燕 計(jì)算機(jī)與信息技術(shù)學(xué)院計(jì)算機(jī)與信息技術(shù)學(xué)院 計(jì)算機(jī)科學(xué)與技術(shù)系計(jì)算機(jī)科學(xué)與技術(shù)系 c語言程序設(shè)計(jì)15第十四講下3 第六章第六章 數(shù)組數(shù)組 c語言程序設(shè)計(jì)15第十四講下4 n數(shù)組的概念、定義和使用數(shù)組的概念、定義和使用 n數(shù)組程序?qū)嵗龜?shù)組程序?qū)嵗?n數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù) n字符數(shù)組和字
2、符串字符數(shù)組和字符串 n兩維和多維數(shù)組兩維和多維數(shù)組 n編程實(shí)例編程實(shí)例 主要內(nèi)容主要內(nèi)容 一維數(shù)值型數(shù)組的重要應(yīng)用一維數(shù)值型數(shù)組的重要應(yīng)用 c語言程序設(shè)計(jì)15第十四講下5 要點(diǎn)回顧要點(diǎn)回顧 n一維數(shù)組的重要操作一維數(shù)組的重要操作 q排序排序 q查找查找 q插入插入 q刪除刪除 q元素交換元素交換 n字符數(shù)組的如何定義,如何初始化?字符數(shù)組的如何定義,如何初始化? n字符數(shù)組的有效長度和字符數(shù)組?字符數(shù)組的有效長度和字符數(shù)組? n常用的字符串處理函數(shù)有哪些?常用的字符串處理函數(shù)有哪些? c語言程序設(shè)計(jì)15第十四講下6 例,找出(標(biāo)準(zhǔn)輸入)文本中最長行并輸出例,找出(標(biāo)準(zhǔn)輸入)文本中最長行并輸出
3、 保存已讀最長行以輸出,數(shù)組保存已讀最長行以輸出,數(shù)組maxline,按字符串形式。,按字符串形式。 數(shù)組數(shù)組line保存保存新行,更長時(shí)轉(zhuǎn)存新行,更長時(shí)轉(zhuǎn)存maxline。 假定行長不超過假定行長不超過1022字符,用符號常量定義數(shù)組大小。字符,用符號常量定義數(shù)組大小。 函數(shù)函數(shù)getline讀入一行讀入一行,存入?yún)?shù)數(shù)組并返回行長。,存入?yún)?shù)數(shù)組并返回行長。 需防止越界,用參數(shù)需防止越界,用參數(shù)limit控制實(shí)參數(shù)組長度??刂茖?shí)參數(shù)組長度。 int getline(int limit, char line); 基本處理框架:基本處理框架: while (還有新行輸入還有新行輸入) if (
4、新行比已記錄的最長行更長新行比已記錄的最長行更長) 記錄新行及其長度記錄新行及其長度; 輸出記錄下來的最長行輸出記錄下來的最長行; c語言程序設(shè)計(jì)15第十四講下7 行總有字符行總有字符(空行有換行符空行有換行符),返回值,返回值0。文件結(jié)束時(shí)返回。文件結(jié)束時(shí)返回0。 設(shè)設(shè)MAXLEN表示數(shù)組長度,大循環(huán)可寫為:表示數(shù)組長度,大循環(huán)可寫為: while (getline(MAXLEN, line) != 0) . int main () int n, max = 0; /*記錄當(dāng)前行和最長行長度記錄當(dāng)前行和最長行長度*/ char lineMAXLEN, maxlineMAXLEN; while
5、 (n = getline(MAXLEN, line) 0) if (n max) /*新行更長,保存新行更長,保存 */ strcpy(maxline, line); max = n; if (max 0) printf(”Len: %dn%sn, max, maxline); return 0; c語言程序設(shè)計(jì)15第十四講下8 整個程序:整個程序: #include #include enum MAXLEN = 1024 ; int getline(int limit, char line); int main() int getline(int limit, char line) int
6、 c, i = 0; while(i limit - 2 +i; if(c=n) linei = c; +i; linei = 0; return i; c語言程序設(shè)計(jì)15第十四講下9 #include enum MAXLEN = 1024 ; int getline(void); char lineMAXLEN, maxlineMAXLEN; int main () int n, max = 0; /*當(dāng)前行和最長行長當(dāng)前行和最長行長*/ while (n = getline() 0) if (n max) max = n; strcpy(maxline, line); if (max 0)
7、 printf(%sn, maxline); return 0; 另一種寫法:另一種寫法:把兩個數(shù)組作為外部變量,各函數(shù)里直接訪問,把兩個數(shù)組作為外部變量,各函數(shù)里直接訪問, 不再作為參數(shù)傳遞。不再作為參數(shù)傳遞。 c語言程序設(shè)計(jì)15第十四講下10 int getline(void) int c, i = 0; while(i MAXLEN-2 +i; if(c=n) linei = c; +i; linei = 0; return i; 優(yōu)點(diǎn):優(yōu)點(diǎn):可簡化函數(shù)定義和參數(shù)描述??珊喕瘮?shù)定義和參數(shù)描述。 缺點(diǎn):缺點(diǎn):數(shù)組名寫在函數(shù)定義里,造成函數(shù)對全局?jǐn)?shù)據(jù)的依賴。數(shù)組名寫在函數(shù)定義里,造成函數(shù)對
8、全局?jǐn)?shù)據(jù)的依賴。 c語言程序設(shè)計(jì)15第十四講下11 程序的缺點(diǎn):程序的缺點(diǎn): 1)固定數(shù)組限制了能讀入的最長行;)固定數(shù)組限制了能讀入的最長行; 2)出現(xiàn)超長行時(shí)出現(xiàn)截?cái)?,且長度統(tǒng)計(jì)錯誤。)出現(xiàn)超長行時(shí)出現(xiàn)截?cái)?,且長度統(tǒng)計(jì)錯誤。 長度統(tǒng)計(jì)錯誤問題易解決:數(shù)組滿后繼續(xù)讀字符計(jì)數(shù),但字符長度統(tǒng)計(jì)錯誤問題易解決:數(shù)組滿后繼續(xù)讀字符計(jì)數(shù),但字符 不存入不存入line。最后最后得到實(shí)際最長行的長度,及該行中不超過得到實(shí)際最長行的長度,及該行中不超過 1022個實(shí)際字符。個實(shí)際字符。 人們傾向于把人們傾向于把程序里大型、唯一、許多函數(shù)公用的數(shù)據(jù)(程序里大型、唯一、許多函數(shù)公用的數(shù)據(jù)( 如大數(shù)組)定義為外部
9、變量。一般數(shù)據(jù)用參數(shù)傳遞。如大數(shù)組)定義為外部變量。一般數(shù)據(jù)用參數(shù)傳遞。 對于具體問題應(yīng)怎樣處理,要考慮軟件系統(tǒng)實(shí)現(xiàn)各方面的對于具體問題應(yīng)怎樣處理,要考慮軟件系統(tǒng)實(shí)現(xiàn)各方面的 問題,如方便、清晰、數(shù)據(jù)安全等因素。問題,如方便、清晰、數(shù)據(jù)安全等因素。 怎么辦?怎么辦? c語言程序設(shè)計(jì)15第十四講下12 第十四講(作業(yè)提示)第十四講(作業(yè)提示) nP215頁第頁第5題:題: q寫一個把數(shù)字字符串轉(zhuǎn)換成整數(shù)的函數(shù),它只有一個字符數(shù)寫一個把數(shù)字字符串轉(zhuǎn)換成整數(shù)的函數(shù),它只有一個字符數(shù) 組參數(shù)組參數(shù) q參照:參照:P192頁二進(jìn)制轉(zhuǎn)換頁二進(jìn)制轉(zhuǎn)換 nP215頁第頁第11題:題: q寫程序,它讀入一個文件
10、,輸出其中最長的詞寫程序,它讀入一個文件,輸出其中最長的詞 q參照:參照:P194頁讀入文件輸出最長行頁讀入文件輸出最長行 nP215頁第頁第13題:題: q寫一個函數(shù),它能夠判斷字符串是否是一個回文寫一個函數(shù),它能夠判斷字符串是否是一個回文 q英文字符串、中文字符串、中英文混雜英文字符串、中文字符串、中英文混雜 q中文:雙字節(jié)表示一個中文中文:雙字節(jié)表示一個中文 q要求:首字節(jié)的要求:首字節(jié)的ASCII值大于值大于127簡單方法簡單方法 q準(zhǔn)確方法:了解中文的準(zhǔn)確方法:了解中文的unicode, 雙字節(jié)編碼后對應(yīng)的雙字節(jié)編碼后對應(yīng)的ASCII 值在值在19968(4E00)至至40891(9
11、FBB)之間之間 c語言程序設(shè)計(jì)15第十四講下13 輕松一下:回文輕松一下:回文(Palindrome)的樂趣的樂趣 n回文就是指一個單詞或短語,其順讀和倒讀都回文就是指一個單詞或短語,其順讀和倒讀都 是一樣的是一樣的 n兩個經(jīng)驗(yàn)的回文兩個經(jīng)驗(yàn)的回文 q拿破倫被放逐到拿破倫被放逐到Elba島時(shí)說的一句話島時(shí)說的一句話“Albe was I, ere I saw Elba” qA man, a plan, a canal-panama! n1983年年10月,月,CMU計(jì)算機(jī)科學(xué)研究生計(jì)算機(jī)科學(xué)研究生Jim Saxe將它擴(kuò)展為:將它擴(kuò)展為: qA man, a plan, a cat, a ca
12、nal-panama! n一場競賽開始了一場競賽開始了 c語言程序設(shè)計(jì)15第十四講下14 世界上最長的回文世界上最長的回文 n耶魯大學(xué)的耶魯大學(xué)的Steve Smith qA tool, a fool, a pool-loopaloofallota! n幾周之后的擴(kuò)展幾周之后的擴(kuò)展 qA man, a plan, a cat, a ham , a yak, a yam, a hat, a cannal-panama! n世界上最長的回文世界上最長的回文 qhttp:/ q17826個單詞個單詞 c語言程序設(shè)計(jì)15第十四講下15 清代女詩人吳絳雪的清代女詩人吳絳雪的四季回文詩四季回文詩 n春春:
13、鶯啼岸柳弄春晴,夜月明。:鶯啼岸柳弄春晴,夜月明。 q鶯啼岸柳弄春晴,柳弄春晴夜月明。明月夜晴春弄柳,晴春鶯啼岸柳弄春晴,柳弄春晴夜月明。明月夜晴春弄柳,晴春 弄柳岸啼鶯。弄柳岸啼鶯。 n夏夏:香蓮碧水動風(fēng)涼,夏日長。:香蓮碧水動風(fēng)涼,夏日長。 q香蓮碧水動風(fēng)涼,水動風(fēng)涼夏日長。長日夏涼風(fēng)動水,涼風(fēng)香蓮碧水動風(fēng)涼,水動風(fēng)涼夏日長。長日夏涼風(fēng)動水,涼風(fēng) 動水碧蓮香。動水碧蓮香。 n秋秋:秋江楚雁宿沙洲,淺水流。:秋江楚雁宿沙洲,淺水流。 q秋江楚雁宿沙洲,雁宿沙洲淺水流。流水淺洲沙宿雁,洲沙秋江楚雁宿沙洲,雁宿沙洲淺水流。流水淺洲沙宿雁,洲沙 宿雁楚江秋。宿雁楚江秋。 n冬冬:紅爐透炭炙寒風(fēng),御
14、隆冬。:紅爐透炭炙寒風(fēng),御隆冬。 q紅爐透炭炙寒風(fēng),炭炙寒風(fēng)御隆冬。冬隆御風(fēng)寒炙炭,風(fēng)寒紅爐透炭炙寒風(fēng),炭炙寒風(fēng)御隆冬。冬隆御風(fēng)寒炙炭,風(fēng)寒 炙炭透爐紅。炙炭透爐紅。 c語言程序設(shè)計(jì)15第十四講下16 n數(shù)組的概念、定義和使用數(shù)組的概念、定義和使用 n數(shù)組程序?qū)嵗龜?shù)組程序?qū)嵗?n數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù) n字符數(shù)組和字符串字符數(shù)組和字符串 n兩維和多維數(shù)組兩維和多維數(shù)組 n編程實(shí)例編程實(shí)例 主要內(nèi)容主要內(nèi)容 一維數(shù)值型數(shù)組的重要應(yīng)用一維數(shù)值型數(shù)組的重要應(yīng)用 c語言程序設(shè)計(jì)15第十四講下17 6.5 兩維和多維數(shù)組兩維和多維數(shù)組 一維數(shù)組有一個下標(biāo),元素線性排列。一維數(shù)組有一個下標(biāo),元素
15、線性排列。 需要處理更復(fù)雜的結(jié)構(gòu),如數(shù)值應(yīng)用中的矩陣。需要處理更復(fù)雜的結(jié)構(gòu),如數(shù)值應(yīng)用中的矩陣。 矩陣為兩維,元素通過兩個下標(biāo)指定。如何表示?矩陣為兩維,元素通過兩個下標(biāo)指定。如何表示? 例:計(jì)算兩個例:計(jì)算兩個88的矩陣的和及乘積的矩陣的和及乘積 計(jì)算三維空間中的一系列點(diǎn)的中心。計(jì)算三維空間中的一系列點(diǎn)的中心。 c語言程序設(shè)計(jì)15第十四講下18 二維數(shù)組的定義 v定義方式: 數(shù)據(jù)類型數(shù)組名常量表達(dá)式常量表達(dá)式; 例例 int a34; double b25; int c234; int a3,4; ( ) 行數(shù)行數(shù) 列數(shù)列數(shù) 元素個數(shù)元素個數(shù)=行數(shù)行數(shù)*列數(shù)列數(shù) 二維和多維數(shù)組二維和多維數(shù)組
16、 稱稱a為為34的的int(二維)(二維)數(shù)組,數(shù)組,b為為25的的double(二維)(二維)數(shù)數(shù) 組等,組等,c為為234的的int(三維)數(shù)組(三維)數(shù)組 c語言程序設(shè)計(jì)15第十四講下19 v數(shù)組元素的存放順序 l原因:內(nèi)存是一維的 l二維數(shù)組:按行序優(yōu)先 l多維數(shù)組:最右下標(biāo)變化最快 int a32 a01 a10 a11 a20 a21 0 1 4 5 2 3 a00 a00 a01 a10 a11 a20 a21 int c234 0 1 2 3 4 5 6 7 . 20 21 22 23 c000 c001 c002 c003 c010 c011 c012 c013 c020 c
17、021 c022 c023 c100 c101 c102 c103 c110 c111 c112 c113 c120 c121 c122 c123 二維和多維數(shù)組二維和多維數(shù)組 c語言程序設(shè)計(jì)15第十四講下20 例 int a34; a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 每個元素每個元素ai由包含由包含4個元素個元素 的一維數(shù)組組成的一維數(shù)組組成 二維數(shù)組二維數(shù)組a是由是由3個元素組成個元素組成 a0 a1 a2 行名 0 1 4 5 2 3 a01 a02 a03 a10 a11 a00 a13 a20 a21 a22 a23 a12
18、 6 7 10 11 8 9 a0 a1 a2 二維數(shù)組理解二維數(shù)組理解 a a是開始位置(數(shù)組是開始位置(數(shù)組a a的首地址)的首地址)也是也是a0a0的開始位置,也是的開始位置,也是a00a00的位置的位置 c語言程序設(shè)計(jì)15第十四講下21 二維數(shù)組元素的初始化二維數(shù)組元素的初始化 l分行初始化: 例 int a23 = 1,2,3,4,5,6; a00 a01 a02 a10 a11 a12 123456 全部初始化 例 int a23 = 1,2,4; a00 a01 a02 a10 a11 a12 120400 部分初始化 例 int a3 = 1,4,5; a00 a01 a02
19、a10 a11 a12 100450 第一維長度省略初始化 c語言程序設(shè)計(jì)15第十四講下22 二維數(shù)組元素的初始化二維數(shù)組元素的初始化 l按元素排列順序初始化 : 例 int a23 = 1,2,3,4,5,6; a00 a01 a02 a10 a11 a12 123456 全部初始化 例 int a23 = 1,2,4; a00 a01 a02 a10 a11 a12 124000 部分初始化 例 int a3 = 1,2,3,4,5; a00 a01 a02 a10 a11 a12 123450 第一維長度省略初始化 c語言程序設(shè)計(jì)15第十四講下23 設(shè)有數(shù)組定義:設(shè)有數(shù)組定義: doub
20、le a32; int b44; a表示整個數(shù)組,表示整個數(shù)組,a0、a1和和a2表示成員數(shù)組。表示成員數(shù)組。 a01表示表示a的的0成員數(shù)組中下標(biāo)成員數(shù)組中下標(biāo)1的元素。例:的元素。例: a21 = a01 + a11; 二維(多維)數(shù)組的表示和使用二維(多維)數(shù)組的表示和使用 for (i = 0; i 4; +i) for (j = 0; j 4; +j) bij = i + j; c語言程序設(shè)計(jì)15第十四講下24 例:向一個二維數(shù)組輸入并輸出其全部元素例:向一個二維數(shù)組輸入并輸出其全部元素 #include int main() int i, j; int b32; printf(“輸
21、入數(shù)據(jù):輸入數(shù)據(jù):n”); for (i = 0; i 3; i+) for (j = 0; j 2; j+) scanf(“%d”, for (i = 0; i 3; i+) for (j = 0; j 2; j+) printf(nb%d%d=%d”, i,j,bij); printf(“n”); return 0; c語言程序設(shè)計(jì)15第十四講下25 for(i = 0; i N; +i) for(j = 0; j N; +j) x = 0.0; for(k = 0; k N; +k) x += Aik * Bkj; Cij = x; for(i = 0; i N; +i) for(j =
22、 0; j N; +j) printf(%f%c, Cij, j=N-1 ? n : ); 例:寫程序段求出由兩維數(shù)組例:寫程序段求出由兩維數(shù)組A、B表示的表示的55矩陣的矩陣的 乘積,存入兩維數(shù)組乘積,存入兩維數(shù)組C(設(shè)(設(shè)A,B已有值)并輸出。已有值)并輸出。 c語言程序設(shè)計(jì)15第十四講下26 例:將例:將5個同學(xué)的姓名從小到大排序并輸出個同學(xué)的姓名從小到大排序并輸出 #include #include void main() char name520, temp20; int i, j; printf(請輸入學(xué)生姓名請輸入學(xué)生姓名:n); for (i = 0; i 5; i+) get
23、s(namei); for (i = 0; i 5; i+) for (j = 0; j 0) strcpy(temp, namej); strcpy(namej, namej+1); strcpy(namej+1, temp); printf(學(xué)生排序名單為:學(xué)生排序名單為:n); for (i = 0; i 5; i+) printf(%sn, namei); c語言程序設(shè)計(jì)15第十四講下27 二維(多維)數(shù)組作為函數(shù)參數(shù)二維(多維)數(shù)組作為函數(shù)參數(shù) 下面函數(shù)求出下面函數(shù)求出n5數(shù)組中數(shù)據(jù)均值(數(shù)組中數(shù)據(jù)均值(n是參數(shù)):是參數(shù)): double aavg (int n, double a
24、5) int i, j; double sum = 0.0; for (i = 0; i n; +i) for (j = 0; j 5; +j) sum += aij; return sum / (5 * n); 可用于任何可用于任何n5的數(shù)組,但不能用于例如的數(shù)組,但不能用于例如47的數(shù)組的數(shù)組 下章將介紹一種定義通用函數(shù)的方法。下章將介紹一種定義通用函數(shù)的方法。 作為函數(shù)參數(shù)時(shí)不必給出最左一維長度,但要求給出除最左一作為函數(shù)參數(shù)時(shí)不必給出最左一維長度,但要求給出除最左一 維外其他各維的長度。維外其他各維的長度。 c語言程序設(shè)計(jì)15第十四講下28 例例: 有一個有一個3*4的矩陣的矩陣,求出
25、其中的最大元素的值求出其中的最大元素的值. #include int max_value(int, int 4); int max_value(int n, int array4) int i, j, max = array00; for (i = 0; i n; i+) for (j = 0; j max) max = arrayij; return max; int main() static int a34 = 1,3,5,7,2,4,6,8,15,17,34,12; printf(“max value is %dn”, max_value(3, a); return 0; c語言程序設(shè)
26、計(jì)15第十四講下29 n數(shù)組的概念、定義和使用數(shù)組的概念、定義和使用 n數(shù)組程序?qū)嵗龜?shù)組程序?qū)嵗?n數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù) n字符數(shù)組和字符串字符數(shù)組和字符串 n兩維和多維數(shù)組兩維和多維數(shù)組 n編程實(shí)例編程實(shí)例 主要內(nèi)容主要內(nèi)容 c語言程序設(shè)計(jì)15第十四講下30 6.6 編程實(shí)例(下)編程實(shí)例(下) 本節(jié)討論一些基于數(shù)組的編程實(shí)例。本節(jié)討論一些基于數(shù)組的編程實(shí)例。 一個具體問題可寫出許多不同的程序。從一個具體問題可寫出許多不同的程序。從問題問題到到程程 序序的工作過程中,許多地方需要編程者做出選擇。的工作過程中,許多地方需要編程者做出選擇。 有些選擇涉及對問題的不同考慮或認(rèn)識,可能引
27、起有些選擇涉及對問題的不同考慮或認(rèn)識,可能引起 程序間的顯著差異。程序間的顯著差異。 c語言程序設(shè)計(jì)15第十四講下31 例例1 :成績直方圖:成績直方圖 文件里保存著一批學(xué)生成績,寫程序讀入這些成績,產(chǎn)生其平文件里保存著一批學(xué)生成績,寫程序讀入這些成績,產(chǎn)生其平 均值均值M和標(biāo)準(zhǔn)差和標(biāo)準(zhǔn)差S,并做直方圖。有定義:,并做直方圖。有定義: M N xi i N 1 1 S N xM i i N 2 1 2 1 1 () 程序中需要反復(fù)使用學(xué)生成績,應(yīng)存入數(shù)組程序中需要反復(fù)使用學(xué)生成績,應(yīng)存入數(shù)組(double型型)。 程序工作比較多,考慮將主要工作劃分為若干函數(shù)。程序工作比較多,考慮將主要工作劃分
28、為若干函數(shù)。 程序工作分為三步(第一層分解):程序工作分為三步(第一層分解): 輸入,輸入, 計(jì)算并輸出統(tǒng)計(jì)量,計(jì)算并輸出統(tǒng)計(jì)量, 1) 計(jì)算并輸出直方圖。計(jì)算并輸出直方圖。 c語言程序設(shè)計(jì)15第十四講下32 enum NUM = 200, HISTOHIGH = 60 ; double scoresNUM; int readscores(int lim, double tb); void statistics(int num, double tb); void histogram(int num, double tb, int high); int main(void) int n = re
29、adscores(NUM, scores); statistics(n, scores); histogram(n, scores, HISTOHIGH); return 0; 程序主體結(jié)構(gòu)程序主體結(jié)構(gòu) 函數(shù)原型函數(shù)原型 c語言程序設(shè)計(jì)15第十四講下33 int readscores(int lim, double tb) int i = 0; while(ilim return i; 輸入成績函數(shù)輸入成績函數(shù) c語言程序設(shè)計(jì)15第十四講下34 void statistics(int n, double tb) int i; double s, sum, avr; if (n 2) /*項(xiàng)數(shù)小
30、于項(xiàng)數(shù)小于2時(shí)的處理時(shí)的處理*/ printf(Data too few.n); return; for (sum = 0.0, i = 0; i n; +i) sum += tbi; avr = sum/n; for (sum = 0.0, i = 0; i n; +i) sum += (tbi-avr)*(tbi-avr); s = sqrt(sum/(n-1); printf(Total students: %dn, n); printf(Average score: %fn, avr); printf(Std deviation: %fnn, s); 計(jì)算并輸出統(tǒng)計(jì)值函數(shù)計(jì)算并輸出統(tǒng)計(jì)
31、值函數(shù) 如果需要保留如果需要保留 avr和和s? c語言程序設(shè)計(jì)15第十四講下35 直方圖生成直方圖生成(用橫向的直方圖):(用橫向的直方圖): 每個成績段輸出一組字符,選每個成績段輸出一組字符,選H作為基本字符。作為基本字符。 void prtHH(int n) int i; for(i = 0; i n; +i)putchar(H); 分段長度可用符號常量分段長度可用符號常量SEGLEN表示,根據(jù)它可算出分段數(shù)表示,根據(jù)它可算出分段數(shù) HISTONUM 。 enum SEGLEN = 5, HISTONUM = (100/SEGLEN)+1 ; c語言程序設(shè)計(jì)15第十四講下36 分段成績數(shù)
32、統(tǒng)計(jì):用數(shù)組統(tǒng)計(jì)各分段成績?nèi)藬?shù),將數(shù)組命名為分段成績數(shù)統(tǒng)計(jì):用數(shù)組統(tǒng)計(jì)各分段成績?nèi)藬?shù),將數(shù)組命名為 segs,其中應(yīng)有,其中應(yīng)有HISTONUM個計(jì)數(shù)器。個計(jì)數(shù)器。 處理的是等長分段,存在從成績得到計(jì)數(shù)器下標(biāo)的簡便方法。處理的是等長分段,存在從成績得到計(jì)數(shù)器下標(biāo)的簡便方法。 segs(int)scoresi)/SEGLEN+; 將成績強(qiáng)制轉(zhuǎn)到將成績強(qiáng)制轉(zhuǎn)到int后除以分段長度得到計(jì)數(shù)器下標(biāo)。后除以分段長度得到計(jì)數(shù)器下標(biāo)。 下面考慮用如下形式輸出直方圖行:下面考慮用如下形式輸出直方圖行: 80: 23|HHHHHHHHHHHHHH 為使直方圖規(guī)范化,最長行為使直方圖規(guī)范化,最長行HISTOHIG
33、H個字符。個字符。 c語言程序設(shè)計(jì)15第十四講下37 void histogram(int n, double tb, int high) int i, mx; int segsHISTONUM; if (n = 0) return; for (i = 0; i HISTONUM; +i) segsi = 0; for (i = 0; i n; +i) /* 統(tǒng)計(jì)分段人數(shù)統(tǒng)計(jì)分段人數(shù) */ segs(int)tbi/SEGLEN+; for (mx = 1, i = 0; i mx) mx = segsi; /*找最大值找最大值*/ for (i = 0; i HISTONUM; +i) /*
34、 輸出輸出 */ printf(%3d: %4d|,(i+1)*SEGLEN,segsi); prtHH(segsi*high/mx); putchar(n); c語言程序設(shè)計(jì)15第十四講下38 分析和改進(jìn)分析和改進(jìn) 若文件中都是若文件中都是0到到100的數(shù)值,程序能得到正確結(jié)果。出現(xiàn)不法的數(shù)值,程序能得到正確結(jié)果。出現(xiàn)不法 數(shù)據(jù)呢?如混入一個數(shù)據(jù)呢?如混入一個178,程序會怎么樣?,程序會怎么樣? 實(shí)際軟件應(yīng)正確處理合法輸入,還應(yīng)在輸入有錯時(shí)合理處置。實(shí)際軟件應(yīng)正確處理合法輸入,還應(yīng)在輸入有錯時(shí)合理處置。 如果編譯程序遇到不合法程序就垮臺,還可能破壞操作系統(tǒng),如果編譯程序遇到不合法程序就垮臺
35、,還可能破壞操作系統(tǒng), 還有人愿意用它嗎?還有人愿意用它嗎? 程序抵御不合法數(shù)據(jù)破壞的能力稱為程序抵御不合法數(shù)據(jù)破壞的能力稱為強(qiáng)健性強(qiáng)健性。 修改后的修改后的readscores如下如下 n首先需要檢查每個輸入項(xiàng),只將合法數(shù)據(jù)存入數(shù)組。首先需要檢查每個輸入項(xiàng),只將合法數(shù)據(jù)存入數(shù)組。 n有關(guān)數(shù)據(jù)是否處理完的情況只能在循環(huán)結(jié)束后檢查。有關(guān)數(shù)據(jù)是否處理完的情況只能在循環(huán)結(jié)束后檢查。 c語言程序設(shè)計(jì)15第十四講下39 int readscores(int limit, double tb) int i = 0, line = 1; double x; for(; ilimit +line) if(0.
36、0 = x +i; else printf(Error, line %dn, line); if(i=limit return 0; /* 可以用可以用 !feof(stdin) 判斷判斷 */ return i; 還可考慮其他改進(jìn)。還可考慮其他改進(jìn)。 c語言程序設(shè)計(jì)15第十四講下40 例例2“計(jì)算計(jì)算”數(shù)組的大小數(shù)組的大小 例:求例:求2.38、3.142、5.64、8.27、6.44的平均值。的平均值。 #include double a5=2.38,3.142,5.64,8.27,6.44; int main () int n; double sum = 0.0; for (n = 0;
37、 n 5; +n)sum += an; printf(Average: %fn, sum / 5); return 0; 缺點(diǎn):改一組數(shù)據(jù)(不是缺點(diǎn):改一組數(shù)據(jù)(不是5個)就要改程序(程序里的三個個)就要改程序(程序里的三個5都都 要改)。要改)。 c語言程序設(shè)計(jì)15第十四講下41 運(yùn)算符運(yùn)算符sizeof求類型或變量占內(nèi)存量。求類型或變量占內(nèi)存量。 sizeof(a)求出求出a大小,大小,sizeof(a0)求出求出a元素大小。元素大小。 (sizeof(a) / sizeof(a0) 求出數(shù)組求出數(shù)組a的元素個數(shù)。的元素個數(shù)。 #include #define NUM(x) (sizeof
38、(x)/sizeof(x0) double a=2.38,3.142,5.64,8.27,6.44; int main () int n; double sum = 0.0; for (n = 0; n NUM(a); +n) sum += an; printf(Average: %fn, sum / NUM(a); return 0; /* 更改數(shù)組數(shù)據(jù)時(shí)只需添入新數(shù)據(jù)更改數(shù)組數(shù)據(jù)時(shí)只需添入新數(shù)據(jù) */ c語言程序設(shè)計(jì)15第十四講下42 #define NUM(x) (sizeof(x)/sizeof(x0) double avg (double a) double x = 0.0; int
39、 i, len = NUM(a); for (i = 0; i len; +i)x += ai; return x / len; 這樣不行這樣不行:sizeof是靜態(tài)處理的運(yùn)算符,數(shù)組參數(shù)實(shí)際上不是是靜態(tài)處理的運(yùn)算符,數(shù)組參數(shù)實(shí)際上不是 數(shù)組(是指針,數(shù)組(是指針, sizeof(a)求出一個指針的大?。ㄍǔ5扔谝磺蟪鲆粋€指針的大?。ㄍǔ5扔谝?個個int的大?。拇笮。斠姷谠斠姷?章)。章)。 c語言程序設(shè)計(jì)15第十四講下43 例例3:數(shù)組的劃分:數(shù)組的劃分 6.2.3節(jié)要求分段輸出學(xué)生成績。一種可能方式是調(diào)整成績排列節(jié)要求分段輸出學(xué)生成績。一種可能方式是調(diào)整成績排列 ,把不及格成績移
40、到左邊,及格成績移到右邊,而后順序輸出,把不及格成績移到左邊,及格成績移到右邊,而后順序輸出 按照某種標(biāo)準(zhǔn)把數(shù)組里的數(shù)據(jù)分段稱為按照某種標(biāo)準(zhǔn)把數(shù)組里的數(shù)據(jù)分段稱為“劃分劃分” 考慮一種劃分算法:用兩個下標(biāo)變量,逐步從兩端向中間移,考慮一種劃分算法:用兩個下標(biāo)變量,逐步從兩端向中間移, 保證下圖所示的不變關(guān)系:保證下圖所示的不變關(guān)系: ij 60 60 循環(huán)開始時(shí)令循環(huán)開始時(shí)令 i = 0,j = n-1,關(guān)系成立,關(guān)系成立 到到 i = j 不成立時(shí),劃分完成不成立時(shí),劃分完成 c語言程序設(shè)計(jì)15第十四講下44 劃分循環(huán):劃分循環(huán): for (i = 0, j = n - 1; i j; )
41、while (i = j while (i = PASS) -j; if(i j) x = scoresi; scoresi = scores j; scores j = x; +i; -j; if (i = j 循環(huán)結(jié)束時(shí),循環(huán)結(jié)束時(shí),scores里下標(biāo)里下標(biāo)0到到i-1是小于是小于60分的成績,下標(biāo)分的成績,下標(biāo)i 到到n-1是不小于是不小于60的成績,的成績,i是不及格人數(shù)。是不及格人數(shù)。 c語言程序設(shè)計(jì)15第十四講下45 劃分函數(shù):劃分函數(shù): int partition(int num, double a, double cut) double x; int i = 0, j = nu
42、m - 1; while (i = j) while (i = j while (i = cut) -j; if (i j) x = ai; ai = a j; aj = x; +i; -j; return i; c語言程序設(shè)計(jì)15第十四講下46 例例4 4:m m個猴子選大王,報(bào)個猴子選大王,報(bào)n n的出列。的出列。m=8,n=3m=8,n=3 算法思路: 數(shù)組am:數(shù)組元素下標(biāo)代表數(shù)組元素下標(biāo)代表1 1m m只猴子只猴子 數(shù)組元素內(nèi)容代表下一只要報(bào)數(shù)的猴子數(shù)組元素內(nèi)容代表下一只要報(bào)數(shù)的猴子 整數(shù)p:正在報(bào)數(shù)的猴子 整數(shù)q:前一個報(bào)數(shù)的猴子 整數(shù)t:p所指猴子所報(bào)的數(shù) 初值 18765432
43、 a1a2a3a4a5a6 a7a8 qp t=0 const int m=8;n=3; int a =0,2,3,4,5,6,7,8,1; int q=m, p=am, t=0; 或或for( i=1;im;i+) ai =i+1; am =1; q=m; p=am; t=0; 0 a0 a0不用不用 Josephus問題問題 c語言程序設(shè)計(jì)15第十四講下47 18765432 a1a2a3a4a5a6 a7a8 q pt=0 報(bào)數(shù)開始,直到剩下一只猴子 do while 下一個要報(bào)數(shù)的猴子將成為現(xiàn)在報(bào)數(shù)的猴子 (p!=aq); 確定現(xiàn)在報(bào)數(shù)的猴子,報(bào)數(shù) p=aq;t=t+1; if (t
44、% n)!=0 )如果t不是n的倍數(shù) yes: no: 當(dāng)前報(bào)數(shù)的猴子p成為前一個報(bào) 數(shù)的猴子q q=p; else 當(dāng)前猴子退出,調(diào)整報(bào)數(shù)次序 當(dāng)前報(bào)數(shù)猴子的內(nèi)容ap賦給前 一個報(bào)數(shù)猴子q的內(nèi)容aq aq =ap; q c語言程序設(shè)計(jì)15第十四講下48 #include int main( ) int m = 8, n = 3; int a = 0, 2, 3, 4, 5, 6, 7, 8, 1; int q, p, t; q = m; t = 0; do p = aq; t = t+1; if (t % n) != 0 ) q = p; else aq = ap; while(p != a
45、q); printf(The king is %dthn, p); return 0; 如何用函數(shù)改寫?如何用函數(shù)改寫? c語言程序設(shè)計(jì)15第十四講下49 p t=1 猴子選大王過程 do p=aq; t=t+1; If (t % n)!=0) q=p; else aq =ap ; while(p!=aq) do p=aq; t=t+1; If( (t % n)!=0 ) q=p; else aq =ap ; while(p!=aq) 初值:q=m=5;n=2 t=0; q a1a2a3a4a5 15432 a1a2a3a4a5 15432 pq c語言程序設(shè)計(jì)15第十四講下50 p t=2
46、猴子選大王過程 do p=aq; t=t+1; If (t % n)!=0) q=p; else aq =ap ; while(p!=aq) do p=aq; t=t+1; If (t % n)!=0 ) q=p; else aq =ap ; while(p!=aq) m=5;n=2; q a1a2a3a4a5 15432 p a1a2a3a4a5 15432 q 3 c語言程序設(shè)計(jì)15第十四講下51 p t=3 猴子選大王過程 do p=aq; t=t+1; If (t % n)!=0) q=p; else aq =ap ; while(p!=aq) do p=aq; t=t+1; If (
47、t % n)!=0 ) q=p; else aq =ap ; while(p!=aq) m=5;n=2; qp a1a2a3a4a5 15432 3 q a1a2a3a4a5 15432 3 c語言程序設(shè)計(jì)15第十四講下52 p t=4 猴子選大王過程 do p=aq; t=t+1; If (t % n)!=0) q=p; else aq =ap ; while(p!=aq) do p=aq; t=t+1; If (t % n)!=0) q=p; else aq =ap ; while(p!=aq) m=5;n=2; qp a1a2a3a4a5 15432 3 q a1a2a3a4a5 154
48、32 3 5 c語言程序設(shè)計(jì)15第十四講下53 p t=5 猴子選大王過程 do p=aq; t=t+1; If (t % n)!=0) q=p; else aq =ap ; while(p!=aq) do p=aq; t=t+1; If (t % n)!=0) q=p; else aq =ap ; while(p!=aq) m=5;n=2; qp a1a2a3a4a5 15432 35 q a1a2a3a4a5 15432 35 c語言程序設(shè)計(jì)15第十四講下54 p t=6 猴子選大王過程 do p=aq; t=t+1; If (t % n)!=0 ) q=p; else aq =ap ; while(p!=aq) do p=aq; t=t+1; If (t % n)!=0) q=p; else aq =ap ; while(p!=aq) m=5;n=2; q a1a2a3a4a5 15432 35 p q a1a2a3a4a5 15432 353 c語言程序設(shè)計(jì)15第十四講下55 p t=7 猴子選大王過程 do p=aq; t=t+1; If (t % n)!=0) q=p; else aq =ap ; while(p!=aq) do p=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版特色餐飲店鋪出租管理協(xié)議3篇
- 2025版小額貸款抵押合同財(cái)務(wù)報(bào)告披露要求3篇
- 買賣合同糾紛代理詞3篇
- 二零二五版薦知識產(chǎn)權(quán)擔(dān)保交易合同集3篇
- 二零二五年度城市通勤車輛出租合作協(xié)議4篇
- 二零二五年度員工借款爭議調(diào)解及勞動法執(zhí)行合同
- 二零二五年度農(nóng)業(yè)OEM產(chǎn)品種植與加工合同范本3篇
- 二零二五年度工業(yè)廠房租賃市場拓展合同范本3篇
- 二零二五年度光伏充電樁場地共享租賃合同3篇
- 2025年度倉儲物流零星維修施工合同協(xié)議書3篇
- 湖北省黃石市陽新縣2024-2025學(xué)年八年級上學(xué)期數(shù)學(xué)期末考試題 含答案
- 硝化棉是天然纖維素硝化棉制造行業(yè)分析報(bào)告
- 央視網(wǎng)2025亞冬會營銷方案
- 《00541語言學(xué)概論》自考復(fù)習(xí)題庫(含答案)
- 《無砟軌道施工與組織》 課件 第十講雙塊式無砟軌道施工工藝
- 江蘇省南京市、鹽城市2023-2024學(xué)年高三上學(xué)期期末調(diào)研測試+英語+ 含答案
- 2024新版《藥品管理法》培訓(xùn)課件
- 《阻燃材料與技術(shù)》課件 第7講 阻燃橡膠材料
- 爆炸物運(yùn)輸安全保障方案
- 江蘇省南京市2025屆高三學(xué)業(yè)水平調(diào)研考試數(shù)學(xué)試卷(解析版)
- 2024年黑龍江省哈爾濱市中考數(shù)學(xué)試卷(附答案)
評論
0/150
提交評論