Upload
others
View
0
Download
0
Embed Size (px)
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