コンピュータ演習II 第10回 ドリル(授業中に解いて提出)¶

この問題集は、授業中に、解説を聞きながら自分の手を動かして解く 練習です。第10回の教材で学んだ 2重ループ(ループの入れ子) を、各節 1〜2 問ずつ練習します。

各問は「好きな値で入力を作り、こう処理してください」という形です。入力のリストは自分で自由に作ってください。作り方は各問の「入力の作り方」に示します。

進め方は次のとおりです。

  • 配布の 解答用テンプレート 2xBxxxxx_10_drill.ipynb を Colab で開き、各問題の「入力の作り方」に従って自分でリストを作り、その下に処理を書いて実行してください。
  • 各問に 入力例と出力例 を載せています。イメージがつかめないときは、まず入力例のとおりに動かしてから、自分の値に変えてください。
  • 各問題に ヒントのフローチャート を載せていますが、一部 空欄(?①や?②)のブロックがあります。空欄に入る内容を自分で考えてみてください。フローチャートを完成させて流れをつかんでから、それを Python に翻訳して書いてください。ヒント図の変数名は例です。自分でつけた名前に読み替えてください。
  • できたら、テンプレートを .py 形式でダウンロードして提出 してください。答え合わせはしません。自分で入力を決めて、思ったとおりに動くかを確かめることが目的です。
  • わからなくなったら、第10回の教材を見返してかまいません。答えを写すのではなく、書き方を思い出して自分で書く ことが大切です。

なお、この演習では Colab のコード生成(生成AI の補完)は使わないでください。自分でプログラムを書いて、読めるようになることが目的です。

1. 2重ループの基本¶

問題 1: 全組み合わせを1 行ずつ出力¶

好きなリストを2 つ作ってください(3 個入りのリストと2 個入りのリスト。要素は文字列でも整数でもかまいません)。2重ループを使って、2 つのリストの すべての組み合わせ を1 行ずつ出力してください。ここでいう組み合わせとは、1 つ目のリストから1 個、2 つ目のリストから1 個を選ぶ選び方のことです。外側のループで1 つ目のリストの要素を、内側のループで2 つ目のリストの要素を取り出し、print で2 つ並べて出力します。変数名は自分で決めてかまいません。

入力の作り方:

好きな変数名1 = [好きな値を3 個]
好きな変数名2 = [好きな値を2 個]

入力例:

drinks = ["coffee", "tea", "juice"]
sizes = ["S", "M"]

出力例(入力例のとき):

coffee S
coffee M
tea S
tea M
juice S
juice M

これは例です。自分で決めた値で作ってかまいません(その場合、出力は例とは変わります)。

考えるポイント: ヒント図では 内側のループ が空欄?①になっています。内側のループが2 つ目のリストを最初から最後まで回るには、どんな繰り返しの条件にすればよいかを自分で考えてください。

フローチャートの?①に入る内容を考えて、図を完成させてから Python に翻訳してください。

ヒント(フローチャート):

ヒント(フローチャート)


問題 2: 外側と内側を入れ替える¶

問題1 と同じ2 つのリストを使って、今度は出力が 2 つ目のリストの要素ごとにまとまる 順番になるように、すべての組み合わせを1 行ずつ出力してください。1 行の中の並び(1 つ目のリストの要素を先に出力する)は問題1 と同じままにします。

入力の作り方:

問題1 と同じ2 つのリスト

入力例:

drinks = ["coffee", "tea", "juice"]
sizes = ["S", "M"]

出力例(入力例のとき):

coffee S
tea S
juice S
coffee M
tea M
juice M

これは例です。自分で決めた値で作ってかまいません(その場合、出力は例とは変わります)。

考えるポイント: どちらのリストを外側のループにすると、出力のまとまり方が変わるでしょうか。ヒント図は入れ替えたあとの構造で、外側?①と内側?②が空欄です。出力ボックスの添字(drinks[j], sizes[i])が手がかりになります。

フローチャートの?①と?②に入る内容を考えて、図を完成させてから Python に翻訳してください。

ヒント(フローチャート):

ヒント(フローチャート)


2. 計算の組み合わせ¶

問題 3: 和が偶数になる取り出し方を数える¶

好きな整数を3 個ずつ入れたリストを2 つ作ってください。2重ループを使って、1 つ目のリストから1 個、2 つ目のリストから1 個を取り出したとき、和が偶数になる取り出し方 の個数を数え、ループが終わったら最後に1 回だけ出力してください。count = 0 から始めて、条件に合うときだけ count を1 増やします。

2 つのリストは別のリストなので、同じ値が入っていても 別々に数えます。

入力の作り方:

好きな変数名1 = [好きな整数を3 個]
好きな変数名2 = [別の好きな整数を3 個]

入力例:

numbers1 = [2, 5, 8]
numbers2 = [3, 4, 7]

出力例(入力例のとき):

4

これは例です。自分で決めた値で作ってかまいません(その場合、出力は例とは変わります)。

考えるポイント: 「2 つの和が偶数かどうか」は、どんな条件式で書けるでしょうか。% で余りを求める判定は第03回で学んでいます。ヒント図は if の条件が空欄?①です。

フローチャートの?①に入る内容を考えて、図を完成させてから Python に翻訳してください。

ヒント(フローチャート):

ヒント(フローチャート)


問題 4: 行ごとの小計をリストにまとめる¶

問題3 と同じ2 つのリストを使ってください。外側の要素1 つごとに「その要素と、2 つ目のリストから1 個ずつ取り出した要素との 積の合計 t」を求め、その t を リスト sums にためていきます。ループがすべて終わったら、最後に1 回だけ sums を出力 してください(出力は1 行になります)。ためていくリストは、はじめに sums = [] と空のリストで作っておきます。

入力の作り方:

問題3 と同じ2 つのリスト
sums = []

入力例:

numbers1 = [2, 5, 8]
numbers2 = [3, 4, 7]

出力例(入力例のとき):

[28, 70, 112]

これは例です。自分で決めた値で作ってかまいません(その場合、出力は例とは変わります)。

考えるポイント: t = 0 はどこに置けばよいでしょうか。t は外側のループ1 回ごとに数え直します。ヒント図は外側のループ本体の 先頭の処理 が空欄?①です。なお、sums.append(t) はリストの末尾に要素を追加する操作で、第05回・第06回で学びました。

フローチャートの?①に入る内容を考えて、図を完成させてから Python に翻訳してください。

ヒント(フローチャート):

ヒント(フローチャート)


3. 行を作って図形を表示する¶

問題 5: 逆三角形を表示¶

好きな記号1 文字と行数 n を決めてください。1 行目に記号が n 個並び、1 行ごとに1 個ずつ減っていく 逆三角形 を表示してください。各行のはじめに line = "" で空の文字列を作り直し、内側のループで記号をつなげ、内側のループが終わったら line を出力します。

入力の作り方:

好きな変数名 = "好きな記号1 文字"
n = 好きな行数

入力例:

mark = "*"
n = 4

出力例(入力例のとき):

****
***
**
*

これは例です。自分で決めた値で作ってかまいません(その場合、出力は例とは変わります)。

考えるポイント: i 行目(i は 0 から数えます)には記号が何個並ぶでしょうか。教材の三角形は1 行ごとに1 個ずつ 増える 向きでした。ヒント図は内側のループの範囲が空欄?①です。

フローチャートの?①に入る内容を考えて、図を完成させてから Python に翻訳してください。

ヒント(フローチャート):

ヒント(フローチャート)


問題 6: 右寄せの三角形を表示¶

問題5 と同じ記号と行数 n で、記号が 右端にそろう三角形 を表示してください。各行では、先に空白 " " を必要な数だけつなげ、続けて記号を必要な数だけつなげます。内側のループを 2 つ順に 使います(空白用と記号用)。

入力の作り方:

問題5 と同じ記号と行数 n

入力例:

mark = "*"
n = 4

出力例(入力例のとき):

   *
  **
 ***
****

これは例です。自分で決めた値で作ってかまいません(その場合、出力は例とは変わります)。

考えるポイント: i 行目(0 から数えます)に必要な空白の数と記号の数は、それぞれいくつでしょうか。空白と記号を合わせると、どの行も n 文字になります。ヒント図は2 つの内側のループの範囲が空欄?①と?②です。

フローチャートの?①と?②に入る内容を考えて、図を完成させてから Python に翻訳してください。

ヒント(フローチャート):

ヒント(フローチャート)


4. リストの全ペア¶

問題 7: ペアの差を出力¶

好きな整数を5 個入れたリストを numbers という名前で作ってください。重複のない全ペア(i < j の組)について、大きい方から小さい方を引いた差 を1 行ずつ出力してください。まず diff = numbers[j] - numbers[i] と計算しておき、numbers[i] の方が大きいときだけ diff を計算し直す形で書きます。

入力の作り方:

numbers = [好きな整数を5 個]

入力例:

numbers = [2, 5, 8, 1, 9]

出力例(入力例のとき):

3
6
1
7
3
4
4
7
1
8

これは例です。自分で決めた値で作ってかまいません(その場合、出力は例とは変わります)。

考えるポイント: 「numbers[i] の方が大きいとき」はどんな条件で書けるでしょうか。また、そのとき diff はどんな式で計算し直せばよいでしょうか。ヒント図は if の条件?①と、True 側の処理?②が空欄です。

フローチャートの?①と?②に入る内容を考えて、図を完成させてから Python に翻訳してください。

ヒント(フローチャート):

ヒント(フローチャート)


問題 8: 合計が最大のペア¶

問題7 と同じリスト numbers を使って、2 つの要素の 合計が最大になるペア の合計を求め、ループが終わったら最後に1 回だけ出力してください。best = numbers[0] + numbers[1] から始めて、i < j の全ペアを見ながら best を更新します。

入力の作り方:

問題7 と同じリスト numbers

入力例:

numbers = [2, 5, 8, 1, 9]

出力例(入力例のとき):

17

これは例です。自分で決めた値で作ってかまいません(その場合、出力は例とは変わります)。

考えるポイント: 「今までの最大 best」は、どんなときに更新すればよいでしょうか。ヒント図は if の条件?①と、True 側の処理?②が空欄です。

フローチャートの?①と?②に入る内容を考えて、図を完成させてから Python に翻訳してください。

ヒント(フローチャート):

ヒント(フローチャート)


まとめ¶

この回のドリルでは、第10回で学んだ2重ループを、教材の例から一歩ずらした形で練習しました。次のパターンを、見なくても書けるようにしておきましょう。

  • 外側と内側の入れ替え: どちらのリストを外側のループにするかで、出力のまとまり方(順番)が変わる。
  • 小計のリセット位置: 外側1 回ごとの小計は、t = 0 を 外側のループの中(内側のループの前)に置いて作り直す。全体の合計なら2重ループの前に置く。
  • 減る向きの range: i 行目に並ぶ個数を n - i のような式にすると、1 行ごとに減っていく図形が作れる。
  • 内側のループを2 つ順に使う: 1 つの行の中で「空白 → 記号」のように種類の違うものを並べるときは、内側のループを2 つ続けて書く。
  • 場合分けしながらの計算: まず片方の式で計算しておき、条件に合うときだけ計算し直すと、「大きい方 − 小さい方」のような場合分けが書ける。
  • 最大の更新: best を最初のペアで初期化し、「今までの最大を超えたときだけ更新する」if を2重ループの中に置く。

授業後の 課題 では、これらを自分の学籍番号から作るリストで解きます。ここで手を慣らしておきましょう。