1 / 12

計算機程式語言

計算機程式語言. 常問問題彙整解答 TA Channing & Tom 2013/04/18. 記憶體存取錯誤 宣告過大陣列造成程式當掉 Bubble Sort 質數. 記憶體存取錯誤. 你的程式當掉了! >"< 原因:使用到不該用的記憶體 沒有通過試驗。 :( 假設宣告 int a[4] int i ; for ( i = 0; i < 4; i ++) a[ i ] = i *5; for ( i = 0; i <= 4; i ++) a[ i ] = i *5;. 片段 A. 作業系統配置給程式使用. 片段 B.

debbie
Download Presentation

計算機程式語言

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. 計算機程式語言 常問問題彙整解答 TAChanning & Tom 2013/04/18

  2. 記憶體存取錯誤 • 宣告過大陣列造成程式當掉 • Bubble Sort • 質數

  3. 記憶體存取錯誤 • 你的程式當掉了!>"< 原因:使用到不該用的記憶體沒有通過試驗。:( • 假設宣告int a[4] inti; for (i = 0; i < 4; i ++) a[i] = i*5; for (i = 0; i<= 4; i ++) a[i] = i*5; 片段A 作業系統配置給程式使用 片段B 作業系統不會給程式存取權!!

  4. 宣告過大陣列造成程式當掉 • 為何在main()宣告 int a[1000][1000]會造成程式當掉,但是int a[700][700]就不會,而且編譯程式也有成功? #include <stdio.h> main() { int a[1000][1000]; } • 程式語言的限制,解決辦法? • 把大陣列宣告在main()的外面(比較不好的作法) • 動態分配記憶體(好的做法,進階的程式語言議題,有興趣者可以google:D) • #include <stdio.h> • int a[1000][1000]; • main() • { • … • }

  5. Bubble Sort • 對一個陣列內的數值兩兩比較,每次得到一個最大值,最大值要往上浮 Ex: 陣列 n[10]

  6. Bubble Sort • 1. 決定每次要比較的陣列範圍 • 2. 在已知範圍內實際去比較 需要比較的陣列範圍 0~9 需要比較的陣列範圍 0~8

  7. Bubble Sort for (i=m-2; i>=0; i++) {<= 先決定要比較的陣列範圍 for (j=0; j<=i; ++j) {<=兩兩比較範圍的數值 if (n[j] > n[j+1]) { swap n[j], n[j+1] } } } 若陣列長度為 10 那 Bubble Sort 至少要比較幾次?

  8. 質數 • 利用陣列的 index 來篩選出質數 a[2], a[3], a[4], a[5] … a[n] • 先假設全部數字都是質數,所以設定為 0 a[2] = 0, a[3] = 0, a[4] = 0, a[5] = 0 … a[n] = 0 • 找到質數並且對他的倍數做更新

  9. 質數 for(i=2; i<=n; i++) <= 先假設全部的數都是質數 a[i] = 0; j = 2; while (j*j <= n) { while (a[j] == 1){ <= 要先找到一個質數 (a[] = 0) j++; } for(i=2*j; i<=n; i+=j){ <= 更新這個質數的倍數 a[i] = 1; } j++; }

  10. 質數 j = 2; while (j*j <= n) { while (a[j] == 1){ <= 要先找到一個質數 (a[] = 0) j++; } for(i=2*j; i<=n; i+=j){ <= 更新這個質數的倍數 a[i] = 1; } j++; }

  11. 質數 j = 2; while (j*j <= n) { while (a[j] == 1){ <= 要先找到一個質數 (a[] = 0) j++; } for(i=2*j; i<=n; i+=j){ <= 更新這個質數的倍數 a[i] = 1; } j++; }

  12. 質數 j = 2; while (j*j <= n) { while (a[j] == 1){ <= 要先找到一個質數 (a[] = 0) j++; } for(i=2*j; i<=n; i+=j){ <= 更新這個質數的倍數 a[i] = 1; } j++; }

More Related