LAB-12 本練習題為Lab-11的延續,不可用struct,從檔案讀入資料,
並依規定排序後印出部份資料。
除了依照規定把程式寫出來外, 另外, 請注意這次多給三個執行檔:
請測試所給該三個執行檔案:
sortqqq.exe, sortdebug.exe, sortstu.exe
測試時, 除了genscore.c產生資料, 也測試用 gen222.c 產生的資料!
請把測試研究的心得寫到這次的習題心得中。
預告: 下週請改寫為一定要用 struct, 但仍是用自己寫的 sorting 演算法!
(More Hint: 參考五天後會給大家的範例 readstu2.c;
前述 sortqqq.exe, sortdebug.exe, sortstu.exe 都是它產生的)
Due: 一週內 (連同上週共兩週)!
Purpose:
(1)了解struct的重要: 因為不准使用struct, 你將發現很不方便。
(2)了解演算法好壞的重要性: 因為資料多達八萬多筆,
不同的排序演算法差異會在所需時間上顯現出來。
(3)了解不同的資料可能對排序程式執行效率有影響。
(請用相同執行檔去測試genscore.c 和 gen222.c 產生的資料)
說明:
寫一個程式, 不可使用到 struct, 完成以下工作:
從檔案 studat.txt 讀入一堆學生資料, 然後依照規定排序並輸出!
在 studat.txt 裡面每列為一位學生資料,
有學號、姓名、作業成績 h、期中考成績 m、小考成績 q、期末考成績 f,
你要:
(1)讀入資料並先算出每人的學期總成績 :
學期總成績 = (h*0.2 + m*0.3 + q*0.1+f*0.4); (此項印到小數點後兩位)
然後印出 學號, 姓名, 接著各次成績, 以及學期總成績 (以學號為序)
印完學生資料後, (因資料很多, 只印出前面6個, 以及最後面6個)
必須再印出全部同學的 學期總成績之平均, 以及總成績的標準差;
(2)把資料排序, 怎麼做自己決定, 但必須量測sorting時間, 且還要印出:
照學期總成績由高排到低的前面6個, 以及最後面6個(學期總成績最低的)的資料!
(3)再來, 印出照學號由小到大排序的前面6個, 以及最後面6個的資料!
(extra credit: 每列最右邊多印名次)
(4)針對 genscore.c 產生的 studat.txt, 測試所給的三個執行檔
(5)改用 gen222.c 產生的 studat.txt, 再重新測試所給的三個執行檔
(sortqqq.exe, sortdebug.ext, sortstu.exe)
註:
這三個執行檔都是讀取 studat.txt, 然後照學號遞增(Ascending) 排序!
執行時, 可以輸入不同整數以便指示程式去用不同的 sorting function!
sortqqq.exe --- quick sort 是 simple version,
對於已經接近 sorted 的data 是 Worst Case!
sortdebug.exe --- 同sortqqq.exe, 但是
做 quick sort 時是 Debugging mode, 可看到執行過程!
sortstu.exe --- quick sort 是修正版, 不受 data 影響!
* 注意要確定執行檔與資料檔 studat.txt 在同一目錄!
Hint:
(1)資料請用作業區所給的 genscore.c 產生, (也研究該程式 :-)
(2)讀取資料請參考 readtest.c (當然也要研究該程式 :-)
標準差 = sqrt(變異數);
變異數 = (平方和 - 和 * 和 / n ) / n;
所以你讀取資料算出每位學生的學期總成績之後, 要順便一直記住到目前為止
共有幾人 n, 總成績的和, 以及總成績的平方和; 這樣讀完就可算出所需統計資料。
(3)關於 sorting 請參看所給的其他四個 sorting 範例:
bbsort.c, selsort.c, inssort.c, 和 myqsort.cpp (這是C++)
(4)習題程式請用所給的 hwk1213.c 雛形版改寫 (可用C或C++);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(5)要使用何種 sorting 技巧隨你高興, 但都須量測出你 sorting 所花的時間。
** 關於 Sorting 方法, 除看範例外, 也可用 wikipedia 找各種 sorting,
例如 bubble sort, Insertion sort, Selection sort 等!
http://en.wikipedia.org/wiki/Bubble_sort
http://en.wikipedia.org/wiki/Insertion_sort
http://en.wikipedia.org/wiki/Selection_sort
(6)認真的同學可以上網查"C++ STL" 和 "STL sorting algorithm"
再次提醒: 除了產生資料的 genscore.c 和 讀取資料範例 readtest.c,
以及這習題雛形 hwk1213.c 外,也請參考所給的各個範例,包括
範例 bbsort.c, selsort.c, inssort.c, 以及 myqsort.cpp (C++程式)
***以上所有程式,以及本檔案,也可以在備用網站找到:
http://www.cs.nctu.edu.tw/~tsaiwn/introcs/03_Labs/Lab12/