人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【プログラム クイズ】
1.以下のプログラムを作ってみて下さい。


3つの整数を入力し、それを辺とする三角形が、正三角形、二等辺三角形、不等辺三角形のどれであるかを出力する。


例:3辺の長さを入力してください
(3,4,5を入力)
不等辺三角形です。


2.上記のプログラムをテストするのに必要なテストケースを全て挙げてみて下さい。

●質問者: garyo
●カテゴリ:コンピュータ 学習・教育
✍キーワード:クイズ テスト テストケース プログラム 三角形
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● きゃづみぃ
●55ポイント

エクセルVBAです。

セルA1、B1、C1にそれぞれ数値を入れて実行させてください。

もちろんチェックはしてませんので文字列や値は 0でも 実行はできますけどね、

今回は 三角形のどれかを 出すという条件があるので 必ず0より大きい整数を入力した場合と

限定させてもらいます。

限定しない場合は、0より大きい整数か判定し、該当しない場合は、三角形にならないと

判断されてその旨のエラーを出すことになります。



Sub check()
a = Cells(1, "A")
b = Cells(1, "B")
c = Cells(1, "C")

If a = b And b = c Then
 MsgBox ("正三角形")
 Exit Sub
End If

If a = b Or b = c Or a = c Then
 MsgBox ("二等辺三角形")
 Exit Sub
End If

MsgBox ("不等辺三角形")

End Sub

必要なテストケース

(3,3,3を入力) 三辺が同じ

(3,4,4を入力) 二辺が同じ

(4,3,4を入力) 二辺が同じ

(4,4,3を入力) 二辺が同じ

(3,4,5を入力) 三辺がみな違う

◎質問者からの返答

ありがとうございます。

残念ですが、テストケースもプログラムも不正解となります。

例として、

(1, 1, 3を入力)があります。

この場合は、「3角形の2辺の和は他の1辺より長い」という条件を満たさないため、三角形になりません。


2 ● imo758
●105ポイント ベストアンサー

1.

# http://codepad.org/jHjcxfTu
sub triangle_test{
 my($a, $b, $c) = @_;
 if(triangle_check($a, $b, $c)){ #不要なら外す
 print "非三角形($a, $b, $c)\n";
 }elsif($a == $b and $b == $c){
 print "正三角形($a, $b, $c)\n";
 }elsif($a != $b and $b != $c and $c != $a){
 print "不等辺三角形($a, $b, $c)\n";
 }else{
 print "二等辺三角形($a, $b, $c)\n";
 }
}

&triangle_test(1 + int rand 4,1 + int rand 4,1 + int rand 4) for(1..30);

sub triangle_check{
 my($a, $b, $c) = sort {$a <=> $b}@_;
 return ($a + $b > $c ? 0: 1);
}

2.日曜プログラミングならテストケースもこの程度でいいと思いますが

意地悪な入力に対しては、そもそも耐えられるようにはなっていません

◎質問者からの返答

ありがとうございます。

>意地悪な入力に対しては、そもそも耐えられるようにはなっていません

この問題は意地悪なテストケースをどこまで考えられるかという問題でした。

プログラムは正解ですが、テストケースは不十分になります。

例として、3辺が全て0の場合が抜けています。

(出題は「3つの整数」なので0も含みます)


3 ● rsc
●95ポイント

こちらはいかがでしょうか。我流で読みにくく、なんかへんなプログラムですが、とりあえず動くみたいです。(^_^;

1.

/* TriAngleTest.c */
#include <stdio.h>

#define ABS(x)((x)< 0 ? -(x) : (x))

int main(void)
{
int a,b,c;/* 3辺 */

printf("3辺の長さを入力してください。(整数 a,b,c)\n");
scanf("%d,%d,%d%*[^\n]%*c",&a,&b,&c);

if(ABS(b-c)<a && a<b+c)/* 三角不等式 */
;/* 何もしない。(^_^; */
else{
printf("Error!\n");
return(1);
}

switch((a==b)+(b==c)+(c==a)){
case 3:
printf("正三角形です。\n");
break;
case 1:
printf("二等辺三角形です。\n");
break;
case 0:
printf("不等辺三角形です。\n");
break;
}

return(0);
}

2.

(1)1,1,1→正三角形です。

(2)1,2,2→二等辺三角形です。

(3)3,4,5→不等辺三角形です。

(4)1,2,3→Error!

◎質問者からの返答

ありがとうございます。

プログラムは正解ですが、テストケースは不十分になります。

例として、3辺が全て0の場合が抜けています。

(出題は「3つの整数」なので0も含みます)


4 ● snmp
●5ポイント

Perlで書いてみました。

ハッシュの特性を利用し入力された数値の重複数をカウントしてます。

※入力のエラーチェックは入れてません。。。


#!/usr/bin/perl

use strict;
use warnings;

my @input = @ARGV;
my %data = ();
###################
# 重複数チェック
###################
foreach my $value(@input){
 $data{$value}++;
}

###################
# 重複数で振り分け
###################
my @count = reverse(sort values(%data));
if($count[0] == 1){
 print '不等辺三角形'."\n";
}
if($count[0] == 2){
 print '二等辺三角形'."\n";
}
if($count[0] == 3){
 print '正三角形'."\n";
}

exit;
◎質問者からの返答

ありがとうございます。

>※入力のエラーチェックは入れてません。。。

恐らく、プログラムの方は三角不等式のチェックが無いと思います。また、入力が正の整数以外の時のチェックも抜けていると思います。(Perlは良くわかりません)

また、テストケースが書いてありません。


5 ● ita
●45ポイント

素直に考えます。

#include <stdio.h>
char *print_msg(int a, int b, int c)
{
 int ns = 0;
 if (a==b) ns++;
 if (b==c) ns++;
 if (c==a) ns++;

 switch(ns)
 {
 case 3: return "正三角形";
 case 1: return "二等辺三角形";
 case 0: return "不等辺形";
 default:
 printf("エラー! ns=%d\n", ns);
 }
 return "";
}

void main(int argc, char **argv)
{
 int a = atoi(argv[1]);
 int b = atoi(argv[2]);
 int c = atoi(argv[3]);
 printf("%sです\n", print_msg(a,b,c));
}

てな感じでしょうか。

テストデータは

3 3 3

2 3 3

3 2 3

3 3 2

1 2 3

の5つあたりで。

◎質問者からの返答

ありがとうございます。

>素直に考えます。

残念ですが素直すぎます(^^;)

プログラムの方は入力が正の整数以外時のチェックと三角不等式が抜けているため、不正解となります。

テストケースも不十分になります。

例として、3辺が全て-1の場合、「正三角形」と表示します。

http://codepad.org/udgTsfjV


後、入力後の結果も必要になります。

例えば5番目の(1, 2, 3)は1+2=3なので直線になります


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ