演習7

上級プログラミング 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.