課題1(4/18出題)


課題

行単位での入力は,stringに対してgetlineで読み込むのが楽です.例として行を読み込んでvectorに貯めて,ファイルの最後まで読み込んだら出力するだけのC++プログラム0.ccを紹介します.
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main(){
  vector<string> lines;
  for (string line; getline(cin, line); ){
    lines.push_back(line);
  }
  for (size_t i = 0; i < lines.size(); ++i){
    cout << lines[i] << endl;
  }
}
getlineについて説明します. C++ Referenceでgetlineを検索するとstd::getline(string)の説明にあるように,istream型のオブジェクト(引数として渡したストリームと同一)の参照を返します.ifの条件でこれを使うと,operator boolによって,bool型の値(true or false)に変換されるのですが,ファイルの終端 EOF(end of file) まで来たのにgetlineを呼んだ後のcinをbool型に変換するとfalseになります.それにより,ファイルの終端を判別できます.なお,
  for (string line; getline(cin, line); ){
    lines.push_back(line);
  }
の代わりに,istreamのEOFをチェックするメンバ関数eofを明示的に呼び出して,
  for (string line; getline(cin, line), !cin.eof(); ){
    lines.push_back(line);
  }
と書いても同じです(EOF以外のエラーでgetlineが終了した時にループを抜けられないことを除いて).

出力例

チェック用に,テスト用の入力sample.txtと1-9の出力例を示します(9は乱数を使うので, 答えが一致している必要はありません).1-8の出力例に誤りを見つけたら指摘す ると評価が高くなります. たとえば,サンプルのプログラム 0.cc の場合は,
g++-5 -o 0 0.cc
としてコンパイルして,作成された実行ファイル(Mac環境では 0 )を
./0 < sample.txt > 0.out
として実行すると,ファイル 0.out が作られる(「<」や「>」でコマンドの入力や出力をファイルに割り当てられる.詳しくはHWB:15.5パイプとリダイレクションを参照のこと).
diff 0.out 0.txt
を実行して出力例と一致していることを確認する(diffは2つのテキストファイルの異なる行を表示するコマンド).

ヒント

STLのうちの以下のデータ構造を用いる(リンク先は http://www.cpluscplus.com )と良いでしょう.

提出方法

作成したすべてのプログラムと,各プログラムに関する簡単な説明をまとめた プレインテキスト形式(テキストエディタで編集可能な形式)またはPDF形式の ファイルを1つ作成して,ITC-LMSの「課題1(4/18出題)」(4/18の講義時間中に公開される予定)に提出してください.

2問解けない場合は1問でも提出して構いません.

締切は,4/30(日) 23:59.締切を過ぎても2017年7月末までは6割を上限に採点します.


オプション課題

課題だけで物足りない人は,以下のオプション課題にも取り組んでください.