资源描述
Click to edit Master text styles,Second Level,Third level,Fourth level,Click to edit Master title style,*,Chapter 6,陣列,(Array),不切實際的使用了太多的變數,/*,不切實際的例子,用了一堆變數*,/,#include,int,main(void,),/,用,10,個變數來儲存學生的成績,int,A,B,C,D,E,F,G,H,I,J;,/,從標準輸入取得,10,位學生的成績,/,分別儲存在,A J,的變數裡面,/,對每位學生的成績作處理,/,讓使用者查詢每位學生的成績,/,結論是,:,不切實際的使用了太多變數,2,陣列是什麼,陣列是由,相同型態,的相關資料項所組成的一種資料結構,陣列元素都是,連續,的存放在記憶體裡面的,陣列必須有哪些東西,陣列名稱,陣列名稱也是識別字,一對中括號,陣列足標,(Subscript),必須是整數或整數運算式,怎麼存取陣列內的元素,透過陣列名稱,陣列足標,name0,name1,name2,陣列的名稱,c,陣列裡面的所有元素都具有,相同的名稱,陣列,c,內元素的位置編號,c6,-45,6,0,72,1543,-89,0,62,-3,1,c0,c1,c2,c3,c9,c8,c7,c5,c4,3,怎麼使用陣列,使用陣列元素就好像使用變數一樣,c3=1;,printf(%d,c3);,陣列足標可以是運算式,c5-2,跟,c3,跟,c10-7,是一樣的,c10,跟,cx,是一樣的,(,如果,x=10),c5,跟,cx+y,是一樣的,(,如果,x+y=5),4,宣告陣列,如同變數一樣,陣列在使用前必須先宣告,宣告方法,陣列型態,陣列名稱,陣列大小,陣列大小必須為,常數值,,不能是變數值,例子,:,int,c,10,;,float,grade,64,;,如何宣告同一型態的許多陣列,?,如同我們宣告相同型態的變數一樣,int,c10,d100,x8;,陣列的足標從,0,開始,,n-1,結束,int c3,擁有三個陣列元素,c0,、,c1,、,c2,int xn,擁有,n,個陣列元素,x0,、,x1xn-1,5,陣列初始化,(1/2),宣告的時候給定初始值,int c5=1,2,3,4,5;,編譯器會在編譯的時候偷偷幫我們加入以下的指令,c0=1;c1=2;c2=3;c3=4;c4=5;,如果初始值的數目小於陣列的元素個數,剩下的元素將自動設定為零,int c5=1,2,3;,c0=1,c1=2,c2=3,c3=0,c4=0,如果初始值的數目大於陣列的元素個數,會造成語法錯誤,int c5=1,2,3,4,5,6;,如果省略陣列元素個數,則編譯器會根據初始值的個數來決定陣列的大小,int c=1,2,3;,產生,3,個元素的陣列,6,透過指定運算子來初始化陣列的元素,通常會配合重複結構來做設定的動作,int count,c5;,for(count=0;count 5;count+),ccount,=,count;,初始化的動作是在,執行時期,才會做的,如果陣列的元素數目過多,會很浪費執行時間,尤其是位於某函式裡面的陣列,每次呼叫這個函式,都需要初始化陣列一次,減少初始化所需的時間,把陣列的儲存媒體變成靜態,static,int c5;,則初始化的動作會在程式開始執行前就做好,陣列初始化,(2/2),7,意見調查分析程式,/*,統計,40,位學生對餐廳的意見評分*,/,#include,#define,PERSON,40,#define,SIZE,10,void,main(),int,count;,int,response,PERSON,=1,2,6,4,8,5,9,7,8,10,1,6,3,8,6,10,3,8,2,7,6,5,7,6,8,6,7,5,6,6,5,6,7,5,6,4,8,6,8,10;,int,frequency,SIZE,=0;,for,(count=0;count,PERSON,;count+),+frequencyresponsecount-1;,printf(%s%17sn,評分等級,人數,);,for,(count=0;count SIZE;count+),printf(%8d%17dn,count+1,frequencycount,);,評分等級 人數,2,2,2,2,5,11,5,7,1,3,1,2,3,4,5,6,7,8,9,10,8,樹狀圖程式,/*,用來印出樹狀統計圖的程式*,/,#include,#define,SIZE,10,void,main(),int,i,j;,int,n,SIZE,=19,3,15,7,11,9,13,5,17,1;,printf,(%s%13s%17sn,分數,人數,統計圖,);,for,(i=0;i,SIZE,;i+),printf,(%4d%13d ,i*10,ni);,/,印出分數跟人數,for,(j=0;j ni;j+),/,畫出長條圖,printf,(,%s,);,printf(n);,9,再看,Fibonacci,數列,/*,用陣列來儲存,Fibonacci,數列*,/,#include,#define,SIZE,10,void,main(),int i;,int,F,SIZE,=,0,1,;,for,(i=2;i SIZE;i+),Fi=Fi-1+F i-2;,for,(i=0;i SIZE;i+),printf(F(%2d)=%2dn,i+1,Fi);,F(1)=0,F(2)=1,F(3)=1,F(4)=2,F(5)=3,F(6)=5,F(7)=8,F(8)=13,F(9)=21,F(10)=34,10,使用陣列時要注意的事,當使用陣列的元素時,不能超出陣列的範圍,int c5;,則使用,c6,時,會得到意想不到的結果,同理,使用,c-1,時,也會得到意想不到的結果,編輯器並不會幫我們檢查陣列的足標是不是在合理的範圍內,我們必須要自行檢查,11,字元陣列,char string =first;,first,是字串常數,(String Literals),編譯器會根據字串的長度來決定字元陣列的大小,string,這個陣列到底多大,?,string0=f,string1=i,string2=r,string3=s,string4=t,string5=0;,0,稱為字串結束字元,(null character),C,裡面所有字串均以此字元作為結束,此種用法只能在宣告時使用,不能寫成,char string6;string=first;,也可以個別設定字元陣列的元素,char string =f,I,r,s,t,0,;,12,基本的字串處理,#include,char*,strcpy(char,*,目的字串,char*,來源字串,),包含結尾符號,(NULL),:,0,char*,strncpy(char,*,目的字串,char*,來源字串,n),不包含結尾符號,(NULL),:,0,char*,strcat(char,*,字串,1,char*,字串,2),字串,2,第一個字元會蓋掉字串一的,NULL,char*,strncat(char,*,字串,1,char*,字串,2,n),字串,2,的,n,個字元會皆在字串,1,的後面,並在最後補上結尾符號,0,13,字串轉換,#include,int,atoi(char,*string),long,atol(char,*string),double,atof(char,*string),字串轉數字的函式,輸入皆為字串,long,strtol,(,char*,來源字串,char*,剩餘字串,int,基底,),double,strtod(char,*,來源字串,char*,剩餘字串,),優點:能將剩餘的部分傳回,以方便做其他處理,14,從鍵盤讀取字串,/*,透過,scanf,從鍵盤讀取字串到程式裡面*,/,#include,int,main(void,),char,string40;,int,i;,printf(“,請輸入字串:,);,scanf(%s,string);,printf(“,您輸入的字串為:,%sn,string,);,/,印出字元陣列裡面的個別元素,for,(i=0;stringi!=,0,;i+),printf(%c,stringi);,printf(n);,return 0;,請輸入自串:,this is,您輸入的字串為:,this,t h i s,15,Get,家族,#include,char*,gets(char,*s),一次抓一字串,需要給記憶體,int,getchar(void,),一次抓一字元,傳回該字元的,ASCII,碼,16,用,gets(),改寫,/*,透過,scanf,從鍵盤讀取字串到程式裡面*,/,#include,int,main(void,),char,string40;,int,i;,printf(“,請輸入字串:,);,gets(string,);,printf(“,您輸入的字串為:,%sn,string,);,/,印出字元陣列裡面的個別元素,for,(i=0;stringi!=,0,;i+),printf(%c,stringi);,printf(n);,return 0;,請輸入自串:,this is,您輸入的字串為:,this is,t h i s i s,17,用,getchar,(),改寫,/*,透過,scanf,從鍵盤讀取字串到程式裡面*,/,#include,int,main(void,),char,string40;,int,i=0,c;,printf,(“,請輸入字串:,);,do,c=,getchar,();,stringi,+=c;,while(c,!=n);,stringi,=0;,printf,(“,您輸入的字串為:,%sn,string,);,/,印出字元陣列裡面的個別元素,for,(i=0;stringi!=,0,;i+),printf(%c,stringi);,printf(n);,return 0;,請輸入自串:,this is,您輸入的字串為:,this is,t h i s i s,18,從鍵盤讀取字串說明,如果使用,scanf,來讀取,必須使用轉換指定詞,%s,後面直接給定字元陣列的名稱即可,無須加上,&,字元陣列的名稱就是其在記憶體裡面的起始位址,scanf,會從輸入緩衝區讀取字元進來,一直遇到空白字元為止,潛在性的危險,?,當使用者輸入的字串長度大於用來接收的字元陣列大小時,怎麼印出來,?,透過,printf,,並且使用轉換指定詞,%s,printf,會一直列印此陣列中的字元,一直遇到結束的,null,字元為止,19,若想傳遞陣列引數,(Arguments),至某個函式時,只需指定陣列的名稱即可,int,pass20,;,function_call(,pass,);,C,會自動的以模擬,傳參考呼叫,(Call by Reference),的方式來將陣列傳給函式,亦即被呼叫的函式能更改位於呼叫者中的原始陣列,陣列的名稱其實便是陣列的第一個元素的位址,所以事實上我們是把位址傳過去,被呼叫的函式就知道陣列放在哪個記憶體位址,當然我們也可以只傳入陣列的某個元素,就好像我們傳入,一般的變數,一樣,call_function(pass10);,傳遞陣列到函式裡面,20,函式的原型宣告怎麼寫,若某一個函式想要接收一個陣列,(,位址,),,要怎麼寫原型宣告,void function_call(,int a),;,或者,void function_call(,int,);,但是通常我們會在傳入的時候,順便跟函式講我們傳入的陣列的大小,可以避免函式存取到不是在陣列範圍裡面的東西,void function_call(,int,int,);,中括號裡面不需要指定陣列的大小,就算指定,編譯器也不會理它,所以我們必須,另外用一個引數,來告訴函式我們傳入的陣列大小,21,傳入陣列到函式,/*,傳入陣列到函式裡面*,/,#include,void,testfunc(,int,int,);,void,main(),int,a5=1,2,3,4,5,count;,printf,(,呼叫前陣列內容:,);,for(count=0;count 5;count+),/,印出陣列元素,printf(%d,acount);,testfunc(a,5);,printf(,n,呼叫後陣列內容:,);,for(count=0;count 5;count+),/,印出陣列元素,printf(%d,acount);,void,testfunc(,int,b,int,size,),int,count;,for,(count=0;count size;count+),bcount*=2;,呼叫前陣列內容:,1 2 3 4 5,呼叫後陣列內容:,2 4 6 8 10,22,多維陣列,(Multiple-Subscripted Arrays),多維陣列儲存的順序,常用來表示以列,(row),和行,(column),組成的表格,若要指出多維陣列裡面的某一個元素,用兩個足標,一個指出所在的列,一個標示所在的行,多維陣列的維度可以超過,2,個,ANSI C,規定至少必須支援,12,維,第,0,列,第,1,列,第,2,列,第,0,行,第,1,行,第,2,行,第,3,行,a 0 0,a 1 0,a 2 0,a 0 1,a 1 1,a 2 1,a 0 2,a 1 2,a 2 2,a 0 3,a 1 3,a 2 3,列足標,陣列名稱,行足標,23,多維陣列,(Multiple-Subscripted Arrays),多維陣列,連續空間,先行,(column),再列,(row),a 0 0,a 0 1,a 0 2,a 0 3,a 1 3,a 2 0,a 2 1,a 2 2,a 1 0,a 1 1,a 1 2,a 2 3,24,多維陣列設定初值,可以在宣告的時候設定其初始值,範例一,:,int b22=1,2,3,4 ;,int b22=1,2,3,4;,範例二,:,int b22=1,3,4;,int b22=1,0,3,4;,範例三,:,int b22=1,2,3;,int b22=1,2,3;,1,0,3,4,1,2,3,4,1,2,3,0,25,矩陣相乘,A,B,C,C00=A00*B00+A01*B10;,C01=A00*B01+A01*B11;,C02=A00*B02+A01*B12;,C21=A20*B01+A21*B11;,C22=A20*B02+A21*B12;,26,矩陣相乘,A,B,C,i,j,for(i,=0;i3;i+),for(j,=0;j3;j+),/,計算,cij,27,矩陣相乘,A,B,C,i,j,如何計算,cij,i=1,j=1;,c11=A10*B01+A11*B11;,第,i,列乘以第,j,行,c,i,j,=A,i,k*B k,j,;,28,矩陣相乘,A,B,C,i,j,for(i,=0;i3;i+),for(j,=0;j3;j+),for(k,=0;k2;k+),cij,+=,Aik,*,Bkj,;,29,矩陣相乘,/*,矩陣相乘的例子*,/,#include,void,main(),int,A32=1,2,3,4,5,6;,int,B23=1,2,3,4,5,6;,int,C33=0;,int,i,j,k;,for,(i=0;i 3;i+),for,(j=0;j 3;j+),for,(k=0;k 2;k+),Cij+=Aik*Bkj;,for,(i=0;i 3;i+),for,(j=0;j 3;j+),printf(%2d,Cij);,printf(n);,9 12 15,19 26 33,29 40 51,30,
展开阅读全文