プログラミング入門I
2024.11.25
for 文
予想していたことですが,タイムプレッシャーがかかるテストではエラー続発でした.ただ,エラーの中には,きちんとした処理を書いていながらも途中で時間切れになっているものも見られましたので,それらについては多少部分点をつけています.単純な文法間違いや記述間違いはやはり0点としています. 実行時エラー: b2404 b2407 b2409 b2410 b2415 b2423 b2432 b2437 b2443 b2455 b2458 b2465 前回の宿題提出: b2435 ヘッダ部分の番号間違い: b2416 出力時番号間違い: c02 ハイフンラインなし: b2416 以下は例によって問題のあるプログラムの例です.参考にしてください.
全体としては2つのスイッチに状態がそれぞれ2つあるので,条件は4つに分かれるという基本的なことが処理の中で実現されていないものが多くみられました.論理的にきちんと考えてから処理を書くようにしないといけません.
それと変数名の先頭に大文字を使う人が多くなってきました.変数名は小文字で始めるというマナーを今一度思い出してください.
("#################################") ("#") ("# プログラミング入門Ⅰ 宿題 2024,11,11") ("# 学生番号: s246058") ("# 氏名: 安田 清兵衛") ("#") ("#################################") |
だ~か~ら~,ヘッダいじるのやめろって言ってるだろうが!どうしてダウンロードしないの?
if num1 = 1: print('s1: ON') else num1 = 2: print('s1: OFF') |
やりがちな間違いの例としてWebテキストで紹介していたものですね.他の言語ではエラーではなく間違った処理になるのですが,Python ではエラーメッセージで教えてくれます.さらには else 節は当然ですが条件式を書きません.それ以外なんだから,条件はもう付けません.
if S1 == 0: if S2 == 0: Light == ON |
上のこちらもエラーになった例です.代入に比較演算子の == を使ってしまったのでエラーです.さらに,文字列を代入したいのなら,引用符が必要です.
if s1 == 1: s1 = ON else: s1 = OFF if s2 == 1: s2 = ON else: s2 = OFF if s1 == 1: if s1 == s2: Light = ON else: Light = OFF |
こちらも同様に文字列を指定する引用符を忘れているので,エラーになっています.基本中の基本なんですが,まだ身についていないということでしょうかね.
if s1 == 1: print('S1: ON') elif s1 == 0: print('S2: OFF') if s2 == 1: print('S2: ON') elif s2 == 0: print('S2: OFF') |
上のものもエラーの例です.if に対する elif は同じ階層のインデントでなければいけないのですが,if 節の中にインデントされてはいっているので,elif の前提となる if が無いというエラー場出たはずです.しかも,今回は if が偽になった場合は1通りしかないので,elif ではなく,else が適切です.
num1=random.randint(0,9) if 0 <= num1 <= 4: print(f'S1: ON') else: print(f'S1: OFF') |
1/2 の確率で2つの乱数を発生させるのに,このような面倒な処理は不要です.
num1 = random.random() num2 = random.random() |
こちらもたかが2通りの乱数を用意するだけなのに,実数の乱数は要らないです.
if S1 == 0: print(f'S1: ON') elif S1 == 1: print(f'S1: OFF') |
先ほどの例にもありましたが,elif ではなく else を使用すべきです.
if S1 == 1 and S2 == 1: print(f"S1: ON S2: ON Light: ON") else: print(f"S1: ON S2: OFF Light: OFF") |
場合は4通りあるのに,2つに集約してしまっているので,結果がおかしくなります.つまり,スイッチが OFF ON と OFF OFF の場合がありません.
if swich1 == swich2 == 1: print("S1: ON") print("S2: ON") print("Light: ON") elif swich1==1 and swich2==2 : print("S1: ON") print("S2: OFF") print("Light: oFF") elif swich1==2 and swich2==1 : print("S1: OFF") print("S2: ON") print("Light: oFF") |
今回上のような処理が何例か見られました.3行分の表示をまとめて実行しようとしているので,処理が複雑になるし,文字数が無駄に増えます.さらに,途中で時間がなくなったのか,最後の else が無いですね.綴りも間違っていますし.
num1=random.randint(1,2)//2 num2=random.randint(1,2)//2 if num1==1 and num2==1: print(f'S1:ON') print(f'S2:ON') print(f'Light:ON') elif num1==1 and num2==0: print(f'S1:ON') print(f'S2:OFF') print(f'Light:OFF') elif num1==0 and num2==1: print(f'S1:OFF') print(f'S2:ON') print(f'Light:OFF') elif num1==0 and num2==0: print(f'S1:OFF') print(f'S2:OFF') print(f'Light:OFF') |
こちらも3行分まとめて条件分岐させようとしているので複雑になっていますが,その前にまずよくわからないことをしています.1もしくは2を発生させたのに,それを0と1に変えていますが,だったら最初から0と1を作れば良さそうなものです.さらに最後が else になっていないですね.
if num1==1: num3=('ON') if num1==2: num3=('OFF') if num2==1: num4=('ON') if num2==2: num4=('OFF') if num1==num2==1: num5=('ON') else: num5=('OFF') |
if に対して偽の場合も用意するのなら else を使うと説明したはずですが,if の連発になっています.あと,変数名についても今回 num がふさわしいでしょうか.代入するのは文字列ですが?カッコも不要ですし.
if num1 == 0: print('S1: ON') if num2 == 0: print('S2: ON') print('Light: ON') else: print('S2: OFF') print('Light: OFF') elif num1 == 1: print('S1: OFF') if num2 == 0: print('S2: ON') print('Light: OFF') else: print('S2: OFF') print('Light: OFF') |
上のものは複雑な処理になってしまって,結局間違った分岐となってしまっています.まず,elif が使われているところですが,これまで何度か指摘しているようにこれは else がふさわしいです.ただ,elif となっているものの,もうnum1 の値は1以外には無いので,最後の else に進むことは決してありません.そのため,全ての条件を満たす処理にはなっておらず,以下のように抜けが生じます.
Student number: s****** S1: OFF ------------------------ |
if num1 == 1 and num2 == 0: print('S1: ON') print('S2: OFF') print('Light: OFF') elif num1 == 0 and num2 == 1: print('S1: OFF') print('S2: ON') print('Light: OFF') else : print('S1: ON') print('S2: ON') print('Light: ON') |
分岐が3つしか無いということは当然正しくないのですが,変数 num1 と num2 の両方が0でも点灯してしまうことになっています.
if num1==1 and num2==1: print('S1:ON') print('S2:ON') print('Light:ON') else: print('S1:OFF') print('S2:OFF') print('Light:OFF') |
今度は両方ONか両方OFFしかなくなっています.
S1=random.randint(1,2) S2=random.randint(1,2) if S1==S2==1: result='ON' elif S1==S2==2: result='ON' else: result='OFF' print(f'S1:{S1}') print(f'S2:{S2}') print(f'Light:{result}') |
最後の上のものも場合分けがおかしいですね.2つの変数が一致したらとにかくONというのはおかしいですし,最後の print のところの f 文字列では数値を出力しようとしています.
前回は while 文について学習しました.何らかの変数の値が条件式が真の間,指示した処理が実行される,という構成でした.条件式に入る変数は,ループが始まる前に値が定義されていないといけないこと,また,反復して処理するスイートの中に,その変数の増分や変更などが含まれていないと無限ループとなってしまうことに注意してください.
for 文は基本的には繰り返す回数が決まっているときに使用する反復処理です.もちろん変数の値の回数繰り返すとすると,決まった回数ではないように見えますが,それでもその変数分の回数繰り返すということは,あらかじめ決まっていることになります.
教科書にもあるように,for 文は以下のような基本的な構成となります.
for 変数 in 並び式: スイート |
for 文において,繰り返す回数を指定するのには range 関数が使用されます.引数仕様は以下の通りです.
range(n) | 0 以上 n 未満の数値を順番に列挙した数列 |
range(a, b) | a 以上 b 未満の数値を順番に列挙した数列 |
range(a, b, step) | a から b の手前までの数値を step 個おきに列挙した数列 |
range 関数のツボ
最初のうちによく間違えることがあるのですが,range(1, 10) のようにしたときには,変数の値が 1 から 9 まで変わる間反復処理を行うので,1 から 10 までとしたいときには,range(1, 11) としないといけません.ここは要注意です.
自分で作ったプログラムが思ったように動かないときには,変数の値が反復処理によりどのように変わっていくのかを,逐次手作業で確認してみてください.処理の流れに従って変数が変わっていきますが,それが希望した動作になっているのか,メモなどを取りながら値の変化を確認することが,プログラムの間違いを見つける大事な方法です.
今回の演習問題です.
宿題が公開されるのは明日火曜日10:00の予定で,締切りは来週の月曜日12月2日の10:00です.レポート提出システムを使用します.
次回も引き続き教科書のp.102-114の範囲を学習しますので,予習をしてきてください.