プログラミング入門I
2025.11.17
for 文
初回の確認テストですのでいろいろと問題のあるプログラムが出てくることを予想していましたが,それほどではありませんでしたので,テンプレートを用意した効果が十分に発揮されたのかとも思います.次回以降はテンプレートは無しとしますので,自力でお願いします. 今回のツボは文字コードを文字に変換する f 文字列が作れるかどうかだけでしたが,そこが出来ていない人が数人いたので,今後も教科書にあるものの中で演習問題に取り入れた処理は課題として登場しますので,しっかりと復習しておきましょう.
今回はプログラムでないものが提出されていました.提出の際にはファイルの選択にも十分注意しましょう.それと, while 文終了時に改行していないものも結構見られました.お行儀のよいプログラムとして一応改行しておきましょう.
間違ったファイル: 24_44 (実行結果?)
以下は例によって問題のあるプログラムの例です.参考にしてください.
while True:
num1 = random.randint(1, 100)
print(f'{num1}', end=' ')
if num1 == num:
print()
break
else:
print()
|
不要な if 文が入っています.この程度のプログラムでは実感できませんが,プログラムで実行に時間がかかるのは if などの条件分岐です.必要が無ければ使用しないようにしましょう.格言:塵も積もればWindows
while (num2 < num1) or (num2 > num1):
num2 = random.randint(1, 100)
print(f'{num2}')
|
等しくないという演算子 != を知らないために条件がややこしくなっています.それと,print 文で改行しない設定が抜けているので,下のような結果表示になり,本日のテキストは皆さんが余分なスクロールをさせられる羽目に.
Key number:87 51 49 33 7 76 26 70 99 32 17 64 85 26 66 3 58 55 9 19 47 98 57 33 1 47 45 35 20 5 76 70 42 25 43 3 47 46 62 6 34 96 91 24 8 32 31 16 32 87 |
i=random.randint(1,100)
while i!=n1:
i=random.randint(1,100)
print(i,end=' ')
|
while 文の条件式に入れる変数の初期値は1から100までの整数以外であればなんでも良いのに,乱数にしていますが,これでは続けて同じ数が出た場合には一度も実行しない処理になってしまいますよ.
i = 0
num = random.randint(1,100)
print(f'Key number: {num}')
print()
while i != num:
num2 = random.randint(1,100)
print(num2,end = ' ')
i = num2
|
こちらも一つ前のものと同じなのですが,さらに変数を使用しているので,変数の無駄遣いです.
num1=random.randint(1, 100)
print(f'Key number: {num1}')
num2=random.randint(1, 100)
while num2 == num1:
print(f'{num2}' , end='')
|
while 文の条件式が間違っているために,一回も実行しない処理になっています.自分でおかしいことに気づいたはずなので,直しておきましょう.
前回は 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) としないといけません.ここは要注意です.
自分で作ったプログラムが思ったように動かないときには,変数の値が反復処理によりどのように変わっていくのかを,逐次手作業で確認してみてください.処理の流れに従って変数が変わっていきますが,それが希望した動作になっているのか,メモなどを取りながら値の変化を確認することが,プログラムの間違いを見つける大事な方法です.
演習問題に入る前に以下の2つの例題を紹介しておきます.参考にしてください.
教科書 p.105 の List 4-15 で使用されている下線文字 _ を使う練習です.1桁の正の整数を乱数により5個発生させるプログラムを作成しましょう.
4 2 2 3 8 |
繰り返す回数だけ決まれば良いので,変数は不要で _ で作れます.
解答例
import random
for _ in range(5):
print(random.randint(1, 9), end = ' ')
else:
print()
|
10 から 20 の範囲の整数をどれか一つ乱数を用いて発生させ,その個数分の3桁のランダムな正の整数を表示するプログラムを作成しましょう.
13 random numbers with 3 digits: 640 609 847 645 540 904 366 519 798 235 323 138 380 |
解答例
import random
num = random.randint(10, 20)
print(f'{num} random numbers with 3 digits: ', end = '')
for _ in range(num):
print(random.randint(100, 999), end = ' ')
else:
print()
|
今回の演習問題です.
宿題が公開されるのは明日火曜日10:00の予定で,締切りは12月1日の13:00です.
次回も引き続き教科書のp.102-114の範囲を学習しますので,予習をしてきてください.