プログラミング入門I
2025.12.01
多重ループ
これでは11から19までの整数のどれかになってしまいます.
num = random.choice([11, 13, 15, 17, 19]) |
間違ってはいないのですが,もし,2桁の奇数としたら同じ方法を使いますか?自分で数を見つけるのはやめましょう.
k = random.randint(11, 19)
while k % 2 == 0:
k = random.randint(11, 19)
|
奇数が出るまでやり続けるというのは無駄な作業です.
print('The maximum number: ', maximum)
print('The minimum number: ', minimum)
print('The mean: ', f'{mean:.2f}')
|
上のようなものも何件か見られたのですが,桁揃えをしていないので以下のように表示がずれます.
929 176 The maximum number: 929 The minimum number: 13 The mean: 548.55 |
print(f'The maximum number: {mx}')
print(f'The minimum number: {mn:>3}')
print(f'The mean: {ave:>16}')
|
最小値の方だけ3桁を指定していますが,最大値には1000が出る可能性がありますので,これではずれて表示されてしまいます.少数の方もです.
maxnum=0
minnum=0
total=0
for i in range(oddnum):
num1=random.randint(1,1000)
print(num1,end=' ')
if num1>maxnum:
maxnum=num1
if num1<minnum:
minnum=num1
total+=num1
|
最小値の初期値が間違っているので,表示される最小値は毎回0になります.
for i in range(num1):
num2=random.randint(1,1000)
print(num2,end=' ')
if mx < num2:
mx = num2
elif mn > num2:
mn = num2
|
前回の授業中に説明していたのですが,分かってもらっていなかったようです.最小値と最大値は別に連動するわけでは無いので,elif ではダメです.例えば,以下のように最小値を間違えることになります.
13 random numbers: 32 670 375 466 924 257 430 300 367 664 394 336 530 The maximum number: 924 The minimum number: 257 The mean : 441.92 |
numbers = []
for i in range(num):
num1 = random.randint(1, 1000)
numbers.append(num1)
print(num1, end = ' ')
else:
print()
MAX = max(numbers)
MIN = min(numbers)
AVE = sum(numbers) / num
print(f"The mximum number: {MAX:4d}")
print(f"The minimum number: {MIN:4d}")
print(f"The AVE : {AVE:6.2f}")
|
他にもリストを使った人がいました.別に間違いでは無いですし,この方が簡単になりますが,一応授業内容と合わせた課題なので,そのように既習の処理を使ってプログラムを組むようにしてください.
def main():
rdnum = [11, 13, 15, 17, 19]
key = random.choice(rdnum)
nums = [random.randint(1, 1000) for _ in range(key)]
print(f'{key} random numbers: {nums}')
print()
mx = max(nums)
mn = min(nums)
ave = sum(nums) / key
print(f'The maximum number: {mx}')
print(f'The minimum number: {mn}')
print(f'The mean: {ave:.2f}')
if __name__ == "__main__":
main()
|
さて,今回もいよいよ出てきました.授業の最初に説明しましたが,def を使用したものは採点しません.合っている合っていないではなく,def を使うだけの理解があるのなら,def を使わないプログラムも簡単に書けるはずだからです.
授業の最初に for 文に関する確認テストを行います.実際の作業については授業の中で指示します.
繰り返しの処理の中に繰り返しを入れることが可能です.それにより2次元的な表現などが可能となります.教科書では九九の表の例が出ていますが,そのような縦と横に文字を並べる作業では以下の点がポイントとなります.
2重の for 文のポイント
for i in range(hoge):
for j in range(huga):
print(foo, end = '')
|
外側のループの変数 i は行に対応し縦に進む処理で,内側の変数 j は各行内の表示で右に進める作業に対応します.例題を通して学習していきましょう.
例題
以下のように表示するプログラムを作成しましょう.
( 1, 1) ( 1, 2) ( 1, 3) ( 1, 4) ( 1, 5) ( 1, 6) ( 1, 7) ( 1, 8) ( 1, 9) ( 1,10) ( 2, 1) ( 2, 2) ( 2, 3) ( 2, 4) ( 2, 5) ( 2, 6) ( 2, 7) ( 2, 8) ( 2, 9) ( 2,10) ( 3, 1) ( 3, 2) ( 3, 3) ( 3, 4) ( 3, 5) ( 3, 6) ( 3, 7) ( 3, 8) ( 3, 9) ( 3,10) ( 4, 1) ( 4, 2) ( 4, 3) ( 4, 4) ( 4, 5) ( 4, 6) ( 4, 7) ( 4, 8) ( 4, 9) ( 4,10) ( 5, 1) ( 5, 2) ( 5, 3) ( 5, 4) ( 5, 5) ( 5, 6) ( 5, 7) ( 5, 8) ( 5, 9) ( 5,10) ( 6, 1) ( 6, 2) ( 6, 3) ( 6, 4) ( 6, 5) ( 6, 6) ( 6, 7) ( 6, 8) ( 6, 9) ( 6,10) ( 7, 1) ( 7, 2) ( 7, 3) ( 7, 4) ( 7, 5) ( 7, 6) ( 7, 7) ( 7, 8) ( 7, 9) ( 7,10) ( 8, 1) ( 8, 2) ( 8, 3) ( 8, 4) ( 8, 5) ( 8, 6) ( 8, 7) ( 8, 8) ( 8, 9) ( 8,10) ( 9, 1) ( 9, 2) ( 9, 3) ( 9, 4) ( 9, 5) ( 9, 6) ( 9, 7) ( 9, 8) ( 9, 9) ( 9,10) (10, 1) (10, 2) (10, 3) (10, 4) (10, 5) (10, 6) (10, 7) (10, 8) (10, 9) (10,10) |
解答例
for i in range(1, 11):
for j in range(1, 11):
print(f'({i:2},{j:2}) ', end = '')
else:
print()
|
設問 i. を変更して以下のように表示させてみましょう.
( 1, 1) ( 2, 1) ( 2, 2) ( 3, 1) ( 3, 2) ( 3, 3) ( 4, 1) ( 4, 2) ( 4, 3) ( 4, 4) ( 5, 1) ( 5, 2) ( 5, 3) ( 5, 4) ( 5, 5) ( 6, 1) ( 6, 2) ( 6, 3) ( 6, 4) ( 6, 5) ( 6, 6) ( 7, 1) ( 7, 2) ( 7, 3) ( 7, 4) ( 7, 5) ( 7, 6) ( 7, 7) ( 8, 1) ( 8, 2) ( 8, 3) ( 8, 4) ( 8, 5) ( 8, 6) ( 8, 7) ( 8, 8) ( 9, 1) ( 9, 2) ( 9, 3) ( 9, 4) ( 9, 5) ( 9, 6) ( 9, 7) ( 9, 8) ( 9, 9) (10, 1) (10, 2) (10, 3) (10, 4) (10, 5) (10, 6) (10, 7) (10, 8) (10, 9) (10,10) |
解答例
for i in range(1, 11):
for j in range(1, i + 1):
print(f'({i:2},{j:2}) ', end = '')
else:
print()
|
今回の演習問題です.
2重のループを使用して2次元表示的な作業を行いました.二つの変数(通常は i と j)が変化するとどのような処理になるのか,じっくりと考えながら作業を進めるようにしてください.その際にはフローチャート的な処理の組み立てを考えるステップと,思ったように結果が出ないときの処理を一つ一つ丁寧にたどっていって問題を見つけるステップが重要です.
宿題が公開されるのは明日火曜日10:00の予定で,締切りは来週の月曜日12月8日の13:00です.
次回も引き続き教科書のp.102-114の範囲を学習しますので,予習をしてきてください.多重のループについて特に扱います.