上級プログラミング 2015 年度前期 第 7 回実験課題 出題日平成27年5月22日(金) 提出先グループ1 甲斐[email protected] グループ2 世木[email protected] グループ3 小花[email protected] グループ4 坂地[email protected] 実習時間内にメールで提出(未完成の場合でも) 未完成の人は次週講義前にメールで再提出すること 掲示板データをファイル「posts.txt」から読み込み,階層的に表示させるプログラムを作成したい.スケルト ン「prac07_skel.cpp」を用いて実装するメンバ関数は以下 4 つである. 1. Post クラスのコンストラクタ 2. Board クラスのコンストラクタ 3. コメントデータを Board クラスのオブジェクトに登録する Board::setPost() 4. Board オブジェクトに登録されたデータを表示する Board::print() ただし,setPost()と print()を作成するにあたり,Post クラスに適宜メンバ関数を追加してもよい. setPost()と print()の仕様は以下の通りである. [setPost()] 引数: コメント ID, 親コメント ID, コメント 返値: なし 動作: 受け取ったデータを元に,*posts 配列に紐づ けた Post オブジェクトを生成する.また,Tree 構造 を再現するために,親コメント ID をもとに Post オブ ジェクトの*re 配列にも生成した Post オブジェクトを 紐づける. [print()] 引数: bool のフラグ 返値: なし 動作: Board オブジェクトに紐づけられているコメ ントデータを表示する.フラグが True の場合は,Tree 構造を再現して表示する.フラグが False の場合は, posts.txt に保存されている順にコメントデータを表 図 1 データの構造 示する. prac07_skel.cpp と posts.txt は,/share/material/advpro/2015/以下にある.posts.txt の中のデータは次 の順に保存されている「コメント ID 親コメント ID コメント」.ただし,親コメント ID が「-1」の場合は, 親が存在しない(root)ことを意味する. 今回作成するプログラムのデータ構造を図 1 に示す.検索用に作成した*posts 配列と Post オブジェクトとそ のメンバ*re 配列で構成される Tree 構造を作成することとなる.ただし,*posts 配列と*re 配列には Post オブ ジェクトのポインタが格納されるため,互いに Post オブジェクトを共有している状態となっている.Tree 構造 を作成するだけで階層表示をできるのだが,今回は Tree 探索を簡単にするために*posts 配列も作成する. ヒント: ツリー構造を処理する場合は,再帰処理にすると楽だよ! スケルトン #include <iostream> int input(Board& b, string fname) { #include <string> ifstream fin(fname.c_str()); #include <fstream> if (!fin) { using namespace std; return 1; } const int MAXRE = 3; // 返信の最大数 const int MAXSIZE = 20; // コメント最大数 int id, pid; string comment; // 投稿されたコメントのクラス while (fin >> id >> pid) { class Post { fin >> ws; private: getline(fin, comment); int id; // コメント ID b.setPost(id, pid, comment); int pid; // コメントの親 ID } string comment; // コメント return 0; Post *re[MAXRE]; // 返信コメントの配列 } public: Post(int = -1, int = -1, string = ""); int main() { int getId(){return id;} Board b; int getPid(){return pid;} if (input(b, "posts.txt") == 1) { void dump(){cout << id << ": " << comment << endl;} cerr << "can not open!" << endl; // メンバ関数を適宜追加してもよい return 1; }; } b.print(false); // Post のコンストラクタを実装せよ cout << "-------------------------------" << endl; b.print(); Class Board { private: return 0; } int index; // 次に入れる post の index を保存 Post *posts[MAXSIZE]; // 全コメントの配列 public: Board(); // コンストラクタ void setPost(int, int, string); void print(bool = true); }; // Board のメンバ関数である Board()と // setPost()、print()を実装せよ ヒント: *(posts[i]).getId()と書くのが大変なので,posts[i]->getId()とアロー演算子を使おう! 実行結果 comsv% prac07 0: The new rift is quite a nerf to Teemo! 1: As much as I despise Teemo, this does look like it would be really irritating for Teemo players. 2: Are you for or against it? 3: Separates the good Teemos from the great Teemos 4: I'm thinking its treated as a neutal player. Since it just blocked ashes ult. 5: Yes. 6: pretending to hate him? maybe we actually hate him, have you ever played against him before? 7: Dad's Ravioli 8: So because you hate him, a nonsensical nerf like this is warranted? 9: i dont hate him, hes utter shit right now, im actually happy to see some dummy pick him in enemy team 10: Yeah, he's extremely weak. 11: Yes ------------------------------0: The new rift is quite a nerf to Teemo! - 1: As much as I despise Teemo, this does look like it would be really irritating for Teemo players. - 2: Are you for or against it? - 5: Yes. - 7: Dad's Ravioli - 6: pretending to hate him? maybe we actually hate him, have you ever played against him before? - 8: So because you hate him, a nonsensical nerf like this is warranted? - 11: Yes - 9: i dont hate him, hes utter shit right now, im actually happy to see some dummy pick him in enemy team - 10: Yeah, he's extremely weak. - 3: Separates the good Teemos from the great Teemos - 4: I'm thinking its treated as a neutal player. Since it just blocked ashes ult.
© Copyright 2024 ExpyDoc