120 likes | 287 Views
計算機程式語言. 常問問題彙整解答 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.
E N D
計算機程式語言 常問問題彙整解答 TAChanning & Tom 2013/04/18
記憶體存取錯誤 • 宣告過大陣列造成程式當掉 • Bubble Sort • 質數
記憶體存取錯誤 • 你的程式當掉了!>"< 原因:使用到不該用的記憶體沒有通過試驗。:( • 假設宣告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 作業系統不會給程式存取權!!
宣告過大陣列造成程式當掉 • 為何在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() • { • … • }
Bubble Sort • 對一個陣列內的數值兩兩比較,每次得到一個最大值,最大值要往上浮 Ex: 陣列 n[10]
Bubble Sort • 1. 決定每次要比較的陣列範圍 • 2. 在已知範圍內實際去比較 需要比較的陣列範圍 0~9 需要比較的陣列範圍 0~8
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 至少要比較幾次?
質數 • 利用陣列的 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 • 找到質數並且對他的倍數做更新
質數 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++; }
質數 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++; }
質數 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++; }
質數 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++; }