英単語のクイズを出すプログラムを作成
問題はファイルから読み込む。 en:jaのような形式しか受け付けていないのでイケてない。
yamlとかtomlとかで定義したかったけど時間が、、、、
英語をkey、日本語をvalueとしてmapを作る そして、そのmapのvectorを作る
英語と日本語で対応しているのでmapを使用した。 全てのmapリストが欲しかったのでvectorを使用した。 配列でいいと思ったがvectorのほうが扱いやすそうだったのでvectorにしました。
indexアクセス(言葉が正しいかわかりませんが)を用いてないのでlistコンテナでもいいかと思いました。
英語をkey、日本語をvalueとしてmapを作る
ファイルを読み込んでmapに格納した。
読み込んた文字列をkeyとvalueに分けるために':'を基準に分割した
Dictionaryクラスを導入した。
mapをメンバ変数として持つだけのクラス。
文字列から初期化するコンストラクタを持つ、そして、ユーザー入力を受け取り答えがあっているか判定し結果を表示する処理を持つ。
このプログラム場合クラスを用いないほうがシンプルな処理になると思う。
メンバ変数dict dict: map<string, string>型を格納するためのメンバ変数
コンストラクタsplit関数を使用している。 これは区切り文字を受け取りその文字の前と後で文字列を分割し、vectorに格納して返す関数である。
ループでぶん回して区切り文字を探している。
clang++でコンパイルした
./a.outのように実行した
以下のコマンド clang++ main.cpp ./a.out
#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <vector>
using namespace std;
typedef string Ja;
typedef string En;
typedef map<Ja,En> Dict;
typedef vector<Dict> Dicts;
vector<std::string> split(const std::string &str, char sep);
map<string, string> analyze_file(string str);
// 無理やり導入したクラス
// mapをメンバ変数として持つだけ
class Dictionary {
public:
Dict dict;
// StringからDictを作る
Dictionary(string str) {
vector<string> v = split(str, ':');
En en = v[0];
Ja ja = v[1];
dict[en] = ja;
}
// 正解かどうかチェックする
void answer() {
for(auto itr = dict.begin(); itr != dict.end(); ++itr) {
cout << itr->second<< "の英語は?";
string answer;
cin >> answer;
if(answer == itr->first)
cout << "正解\n";
else
cout << "不正解\n";
}
}
};
int main(int argc,char *argv[]) {
string filename = argv[1];
std::ifstream ifs(filename);
std::string str;
if (ifs.fail()) {
std::cerr << "Failed: load file" << std::endl;
return -1;
}
vector<Dictionary> dicts;
while (getline(ifs, str)) {
dicts.push_back(Dictionary(str));
}
for(auto dict = dicts.rbegin(); dict != dicts.rend(); ++dict) {
dict->answer();
}
cout << "おつおつ!\n";
}
// stringにsplitがないらしいので作成
vector<std::string> split(const std::string &str, char sep) {
std::vector<std::string> v;
auto first = str.begin();
while( first != str.end() ) {
auto last = first;
while( last != str.end() && *last != sep )
++last;
v.push_back(std::string(first, last));
if( last != str.end() )
++last;
first = last;
}
return v;
}
なし
なし
30分 ~ 1時間
2時間