第6章_利用數(shù)組處理批量數(shù)據(jù).ppt_第1頁
第6章_利用數(shù)組處理批量數(shù)據(jù).ppt_第2頁
第6章_利用數(shù)組處理批量數(shù)據(jù).ppt_第3頁
第6章_利用數(shù)組處理批量數(shù)據(jù).ppt_第4頁
第6章_利用數(shù)組處理批量數(shù)據(jù).ppt_第5頁
已閱讀5頁,還剩126頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、復習:條件判斷表達式,邏輯表達式,分支,循環(huán),1、打星星,#include void main() int i,j; for(i=1;i=5;i+) for(j=1;j=5;j+) printf(*); printf(n); ,#include void main() int i,j; for(i=1;i=5;i+) for(j=1;j=i;j+) printf(*); printf(n); ,#include void main() int i,j; for(i=1;i=5;i+) for(j=1;j=5-i;j+) printf( ); for(j=1;j=i;j+) printf(*);

2、 printf(n); ,#include void main() int i,j; for(i=1;i=5;i+) for(j=1;j=5-i;j+) printf( ); for(j=1;j=2*i-1;j+) printf(*); printf(n); ,#include void main() int i,j; for(i=1;i=1;i-) for(j=1;j=5-i;j+) printf( ); for(j=1;j=2*i-1;j+) printf(*); printf(n); ,2、循環(huán)中套用if判斷 #include void main() int i; for(i=10;i=

3、1000;i+) if(i%17=0 ,處理輸入數(shù)據(jù) 例如輸入20個數(shù),輸出最大值,處理循環(huán)變量 輸出10到1000之間,能被17整除, 十位數(shù)為5的整數(shù)。,關于循環(huán)套用if語句的方法,一定要熟練 例如: 本題; 最大最小值; 求和求階乘求平均; 輸出奇數(shù)(偶數(shù)); 素數(shù); 字符處理; ,第六章,利用數(shù)組處理批量數(shù)據(jù),問題:給一組數(shù)排序,這組 數(shù)該 如何存放呢,? 這些數(shù)據(jù)如何存放才便于排序,1,8,8,8,8,8,8,8,8,8,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,8,8,8,8,8,8,8,8,8,本章要點,掌握一維、二維數(shù)組的定義和引用方法、存儲結構和初始

4、化方法。 掌握有關一維數(shù)組的有關算法。 掌握數(shù)組的運算。,主要內(nèi)容,6.1 為什么要用數(shù)組 6.2 定義和引用一維數(shù)組 6.3 二維數(shù)組的定義和引用 6.4 字符數(shù)組 6.5 提高部分,6.1 為什么要用數(shù)組,C語言為這些數(shù)據(jù),提供了一種構造數(shù)據(jù)類型:數(shù)組。所謂數(shù)組就是一組具有相同數(shù)據(jù)類型的數(shù)據(jù)的有序集合。,一個班學生的學習成績 一行文字 一個矩陣 這些數(shù)據(jù)的特點是: 1、具有相同的數(shù)據(jù)類型 2、使用過程中需要保留原始數(shù)據(jù),1.一維數(shù)組的定義格式為: 類型說明符 數(shù)組名常量表達式; 例如: int a10; 它表示定義了一個整形數(shù)組,數(shù)組名為a,此數(shù)組有10個元素。,6.2 定義和引用一維數(shù)組

5、 6.2.1 定義一維數(shù)組,說明: 1.數(shù)組名定名規(guī)則和變量名相同,遵循標識符定名規(guī)則。,標識符 由程序員定義的命名符,語法:以字母或下劃線開始,由字母、數(shù)字和下劃線組成的符號串,注意:,break int 等 不能用于命名程序中的自定義 函數(shù)、變量、常量,(1) 不能使用關鍵字作用戶標識符;,(2) C語言中,字母大小寫敏感;,(3) C語言沒有規(guī)定標識符的長度,不同編譯系統(tǒng)有不同的識別長度;,(4) 標識符盡可能做到見文知義。,Aa 和 aa 是兩個不同的標識符,1.2.2 詞匯,main printf等 已經(jīng)用過的變量名或函數(shù)名也不能用于命名程序中的自定義 函數(shù)、變量、常量,語法:以字母

6、或下劃線開始,由字母、數(shù)字和下劃線組成的符號串,判斷以下標識符的正確性:,合法標識符有:a x1 no_1 _a2c sum Name name 不合法標識符有:2a x+y a,b a int b10+10; scanf(%d, ,數(shù)組說明中其他常見的錯誤: float a0;/* 數(shù)組大小為0沒有意義 */ int b(2) ; /* 不能使用圓括號 */ int k, ak; /* 不能用變量說明數(shù)組大小*/,#include void main() int n=20; /scanf(“%d”, ,注意: 定義數(shù)組時用到的數(shù)組名常量表達式 和引用數(shù)組元素時用到的數(shù)組名下標 是有區(qū)別的。

7、例如 int a10; 中只能是整型常量(不可含變量) t=a6; 中是值為整型表達式(可含變量) 大小為n的數(shù)組,下標范圍:0(n-1),6.2 一維數(shù)組的定義和引用6.2.2 引用一維數(shù)組元素,1.數(shù)組元素的引用方式: 數(shù)組名下標 下標可以是整型表達式。 例如: a0=a5+a7-a2*3,#include void main() int a3+3; int b=2; /int cb; scanf(%d, ,#include void main() int a5; scanf(%d, ,錯誤,2.一維數(shù)組元素引用的程序?qū)嵗?例題 6.1,引用數(shù)組元素。利用循環(huán)給數(shù)組元素a0a9賦值為09,

8、然后按逆序輸出各元素的值,解題思路,用0到9的循環(huán)給數(shù)組元素a0 a9賦值09,然后用9到0的循環(huán)按a9到a0的順序輸出各元素的值。,2.一維數(shù)組元素引用的程序?qū)嵗?運行結果如下: 9 8 7 6 5 4 3 2 1 0,編寫程序,#include void main() int i,a10; for (i=0; i=0; i-) printf(%d ,ai); printf(n); ,對數(shù)組元素初始化的實現(xiàn)方法:,1.在定義數(shù)組時對數(shù)組元素賦以初值。 例如:int a10=0,1,2,3,4,5,6,7,8,9; 將數(shù)組元素的初值依次放在一對花括弧內(nèi)。經(jīng)過上面的定義和初始化之后,a0=0,a

9、1=1,a2=2,a3=3,a4=4,a5=5,a6=6,a7=7,a8=8,a9=9。,6.2 一維數(shù)組的定義和引用 6.2.3 一維數(shù)組的初始化,3. 如果想使一個數(shù)組中全部元素值為0,可以寫成: int a10=0,0,0,0,0,0,0,0,0,0; 或 int a10=0;,2. 可以只給一部分元素賦值。 例如: int a10=0,1,2,3,4; 定義a數(shù)組有10個元素,但花括弧內(nèi)只提供5個初值,這表示只給前面5個元素賦初值,后5個元素值為0。,#include void main() int i,a10; for(i=9;i=0; i-) printf(%d ,ai); pri

10、ntf(n); ,#include void main() int i,a10=0; for(i=9;i=0; i-) printf(%d ,ai); printf(n); ,4. 在對全部數(shù)組元素賦初值時,由于數(shù)據(jù)的個數(shù)已經(jīng)確定,因此可以不指定數(shù)組長度。 例如:int a5=1,2,3,4,5; 也可以寫成 int a=1,2,3,4,5; int a10=1,2,3,4,5; 只初始化前5個元素,后5個元素為0。,Fibonacci數(shù)列公式:已知: a1=a2=1,an=an-1+an-2 即:1,1,2,3,5,8,13 建立一個數(shù)組,將數(shù)列中第1個數(shù)放在數(shù)組第1個的元素中,數(shù)列第2個數(shù)

11、放在數(shù)組第2個的元素中,。,6.2 一維數(shù)組的定義和引用 6.2.4 一維數(shù)組程序舉例,例題 6.2,用數(shù)組來處理求Fibonacci數(shù)列問題。,解題思路,#include void main() int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) if(i%5=0) printf(n); printf(%12d,fi); printf(n); ,if(i%5=0 int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) printf(%12d,fi);

12、if(i+1)%5=0) printf(n); ,#include void main() int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) printf(%12d,fi); if(i%5=4) printf(n); ,#include void main() int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=1;i=20;i+) printf(%12d,fi-1); if(i%5=0) printf(n); ,程序沒有定式 要通過思考形成 解決問題的

13、邏輯 用特定語句實現(xiàn)它 如果程序有錯誤時 思考找出邏輯缺陷 在什么位置,例題 6.3,假如有n個人,各人年齡不同,希望按年齡將他們從小到大排列。,解題思路,這種問題稱為數(shù)的排序(sort)。排序的原則有兩 類,一類是升序,從小到大;一類是降序,從大到小。我們可以把這個題目抽象為一般形式: 對n個數(shù)按升序排列 對一組數(shù)據(jù)進行排序的方法很多,本例介紹用起泡法排序。起泡法的思路如下,#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;ia1) t=a0; a0=a1; a1=t; printf(

14、the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,#include void main() int a10; int i,j,t; printf(

15、input 10 numbers :n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,for(j=1;j=9;j+) 可以嗎?,for(i=1;i=9;i+) 可以嗎?,經(jīng)過第一趟后,最大的數(shù)9已沉底 。然后進行對余下的前面5個數(shù)第二趟比較,共5次比較與交換即可。,比較相鄰的兩個數(shù),如果有n個數(shù),則要進行n-1趟比較。在第1趟比較中要進行n-1次兩兩比較,在第2趟比較中要進行n-2次兩兩比較,在第j趟比較中要進

16、行n-j次兩兩比較。,#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,趟,次,關于冒泡排序的討論:,#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;iai+1) t=ai

17、; ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,for(j=1;j=9;j+) 可以嗎?,for(i=1;i=9;i+) 可以嗎?,#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%

18、d ,ai); printf(n); ,提高了效率,#include void main() int a10; int i,j,t; int work; printf(input 10 numbers :n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; work=1; if(!work) break; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,提高了效率,#include void main() int a10; int i,j,t,work,coun

19、t=0; printf(input 10 numbers :n); for (i=0;iai+1) t=ai;ai=ai+1;ai+1=t; work=1; if(!work) break; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n);printf(%dn,count); ,數(shù)組:一種數(shù)據(jù)類型,可以按順序存放同類型的多個數(shù)據(jù)。 例:在一維數(shù)組中存放有某班同學的成績。提示用戶輸入一個成績,程序判斷此成績在數(shù)組中的情況,如果有則輸出其序號,如果沒有則輸出No such grade!,#includ

20、e void main() int i,a,flag=0; int s10=60,60,70,80,80,50,50,60,70,70; printf(please input a grade for search:); scanf(%d, ,輸入公元后的某一個日期(年月日), 輸出該日期是那一年的第幾天。 注意,對于年份值,要求大于0, 否則提示用戶重新輸入; 對于月份值,要求在1到12之間, 否則提示用戶重新輸入; 對于日期值輸入有誤的, 提示用戶重新輸入。,算法: int a12=31,28,31,30,31,30,31,31,30,31,30,31; do 輸入年份 while(不合法

21、年份); do 輸入月份 while(不合法月份); if(閏年) a1=29; do 輸入日期 while(不合法日期); sum=日期; for(i=0;i=月份-2;i+) sum=sum+ai;,#include void main() int a12=31,28,31,30,31,30,31,31,30,31,30,31; int y,m,d,i,sum; do printf(請輸入年份:); scanf(%d, ,如何調(diào)試程序? Insert breakpoint Go Step (右鍵 調(diào)試 debug) Auto Watch,#include void main() int i

22、,sum; for(i=0;i5;i+); sum=+i; printf(第%d天。n,sum); ,#include void main() int a12=31,28,31,30,31,30,31,31,30,31,30,31; int y,m,d,i,sum; do printf(請輸入年份:); scanf(%d, ,練習: 1、數(shù)組中存有10個分數(shù),去掉一個最高分,去掉一個最低分,算出最后得分,并輸出。 (10分制,有小數(shù)),練習: 2、數(shù)組中存有20個分數(shù),去掉2個最高分,去掉2個最低分,算出最后得分,并輸出。 (10分制,有小數(shù)),今天作業(yè): 2.1 2.2 2.3 3.3 3.

23、4,6.3 二維數(shù)組的定義和引用 6.3.1 定義二維數(shù)組,二維數(shù)組定義的一般形式為 類型說明符 數(shù)組名常量表達式常量表達式; 例如:定義a為34(3行4列)的數(shù)組,b為510(5行10列)的數(shù)組。如下: float a34,b510;,不能寫成 float a3,4,b5,10;,C語言中,二維數(shù)組中元素排列的順序是按行存放的,即在內(nèi)存中先順序存放第一行的元素,再存放第二行的元素。下圖表示對a34數(shù)組存放的順序。 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23,6.3 二維數(shù)組的定義和引用 6.3.1 定義二維數(shù)組,二維數(shù)組元素的表示形式為:

24、數(shù)組名下標下標 例如: a23 下標可以是表達式,可以有變量,如 ai-12*j-1,數(shù)組元素可以出現(xiàn)在表達式中,也可以被賦值 例如:b12=a23/2,6.3 二維數(shù)組的定義和引用6.3.2 引用二維數(shù)組的元素,常出現(xiàn)的錯誤有: int a34; /* 定義a為34的數(shù)組 */ a34=3;,在使用數(shù)組元素時,應該注意下標值應在已定義的數(shù)組大小的范圍內(nèi)。,6.3 二維數(shù)組的定義和引用6.3.2 引用二維數(shù)組的元素,每一維下標范圍:0(n-1),可以用下面4種方法對二維數(shù)組初始化:,.分行給二維數(shù)組賦初值。 例如: int a34=1,2,3,4,5,6,7,8,9,10,11,12;,.可以

25、將所有數(shù)據(jù)寫在一個花括弧內(nèi),按數(shù)組排列的順序?qū)Ω髟刭x初值。 例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;,6.3 二維數(shù)組的定義和引用 6.3.3 二維數(shù)組的初始化,.可以對部分元素賦初值。 例如: int a34=1,5,9;,1 0 0 0 5 0 0 0 9 0 0 0,也可對某些行中的某些元素賦初值,如 int a34=1,0,6,0,0,11;,1 0 0 0 0 6 0 0 0 0 11 0,1 0 0 0 5 6 0 0 0 0 0 0,也可以只對某幾行元素賦初值。如: int a34=1,5,6;,.如果對全部元素都賦初值,則定義數(shù)組時對第一維

26、的長度可以不指定,但第二維的長度不能省。 例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;它等價于:int a4=1,2,3,4,5,6,7,8,9,10,11,12;,在定義時也可以只對部分元素賦初值而省略第一維的長度,但應分行賦初值。 例如:int a4=0,0,3,0,10;,0 0 3 0 0 0 0 0 0 10 0 0,算法和程序都是圍繞著變量(內(nèi)存)內(nèi)容進行處理的!不同類型的變量有不同的特點,可解決不同的問題。例如:二維數(shù)組也是一種類型。 如何將二維數(shù)組各元素賦值為我們需要的內(nèi)容?賦初值或使用循環(huán)賦值; 例如:都賦值為100;提示用戶逐個輸入;賦值為一

27、系列有規(guī)律的數(shù)據(jù)(元素的內(nèi)存序號等) 如何讀取二維數(shù)組中的數(shù)據(jù)并處理? 例如:輸出其中的素數(shù) 如何按照二維的形式輸出二維數(shù)組的數(shù)據(jù)?,如何設計算法并實現(xiàn)算法,#include void main() int i,j,k; int s34=0; for (i=0;i3;i+) for (j=0;j4;j+) sij=100; for (i=0;i3;i+) for (j=0;j4;j+) printf(Please input a number:); scanf(%d, ,#include void main() int i,j; int s22; for (i=0;i2;i+) for (j=

28、0;j2;j+) printf(%d ,sij); ,#include void main() int i,j; int s22=0; for (i=0;i2;i+) for (j=0;j2;j+) printf(%d ,sij); printf(n); ,#include void main() int i,j; int s22=0; for (i=0;i2;i+) for (j=0;j2;j+) printf(%d ,sij); printf(n); ,#include void main() int i,j; int s22=0; for (i=0;i2;i+) for (j=0;j2;

29、j+) printf(%d ,sij); printf(n); ,6.3 二維數(shù)組的定義和引用 6.3.4 二維數(shù)組程序舉例,例題 6.4,將一個二維數(shù)組a的行和列的元素互換(即行列轉(zhuǎn)置),存到另一個二維數(shù)組b中。,解題思路,將a數(shù)組中第i行j列元素賦給b數(shù)組中j行i列元素,例如a00賦給b00,a01 賦給b10,a02賦給b20,??梢杂秒p層循環(huán)來處理,用外循環(huán)控制行的變化,內(nèi)循環(huán)控制列的變化。,#include void main() int a23=1,2,3,4,5,6; int b32,i,j; printf(array a:n); for (i=0;i=1;i+) for (j=

30、0;j=2;j+) printf(%5d,aij); printf(n); printf(array b:n); for (i=0; ;i+) for(j=0; ;j+) printf(%5d,bij); printf(n); ,#include void main() int a23=1,2,3,4,5,6; int b32,i,j; printf(array a:n); for (i=0;i=1;i+) for (j=0;j=2;j+) printf(%5d,aij); bji=aij; printf(n); printf(array b:n); for (i=0;i=2;i+) for(

31、j=0;j=1;j+) printf(%5d,bij); printf(n); ,如果把第7行: for (i=0;i=1;i+) 改為: for (i=0;i=2;i+) b會輸出什么?,printf(%5d,aij); printf(%5d,bij); 分別被執(zhí)行多少遍? 兩處 printf(n); 語句 分別被執(zhí)行多少遍? printf(array a:n); printf(array b:n); 被執(zhí)行多少遍?,例題 6.5,有一個班30個學生,己知每個學生有5門課的成績,要求輸出平均成績最高的學生的成績以及該學生的序號。,解題思路,對本題而言,宜用二維數(shù)組,用一行中的各元素存放一個學

32、生的成績,即行代表學生,列代表一門課的成績。要存放30個學生5門課的成績,要用一個30*5的二維數(shù)組。另外,由于要比較各人的平均成績,因此,對每個學生來說,應該存放6個數(shù)據(jù),每人平均成績要計算出來,并存放在數(shù)組中。這樣,數(shù)組的大小就應該是30*6。 設計算法: (1)求每人平均成績,放在數(shù)組每一行的最后一列中; (2)找出最高的平均分,和該學生的序號; (3)輸出最高的平均分,和該學生的序號。,#include void main() int i,j,max_i; float sum,max=-1; float s66=70,80,90,70,90,90,90,100,95,100,60,70

33、,80,90,100, 60,60,70,80,80,50,50,60,70,70,40,50,60,70,80; for (i=0;imax) max=si5; printf(stu_order=%dnmax=%7.2fn,max_i,max); ,#include void main() int i,j,max_i; float sum,max=-1; float s66=70,80,90,70,90,90,90,100,95,100,60,70,80,90,100, 60,60,70,80,80,50,50,60,70,70,40,50,60,70,80; for (i=0;imax)

34、max=si5; max_i=i; printf(stu_order=%dnmax=%7.2fn,max_i,max); ,1、在對數(shù)組初始化時,只對各行的前5列賦初值,第6列默認為0。 2、注意第一個for語句的范圍。請思考能否不要sum=0;這一行?或者把這一句改放到第一個for語句的前面? 3、第三個for語句內(nèi)嵌了一個if語句,用來將5個學生的平均分逐個與max比較,如果符合條件,則同時記錄它的值以及它的序號,如果可以是負分,這道題怎么改?,#include void main() int i,j,k; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int b

35、12; for (i=0,k=0;i3;i+) for (j=0;j4; j+,k+) bk=aij; for(i=0;i12;i+) printf(%d ,bi); printf(n); ,#include void main() int i,j; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int b12; for (i=0;i3;i+) for (j=0;j4;j+) bi*4+j=aij; for(i=0;i12;i+) printf(%d ,bi); printf(n); ,把二維數(shù)組中的元素按照內(nèi)存中存放的順序?qū)氲揭痪S數(shù)組中:,#include voi

36、d main() int i,j,k; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int b12; for (i=0,k=0;i3;i+) for (j=0;j4; j+,k+) bk=aij; for(i=0;i12;i+) printf(%d ,bi); printf(n); ,#include void main() int i,j; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int b12; for (i=0;i3;i+) for (j=0;j4;j+) bi*4+j=aij; for(i=0;i12;i+) printf(%

37、d ,bi); printf(n); ,把二維數(shù)組中的元素按照內(nèi)存中存放的順序?qū)氲揭痪S數(shù)組中:,i是從0到2變化的 j是從0到3變化的 k是從0到11變化的 i*4+j也是從0到11變化的 其中的j是變化了3遍,6.4 字符數(shù)組6.4.1 定義字符數(shù)組及對其初始化,定義方法與其它類型數(shù)組類似。例如: char c10; c0=I;c1= ;c2=a; c3=m;c4= ;c5=h;c6=a; c7=p;c8=p;c9=y;,用字符型變量 char c; 直接表示字符串 怎么樣?,對字符數(shù)組初始化,可逐個字符賦初值。 例如: char c10=I, ,a, m, ,h, a, p, p, y;

38、,6.4 字符數(shù)組6.4.1 定義字符數(shù)組及對其初始化,如果初值個數(shù)小于數(shù)組長度,則只將這些字符賦給數(shù) 組中前面那些元素,其余的元素自動定為空字符。,0代表空字符,ASCII碼值為0; 這與int型數(shù)組初值不足時使用0進行初始化是一致的。,如果提供的初值個數(shù)與預定的數(shù)組長度相同,在定義 時可以省略數(shù)組長度,系統(tǒng)會自動根據(jù)初值個數(shù)確定 數(shù)組長度。,char c=I, ,a,m, ,h, a,p,p,y;數(shù)組c的長度自動定為10。,char d55= , ,*, ,*, ,*, *, , , ,*, ,*, ,*, , ,*,定義和初始化一個二維字符數(shù)組,6.4 字符數(shù)組6.4.2 引用字符數(shù)組,

39、例題 6.6,輸出一個菱形圖,解題思路,先畫出準備輸出的菱形字符圖案,它應當是5行5列,然后逐個寫出其中的字符。,#include void main() char diamond5= , ,*, ,*, ,*,*, , , ,*, ,*, ,*, , ,*; int i,j; for (i=0;i5;i+) for (j=0;j5;j+) printf(%c,diamondij); printf(n); ,6.4 字符數(shù)組6.4.3字符串和字符串結束標志,為了測定字符串的實際長度,C語言規(guī)定了一個字符串結束標志0,作為字符數(shù)組并不要求它的最后一個字符為0 例如: char c5=C,h,i,

40、n,a;,6.4 字符數(shù)組6.4.4 字符數(shù)組的輸入輸出,字符數(shù)組的輸入輸出可以有兩種方法: 逐個字符輸入輸出。用格式符%c輸入或輸出一個字符。 將整個字符串一次輸入或輸出。用%s格式符,意思是對字符串的輸入輸出。,#include void main() char a6=h,e,l,l,o,0; int i; for (i=0;i5;i+) printf(%c,ai); printf(n); printf(%s,a); printf(n); ,#include void main() char a5=h,e,l,l,o; int i; for (i=0;i5;i+) printf(%c,ai

41、); printf(n); printf(%s,a); printf(n); ,#include void main() char a10=h,e,l,l,o; int i; for (i=0;i5;i+) printf(%c,ai); printf(n); printf(%s,a); printf(n); ,作為字符數(shù)組,并不要求一定要有結束標志0 如果沒有0,使用循環(huán)逐個字符輸出(%c)是沒問題的;但是,使用%s作為字符串整體輸出,則會有錯誤,因為系統(tǒng)不知道該字符串到哪里結束,字符串的長度并不總是等于數(shù)組的大小,#include void main() char a10; int i; f

42、or (i=0;i5;i+) scanf(%c, ,輸入abcde 字符串長度為5 數(shù)組大小為10,#include void main() char a10; int i; for (i=0;i5;i+) scanf(%c, ,輸入abcde 字符串長度為5 數(shù)組大小為10,#include void main() char a10=0; int i; for (i=0;i5;i+) scanf(%c, ,輸入abcde 字符串長度為5 數(shù)組大小為10,系統(tǒng)對字符串常量自動加一個 0 例如: #include void main() printf(%sn,abcde); ,在內(nèi)存中數(shù)組c的狀

43、態(tài),#include void main() char a=a,a,a; printf(%s,a); printf(n); ,#include void main() char a=aaa; printf(%s,a); printf(n); ,數(shù)組大小分別是多少?,#include void main() char a10=aaa; printf(%s,a); printf(n); ,#include void main() char a10=a,a,a; printf(%s,a); printf(n); ,數(shù)組大小分別是多少?,#include void main() char a10; a

44、=aaa; printf(%s,a); printf(n); ,#include void main() char a10; a=a,a,a; printf(%s,a); printf(n); ,#include void main() char a10; a=aaa; printf(%s,a); printf(n); ,#include void main() char a10; a=a,a,a; printf(%s,a); printf(n); ,都不對!僅限初始化時可以! 其他時候必須單個元素逐一賦值!,關于%s的說明: 1. 輸出字符不包括結束符 0(見0 就停止,不輸出0 ) 2.用

45、%s格式符輸出字符串時,printf函數(shù)中的輸出項是字符數(shù)組名(a),而不是數(shù)組元素名(ai) 3.如果數(shù)組長度大于字符串實際長度,也只輸出到遇0結束 4.如果一個字符數(shù)組中包含一個以上0 ,則遇第一個0時輸出就結束 5.可以用scanf函數(shù)以%s的方式輸入一個字符串,輸入的字符串帶有0。例如輸入 abc ,數(shù)組中得到的是 a b c 0,#include void main() char a10; int i; scanf(%s,a); for (i=0;i10;i+) printf(%c,ai); printf(n); printf(%s,a); printf(n); ,輸入abc 輸出結

46、果是什么 為什么,這種情況下,不知道循環(huán)需要多少次,可以判斷到達0時結束 for (i=0;ai!=0;i+) 或 for (i=0;ai;i+),scanf函數(shù)讀取字符串,到空格就停止;如果利用一個scanf輸入多個字符串,則在輸入時以空格分隔即可 例如: #include void main() char str15,str25,str35; scanf(%s%s%s,str1,str2,str3); printf(%s %s %s,str1,str2,str3); printf(n); 輸入數(shù)據(jù): How are you?,#include void main() char str120

47、; scanf(%s,str1); printf(%s,str1); printf(n); 輸入 how are you? 得到什么結果,分析圖中所示的字符數(shù)組 用8進制形式輸出數(shù)組c的起始地址 printf(%o,c); printf(%s,c);,6. scanf函數(shù)中以%s輸入字符串時直接用數(shù)組名,不再加地址符 printf(%on,c); printf(%sn,c); /printf(%on, /地址相差1;如果是int數(shù)組則相差4,系統(tǒng)對字符串常量自動加一個0 為了使處理方法一致,在字符數(shù)組中也常常人為地加上一個0 例如: char c6=C,h,i,n,a,0;,6.4 字符數(shù)組,

48、字符數(shù)組也是數(shù)組,輸出時本應使用循環(huán),逐個元素輸出(%c);但是字符和其它數(shù)據(jù)不一樣,常常是一串字符代表一個內(nèi)容,所以引入了字符串統(tǒng)一輸出(%s),作為不同于其它數(shù)組的特殊處理方式,前提是有0作為結束標志,因為數(shù)組大小常常大于字符串真實長度。(例如:定義人名時可以定義為大小為30的字符數(shù)組),例如: 定義了如下的字符數(shù)組 char c=Pascal program; 現(xiàn)在想用一個新的字符串代替原有的字符串,從鍵盤向字符數(shù)組輸入Hello 如果不加0的話,字符數(shù)組中的字符如下 Hellol program,如何輸入Hello?,單個元素分別讀入,#include void main() char

49、 a=Pascal program; int i; for (i=0;i5;i+) scanf(%c, ,#include void main() char a=Pascal program; int i; for (i=0;i5;i+) scanf(%c, ,#include void main() char a=Pascal program; int i; scanf(%s,a); printf(%s,a); printf(n); ,三個程序哪個更好? 為什么? 如果輸入的字符數(shù)不確定,則,在程序中往往需要對字符串作某些操作處理,如字符串的相互賦值、字符串的連接、字符串的比較等 如: ch

50、ar a6=,b6=; a=b; if(a=b) if(a=b) a=a+b; 可以嗎?,6.4 字符數(shù)組 6.4.5字符串處理函數(shù),幾乎都需要使用循環(huán)來解決,如何完成?,對于數(shù)組只能操作其元素, 不能進行整體的操作! 直接寫數(shù)組名代表地址操作!,int 型數(shù)組也不能這樣做,由于字符串操作十分常用,為了免去每次使用都寫循環(huán)操作的麻煩,在C函數(shù)庫中已經(jīng)提供了一些字符串處理函數(shù),實現(xiàn)以上功能,使用十分方便。 下表列出幾種常用的函數(shù):,6.4 字符數(shù)組 6.4.5字符串處理函數(shù),string.h,除了前兩個之外,全部在 string.h 里面,#include void main() char a2

51、0=China; char b20=China; gets(a); puts(a); scanf(%s,b); printf(%s,b); printf(n); ,gets可接受空格 scanf到空格就結束,#include void main() char a20=Chinanaaaaa; puts(a); /printf(%s,a); ,puts()輸出時,自動將字符串結束標志0轉(zhuǎn)換成n , 即輸出完字符串后自動換行,#include void main() char a20=Chinanaaaaa; puts(gets(a); gets函數(shù)有返回值,返回值就是數(shù)組a的地址,所以可以連續(xù)進

52、行puts gets得到的字符串也是帶結束標志的(0),string.h,除了前兩個之外,全部在 string.h 里面,#include #include void main() char a20=China; char b20=China; strcat(a,b); printf(%sn,a); printf(%sn,b); ,strcat的作用是把字符串2接到字符串1的后面,結果放在字符串1中,函數(shù)調(diào)用后得到一個函數(shù)值字符數(shù)組1的地址 例如: char str130=Peoples Republic of ; char str2=China; print(%s,strcat(str1,s

53、tr2); 輸出: Peoples Republic of China,a=a+b是不行的,string.h,除了前兩個之外,全部在 string.h 里面,#include #include void main() char a20=aaaaaaaaaaaaa; char b20=China; strcpy(a,b); printf(%sn,a); printf(%sn,b); ,關于strcpy函數(shù)的幾點說明,1.字符數(shù)組1必須定義得足夠大,以便容納被復制的字符串。字符數(shù)組1的長度不應小于字符串2的長度。,2.字符數(shù)組1必須寫成數(shù)組名形式(如str1),字符串2可以是字符數(shù)組名,也可以是一

54、個字符串常量,如strcpy(str1,China);,3.復制時連同字符串后面的0一起復制到字符數(shù)組1中,4.不能用賦值語句將一個字符串直接給一個字符數(shù)組。 如下面兩行都是不合法的: str1=China; str1=str2; 只能用strcpy函數(shù)將一個字符串復制到另一個字符數(shù)組中。 用賦值語句只能將一個字符賦給一個字符型變量或字符數(shù) 組元素。如下面是合法的: char a5,c1,c2; c1=A; c2=B; a0=C; a1=h; a2=i; a3=n; a4=a;,string.h,除了前兩個之外,全部在 string.h 里面,如果不使用strcpy函數(shù),如何實現(xiàn)字符串復制,#

55、include void main() char a20=China; char b20; printf(%sn,a); printf(%sn,b); ,如果不使用strcpy函數(shù),如何實現(xiàn)字符串復制,#include void main() char a20=China; char b20; int i; for(i=0; ;i+) bi=ai; printf(%sn,a); printf(%sn,b); ,如果不使用strcpy函數(shù),如何實現(xiàn)字符串復制,#include void main() char a20=China; char b20; int i; for(i=0;ai!=0;i+) bi=ai; printf(%sn,a); printf(%sn,b); ,如果不使用strcpy函數(shù),如何實現(xiàn)字符串復制,#include void main() char a20=China; char b20; int i; for(i=0;ai!=0;i+) bi=ai; bi=ai; printf(%sn,a); printf(%sn,b); ,#include #include void main() char a20=China; char b20=China; char c20=aaz;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論