1 / 13

程式設計實習第十三次上課

程式設計實習第十三次上課. 傅榮勝. 再次提醒下週小考. 下個禮拜 6/10 上機小考 考試分兩個時段: 4:10~5:00 U9822118 曾樺陽 ( 含 ) 之前 5:10~6:00 U9822120 王裕意 ( 含 ) 之後. 範例:. 請寫一個函式,其參數如下: 一陣列 此陣列的長度 函式的傳回值為此陣列長度的最大值之駐標,如陣列 A 為 {1 , 2 , 6 , 3 , 2} ,則會傳回 2 ,因為 A[2] = 6

woods
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. 程式設計實習第十三次上課 傅榮勝

  2. 再次提醒下週小考 • 下個禮拜6/10上機小考 • 考試分兩個時段: • 4:10~5:00 U9822118曾樺陽(含)之前 • 5:10~6:00 U9822120 王裕意(含)之後 Jung-Sheng Fu, DEE, NUU, ROC

  3. 範例: • 請寫一個函式,其參數如下: • 一陣列 • 此陣列的長度 • 函式的傳回值為此陣列長度的最大值之駐標,如陣列A為{1,2,6,3,2},則會傳回2,因為A[2] = 6 • 在main function中,先用用亂數產生一個100個元素值為0~100的值之陣列,再呼叫本題的函式找出最大值元素的駐標。 Jung-Sheng Fu, DEE, NUU, ROC

  4. 範例 • 如果上題中除了要傳回最大元素的index之外,也要傳回最大值,該如何做? • 請注意,我們只能有一個傳回值。 • 所以,只能使用參數來接收,但此參數的使用必須使用參考引用或傳址引用,在此我們用較簡單的參考引用。 • 問題:為什麼陣列不用&就可以用參數來接收或改變值? Jung-Sheng Fu, DEE, NUU, ROC

  5. 講解上次作業 • 有些同學上傳的相似度極高,請說明 • P(n, r) = n (n 1)  … (nr +1)表示從n個人中選取r個來排隊的方法數。 • 請寫一個遞迴函式會傳回P(n, r)之值 • 使用二分法的遞迴函式解出aq % n。 Jung-Sheng Fu, DEE, NUU, ROC

  6. 一維陣列的排序處理 (Sorting) • 使用一維陣列時,常常會有需要將陣列的資料依序排列的問題,如:由小到大排序或由大到小排序。 • 在此,若時間允許,我們介紹一種常見的最影單的排序方法(但效能較差): • 汽泡排序法 • 叫用標準函式庫的函式可以省去自己重新寫程式的麻煩。 Jung-Sheng Fu, DEE, NUU, ROC

  7. 汽泡排序法 • 汽泡排序法是一種最容易了解的排序方法,這個方法的運作邏輯為將兩個相臨的汽泡(元素)做比較,比較大的汽泡(元素)就往上浮(右移)。 Jung-Sheng Fu, DEE, NUU, ROC

  8. 汽泡排序法 資料交換 (例:bubble.cpp ) Jung-Sheng Fu, DEE, NUU, ROC

  9. 叫用函式庫內建的排序函式qsort • Qsort的排序效能遠高於汽泡排序法,但稍複雜,有興趣的同學可選修資料結構作進一步的了解。 • 在此我們要學著使用呼叫標準函式庫的qsort。 • 函式庫中的qsort可以 • 支援所有的資料型別(double,int,…等等), • 而且可以定義比較大小的規則,而此規則必須是一個函數,也就是說要用另一個函數當成是它的參數 • 但怎麼可以另函數當參數呢?替代方法是用函數指標當參數 • 因此使用qsort的概念有些複雜,但很重要,請仔細認真聆聽。今天沒有習題,只要照著老師一步步完成並存檔, Jung-Sheng Fu, DEE, NUU, ROC

  10. 函數指標 • 指標不一定要指向資料,它也可以指向函數,稱為函數指標(function pointer)。 • 對於一個函數而言,其名稱即是一個函數指標,永遠指向函數的開頭處。 • 宣告函數指標的語法如下: 資料型態(*函數指標)(參數串列); Jung-Sheng Fu, DEE, NUU, ROC

  11. 快速排序法 • qsort()函數的雛型如下: #include <stdlib.h> void qsort( void *base, size_t nelem, size_t width, int (*fcmp)(const void *e1, const void *e2) ); 其中base指向欲被排序的陣列之開頭處,nelem為陣列的大小, width為每個陣列元素所佔的記憶體空間。 而fcmp則為函數的指標,指向一個使用者自定的比較函數,而該函數的參數為指標,分別指向陣列中的兩個元素,假如 e1>e2 則傳回一正整數,若e1=e2則傳回0,若e1<e2則傳回一個負數。 Jung-Sheng Fu, DEE, NUU, ROC

  12. 定義快速排序法的比較函數 –以整數元素為例 int compare(const void *a, const void *b) { int x, y; x = *((int*)a); //先將指標轉換為正確的指標(整數指標) y = *((int*)b); if( x > y ) return( 1 ); //較大時傳回 +1 if( x < y ) return( -1 ); //較小時傳回 -1 return( 0 ); //相等時傳回0 } 雛型:int (*fcmp)(const void *e1, const void *e2); Jung-Sheng Fu, DEE, NUU, ROC

  13. 使用快速排序法 –以整數陣列為例 #include <stdlib.h> … int compare(const void*a, const void *b); … int main() { int i, j, n, temp; int num[10]; … qsort(num, 10, sizeof(int), compare ); //呼叫快速排序法 … } Jung-Sheng Fu, DEE, NUU, ROC

More Related