第六章 結構型態 本書於2-2節已介紹若干基本資料型態,像是整數、實數、布林、字元及字串等,本章則針對一些進階的資料型態予以介紹,如陣列(Array)、記錄(Record)及集合(Set)。 6-1 陣列 6-2 動態物件變數與動態物件陣列 6-3 紀錄 6-4 集合
6-1 陣列 處理少量的資料,可以為每一筆資料設定一個變數,但如果資料量非常龐大,譬如一個班級的50位同學成績,若分別設定A1、A2…A50等50個變數,則是一件相當麻煩的事。為了解決大批的資料處理,遂有陣列(Array)的使用。要儲存一個班級的數學成績可以宣告一個一維陣列,例如 A: array[1..50] of integer代表50個人的數學成績,則A[1]可以用來表示1號同學的數學成績。若要表達每班每人的國、英、數三科成績時,可以宣告一個二維陣列 A: array[1..3, 1..50] of integer來表示,其中A[1][1]表示1號國文成績、A[1][2]表示1號英文成績、A[1][3]表示1號數學成績,A[2][1]則表示2號國文成績,依此類推。同理,如果一年級有12班,則可以宣告一個三維陣列A: array[1..12, 1..3, 1..50] of integer來儲存,其中A[7][42][2]代表7班42號英文成績,以此類推。如果一個學校有三個年級則可宣告一個四維陣列A: array [1...3, 1...12, 1...3, 1...50] of integer來儲存,其中A[2][8][24][3]表示二年級八班24號數學成績。
Delphi使用陣列的步驟: 陣列變數宣告 陣列型態宣告 使用陣列的第一步驟為宣告一個陣列型態,語法如下: 型態名稱 = array[陣列下標..陣列上標] of 資料型態 以上語法說明如下: 1. 型態名稱應符合2-1節的識別字命名規則。 2. 資料型態可以是任一資料型態。 3. 以下敘述為宣告MyArray是一個一維整數陣列型態。 type MyArray=array [1..8] of integer; //陣列型態宣告 陣列變數宣告 於第三章,我們已知道一般變數宣告如下: i : integer; 以上敘述是宣告 i 為整數型態變數,陣列變數的宣告同基本資料型態, 以下敘述即為宣告a, b均是MyArray的陣列型態。 var a ,b:MyArray; //陣列變數宣告 經過以上的宣告,a與b陣列各配置8個單位的記憶體,如下所示。 a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] b[1] b[2] b[3] b[4] b[5] b[6] b[7] b[8] 以上陣列型態及陣列型態變數的宣告,通常可合而為一,如下所示: var a ,b:array [1..8] of integer; //陣列型態變數宣告
陣列初值 Delphi的陣列是使用中括號([ ]),以下式子為設定a陣列的索引2初值為3。 a[2]:=3; 此外,C與Java語言皆可於陣列的宣告中設定初值,但到目前為止,除了常數陣列外,尚無法於陣列宣告中,一併給予初值。
陣列的運算 以下語法可將a[2] 的值取出。 c:= a[2];
陣列的複製 兩個相同型態與大小的陣列,可以互相複製。其複製語法如下,則b陣列的每一元素均與a陣列相同。 b:=a;
範例6-1a 本範例示範 1. 陣列型態的宣告。 2. 陣列變數的宣告。 3. 陣列初值的設定。 4. 陣列的存取與運算。 5. 陣列的輸出。 6. 陣列的複製。
範例6-1b 請使用陣列讀入5個學生的國文成績, 並可由使用者輸入座號來查詢成績。
範例6-1c 同上範例,但計算平均、最高分及最低分
範例6-1d 請寫一程式將任意十進位轉為N進位。 (2≦N≦16)
泡沫排序法 於一數列當中,從第一筆資料逐一往後兩兩給予比較,若前者大於後者,則兩者交換(本例為由小而大排序,若由大而小排序,則當前者小於後者時,兩者交換),每次的比較與交換均可得該數列的最大值於數列最右邊(末端),所以若有N筆資料進行排序,則應作N-1階次的逐一比較,且每階次的逐一比較範圍均逐漸減一個,此即為泡沫排序法(Bubble Sort)。若有8、9、7、1、2五筆資料,則其排序過程如下: 1.將資料由左而右排列如下: 8 9 7 1 2 2.共有五筆資料n=5,共須進行四個階次的逐一比較,每一階次都能將該階次的最大值移至最右邊,四個階次的逐一比較細節說明如下:
(2)從第一筆到第四筆資料兩兩比較,若前者大於後者,則兩者交換如下,得次大值8於右邊。8與9已達定位,待會兒不用參與比較。 (1)從第一筆到第五筆兩兩比較,若前者大於後者則兩者交換如下,得最大值9於最右邊。9已是最大值,待會兒不必參與比較,所以下一次只要從第一筆比較至第四筆即可。 (2)從第一筆到第四筆資料兩兩比較,若前者大於後者,則兩者交換如下,得次大值8於右邊。8與9已達定位,待會兒不用參與比較。 (3)從第一筆資料到第三筆資料兩兩比較,若前者大於後者則兩者交換如下,得第三大值7於右邊。 i=1 比較前 8 9 7 1 2 j=1 2 3 4 比較次數 ^ ^ ^ ^ 比較四次 比較後 8 7 1 2 9 i=2 比較前 87129 j=1,2,3 比較次數 ˇˇˇ 比較三次 比較後 71289 i=3 比較前 71289 j=1,2 比較次數 ˇˇ 比較二次 比較後 12789
(4) 從第一筆資料到第二筆資料兩兩比較,若前者大於後者則兩者交換如下,排序完成。 3.若有N筆資料,則應作N-1階次的比較與交換,每階次的比較範圍均逐漸縮小[N-1,N-2,...,1],其比較次數總計約為[N*N]/2,資料交換次數約為[N*N]/4 4.以上每次均找到一個最大值於右邊,若將該次搜尋所得最大值與右邊位置交換,則可大大減少資料交換次數,且其比較次數不變仍為[N*N]/2,但其資料交換次數總計約為N,請讀者自行練習。 i=4 比較前 12789 j=1 比較次數 ˇ 比較一次 比較後
範例6-1e 示範泡沫排序法。 1. 設有n筆資料進行排序。 2. for i:=1 to n-1 do 程式說明: 1. 設有n筆資料進行排序。 2. for i:=1 to n-1 do 應進行n-1階次尋找最大值,並將最大值移至最右邊。 3. for j:=1 to n-i do 每一階次均應逐次尋找最大值,並移至右邊,且每階次的比較次數j與外迴圈i的關係為i+j=n,所以內迴圈的比較次數j為1 to n-i。 4. if a[j])>a[ j+1] then 兩兩逐一比較,若前者大於後者則兩者交換。
計數排序法 前面的泡沫排序法是採用兩兩比較並交換,達到由小而大或由大而小排列的效果,不過本節的計數排序法則是不移動資料,而直接給予排序名次。為了充份理解計數排序法的原理,先假想在一個N位學生的教室裡,每人均舉著自己的分數,每一學生如何知道自己是第幾名呢?有一個辦法就是每個人均數一數分數比自己高的人數再加一,就是自己的名次,但其比較次數還是N*N,所以若令他們排成一排,由第一個逐一往右比較,且分數低的,令其名次加1,則第二個人就不必與第一個比較,同理,第三個也是往右比較即可,不必與第一、二個人比較,所以其總比較次數約為[N*N]/2,此即為計數排序法。現有數列資料8、2、9、7、1,則其演算過程如下:
2.共有五筆資料,分別以前四筆資料為基準往右比較: 1. 先假設每人均為第一名 2.共有五筆資料,分別以前四筆資料為基準往右比較: (1)以第一筆資料8為基準往右(第二、三、四、五筆)比較,分數低的名次加一,則其名次如下,第一筆資料8確定為第二名,下次不用再參與比較。 (2) 以第二筆資料2為基準往右(第三、四、五筆)比較,分數低的名次加一,則其名次如下,第二筆資料2確定為第四名,下次不用再參與比較。 分數 8 2 9 7 1 名次 * 分數 8 2 9 7 1 名次 ** **** * 分數 8 2 9 7 1 名次 ** **** * ***
3. 若有N筆資料,則需作N-1階次的比較,每階次的比較次數均逐漸縮小,分別為N-1,N-2,...,1,故其總比較次數約為[N*N]/2。 (3) 以第三筆資料9為基準往右(第四、五筆)比較,分數低的名次加一,則其名次如下,第三筆資料9確定為第一名,下次不用參與比較。 (4) 以第四筆資料7為基準往右(第五筆)比較,分數低的名次加一,則其名次如下,全部名次確定,排序完成。 3. 若有N筆資料,則需作N-1階次的比較,每階次的比較次數均逐漸縮小,分別為N-1,N-2,...,1,故其總比較次數約為[N*N]/2。 分數 8 2 9 7 1 名次 ** **** * 分數 8 2 9 7 1 名次 ** **** * *****
範例6-1f 示範計數排序法。
多維陣列 二維以上的陣列稱為多維陣列,以下敘述是宣告一個二維的整數陣列: var a:array[1..2, 0..3] of integer ; 以上二維陣列共有8個位置,如下: a[1,0] a[1,1] a[1,2] a[1,3] a[2,0] a[2,1] a[2,2] a[2,3] 關於二維陣列的存取,其程式片段如下: a[1,1] := 2; //設定陣列值 b:= a[1,2] ; //取陣列值 同理,三維陣列的宣告方式如下,本例共宣告了2*3*4=24個位置,如下所示 b[0,1,2] b[0,1,3] b[0,1,4] b[0,1,5] b[0,2,2] b[0,2,3] b[0,2,4] b[0,2,5] b[0,3,2] b[0,3,3] b[0,3,4] b[0,3,5] b[1,1,2] b[1,1,3] b[1,1,4] b[1,1,5] b[1,2,2] b[1,2,3] b[1,2,4] b[1,2,5] b[1,3,2] b[1,3,3] b[1,3,4] b[1,3,5] var b:array[0..1, 1..3, 2..5] of string ; 三維陣列的存取方式如下: b[0,1,2]:='Good';
範例6-1g 假設有學生成績如下: 1. 請以二維陣列儲存以上資料。 2. 計算每人平均。 3. 統計每人名次。 4. 統計每人不及格科數。 1. 請以二維陣列儲存以上資料。 2. 計算每人平均。 3. 統計每人名次。 4. 統計每人不及格科數。 5. 統計各科平均。 座號 國文 英文 數學 平均 名次 不及格科數 1 50 60 70 2 30 40 3 80 90 4 66 77 88 5 22 33 44
〔自我練習〕 同上範例,但增加統計各科不及格人數
線性搜尋法 於序列中,從頭到尾逐一比對搜尋的方式,稱為線性搜尋法,請看以下範例。
範例6-1h 設有員工電話如下,請以陣列儲存, 並能輸入姓名而查得電話號碼。 編號 姓名 電話號碼 1 aa 1111168 2 hh 2222168 3 cc 3333168 4 gg 4444168 5 ff 5555168 6 ii 6666168 7 ee 7777168 8 bb 8888168 9 jj 9999168 10 dd 1688168 11 kk 2688168 12 ll 3688168
二分搜尋法 前面的線性搜尋法,是採用逐一訪視的方式搜尋所要的資料,但當資料量龐大時,就顯得毫無效率。舉例而言,資料數量若有1000筆,採用線性搜尋法平均搜尋次數為500次,但若採用本節所討論的二分搜尋法,則至多不會超過10次 (210=1024)。使用二分搜尋法前,應先將資料予以排序完成。在一個已排序的序列中,先與序列的中間值比較,若待搜尋資料比中間值大,則待搜尋資料必在此中間值的後面,反之則在前面,所以二分搜尋法每次可將搜尋範圍減半,如此對於龐大資料量時,可提高搜尋效率,其演算法如下: input k; //搜尋字串 l = 1; //陣列下標 u=n; //陣列上標 found = false; //搜尋旗號 while ((l<=u) and (found = false)){ m=(l+ u)/ 2; // m為待比較註標 case compare (k,a[ m]) { ">":l= m+1; //提高下標 "=":found= true;? a[ m]; //找到了 "<":u= m-1; //降低上標 } if ( found= false) ?"查無此人";
範例6-1i 同上範例,但使用二分搜尋法。
動態陣列 前面所提到的陣列,均是在程式設計階段即指定陣列的大小,此又稱為靜態陣列。但有許多情況是在設計階段時並不知道應該分配多少記憶體空間給陣列,而是於執行階段再依陣列所需大小,給予分配記憶體空間,此即稱為動態陣列。動態陣列的用法是於陣列宣告時先不宣告其大小,以下為宣告一個一維的整數型態的動態陣列: var a: array of integer ; 其次,於程式執行階段設定陣列大小,其程式如下: setLength (a,5) ; 上式為設定陣列長度為5,且陣列下標為0,可使用的陣列分別是a[0]、a[1]、a[2]、a[3]、及a[4]共5個。
範例6-1j 請以動態陣列重作範例6-1b。
動態多維陣列 動態多維陣列是重複使用array of,例如以下式子可宣告一個二維的整數型態動態陣列。 var a: array of array of integer ; 其次,於程式執行階段設定陣列大小如下: setLength (a, 3, 2) ; 以上敘述共宣告以下6個陣列。 a[0,0]:=0;a[0,1]:=1 ; a[1,0]:=2;a[1,1]:=3 ; a[2,0]:=4;a[2,1]:=5 ; 關於以上動態多維陣列的用法,請自行開啟檔案mulDyArray。
6-2 動態物件變數與動態物件陣列 元件除了可於設計階段佈置外,亦可於執行階段再產生。於設計階段所佈置好的元件稱為靜態物件;於執行階段產生的物件,則稱為動態物件。此外,變數可分為一般變數(例如a或b)及一維或二維的陣列變數(例如c [ ] 或 d[ ][ ])那麼物件變數是否亦可為一維,二維或動態一維與二維呢?答案是肯定的,物件變數也有一維、二維…等物件陣列及動態一維、二維…等物件陣列,請看本節說明。 物件變數或物件陣列的使用步驟有三:宣告物件變數或物件陣列、動態產生物件或物件陣列,以及物件變數或物件陣列的存取。分別說明如下:
宣告物件變數或物件陣列 setLength(edi,5); 以下敘述宣告一個edi的二維陣列,其型態為TEdit。 var edi TEdit; 以下敘述宣告一個edi陣列變數,其型態為TEdit。 var edi: array [0...5] of TEdit; 以下敘述宣告一個lbl動態陣列變數,其型態為TLabel,並設定其長度為5。 var lbl: array of TLabel ; setLength(edi,5); 以下敘述宣告一個edi的二維陣列,其型態為TEdit。 edi: array [0...5, 0...5] of TEdit;
動態產生物件 動態產生物件的程序如下: 1. 使用Create方法,新增一個物件或物件陣列。 2. 使用Parent屬性,設定此物件的容器物件。 3. 使用Text屬性,設定物件的內容。 4. 使用Left及Top屬性,設定物件的位置。 5. 使用Height及Width屬性,設定物件的大小。 6. 使用Show方法,顯示物件。 以下程式片段可新增一個edi物件。 edi:=TEdit.Create(Owner); //動態產生 edi 物件 edi.Parent:=Form1; //設定此物件的容器物件為 Form1 edi.Text:=IntToStr(5); edi.Left:=60; edi.Top:=60; edi.Height:=30; edi.Width:=60; edi.Show;
以下程式片段可新增一個edi的一維物件陣列 for i:= 0 to 4 do begin edi[i]:=TEdit.Create(owner); edi[i].Parent:=Form1; edi[i].Text:=IntToStr(i); edi[i].Left:=10+40*i; edi[i].Top:=60; edi[i].Width:=30; edi[i].Height:=10; edi[i].Show; end;
存取物件 動態產生的物件其存取方式同一般靜態物件,以下敘述可存取物件edi的內容。 Form1.Caption:= edi.Text;
範例6-2a 示範動態物件的用法。
範例6-2b 示範一維物件陣列的產生及資料的存取。
範例6-2c 示範一個動態物件陣列的產生及資料的存取。
範例6-2d 示範二維物件陣列的產生。
範例6-2e 請用物件陣列讀入指定的數字,並求極大值、極小值及平均。
矩陣相乘 矩陣的行列定義如下,下式為3行2列。 矩陣要能相乘,則第一個矩陣行數要等於第二個矩陣的列數,且相乘結果的行數等於第二個矩陣的行數,列數則為第一矩陣列數。 則任一子集合Cmp如下: a00 a01 a02 A23= a10 a11 a12 C22=A23 X B32
例如: 則計算過程如下: c00=a00*b00+a01*b10+a02*b20=-1*1+0*2+3*-1=-4 c01=a00*b01+a01*b11+a02*b21=12 c10=a10*b00+a11*b10+a12*b20=6 c11=a10*b01+a11*b11+a12*b21=-11 以下敘述為以上說明的演算法: for (i=0;i<m;i++) //2 for (j=0;j<p;j++) //2 { c[i][j]=0; for (k=0;k<n;k++) //3 c[i][j]=c[i][j]+a[i][k]*b[k][j]; }
範例6-2g 示範矩陣相乘。
6-3 記錄 前面6-1節,曾提及同一陣列的資料型態必須一致,但在程式設計時常常面對同一筆記錄需有不同的資料型態,例如一個學生的成績,即含有姓名、國文、英文、數學等欄位,若要使用陣列表示,則要宣告成一個一維的字串陣列和一個二維的數值陣列,如此造成程式撰寫的困難。本節的record(記錄型態)即可以解決同一筆記錄擁有不同資料型態的問題。
記錄型態宣告 記錄型態宣告的內容為宣告記錄型態所含的欄位及每一欄位的資料型態,其語法如下: type 記錄型態名稱=record 欄位1 : 型態 ; 欄位2 : 型態 ; . 欄位n : 型態 ; end; 以上語法說明如下: 1. 記錄型態名稱與欄位名稱的命名同2-1節的識別字命名。 2. 欄位的型態可為Delphi的任一資料型態。 3. 以下程式片段可定義一個學生的成績記錄型態,其型態名稱為Tstudent,共含有4個欄位, 分別為name、chi、eng及math。 Tstudent=record name:string; chi:integer; eng:integer; math:integer; end ;
記錄變數的宣告 記錄型態一經宣告後,即為一種使用者自訂的資料型態,其用法同Delphi內訂的資料型態,以下敘述宣告變數a的型態為使用者自訂的Tstudent型態。 var a Tstudent ; 上式的變數a,其型態為使用者自訂的記錄型態Tstudent。
記錄欄位的存取 記錄欄位的存取方式為在記錄變數與欄位之間加上點( .)運算子,以下敘述可設定變數a的欄位內容。 a.name='洪子堯'; a.chi=90; a.eng=98; 若配合with敘述的使用,亦可寫成: with a do end;
陣列型態與記錄型態的綜合使用 於6-1節介紹陣列型態時,曾提到陣列型態可使用任一資料型態,那陣列的內容宣告是否可為使用者自訂的record型態呢? 答案當然是肯定的,以下敘述即為宣告Tstu型態為Tstudent型態 type Tstu= array[1...10] of Tstudent 若宣告變數b的型態為Tstu如下,則變數b即擁有10筆記錄的陣列資料 var b: Tstu; 變數b完成宣告後,即可分別設定一號或二號同學的記錄內容如下 b[1].name:='洪子堯'; //一號的姓名 b[1].chi:=88 ; //一號的國文成績 b[2].name:='蔣冠雄'; //二號的姓名 b[2].chi:=96 ; //二號的國文成績
欄位陣列 前面所介紹的陣列內容為記錄,那記錄的內容是否可為陣列呢?答案是肯定的。 上式Tstudent型態的chi、eng及math均為integer,所以Tarray重新定義如下: type Tarray=record name:string; score:array[1...3] of integer; end ; 其次,若再定義Tarr的型態為Tarray、且變數d為Tarr型態如下: Tarr=array[1...10] of Tarray; Var d:Tarr ; 則Tarr型態的變數d,其資料的存取,如下所示: d[1].name:='洪子堯'; //一號的姓名 d[1].score[1]:=90 ; //一號的第一科成績 d[1].score[2]:=90 ; //一號的第二科成績 d[2].name:='蔣冠雄'; //二號的姓名 d[2].score[3]:=90 ; //二號的第三科成績
範例6-3a 假設有學生成績資料如下: 1. 宣告一個結構型態儲存以上資料。 2. 計算每人各科成績的平均。 請完成以下功能: 1. 宣告一個結構型態儲存以上資料。 2. 計算每人各科成績的平均。 3. 平均若低於60分,則於備註欄加註"Done"。 4. 輸出由大而小排列。 5. 計算各科平均。 座號 姓名 國文 英文 數學 平均 備註 1 素環真 80 90 70 2 洪國勝 20 10 3 洪俊維
6-4集合 集合型態是Delphi所特有,其它的程式語言如C++、VB及Java均無此型態(筆者註:資料型態的演進是越來越少且單純),而它與數學上的集合是相同的。
集合型態的宣告 以下為集合型態的宣告語法。 type Tmyset= set of基本型態; 上式的基本型態是指Delphi的序數(Ordinal)型態(請看2-2節)的子集,其個數不可超過256個(從0到255)。
集合型態的變數宣告 集合型態的變數宣告與前面所有型態的變數宣告相同,以下敘述為宣告一個集合型態變數 以上a、b、c三個變數宣告亦可簡化如下: type T1=1...10 //T1是Subrange 型態 T2=(Red, Yellow, Green) //T2是Enumerated 型態 T3='A'...'F' //T3是Subrange 型態 Tset1=set of T1; Tset2=set of T2; Tset3=set of T3; var a: Test1; b: Test2; c: Test3; 以上a、b、c三個變數宣告亦可簡化如下: a: set of 1...10 ; b: set of (Red, Yellow, Green); c: set of 'A'...'F'; 以下讓我們來看看錯誤的變數宣告,因為其個數都超過256個。 d: set of integer; e: set of real; f: set of string; g: set of char;
集合的設定 集合元素的設定是採用中括號,以下敘述分別是設定集合a、b、c的內容: a:=[1,2,3] b:=[Red, Yellow, Green] c:=[A,D] 以上集合型態的變數所含元素,可以是型態宣告中的任一子集合(當然也包含空集合),以變數a為例,下列皆可為a的內容。 a:=[1,2] a:=[ ] //空集合 a:=[3,4,9]
集合的運算 集合的運算有聯集、差集、交集、包含於、包含、等於、不等於及屬於等運算,Delphi的集合運算亦包含以上集合運算,如下表所示。 運算子符號 功 能 運算元型態 結果型態 範 例 + 聯集 set 集合1+集合2 - 差集 集合1-集合2 * 交集 集合1*集合2 <= 包含於 Boolean 集合1<=集合2 >= 包含 集合1>=集合2 = 等於 集合1=集合2 <> 不等於 集合1<>集合2 in 屬於 ordinal, set 元素in集合 關於集合的範例,請看範例12-3a。
集合的輸出 設定集合的元素 a:=[1,2,3]; 如何印出集合a呢?很抱歉,目前Delphi還沒有提供此項功能,若一定要印出集合內容,必須寫一段小程式,逐一於型態中檢查每一元素是否屬於(in)所要印出的集合。如前面的T1 = set of 1...10,就只好從1到10逐一去判斷每一元素是否屬於(in)a集合。 滑鼠操作事件傳回值中的TShiftState型態,即是集合型態的應用,詳細說明及用法,請看12-3節。
習題 1.試設計一程式,可以求所輸入2階或3階行列式的值 2.試設計一程式,能將輸入的10進位轉成2進位。例如(10.5)10=(1010.1)2。 3.試設計一程式,能將輸入的2進位轉成 10進位。例如(1100.11)2=(12.75)10。 4.試規劃一個陣列: (1)內含欄位如下: 姓名、姓別、身高、體重、年齡、收入、學歷及電話等8個欄位。 (2)請自行輸入資料且將以上資料讀入陣列。 (3)王小姐徵友條件為男性,身高介於175~165cm,收入高於40000,試列出合於條件的人選。 (4)請規劃一個查詢系統,可以滿足不同的查詢要求。 5.設某班有5人,每人有3科成績,其所佔學分分別為6、4及3,試以陣列的方式讀入姓名、座號及任意三種科目成績,並計算其學分平均,輸出按照學分平均由高而低排列。 6.同上題可輸入姓名查詢其任意三種科目成績及平均,若姓名不存在,並輸出“查無此人”。
7. 某班有25人,某次計概電腦閱卷答案如下: A C D E B(每題20分) (1) 請分別讀入每人答案。 (2) 計算每人成績(空白不計分,答錯倒扣5分) (3) 計算全班平均。 (4) 統計各區間學生人數(例如90~99共幾人,80~89 共幾人等)。 (5) 計算及格人數。 (6) 製作報表如下: 一、個人成績 二、全班成績區間統計 三、答題狀態統計 8. 讀寫一程式,可以將所輸入的阿拉伯數字轉為國字大寫,例如123轉為壹佰貳拾參,30000轉為參萬,100050轉為壹拾萬零伍拾。
9.我們回想國中老師如何找小於50的質數時,其方法是將2~50的自然數寫在黑板上,如下圖,然後其演算步驟如下,即可找出小於50的質數。 1 4 6 8 9 10 × × × × × 11 12 13 14 15 16 17 18 19 20 × × × × × × 21 22 23 24 25 26 27 28 29 30 × × × × × × × × 31 32 33 34 35 36 37 38 39 40 × × × × × × × × 41 42 43 44 45 46 47 48 49 50 × × × × × × × (1)將2圈起,並把2的倍數全部打×,故將4,6,8,10,12,…,50,全部打×。 (2)從2往大數找,將第1個沒被打×者圈起,故圈到3,並將3的3倍,4倍,5倍…全部打×。 (3)從3往大數找,將第一個沒被打×者圈起,故圈到5,並將5的5倍,6倍…打×。 (4)以此類推,直至圈到大於SQR(50) 的整數為止,還沒被打×者皆為質數。 請用以上演算法找出1至1000或1至1000000的所有質數,其次,你能找到更快的演算嗎?
10. 請寫一個程式,可以輸入一個奇數,並動態的產生一個方陣,且此方陣的橫向、直向與斜線的和均相同,例如輸入3得下圖左,輸入5得下圖右。 10. 請寫一個程式,可以輸入一個奇數,並動態的產生一個方陣,且此方陣的橫向、直向與斜線的和均相同,例如輸入3得下圖左,輸入5得下圖右。 8 1 6 17 24 15 3 5 7 23 14 16 4 9 2 13 20 22 10 12 19 21 11 18 25