Java学習ノート_140709（条件分岐、条件演算子、論理演算子）

# 条件分岐

Markdownでテーブル使ってみた。rowspan的なシンタックスは今のところないっぽい。

| 種類 | 制御文 |
|------|-------|
| 条件分岐| if, switch |
| 繰り返し | for, *while*, *do-while* |
| 繰り返し制御 | break, continue |
| 例外 | try-catch |

# 演算子

関係演算子 : <, >, ==, <=, >=, !=。

* [演算子 - Wikipedia](http://ja.wikipedia.org/wiki/%E6%BC%94%E7%AE%97%E5%AD%90)


以下は関係演算子のサンプル。

```java:IfTest.java
public class IfTest {

	public static void main(String[] args) {
		int a = Integer.parseInt(args[0]);
		int b = Integer.parseInt(args[1]);

		if (a > b) {
			System.out.println(args[0] + "は" + args[1] + "より大きい");
		}
		else if (a < b) {
			System.out.println(args[0] + "は" + args[1] + "より小さい");
		}

		if (a >= b) {
			System.out.println(args[0] + "は" + args[1] + "以上である");
		}
		else if (a < b) {
			System.out.println(args[0] + "は" + args[1] + "以下である");
		}
		
		if (a == b) {
			System.out.println(args[0] + "は" + args[1] + "と等しい");
		}
	}
}
```

## 条件演算子

```java:
//<条件式> ? <trueのときの結果> : <falseのときの結果> ;`
 System.out.println(score > 50 ? "合格です" : "不合格です");
```

## switch、if文
他言語で理解しているのでノートはしない。


以下は入力値の判定。

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

public class InputIf {
	public static void main(String[] args) {

		System.out.println("数値を入力してください。");
		BufferedReader 	reader = new BufferedReader(new InputStreamReader(System.in));

		try{
			String str = reader.readLine();
			int i = Integer.parseInt(str);
			/*
			if(i  > 100){
				System.out.println("入力した値" + i + "は100より大きいです。" );
			}else{
				System.out.println("入力した値" + i + "は100より小さいです。" );
			}
			 */
			//三項演算子（条件演算子）を使ってみる
			System.out.println(i > 100 ? "入力した値" + i + "は100より大きいです。" : "入力した値" + i + "は100と同じか小さいです。");
		}

		catch(IOException e){
			System.out.println("エラーです。");
		}
		catch(NumberFormatException e){
			System.out.println("数値を入力してください。");
		}
	}
}
```
## 論理演算子

| 用例 | |
|----|---|
| && または & | 論理積 |
| ll または l | 論理和 |
| ^ | 排他的論理和 |
| ! | 論理否定 |


# 問題
## BMIを計算するプログラムの発展形を書きなさい。
| BMI値 | 判定結果 |
|----|---|
| 18.5未満 | やせ |
| 18.5以上 - 25未満 | 標準 |
| 25以上 - 30未満 | 肥満 |
| 30以上 | 高度肥満 |

```java:BMISample.java

public class BMISample {

	public static void main(String[] args) {
		//身長、体重を実行時引数で渡す、変数に代入
		double height = Double.parseDouble(args[0]);
		double weight = Double.parseDouble(args[1]);
		//身長をcmからmに変換
		height /= 100;
		//BMI値を計算
		double bmi = weight / (Math.pow(height , 2));
		System.out.println("bmi = " + bmi);
		if(bmi < 18.5){
			System.out.println("やせ");
		}else if(bmi < 25){
			System.out.println("標準");
		}else if(bmi < 30){
			System.out.println("肥満");			
		}else{
			System.out.println("高度肥満");
		}
	}
}
```

# ProcessingとJava

ちょっと頭の休憩的に、JavaとProcessingについて調べて、サンプルコード書き換えたりしてみた。

* [ProcessingとJavaの関係 – Expressive Programming | Yasushi Noguchi Class](http://r-dimension.xsrv.jp/classes_j/ex_program1_4/)

```java:JavaProcessing.java
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;

public class JavaProcessing extends Applet{
  public void paint(Graphics g){
    g.setColor(Color.white);
    g.fillRect(0, 0, 200, 200);

    g.setColor(Color.black);
    g.drawLine(0, 0, 200, 200);
    g.drawLine(200, 0, 0, 200);
    g.drawOval(25, 25, 150, 150);
  }
}
```

# その他

## Eclipseのコード自動整形はctrl + i。

ctrl + shift + fでも整形されるっぽい。違いは後で調べる。

[『 Eclipseショートカットキーまとめ - wyukawa’s blog』 ](http://d.hatena.ne.jp/wyukawa/20090628/1246183795)

## Markdown用のリンク作成ブックマークレット作ってみた

ウェブページ参照しながらMarkdownでリンク記述するの面倒臭かったので、ブックマークレットを作成してみた。Chromeあたりでブックマークバーを右クリック→ページを追加→名前は適当に、URLのところに下記コードを改行なしで入力する。

```js:link4md.js
javascript:var url=location.href.split('?rt=na')[0].split('?PSID=')[0].split('?P=')[0].split('?f=topic')[0].split('summary.html?rss')[0].split('&feature')[0].split('&eurl')[0].split('?feedType')[0].split('?vos')[0].split('?utm_')[0].split('index.html')[0].split('?intcid')[0].split('?_c=feed-rss')[0].split('?cid=')[0].split('?FM=')[0].split('&from=')[0].split('?from=')[0].split('?L=rss')[0].split('&lindID')[0].split('?rss')[0].split('?ref=')[0].split('&ref=')[0].split('?set=')[0].split('?ST=')[0].split('&ST=')[0].split('?mail')[0].split('?AAA')[0];var title=document.title;var linkTag ='['+title+']'+'('+url+')';var x = prompt('文字列をコピー',linkTag);
```
## トークン
ソースコードの単語、記号のことをトークンと言う。

## 進数
10進数 : 普段使ってる表記方法 
2進数 : 0と1を使って記述する
8進数 : 0-7の値を使って記述する
16進数 : 0-9,A-Fを使って記述する

# よくわからないけどNetBeansで関数操作のリファクタリングを実行してみた

はてぶにJavaの記事がホッテントリに入ってたので読んでみた。

[「そろそろJavaみなおしてもええんやで」というプレゼンしてきた - きしだのはてな](http://d.hatena.ne.jp/nowokay/20140708#1404838502)

```java
for(int num : nums){
    if(num > 10) continue;
    sum += num * 2;
}
```
コード自体の意味がわかってない状態で、上記コードを実行しようとしてみた。初起動のNetBeans 8.0で新規プロジェクトを作成して、コードコピペしてメニューからリファクタリングしようとしてみたが、なんだか関数操作がでない、というか項目としてない。途方に暮れながらマウスを右往左往させてしていると、行番号のあたりのところで、警告表示が出てるようなので、読んでみるとsumが（numsも）宣言されてないよ、ということらしいので、for文の上で宣言して、関数操作を実行してみた。

すると、該当警告部分をクリックして「関数操作の使用」を選ぶと、以下のように書き換えられた。

```java
sum = nums.stream().filter((num) -> !(num > 10)).map((num) -> num * 2).reduce(sum, Integer::sum);
```

ちょっと何言ってるかわからない。ので一旦放置して、変換前のコードを読んでみる。

`for(int num : nums){...}`に関してはJavaお決まりの配列のループ処理の書き方っぽい。

* [配列 - Java](http://www.tabun-kuma.net/index.php?P1=JavaTips1030)

わかってる人にはスコープ外の変数もあることが前提で不要なんだろうけど、わかってないのでコメント含めて書いてみる。

```java
int[] nums = {1, 4, 9, 16, 25}; //nの2乗の配列
int sum = 0; //合計値
for(int num : nums){
    if(num > 10) continue; //num10より大きいとき処理をスキップ
    sum += num * 2; //sumに numの2倍を加算
}
System.out.println(sum); //コンソールに出力=>28
```

でも

```java
int[] nums = {1, 4, 9, 16, 25}; //nの2乗の配列
int sum = nums.stream().filter((num) -> !(num > 10)).map((num) -> num * 2).reduce(sum, Integer::sum);
System.out.println(sum); //コンソールに出力=>28

```

と書いて実行すると、エラーが表示されてしまう。

`Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: Array.stream.filter.map.reduce
	at javaapplication1.JavaApplication1.main(JavaApplication1.java:21)`

filter(),stream(),map(),reduce()のメソッドの意味を調べると、

* stream() : JDK1.8で採用。
* filter() :
* map() :
* reduce() :

っと、途中でタイムアップ。明日以降調べます。

[Java学習ノート_140707 - Qiita](http://qiita.com/takawo/items/aa90d36d25625f5a9b72#2-3)

買った本届いてた。