實驗8 羣體類、流類庫與輸入/輸出(4學時)

一、 實驗目的

  1. 瞭解鏈表類的定義與實現,學習其使用方法;
  2. 瞭解棧類的定義與實現,學習其使用方法;
  3. 瞭解隊列類的定義與實現,學習其使用方法;
  4. 瞭解C++標準模板庫STL的使用方法。
  5. 熟悉流類庫中常用的類及其成員函數的用法。
  6. 學習標準輸入輸出及格式控制;
  7. 學習對文件的應用方法(二進制文件、文本文件)。

二、 實驗任務

  1. 編寫程序link.h實現教材中例9.6的鏈表類。在測試程序lab9_1.cpp中定義兩個整型鏈表A和B,分別插入5個元素,然後把B中的元素加入A的尾部。
    (題解:實驗8.1 鏈表類的定義與實現)
  2. 編寫程序queue.h,用鏈表實現隊列(或棧)類。在測試程序lab9_2.cpp中定義一個整型隊列(或棧)對象,插入5個整數,壓入隊列(或棧),再依次取出並顯示出來。
    (題解:實驗8.2 隊列類的定義與實現)
  3. 使用C++標準模板庫(STL)中的雙向隊列類(deque)重新實現上一小題。
    (題解:實驗8.3 C++標準模板庫(STL)中的雙向隊列類(deque))
  4. (選做)定義course(課程)類,有屬性:課程名char name[21]、成績short score;在實驗七中的student類中增加屬性:所修課程courses,爲課程類對象的鏈表。在測試程序中測試這個類。學生類與課程類關係如圖9-1所示。
    在這裏插入圖片描述
    圖9-1 類圖
  5. 觀察以下程序的輸出,注意對輸出格式的控制方法;
//lab11_1.cpp
#include <fstream>
using namespace std;
#define D(a) T << #a << endl; a
ofstream T("output.out");

void main() {
  D(int i = 53;)
  D(float f = 4700113.141593;)
  char* s = "Is there any more?";

  D(T.setf(ios::unitbuf);)

  D(T.setf(ios::showbase);)
  D(T.setf(ios::uppercase);)
  D(T.setf(ios::showpos);)
  D(T << i << endl;)
  D(T.setf(ios::hex, ios::basefield);)
  D(T << i << endl;)
  D(T.unsetf(ios::uppercase);)
  D(T.setf(ios::oct, ios::basefield);)
  D(T << i << endl;)
  D(T.unsetf(ios::showbase);)
  D(T.setf(ios::dec, ios::basefield);)
  D(T.setf(ios::left, ios::adjustfield);)
  D(T.fill('0');)
  D(T << "fill char: " << T.fill() << endl;)
  D(T.width(8);)
  T << i << endl;
  D(T.setf(ios::right, ios::adjustfield);)
  D(T.width(8);)
  T << i << endl;
  D(T.setf(ios::internal, ios::adjustfield);)
  D(T.width(8);)
  T << i << endl;
  D(T << i << endl;) // Without width(10)

  D(T.unsetf(ios::showpos);)
  D(T.setf(ios::showpoint);)
  D(T << "prec = " << T.precision() << endl;)
  D(T.setf(ios::scientific, ios::floatfield);)
  D(T << endl << f << endl;)
  D(T.setf(ios::fixed, ios::floatfield);)
  D(T << f << endl;)
  D(T.setf(0, ios::floatfield);) // Automatic
  D(T << f << endl;)
  D(T.precision(16);)
  D(T << "prec = " << T.precision() << endl;)
  D(T << endl << f << endl;)
  D(T.setf(ios::scientific, ios::floatfield);)
  D(T << endl << f << endl;)
  D(T.setf(ios::fixed, ios::floatfield);)
  D(T << f << endl;)
  D(T.setf(0, ios::floatfield);) // Automatic
  D(T << f << endl;)

  D(T.width(8);)
  T << s << endl;
  D(T.width(36);)
  T << s << endl;
  D(T.setf(ios::left, ios::adjustfield);)
  D(T.width(36);)
  T << s << endl;

  D(T.unsetf(ios::showpoint);)
  D(T.unsetf(ios::unitbuf);)
}
  1. 編寫程序,用二進制方式打開指定的一個文件,在每一行前加行號。
  2. (選做)使用實驗十中的學生類數組,輸入數據,顯示出來,使用I/O流把此數組的內容寫入磁盤文件,再顯示出文件內容。

三、 實驗步驟

  1. 參照教材中鏈表類LinkedList的定義(教材中的例程9-6.h),給出其實現,注意合理使用Node類(教材中的例程9-3.h)的成員函數。在測試程序中定義整型鏈表A和B,分別插入5個元素,使用循環語句顯示鏈表中的元素,然後把B中的元素加入A的尾部,再顯示出來。
  2. 隊列類的特點就是其元素的操作順序爲先入先出(FIFO),用上題中的鏈表類實現隊列類,用鏈表類的成員函數實現隊列類的成員函數,在測試程序中定義一個整型隊列對象,觀察隊列類中元素先入先出的特點。
  3. 在程序中包含語句#include ,使用deque類的方法push_back()、empty()、pop_front()完成上一小題的要求。程序名:lab9_3.cpp。
  4. 觀察實驗任務5題目中程序的輸出,學習對輸出格式的控制方法;嘗試更改輸出語句中的參數,以加深對輸出格式的理解;
  5. 編寫程序lab11_2.cpp使用void main(int argc, char* argv[])函數中的參數傳遞操作的文件名,定義ofstream 的對象對文件進行操作,使用getline成員函數讀入數據,使用cout輸出字符到文件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章