バグ検出ドリル(1)「さあ、バグを見つけよう」山浦恒央の“くみこみ”な話(101)(2/4 ページ)

» 2017年12月15日 10時00分 公開

問題1の解答

 この問題の解答は以下の通りです。

  • (1)変数avgを0クリアしていない。
  • (2)5人ではなく、4人分のデータの平均値を算出している。

 本問題は、「小手調べ」として、簡単なプログラミング誤りを題材にしました。

 (1)の「変数avgを0クリアしていない」ですが、C言語では、変数を0クリアしないと不定の値を出力します。よって、変数avgは、0クリアしないと、正しい値が出ません。

 (2)の「5人ではなく、4人分のデータの平均値を算出している」ですが、これはよくある境界値のバグです。仕様では、「5人分の国語テストの点数から平均点」と書いてありますが、ループの「i<4」となっているため、4回しかループしません。5人分の平均値を求めるならば、「i<=4」とするべきです。

問題2

問題2:リスト2-1リスト2-2から、潜在的にどんなバグが考えられるか推察せよ。ただし、リスト2-3の制限事項は順守すること。

概要:コンソールから緯度と経度を入力し、2点間の距離を求めるプログラムである。

仕様1:コンソールから、2地点の緯度経度を入力する。

仕様1-1:2地点の緯度(φ1,φ2)、経度(λ1,λ2)をそれぞれコンソールから入力する。

仕様2:2点間の距離を算出する。

仕様2-1:以下の式から、2点間の距離を算出する。

L=EquatorRadious×(cos−1(cosφ1×cosφ2×cos(λ2−λ1)+sinφ1×sinφ2))

φ1:(double型)A地点の緯度(−90°<=φ1<=90°)

φ2:(double型)A地点の緯度(−90°<=φ2<=90°)

λ1:(double型)B地点の経度(−180°<=λ1<=180°)

λ2:(double型)B地点の経度(−180°<=λ2<=180°)

EquatorRadious:(double型)赤道半径(6378km)

L:(double型)2点間の距離L

リスト2-1 2点間の距離を算出するプログラムの仕様
#include<stdio.h>
#include<math.h>
#define PI 3.141592
main(){
	double fai1 = 0.0,fai2 = 0.0;
	double ramuda1 = 0.0,ramuda2 = 0.0;
	double EquatorRadious = 6378.0;
	double L = 0.0;
	scanf("%lf,%lf",&fai1,&fai2);
	scanf("%lf,%lf",&ramuda1,&ramuda2);
	fai1 = fai1 * PI /180;
	fai2 = fai2 * PI /180;
	ramuda1 = ramuda1 * PI /180;
	ramuda2 = ramuda2 * PI /180;
	L = EquatorRadious * (acos(cos(fai1) * cos(fai2) * cos(ramuda2 - ramuda1) + sin(fai1) * sin(fai2)));
	printf("L = %lf\n",L * 0.62137);
}
リスト2-2 2点間の距離を算出するプログラム

(1)仕様2-1に示した、2点間の距離を算出する計算式は正しいとする。

(2)φ1、φ2、λ1、λ2の入力値は、必ず規定した範囲内の入力をするものと仮定し、エラー処理を考慮しない。

リスト2-3 制限事項

解説

 リスト2-1は、2点間の距離を算出する仕様で、また、リスト2-2に示す通り、この算出式には正しいとして考えます。また、入力値(緯度と経度)は、必ずリスト2-1に示している範囲を入力するので、入力エラーは考えないこととします。まず3分考えて、どこにバグが潜んでいるか推理してください。

Copyright © ITmedia, Inc. All Rights Reserved.