連載
» 2019年07月02日 10時00分 公開

山浦恒央の“くみこみ”な話(119):バグ検出ドリル(19)たかが1円されど1円……1円足りないバグの恐怖 (2/3)

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

3.今回の問題

 A君は、弁当販売店の経理係を担当している。業務を詳細に分析するため、1日の売り上げデータの合計金額を求めるプログラムを作成することにした。A君は、仕様(リスト1)とプログラム(リスト2)を作成した。

 結果が正しいことを確認するため、B君にExcelで合計金額を求めるシートの作成を依頼し、リスト1内の表1-1に示す入力データを使用し、実行結果を同じになるかテストした。

 比較した結果、2人の計算結果が1円だけ異なることが分かった(実行結果はリスト3-1を参照)。不思議に思った2人は、別のデータで確認した。表1-2のデータを使用したところ、結果は一致した(リスト3-2参照)。上記の情報から、リスト3-1で2人の結果が一致せず、リスト3-2では一致した原因を推察せよ。

1.概要

 本プログラムは、店の売り上げデータから、合計金額を計算するプログラムである。

2.入力データ

 店の売り上げデータは、No.、商品名、数量、単価(税別)とする。表1-1、表1-2にデータ例を示す。

No. 商品名 数量 単価(税別)
1 スポーツドリンク 6 74
2 炭酸飲料 9 59
3 おにぎり 8 97
4 サンドイッチ 15 153
表1-1 売り上げデータ1

No. 商品名 数量 単価(税別)
1 スポーツドリンク 32 74
2 炭酸飲料 81 59
3 おにぎり 101 97
4 サンドイッチ 40 153
表1-2 売り上げデータ2

3.合計金額の計算

 合計金額の計算式を以下に示す。なお、消費税は8%として計算する。

  • 小計=個数×単価(税別)
  • 合計金額=小計×消費税

4.表示

 合計金額は、コンソールに表示する。

5.制限事項

 入力データは、表1-1、表1-2のみを使用する。

 その他のバグや問題点は考慮せず、1円違いの原因だけを考察すること。

リスト1 売上金額計算プログラムの仕様

/*
	売上金額計算プログラム
	SalesCalculator.c
*/
#define TAX 1.08		//税率(8%)
#include <stdio.h>
//売り上げデータ構造体
typedef struct {
	int no;
	char name[64];
	int num;
	int price;
}SALES_DATA;
int main(void) {
	//商品データの宣言
	SALES_DATA sales_data1[4] = {
		{1,"スポーツドリンク",6, 74},
		{2,"炭酸飲料",9, 59},
		{3,"おにぎり",8, 97},
		{4,"サンドイッチ",15,153},
	};
	SALES_DATA sales_data2[4] = {
		{1,"スポーツドリンク",32, 74},
		{2,"炭酸飲料",81, 59},
		{3,"おにぎり",101, 97},
		{4,"サンドイッチ",40,153},
	};
	int i;
	int subtotal1 = 0;	//小計1
	int subtotal2 = 0;	//小計2
	int total1 = 0;		//合計1
	int total2 = 0;		//合計2
	//4件分の売り上げデータの小計を計算する
	for (i = 0; i < 4; i++) {
		subtotal1 = subtotal1 + sales_data1[i].num * sales_data1[i].price;
		subtotal2 = subtotal2 + sales_data2[i].num * sales_data2[i].price;
	}
	//小計に消費税を乗算する
	total1 = subtotal1 * TAX;
	total2 = subtotal2 * TAX;
	//画面に合計金額を表示する
	printf("合計金額 = %d\n", total1);
	printf("合計金額 = %d\n", total2);
	return 0;
}
リスト2 売上金額計算プログラム
リスト3-1 リスト3-1 売り上げデータ1を使用した2人の実行結果(クリックで拡大)
リスト3-2 リスト3-2 売り上げデータ2を使用した2人の実行結果(クリックで拡大)

Copyright © ITmedia, Inc. All Rights Reserved.