検索
連載

バグ検出ドリル(20)「三角形判定」のテスト項目を設計できますか【出題編】山浦恒央の“くみこみ”な話(120)(3/3 ページ)

バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第20回と第21回は、「三角形を判定」するプログラムのテスト項目設計がテーマです。まずは今回の出題編を読んで、じっくり問題に取り組んでみてください。

Share
Tweet
LINE
Hatena
前のページへ |       

4.プログラム

/*
	三角形判定プログラム
	TrinagleHandler.c
*/
#define DIGITS 4
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void triangle_handler(int side1, int side2, int side3);
void input(int* val);
void isosceles();
void equilateral();
void scalene();
/***********************
 * 関数名:  main
 * 機能  :	(1)辺1〜3を初期化する。
		(2)辺1〜3の値をコンソールからそれぞれ取得する。
		(3)三角形を判定する。
 * 引数  :	辺の値
 * 戻り値:	なし
***********************/
int main() {
	//辺1、辺2、辺3を初期化
	int side1 = 0;
	int side2 = 0;
	int side3 = 0;
	//辺1、辺2、辺3を入力
	input(&side1);
	input(&side2);
	input(&side3);
	//三角形を判定する
	triangle_handler(side1, side2, side3);
	return 0;
}
/***********************
 * 関数名:  input
 * 機能  :	(1)コンソールから文字列を取得する。
		(2)文字列の末尾を'\n'から'\0'にする
		(3)入力桁が4桁以上の場合は、プログラムを終了する。
		(4)取得した文字列をchar型から、int型に変換する	
 * 引数  :	辺の値
 * 戻り値:	なし
***********************/
void input(int* val) {
	int i;
	int len = 0;
	char str[DIGITS];
	//辺を入力
	fgets(str, sizeof(str), stdin);
	//文字列の長さを取得
	len = strlen(str) - 1;
	//文字列の末尾の改行を'\0'に置き換える
	if (str[len] == '\n') {
		str[len] = '\0';
	}
	else {
		//入力桁数が多い場合は、プログラム終了する
		while (getchar() != '\n') {
			printf("入力エラー\n");
			exit(1);
		}
	}
	//入力した文字列に0〜9が含まれていない場合は、
	//プログラムを終了する
	for (i = 0; i < len; i++) {
		if (!(str[i] >= '0' && str[i] <= '9')) {
			printf("入力エラー\n");
			exit(1);
		}
	}
	//文字列を整数型に変換する
	*val = atoi(str);
}
/***********************
 * 関数名:  	triangle_handler
 * 機能  :	3辺から三角形の種類を判定する
 * 引数  :	辺1、辺2、辺3
 * 戻り値:	なし
***********************/
void triangle_handler(int side1, int side2, int side3)
{
	//正三角形、二等辺三角形、不等辺三角形を判定する
	if ((side1 + side2 >= side3) && (side2 + side3 >= side1) && (side3 + side1 >= side2)) {
		if (side1 == side2 && side2 == side3 && side3 == side1) {
			//正三角形の表示
			equilateral();
		} else if ((side1 == side2) || (side2 == side3) || (side3 == side1)){
			//二等辺三角形の表示
			isosceles();
		}
		else {
			//不等辺三角形の表示
			scalene();
		}
	}
	else {
		printf("三角形ではありません\n");
	}
}
/***********************
 * 関数名:  	equilateral
 * 機能  :	正三角形のメッセージを表示
 * 引数  :	なし
 * 戻り値:	なし
***********************/
void equilateral() {
	printf("正三角形\n");
}
/***********************
 * 関数名:  	isosceles
 * 機能  :	二等辺三角形のメッセージを表示
 * 引数  :	なし
 * 戻り値:	なし
***********************/
void isosceles() {
	printf("二等辺三角形\n");
}
/***********************
 * 関数名:  	scalene
 * 機能  :	不等辺三角形のメッセージを表示
 * 引数  :	なし
 * 戻り値:	なし
***********************/
void scalene() {
	printf("不等辺三角形\n");
}
リスト2 三角形判定プログラム

5.実行結果例

 下記に実行結果の例を示す。

5.1 入力手順

 下記に、入力手順例を示す。

  1. 5を入力し、エンターキーを入力した
  2. 6を入力し、エンターキーを入力した
  3. 7を入力し、エンターキーを入力した
  4. 出力結果が、不等辺三角形と表示された

5.2 上記の入力手順を実行した際の結果

5
6
7
不等辺三角形
リスト3 三角形判定プログラムへの入力と実行結果

4.自己採点シート

 今回の自己採点シートを示します。

問題 項目 配点(点)
三角形判定プログラム 問題文を一通り読んだ 50
テスト項目を作成した 40
机上または実機テストを行い、バグを検出できた 10
表2 自己採点シート

5.終わりに

 ソフトウェアテストの大変なところは、仕様やプログラムを作成する以上に、「検証」という「後戻りの作業」が多くあるためです。皆さんも、毎日、悪戦苦闘していることでしょう。

 今回は、三角形判定問題を出題しました。皆さんは、システマチックにテスト項目を作成し、バグを見つけることができたでしょうか。また、実際に机上、実機で確認した方は、バグを見つけることができたでしょうか。次回、解答を掲載しますので、結果を確かめてください。

【 筆者紹介 】
山浦 恒央(やまうら つねお)

東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)


1977年、日立ソフトウェアエンジニアリングに入社、2006年より、東海大学情報理工学部ソフトウェア開発工学科助教授、2007年より、同大学大学院組込み技術研究科准教授、2016年より非常勤講師。

主な著書・訳書は、「Advances in Computers」 (Academic Press社、共著)、「ピープルウエア 第2版」「ソフトウェアテスト技法」「実践的プログラムテスト入門」「デスマーチ 第2版」「ソフトウエア開発プロフェッショナル」(以上、日経BP社、共訳)、「ソフトウエア開発 55の真実と10のウソ」「初めて学ぶソフトウエアメトリクス」(以上、日経BP社、翻訳)。


Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る