プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 &...

26
プログラミング演習 第四回

Upload: others

Post on 27-May-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

プログラミング演習第四回

Page 2: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

・ 条件分岐

本日の講義内容

http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.htmlよりダウンロード

Page 3: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

1.条件分岐とは?

Page 4: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

if (条件) {条件が真(TRUE)の時の処理

}else {条件が偽(FALSE)の時の処理

}

条件分岐

条件の書き方x == y 一致x < y xがyより小x <= y xがy以下x > y xがyより大x >= y xがy以上x != y xはyと異なる

== と != は数値だけでなく、文字列についても使える

Page 5: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

x <- 2 if (x > 0) {

sum(1:x) ß- 条件が真(TRUE)の時に実行される} else {

x <- -x ß-条件が偽(FALSE)の時に実行されるsum(1:x)

}

処理が1行の時は、{}で囲まなくても良いx <- -3 if (x > 0) sum(1:x) else {

x <- -x sum(1:x)

}

Page 6: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

x <- 2if (x > 0) {

sum(1:x)}else {

x <- -xsum(1:x)

}

エラー:予想外の ‘else’です in“else”

エラー:予想外の '}'です in"}"

2つのエラーが出力される

前ページのコードと比較し、どこが違うか考えなさい

Page 7: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

x <- -3 if (x > 0) sum(1:x) else {

x <- -x sum(1:x)

}

エラー:予想外の 'else'です in"else”エラー:予想外の '}'です in"}”

前前ページのコードと比較し、どこが違うか考えなさい

Page 8: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

forループや今回学ぶ条件分岐など、複数行にわたるスクリプトを書く場合、メモ帳やこれから説明するRのエディタに一旦書いて、それをRのコンソールにコピペすると良い。

間違っていても修正が簡単

Page 9: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが
Page 10: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

ここに書き込む

Page 11: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

コピーして

ペーストしてエンターをおす

Page 12: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

2.for文 (繰り返し処理)の中で条件分岐を使ってみる

Page 13: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

x <- c(120,10,34,909,21,3,67,221,87,112)len <- length(x)for ( i in 1:len) {

if (x[i] > 100) {print(i)

} else {print("****")

}}

[1] 1[1] "****"[1] "****"[1] 4[1] "****"[1] "****"[1] "****"[1] 8[1] "****"[1] 10>

ベクトル xの要素が100より大ならi を出力

さもなければ**** を出力

Page 14: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

課題1

x <- c(101, 34, 203, 78, 20, 81, 141)for (i in x ) {

if (iが3の倍数) {print(i) ß- その時のiの値を書き出す

} else if (iを3で割った時の剰余が1) {print文 iから1を引いた値を書き出す

} else {print文 iから2を引いた値を書き出す

}

}

ベクトルxの各要素を、その要素と一致するか、それに最も近い3の倍数をかき出すようにしたい赤字の部分をRの言語で書いて、このプログラムを完成させなさい

Page 15: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

[1] 99[1] 33[1] 201[1] 78[1] 18[1] 81[1] 141

ヒント 完成したものの出力は以下のようになる

Page 16: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

3.複数の条件を組み合わせた条件分岐

Page 17: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

複数の条件を組み合わせる

条件1 & 条件2条件1も条件2の真であれば真その他は、偽

条件1 | 条件2条件1か条件2のいずれかが真であれば真両方が偽の時に偽

2条件だけでなく(条件1 & 条件2) | 条件3 などのように複数の条件を組み合わせて利用できる

Page 18: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

&と &&の違い (|と ||の違い)

a <- c(TRUE, TRUE, TRUE, FALSE)b <- c(FALSE, TRUE, FALSE, FALSE)x <- 1y <- 2

‘&’あるいは’|’はベクトルのそれぞれの要素を評価a & bFALSE TRUE FALSE FALSEa | bTRUE TRUE TRUE FALSEc(x==1, y==1) & c(y==2, x==1)TRUE FALSE‘&&’あるいは’||’はベクトルの第一要素のみを評価a && bFALSEa || bTRUEc(x==1, y==1) && c(y==2, x==1)TRUE

Page 19: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

a <- 2 b <- -3 if ((a > 0) && (b > 0)) {

c <- a*b } else c <- -a*b c

6が出力される

Page 20: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

a <- 2 b <- -3 if ((a < 0) || (b < 0)) {

c <- -a*b } else c <- a*b c

6が出力される

Page 21: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

x <- c(120,10,34,909,21,3,67,221,87,112)len <- length(x)

for (i in 1:len) {if ( ) {print(x[i])

}else {

print(i)}

} x[i] は偶数か、x[i]が10以上70以下という条件はどうなるか?

偶数であること => 2で割った余りが0

以上 >=以下 <=

課題2

Page 22: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

4.関数の中で条件分岐を使う

Page 23: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

myfunc <- function(a) {if (a < 0) print(0) else if (a < 1) print(1) else print(2)

}

引数aが負の数なら0, 0から1までの値なら1それ以外なら2を出力する関数

Page 24: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

getEven <- function(filename) {x <- read.table(filename)for (i in 1:length(x[,1])) {

if (i %% 2 == 0) print(matrix(x[i,], ncol=3))}

}

関数はファイル名を引数として与え、そのファイルからの読み出しを関数内で行うことができる

n行3列の行列データが入っているファイルを読ませて、その偶数行だけを出力する関数

このスクリプトをgetEven.Rという名前で保存source(“getEven.R”)でコンソール上から使用できるようになる

実行の仕方getEven(“matrix1.txt”) <- ファイル名を二重引用符で囲むスクリプトやファイルがどのディレクトリにあるかを確認

Page 25: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

matrix1.txt2 4 5 9 9 14 7 21 6 23 4 98 3 42 1 15 2 31 3 62 9 1

getEven(“matrix1.txt”) の出力

> getEven("matrix1.txt")[,1] [,2] [,3]

[1,] 9 9 1 [,1] [,2] [,3]

[1,] 1 6 2 [,1] [,2] [,3]

[1,] 8 3 4 [,1] [,2] [,3]

[1,] 5 2 3 [,1] [,2] [,3]

[1,] 2 9 1

Page 26: プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 & 条件2 条件1も条件2の真であれば真 その他は、偽 条件1| 条件2 条件1か条件2のいずれかが

sizeCheck <- function(a) {if ( 1 ) {

a <- 2} else {

a <- 3 }

return (a)}

課題3

引数 aはベクトルとする1の空欄 If文は、ベクトルのサイズが5より大きい という条件2の空欄 ベクトルaの後ろに 3を付け加えたベクトルを作って、aに代入する

ヒント c(1,2,3…)としてベクトルを作れるが、c(ベクトル1,数、ベクトル2)などのようにして、ベクトルや数を連結した新たなベクトルを作れる

3の空欄 ベクトルaの第一要素を除いたベクトルを作り、aに代入する講義2回目資料参照

※ 関数がreturnで返せるのは数だけではなk

空白を埋めて次の関数を完成させなさい。引数としてベクトルを与えた時にベクトルのサイズが5より大きければ、そのベクトルの最後に3を加えたベクトルを返す。5以下の場合は、第一要素を除去したベクトルを返す。