2014年3月17日月曜日

開発環境

C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅢ部(高度な型とクラス)の13章(シンプルなクラス)、13.9(プログラミング実習)、実習 13-5.を解いてみる。

その他参考書籍

実習 13-5.

コード(BBEdit, Emacs)

sample234_5.cpp

#include <iostream>
#include <assert.h>
#include <string>

struct single_card {
  std::string question;
  std::string answer;
};

const int SIZE = 5;

class flash_card {
private:
  int count;
  struct single_card cards[SIZE];
public:
  flash_card(single_card list[]);
  // flash_card(const flash_card& old_flash_card)
  // ~flash_card()
  // operator = (const flash_card& old_flash_card)
  const single_card& get_card();
  void right();
  void wrong();
  bool done();
};

inline flash_card::flash_card(single_card list[])
{
  for (count = 0; count < SIZE; ++count) {
    cards[count].question = list[count].question;
    cards[count].answer = list[count].answer;
  }
  count = 4;
}

inline const single_card& flash_card::get_card()
{
  assert(count >= 0 && count < SIZE);
  
  return cards[count];
}

inline void flash_card::right()
{
  std::cout << "正解!\n";
  --count;
}

inline void flash_card::wrong()
{
  std::cout << "不正解\n";
  struct single_card t = cards[count];
  int i;
  for (i = count; i > 0; --i) {
    cards[i] = cards[i-1];
  }
  cards[i] = t;
}

inline bool flash_card::done()
{
  if (count != -1)
    return false;
  std::cout << "全てのカードを覚えました\n";
  return true;
}

int main()
{
  single_card list[] = {{"a", "あ"},
                        {"e", "え"},
                        {"i", "い"},
                        {"u", "う"},
                        {"o", "お"}};
  flash_card a_flash_card(list);
  struct single_card card;
  std::string answer;

  while (!a_flash_card.done()) {
    card = a_flash_card.get_card();
    std::cout << "外国語(英語): " << card.question << '\n';
    std::cout << "日本語を入力: ";
    std::getline(std::cin, answer);
    if (card.answer == answer)
      a_flash_card.right();
    else
      a_flash_card.wrong();
  }
    
  return (0);
}

Makefile

#
# FSFのg++コンパイラ用のMakefile
#
CC=g++
CFLAGS=-g -Wall
all: sample234_5

sample234_5: sample234_5.cpp
 ${CC} ${CFLAGS} -o sample234_5 sample234_5.cpp

clean:
 rm sample234_5

入出力結果(Terminal)

$ make && ./sample234_5
g++ -g -Wall -o sample234_5 sample234_5.cpp
外国語(英語): o
日本語を入力: お
正解!
外国語(英語): u
日本語を入力: お
不正解
外国語(英語): i
日本語を入力: い
正解!
外国語(英語): e
日本語を入力: い
不正解
外国語(英語): a
日本語を入力: あ
正解!
外国語(英語): u
日本語を入力: う
正解!
外国語(英語): e
日本語を入力: え
正解!
全てのカードを覚えました
$

0 コメント:

コメントを投稿