プログラミング入門I
2025.12.08
多重ループ
今回の内容は一度演習問題として行ったものの修正版です.なのに出来が良くないというのは,結局復習がきちんとできていないということですね.残念です.まだまだ確認テストは行っていきますので,予復習はしっかりやっておきましょう. 以下は問題のある解答の例です.参考にしてください.
if num1 > num2:
num = num1
num1 = num2
num2 = num
間違ってはいませんが,Python には便利な多重代入もありますので活用しましょう.演習問題でも何度か使用しています.
if num1 > num2:
print(f'Numbers from {num1} to {num2}')
for num1 in range(num2,num1+1):
print(f'{num1} ',end='')
else:
print()
else:
print(f'Numbers from {num2} to {num1}')
for num2 in range(num1,num2+1):
print(f'{num2} ',end='')
else:
print()
|
同じことを2度書くというのはなんとも無駄な作業です.こういうのは推奨しません.
num1 = random.randint(10,98) num2 = random.randint(num1+1,99) |
2桁の正の整数という指定ですが,十分条件を満足していません.num1 が 99 になることは無いし,num1 が10になることもありません.
今回もエラーや提出に関する形式的な問題となるようなものはありませんでした.引き続き提出の際はちゃんど動作するソースコードの提出をよろしくお願いします.
以下は例によって問題のあるプログラムの例です.参考にしてください.
print(' 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30')
print('------------------------------------------------------------')
for _ in range(10):
a = random.randint(10, 30)
b = random.randint(10, 30)
if a <= b:
small, big = a, b
else:
small, big = b, a
print(f'{small:.2f} -- {big:.2f}:', end=' ')
x = small
while x <= big:
print(x, end=' ')
x += 1
print()
|
上のものはいろいろと問題があります.まず,目盛代わりの数字ですが,反復処理で自動生成しましょう.授業中にも何度か説明していますが,この授業で行っている演習や課題は画面で簡単に確認できる程度の数値の範囲しか使用しません.大きな数値を使用すると画面を延々スクロールする必要が出てきて面倒だからです.なので,10から30だからと言って自分で打ち込むのは良くありません.1000000から3000000とかだったらどうしますか?
次に2つの数値を小さい順に並べる操作ですが,教科書の p.70 にソートの例がちゃんと示してありますし,kこれまでも何度か演習で使用しました.
そして,最後に数値ですが,なぜ整数を小数第2位まで表示させる必要があるのでしょうかね.結果的には以下のように目盛代わりの数値が全然役に立っていませんし.
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ------------------------------------------------------------ 13.00 -- 16.00: 13 14 15 16 15.00 -- 18.00: 15 16 17 18 13.00 -- 28.00: 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 22.00 -- 27.00: 22 23 24 25 26 27 18.00 -- 29.00: 18 19 20 21 22 23 24 25 26 27 28 29 28.00 -- 30.00: 28 29 30 18.00 -- 23.00: 18 19 20 21 22 23 11.00 -- 15.00: 11 12 13 14 15 13.00 -- 23.00: 13 14 15 16 17 18 19 20 21 22 23 16.00 -- 20.00: 16 17 18 19 20 ------------------------------------------------------------ |
ranges = [
(11, 16),
(11, 22),
(17, 27),
(16, 25),
(17, 18),
(13, 28),
(10, 19),
(11, 25),
(20, 25),
(10, 29)
]
for start, end in ranges:
print(f"{start:2d} -- {end:2d}:", end=" ")
for n in range(10, 31):
if start <= n <= end:
print(f"{n}", end=" ")
else:
print(" ", end="")
print()
|
表示させる整数は乱数によって決めると指示しているのに,どうして決め打ちなんでしょうか?
for i in range(10,31):
print(f'{i} ',end='')
print('')
print('-'*73)
for j in range(10):
small = random.randint(10,30)
large = random.randint(10,30)
small, large = sorted([small, large])
print(f'{small} -- {large}: ',end='')
print(f' '*(small - 10),end='')
for k in range(small, large + 1):
print(f'{k} ',end='')
else:
print()
else:
print()
|
上のソースですが,for 文のインデックス変数について適切ではありません.for 文は定義されるごとにインデックス変数が初期化されるので,特に変数名に意味があるものを使用するのでなければ i で構いません.出てくるたびにいちいち j k l のように変更していたら変数が足らなくなります.入れ子にした場合には外側と内側のインデックス変数は当然変えなければなりません.
ちなみに for 文のインデックス変数を i とするのは整数の英語の integer から来ていますが,そもそも世界で最初の高級言語である FORTRAN では変数名がIJKLMNOP...というように I 以降の文字で始まる場合には整数型,A から H までは実数型というように最初の文字で分けていたことによります.
2 重の for 文を中心に多重のループについて学習しました.前回も説明しましたが,画面に文字列を2次元的に表現するグラフや表などで重宝されるのが2重のループです.外側のループの変数が行を下に進める処理に対応し,内側の変数は各行を右に進める処理に対応しますので,それを理解した上でいろいろと考えていきましょう.
今回も多重の反復処理です.今回は2次元的な表現だけでなく,数値を扱う際に2重のループが必要になるものもいくつか用意しました.引き続き演習問題を通して多重ループを学習していきましょう.
例題
約数探索
100 から 200 の範囲の整数を乱数により2個発生させて,その範囲の数の約数をすべて表示するプログラムを作成しましょう.
168: 1 2 3 4 6 7 8 12 14 21 24 28 42 56 84 168 169: 1 13 169 170: 1 2 5 10 17 34 85 170 171: 1 3 9 19 57 171 172: 1 2 4 43 86 172 173: 1 173 174: 1 2 3 6 29 58 87 174 175: 1 5 7 25 35 175 176: 1 2 4 8 11 16 22 44 88 176 177: 1 3 59 177 178: 1 2 89 178 179: 1 179 180: 1 2 3 4 5 6 9 10 12 15 18 20 30 36 45 60 90 180 181: 1 181 182: 1 2 7 13 14 26 91 182 183: 1 3 61 183 184: 1 2 4 8 23 46 92 184 185: 1 5 37 185 186: 1 2 3 6 31 62 93 186 187: 1 11 17 187 188: 1 2 4 47 94 188 189: 1 3 7 9 21 27 63 189 190: 1 2 5 10 19 38 95 190 191: 1 191 192: 1 2 3 4 6 8 12 16 24 32 48 64 96 192 193: 1 193 194: 1 2 97 194 195: 1 3 5 13 15 39 65 195 196: 1 2 4 7 14 28 49 98 196 197: 1 197 |
解答例
import random
small = random.randint(100, 200)
large = random.randint(100, 200)
small, large = list(sorted([small, large]))
for i in range(small, large + 1):
print(f'{i}: ', end = '')
for j in range(1, i + 1):
if i % j == 0:
print(j, end = ' ')
else:
print()
|
今回の演習問題です.
宿題が公開されるのは明日火曜日10:00の予定で,締切りは来週の月曜日12月15日の13:00です.Moodle を使用します.
次回は教科書のp.133-162の範囲を学習しますので,予習をしてきてください.
次回は多重のループに関する確認テストがありますので,復習もしっかりとしておいてください.