問題007(7点)

機械に辺・対角線の長さのデータを入力し、プラスティック板の型抜きをしている工場があります。
この工場では、サイズはいろいろですが、平行四辺形の型のみを切り出しています。
あなたは、切り出される平行四辺形のうち、長方形とひし形の製造個数を数えるように上司から命じられました。
「機械に入力するデータ」をファイルから読み込んで、長方形とひし形の製造個数を出力して終了するプログラムを作成してください。
入力データはファイルc:\pckosien\007.csv に保存されているものとします。

■ヒント
長方形全ての角の角度が等しい四角形
ひし形全ての辺の長さが等しい四角形

入力

「機械に入力するデータ」は、平行四辺形の隣り合う2辺の長さと対角線の長さが記録されています。
おのおのの長さは全て整数で与えられます。
入力例を参考にしてください。

辺1 の長さ,辺2 の長さ,対角線の長さ(1件目のデータ:全て整数)
.........(2件目のデータ:全て整数)
.........(3件目のデータ:全て整数)
............

出力

長方形の製造個数
ひし形の製造個数

入力例

3,4,5
5,5,8
4,4,4
5,4,3

出力例

1
2

考え方

csv形式について

csv形式は、 , (コンマ)で区切られた1行データが複数行書かれているフォーマットです。
かなりうっとおしいです。(出力するのは簡単だが)(笑)
例としては、入力例を見てください。

ここでは、まず1行入力して、それをStringクラスのsplitメソッドで3つに分けることにします。 ドキュメントからsplitの説明をぱくってきました。

public String[] split(String regex)

この文字列を、指定された regular expression に一致する位置で分割します。
このメソッドの動作は、2 つの引数を取る split メソッドを、指定された式および引数制限ゼロを指定して呼び出した場合と同じになります。
このため、末尾の空文字列は、結果の配列に含まれません。

たとえば、次の式を指定した場合の、文字列「boo:and:foo」の結果を示します。

: { "boo", "and", "foo" }
o { "b", "", ":and:f" }

パラメータ:
regex - 正規表現の区切り
戻り値:
この文字列を指定された正規表現に一致する位置で分割して計算された文字列の配列
例外:
PatternSyntaxException - 正規表現の構文が無効な場合
導入されたバージョン:
1.4
とにかく、
String[] data="3,4,5".split(",");
というようにすれば、
data[0]は"3"に、
data[1]は"4"に、
data[2]は"5"になるということで。

四角形の見分け方について

長方形
この図では、ABが辺1、BCが辺2、CAが対角線となります。
ヒントより、長方形はすべての角の角度が等しい四角形なので、すべての角が90度であればよいことになります。
角Bが90度であるには、ピタゴラスの定理より、
AB2+BC2=CA2
が成り立つ必要があることになります。
B=90度なら、AもCもDも90度です(もう証明面倒になった)

・・・ということで、辺1×辺1+辺2×辺2=対角線×対角線が成り立てば長方形ということで。

ひし形は、すべて平行四辺形という前提なので(問題文より)向かい合う辺は等しい。
よって、辺1=辺2なら、すべての辺が等しい。ということで。

//
//A007.java
//c:\pckosien\007.csvにデータを保存しておくこと
//java1.4以上でないとコンパイル・実行できません。
//(java.lang.String#splitメソッドは1.4で追加されたため)
//
//java.lang.String#splitではなく、
//java.util.StringTokenizerクラスを使う方法もあります
//

import java.io.*;

public class A007{
    private static final String FILE_NAME="c:\\pckosien\\007.csv";

    public static void main(String[] args)throws IOException{
        BufferedReader br=new BufferedReader(new FileReader(FILE_NAME));

        //長方形・ひし形の数
        int choho=0;
        int hishi=0;

        String buf;
        while((buf=br.readLine())!=null){
            //カンマで分けて
            String[] data=buf.split(",");
            //辺1,辺2,対角線
            int hen1=Integer.parseInt(data[0]);
            int hen2=Integer.parseInt(data[1]);
            int tai=Integer.parseInt(data[2]);
            //長方形発見
            if(hen1*hen1+hen2*hen2==tai*tai){
                choho++;
            }
            //ひし形発見
            if(hen1==hen2){
                hishi++;
            }
        }
        //数を出力
        System.out.println(choho);
        System.out.println(hishi);
        br.close();
    }
}

正しくゲームをするページ>パソコン甲子園攻略>ココ