Sibainu Relax Room

愛犬の柴犬とともに過ごす部屋

VC98 とストラウストラップのプログラミング入門1

これを書いている横で柴犬は熟睡しています。柴犬は仰向けで寝るのが大好きです。

概要

「ストラウストラップのプログラミング入門」の P145「電卓」まで読み進みました。

ここのコードも一癖ありました。

ここまで読み進めて感じることは、この本の著者は本の中のコードに何か引っかかるところを作っているようです。

計算結果を表示するにも無駄な数値を入れて初めて結果が表示されるようになっていました。これを改善させようと思い起こさせるようとする意図を感じます。

このような本は初めてで、ちょっと愉快な人だと思いました。

電卓

copy

#include "std_lib_facilities.h"

int main()
{
  cout << "Please enter expression (we can handle +, -, *, and /): ";
  cout << "add an x to end expression (e.g., 1+2*3;): ";
  int lval = 0;
  int rval;
  char op;

  cin >> lval;
  if (!cin){
    error("no first operand");
  }

  while (cin>>op){
    cin >> rval;
    if (!cin){
      error("no second operand");
    }

    switch (op) {
    case '+':
      lval += rval;
      break;
    case '-':
      lval -= rval;
      break;
    case '*':
      lval *= rval;
      break;
    case '/':
      lval /= rval;
      break;
    default:
      cout << "Result: " << lval << '\n';
      keep_window_open();
      return 0;
    }
  }
  error("bad expression");
}

VC++ でビルドしてみます。

警告が出ましたが、コンパイルはできているようです。

作成されたファイルを実行してみます。

例の習って、「1」Enter「+」Enter「2」Enter「*」Enter「3」Enter「;」Enterとキーを押下します。結果は表示されません。

「switch」の「default」処理に行くには、適当な数値を入れて進めなければだめですので、ここでは「0」を押下しました。結果は次の画像です。

修正

次のこの部分を

    cin >> rval;
    if (!cin){
      error("no second operand");
    }

このように変えました。

    if (op == '=') {
      rval = 0;
    }
    else {
      cin >> rval;
      if (!cin){
        error("no second operand");
      }
    }

最後この部分に

  error("bad expression");

return 0; を付け加えました。

  error("bad expression");
  return 0;

copy

#include "std_lib_facilities.h"

int main()
{
  cout << "Please enter expression (we can handle +, -, *, and /): ";
  cout << "add an x to end expression (e.g., 1+2*3;): ";
  int lval = 0;
  int rval;
  char op;

  cin >> lval;
  if (!cin){
    error("no first operand");
  }

  while (cin>>op){
    if (op == '=') {
      rval = 0;
    }
    else {
      cin >> rval;
      if (!cin){
        error("no second operand");
      }
    }

    switch (op) {
    case '+':
      lval += rval;
      break;
    case '-':
      lval -= rval;
      break;
    case '*':
      lval *= rval;
      break;
    case '/':
      lval /= rval;
      break;
    default:
      cout << "Result: " << lval << '\n';
      keep_window_open();
      return 0;
    }
  }
  error("bad expression");
  return 0;
}

ビルドしてみます。警告も出なくなりました。

test2.exe の実行

「1」Enter「+」Enter「2」Enter「*」Enter「3」Enter「=」Enterとキーを押下します。結果はすぐに表示されました。

VisualStudioCode でビルドしてみる

結果は何の問題もなくビルドできました。動作も変わりないです。

ファイルの大きさ

VC++で作成したファイルの大きさはVSCodeの3倍近く大きいです。

VC++

VSCode

ここまでとします。