2014年9月19日金曜日

- 条件分岐 と 繰り返し - Java

今まで学習した文は、すべて上から順に実行される文。
今日は、他の順番の文を学習する。

制御構造

文を実行させる順番のことを 制御構造(制御フロー) という。
フローというのは英語で Flow 流れ、という意味。
よく耳にする フローチャート というのは、処理の流れ を表している。
























代表的な制御構文は三つ。

「順次」、「分岐」、「繰り返し」。

この三つを組み合わせると、どんな複雑なプログラムでも作成可能らしい。
(構造化定理)

今まで書いてきたものは、全て、「順次」の文。
上から下に一つずつ実行していく単純なもの。


分岐

条件によって結果が変わるのが分岐。
「もし、……だったら、……」
「でも、……なら、……しよう」
日本語で考えると、簡単です。

誰しもが一度は考える、「もし、宝くじが当たったら……」なんていうのも
分岐の一つですね。

if という命令を使う。
if は 「もしも」 という意味。
else は 「そうでなければ」 という意味。

















































package blog;

public class Junction {

 public static void main(String[] args) {

  boolean money = true;

  System.out.println("お財布にお金が入ってたかなぁ……。");

  // もし、 money が true だったら
  if (money == true) {
   System.out.println("本を買います。");
   System.out.println("あとは、お菓子を買って帰ります。");

   // そうでなければ
  } else {
   System.out.println("歩いて家に帰ります。");
  }

 }

}


















実行結果の一つ目が、 money が true だった場合。
二つ目が、 money が false だった場合。


ここでは、
(money == true ) の部分が条件式。



繰り返し

条件によって、繰り返し(ループ)を続ける。
「……の間は……」

while という命令を使う。
while は 「~の間は」 という意味。

















































package blog;

public class Loop {

 public static void main(String[] args) {
  System.out.println("新しいレアカードが発売されたらしいなぁ……。");

  boolean desire = false;

  // desire が true の場合は 無限ループになる
  // false の場合は そのまま終了。
  while (desire == true) {
   System.out.println("カードを引いてみよう");
   System.out.println("もっと……。");
  }

  System.out.println("興味ないな。");
 }

}













ブロックと条件式

ブロックとは、複数の文をひとまとまりとして扱うもの。
ブロック内で宣言した変数は、ブロックが終わると消える。


条件式とは、分岐や繰り返しの条件を表すもの。
式の中には 関係演算子 を使う。
!! 評価結果が 必ず true または false になる式にする必要がある !!

条件式で用いる演算子は、

条件が成立した場合に true
そうでない場合に false

に変化する。

条件式の中で用いられる演算子(==、>、<=など)には三種類ある。


ひとつめは、関係演算子
条件が一つのときに使う。
関係演算子






















ふたつめは、論理演算子
二つ以上の条件を組み合わせるときに使う。
業務では、三つ以上組み合わせると怒られる。(わかりづらい)
論理演算子












みっつめは、否定演算子
「もし~でないならば」という否定系の条件式に用いる。
"!"をつける。

if (! (size == 10)){   size が 10 に等しくないなら true


package blog;

public class LogicalOperator {

 // 習った円周率によって、ざっくりと生まれた年代を表してみる
 public static void main(String[] args) {

  // circularConstant は 円周率 という意味
  double circularConstant = 3.14;

  // もしも、円周率が 3.14 では なかったら!!
  if (!(circularConstant == 3.14)) {
   System.out.println("平成生まれ!!");

   // そうでなければ
  } else {
   System.out.println("昭和生まれ!!!");
  }
  System.out.println("実は、ゆとり世代が、円周率を 3 と習ったというのは");
  System.out.println("デマらしいですよ!!");
 }

}












最後に、文字列を比較したい場合の注意点。
文字列は == で比較することができない。

代わりに
  変数名 . equals ("文字列")
と書く。
変数の中身と文字列が一致した場合に true になる。



package blog;

public class StringComparison {

 public static void main(String[] args) {

  String name = "ともみ";

  // もしも name の中身が "ともみ" だったら
  if (name.equals("ともみ")) {
   System.out.println("ログインに成功しました");
   // そうでなければ
  } else {
   System.out.println("ユーザーが違います");
  }

  System.out.println("もう一度、試します");

  // もしも name の中身が "さとし" だったら
  if (name.equals("さとし")) {
   System.out.println("ログインに成功しました");
   // そうでなければ
  } else {
   System.out.println("ユーザーが違います");
  }
 }

}













name.equals("ともみ")の部分が
name == "ともみ"
でも、コンパイルエラーが起きずに、変な動作をするから
忘れないように注意しよう!

2014年9月18日木曜日

- 命令実行の文 - Java

- 変数 - 編で学習した、「宣言」、「代入」、「参照」のうちの二つをマスターした。
最後は「参照」について。




















「参照」の部分に「命令実行の文」を書いて、やっとコードが完成する。
「命令実行の文」は、「画面出力の文」ともいえる。

命令実行の文は、自分で作るものではない。
Java が初めから準備してくれている。

すでに、何度もでてきている
「System.out.println ( )」
これも、画面に文字を表示する命令文である。


大変、面白いのでいくつか書いてみる。


画面に文字を表示する命令

命令実行の文の代表格

System.out.println() ...... 改行あり

System.out.print() ...... 改行なし




package blog;

public class OutputString {

 public static void main(String[] args) {

  // 画面に文字を表示する命令
  System.out.println("コナミコマンドとは");
  System.out.println("コナミが独自に持っている");
  System.out.println("隠しコマンドである。");

  // 画面に文字を表示する命令(改行無し!!!)
  System.out.print("上上");
  System.out.print("下下");
  System.out.print("左右");
  System.out.print("左右");
  System.out.print("BA");

 }

}











実行結果でわかるように、System.out.print() という文は五行にわけて書いたのに一行にまとまっている。

大きいほうの数字を代入する命令

Math.max()

二つの引数を指定して大きな値のほうを代入する命令。


package blog;

public class MaximumNumber {

 public static void main(String[] args) {

  int happinessTaiwan = 6221;
  int happinessJapan = 6064;

  // Math.max に引数を二つ渡し
  // 大きいほうの値を取得する
  int highHappiness = Math.max(happinessTaiwan, happinessJapan);

  System.out.println("国際連合の調べによると");
  System.out.println("日本の幸福度は" + happinessJapan);
  System.out.println("タイワンの幸福度は" + happinessTaiwan);
  System.out.println("日本とタイワンの幸福度を比べると");

  // highHappiness には
  // happinessTaiwan(6221 が代入されている) が代入されている
  System.out.print(highHappiness);
  System.out.println("のタイワンのほうが上。");

 }

}












これは、例が非常に悪いです。申し訳ない。
最後の行の
System.out.println("のタイワンのほうが上。");
というのは、どちらが大きい数わかった上で書いてる一行なので、
例としては、ぱっとしないです。


乱数を生み出して代入する命令

java.util.Random.nextInt()

指定した整数 -1 をランダムで代入する命令。

Random クラス の nextInt() メソッド というのを使用している。
クラス、メソッドのことは今は覚えなくていい。
見ながら書くだけで正しく動くので、いろいろ書いてみると面白い。



package blog;

public class RandomNumbers {

 public static void main(String[] args) {

  System.out.println("「1寸の虫にも5分の魂」ゲーム!!!!");

  // Random クラス に 引数 10 を渡す
  // 引数 - 1 の整数が inche に代入される
  // 代入される値は、実行するたび変わる
  int inche = new java.util.Random().nextInt(10);

  int percent = new java.util.Random().nextInt(10);

  System.out.println("スタート!!!!");
  System.out.println(inche + "寸の虫にも" + percent + "分の魂");
 }

}




















実行結果1のように 0寸の虫(そんなものは存在しない)と表示したくない場合は

int inche = new java.util.Random().nextInt(10) + 1;
のように、数字を足せばいい。
この場合、 inche に代入されるのは 1 ~ 10 のうちのどれか。
応用して、 13 ~ 20 を代入したい場合は
int inche = new java.util.Random().nextInt(8) + 13;
にするといい。



キーボードから1行の入力を受け取る命令


java.util.Scanner.nextLine()
java.util.Scanner.nextInt()

キーボードから入力された、文字、数字を代入する命令。


package blog;

public class KeyboardInputting {

 public static void main(String[] args) {
  System.out.println("あなたの好きな動物はなんですか?");

  // キーボードから文字列の入力をするための命令
  String animal = new java.util.Scanner(System.in).nextLine();

  // animalSize に 1~300 のランダムな数を代入
  int animalSize = new java.util.Random().nextInt(300) + 1;
  System.out.println(animal + "は" + animalSize + "cmくらいですか?");

  // キーボードから整数を入力するための命令
  System.out.println("正しくは何cmくらいですか?");
  int correctSize = new java.util.Scanner(System.in).nextInt();
  System.out.println(animal + "は" + correctSize + "cmですね。わかりました。");

 }
}











文字を入力する場合
String animal = new java.util.Scanner(System.in).nextLine();

数字を入力する場合
int correctSize = new java.util.Scanner(System.in).nextInt();
指定する型 (String , int) と、末尾の nextLine() nextInt() で少し違うので注意!