C語(yǔ)言程序設(shè)計(jì)教程第7章北京郵電大學(xué)出版社.ppt
《C語(yǔ)言程序設(shè)計(jì)教程第7章北京郵電大學(xué)出版社.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《C語(yǔ)言程序設(shè)計(jì)教程第7章北京郵電大學(xué)出版社.ppt(74頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
7 1一維數(shù)組7 2二維數(shù)組7 3數(shù)組的應(yīng)用7 4字符數(shù)組與字符串7 5數(shù)組作為函數(shù)的參數(shù)7 6程序舉例 第7章數(shù)組 C語(yǔ)言程序設(shè)計(jì)教程 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 2 1 數(shù)組的引入在前面的程序設(shè)計(jì)中 所涉及和處理的數(shù)據(jù)都非常簡(jiǎn)單 對(duì)這些數(shù)據(jù)采用C語(yǔ)言的基本類型 整型 實(shí)型 字符型 來(lái)描述就行 但在實(shí)際應(yīng)用中 需要處理的數(shù)據(jù)往往是復(fù)雜多樣的 問(wèn)題 輸入100名學(xué)生某門課程的成績(jī) 要求將高于平均分的那些成績(jī)打印出來(lái) 1 可以用讀入一個(gè)數(shù)就累加一個(gè)的辦法來(lái)求出學(xué)生的平均分 2 但只有讀入全部學(xué)生的分?jǐn)?shù)后才能求得平均分 3 所以必須將100個(gè)學(xué)生的成績(jī)?nèi)慷急A粝聛?lái) 然后逐個(gè)和平均分比較 把高于平均分的成績(jī)打印出來(lái) 所以保留學(xué)生的成績(jī)必須用100個(gè)變量s1 s2 s100 average用來(lái)存放平均分 需要100條語(yǔ)句來(lái)判斷學(xué)生的成績(jī)是否高于平均分 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 3 如何編程呢 語(yǔ)言提供了用戶自定義數(shù)據(jù)的描述方法 即構(gòu)造類型 由若干基本類型數(shù)據(jù)按一定的規(guī)則構(gòu)成復(fù)雜數(shù)據(jù)對(duì)象 如數(shù)組類型 構(gòu)造數(shù)據(jù)類型的引入 使我們能較方便地解決上面的問(wèn)題 2 數(shù)組的概念數(shù)組 具有相同類型的數(shù)據(jù)組成的序列 是有序集合 數(shù)組中的每一個(gè)數(shù)據(jù)稱數(shù)組元素由其所在的位置序號(hào) 稱數(shù)組元素的下標(biāo) 來(lái)區(qū)分 注意 數(shù)組元素有序不是指元素大小順序 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 4 C語(yǔ)言數(shù)組類型有三個(gè)特點(diǎn) 數(shù)組元素的個(gè)數(shù)必須是確定的 數(shù)組元素類型必須相同各元素可作為基本變量使用 上例中若采用數(shù)組來(lái)解決 程序?qū)⑹趾?jiǎn)單 floats 100 for i 0 i average printf s d f i s i 用數(shù)組名與下標(biāo)可以用統(tǒng)一的方式來(lái)處理數(shù)組中的所有元素 從而方便的實(shí)現(xiàn)處理一批具有相同性質(zhì)數(shù)據(jù)的問(wèn)題 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 5 7 1一維數(shù)組 7 1 1一維數(shù)組的定義一維數(shù)組 只有一個(gè)下標(biāo)的數(shù)組 定義格式 存儲(chǔ)類別類型標(biāo)識(shí)符數(shù)組名 元素個(gè)數(shù) 說(shuō)明 1 存儲(chǔ)類別 說(shuō)明數(shù)組的存儲(chǔ)屬性 即數(shù)組的作用域與生成期 可以是靜態(tài)型 static 自動(dòng)型 auto 及外部型 extern 當(dāng)使用auto型時(shí)可以省略 2 類型標(biāo)識(shí)符 數(shù)組元素的類型 3 數(shù)組名的命名規(guī)則 與標(biāo)識(shí)符的命名規(guī)則相同 4 數(shù)組 元素個(gè)數(shù) 即數(shù)組長(zhǎng)度 只能是一個(gè)整型常量表達(dá)式 可以是符號(hào)常量 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 6 例 inta 5 定義了一個(gè)自動(dòng)型整型數(shù)組 數(shù)組的元素為整型 數(shù)組名為a 元素個(gè)數(shù)為5 下面是合法的數(shù)組定義 charstr 20 定義一個(gè)有20個(gè)元素的字符型數(shù)組str floatscore 8 定義一個(gè)有8個(gè)元素的浮點(diǎn)型數(shù)組score defineN5longdata N 定義一個(gè)有5個(gè)元素的長(zhǎng)整型數(shù)組data shortz 4 N 定義了一個(gè)有20個(gè)元素的短整型數(shù)組z 其中 的數(shù)組長(zhǎng)度使用的是符號(hào)常量下面的定義是非法的 intn 10 charc n 數(shù)組長(zhǎng)度不能使用變量 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 7 例 試判斷下列數(shù)組定義是否合法 floatscore 35 definestudent35floatn student student intscore student student 3 intperson 10 intn 10 a n 定義規(guī)則 1 數(shù)組的下標(biāo)應(yīng)用方括號(hào)括起來(lái) 而非 2 常量表達(dá)中可包含常量和符號(hào)常量 但不能包含變量 即數(shù)組的大小不能動(dòng)態(tài)定義 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 8 7 1 2數(shù)組元素的引用 不能利用數(shù)組名來(lái)整體引用一個(gè)數(shù)組 只能單個(gè)的使用數(shù)組元素?cái)?shù)組元素的描述 由數(shù)組名加方括號(hào)中的下標(biāo)組成 即 數(shù)組名 下標(biāo) 下標(biāo) 數(shù)組元素在數(shù)組中的順序號(hào) 使用整序型表達(dá)式 取值范圍 從0到元素個(gè)數(shù) 1 C語(yǔ)言不對(duì)下標(biāo)越界作語(yǔ)法檢查 若有定義 inta 5 則數(shù)組a的元素分別為 a 0 a 1 a 2 a 3 a 4 但a 5 不是 每個(gè)元素都可作為一個(gè)整型變量來(lái)使用 如 a 0 5 a 3 a 1 4 a D B 3 scanf d a 4 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 9 includemain intn a 15 for n 0 n 0 n printf 4d a n 輸入 123456789101112131415 輸出 151413121110987654321 根據(jù)數(shù)組的有序性 往往使用循環(huán)語(yǔ)句來(lái)對(duì)數(shù)組進(jìn)行處理 用循環(huán)控制變量作為數(shù)組下標(biāo) 從而可以以統(tǒng)一的方式來(lái)訪問(wèn)數(shù)組元素 例7 1從鍵盤輸入15個(gè)整數(shù) 再反序輸出 問(wèn) 不用數(shù)組能否完成 如何實(shí)現(xiàn) 假設(shè)是1000個(gè)數(shù)據(jù)呢 注意 1 循環(huán)控制變量的初值 終值及控制條件 2 不能整體輸入 出數(shù)組如 printf d a 學(xué)會(huì)如何對(duì)數(shù)組進(jìn)行輸入輸出 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 10 7 1 3一維數(shù)組的存儲(chǔ)結(jié)構(gòu)與初始化1 一維數(shù)組的存儲(chǔ)結(jié)構(gòu)數(shù)組變量在內(nèi)存中分配一片連續(xù)的存儲(chǔ)單元 數(shù)組元素按數(shù)組下標(biāo)從小到大連續(xù)存放 a代表首地址 數(shù)組起始地址 每個(gè)元素字節(jié)數(shù)相同 因此 根據(jù)數(shù)組元素序號(hào)可以求得數(shù)組各元素在內(nèi)存的地址 并可對(duì)數(shù)組元素進(jìn)行隨機(jī)存取 數(shù)組元素地址 數(shù)組首地址 元素下標(biāo) sizeof 數(shù)組類型 例floata 5 設(shè)a的首地址為1000 數(shù)組a存儲(chǔ)示意圖如右圖所示 1012 a 3 的地址 1000 3 4 1012 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 11 2 一維數(shù)組的初始化含義 在定義數(shù)組的同時(shí) 對(duì)數(shù)組各元素指定初值 初始化是編譯階段完成 注意 用賦值語(yǔ)句或輸入語(yǔ)句也可給數(shù)組素指定初值 是在運(yùn)行時(shí)完成 初始化數(shù)組格式 說(shuō)明 是用逗號(hào)分隔的數(shù)組元素的初始值 常量 中數(shù)值的類型必須與一致 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 12 若不對(duì)auto數(shù)組進(jìn)行初始化 則其初值是不可知的 若一個(gè)static或外部數(shù)組未進(jìn)行初始化 則對(duì)數(shù)值型數(shù)組元素 初值為0 而對(duì)字符型數(shù)組元素 初值為空字符 0 對(duì)數(shù)組初始化的幾種方法 在定義數(shù)組時(shí) 對(duì)全部數(shù)組元素賦予初值 例 inta 5 0 1 2 3 4 在定義數(shù)組時(shí) 對(duì)部分?jǐn)?shù)組元素賦予初值 例 inta 5 1 2 等價(jià)a 0 1 a 1 2 其它賦0 對(duì)全部數(shù)組元素賦初值時(shí) 可省數(shù)組長(zhǎng)度 系統(tǒng)自動(dòng)確定 例 inta 0 1 2 3 4 等價(jià)于inta 5 0 1 2 3 4 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 13 例7 2數(shù)組初始化與未初始化比較 includemain inti a 5 3 4 5 b 5 printf narrayais for i 0 i 5 i printf 6d a i printf narraybis for i 0 i 5 i printf 6d b i 運(yùn)行結(jié)果 arrayais 34500arraybis 321398401170454 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 14 defineN5 includemain inti j k max min staticinta 5 for i 0 ia i min a i k i printf max a d d min a d d j max k min 例7 3從鍵盤上輸入5個(gè)數(shù) 輸出最大 最小的元素以及它們的下標(biāo) 若輸入 823120 10 輸出為 max a 2 312 min a 4 10 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 15 若一個(gè)一維數(shù)組 它的每一個(gè)元素亦是類型相同的一維數(shù)組時(shí) 便構(gòu)成二維數(shù)組 數(shù)組的維數(shù) 是指數(shù)組的下標(biāo)個(gè)數(shù) 一維數(shù)組元素只有一個(gè)下標(biāo) 二維數(shù)組元素有兩個(gè)下標(biāo) 7 2 1二維數(shù)組的定義1 定義形式 存儲(chǔ)類別類型標(biāo)識(shí)符數(shù)組名 行數(shù) 列數(shù) 例 floatb 5 3 定義了一個(gè)5 3的數(shù)組b 即數(shù)組為5行3列 可存放15個(gè)實(shí)型數(shù)據(jù) 7 2二維數(shù)組 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 16 2 定義時(shí)注意 1 同一維數(shù)組一樣 表達(dá)式中可包含常量和字符常量 但不能包含變量 2 二維數(shù)組也可以理解為定義了多個(gè)一維數(shù)組 如 inta 4 3 相當(dāng)于定義了四個(gè)一維數(shù)組 也可將a看作一個(gè)特殊的一維數(shù)組 其中每個(gè)元素又為一維數(shù)組 3 二維數(shù)組的存放順序二維數(shù)組中的元素在存儲(chǔ)時(shí)實(shí)行按行存放 即在內(nèi)存中先順序存放第一行的元素 再存放第二行的元素 對(duì)于a 4 3 a00 a01 a02 a10 a11 a12 a20 a21 a22 a30 a31 a32 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 17 3 多維數(shù)組的定義 根據(jù)二維數(shù)組的定義 我們可以類推出多維數(shù)組的定義 staticintb 2 2 3 定義了一個(gè)3維的靜態(tài)整型數(shù)組 floatc 2 3 2 2 定義了一個(gè)4維浮點(diǎn)型數(shù)組 在數(shù)組定義時(shí) 多維數(shù)組的維從左到右第一個(gè) 稱第一維 第二個(gè) 稱第二維 依此類推 多維數(shù)組元素的順序仍由下標(biāo)決定 下標(biāo)的變化是先變最右邊的 再依次變化左邊的下標(biāo) 三維數(shù)組b的12個(gè)元素是 b 0 0 0 b 0 0 1 b 0 0 2 b 0 1 0 b 0 1 1 b 0 1 2 b 1 0 0 b 1 0 1 b 1 0 2 b 1 1 0 b 1 1 1 b 1 1 2 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 18 二維數(shù)組的每一個(gè)元素都可以作一個(gè)變量來(lái)使用 1 表示形式為 數(shù)組名 下標(biāo) 下標(biāo) 同樣 數(shù)組的下標(biāo)下限為0 上限為常量表達(dá)式的值減1 2 下標(biāo)也可用整型表達(dá)式來(lái)表示 但下標(biāo)值應(yīng)在已定義的數(shù)組大小的范圍內(nèi) 即編譯系統(tǒng)對(duì)下標(biāo)不作檢查 如 inta 4 3 下列引用是否正確 a 1 2 6 3 4 a 4 2 10 a 4 2 2 a 3 2 a 1 2 3 注意定義時(shí)的a 4 3 與引用時(shí)的a 4 3 的區(qū)別 定義的a 4 3 數(shù)組中有無(wú)a 4 3 元素 7 2 2二維數(shù)組元素的引用 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 19 例7 4二維數(shù)組輸入輸出 main inta 2 3 printf nInputarraya for j 0 j 2 j for k 0 k 3 k scanf d 輸出一行后換行 再輸出下一行 輸入 Inputarraya 123456 輸出 Outputarraya 123456 對(duì)二維數(shù)組的輸入輸出多使用二層循環(huán)結(jié)構(gòu)來(lái)實(shí)現(xiàn) 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 20 7 2 3二維數(shù)組的存儲(chǔ)結(jié)構(gòu)設(shè)有定義inta 2 3 floatb 3 2 系統(tǒng)為數(shù)組在內(nèi)存中分配一片連續(xù)的內(nèi)存空間 將二維數(shù)組元素按行的順序存儲(chǔ)在所分配的內(nèi)存區(qū)域 數(shù)組a與b的各元素的存儲(chǔ)順序如右圖所示 元素a i j 的地為 a i n j 元素字節(jié)數(shù) 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 21 7 2 4 二維數(shù)組的初始化 按行賦初值 例 inta 2 3 1 2 3 2 3 4 每個(gè)花括號(hào)內(nèi)的數(shù)據(jù)對(duì)應(yīng)一行元素 按順序賦值 例 inta 2 3 1 2 3 2 3 4 將所有初值寫在一個(gè)花括號(hào)內(nèi) 只對(duì)部分元素賦值 例 inta 2 3 1 2 4 按行用括號(hào)括起來(lái) 沒(méi)有初值對(duì)應(yīng)的元素賦0值或空字符 字符數(shù)組 給全部元素賦初值或分行初始化時(shí) 可不指定第一維大小 其大小系統(tǒng)自動(dòng)確定 但必須指定第二維的大小 例 inta 3 1 2 3 4 5 6 inta 3 0 0 5 第一維的大小為多少 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 22 例7 5從鍵盤上輸入9個(gè)整數(shù) 保存在二維數(shù)組中 按數(shù)組原來(lái)位置輸出第一行和第一列的所有元素 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 23 includemain inti j a 3 3 for i 0 i 3 i 輸入數(shù)組 for j 0 j 3 j printf a d d i j scanf d for i 0 i 3 i 輸出數(shù)組 for j 0 j 3 j if i 1 j 1 printf 6d a i j elseprintf 6c printf n 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 24 例7 6用如下的3 3矩陣初始化數(shù)組a 3 3 求矩陣的轉(zhuǎn)置矩陣 123147456258789369轉(zhuǎn)置矩陣 是將原矩陣元素按行列互換形成的矩陣方法 沿主對(duì)角線將對(duì)稱位置元素互換即可 123147456258789369 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 25 程序如下 includemain intj k inta 3 3 1 2 3 4 5 6 7 8 9 b 3 3 for j 0 j 3 j for k 0 k 3 k b j k a k j for j 0 j 3 j for k 0 k 3 k printf 6d b j k printf n 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 26 7 3數(shù)組的應(yīng)用 1 利用數(shù)組求fiboncaci數(shù)列的前n項(xiàng)例7 7求fiboncaci數(shù)列的前20項(xiàng) f0 1f1 1 fi fi 1 fi 2 i 2 3 n 將前20項(xiàng)輸出到屏幕上 每行五項(xiàng) 分析 根據(jù)這個(gè)數(shù)列的組成規(guī)律 從第三項(xiàng)開(kāi)始 每個(gè)數(shù)據(jù)項(xiàng)的值為前兩個(gè)數(shù)據(jù)項(xiàng)的和 采用遞推方法來(lái)實(shí)現(xiàn) 可以用一個(gè)一維整型數(shù)組fib 20 來(lái)保存這個(gè)數(shù)列的前20項(xiàng) 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 27 include includemain inti fib 20 fib 0 1 fib 1 1 for i 2 i 19 i fib i fib i 1 fib i 2 printf FibonaciNumbersare n for i 0 i 20 i if i 5 0 printf n printf 7d fib i FibonaciNumbersare 11235813213455891442333776109871597258441816765 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 28 2 利用數(shù)組處理批量數(shù)據(jù)例7 8從鍵盤上輸入若干學(xué)生 不超過(guò)100人 的成績(jī) 計(jì)算平均成績(jī) 并輸出高于平均分的人數(shù)及成績(jī) 輸入成績(jī)?yōu)樨?fù)時(shí)結(jié)束 分析 根據(jù)題意 可以定義一個(gè)有100個(gè)元素的一維數(shù)組score 先將成績(jī)輸入到數(shù)組中 并計(jì)算平均成績(jī) 然后 將數(shù)組中的成績(jī)值一個(gè)個(gè)與平均值比較 輸出高于平均分的成績(jī) 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 29 程序如下 includemain floatscore 100 ave sum 0 x inti n 0 count printf Inputscore scanf f 輸出平均分 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 30 接上頁(yè) for count 0 i 0 iave printf f n score i 輸出高于平均分的成績(jī) count 統(tǒng)計(jì)高于平均分成績(jī)的人數(shù) if count 5 0 printf n 每行輸出成績(jī)達(dá)5個(gè)時(shí)換行 printf count d n count 輸出高于平均分的人數(shù) 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 31 3 利用數(shù)組排序例7 9從鍵盤上輸入10個(gè)整數(shù) 用選擇法其按由小到大的順序排列并輸出 基本思想 1 從第 個(gè)位置到第 個(gè)位置中選擇出最小的一個(gè)與第 個(gè)位置的數(shù)交換 2 從第 個(gè)位置到第 個(gè)位置中選擇出最小的一個(gè)與第 個(gè)位置的數(shù)交換 9 從第 個(gè)位置到第 個(gè)位置中選擇出最小的一個(gè)與第 個(gè)位置的數(shù)交換 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 32 513393222812321 1135 3 9322283 1 2321 131393222852321 135133222982321 135832221392321 135893222132321 135891332222321 135891321322322 135891321223223 135891321222332 輸入數(shù)據(jù) 513393222812321排序過(guò)程如下 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 33 includemain intI j t a 10 for I 0 I 10 I scanf d 輸入數(shù)據(jù)到數(shù)組 內(nèi)循環(huán) 在 I 9 內(nèi)選擇最小數(shù) 外循環(huán) 控制選擇的次數(shù) for I 0 Ia j t a I a I a j a j t printf n for I 0 I 10 I printf 6d a I 輸出排序后的數(shù)據(jù) 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 34 分析 從程序可知 1 程序使用兩重循環(huán)來(lái)實(shí)現(xiàn)排序 2 外循環(huán)控制排序趟數(shù) 若數(shù)組有N個(gè)元素 則共進(jìn)行N 1趟排序 第一趟 I 第二趟 I 3 內(nèi)循環(huán)完成在 I 的區(qū)間內(nèi)選擇最小數(shù) 比較次數(shù)隨趟數(shù)增大而減少 4 在每一趟選擇中 當(dāng)后面元素較小時(shí) 馬上進(jìn)行交換 而這種交換是不必要的 事實(shí)上 只要記住較小元素的位置 即下標(biāo) 在內(nèi)循結(jié)束后做一次交換即可 這樣可大大節(jié)省程序運(yùn)行時(shí)間 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 35 改進(jìn)排序過(guò)程如下 513393222812321 113393222852321 131393222852321 135932228132321 135832229132321 135892232132321 135891332222321 135891321222332 135891321222332 135891321222332改進(jìn)后的程序見(jiàn)下頁(yè) 注意與前一程序比較 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 36 includemain intI j k a 10 t for I 0 Ia j k j if k I t a I a I a k a k t printf n for I 0 I 10 I printf 6d a I 內(nèi)循環(huán) 外循環(huán) K是最小元素之下標(biāo) 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 37 4 利用數(shù)組進(jìn)行數(shù)據(jù)查找 折半查找法介紹 適應(yīng)情況 在一批有序數(shù)據(jù)中查找某數(shù)基本思想 選定這批數(shù)中居中間位置的一個(gè)數(shù)與所查數(shù)比較 看是否為所找之?dāng)?shù) 若不是 利用數(shù)據(jù)的有序性 可以決定所找的數(shù)是在選定數(shù)之前還是在之后 從而很快可以將查找范圍縮小一半 以同樣的方法在選定的區(qū)域中進(jìn)行查找 每次都會(huì)將查找范圍縮小一半 從而較快地找到目的數(shù)例7 10假設(shè)在數(shù)組a中的數(shù)據(jù)是按由小到大順序排列的 120616235680100110115 從鍵盤上輸入一個(gè)數(shù) 判定該數(shù)是否在數(shù)組中 若在 輸出所在序號(hào) 若不在 輸出相應(yīng)信息 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 38 查找過(guò)程如下 第一步 設(shè)low mid和high三個(gè)變量 分別指示數(shù)列中的起始元素 中間元素與最后一個(gè)元素位置 其初始值為low 0 high 9 mid 4 判斷mid指示的數(shù)是否為所求 mid指示的數(shù)是23 不是要找的80 須繼續(xù)進(jìn)行查找 120616235680100110115 low mid high第二步 確定新的查找區(qū)間 因?yàn)?0大于23 所以查找范圍可以縮小為23后面的數(shù) 新的查找區(qū)間為 5680100110115 low mid high分別指向新區(qū)間的開(kāi)始 中間與最后一個(gè)數(shù) 實(shí)際上high不變 將low low mid 1 指向56 mid mid low high 2 指向100 還不是要找的80 仍須繼續(xù)查找 12061623 5680100110115 low mid high 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 39 第三步 上一步中 所找數(shù)80比mid指示的100小 可知新的查找區(qū)間為 5680 low不變 mid與high的值作相應(yīng)修改 mid指示的數(shù)為56 還要繼續(xù)查找 12061623 5680 100110115 low high mid第四步 根據(jù)上一步的結(jié)果 80大于mid指示的數(shù)56 可確定新的查找區(qū)間為 80 此時(shí) low與high都指向80 mid亦指向80 即找到了80 到此為止 查找過(guò)程完成 1206162356 80 100110115 low mid high若在查找過(guò)程中 出現(xiàn)low high的情況 則說(shuō)明 序列中沒(méi)有該數(shù) 亦結(jié)束查找過(guò)程 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 40 defineM10 includemain staticinta M 12 0 6 16 23 56 80 100 110 115 intn low mid high found low 0 high M 1 found 0 printf Inputanumbertobesearched scanf d 輸入 80 輸出 Theindexof80is6 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 41 7 4字符數(shù)組與字符串 7 4 1字符數(shù)組的定義與初始化一 字符數(shù)組的定義字符數(shù)組 其元素類型為字符類型的數(shù)組 其定義與前面介紹的數(shù)組定義相同 例如 charstr 40 定義一個(gè)有40個(gè)元素的字符數(shù)組 每個(gè)元素相當(dāng)于一個(gè)字符變量 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 42 二 字符數(shù)組的初始化1 定義時(shí)進(jìn)行初始化 同一般數(shù)組一樣逐個(gè)進(jìn)行賦值 賦字符序 在定義字符數(shù)組時(shí)進(jìn)行初始化charch 7 s t u d e n t 在對(duì)全部元素指定初值時(shí) 可省寫數(shù)組長(zhǎng)度 charch s t u d e n t 2 用字符串賦初值 charc 4 cat 或者charc 4 cat charch 6 China Japan Korea 當(dāng)將一個(gè)字符串存入一個(gè)數(shù)組時(shí) 系統(tǒng)在有效字符末尾多加 0 作為結(jié)束標(biāo)志 因而用字符串賦值比用字符逐個(gè)賦值要多占一個(gè)字節(jié) 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 43 三 字符數(shù)組的引用可引用字符數(shù)組中的一個(gè)元素 得到一個(gè)字符 引用方法與一般數(shù)值型數(shù)組相同 main inti j chara 6 China Japan Korea for i 0 i 2 i for j 0 j 5 j printf c a i j printf n ChinaJapanKorea 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 44 7 4 2字符串的概念及存儲(chǔ) 1 字符串的概念字符串 若干有效字符的序列 可包含轉(zhuǎn)義字符 ASC 碼表中的字符 形式為 用雙引號(hào)括起來(lái)的字符序列 例 Iamastudent Hello a 5 f n 字符串的結(jié)束標(biāo)志 0 注 C語(yǔ)言無(wú)字符串類型 字符串是存放在字符數(shù)組中的 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 45 2 用字符串來(lái)直接初始化字符數(shù)組如 charch student 幾點(diǎn)說(shuō)明 字符串結(jié)束標(biāo)志 0 僅用于判斷字符串是否結(jié)束 輸出字符串時(shí)不會(huì)輸出 在對(duì)有確定大小的字符數(shù)組用字符串初始化時(shí) 數(shù)組長(zhǎng)度應(yīng)大于字符串長(zhǎng)度 如 chars 7 student 是錯(cuò)誤的 在初始化一個(gè)一維字符數(shù)組時(shí) 可以省略花括號(hào) 如 chars 8 student 4 不能直接將字符串賦值給字符數(shù)組 下面的操作是錯(cuò)誤的 s student 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 46 7 4 3字符串的輸入輸出 1 字符串的輸出方法 1 用printf函數(shù)有兩種方法 1 逐個(gè)字符輸出 用格式符 c 按字符序列輸出 2 整個(gè)字符串一次輸入或輸出 用 s 格式符 輸出時(shí)從數(shù)組的第一個(gè)字符開(kāi)始逐個(gè)字符輸出 直到遇到第一個(gè) 0 為止 例 charst 15 Iamaboy printf st s c c st st 3 st 7 輸出結(jié)果 Iamaboy mb 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 47 例7 11字符串輸出示例 includemain charstr 8 Beijing inti for i 0 str i 0 i printf c str i printf n printf s str 輸出結(jié)果為 BeijingBeijing 注意 輸出字符不包括 0 用 c輸出 printf中的輸出項(xiàng)是數(shù)組元素名 用 s輸出 在printf的輸出表列中 只需給出字符串首地址 用字符數(shù)組名表示 若數(shù)組長(zhǎng)度大于字符串實(shí)際長(zhǎng)度 則以 0 為結(jié)束標(biāo)志 只輸出實(shí)際的字符串 若字符數(shù)組中包括多個(gè) 0 以第一個(gè)為結(jié)束標(biāo)志 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 48 2 用puts函數(shù)輸出字符串 函數(shù)原型 intput char str 調(diào)用格式 puts str 函數(shù)功能 將字符數(shù)組str中包含的字符串或str所指示的字符串輸出 同時(shí)將 0 轉(zhuǎn)換成換行符 例 charch student puts ch puts Hello 將字符數(shù)組中包含的字符串輸出 然后再輸出一個(gè)換行符 因此 用puts 輸出一行 不必另加換行符 n 函數(shù)puts每次只能輸出一個(gè)字符串 而printf可以輸出幾個(gè) printf s s str1 str2 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 49 2 字符串的輸入 1 使用scanf函數(shù)輸入字符串逐個(gè)字符輸入 用 c按字符序列輸入整個(gè)字符串輸入 用 s輸入字符串如 voidmain charc1 10 c2 10 for i 0 i 10 i scanf c 說(shuō)明 1 從鍵盤輸入的字符串應(yīng)短于已定義的字符數(shù)組的長(zhǎng)度 系統(tǒng)自動(dòng)加 0 2 用 s輸入時(shí) 輸入項(xiàng)中是字符數(shù)組名 不加地址符 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 50 3 輸入時(shí) 以回車或空格作為結(jié)束標(biāo)志 即 用scanf輸入的字符串中不能含有空格 若按如下方法輸入 Howdoyoudo 執(zhí)行語(yǔ)句 scanf s st 則s的內(nèi)容為 How 0使用格式字符串 s 時(shí)會(huì)自動(dòng)加上結(jié)束標(biāo)志 0 第一個(gè)空格后的字符沒(méi)有輸入st中 2 使用函數(shù)gets 輸入字符函數(shù)原型 char gets char str 調(diào)用格式 gets str str是一個(gè)字符數(shù)組或指針 函數(shù)功能 從鍵盤讀入一個(gè)字符串到str中 并自動(dòng)在末尾加字符串結(jié)束標(biāo)志符 0 輸入字符串時(shí)以回車結(jié)束輸入 這種方式可以讀入含空格符的字符串 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 51 如 chars 14 gets s 若輸入的字符串為 Howdoyoudo 則s的內(nèi)容為 Howdoyoudo 0l注意 puts gets只對(duì)一個(gè)字符串操作 而不對(duì)多個(gè)字符串 gets函數(shù)在回車為結(jié)束標(biāo)志 puts gets函數(shù)使用時(shí)要包含stdio h頭文件 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 52 例7 14字符串輸入輸出示例 includemain chars 20 s1 20 scanf s s printf s n s scanf s s s s1 printf s s s1 s s s1 puts n gets s puts s 程序運(yùn)行過(guò)程 Howdoyoudo HowHowdoyoudo s How s1 doHowdoyoudo Howdoyoudo 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 53 7 4 4字符處理函數(shù) C語(yǔ)言提供了一些常用的庫(kù)函數(shù) 其函數(shù)原型說(shuō)明在string h中1 字符串拷貝函數(shù) strcpy 調(diào)用格式 strcpy d str s str 功能 將源字符串s str復(fù)制到目標(biāo)字符數(shù)組d str中 charstr1 10 str2 Beijing strcpy str1 str2 說(shuō)明 1 字符數(shù)組1的長(zhǎng)度應(yīng)不小于字符串2的長(zhǎng)度 2 字符數(shù)組1必須寫成數(shù)組名形式 字符串2用字符數(shù)組名或字符串常量 3 0 一起復(fù)制 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 54 4 不能用賦值語(yǔ)句給字符數(shù)組賦以字符串常量或字符數(shù)組 如 str1 Beijing str1 str2 用賦值語(yǔ)句只能將一個(gè)字符賦給一個(gè)字符變量或字符數(shù)組元素 改錯(cuò) charstr1 10 Beijing str2 10 str2 Olympic str1 str2 strcpy str2 str1 strcpy 2008 str2 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 55 2 字符串連接函數(shù)strcat 調(diào)用格式 strcat d str s str 功能 將s str連同 0 連接到d str的最后一個(gè)字符 非 0 字符 后面 結(jié)果放在d str中 例 chars1 14 Iama chars2 5 boy strcat s1 s2 連接前 s1 s2 連接后 s1l說(shuō)明 1 字符數(shù)組1必須足夠大 以容納新字符串 2 連接前每個(gè)串后有 0 連接后只有一個(gè) 0 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 56 3 字符串比較函數(shù)strcmp 調(diào)用格式 strcmp str1 str2 功能 若str1 str2 則函數(shù)返回值為0 若str1 str2 則函數(shù)返回值為正整數(shù) 若str1 str2 則函數(shù)值返回為負(fù)整數(shù) 比較規(guī)則 兩個(gè)字符串自左至右逐個(gè)字符比較 直到出現(xiàn)不同字符或遇到 0 為止 如字符全部相同 則兩個(gè)字符串相等 若出現(xiàn)不同字符 則遇到的第一對(duì)不同字符的ASC 大者為大 Program 大于 People English 小于 Language 比較兩字符串是否相等一般用以下形式 if strcmp str1 str2 0 而if str1 str2 是錯(cuò)誤的 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 57 4 字符長(zhǎng)度函數(shù)strlen 調(diào)用格式 strlen 字符串 功能 求字符串的實(shí)際長(zhǎng)度即所含字符個(gè)數(shù) 不包括 0 例 charstr 10 student intlength strl length strlen str strl strlen verygood 9 結(jié)果 length 7strl 9 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 58 例7 17從鍵盤上輸入兩個(gè)字符串 若不相等 將短的字符串連接到長(zhǎng)的字符串的末尾并輸出 include includemain intlen1 len2chars1 80 s2 80 gets s1 gets s2 if strcmp s1 s2 0 if strlen s1 strlen s2 strcat s1 s2 puts s1 else strcat s2 s1 puts s2 輸入 you Thank 輸出 Thankyou 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 59 7 5數(shù)組作為函數(shù)的參數(shù) 數(shù)組作為函數(shù)參數(shù)主要有兩種情況 數(shù)組元素作為函數(shù)的實(shí)參 這種情況與普通變量作實(shí)參一樣 是將數(shù)組元素的值傳給形參 形參的變化不會(huì)影響實(shí)參數(shù)組元素 我們稱這種參數(shù)傳遞方式為 值傳遞 數(shù)組名作實(shí)參 要求函數(shù)形參是相同類型的數(shù)組或指針 這種方式是把實(shí)參數(shù)組的起始地址傳給形參數(shù)組 形參數(shù)組的改變也是對(duì)實(shí)參數(shù)組的改變 稱這種參數(shù)傳遞方式為 地址傳遞 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 60 1 數(shù)組元素做函數(shù)實(shí)參數(shù)組元素作為函數(shù)實(shí)參與簡(jiǎn)單變量相同 是將元素的值傳給函數(shù)形參 是單向值傳遞 函數(shù)形參使用簡(jiǎn)單變量 例7 18從鍵盤上輸入兩個(gè)字符串 不用字符串函數(shù)strcmp 比較兩者的大小分析 1 輸入兩個(gè)字符串 分別存放在str1與str2中 2 設(shè)計(jì)函數(shù)compstr 比較兩字符 返回ASCII碼之差 賦給主函數(shù)的變量flag 3 用do while循環(huán)依次比較兩個(gè)字符串的對(duì)應(yīng)字符 結(jié)束的條件是兩字符串至少有一個(gè)結(jié)束 或者比較字符不相等 4 當(dāng)循環(huán)結(jié)束時(shí)flag的值為0或?yàn)榈谝粋€(gè)不相等的字符的ASCII碼值之差 由此可以判斷出字符串的大小 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 61 程序如下 includemain inti flag intcompstr char char charstr1 80 str2 80 gets str1 gets str2 i 1 do i flag compstr str1 i str2 i 數(shù)組元素作實(shí)參 while str1 i 0 只要有一個(gè)字符串到了末尾比較結(jié)束 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 62 if flag 0 printf s s str1 str2 elseif flag 0 printf s s str1 str2 elseprintf s s str1 str2 intcompstr charc1 charc2 intt t c1 c2 returnt 輸入 verywell verygood 輸出 verywell verygood 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 63 2 數(shù)組名作函數(shù)參數(shù)將數(shù)組名作函數(shù)參數(shù) 實(shí)參 形參都用數(shù)組名 屬于賦地址調(diào)用 例不使用庫(kù)函數(shù)strcat 寫一個(gè)函數(shù)連接兩個(gè)字符串 includevoidconnection charstr1 50 charstr2 50 charstr 100 inti j for i 0 str1 i 0 i str i str1 i for j 0 str2 j 0 j str i str2 j str i 0 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 64 voidmain chars1 50 s2 50 s 100 printf Inputstring1 gets s1 printf nInputstring2 gets s2 connection s1 s2 s printf Thenewstringis s n s Inputstring1 Beijing2008Inputstring2 OlympicThenewstringis Beijing2008Olympic 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 65 由此看出 數(shù)組名作函數(shù)參數(shù)時(shí)形參與實(shí)參都應(yīng)使用數(shù)組名 且分別在被調(diào)用函數(shù)與主調(diào)函數(shù)中的說(shuō)明 實(shí)參與形參類型要一致 實(shí)參數(shù)組與形參數(shù)組大小可以不一致 形參數(shù)組可不指定大小 C編譯程序不檢查形參數(shù)組的大小 1 在一維形參數(shù)組名后面可只跟一對(duì)空方括號(hào) 為在被調(diào)用函數(shù)中處理數(shù)組元素的需要 可另設(shè)一參數(shù)來(lái)傳遞數(shù)組元素個(gè)數(shù) 如 intlenstr charstr1 intk k為要處理的字符數(shù) 2 對(duì)多維數(shù)組而言 形參的第一維可不指定 但其它維必須指定 如 chargrade floatscore 4 intk k為數(shù)組行數(shù) 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 66 數(shù)組名做函數(shù)參數(shù)時(shí)是把實(shí)參數(shù)組的起始地址傳給了形參數(shù)組 即 形參數(shù)組與實(shí)參數(shù)組對(duì)應(yīng)同一段內(nèi)存單元 利用這個(gè)特點(diǎn) 可用數(shù)組返回多個(gè)值 例7 19用冒泡法將10個(gè)數(shù)按由小到大排序冒泡法的基本思想 相鄰兩數(shù)比較 若前面數(shù)大 則兩數(shù)交換位置 直至最后一個(gè)元素被處理 最大的元素就 沉 到最下面 即在最后一個(gè)元素位置 這樣 如有n個(gè)元素 共進(jìn)行n 1輪 每輪讓剩余元素中最大的元素 沉 到下面 從而完成排序 事實(shí)上 n 1輪是最多的排序輪數(shù) 只要在某一輪排序中沒(méi)有進(jìn)行元素交換 說(shuō)明已排好序 可以提前退出外循環(huán) 結(jié)束排序 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 67 程序如下 include defineN80main inta N inti m voidsort intb intk voidprint intb intk printf nInputm 80 scanf d 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 68 voidsort intb intk inti j t flag for j 0 jb i 1 t b i 相鄰元素交換位置 b i b i 1 b i 1 t flag 1 有元素交換 標(biāo)志置1 if flag 0 break 沒(méi)有交換元素 結(jié)束循環(huán) 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 69 voidprint intb intk inti for i 0 i k i if i 4 0 putchar n printf 6d b i 輸入 Inputm 80 8 120 40815344 24 輸出 24 40120445381 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 70 用多維數(shù)組名作函數(shù)參數(shù)例7 14求數(shù)組元素的最大值與最小值 并把它們分別放在第一 第二個(gè)元素中 includemaxmin intb 4 intI j max min max min b 0 0 for I 0 Imax max b I j elseif b I j min min b I j b 0 0 max b 0 1 min return max main inta 3 4 1 0 32 21 10 4 4 4 345 2 12 0 printf max d n maxmin a printf max d a 0 0 printf min d a 0 1 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 71 7 6程序舉例 例7 15從鍵盤上輸入一個(gè)正整數(shù) 判斷其是否為回文數(shù) 所謂回文數(shù)是順讀與反讀都一樣的數(shù) 如 12321 23455432都是回文數(shù) 解題的基本思想 將數(shù)n按位對(duì)10求模 求出每一位數(shù)字并按順序保存在數(shù)組digit中 根據(jù)回文數(shù)的特點(diǎn) 將分解出的數(shù)字序列的左 右兩端數(shù)字兩兩比較 并向中間靠攏 用i k兩個(gè)變量記錄兩端數(shù)字序號(hào) 若直到位置重疊時(shí)各位數(shù)字都相等 則為回文數(shù) 否則 不是 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 72 程序如下 include stdio h include string h main inti k digit 10 longn m puts 輸入一個(gè)正整數(shù) scanf ld 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 73 接上頁(yè) for i 0 i k i k if digit i digit k break 不相等 則不是回文數(shù) 退出循環(huán) if i k printf ld不是一個(gè)回文數(shù) n elseprintf ld是一個(gè)回文數(shù) n 輸入 134431輸出 134431是一個(gè)回文數(shù) 2020 2 21 C語(yǔ)言程序設(shè)計(jì)教程 74 includemain charc string 81 intI num 0 word 0 gets string for I 0 c sting I 0 I if c word 0 elseif word 0 word 1 num printf Thereare dwordsintheline n num 運(yùn)行情況 輸入 Iamaboy 輸出 Thereare4wordsintheline 例7 16輸入一行字符 統(tǒng)計(jì)其中有多少個(gè)單詞 單詞之間用空格隔開(kāi)- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 語(yǔ)言程序設(shè)計(jì) 教程 北京郵電 大學(xué)出版社
鏈接地址:http://www.820124.com/p-6287195.html