C++ Training > 課題03

以下のコードは、作成者の意図する結果を招いていません (無限ループに陥ってしまう。以下のコードは、タイムアウトとして、無限ループを 防いでいる)。その原因を追求し、コードを修正しなさい。

作成者は「人間が机を指定した位置まで移動させ、移動するに要した時間を 計ろう」としています。

class CDesk
{
public:
  CDesk() { m_iCrntPos = 0; }
  // 位置を移動させる。
  void IncrementPos(int iIncrement)
  {
    m_iCrntPos += iIncrement;
  }

  // 現在の位置を取得する。
  int GetCrntPos() const
  {
    return m_iCrntPos;
  }

private:
  // 現在にいる位置
  int m_iCrntPos;
};

class CHuman
{
public:
  CHuman(int iWorkQuant) { m_iWorkQuant = iWorkQuant; }
  
  // 机を単位時間に移動させる。
  void MoveDesk(CDesk desk)
  {
    desk.IncrementPos(m_iWorkQuant);
  }

private:
  // 机を単位時間に移動させることのできる距離
  int m_iWorkQuant;
}

int main()
{
  CHuman worker(10);
  CDesk  desk;

  int iTime = 0;
  while(1)
  {
    // 机を動かす。
    worker.MoveDesk(desk);

    // 現在の位置を確認する。
    if(desk.GetCrntPos() >= 100)
    {
      break;
    }

    // タイムアウト
    if(iTime > 1000)
      break;

    // 時間をカウントする。
    iTime++;
  }

  if(iTime < 1000)
    cout << "Time: " << iTime << endl;
  else
    cout << "Time out" << endl;

  return 0;
}

Hiroki Wakabayashi, Computer Vision Laboratory.