制御構造 - Haikara Cityhaikara-city.com/wp-content/uploads/2019/04/array.pdf[プロジェクト]...

Preview:

Citation preview

制御構造構造化定理ですべてを書こう

あらゆる処理の正体は• 順次 • 分岐 • 繰り返し

⇛ これらの組み合わせ。

あらゆる処理の正体は

構造化定理

あらゆる処理の正体は• 順次

文1

文2⬇

順番に文を実行する。

あらゆる処理の正体は• 分岐

Yes

No

条件によって違う文

あらゆる処理の正体は• 繰り返し

条件が満たされるまで 同じ文を繰り返す

分岐もし、明日晴れたら 洗濯して買い物行こう。 でも、明日が雨なら 部屋でDVD見よう。

分岐もし、明日晴れたら 洗濯して買い物行こう。 でも、明日が雨なら 部屋でDVD見よう。

条件

条件

分岐もし、明日晴れたら 洗濯して散歩に行こう。 でも、明日が雨なら 部屋でDVD見よう。

条件

条件

分岐フローチャート

if文if(条件){ 条件がなりたつときの処理 }else{ そうじゃなかったときの処理 }

if文

if文

boolean weather = {true

false

比較の条件式if(weather==true){ 晴れた時の処理; } else{ 雨のときの処理; }

比較の条件式if(weather==true){ 晴れた時の処理; } else{ 雨のときの処理; }

比較のイコール

比較のイコールは == を使う!!

陥りがちなミスif(weather=true){ 晴れた時の処理; } else{ 雨のときの処理; }

練習3-4【プロジェクト名】pra3-4

以下のソースコードを完成させよ。public class Main{ public static void main(String[] args){ boolean weather = true;

} }

weatherがtrueなら、 「洗濯して散歩行こう」と画面表示。 weatherがfalseなら、 「部屋でDVD見よう」と画面表示。

繰り返しもし誰かがトイレに 入っていたら 「ノック⇛1分待つ」 を繰り返す。

繰り返し

while文

while(条件){ 条件がなりたつときの処理 }

while文

while(条件){ 条件がなりたつときの処理 } ⬆条件が成り立っている間繰り返す

繰り返し

繰り返し

boolean doorclose = {true

false

例3-6 【プロジェクト名】ex3-6

public class Main{ public staric void main(String[] args){

boolean doorClose = true;

while(doorClose==true){ System.out.println(“ノックします。”); System.out.println(“1分待ちます。”);

} }

}

例3-6 【プロジェクト名】ex3-6

public class Main{ public staric void main(String[] args){

boolean doorClose = true;

while(doorClose==true){ System.out.println(“ノックします。”); System.out.println(“1分待ちます。”);

} }

}

関係演算子関係演算子 意味

右辺と左辺が等しい

右辺と左辺が等しくない

左辺が右辺より大きい

左辺が右辺より小さい

左辺が右辺以上

左辺が右辺以下

==

!=

>

<

>=

<=

例3-7a==10

⇛ aが10と等しい x!=0

⇛ xが0でない。 i<=10

⇛ iが10以下である。 j<5

⇛ jが5未満である。

論理演算子

演算子 意味 例

&& かつ (AND) (x>0)&&(y>0)

|| または (OR) (a<=-1)||(a>=1)

テスト

例3-7-2

a<-1 または a>1 であり,かつ

b<-2 または b>2

例3-7-2

((a<-1)||(a>1)) && ((b<-2)||(b>2))

例3-8ユーザが文字列を入力し、それが「こんにちは」である場合だけ、「こんにちは」と表示するプログラムを作成せよ。

例3-8public class Main{

public static void main(String[] args){ String str = new java.util.Scanner(System.in).nextLine(); if(str==“こんにちは”){

System.out.println(“こんにちは”); }

} }

例3-8public class Main{

public staric void main(String[] args){ String str = new java.util.Scanner(system.in).nextLine(); if(str==“こんにちは”){

System.out.println(“こんにちは”); }

} }

こう書きませんでしたか?

文字列の比較

これは最初に必ず陥るミス。

文字列の比較

これは最初に必ず陥るミス。しかも、「コンパイルには通るが、  なんか動きがおかしい」という、厄介な感じになる。

文字列の比較

文字列のs1,s2の比較s1.equals(s2)

鲾鲱鳀

練習3-4-2 [プロジェクト名] pra3-4-2

キーボードから数値を入力し, 以下のように表示するプログラムを

作りなさい.• 0から10の間の数 ⇛ 「正解です」 • それ以外の数 ⇛「不正解です」

回数が決まった繰り返しfor文

n回繰り返しのテンプレテスト

回数が決まった繰り返しfor文

n回繰り返しのテンプレテスト

回数が決まった繰り返しfor文

n回繰り返しのテンプレ

for(int i=0; i<n; i++){ 繰り返したい処理 }

テスト

詳しく見てみる

for(int i=0; i<n; i++){…i : ループカウンタ

iの初期化 ループが 続く条件

ループ カウンタの 更新

詳しく見てみる

for(int i=0; i<n; i++){…i : ループカウンタ

iの初期化 ループが 続く条件

ループ カウンタの 更新

詳しく見てみるfor(int i=0; i<n; i++){…

• i=0からスタート → ループ1回目実行 • i=1に更新 →ループ2回目実行 • i=2に更新 →ループ3回目実行

詳しく見てみるfor(int i=0; i<n; i++){…

• i=0からスタート → ループ1回目実行 • i=1に更新 →ループ2回目実行 • i=2に更新 →ループ3回目実行

...

詳しく見てみるfor(int i=0; i<n; i++){…

• i=0からスタート → ループ1回目実行 • i=1に更新 →ループ2回目実行 • i=2に更新 →ループ3回目実行

...• i=n-2に更新 → ループn-1回目実行 • i=n-1に更新 → ループn回目実行

詳しく見てみるfor(int i=0; i<n; i++){…

• i=0からスタート → ループ1回目実行 • i=1に更新 →ループ2回目実行 • i=2に更新 →ループ3回目実行

...• i=n-2に更新 → ループn-1回目実行 • i=n-1に更新 → ループn回目実行 • i=nには更新 → ループ脱出 (i=nは継続条件i<nを満たさないから)

簡単にいうと

for(int i=0; i<n; i++){…ここからはじまる

簡単にいうと

for(int i=0; i<n; i++){…ここからはじまる

この間続く

簡単にいうと

for(int i=0; i<n; i++){…ここからはじまる

この間続く

iの増え方

簡単にいうと

for(int i=0; i<n; i++){…ここからはじまる

この間続く

iの増え方

例3-8

“Hello”という単語を 100回表示する プログラムを書きなさい。

例3-8よくない例(100回コピペ)

System.out.println(“Hello”); System.out.println(“Hello”); System.out.println(“Hello”); System.out.println(“Hello”); ………System.out.println(“Hello”); System.out.println(“Hello”);

例3-8

for(int i=0; i<100; i++){ System.out.println(“Hello”); }

例3-8

for(int i=0; i<100; i++){ System.out.println(“Hello”); }

100回繰り返しテンプレート

例3-9

1~100までの 総和を求めるプログラム を書きなさい。

例3-9イメージ

❒sum最初は0

for(i=0; i<100; i++)

例3-9イメージ

❒sum最初は0

例3-9イメージ

❒sum+1

最初は0

i=0

例3-9イメージ

❒sum+1

最初は0

+2

i=0

i=1

例3-9イメージ

❒sum+1

最初は0

+2 +3

i=0

i=1 i=2

例3-9イメージ

❒sum+1

最初は0

+2 +3

i=0

i=1 i=2

例3-9イメージ

❒sum+1

最初は0

+2 +3 +99

i=0

i=1 i=2 i=98

例3-9イメージ

❒sum+1

最初は0

+2 +3 +99+100

i=0

i=1 i=2 i=98

i=99…

例3-9イメージ

❒sum+1

最初は0

+2 +3 +99+100

i=0

i=1 i=2 i=98

i=99…

1+2+3+…+100

例3-9

int sum=0;

例3-9

for(int i=0; i<100; i++){ sum += i+1; }

int sum=0;

練習3-5 [プロジェクト名] pra3-5

10! (10の階乗)を計算する プログラムを書きなさい. (ループを使うこと)10! = 10×9×…×2×1

練習3-5 [プロジェクト名] pra3-5

int fact=1; for(int i=0; i<10; i++){fact *= i+1;}

練習3-6 [プロジェクト名] pra3-6

個数を表す数値を入力し, その個数だけ*を表示する プログラムを作成せよ.

(例) 5を入力 → *****

練習3-6 [プロジェクト名] pra3-6

int n = new java.util.Scanner(System.in).nextInt(); for(int i=0; i<n; i++){System.out.print(“*”);}

練習3-6 [プロジェクト名] pra3-6

int n = new java.util.Scanner(System.in).nextInt(); for(int i=0; i<n; i++){System.out.print(“*”);}

n回繰り返しテンプレート

いろんなforループi : ループカウンタ

• for(int i=0; i<10; i++)• for(int i=1; i<=10; i++)• for(int i=10; i>=1; i- -)

ネスト(入れ子)

for(int i=0; i<10; i++){ for(int j=0; j<10; j++){ System.out.println(“i=”+i+”,j=”+j);

}}

ネスト(入れ子)

for(int i=0; i<10; i++){ for(int j=0; j<10; j++){ System.out.println(“i=”+i+”,j=”+j);

}}

forループの中にforループ ⇛ ループのネスト(入れ子)

例3-10

for(int i=0; i<10; i++){ for(int j=0; j<10; j++){ System.out.println(“i=”+i+”,j=”+j);

}}

実行して,iとjの動きを確かめよ.

練習3-7 [プロジェクト名] pra3-7

九九の表を出力する プログラムを書いてください。 (forループをネストする) ※レイアウトはこだわろうと思えばこだわれますが、テキトーでいいです。

テスト

どんどん質問を!! 演習4

配列同じ型をまとめて扱う便利機能

とあるコード文字列を5つ入力し、つづけて表示するプログラム。String str1 = new java.util.Scanner(System.in).nextLine();String str2 = new java.util.Scanner(System.in).nextLine();String str3 = new java.util.Scanner(System.in).nextLine();String str4 = new java.util.Scanner(System.in).nextLine();String str5 = new java.util.Scanner(System.in).nextLine();

System.out.println(str1 + str2 + str3 + str4 + str5);

とあるコード

効率が悪い

配列同じ型の変数の並び。

❒❒❒❒❒array[0][1][2][3][4]

配列同じ型の変数の並び。

❒❒❒❒❒array[0][1][2][3][4]

array[0], array[1], array[2], array[3], array[4]

同じ型の変数。

宣言

int[] score; score = new int[5]

宣言

int[] score; score = new int[5]

配列変数

int型を5個作って配列変数scoreに代入

宣言

同時にもできる

int[] score = new int[5];

練習5-1 [プロジェクト] pra5-1

長さ5のint型配列 score 長さ10のdouble型配列 array 長さ3のboolean型配列 results 長さ4のString型配列 names

を宣言してみよ。

練習5-1

int[] score = new int[5];double[] array = new double[10];boolean[] results = new boolean[3];String[] names = new String[4];

[プロジェクト] pra5-1

配列は勝手に初期化配列の各要素は勝手に初期化される。

int, double型などの数値型:0に初期化

boolean型 : falseに初期化

String型:nullに初期化(後述)

初期化の省略記法

int[] score={20,30,40,50,60};

❒❒❒❒❒score[0][1][2][3][4]20 30 40 50 60

配列の要素を扱う❒❒❒❒❒score[0][1][2][3][4]20 30 40 50 60

System.out.println(score[3]); score[3] = 10; System.out.println(score[3]);

配列の要素を扱う❒❒❒❒❒score[0][1][2][3][4]20 30 40 50 60

System.out.println(score[3]); score[3] = 10; System.out.println(score[3]);

配列の長さ

score.length

❒❒❒❒❒score[0][1][2][3][4]20 30 40 50 60

配列のメリット

forループと、相性がよい

例5-1

❒❒❒❒❒score[0][1][2][3][4]20 30 40 50 60

全部の要素を画面に表示したい。

例5-1❒❒❒❒❒score[0][1][2][3][4]20 30 40 50 60

System.out.println(score[0]); System.out.println(score[1]); System.out.println(score[2]); System.out.println(score[3]); System.out.println(score[4]);

例5-1❒❒❒❒❒score[0][1][2][3][4]20 30 40 50 60

for(int i=0; i<score.length; i++){ System.out.println(score[i]); }

例5-1

for(int i=0; i<score.length; i++){ System.out.println(score[i]); }

System.out.println(score[0]); System.out.println(score[1]); System.out.println(score[2]); System.out.println(score[3]); System.out.println(score[4]);

例5-2

for(int i=0; i<score.length; i++){ score[i]=1; //全部に1を代入 }

score[0]=1; score[1]=1; score[2]=1; score[3]=1; score[4]=1;

練習5-2 [プロジェクト] pra5-2

長さ100のint型配列numを宣言し、 以下のように各要素に値を代入する

プログラムを書きなさい。 num[0]=0, num[1]=1, …, num[99]=99

練習5-2

int[] num = new int[100];for(int i=0; i<num.length; i++){num[i]=i; //第i要素にiを代入}

[プロジェクト] pra5-2

拡張for文❒❒❒❒❒score[0][1][2][3][4]20 30 40 50 60

for(int i=0; i<score.length; i++){ System.out.println(score[i]); }

鲾鲱鳀

拡張for文❒❒❒❒❒score[0][1][2][3][4]20 30 40 50 60

for(int num : score){ System.out.println(num); }配列の各要素を見るときに 便利なfor文の書き方

鲾鲱鳀

拡張for文❒❒❒❒❒score[0][1][2][3][4]20 30 40 50 60for(int num : score){

System.out.println(num); }

鲾鲱鳀

拡張for文❒❒❒❒❒score[0][1][2][3][4]20 30 40 50 60for(int num : score){

System.out.println(num); }

• num = score[0] • num = score[1] • num = score[2] • num = score[3] • num = score[4]

鲾鲱鳀

練習5-3 [プロジェクト] pra5-3

int型で長さ5の配列numを {10,20,30,40,50}で初期化し、 各要素を以下のように順に表示する プログラムを作成せよ。拡張for文を用いること。

10 20 30 40 50

練習5-3 [プロジェクト] pra5-3

int[] num = {10,20,30,40,50};for(int n : num){System.out.println(n);}

練習5-4 [プロジェクト] pra5-4

まずint型配列aを、int[] a={10, 20, 30, 40, 50}; として初期化し、 配列aと同じ要素数を格納できるint型一次元配列bを宣言する。 ループを利用し、配列bの各要素に配列aの要素を 逆順に格納するプログラムを作成せよ。 結果は配列aと配列bの各要素を拡張for文を使って同時に画面表示すること。

aの要素を順に表示します。 10 20 30 40 50 bの要素を順に表示します。 50 40 30 20 10

練習5-4 [プロジェクト] pra5-4

int[] a = {10,20,30,40,50};int[] b = new int[5];

for(int i=0; i<a.length; i++){b[b.legth-1—i]=a[i];}

System.out.println(“aの要素を表示します”);for(int num : a){System.out.print(a + “ ”);}System.out.println(“bの要素を表示します”);for(int num : b){System.out.print(b + “ ”);}

例5-3 [プロジェクト] ex5-3

次のコードを実行してみよ。何が起こるか?

int[] num = {1,1,1,1,1};

for(int i=1; i<=5; i++){System.out.println(num[i]);}

例5-3 [プロジェクト] ex5-3

❒❒❒❒❒num[0][1][2][3][4]1 1 1 1 1

例5-3 [プロジェクト] ex5-3

❒❒❒❒❒num[0][1][2][3][4]1 1 1 1 1

for(int i=1; i<=5; i++){System.out.println(num[i]);}

例5-3 [プロジェクト] ex5-3

❒❒❒❒❒num[0][1][2][3][4]1 1 1 1 1

for(int i=1; i<=5; i++){System.out.println(num[i]);} num[1]

num[2] num[3] num[4] num[5]

例外

ArrayIndexOutOfBoundsException

例外

ArrayIndexOutOfBoundsException

配列の外のデータを参照

舞台裏int[] a = {1,2,3};int[] b;

b=a;b[0]=100;

System.out.println(a[0]);

舞台裏

配列変数の正体

配列変数は 先頭の要素の「メモリ番地」 (アドレス)をあらわす。

舞台裏

どんどん質問を!! 演習5

Recommended