前回の記事でDNCLの「演習問題1」~「6 比較演算」までご説明しました
今回も「なでしこ」というサイトの「なでしこ3簡易エディタ」を使ってプログラムを書いていきます
必ず1行目に半角で「!DNCL2」もしくは全角で「!DNCL2」と記述してください

引用元:なでしこ3簡易エディタ
著作権:kujirahand
7 論理演算
ある条件を満たしているか判断する際に日本語の「かつ」や「または」や「ではない」に相当するものを論理演算と言い、順番に「 and 」「 or 」「 not 」の3種類があります
比較演算と論理演算を組み合わせて「 条件1 論理演算 条件2」の様に使われます
!DNCL2
"Aに数字を入力してください"と尋ねてAに代入
"Bに数字を入力してください"と尋ねてBに代入
もし、A > 10 and B > 10 ならば:
表示する("どちらも10を超えています")#メッセージ1
を実行し、そうでなくもし A > 10 or B > 10 ならば:
表示する("どちらかは10を超えています")#メッセージ2
そうでなければ:
表示する("どちらも10は超えていません")#メッセージ3
上記のように記述し、「▶実行」ボタンをクリックすると以下のような入力フォームが表示されるので値を入力して「OK」をクリックすると結果が表示されます


メッセージ1 | メッセージ2 | メッセージ3 |



AとBの値と実行結果のメッセージの組み合わせは以下の4パターンとなります
A | B | 実行結果 |
11 | 11 | メッセージ1 |
9 | 11 | メッセージ2 |
11 | 9 | メッセージ2 |
9 | 9 | メッセージ3 |
論理演算は「 条件1 論理演算 条件2 論理演算 条件3 」の様に複数組み合わせて使用することも可能で、その場合は左から先に判定されるので(条件1 論理演算 条件2) 論理演算 条件3 の順になります
!DNCL2
"Aに数字を入力してください"と尋ねてAに代入
"Bに数字を入力してください"と尋ねてBに代入
"Cに数字を入力してください"と尋ねてCに代入
もし、A > 10 and B > 10 and C > 10 ならば:
表示する("全て10を超えています")#メッセージ1
を実行し、そうでなくもし A > 10 or B > 10 and C > 10 ならば:
表示する("AかBのどちらか10を超えていて、かつCは10を超えています")#メッセージ2
を実行し、そうでなくもし A > 10 and B > 10 or C > 10 ならば:
表示する("AとBの両方10を超えている、またはCが10を超えています")#メッセージ3
を実行し、そうでなくもし A > 10 or B > 10 or C > 10 ならば:
表示する("AかBのどちらか1つだけ10を超えています")#メッセージ4
そうでなければ:
表示する("どれも10を超えていません")#メッセージ5
上記のように記述し、「▶実行」ボタンをクリックすると以下のような入力フォームが表示されるので値を入力して「OK」をクリックすると結果が表示されます



メッセージ1 | メッセージ2 | メッセージ5 |



メッセージ3 | メッセージ4 |


AとBとCの値と実行結果のメッセージの組み合わせは以下の8パターンとなります
A | B | C | 実行結果 |
11 | 11 | 11 | メッセージ1 |
9 | 11 | 11 | メッセージ2 |
11 | 9 | 11 | メッセージ2 |
11 | 11 | 9 | メッセージ3 |
9 | 9 | 11 | メッセージ3 |
11 | 9 | 9 | メッセージ4 |
9 | 11 | 9 | メッセージ4 |
9 | 9 | 9 | メッセージ5 |
条件の反対の意味で判定する場合は 「 not 」を条件の前に付けて、条件を()で囲みます
!DNCL2
"Aに何か数字を入力してください"と尋ねてAに代入
もし not (A > 10) ならば:
表示する("Aは10より大きくないです")
そうでなければ:
表示する("Aは10より大きくなく無いです")
上記のように記述し、「▶実行」ボタンをクリックすると以下のような入力フォームが表示されるので値を入力して「OK」をクリックすると結果が表示されます
【A > 10 の場合】


【A <= 10 の場合】


8 繰り返し
同じ処理を何度も繰り返すことをループといいます
ループには以下の2種類あり、それぞれ書き方が異なります
① 決められた回数だけ同じ処理を繰り返すループ
② 条件を満たす間同じ処理を繰り返すループ
まずは①の書き方から見てみましょう
!DNCL2
iを1から5まで1ずつ増やしながら繰り返す:
表示する(i)
上記のように記述し、「▶実行」ボタンをクリックすると以下の結果が表示されます

この i というのはループのカウンターの役割をする変数で、要するに5回ループするという意味です
今度は1~10まで順番に数字を足していった合計を表示するプログラムを書いてみましょう
!DNCL2
goukei = 0
iを1から10まで1ずつ増やしながら繰り返す:
goukei = goukei + i
表示する(goukei)
上記のように記述し、「▶実行」ボタンをクリックすると以下の結果が表示されます

このように決まった回数だけ同じ処理を繰り返したい時は①のループを使います
つぎに②の書き方を見てみましょう
!DNCL2
yosan = 1000
表示する("現在" , yosan , "円持っています")
(yosan > 0)の間繰り返す:
"いくら使いますか?"と尋ねてtsukauに代入
yosan = yosan - tsukau
表示する(tsukau , "円使いました")
表示する("残りは" , yosan , "円です")
表示する("破産しました")
上記のように記述し、「▶実行」ボタンをクリックすると以下のような入力フォームが表示されるので値を入力して「OK」をクリックすると結果が表示されます




最初に変数yosan に 1000を代入し、「現在1000円持っています」と表示されます
その後、yosanが0より多い間は「いくら使いますか?」と質問し、入力した数値を変数tsukauに代入しyosan から tsukau を引いた値を 新たにyosanに代入し、「●●円使いました」「残りは▲▲円です」と表示するループを繰り返します
このように回数が決まっておらず条件を満たす間は何度でも繰り返したい時は②のループを使います
状況に応じて①と②のループを使い分けられるようになりましょう
ループと条件分岐を組み合わせて使うことがよくあります
例えば、以下のように4回繰り返し質問して、正解する数を数える場合などに使えます
(今回はループ①の書き方で書きますががループ②の書き方でも同じです)
!DNCL2
seikai = 0
kagawa = 0
kouchi = 0
tokusima = 0
ehime = 0
iを1から4まで1ずつ増やしながら繰り返す:
"四国地方の県を4つ全て漢字で答えてください"と尋ねてkenに代入
もし、ken == "香川県" and kagawa == 0 ならば:
seikai = seikai + 1
kagawa = 1
を実行し、そうでなくもし ken == "高知県" and kouchi == 0 ならば:
seikai = seikai + 1
kouchi = 1
を実行し、そうでなくもし ken == "徳島県" and tokusima == 0 ならば:
seikai = seikai + 1
tokusima = 1
を実行し、そうでなくもし ken == "愛媛県" and ehime == 0 ならば:
seikai = seikai + 1
ehime = 1
表示する("あなたは" , seikai , "問正解しました")
上記のように記述し、「▶実行」ボタンをクリックすると以下のような入力フォームが表示されるので値を入力して「OK」をクリックすると結果が表示されます(正解数に応じて以下のどれか)





ここでは同じ答えを何回もカウントしないように、四国のそれぞれの県ごとの変数(kagawa、kouchi、tokusima、ehime)を初期状態で0とし、正解したら1に変えるようにしています
このような正解したか正解していないかのような2択を判断するための変数を「フラグ変数」と言います
ループと条件分岐を組み合わせて、特定の条件を満たす場合はまだ繰り返しの途中でも
そこで繰り返しを終わりにして、ループを抜け出すことも出来ます
!DNCL2
count = 0
iを1から47まで1ずつ増やしながら繰り返す:
"47都道府県を全て入力してください。
途中で飽きて止めたくなったら
「飽きた」と入力してください"と尋ねてkenに代入
もし、ken == "飽きた" ならば:
count = count + 1 を実行し、抜ける。
そうでなければ:
count = count + 1
表示する("あなたは" , count , "回入力しました")
上記のように記述し、「▶実行」ボタンをクリックすると以下のような入力フォームが表示されるので値を入力して「OK」をクリックすると結果が表示されます
【47回入力してループを終えた場合】


【5回目で「飽きた」と入力してループを途中で抜けた場合】


ここまでの内容をちゃんと理解できているか確認するため、次回は演習問題2に取り組んでもらいます
すぐに解答を見ないで自分でよく考えて実際にプログラムを書いてみてください
コメント