Java学習ノート_140708（配列、乱数）

# 配列

```
int[] number = new int[5];
number[0] = 10;
number[1] = 14;
number[2] = 8;
number[3] = 9;
number[4] = 126;

//同様の内容を初期化で記述
int[] number = {10, 14, 8, 9, 126};
```


JavaでArrayは要素数が決まってるので、JSに比べると動的に要素数の変更がしずらそうと思ったがArrayListというクラスがあるようだ。その他調べたら、Arrayを`clone()`や`System.arraycopy()`で複製するケースもあるらしい。

* [Javaの道 > Java基本 > 配列 －１．配列の基本](http://www.javaroad.jp/java_array1.htm)


```java:ArraySample.java
public class ArraySample {
	public static void main(String[] args) {

		// 配列を作成
		int[] arr = new int[100];
		
		// 配列に1から100までの二乗を計算して代入
		for (int i = 1; i <= 100; i++){
			arr[i-1] = (int)Math.pow(i,2);
		}
		
		//リストをコンソールに出力
		for(int i = 1; i <= 100; i++){
			System.out.println( i + "の2乗は" + arr[i-1] );
		}
	}
}
```


## 問題1

### Q. キーボードから数値を入力し、入力された値が偶数なら【偶数です】を表示し、奇数なら【奇数です】を表示する。ただし、if文などの条件分岐は未学習なので使わないこと。

とりあえず、BufferedReaderとInputStreamReaderで書いてみた。数学的定義が気になったので0は偶数かを調べてみたところ、2n（nは整数）で表現できるものが偶数、2n+1で表現されるのが奇数のようだ。

```java:KeyInput.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class KeyInput {
	public static void main(String[] args) {
		try{
			//配列：偶数奇数を0と1で判定するのに必要、もしかしたら配列なしでビット演算でできるのかも
			String[] ansStrArray = {"偶数","奇数"};
			//ダイアログ
			System.out.println("数値を入力してください");
			//入力値を取得
			BufferedReader reader  = new BufferedReader(new InputStreamReader(System.in));
			//数値に変更
			int input = Integer.parseInt(reader.readLine());
			//入力値の剰余を取得
			int ans = input%2;
			//答えを出力
			System.out.println(input  + "は" + ansStrArray[ans] + "です。" );
		}
		catch(IOException e){
			System.out.println("エラーです");
		}
		catch(NumberFormatException e){
			System.out.println("エラーです");
		}
	}
}
```

暇になったのでScannerでの書き方もやってみる（でも結構忘れてる）。

```java:KeyInput2.java
import java.util.Scanner;

public class KeyInput2 {
	public static void main(String[] args) {
		//配列：偶数奇数を0と1で判定するのに必要、もしかしたら配列なしでビット演算でできるのかも
		String[] ansStrArray = {"偶数","奇数"};
		//ダイアログ
		System.out.println("数値を入力してください");
		//Scannerで入力値を取得
		Scanner sc  = new Scanner(System.in);
		//入力値を数値変換し剰余を計算
		int input = sc.nextInt();
		int ans = input%2;
		//答えを出力
		System.out.println(input  + "は" + ansStrArray[ans] + "です。" );
		//Scannerを閉じる（入力受付を終了）
		sc.close();
	}
}
```
`Scanner.close();`はEclipseでエラーが出たのでググったら知恵袋で出てきた。

 * [eclipseで「リソース・リーク：’ｓｃ’閉じられることはありません」と表示されるの...
](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12108738362)

要素数はArray.length。

## 問題2

### Q. mainメソッドの引数に　体重　と　身長　を指定するとBMI値を表示してくれるプログラムを作成してください。
>例：
実行時の引数に 1.78 と　65.0 を指定すると、
「身長1.78m
体重65.0kg
BMIは○○○です。」
という３行が表示される様なプログラムを作成してください。

サラッと書けるかなと思ってEclipseで実行したところ、`Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0`とエラーが表示され、実行されなかった。
Eclipseでmainに複数の引数を渡して実行は、なんとなくやってみたことがあったけど歳のせいか完全に忘れていた。全く記憶になくてやばい。パッケージ・エクスプローラーから実行したい.javaファイルを右クリックで実行→実行の構成を選択して表示されたウィンドウの変数タブに変数をスペース区切りで入力する。コマンドプロンプトでやってたりすると変な感じだけど、いちいちディレクトリに移動しなくていいし、入力した引数を設定した上で実行できるから楽かも。知恵袋に頼ってる。

* [eclipseでjavaのプログラムを作って実行させると Exception in thread "main" jav...](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12115506867)

![140708excute.png](https://qiita-image-store.s3.amazonaws.com/0/6576/09273bf6-e4cb-30c0-3f08-f42166c53887.png)

備忘録的にスクショ撮って貼っつけてみたけど、メニュー＞実行＞実行構成からでも引数渡して実行できる。こっちのほうが楽そう。

![140708bmisample.png](https://qiita-image-store.s3.amazonaws.com/0/6576/133d63bc-7b47-7b15-5194-4f35872de9c0.png)


```java:BMISample.java
public class BMISample {

	public static void main(String[] args) {
		 //身長、体重、BMIの変数を宣言。
		double h,w,bmi;
		//引数を代入してBMI値を計算
		h = Double.parseDouble(args[0]);
		w = Double.parseDouble(args[1]);
		bmi = w / (h * h);  //  bmi = w / Math.pow(h, 2); でもOK

		//計算したBMI値を文字列に変換
		String bmiStr = String.valueOf(bmi);
		//小数点以下の数値をきれいにする
		bmiStr = bmiStr.substring(0, 5);

		//結果を表示
    	System.out.println("身長"+ h +"m");
    	System.out.println("体重"+ w +"kg");
    	System.out.println("BMIは"+bmiStr+"です。");
	}
}
```

コマンドプロンプトでjavac BMISample.javaを実行したところ、「この文字は、エンコーディングms932にマップできません」というエラーが出た。これもググったところ、ファイルの文字コードが原因のようだ（UTF-8でテキストファイルを保存する癖がついていたけど、デフォルトはMS932らしい。）。UTF-8の.javaファイルをコンパイルするには、`javac -encoding utf-8 BMISample.java`のように書くとコンパイルされる。

> SJIS（Shift_JIS）もMS932（Windows-31J）も どちらも似たようなキャラセットだが、
いわゆる機種依存文字が対応しているかどうか（Unicodeと変換できるかどうか）が異なる。
[SJISとMS932の違い](http://d.hatena.ne.jp/teraliso/20081202)

とのこと。

# 乱数の生成

乱数のクラスがあって、utilのパッケージに入っているのが結構驚いた。Mathクラスじゃないんだなぁと思ったら、そっちにもあるようで安心。このすぐあとにやる。

* nextDouble();　・・・ 0.0以上　1.0未満のdouble型の乱数値が得られる。
* nextFloat();　・・・ 0.0以上　1.0未満のfloat型の乱数値が得られる。
* nextLong();　・・・ long型の乱数値が得られる。

nextIntと違って値を指定しない（ので * 10とかお決まりの感じで範囲を指定する）。

## 問題3
### 0から2の乱数を発生させて、0なら "グー" を表示。1なら "チョキ" を表示。2なら "パー" を表示させるプログラムを記述しなさい。

```java:RandomSample.java
import java.util.Random;

public class RandomSample {
	public static void main(String[] args) {
		//0からnextInt(n)のn未満の整数を出力
		int r = new Random().nextInt(3);
		String[] jankenArray = {"グー", "チョキ" , "パー"};
		System.out.println(jankenArray[r]);
	}
}
```

## 問題4
### 3から8の乱数を発生させて表示するプログラムを記述しなさい。

```java:RandomSample.java
import java.util.Random;

public class RandomSample {

	public static void main(String[] args) {
		int r = new Random().nextInt(6);
		r += 3;
		System.out.println(r);

	}
}
```

## Mathクラスのrandomメソッドの利用による乱数

`Math.random();`でdouble型の0から0.9999までの乱数を生成できる。
0から5までの整数をランダムに生成する場合は、`int num = (int)(Math.random() * 6); `のように型キャストする。


## 問題5

### Math.randomを利用して、10から30の乱数を発生させて、表示するプログラムを記述しなさい。

```java:RandomSample2.java
public class RandomSample2 {
	public static void main(String[] args) {
		System.out.println((int)(Math.random() * 21 + 10));
	}
}
```

# [設定] [その他] 

## Eclipseの文字サイズを変更

ちょっと小さいので調整する。設定の一般＞外観＞色とフォントのところから変更できる。エディタのフォントMeiryo UI､11ptにするだけで非常に読みやすくなった。もっと早く設定変更すればよかった。

* [プログラミングでオススメのフォント](http://deepbluewill.hateblo.jp/entry/eclipse/font)

## MacType

あとはWindowsのフォントのジャギー感が気になっていたので、フォントをアンチエイリアス処理していくれるMacType導入したらフォント表示が格段に綺麗になった（気がする）。コーディング用にフォント生成するほどのこだわりはないけど、徐々に環境良くなってきているのが嬉しい。最終的にはEclipseでGitでコード管理できるようになりたい。

* [Windows７にフォントを綺麗にする「MacType」を導入してみたが凄い](http://webzaki.com/mactype/)

## WinDivvy

Windowsのウィンドウサイズが微妙に調整できないのがムズムズしてMacのdivvy.appみたいなものがないかなと検索したところ、winDivvyがあった。神！あとはキーボードに慣れたらいい。

* [Mizage - WinDivvy](http://mizage.com/windivvy/)

## 雑感

ノートにメモするのもいいけど、こうやってMarkdown形式でコードをまとめながらノートにまとめるほうがリンク貼れたりと色々楽だ。

全然関係ないけど、`public static void main(String[] args)`に引数で要素数が10000個くらいの配列渡したいと思ったけど、書き方がわからなかった。