【初心者向け】Java入門　Java言語の基礎知識③配列、選択構造、反復構造

第3回Java初心者向けの基礎知識の解説を行います。まだご覧になっていない方は過去記事も是非ご覧ください↓
<a href = "https://qiita.com/kazuiti10/items/a4a4966b78654a5454eb">「【初心者向け】Java入門　Java言語の基礎知識①」</a>
<a href = "https://qiita.com/kazuiti10/items/81c2d922f4aa3cc60764">「【初心者向け】Java入門　Java言語の基礎知識②識別子、変数、演算子」</a>
今回はアルゴリズムの基本構造である選択構造、反復構造を扱うJavaでの制御文と配列の解説をしていきます。
#配列
同じ型の変数の集まりをひとまとめにして扱うためにのデータ構造を配列といいます。基本データ型やString型を一度に複数個使用するときに便利です。例えばプログラム内で30個の値を使用する時、変数の場合は30回宣言が必要ですが、配列だと1回の宣言で、領域の確保と値の使用が可能です。配列の中に格納されている値の個数を要素数といいます。要素数には個別を識別するために、要素番号が割り振られていて、要素番号は0からスタートします。配列を使用するためには、配列名と要素数の指定が必要です。
![配列.jpg](https://qiita-image-store.s3.amazonaws.com/0/299197/c314441f-c5cd-5980-a17f-0c9785eb4c86.jpeg)
書式と例は以下の通りです。


<b><span style="font-size: 120%"><b>1.配列の変数宣言</b></span></b>

<code>型名[] 配列名;または型名 配列名[];</code>　
例：数値型のnumbers配列を定義
<code>int[] numbers;</code>

<span style="font-size: 120%"><b>2.配列の領域確保</b></span>

<code>配列名=new 型名[要素数];</code> 
例：要素数5の数値型のnumbers配列を定義
<code>numbers= new int[5];</code>

<span style="font-size: 120%"><b>3.1と2を同時に行う例</b></span>

<code>int[]a = new int[5]</code>

<span style="font-size: 120%"><b>4.配列の要素に代入</b></span>

<code>配列名[要素番号] = 値;</code>　
例:numbers配列の0番目に11を代入　
<code>numbers[0]=11;<code>

<span style="font-size: 120%"><b>5.配列変数宣言、領域確保、配列の初期化を同時に行う</b></span>

<code>型名[]配列名={初期値1,初期値2…};</code>
例：数値型のages配列を作成し11,22,33,44で初期化
<code>int []ages = {11,22,33,44};</code>

#選択構造
条件によって処理を分岐し、実行させる構造を選択構造といいます。

例えば、降水確率が50%以上のときは、傘を持っていき、50%未満、30%以上の時は、折り畳み傘を持っていき、それ以外の時は何ももっていかないと仮にします。この時、降水確率が50%以上の時と、50%以上30%未満の時と、それ以外の時で処理が分岐し、それぞれの条件によって違った処理を行います。
![選択.jpg](https://qiita-image-store.s3.amazonaws.com/0/299197/72a54b09-a5ac-7898-d650-084868fcb0b5.jpeg)

#選択構造制御文①IF-else文
IF-else文は、条件式の結果が真(true)または偽(false)によって２分岐を行う選択構造の制御文の１つです。条件式は関係演算や論理演算などを使って計算します。IF-else文を連続して使用し多分岐構造も作成できますが、多分岐構造を作成すると可読性が低くなるので注意が必要です。書式は以下の通りです。

<span style="font-size: 120%"><b>１．if-elseのみ</b></span>

条件式が正しいときは処理１、正しくない時は処理２を行います。

```
if(条件式)
　　処理1;
}else{
　　処理2;
}
```

<b><span style="font-size: 120%">２．if-else if-else</span></b>

条件式１が正しい時は処理１、条件式１が正しくなくて条件式２が正しいときは処理２、条件式１も条件式２も正しくないときは処理３を行います。

```
if(条件式１){
　　処理1;
}else if(条件式2){
　　処理2;
} else{
　　処理3;
}
```

例：年齢によって処理を分岐

```java
int age = 25; //age（年齢）変数を宣言し初期値として25を設定
if(age < 18) {//年齢が18歳未満だと未成年出力
     System.out.println("未成年");
}
else if(age >= 60){ //年齢が60歳以上だと高齢者出力
     System.out.println("高齢者");
}else{//18歳未満でも60歳以上でもなければ成年出力
     System.out.println("成年");
}
```
※この例だと年齢が25歳なので成年を出力します。

#条件分岐②switch-case文
式の値をもとに多分岐を行う制御構造です。case文で値を記述し、式と値が等しいかを判定します。どの値にも一致しなかった場合にはdefaultに記述された処理が実行されます。case文の後には必ず、break;が必要で、break;を記述しなければ一致してもswitch文を抜けずに、必要以上に処理を行います。１つのswitch文で複数の処理分岐を行えるため、簡単にプログラムを記述することができます。ただ、Javaのswitch-case文は値の範囲を指定できない制限があります。書式は以下の通りです。

```
switch(式){
　　case 値1:
　　　　（式の中身と値1が一致した場合の）処理;
　　　　　break; //スイッチ文から抜け出す。
　　case 値2:
　　　　（式の中身と値２が一致した場合の）処理;
　　　　　break;
　　default:
　　　　（式の中身がどの値とも一致しなかった場合の）処理;
}
```
例 ：成績をもとにswitchi文を使い結果を出力する。

```java
char rank = 'A'; //rank(成績)変数を宣言し’A’で初期化

String result; //result(結果)変数を宣言
//変数rankを判定
switch(rank){
    case 'A': //rank がAの場合
       result = "優"; //結果に優を入れる。
       break;
    case 'B': //rankがBの場合
       result = "良"; //結果に良を入れる。
       break;
    case 'C': //rank がCの場合
       result = "可";
       break;
    default: //AでもBでもCでもない場
       result = "不可"; //結果に不可を入れる。
}
System.out.println("結果は" + result + "です。");//優が出力。
```
#反復構造
処理の途中で設定した条件を満たす間、指定された処理を繰り返します。例えば、1日腹筋300回行うという人がいたとして、その人は300回腹筋が終わるまで腹筋を繰り返し、腹筋が300回終わるまでの間、腹筋が鍛えられるという処理を行います。
![反復.jpg](https://qiita-image-store.s3.amazonaws.com/0/299197/27d44f50-d9ba-c7b2-b2b5-6bb3956ccbd3.jpeg)

#反復構造の制御文①(while文)
条件を満たしている間、同じ処理を繰り返す反復構造です。条件判定を行った後に処理を実行します。条件式に満たしていない間は１回処理が実行されません。書式と例は以下の通りです。なお、例で標準入力を使用していますが、今は、キーボードからパスワードを入力しているんだ程度で大丈夫です。

```
while(条件式){
　　処理
}
```
例 ：パスワードが一致するまで繰り返しを行う

```java
int hantei=0
String password;
while( hantei != 999 ){ //判定999になる＝パスワード一致するまで繰り返し
    System.out.println("パスワードを入力してください。");
    Scanner sc = new Scanner(System.in);//キーボードから文字を入力
    password = sc.next() //入力した文字をパスワードに渡す。
    if(password == “99999”){//入力文字とパスワードを確認。
       hantei =999; //等しければ判定に999を入れて繰り返し抜ける
       System.out.println("ログイン成功");
    else{
       System.out.println("ログイン失敗")
    }
}
```
#反復構造の制御文②(do-while文)
while文は、条件判定を行った後に処理を実行する文でしたが、do-while文は先に処理を実行して、その後、条件判定を行います。書式と例は以下の通りです。

```
do{
　　処理;
}

while(条件式);
```
用例 ：1が入力するまで繰り返しを行う

```java
int number;
do{
    System.out.println("1を入力したら繰り返し抜けれます。");
    Scanner sc = new Scanner(System.in);
    number = sc.nextInt();
}while(number !=1); //numberが1ではない間繰り返す。
```
#反復構造の制御文③(for文)

for文は初期式で設定したカウンタ変数が条件式を満たすまで、同じ処理を繰り返す反復構造です。繰り返しの回数を数える変数をカウンタ変数といいます。初期設定では初期値を設定し、条件式では継続条件を設定し、式では繰り返し処理が１回起こるたびに行う処理を設定します。初期設定と条件式と式の区切りには;(セミコロン)が必要です。

```
for( 初期設定 ; 条件式 ; 式 ){
　　処理;
}
```
例 繰り返しの回数を出力する。

```java
for( int i=1 ; i<4 ; i++ ){ //iは1から始まって1ずつ増え4未満の間繰り返し
    System.out.println(i+"回"); //1回、2回、3回と表示される。
}
```
※for文とwhile文ではfor文の方が使う頻度高く、while文が繰り返し回数が決まっていないもの、for文が繰り返し回数が決まっているものを使い分けることが多いです。

反復構造④拡張for文
拡張for文は配列などの要素の集合に対して、反復処理を行うための構文です。要素の先頭から末尾まで順番に参照しながら繰り返しを行います。初期値の設定、式が必要ないため簡単に記述できます。書式と例は以下の通りです。

書式

```
for(変数宣言:配列名){
　　処理
}
```
例:numbers配列の全ての要素を出力する。

```java
int numbers[] = {1,2,3,4,5};
for(int number:numbers){
    System.out.println(number);
}
```
配列と拡張for文とif文組み合わせた用例
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/299197/55989d98-5f17-4c9d-d72a-e14858b224da.png)



for文の中にfor文を使った用例
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/299197/acc0fa98-0a13-c968-7500-9802acd0af82.png)
#まとめ
####同じ型の変数の集まりのデータ構造を配列
####配列だと1回の宣言で、領域の確保と値の使用が可能
####配列を使用するためには配列名と要素数の指定が必要
####条件によって処理を分岐し、実行させる構造を選択構造
####選択構造の中で範囲を指定して分岐＝if-else文、多分岐＝switch文を使用

####処理の途中で設定した条件を満たす間、指定された処理を繰り返す構造を反復構造

####反復構造の中で繰り返し回数決まっている＝for文、繰り返しが回数不定＝while文を使用
今回は、以上です。最後まで読んでくださりありがとうございました。次回は、いよいよ、オブジェクト指向について説明していきます。