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