CH數(shù)組和字符串PPT課件_第1頁
CH數(shù)組和字符串PPT課件_第2頁
CH數(shù)組和字符串PPT課件_第3頁
CH數(shù)組和字符串PPT課件_第4頁
CH數(shù)組和字符串PPT課件_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、五、數(shù)組和字符五、數(shù)組和字符串串例:求5名學(xué)生某門功課的平均成績. main ( ) float s1, s2, s3, s4, s5, avg; printf ( Enter the 5 scores :); scanf(%f%f%f%f%f, &s1,&s2,&s3,&s4,&s5 ); avg = s1 + s2 + s3 + s4 + s5; avg = avg/5.; printf (average score is %6.2fn, avg ); 第1頁/共73頁 數(shù)組是按序排列的同類型變量的集合,是一組具有 相同名字, 不同下標(biāo)的下標(biāo)變量。

2、下標(biāo)變量形式 數(shù)組名下標(biāo) 如 s0、s2、s3、s6、s10 數(shù)組名表示整個數(shù)組,如:s 下標(biāo)變量又稱數(shù)組元素 下標(biāo)指出某個數(shù)組元素在數(shù)組中的位置 下標(biāo)可以用常量表示,也可以用變量表示 有1個下標(biāo)的下標(biāo)變量所組成的數(shù)組稱為一維數(shù)組; 有2個下標(biāo)的下標(biāo)變量所組成的數(shù)組稱為二維數(shù)組; 如:x1、y5 數(shù)組x和y都是一維數(shù)組 a12、b23 數(shù)組a和b都是二維數(shù)組第2頁/共73頁 使用數(shù)組,上例程序可改寫為: main ( ) float s5, avg=0; int i; for (i = 0; i 5; i+) scanf (%f, &si ); avg += si; avg = avg

3、/5.; printf ( average score is %6.2fn, avg ); 第3頁/共73頁5.1 5.1 一維數(shù)組一維數(shù)組5.1.1 5.1.1 一維數(shù)組的定義和引用一維數(shù)組的定義和引用1. 一維數(shù)組的定義 定義形式: 數(shù)據(jù)類型 數(shù)組名常量表達(dá)式; 如: int a10; 數(shù)據(jù)類型 說明該數(shù)組中每個元素的數(shù)據(jù)類型 數(shù)組名 數(shù)組的名稱,命名規(guī)則同變量名 常量表達(dá)式 表示該數(shù)組具有的元素個數(shù), 也稱為數(shù)組的長度。 說明: 數(shù)組中的第一個元素的下標(biāo)從0開始。第4頁/共73頁 數(shù)組名 ( 如 a ) 表示該數(shù)組中第一個元素 ( 如 a0 ) 的地址,即a和&a0同值。數(shù)組名是

4、地址常量。 經(jīng)過定義的數(shù)組,編譯后,會分配到一段連續(xù)的 內(nèi)存單元。其首地址即數(shù)組名(如 a); 數(shù)組定義后,編譯時無越界保護(hù); 數(shù)組定義中的常量表達(dá)式中不能包 含變量。如以下定義方法是不允許的: int n, m=10; float an, bm; 同類型數(shù)組可一起定義,用逗號隔開。 如:int a10, b20;a,a0 a1 a2 a9第5頁/共73頁2. 一維數(shù)組元素的引用 數(shù)組不能以整體形式參加數(shù)據(jù)處理,參加數(shù)據(jù)處理的只能是數(shù)組元素。數(shù)組元素的引用方法有兩種: 下標(biāo)法 引用的一般形式為:數(shù)組名下標(biāo) 其中的下標(biāo)為整型常量或整型表達(dá)式,可以包含 變量,它表示了元素在數(shù)組中的順序號即位置 指

5、針法(第7章中介紹)【例】輸入學(xué)生數(shù)n(不大于50)及n個學(xué)生某門課程的成績,計算并輸出平均成績(保留1位小數(shù))和高于平均成績的人數(shù)。 第6頁/共73頁main( ) int i, n, count, score50; float avg; printf(Input the student the number:n); scanf(%d, &n); /* 輸入學(xué)生數(shù)輸入學(xué)生數(shù)n */ printf(Input %d score:n, n); for (avg=0, i=0; in; i+) /* 輸入成績并輸入成績并累加累加 */ scanf(%d, &scorei); avg

6、+=scorei; avg/=n; /* 計算平均成績計算平均成績 */ for (count=i=0; i avg) count+; printf(Average=%.1f Number=%dn, avg, count);第7頁/共73頁例2:輸入一行字符, 以回車表示結(jié)束。問輸入各數(shù) 碼的個數(shù)。 # include main ( ) char s80, c; int i, nd10; for ( i=0; i=0&si=9) ndsi-0+; /*各數(shù)碼計數(shù)*/ for ( i=0; i10; i+ ) printf (nd%d=%dn, i, ndi); 第8頁/共73頁5.1.

7、2 5.1.2 一維數(shù)組的初始化一維數(shù)組的初始化 數(shù)組初始化 是在定義數(shù)組時對數(shù)組元素賦予初值。一般形式為: 類型說明符 數(shù)組名常量表達(dá)式=值1,值2,值n; 中的各值為將依次賦予各對應(yīng)元素的初值,必須 是常量或常量表達(dá)式,且類型應(yīng)與數(shù)組的類型一致 int a10=2, 4, 6, 8, 10, 12, 14, 16, 18, 20; 用單個字符作為初值 char b5=C,h,i,n,a;第9頁/共73頁 用字符串常量作為初值 char c6=China; 或 char c6=China; 注意:編譯系統(tǒng)自動在字符串常量的最后加0 可以不指定數(shù)組長度 int a =0, 2, 4, 6, 8

8、; 相當(dāng)于 int a5=0, 2, 4, 6, 8; char c = China; 相當(dāng)于 char c6= China; 允許只給部分元素賦初值 (其余元素初始化為0 ) int a80=0; char b10=C,h,i,n,a; 未指定初始化的數(shù)組,各元素的值是隨機(jī)的未知值 但全局?jǐn)?shù)組和靜態(tài)數(shù)組則會自動初始化為0。第10頁/共73頁【例】從鍵盤輸入日期(yyyy-mm-dd),計算并 輸出該日期那天是該年的第幾天。 分析: 基本算法:將1月至m-1月的各月天數(shù)累加,再加 上給定的日d。 每月的天數(shù)可用一個一維數(shù)組存放,初始化為平 年的天數(shù),然后再根據(jù)y年是否為閏年來修正2月 份的天數(shù)

9、。 閏年的條件是符合下面兩條件之一: 能被4整除,但不能被100整除; 能被400整除 ;第11頁/共73頁main( ) int a13=0,31,28,31,30,31,30,31,31,30,31,30,31; int y, m, d, i, days; do printf(Input the date(yyyy-mm-dd):n); scanf(%d-%d-%d, &y, &m, &d); a2=28+(y%4=0&y%100!=0|y%400=0); while ( m12|dam ) ; for( i=1, days=d; im; i+) days+

10、 =ai; printf (%dn, days); 第12頁/共73頁運行結(jié)果:Input the date(yyyy-mm-dd): 2004-9-12256 另一種方法是不用數(shù)組來存放每月的天數(shù)和循環(huán)結(jié)構(gòu)累加各月天數(shù),而是用switch結(jié)構(gòu)直接給出各月天數(shù)并實現(xiàn)累加。第13頁/共73頁main( ) /* 用switch結(jié)構(gòu) */ int y, m, d, days, m2=28; do printf(Input the date(yyyy-mm-dd):n); scanf(%d-%d-%d, &y, &m, &d); a2=28+(y%4=0&y%100!

11、=0|y%400=0); while ( m12|dam ) ; days=d; switch(m-1) case 11: days+=30; case 10: days+=31; case 9: days+=30;第14頁/共73頁 case 8: days+=31; case 7: days+=31; case 6: days+=30; case 5: days+=31; case 4: days+=30; case 3: days+=31; case 2: days +=m2; case 1: days +=31; printf (n=%dn, days);第15頁/共73頁 程序舉例程

12、序舉例 【例】輸入10個整數(shù),按從小到大的順序輸出。 這是一個數(shù)據(jù)排序問題。排序算法有很多種,下面結(jié)合上述實例介紹3種常用的簡單排序算法:冒泡法、選擇法和插入法。1. 冒泡法冒泡法 冒泡法排序的基本思想是:依次逐個比較相鄰的兩個數(shù),如不符合順序要求,就交換這兩個數(shù)的位置。通過一輪比較,就能排定一個數(shù)的位置,對于n個數(shù),進(jìn)行n-1輪比較即可完成排序第16頁/共73頁 冒泡法1: 從第n個數(shù)開始,依次比較相鄰兩個數(shù),即第n個與 第n-1個、第n-1個與第n-2個、,每次比較,若不 滿足由小到大的順序,則兩者對調(diào)位置,通過一輪 比較,參加比較的數(shù)中的最小數(shù)就“上升”到它們中 最前面的位置,下一輪再把

13、余下的數(shù)依次比較,這 樣,通過n-1輪比較,就完成了全部n個數(shù)的升序排 列。在第i輪比較時,從第 1個位置開始已排序定位 了i-1個數(shù),余下n-i+1個數(shù),需兩兩比較 n-i次。第17頁/共73頁冒泡法1流程:輸入s各元,i=0ii? sjsj-1? i+j-FFTT輸出sFT第18頁/共73頁#define N 10main ( ) int sN, i, j, t ; for ( i=0; i N; i+ ) scanf ( %d, &si ); for ( i=0; ii; j- ) if ( sjsj-1 ) t = sj; sj = sj-1; sj-1 = t; for (

14、i=0; i N; i+ ) printf (%d , si); /* 輸出排序輸出排序結(jié)果結(jié)果*/ printf(n); 第19頁/共73頁 冒泡法2: 從第1個數(shù)開始,依次比較相鄰兩個數(shù),即第1個與 第2個、第2個與第3個、 ,每次比較,若不滿足 由小到大的順序, 則兩者對調(diào)位置, 通過一輪比 較,參加比較的數(shù)中的最大數(shù)就 “ 下沉 ” 到它們中 最后面的位置,下一輪再把余下的數(shù)依次比較,這 樣,通過n-1輪比較,就完成了全部n個數(shù)的升序排 列。在第i輪比較時,從第 n個位置開始向前已排序 定位了i-1個數(shù),余下n-i+1個數(shù),需兩兩比較n-i次。第20頁/共73頁#define N 10

15、main ( ) int s10, i, j, t ; for ( i=0; i N; i+ ) scanf (%d, &si); for ( i=0; i N-1; i+ ) /* 依次把最依次把最大數(shù)右移大數(shù)右移 */ for ( j=0; j sj+1) t = sj; sj = sj+1; sj+1 = t; for ( i=0; i N; i + ) /* 輸出排序輸出排序結(jié)果結(jié)果 */ printf (%d%c, si, i!=N-1 ? , : n); 第21頁/共73頁2. 選擇法選擇法: 選擇法排序的基本思想是: 通過比較找到最小數(shù),如不是第1個數(shù),則與第1個數(shù)交換,

16、再在余下的數(shù)中找到最小數(shù),如不是第 2 個數(shù),則與第 2 個數(shù)交換位置,再在余下的數(shù)中找到最小數(shù),如不是第 3 個數(shù),則與第 3 個數(shù)交換位置,依此進(jìn)行,n 個數(shù)經(jīng)過 n-1 輪比較即可完成排序。第22頁/共73頁#define N 10 /* 每輪比較中:每輪比較中:*/main() /* 最小數(shù)位置記入最小數(shù)位置記入k k,結(jié)束再與第,結(jié)束再與第i i個對調(diào)個對調(diào)*/ int sN, i, j, k, t; for ( i=0; iN; i+ ) scanf (%d, &si); for( i=0; i N-1; i+ ) for( k=i, j=i+1; jsj) k=j; if

17、(k!=i) t=si; si=sk; sk=t; for(i=0; iN; i+) printf(%d%c, si, i!=N-1?,: n);第23頁/共73頁#define N 10 /* 每輪比較中:每輪比較中: */main() /* 遇到比第遇到比第i i個小的就與第個小的就與第i i個對調(diào)個對調(diào)*/ int sN, i, j, t; for ( i=0; iN; i+ ) scanf ( %d, &si ); for( i=0; iN-1; i+ ) for( j=i+1; jsj) t=si; si=sj; sj=t; for(i=0; iN; i+) printf(%

18、d%c, si, i!=N-1?,: n); 第24頁/共73頁3. 插入插入法法 插入法排序基本思想是:開始時第1個數(shù)已排好序,首先將第2個數(shù)按其與前1個已排好序的數(shù)的順序關(guān)系插入到適當(dāng)位置,然后將第3個數(shù)按其與前2個已排好序的數(shù)的順序關(guān)系插入到適當(dāng)位置,接著再將第4個數(shù)按其與前3個已排好序的數(shù)的順序關(guān)系插入到適當(dāng)位置,依次進(jìn)行下去,直到最后一個數(shù)也按其與前面所有已排好序的數(shù)的順序關(guān)系插入到適當(dāng)位置。對于n個數(shù),經(jīng)過n-1輪比較插入即可完成排序。 第25頁/共73頁main( ) int aN, i, j, k, t; for ( i=0; i N; i+ ) scanf (%d, &

19、;ai); for (i=1; i =0&taj; j-) aj+1=aj; aj+1=t; for (i=0; i N;i+) printf(%d ,ai); printf(n);第26頁/共73頁【例】已知數(shù)組a中共有10個已按升序排序的整數(shù)。現(xiàn)從鍵盤輸入一數(shù),請用二分法查找數(shù)組a中是否有此數(shù),如有則打印出此數(shù)在數(shù)組中的位置,否則打印找不到。 設(shè):待查數(shù)在變量x中; 變量low 用于存放查找范圍的頂部位置; 變量m 用于存放查找范圍的中間位置; 變量high 用于存放查找范圍的底部位置; 二分法的基本步驟: 賦初值:low=0,high9,計算m=(low+high)/2 這樣把查

20、找范圍分成以am為中點的兩段范圍。第27頁/共73頁 判斷l(xiāng)owam? 如是,則x必定落在后半段。以后半段為新查找范 圍,再劃分兩段范圍:lowm+1,high不變, m=(low+high)/2?;氐降诓健?如不是,x必定落在前半段。以前半段為新查找范 圍,再劃分兩段范圍: low不變,highm-1, m=(low+high)/2?;氐降诓?。第28頁/共73頁main ( ) int low, high, m, x ; int a10= -54, -34, -8, 0, 3, 12, 25, 56, 68, 98 ; printf(Please input x:); scanf (%d,

21、&x); low=0; high=9; while (lowam) low=m+1; else high=m-1; if (low=high) printf (%d position is %dn, x,m+1); else printf(%d not found.n, x);第29頁/共73頁【例】 n盞燈從1到n按順序依次編號,有n個人也從1到n依次編號,第一個人(1號)將燈全部關(guān)閉,第二個人(2號)將凡是2和2的倍數(shù)號的燈打開,第三個人(3號)將凡是3和3的倍數(shù)號的燈做相反處理(即該燈如為打開的,將它關(guān)閉;如為關(guān)閉的,將它打開)。以后的人都和3號一樣,將凡是與自己相同編號的燈和是

22、自己編號倍數(shù)的燈做相反處理。n(1n1000)從鍵盤輸入,請問:當(dāng)?shù)趎個人操作之后,哪幾盞燈是關(guān)閉的,輸出其編號。第30頁/共73頁main() int a1000=0, n, i, j; /* 第第1個人將燈全部個人將燈全部關(guān)閉關(guān)閉 */ scanf(%d, &n); for(i=2; i=n; i+) /* 從第從第2個到第個到第n個人個人 */ for(j=i; j=n; j+) /* 從第從第i號到第號到第n號燈號燈 */ if( j%i=0 ) /* 對對i和和i倍數(shù)倍數(shù)號號的的燈燈做相做相反處理反處理 */ aj=!aj; for(i=1; i=n; i+) /* 輸出關(guān)閉

23、輸出關(guān)閉的的燈燈的的編號編號 */ if(ai=0) printf(%d ,i);輸入:100輸出:1 4 9 16 25 36 49 64 81 100第31頁/共73頁5.2 5.2 二維數(shù)組二維數(shù)組5.2.1 5.2.1 二維數(shù)組的定義和引用二維數(shù)組的定義和引用1. 二維數(shù)組的定義 定義形式: 數(shù)據(jù)類型 數(shù)組名常量表達(dá)式1 常量表達(dá)式2; 如: int a34; 定義a為34(三行四列)的數(shù)組, 各個元素皆是整 型量,具體是: a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 在內(nèi)存中按行存放。第32頁/共73頁 二維數(shù)組是一維數(shù)組的數(shù)組 可

24、以把a(bǔ)看作含有a0、a1和a2共3個元素的一 維數(shù)組,而a0、a1和a2又都是含有4個元素的 一維數(shù)組,a0、a1和a2就是這3個一維數(shù)組的 名字,即: a0: a00 a01 a02 a03 a1: a10 a11 a12 a13 a2: a20 a21 a22 a23第33頁/共73頁2. 二維數(shù)組元素的引用 下標(biāo)法 引用的一般形式為:數(shù)組名下標(biāo)1 下標(biāo)2 其中的下標(biāo)1和下標(biāo)2為整型常量或整型表達(dá)式, 可以包含變量,它們分別表示了元素在數(shù)組中的 行、列位置。例如: a12 - a 數(shù)組第2行第3列元素 a03 - a 數(shù)組第1行第4列元素 指針法 (第7章中介紹)第34頁/共73頁【例】編

25、程計算并輸出一個54的整數(shù)矩陣周邊各元之和,矩陣各元從鍵盤輸入。main( ) int a54, i, j, sum=0; for (i=0; i5; i +) /* 輸入并計算矩陣各元之和 */ for (j=0; j4; j+) scanf(%d, &aij); sum+=aij; for (i=1; i4; i+) /* 矩陣各元之和減去矩陣中間各元 */ for (j=1; j3; j+) sum-=aij; printf(Sum=%dn, sum);第35頁/共73頁5.2.2 5.2.2 二維數(shù)組的初始化二維數(shù)組的初始化 按行分段給二維數(shù)組元素賦初值 int a34=8,4

26、,2,1, 5,7,0,3,4,0,9,6; 按行連續(xù)給二維數(shù)組元素賦初值 int a34=8,4,2,1, 5,7,0,3, 4,0,9,6; 允許只給部分元素賦初值(其余元素初始化為0) int a34=8,4, 5,4; int a34=8,4,2,1,5;第36頁/共73頁 用字符或字符串常量為初值給字符數(shù)組初始化 char s25=b,o,y,0,g,i,r,l,0; char s25=boy, girl; 當(dāng)用按行分段方法給出了所有行,或者當(dāng)用按行 連續(xù)方法給出全部數(shù)組元素初始化值時,可以省 略第一個下標(biāo)的長度 char s5=boy, girl; int a4=8,4, 5,4;

27、 int a4= 8,4,2,1, 5,7,0,3, 4,0,9,6; 未指定初始化的數(shù)組,各元素的值是隨機(jī)的未知 值。全局?jǐn)?shù)組和靜態(tài)數(shù)組則會自動初始化為0。第37頁/共73頁5.2.3 5.2.3 程序舉例程序舉例 【例】把整型矩陣A(2x3)轉(zhuǎn)置成B(3x2)后輸出,矩陣A的各元從鍵盤輸入。 矩陣轉(zhuǎn)置的基本算法是:把原矩陣A的i行j列的元素,轉(zhuǎn)置成矩陣B的j行i列的元素。main( ) int a23, b32, i, j; printf(Please input A:n); for (i=0; i2; i+) /* 輸入矩陣輸入矩陣A */ for (j=0; j3; j+) scanf

28、(%d, &aij);第38頁/共73頁 for (i=0; i2; i+) /* 矩陣矩陣A A轉(zhuǎn)置成轉(zhuǎn)置成B */ for(j=0; j3; j+) bji=aij; printf(Result B: n ); for (i=0; i3; i+) /* 輸出矩陣輸出矩陣B */ for (j=0; j2; j+) printf(%d ,bij); printf(n) 運行結(jié)果: Please input A: 1 2 3 4 5 6 Result B: 1 4 2 5 3 6第39頁/共73頁【例】 計算并輸出整型矩陣 A(2x3) 和整型矩陣B(3x4)的乘積,矩陣A和B的各元從

29、鍵盤輸入。 根據(jù)矩陣相乘規(guī)則,若有矩陣A和B,滿足條件A的列數(shù)等于B的行數(shù),則可相乘得矩陣C。C的行數(shù)和列數(shù)分別等于A的行數(shù)和B的列數(shù)。 設(shè)A為mn矩陣、B為np矩陣,則C為mp矩陣,且其元素的數(shù)學(xué)表達(dá)式為: kjnkikijBAC10i=0,m-1 j=0,p-1 第40頁/共73頁#define M 2#define N 3#define P 4main() int aMN, bNP, cMP, i, j, k; printf(Please input A:n); for(i=0; iM; i+) /* 輸輸入矩陣入矩陣A */ for(j=0; jN; j+) scanf(%d, &am

30、p;aij); printf(Please input B:n); for(i=0; iN; i+) /* 輸入輸入矩陣矩陣B */ for(j=0; jP; j+) scanf(%d, &bij); 第41頁/共73頁 for(i=0; iM; i+) /* 計算計算 C */ for(j=0; jP; j+) cij=0; for(k=0; kN; k+) cij+=aik*bkj; printf(Result C:); for(i=0; iM; i+) /* 輸出輸出C */ printf(n); for(j=0; jP; j+) printf(%5dt, cij); 運行結(jié)果:

31、 Please input A: 1 2 3 4 5 6 Please input B: 11 12 13 14 21 22 23 24 31 32 33 34 Result C: 146 152 158 164 335 350 365 380第42頁/共73頁5.3 5.3 字符串處理字符串處理 字符數(shù)組與字符串字符數(shù)組與字符串 字符串常量 字符串常量是用雙引號括起來的一串字符 字符數(shù)組 語言中沒有專門的字符串變量,通常是用字符 數(shù)組來存放字符串。 一個一維字符數(shù)組可存放一個字符串 一個二維字符數(shù)組則可看成多個一維字符數(shù)組的 組合,即每行可存放一個字符串。第43頁/共73頁 字符串結(jié)束標(biāo)志0

32、 字符串常量尾部自動含有一個結(jié)束符0 用字符串常量初始化字符數(shù)組會自動加結(jié)束符 0 ,用字符常量初始化字符數(shù)組則不會,如: char c=Hello!, s=H, e, l, l, o, !, 0 ; 進(jìn)行字符串處理時,就可以通過檢測0來判定 字符串是否結(jié)束 字符串長度指的是字符串本身字符的個數(shù),并 不把字符串結(jié)束符0計算在內(nèi)第44頁/共73頁5.3.2 5.3.2 字符串的輸入和輸出字符串的輸入和輸出1. 逐個字符輸入輸出 用scanf()和printf()函數(shù)的“c”格式符 【例】使用scanf()和printf()函數(shù)的c格式 符,從鍵盤輸入一字符串,然后輸出該字符串。第45頁/共73頁

33、#include stdio.hmain( ) char a81; int i; for (i=0; i81; i+) scanf (%c, &ai); if (ai=n) ai=0; break; for (i=0; ai!=0; i+) printf (%c, ai ); printf(n); 運行結(jié)果: This is a string. This is a string.第46頁/共73頁 用getchar()和putchar ()函數(shù) 【例】使用getchar()和putchar ()函數(shù),從鍵盤 輸入一字符串,然后輸出該字符串。 #include stdio.h main(

34、 ) char a81; int i=0; while (ai+=getchar()!=n); a-i=0; i=0; while (putchar(ai+)!=0); putchar(n); 運行結(jié)果: This is a string. This is a string.第47頁/共73頁2. 字符串整體輸入和輸出 用scanf()和printf()函數(shù)的“s”格式符 【例】使用 scanf() 和 printf() 函數(shù)的“s”格式 符,從鍵盤輸入一字符串,然后輸出該字符串。 main ( ) char c15; scanf (%s, c); printf (%sn, c); 注意:輸入

35、字符串中的空格作為分隔符,空格后的 字符被丟失。 運行結(jié)果: worker. worker. I am a worker. I第48頁/共73頁 用gets()和puts()函數(shù) 字符串輸入函數(shù)gets() 原型:char *gets(char *str); 功能:從標(biāo)準(zhǔn)輸入設(shè)備鍵盤上輸入一個字符串, 按回車鍵結(jié)束,存入起始地址為str的內(nèi)存中,自 動加結(jié)束符0,并返回該字符串首地址。 字符串輸出函數(shù)puts() 原型:int puts(char *str); 功能:把str指向的字符串輸出到標(biāo)準(zhǔn)輸出設(shè)備顯 示器,并添加換行符n,如輸出成功,則返回所 輸出的最后一個字符,否則返回EOF值,即-

36、1。第49頁/共73頁 gets( )和 puts( )函數(shù)包含在頭文件中,考慮 到其使用頻繁,系統(tǒng)允許在使用這兩個函數(shù)時可 不加編譯預(yù)處理命令:#include stdio.h 【例】使用gets()和puts()函數(shù),從鍵盤輸入一 字符串,然后輸出該字符串。 main( ) char a81; puts(Input a string:); gets(a); puts(a); 運行結(jié)果: Input a string: This is a string. This is a string.第50頁/共73頁5.3.3 5.3.3 字符串處理函數(shù)字符串處理函數(shù) 標(biāo)準(zhǔn)C函數(shù)庫中提供有許多字符串處

37、理函數(shù),下面介紹幾個最常用的字符串處理函數(shù),這些函數(shù)原型都包含在頭文件string.h 中。1. 字符串長度函數(shù)strlen() 原型:int strlen(char *str) 功能:計算字符指針str所指向的字符串的長度 (不含字符串結(jié)束標(biāo)志0) ,返回長度值第51頁/共73頁2. 字符串拷貝函數(shù)strcpy() 原型:char *strcpy(char *str1, char *str2) 功能:把str2指向的字符串拷貝到str1指向的目標(biāo) 中去,返回目標(biāo)字符串的指針str13. 字符串比較函數(shù)strcmp() 格式:int strcmp(char *str1, char *str2)

38、 功能:比較str1和str2分別指向的兩個字符串: 字符串str1字符串str2,則返回值字符串str2,則返回值0第52頁/共73頁4. 字符串連接函數(shù)strcat() 格式:char *strcat(char *str1, char *str2) 功能:把字符數(shù)串str2連接到字符串str1的后面, 并刪去原字符串str1后的結(jié)束標(biāo)志0。返 回字符串str1的首地址?!纠繌逆I盤輸入兩個字符串,將這兩個字符串連接合并成一新字符串,兩個字符串間要加入減號字符-,然后輸出該新字符串。連接合并的規(guī)則是:如果兩者長度不相等,則短者在前,長者在后;否則再比較兩者的大小,小者在前,大者在后。如果兩者

39、完全相同,則前后隨意。 第53頁/共73頁#include stdio.h#include string.hmain( ) char s181, s281, s3200; int first=1; /* first初始化為字初始化為字符串符串s1在前在前 */ gets(s1); /* 輸入字符串輸入字符串s1*/ gets(s2); /* 輸入字符串輸入字符串s2 */ if (strlen(s1) strlen(s2) /* 如果如果s2短短, ,則則標(biāo)識標(biāo)識s2在前在前 */ first=2; else if(strlen(s1)=strlen(s2)&(strcmp(s1, s

40、2)0) first=2; /* 如果長度相等且如果長度相等且s2小小, ,則標(biāo)則標(biāo)識識s2在前在前 */ 第54頁/共73頁 if (first=1) /* 按按first的標(biāo)識的標(biāo)識,將將s1和和s2連接連接合并成合并成s3 */ strcpy(s3, s1); strcat(s3,-); strcat(s3, s2); else strcpy(s3, s2); strcat(s3, -); strcat(s3, s1); puts(s3); /* 輸出輸出s1和和s2連接合并成的字符連接合并成的字符串串s3 */第55頁/共73頁5.3.4 5.3.4 程序舉例程序舉例【例】從鍵盤輸入一

41、個字符串(不多于80個字符),將其中的數(shù)字字符按原順序組成一個新字符串,將其中的英文字母都用大寫按原順序組成另一個新字符串,再輸出這兩個新字符串,每個一行。如原串中沒有數(shù)字字符或沒有英文字母,也要報告There are no digits.或There are no letters.。第56頁/共73頁#include stdio.hmain( ) char s81, sa81=0, sn81=0; int i, j, k; printf(Input a string:n); gets(s); for (i=j=k=0; si; i+) if (si=0&si=a&si=A&a

42、mp;si=a&tc=A&tcletterj) k=j; if (k!=i) tc=letterk; letterk=letteri; letteri=tc; tn=countk; countk=counti; counti=tn; for (i=0; letteri!=0; i+) /* 輸出輸出 */ printf(%c=%d , letteri, counti); printf(n);第62頁/共73頁main( ) /* 方法2 */ char a81; int i, count26=0; printf(Input a string:n); gets(a); for (i=0; ai!=0; i+) /* 統(tǒng)計統(tǒng)計 */ if (ai=A&ai=a&ai=z) countai-a+; 第63頁/共73頁 for (i=0; i0) printf(%c=%d , A+i, counti); printf(n);運行結(jié)果:Input a string: Gai

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論