連載
» 2018年07月18日 10時00分 公開

山浦恒央の“くみこみ”な話(108):バグ検出ドリル(8)電卓プログラムのような小さなプログラムにもバグがいる (3/4)

[山浦恒央 東海大学 大学院 組込み技術研究科 非常勤講師(工学博士),MONOist]

4.今回の問題

 学生が作る、「カレーのレシピ」程度の数十行程度のプログラムでも、バグなしで作ろうとすると簡単ではありません。バグは、いろいろな場所にこっそり、あるいは、堂々と潜んでいます。どんなプログラムでも、バグを的確に見つける能力は非常に重要です。

 今回は、学生が5分で記述できる電卓プログラムを問題としました。どこにバグがあるか考えてみてください。

問題文:リスト4は、電卓プログラムの仕様である。リスト5は、仕様を基にプログラムを記述したものである。下記の資料から、どのようなバグがあるか推察せよ。

1.概要

 コンソールから、数値を入力し、加減乗除するプログラムである。

2. 詳細

 コンソールから、整数型の数値in1、in2を入力し、加減乗除する。

2.1 数値の入力

 コンソールから、2つの整数型の数値in1、in2を入力する。

2.2 演算モードの入力

 コンソールから、どんな演算をするか、下記の整数型の数値で演算モードを入力する。

  • 1:加算、2:減算、3:乗算、4:除算

2.3 加減乗算

 演算モードに従って、下記を実施し、結果を整数型でコンソールに出力する。

  • (1)演算モード=1の場合は、下記を実施する
    result = a + b
  • (2)演算モード=2の場合は、下記を実施する
    result = a - b
  • (3)演算モード=3の場合は、下記を実施する
    result = a * b
  • (4)演算モード=4の場合は、下記を実施する
    result = a / b

3. 制限事項

  • (1)演算モードの入力は、1〜4以外入力しないものとする
  • (2)数値の入力は、int型が取りうる範囲とする
リスト4 電卓プログラムの仕様
#include <stdio.h>
main()
{
	int in1, in2;
	int mode;
	int result = 0;
	printf("2つの数値を入力してください\n");
	scanf("%d %d",&in1, &in2);
	printf("演算モードの選択 1: 加算, 2: 減算, 3: 乗算, 4: 除算\n");
	scanf("%d",&mode);
	switch(mode){
	case 1:
		result = in1 + in2;
		break;
	case 2:
		result = in1 - in2;
		break;
	case 3:
		result = in1 * in2;
		break;
	case 4:
		result = in1 / in2;
		break;
	default:
		break;
	}
	printf("result = %d\n", result);
}
リスト5 電卓プログラム

Copyright © ITmedia, Inc. All Rights Reserved.