1 / 30

MOI 培訓班提高組 矩陣

MOI 培訓班提高組 矩陣. 澳門電腦學會. 矩陣的重要除蟲設定. {$ifdef debug} {$R+} { Turn on range check } {$Assertions+} … {$else} … {$endif}. 設定的作用.

janina
Télécharger la présentation

MOI 培訓班提高組 矩陣

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. MOI 培訓班提高組矩陣 澳門電腦學會

  2. 矩陣的重要除蟲設定 {$ifdef debug} {$R+} {Turn on range check} {$Assertions+} … {$else} … {$endif}

  3. 設定的作用 • 若設定 {$R+} 的話, 當以下情況出現時, 程式就會出現 run-time errorvar a: array[1..10] of integer; i: integer;begin i:=11; a[i] := 20; { run-time error here! } writeln (i); • 若沒有設定 {$R+} 的話, 以上的程式就會正常地運行, 當然結果是錯的!

  4. {$R+} • 矩陣越界是個容易出錯的地方 • 矩陣越界通常會引起一些難以除錯的問題, 如部份變量無故地改變i:=11; a[i] := 20; writeln (i); • {$R+} 減慢程式執行的速度, 但若根據除蟲架構建立程式的話, 正式版中將不會受影響

  5. 矩陣的應用

  6. 排序 • 基本上一定要熟識以下的排序的方法 • Quick Sort • Radix Sort • Quick sort 可以應用在一般的排序需要 • Radix sort 則應用在一些較特殊的情況下

  7. Quick Sort QuickSort(A, p, r) IF p<r THENBEGIN q := Partition(A, p, r) QuickSort(A, p, q-1) QuickSort(A, q+1, r) END;

  8. Partition Partition (A, p, r) x := A[r] i := p – 1 FOR j:=p TO r -1 DO IF A[j] <= x THEN i := i + 1 exchange(A[i], A[j]) exchange(A[i+1], A[r]) REUTRN i+1

  9. Partition 的步驟 p,j p i i r j r 2 8 7 1 3 5 6 4 2 1 3 8 7 5 6 4 p,i j r p i j r 2 8 7 1 3 5 6 4 2 1 3 8 7 5 6 4 r p,i p i j r 2 8 7 1 3 5 6 4 2 1 3 8 7 5 6 4 r p i p,i j r 2 8 7 1 3 5 6 4 2 1 3 4 7 5 6 8 r p i j 2 1 7 8 3 5 6 4

  10. Bucket Sort BucketSort (A) n := sizeofdata(A[i]) FOR i:=1 TO n DO insert A[i] into list B[n_of(A[i])] concatenate lists B[1], B[2], …, B[3]

  11. 例子 001 101 011 010 011 100 101 111

  12. 010 100 001 101 011 010 011 100 101 111 0: 001 101 011 011 101 111 1: 010 100 001 101 011 011 101 111

  13. 100 001 101 101 010 100 111 001 101 011 011 101 0: 010 111 011 011 1: 100 001 101 101 010 111 011 011

  14. 001 010 011 011 100 001 101 101 010 111 011 011 0: 100 101 101 111 1: 001 010 100 011 011 101 101 111

  15. 倒水架構 • 利用兩個一維矩陣輪流運算來代替二維矩陣 • 例子: PASCAL 三角形的計算 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1

  16. PASCAL 三角形的計算 (1) VAR PT: ARRAY [0..100, 0..100] OF integer; n, c: integer; BEGIN PT[0,0] := 1; FOR n:=1 TO 100 DOBEGIN PT[n,0] := PT[n,n] := 1; FOR c:=1 TO n-1 DO PT[n,c] := PT[n-1,c-1] + PT[n-1,c] END;

  17. PASCAL 三角形的計算 (2) VAR PT: ARRAY [1..2, 0..100] OF integer; a, b, i, j, : integer; BEGIN fillchar(t, #0, sizeof(t)); { 將矩陣初始化 } PT[1,0] := PT[2,0] := 1; a := 2; b := 1; FOR i:=1 TO 100 DOBEGIN FOR j:=1 TO i-1 DO PT[a,j] := PT[b,j-1] + PT[b,j]; PT[a,i] := 1; b := 3-b; a := 3-a; { 將 a, b 交換 } END;

  18. PASCAL 三角形的計算 (3) VAR PT: ARRAY [0..100] OF integer; n, c, a, b: integer; BEGIN PT[0] := 1; FOR n:=1 TO 100 DOBEGIN a := PT[0]; FOR c:=1 TO n-1 DOBEGIN b := PT[c]; PT[c] := a + b; a := b; END; PT[n] := 1; END;

  19. 高精度運算 • 用字符串或字符矩陣來表示一個多位數字 • Number: ARRAY [1..1000] OF char; • 另一種可能: Number: ARRAY [1..1000] OF byte; • 運算只限於每個單位數字 • 方便輸入及輸出 • 用整數矩陣來表示一個多位數字: • Number: ARRAY [1..1000] OF integer; • 長整數 12345678900345678 將會表示成:(5678, 34, 6789, 2345, 1, 0, 0, 0, …) • 每個整數表示部份連續的位數 • 方便運算, 不便輸入及輸出

  20. 整數矩陣多位數字加法例子 VAR A: ARARY [1..1000] OF integer; … carry := 0; FOR i:=1 TO n DOBEGIN A[i] := A[i] + B[i] + carry; IF A[i] > 9999 THENBEGIN carry := 1; A[i] := A[i] – 10000; END ELSE carry := 0; END;

  21. Stack and Queue • Stack • First in last out • 操作: push, pop • 應用例子: 運算式操作, 遞歸控制 • Queue • First in first out • 操作: putq, getq • 應用例子: 廣度搜索

  22. Stack 的結構 • 定義 Stack: ARRAY [1..1000] OF Items; sp: integer; { stack pointer } • 操作 InitStack sp := 1; Push (item) stack[sp] := item; sp := sp + 1; Pop (item) sp := sp – 1; item := stack[sp];

  23. Stack 例子 –後序式運算 • 後序式為一算式表達方法, 其運算符號在兩個參數的後面 • 例 10 34 + (代表 10 + 34) • 基本算法: WHILE There_is_more_token DOBEGIN ReadToken (token); IF is_number(token) THEN push (token) ELSE { The token is an operator }PerformOP(token, pop(), pop()); END;

  24. PerformOP (token, data2, data1); BEGIN IF is_add(token) THEN push(data1 + data2) ELSEIF is_sub(token) THEN push(data1 – data2) ELSE … END;

  25. 中序算式運算 • 中序算式例子: 34 + 4 * 5 • 運算要合符先乘徐, 後加減的四則運算原則 • 更複雜的例子將包括括號在內 • 如: 3 * (12 – 4 * (2 + 1))/(2 – 1) • 基本算法提示: • 需要用兩個 stack • 一個用以放參數 • 另一個用作存放運算符號

  26. Queue 的基本數據結構 • 定義 var queue: ARRAY [0..100] OF item; Qhead, QTail: integer; • 操作 InitQueue QTail := QHead := 0; PutQ (item) queue[QTail] := item; QTail := QTail + 1; DeQueue (item); item := queue[Qhead]; Qhead := Qhead + 1;

  27. Queue 的應用例子 • 廣度搜索 • 例: 行迷宮, 由 s 走到 e 的最短路線 e s

  28. [(8,2)0] 1 [(7,2)1,(8,3)1] 2 [(8,4)2,(7,2)1] 2 [(6,2)2,(8,4)2] 3 [(8,5)3,(7,4)3,(6,2)2] e 3 3 2 1 2 2 1 0 1 1 2 3 …

  29. Head Tail 環狀 Queue • 由於Queue內的數據永遠是由尾加入,由頭取出, 經一段時時運行之後, Queue 的內容會不斷往矩陣的一方走 • 這時候可以用環狀 Queue 來解決問題 Tail Head

  30. 功課 • 每個星期將會有一定的功課需要完成 • 題目將通過比賽系統獲行並將答案經比賽系統上傳 • 每次功課必須在下星期四晚上十二時前完成 • 第一次功課取得的網址請留意MCA論壇的公報

More Related