連載
バグ検出ドリル(19)たかが1円されど1円……1円足りないバグの恐怖:山浦恒央の“くみこみ”な話(119)(2/3 ページ)
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第19回の問題は、商品と個数から合計金額を求めるプログラムのバグです。なぜか1円だけ合わない、このバグの原因を突き止めよう!
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 売上金額計算プログラム
Copyright © ITmedia, Inc. All Rights Reserved.