1.以下のプログラムを作ってみて下さい。
3つの整数を入力し、それを辺とする三角形が、正三角形、二等辺三角形、不等辺三角形のどれであるかを出力する。
例:3辺の長さを入力してください
(3,4,5を入力)
不等辺三角形です。
2.上記のプログラムをテストするのに必要なテストケースを全て挙げてみて下さい。
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.日曜プログラミングならテストケースもこの程度でいいと思いますが
意地悪な入力に対しては、そもそも耐えられるようにはなっていません
エクセル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辺より長い」という条件を満たさないため、三角形になりません。
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も含みます)
こちらはいかがでしょうか。我流で読みにくく、なんかへんなプログラムですが、とりあえず動くみたいです。(^_^;
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も含みます)
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は良くわかりません)
また、テストケースが書いてありません。
素直に考えます。
#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の場合、「正三角形」と表示します。
後、入力後の結果も必要になります。
例えば5番目の(1, 2, 3)は1+2=3なので直線になります
import java.util.*;
public class tri {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("3辺の長さを入力してください");
int x=stdIn.nextInt();
int y=stdIn.nextInt();
int z=stdIn.nextInt();
if(x==y||x==z){
if(x==y&&x==z){
System.out.println("正三角形です");
}else{
System.out.println("二等辺三角形です");
}
}else{
System.out.println("不等辺三角形です");
}
}
}
どうでしょう
ありがとうございます。
プログラムの方は入力が正の整数以外時のチェックと三角不等式が抜けているため、不正解となります。
テストケースも回答願います。実はこの問題はそちらの方がメインでした(^^;)。
ありがとうございます。
>意地悪な入力に対しては、そもそも耐えられるようにはなっていません
この問題は意地悪なテストケースをどこまで考えられるかという問題でした。
プログラムは正解ですが、テストケースは不十分になります。
例として、3辺が全て0の場合が抜けています。
(出題は「3つの整数」なので0も含みます)