C語言程序設(shè)計(jì)教程第7章北京郵電大學(xué)出版社.ppt

上傳人:xin****828 文檔編號(hào):15588739 上傳時(shí)間:2020-08-22 格式:PPT 頁數(shù):74 大?。?49.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
C語言程序設(shè)計(jì)教程第7章北京郵電大學(xué)出版社.ppt_第1頁
第1頁 / 共74頁
C語言程序設(shè)計(jì)教程第7章北京郵電大學(xué)出版社.ppt_第2頁
第2頁 / 共74頁
C語言程序設(shè)計(jì)教程第7章北京郵電大學(xué)出版社.ppt_第3頁
第3頁 / 共74頁

下載文檔到電腦,查找使用更方便

14.9 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《C語言程序設(shè)計(jì)教程第7章北京郵電大學(xué)出版社.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《C語言程序設(shè)計(jì)教程第7章北京郵電大學(xué)出版社.ppt(74頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。

1、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è)計(jì)教程,2020/8/22,C語言程序設(shè)計(jì)教程,2,1.數(shù)組的引入 在前面的程序設(shè)計(jì)中,所涉及和處理的數(shù)據(jù)都非常簡單,對(duì)這些數(shù)據(jù)采用C語言的基本類型(整型、實(shí)型、字符型)來描述就行,但在實(shí)際應(yīng)用中,需要處理的數(shù)據(jù)往往是復(fù)雜多樣的。 問題:輸入100名學(xué)生某門課程的成績,要求將高于平均分的那些成績打印出來。 1. 可以用讀入一個(gè)數(shù)就累加一個(gè)的辦法來求出學(xué)生的平均分; 2但只有讀入全部學(xué)生的分?jǐn)?shù)后才能求得平均分; 3所以必須將100個(gè)學(xué)生的

2、成績?nèi)慷急A粝聛?,然后逐個(gè)和平均分比較,把高于平均分的成績打印出來。 所以保留學(xué)生的成績必須用100個(gè)變量s1,s2,,s100,average用來存放平均分,需要100條語句來判斷學(xué)生的成績是否高于平均分,2020/8/22,C語言程序設(shè)計(jì)教程,3,如何編程呢? 語言提供了用戶自定義數(shù)據(jù)的描述方法,即構(gòu)造類型:由若干基本類型數(shù)據(jù)按一定的規(guī)則構(gòu)成復(fù)雜數(shù)據(jù)對(duì)象。如數(shù)組類型。構(gòu)造數(shù)據(jù)類型的引入,使我們能較方便地解決上面的問題。 2.數(shù)組的概念 數(shù)組:具有相同類型的數(shù)據(jù)組成的序列,是有序集合。 數(shù)組中的每一個(gè)數(shù)據(jù)稱數(shù)組元素 由其所在的位置序號(hào)(稱數(shù)組元素的下標(biāo))來區(qū)分。 注意:數(shù)組元素有序不

3、是指元素大小順序,2020/8/22,C語言程序設(shè)計(jì)教程,4,C語言數(shù)組類型有三個(gè)特點(diǎn): 數(shù)組元素的個(gè)數(shù)必須是確定的, 數(shù)組元素類型必須相同 各元素可作為基本變量使用。 上例中若采用數(shù)組來解決,程序?qū)⑹趾唵危?float s100; for (i=0; i=average) printf(“s%d=%f”, i, si); 用數(shù)組名與下標(biāo) 可以用統(tǒng)一的方式來處理數(shù)組中的所有元素, 從而方便的實(shí)現(xiàn)處理一批具有相同性質(zhì)數(shù)據(jù)的問題。,2020/8/22,C語言程序設(shè)計(jì)教程,5,7.1 一維數(shù)組,7.1.1 一維數(shù)組的定義 一維數(shù)組:只有一個(gè)下標(biāo)的數(shù)組。 定義格式 : 存儲(chǔ)類別 類型標(biāo)識(shí)符 數(shù)組

4、名元素個(gè)數(shù); 說明: 1.存儲(chǔ)類別:說明數(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ù)組長度,只能是一個(gè)整型常量表達(dá)式??梢允欠?hào)常量。,2020/8/22,C語言程序設(shè)計(jì)教程,6,例: int a5; 定義了一個(gè)自動(dòng)型整型數(shù)組: 數(shù)組的元素為整型;數(shù)組名為a;元素個(gè)數(shù)為5; 下面是合法的數(shù)組定義: char str20; /* 定義一個(gè)有20個(gè)元素的字符型數(shù)組str */ float

5、 score8;/* 定義一個(gè)有8個(gè)元素的浮點(diǎn)型數(shù)組score */ #define N 5 long dataN; /* 定義一個(gè)有5個(gè)元素的長整型數(shù)組data */ short z4*N; /* 定義了一個(gè)有20個(gè)元素的短整型數(shù)組z */ 其中的數(shù)組長度使用的是符號(hào)常量 下面的定義是非法的: int n=10; char cn; /*數(shù)組長度不能使用變量 */,2020/8/22,C語言程序設(shè)計(jì)教程,7,例:試判斷下列數(shù)組定義是否合法: float score35; #define student 35 float n_studentstudent; int score_studen

6、tstudent*3; int person(10); int n=10, an; 定義規(guī)則: (1)數(shù)組的下標(biāo)應(yīng)用方括號(hào)括起來,而非(); (2)常量表達(dá)中可包含常量和符號(hào)常量,但不能包含變量,即數(shù)組的大小不能動(dòng)態(tài)定義;,,2020/8/22,C語言程序設(shè)計(jì)教程,8,7.1.2 數(shù)組元素的引用,不能利用數(shù)組名來整體引用一個(gè)數(shù)組,只能單個(gè)的使用數(shù)組元素 數(shù)組元素的描述 : 由 數(shù)組名加方括號(hào)中的下標(biāo) 組成,即: 數(shù)組名下標(biāo) 下標(biāo):數(shù)組元素在數(shù)組中的順序號(hào),使用整序型表達(dá)式。 取值范圍:從0到元素個(gè)數(shù)-1。 C語言不對(duì)下標(biāo)越界作語法檢查。 若有定義: int a5; 則數(shù)組a的元素分別為

7、: a0、a1、a2、a3、a4;但a5不是。 每個(gè)元素都可作為一個(gè)整型變量來使用。 如: a0=5;a3=a1+4;aD-B=3;scanf(“%d”, for(n=0;n=0;n--) printf(“%4d”,an); 輸入:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 輸出:15 14 13 12 11 10 9 8 7 6 5 4 3 2 1,根據(jù)數(shù)組的有序性,往往使用循環(huán)語句來對(duì)數(shù)組進(jìn)行處理,用循環(huán)控制變量作為數(shù)組下標(biāo),從而可以以統(tǒng)一的方式來訪問數(shù)組元素。 例7.1 從鍵盤輸入15個(gè)整數(shù),再反序輸出。 問:不用數(shù)組能否完成,如何實(shí)現(xiàn)?假設(shè)是1000個(gè)數(shù)據(jù)

8、呢?,注意: 1. 循環(huán)控制變量的初值、終值及控制條件。 2.不能整體輸入/出數(shù)組 如:printf(“%d”,a); 學(xué)會(huì)如何對(duì)數(shù)組進(jìn)行輸入輸出,2020/8/22,C語言程序設(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ù)組類型),例 float a5; 設(shè)a的首地址為1000,數(shù)組a存儲(chǔ)示

9、意圖如右圖所示,1012,a3的地址=1000+34=1012,2020/8/22,C語言程序設(shè)計(jì)教程,11,2. 一維數(shù)組的初始化 含義:在定義數(shù)組的同時(shí),對(duì)數(shù)組各元素指定初值。 初始化是編譯階段完成。 注意:用賦值語句或輸入語句也可給數(shù)組素指定初值,是在運(yùn)行時(shí)完成。 初始化數(shù)組格式: = ; 說明: 是用逗號(hào)分隔的數(shù)組元素的初始值(常量)。 中數(shù)值的類型必須與一致。,2020/8/22,C語言程序設(shè)計(jì)教程,12,若不對(duì)auto數(shù)組進(jìn)行初始化,則其初值是不可知的。 若一個(gè)static或外部數(shù)組未進(jìn)行初始化,則對(duì)數(shù)值型數(shù)組元素,初值為0,而對(duì)字符型數(shù)組元素,初值為空字符0.,對(duì)數(shù)組初始化的

10、幾種方法: 在定義數(shù)組時(shí),對(duì)全部數(shù)組元素賦予初值。 例:int a5=0,1,2,3,4; 在定義數(shù)組時(shí),對(duì)部分?jǐn)?shù)組元素賦予初值。 例:int a5=1,2; 等價(jià) a0=1,a1=2; 其它賦0 對(duì)全部數(shù)組元素賦初值時(shí),可省數(shù)組長度,系統(tǒng)自動(dòng)確定。 例:int a =0,1, 2,3,4 ;等價(jià)于 int a5=0,1,2,3,4;,2020/8/22,C語言程序設(shè)計(jì)教程,13,例7.2 數(shù)組初始化與未初始化比較 #include main() int i,a5=3,4,5,b5; printf(“narray a is:”) for(i=0;i<5;i++) printf(“%6d”

11、,ai); printf(“narray b is:”) for(i=0;i<5;i++) printf(“%6d”,bi); ,運(yùn)行結(jié)果: array a is:3 4 5 0 0 array b is:-32 1398 40 1170 454,2020/8/22,C語言程序設(shè)計(jì)教程,14,#define N 5 #include main( ) int i,j,k, max,min; static int a5; for (i=0;iai) min=ai;k=i; printf(max:a%d=%d,min:a%d=%d,j,max,k,min); ,例7.3 從鍵盤

12、上輸入5個(gè)數(shù),輸出最大、最小的元素以及它們的下標(biāo),若輸入: 8 2 312 0 -10 輸出為: max:a2=312,min:a4=-10,2020/8/22,C語言程序設(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ù); 例:float b53; 定義了一個(gè)53的數(shù)組b,即數(shù)組為5行3列,可存放15個(gè)實(shí)型數(shù)據(jù)。,7.2 二維數(shù)組,2020/8/22,C語言程序設(shè)計(jì)教程,16,2定義時(shí)注

13、意: (1)同一維數(shù)組一樣,表達(dá)式中可包含常量和字符常量,但不能包含變量。 (2)二維數(shù)組也可以理解為定義了多個(gè)一維數(shù)組,如: int a43; 相當(dāng)于定義了四個(gè)一維數(shù)組,也可將a看作一個(gè)特殊的一維數(shù)組,其中每個(gè)元素又為一維數(shù)組。 (3)二維數(shù)組的存放順序 二維數(shù)組中的元素在存儲(chǔ)時(shí)實(shí)行按行存放,即在內(nèi)存中先順序存放第一行的元素,再存放第二行的元素。對(duì)于a43:a00a01a02 a10a11a12 a20a21a22 a30a31a32,2020/8/22,C語言程序設(shè)計(jì)教程,17,3. 多維數(shù)組的定義,根據(jù)二維數(shù)組的定義,我們可以類推出多維數(shù)組的定義。 static int b223;

14、/*定義了一個(gè)3維的靜態(tài)整型數(shù)組*/ float c2322; /*定義了一個(gè)4維浮點(diǎn)型數(shù)組*/ 在數(shù)組定義時(shí),多維數(shù)組的維從左到右第一個(gè)稱第一維,第二個(gè)稱第二維,依此類推。多維數(shù)組元素的順序仍由下標(biāo)決定。下標(biāo)的變化是先變最右邊的,再依次變化左邊的下標(biāo)。 三維數(shù)組b的12個(gè)元素是: b000 b001 b002 b010 b011 b012 b100 b101 b102 b110 b111 b112,2020/8/22,C語言程序設(shè)計(jì)教程,18,二維數(shù)組的每一個(gè)元素都可以作一個(gè)變量來使用。 1表示形式為: 數(shù)組名下標(biāo)下標(biāo) 同樣,數(shù)組的下標(biāo)下限為0,上限為常量表達(dá)式的值減1。 2下標(biāo)也可用

15、整型表達(dá)式來表示,但下標(biāo)值應(yīng)在已定義的數(shù)組大小的范圍內(nèi)。即編譯系統(tǒng)對(duì)下標(biāo)不作檢查。 如: int a43;下列引用是否正確: a1+26-3=4; a42=10; a4-22=a32-a12; 3注意定義時(shí)的a43與引用時(shí)的a43的區(qū)別: ? 定義的a43數(shù)組中有無a43元素?,7.2.2 二維數(shù)組元素的引用,2020/8/22,C語言程序設(shè)計(jì)教程,19,例7.4 二維數(shù)組輸入輸出,main int a23; printf(”nInput array a:”); for (j=0;j<2;j++) for (k=0;k<3;k++) scanf(“%d”, /*輸出一行后換行,再

16、輸出下一行*/ ,輸入:Input array a:1 2 3 4 5 6 輸出:Output array a: 1 2 3 4 5 6,對(duì)二維數(shù)組的輸入輸出多使用二層循環(huán)結(jié)構(gòu)來實(shí)現(xiàn)。,2020/8/22,C語言程序設(shè)計(jì)教程,20,7.2.3 二維數(shù)組的存儲(chǔ)結(jié)構(gòu) 設(shè)有定義 int a23; float b32;,系統(tǒng)為數(shù)組在內(nèi)存中分配一片連續(xù)的內(nèi)存空間,將二維數(shù)組元素按行的順序存儲(chǔ)在所分配的內(nèi)存區(qū)域。 數(shù)組a與b的各元素的存儲(chǔ)順序如右圖所示,元素aij的地為: a+(inj)元素字節(jié)數(shù),2020/8/22,C語言程序設(shè)計(jì)教程,21,7.2.4、二維數(shù)組的初始化 按行賦初值。

17、 例:int a23=1,2,3,2,3,4; 每個(gè)花括號(hào)內(nèi)的數(shù)據(jù)對(duì)應(yīng)一行元素。 按順序賦值。 例:int a23=1,2,3,2,3,4; 將所有初值寫在一個(gè)花括號(hào)內(nèi), 只對(duì)部分元素賦值。 例:int a23=1,2,4; 按行用括號(hào)括起來,沒有初值對(duì)應(yīng)的元素賦0值或空字符(字符數(shù)組) 給全部元素賦初值或分行初始化時(shí),可不指定第一維大小,其大小系統(tǒng)自動(dòng)確定;但必須指定第二維的大小。 例:int a3=1,2,3,4,5,6; int a3=0,0,5;,第一維的大小為多少?,2020/8/22,C語言程序設(shè)計(jì)教程,22,例7.5 從鍵盤上輸入9個(gè)整數(shù),保存在二維數(shù)組中,按數(shù)組原來位置輸

18、出第一行和第一列的所有元素。 ,,2020/8/22,C語言程序設(shè)計(jì)教程,23,#include main() int i,j,a33; 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,aij); else printf(%-6c, ); printf(“n”); ,2020/8/22,C語言程序設(shè)計(jì)教程,24,例7.6 用如下的33矩陣

19、初始化數(shù)組a33,求矩陣的轉(zhuǎn)置矩陣。 123147 456258 789369 轉(zhuǎn)置矩陣:是將原矩陣元素按行列互換形成的矩陣 方法:沿主對(duì)角線將對(duì)稱位置元素互換即可。 123147 456258 789369 :,,2020/8/22,C語言程序設(shè)計(jì)教程,25,程序如下: #include main() int j,k; int a33=1,2,3,4,5,6,7,8,9,b33; for (j=0;j<3;j++) for(k=0;k<3;k++) bjk=akj; for(j=0;j<3;j++) for(k=0;k<3;k++) printf(“%6d”,bjk); printf(“n”

20、); ,2020/8/22,C語言程序設(shè)計(jì)教程,26,7.3 數(shù)組的應(yīng)用,1.利用數(shù)組求fiboncaci數(shù)列的前n項(xiàng) 例7.7 求fiboncaci數(shù)列的前20項(xiàng): f0=1 f1=1 fi=fi-1+fi-2 (i=2, 3,n) 將前20項(xiàng)輸出到屏幕上,每行五項(xiàng)。,分析:根據(jù)這個(gè)數(shù)列的組成規(guī)律:從第三項(xiàng)開始,每個(gè)數(shù)據(jù)項(xiàng)的值為前兩個(gè)數(shù)據(jù)項(xiàng)的和,采用遞推方法來實(shí)現(xiàn)??梢杂靡粋€(gè)一維整型數(shù)組fib 20來保存這個(gè)數(shù)列的前20項(xiàng)。,2020/8/22,C語言程序設(shè)計(jì)教程,27,#include #include main() int i,fib20; fib0=1

21、; fib1=1; for(i=2; i<=19;i++) fibi= fibi-1+ fibi-2; printf( Fibonaci Numbers are:n);,for(i=0;i<20;i++) if(i%5==0) printf(n); printf(%7d,fibi); ,Fibonaci Numbers are: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,2020/8/22,C語言程序設(shè)計(jì)教程,28,2.利用數(shù)組處理批量數(shù)據(jù)例7.8 從鍵盤上輸入若干學(xué)生

22、(不超過100人)的成績,計(jì)算平均成績,并輸出高于平均分的人數(shù)及成績。輸入成績?yōu)樨?fù)時(shí)結(jié)束。,分析: 根據(jù)題意,可以定義一個(gè)有100個(gè)元素的一維數(shù)組score,先將成績輸入到數(shù)組中,并計(jì)算平均成績。然后,將數(shù)組中的成績值一個(gè)個(gè)與平均值比較,輸出高于平均分的成績。,2020/8/22,C語言程序設(shè)計(jì)教程,29,程序如下:,#include main() float score100,ave,sum=0,x; int i,n=0,count; printf(Input score:); scanf(%f, /*輸出平均分*/,2020/8/22,C語言程序設(shè)計(jì)教程,30,/*接上頁*/ for (c

23、ount=0,i=0;iave) printf(%fn,scorei); /*輸出高于平均分的成績*/ count++; /*統(tǒng)計(jì)高于平均分成績的人數(shù)*/ if (count%5= =0) printf(“n”); /*每行輸出成績達(dá)5個(gè)時(shí)換行*/ printf(count=%d n,count); /*輸出高于平均分的人數(shù)*/ ,2020/8/22,C語言程序設(shè)計(jì)教程,31,3. 利用數(shù)組排序 例7.9 從鍵盤上輸入10個(gè)整數(shù),用選擇法其按由小到大的順序排列并輸出,基本思想: (1)從第個(gè)位置到第個(gè)位置中選擇出 最小的一個(gè)與第個(gè)位置的數(shù)交換。 (2)從

24、第個(gè)位置到第個(gè)位置中選擇出最小的一個(gè)與第個(gè)位置的數(shù)交換。 (9) 從第個(gè)位置到第個(gè)位置中選擇出最小的一個(gè)與第個(gè)位置的數(shù)交換。,2020/8/22,C語言程序設(shè)計(jì)教程,32,5 13 3 9 32 22 8 1 23 21 1 13 5(3) 9 32 22 8 3(1) 23 21 1 3 13 9 32 22 8 5 23 21 1 3 5 13 32 22 9 8 23 21 1 3 5 8 32 22 13 9 23 21 1 3 5 8 9 32 22 13 23 21 1 3 5 8 9 13 32 22 23 21 1 3 5 8 9 13 21 3

25、2 23 22 1 3 5 8 9 13 21 22 32 23 1 3 5 8 9 13 21 22 23 32,輸入數(shù)據(jù): 5 13 3 9 32 22 8 1 23 21 排序過程如下:,2020/8/22,C語言程序設(shè)計(jì)教程,33,#include main() int I,j,t,a10; 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;Iaj) t=aI;aI=aj;aj=t; ,printf(“n”); for(I=0;I<10;I++)printf(“%6d”

26、,aI);/*輸出排序后的數(shù)據(jù)*/ ,2020/8/22,C語言程序設(shè)計(jì)教程,34,分析: 從程序可知: 1.程序使用兩重循環(huán)來實(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/8/22,C語言程序設(shè)計(jì)教程,35,改進(jìn)排序過程如下:,5 13 3 9 32 22 8 1 23 21 1 13

27、3 9 32 22 8 5 23 21 1 3 13 9 32 22 8 5 23 21 1 3 5 9 32 22 8 13 23 21 1 3 5 8 32 22 9 13 23 21 1 3 5 8 9 22 32 13 23 21 1 3 5 8 9 13 32 22 23 21 1 3 5 8 9 13 21 22 23 32 1 3 5 8 9 13 21 22 23 32 1 3 5 8 9 13 21 22 23 32 改進(jìn)后的程序見下頁,注意與前一程序比較,2020/8/22,C語言程序設(shè)計(jì)教程,36,#include main() int I,

28、j,k,a10,t; for(I=0;Iaj) k=j; if(k!=I)t=aI;aI=ak;ak=t; printf(“n”); for(I=0;I<10;I++)printf(“%6d”,aI); ,內(nèi)循環(huán),,外循環(huán),K是最小元素之下標(biāo),2020/8/22,C語言程序設(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ì)將查找范

29、圍縮小一半,從而較快地找到目的數(shù) 例7.10 假設(shè)在數(shù)組a中的數(shù)據(jù)是按由小到大順序排列的: -12 0 6 16 23 56 80 100 110 115,從鍵盤上輸入一個(gè)數(shù),判定該數(shù)是否在數(shù)組中,若在,輸出所在序號(hào);若不在,輸出相應(yīng)信息。,2020/8/22,C語言程序設(shè)計(jì)教程,38,查找過程如下:,第一步:設(shè)low、mid和high三個(gè)變量,分別指示數(shù)列中的起始元素、中間元素與最后一個(gè)元素位置, 其初始值為low=0,high=9,mid=4,判斷mid指示的數(shù)是否為所求,mid指示的數(shù)是23,不是要找的80,須繼續(xù)進(jìn)行查找。 -12 0 6 16 23 56 80 100 110 115

30、 low mid high 第二步:確定新的查找區(qū)間。因?yàn)?0大于23,所以查找范圍可以縮小為23后面的數(shù),新的查找區(qū)間為56 80 100 110 115 ,low,mid,high分別指向新區(qū)間的開始、中間與最后一個(gè)數(shù)。實(shí)際上high不變,將low(low=mid+1)指向56,mid (mid=(low+high)/2)指向100,還不是要找的80,仍須繼續(xù)查找。 -12 0 6 16 23 56 80 100 110 115 low mid high,2020/8/22,C語言程序設(shè)計(jì)教程,39,第三步:上一步中,所找數(shù)80比mid指

31、示的100小,可知新的查找區(qū)間為56 80,low不變,mid與high的值作相應(yīng)修改。mid指示的數(shù)為56,還要繼續(xù)查找。 -12 0 6 16 23 56 80 100 110 115 low high mid 第四步:根據(jù)上一步的結(jié)果,80大于mid指示的數(shù)56,可確定新的查找區(qū)間為80,此時(shí),low與high都指向80,mid亦指向80,即找到了80,到此為止,查找過程完成。 -12 0 6 16 23 56 80 100 110 115 low mid high

32、 若在查找過程中,出現(xiàn)lowhigh的情況,則說明,序列中沒有該數(shù),亦結(jié)束查找過程。,2020/8/22,C語言程序設(shè)計(jì)教程,40,#define M 10 #include main() static int aM=-12,0,6,16,23,56,80,100,110,115; int n,low,mid,high,found; low=0; high=M-1; found=0; printf(Input a number to be searched:); scanf(%d, ,輸入:80 輸出:The index of 80 is 6,2020/8/22,C語言程序設(shè)計(jì)教程,41,7.

33、4 字符數(shù)組與字符串,7.4.1 字符數(shù)組的定義與初始化 一. 字符數(shù)組的定義 字符數(shù)組:其元素類型為字符類型的數(shù)組,其定義與前面介紹的數(shù)組定義相同。 例如: char str40; 定義一個(gè)有40個(gè)元素的字符數(shù)組,每個(gè)元素相當(dāng)于一個(gè)字符變量。,2020/8/22,C語言程序設(shè)計(jì)教程,42,二. 字符數(shù)組的初始化 1定義時(shí)進(jìn)行初始化:同一般數(shù)組一樣逐個(gè)進(jìn)行賦值(賦字符序) 在定義字符數(shù)組時(shí)進(jìn)行初始化 char ch7=s,t,u,d,e,n,t; 在對(duì)全部元素指定初值時(shí),可省寫數(shù)組長度。 char ch=s,t,u,d,e,n,t; 2用字符串賦初值: char c4=”cat”; 或者

34、char c4=“cat”; char ch 6=“China”,”Japan”,”Korea”; 當(dāng)將一個(gè)字符串存入一個(gè)數(shù)組時(shí),系統(tǒng)在有效字符末尾多加0作為結(jié)束標(biāo)志,因而用字符串賦值比用字符逐個(gè)賦值要多占一個(gè)字節(jié)。,2020/8/22,C語言程序設(shè)計(jì)教程,43,三、字符數(shù)組的引用 可引用字符數(shù)組中的一個(gè)元素,得到一個(gè)字符,引用方法與一般數(shù)值型數(shù)組相同。 main() int i,j; char a6=China,Japan,Korea; for (i=0;i<=2;i++) for (j=0;j<=5;j++) printf(%c,aij); printf(n); ,China Japan

35、Korea,2020/8/22,C語言程序設(shè)計(jì)教程,44,7.4.2 字符串的概念及存儲(chǔ),1.字符串的概念 字符串: 若干有效字符的序列; 可包含轉(zhuǎn)義字符、ASC碼表中的字符; 形式為: 用雙引號(hào)括起來的字符序列; 例:I am a student. , Hello a5=; fn。 字符串的結(jié)束標(biāo)志:0。 注:C語言無字符串類型,字符串是存放在字符數(shù)組中的。,2020/8/22,C語言程序設(shè)計(jì)教程,45,2. 用字符串來直接初始化字符數(shù)組 如:char ch=“student”;,幾點(diǎn)說明: ()字符串結(jié)束標(biāo)志0僅用于判斷字符串是否結(jié)束,輸出字符串時(shí)不會(huì)輸出。 ()在對(duì)有確定大小的字

36、符數(shù)組用字符串初始化時(shí),數(shù)組長度應(yīng)大于字符串長度。如: char s7=student;是錯(cuò)誤的. ()在初始化一個(gè)一維字符數(shù)組時(shí),可以省略花括號(hào)。如: char s8=student; (4 )不能直接將字符串賦值給字符數(shù)組。下面的操作是錯(cuò)誤的。 s=”student”;,2020/8/22,C語言程序設(shè)計(jì)教程,46,7.4.3 字符串的輸入輸出,1.字符串的輸出方法 (1)用printf函數(shù) 有兩種方法: (1)逐個(gè)字符輸出:用格式符“%c”,按字符序列輸出 (2)整個(gè)字符串一次輸入或輸出:用“%s” 格式符,輸出時(shí)從數(shù)組的第一個(gè)字符開始逐個(gè)字符輸出,直到遇到第一個(gè)0為止。 例:ch

37、ar st15=“I am a boy!” printf(“st=%s,%c,%c”,st,st3,st7); 輸出結(jié)果: I am a boy!mb,2020/8/22,C語言程序設(shè)計(jì)教程,47,例7.11 字符串輸出示例,#include main() char str8=Beijing; int i; for (i=0;stri!=0;i++) printf(%c,stri); printf(n); printf(%s,str); 輸出結(jié)果為:,Beijing Beijing,注意: 輸出字符不包括0; 用%c輸出:printf中的輸出項(xiàng)是數(shù)組元素名; 用%s輸出:在printf的

38、輸出表列中,只需給出字符串首地址,用字符數(shù)組名表示。 若數(shù)組長度大于字符串實(shí)際長度,則以0為結(jié)束標(biāo)志,只輸出實(shí)際的字符串。 若字符數(shù)組中包括多個(gè)0,以第一個(gè)為結(jié)束標(biāo)志。,2020/8/22,C語言程序設(shè)計(jì)教程,48,(2)用puts函數(shù)輸出字符串,函數(shù)原型:int put(char * str); 調(diào)用格式:puts(str); 函數(shù)功能:將字符數(shù)組str中包含的字符串或str所指示的字符串輸出,同時(shí)將0轉(zhuǎn)換成換行符。 例:char ch=student; puts(ch); puts(Hello); 將字符數(shù)組中包含的字符串輸出,然后再輸出一個(gè)換行符。因此,用puts()輸出一行,不必另加

39、換行符n。 函數(shù)puts每次只能輸出一個(gè)字符串,而printf可以輸出幾個(gè):printf(%s%s,str1,str2);,2020/8/22,C語言程序設(shè)計(jì)教程,49,2. 字符串的輸入 (1)使用scanf函數(shù)輸入字符串 逐個(gè)字符輸入: 用%c 按字符序列輸入 整個(gè)字符串輸入:用%s 輸入字符串 如:void main() char c110,c210; for (i=0;i<10;i++) scanf(“%c”, 說明: 1.從鍵盤輸入的字符串應(yīng)短于已定義的字符數(shù)組的長度,系統(tǒng)自動(dòng)加0; 2.用%s輸入時(shí),輸入項(xiàng)中是字符數(shù)組名,不加地址符 則s 的內(nèi)容為: How0 使用格式字符

40、串%s時(shí)會(huì)自動(dòng)加上結(jié)束標(biāo)志0。第一個(gè)空格后的字符沒有輸入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/8/22,C語言程序設(shè)計(jì)教程,51,,如: char s14; gets(s); 若輸入的字符串為: How do you do? 則s 的內(nèi)容為: How do you do?0 l 注意: puts、gets只對(duì)一

41、個(gè)字符串操作,而不對(duì)多個(gè)字符串。 gets函數(shù)在回車為結(jié)束標(biāo)志。 puts、gets函數(shù)使用時(shí)要包含stdio.h頭文件。,2020/8/22,C語言程序設(shè)計(jì)教程,52,例7.14 字符串輸入輸出示例,#include main() char s20,s120; scanf(“%s”,s); printf(“%sn”,s); scanf(“%s%s”,s,s1); printf(“s=%s,s1=%s”,s,s1); puts(“n”); gets(s); puts(s); ,程序運(yùn)行過程: How do you do? How How do you do? s=How,s1=do How d

42、o you do? How do you do?,2020/8/22,C語言程序設(shè)計(jì)教程,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中。 char str110,str2=”Beijing”; strcpy(str1,str2); 說明(1)字符數(shù)組1的長度應(yīng)不小于字符串2的長度; (2)字符數(shù)組1必須寫成數(shù)組名形式,字符串2用字符數(shù)組名或字符串常量; (3)0一起復(fù)制;,2020/8

43、/22,C語言程序設(shè)計(jì)教程,54,(4)不能用賦值語句給字符數(shù)組賦以字符串常量或字符數(shù)組。如:str1=”Beijing”; str1=str2; 用賦值語句只能將一個(gè)字符賦給一個(gè)字符變量或字符數(shù)組元素。 改錯(cuò): char str110=”Beijing”,str210; str2=”O(jiān)lympic”; str1=str2; strcpy(str2,str1); strcpy(“2008”,str2);,2020/8/22,C語言程序設(shè)計(jì)教程,55,2.字符串連接函數(shù)strcat() 調(diào)用格式:strcat(d_str,s_str); 功能:將s_str連同0連接到d_str的最后一個(gè)字符

44、(非0字符)后面。結(jié)果放在d_str中。 例:char s114=“I am a ”; char s25=“boy.”; strcat(s1,s2); 連接前: s1: s2: 連接后: s1 l說明: (1)字符數(shù)組1必須足夠大,以容納新字符串; (2)連接前每個(gè)串后有0,連接后只有一個(gè)0;,,2020/8/22,C語言程序設(shè)計(jì)教程,56,3.字符串比較函數(shù)strcmp() 調(diào)用格式:strcmp(str1,str2); 功能:若str1=str2,則函數(shù)返回值為0; 若str1str2,則函數(shù)返回值為正整數(shù); 若str1

45、字符串自左至右逐個(gè)字符比較,直到出現(xiàn)不同字符或遇到0為止。 如字符全部相同,則兩個(gè)字符串相等; 若出現(xiàn)不同字符,則遇到的第一對(duì)不同字符的ASC大者為大?!癙rogram”大于”People”,”English”小于“Language” 比較兩字符串是否相等一般用以下形式: if (strcmp(str1,str2)==0) 而 if(str1==str2) 是錯(cuò)誤的。,2020/8/22,C語言程序設(shè)計(jì)教程,57,4. 字符長度函數(shù)strlen() 調(diào)用格式:strlen(字符串); 功能:求字符串的實(shí)際長度即所含字符個(gè)數(shù)(不包括0)。 例: char str10=“student”; in

46、t length,strl; length=strlen(str); strl=strlen(“very good”); (=9),結(jié)果: length=7 strl=9,2020/8/22,C語言程序設(shè)計(jì)教程,58,例7.17 從鍵盤上輸入兩個(gè)字符串,若不相等,將短的字符串連接到長的字符串的末尾并輸出。,#include #include main() int len1,len2 char s180,s280; gets(s1);gets(s2); if (strcmp(s1,s2)!=0) if (strlen(s1)strlen(s2)) strcat(s1,s2);puts(

47、s1); else strcat(s2,s1);puts(s2); ,輸入:you Thank,輸出:Thank you,2020/8/22,C語言程序設(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/8/22,C語言程序設(shè)計(jì)教程,60

48、,1. 數(shù)組元素做函數(shù)實(shí)參 數(shù)組元素作為函數(shù)實(shí)參與簡單變量相同,是將元素的值傳給函數(shù)形參,是單向值傳遞;函數(shù)形參使用簡單變量。,例7.18 從鍵盤上輸入兩個(gè)字符串,不用字符串函數(shù)strcmp()比較兩者的大小 分析: (1)輸入兩個(gè)字符串,分別存放在str1與str2中; (2)設(shè)計(jì)函數(shù)compstr()比較兩字符,返回ASCII 碼之差,賦給主函數(shù)的變量flag; (3)用dowhile循環(huán)依次比較兩個(gè)字符串的對(duì)應(yīng)字符,結(jié)束的條件是兩字符串至少有一個(gè)結(jié)束,或者比較字符不相等。 (4)當(dāng)循環(huán)結(jié)束時(shí)flag 的值為0或?yàn)榈谝粋€(gè)不相等的字符的ASCII碼值之差,由此可以判斷出字符串的大小 。,20

49、20/8/22,C語言程序設(shè)計(jì)教程,61,程序如下:,#include main( ) int i,flag; int compstr(char, char ); char str180,str280; gets(str1); gets(str2); i=-1; do i++; flag=compstr(str1i,str2i);/*數(shù)組元素作實(shí)參*/ while((str1i!=0) /*只要有一個(gè)字符串到了末尾比較結(jié)束*/,2020/8/22,C語言程序設(shè)計(jì)教程,62,if (flag==0) printf(%s = %s,str1,str2); else if (flag0)

50、printf(%s %s,str1,str2); else printf(%s < %s,str1,str2); int compstr (char c1, char c2) int t; t=c1-c2; return t; ,輸入:very well very good 輸出:very wellvery good,2020/8/22,C語言程序設(shè)計(jì)教程,63,2、數(shù)組名作函數(shù)參數(shù) 將數(shù)組名作函數(shù)參數(shù),實(shí)參、形參都用數(shù)組名,屬于賦地址調(diào)用。 例 不使用庫函數(shù)strcat( ),寫一個(gè)函數(shù)連接兩個(gè)字符串。 #include void connection(char str150,

51、char str250,char str100) int i, j; for (i=0; str1i!=0; i++) stri=str1i; for (j=0; str2j!=0; j++) stri++=str2j; stri=0; ,2020/8/22,C語言程序設(shè)計(jì)教程,64,void main() char s150,s250,s100; printf(Input string 1:); gets(s1); printf(nInput string 2:); gets(s2); connection(s1,s2,s); printf(The new string is:

52、 %sn, s); ,Input string 1:Beijing 2008 Input string 2: Olympic The new string is: Beijing 2008 Olympic,2020/8/22,C語言程序設(shè)計(jì)教程,65,由此看出: 數(shù)組名作函數(shù)參數(shù)時(shí)形參與實(shí)參都應(yīng)使用數(shù)組名,且分別在被調(diào)用函數(shù)與主調(diào)函數(shù)中的說明。 實(shí)參與形參類型要一致。 實(shí)參數(shù)組與形參數(shù)組大小可以不一致,形參數(shù)組可不指定大小。 C編譯程序不檢查形參 數(shù)組的大小。 (1)在一維形參數(shù)組名后面可只跟一對(duì)空方括號(hào)。 為在被調(diào)用函數(shù)中處理數(shù)組元素的需要,可另設(shè)一參數(shù)來傳遞數(shù)組元素個(gè)數(shù)。如: in

53、t lenstr(char str1,int k);/*k為要處理的字符數(shù)*/ (2)對(duì)多維數(shù)組而言,形參的第一維可不指定,但其它維必須指定。如: char grade(float score4,int k);k為數(shù)組行數(shù),2020/8/22,C語言程序設(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

54、個(gè)元素,共進(jìn)行n-1輪,每輪讓剩余元素中最大的元素“沉”到下面,從而完成排序。 事實(shí)上, n-1輪是最多的排序輪數(shù),只要在某一輪排序中沒有進(jìn)行元素交換,說明已排好序,可以提前退出外循環(huán),結(jié)束排序。,2020/8/22,C語言程序設(shè)計(jì)教程,67,程序如下:,#include #define N 80 main() int aN; int i, m; void sort(int b,int k); void print(int b,int k); printf(nInput m(<80):); scanf(%d, ,2020/8/22,C語言程序設(shè)計(jì)教程,68,void sort(int b,in

55、t k) int i,j,t,flag; for (j=0;jbi+1) t=bi; /*相鄰元素交換位置*/ bi=bi+1; bi+1=t; flag=1; /*有元素交換,標(biāo)志置1*/ if (flag==0) break; /*沒有交換元素,結(jié)束循環(huán)*/ ,2020/8/22,C語言程序設(shè)計(jì)教程,69,void print(int b,int k) int i; for (i=0;i

56、 輸出:-24 4 0 1 20 44 53 81,2020/8/22,C語言程序設(shè)計(jì)教程,70,用多維數(shù)組名作函數(shù)參數(shù)例7.14 求數(shù)組元素的最大值與最小值,并把它們分別放在第一、第二個(gè)元素中,#include maxmin(int b4) int I,j,max,min; max=min=b00; for(I=0;Imax)max=bIj; else if(bIj

57、dn”,maxmin(a)); printf(“max=%d”,a00); printf(“min=%d”,a01); ,2020/8/22,C語言程序設(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/8/22,

58、C語言程序設(shè)計(jì)教程,72,程序如下:,#include “stdio.h” #include string.h main( ) int i,k,digit10; long n,m; puts(輸入一個(gè)正整數(shù):); scanf(%ld,,2020/8/22,C語言程序設(shè)計(jì)教程,73,接上頁:,for (i=0;i

59、是一個(gè)回文數(shù),2020/8/22,C語言程序設(shè)計(jì)教程,74,#include main() char c,string81;int I,num=0,word=0; gets(string); for(I=0;(c=stingI)!=0;I++) if(c== ) word=0; else if(word==0) word=1; num++; printf(“There are %d words in the line.n”,num); ,運(yùn)行情況: 輸入:I am a boy. 輸出:There are 4 words in the line.,例7.16 輸入一行字符,統(tǒng)計(jì)其中有多少個(gè)單詞,單詞之 間用空格隔開。,

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!