【情報I】プログラミング問題に強くなる10個の基礎その2(くり返し編)

eyecatch-3360v2

ここからは「くり返し」「配列とくり返しの組み合わせ」など基本項目の中でも難しいものを学んでいこう。

「変数」や「配列」、「条件分岐」などはこちらの記事で確認してほしい。

eyecatch-3360v2【情報I】プログラミング問題に強くなる10個の基礎(苦手な人必見)

※画像のソースコード内の下線や波線は作成しているアプリケーションソフトの仕様によるものなので気にする必要はない。

くり返し

繰り返しは3つの構造の一つ「反復構造」を作るために使う。

くり返しの表記ルールをまずは確認しよう。

ここで大事なのは「カウンター変数」である。

カウンター変数とは

カウンター変数とは、くり返しの中で「進み具合」をコントロールする、つまり「今が何回目なのか」を数えるための変数である。

まだイメージが湧きづらいかもしれないので、

まずは「くり返し(反復構造)」の仕組みを改めて確認しよう。

反復構造とは、特定の条件が満たされるまで「繰り返し(ループ)」で囲まれた処理を繰り返すこと。

つまり、「繰り返し(ループ)」で囲まれた処理(繰り返したい処理)を実行するたびに、「まだ条件を満たしているか?」を毎回チェックする必要が生じる。

そして、チェックして

・満たしている(Yes)⇒繰り返し継続

・満たしていない(No)⇒繰り返し終了 となる。

例で確認しよう。

以下のプログラムを例として考えよう。

図15のプログラムを読み解くと、

【繰り返し条件】:変数 count > 60 を満たすまで (図16)

【繰り返す内容】:①「『現在のカウント』と count(の値)を言う」

  ②「 count + 1 の計算結果を count に代入する」 (図17)

がわかる。

プログラムを起動した際、変数countの初期値は「0」と設定されているため、

繰り返しブロックに突入した時点で「count > 60 を満たすまで」を満たしており、繰り返しが始まる。

※「count > 60 を満たすまで」というのは言い換えると「count ≦ 60 の間」ということ。

順番に【繰り返す内容】の中の処理を実行し、

1回目の「②「 count + 1 の計算結果を count に代入する」を実行した時点で、

2回目の【繰り返す内容】を行うかどうかをチェックする必要が生じる。2回目ではまだ【繰り返し条件】を満たすこととなるので、繰り返しを継続する。

このようにして【繰り返す内容】を終えるたびに【繰り返し条件】を満たしているかチェックすることになる。

そして、【繰り返し条件】を満たさなくなると繰り返しが終了となる。

くり返しのイメージ図

この「条件を満たしているか」をチェックする際によく使われるのがカウンター変数であり、どのような方法でカウンター変数をカウントアップ(カウントダウン)するかによって、使うべき繰り返し文を選ぶ。

カウントアップ(カウントダウン)するコードを明示する場合⇒while文を使う

while文とは、「~の間繰り返す」という書き方をするループ文のことで、

「何回くり返すか」が最初から決まっていない場合によく使う。

この構文を使うことで「条件がtrue(設定した条件を満たす)の間はずっと実行する」という使い方ができる。

このコードでは、【繰り返す内容】の最終行で、変数 count を 1ずつ増やしている。

つまり、

が、カウントアップするためのコードであり、この変数countで条件を満たすかどうかもチェックしている。

ただし、while文では条件の設定次第で「一度もループが実行されない」ことにもなるので注意が必要だ。

一連の【繰り返す内容】が行われるたびに自動でカウントアップ(カウントダウン)させたい場合⇒for文を使う

for文とは、「(変数) を ● から ▲ まで 1ずつ 増やしながら(減らしながら)繰り返す」という書き方をするループ文のことで、「何回くり返すか」が決まっている場合によく使う。

このループ文は変数や配列とも非常に相性が良いため、頻出である。

このコードでは、

・突然、変数「x」が登場
・カウントアップするためのコードが書かれていない

と気になる点がある。しかし、これらはfor文の特徴であり、

for文は

繰り返し条件にカウンター変数を書くことで、別の行で変数を初期化(作成⇒初期値の代入)をしなくて済む

ここでは(02)行目に到達した時点で変数xが作成され、初期値として繰り返し条件に書かれている最小値「0」が初期値として自動で代入される

繰り返す内容を実行し終えるたびに(ここでは(03)行目を実行し終えた時点)カウンター変数を自動で1ずつ増やして更新することができる。

という特徴を持つ。

再掲

※【繰り返し条件】の設定によっては「1ずつ減らして更新する」ことも可

そして、更新した後のカウンター変数が繰り返し条件を満たしているかチェックするのである。 つまり、繰り返しのコード群に到達した時点でカウンター変数を自動で初期化するため、繰り返しを強制的に行うことができる。

なぜ配列と相性が良いのか?

ここからは「くり返し」と「配列」が組み合わせて使われる理由を考えよう。

なぜ、for文が配列と相性が良く、頻出なのか。それは

要素を指定する際の要素番号として、「カウンター変数」を使いやすいからで、

その結果「コードの簡略化ができる」からである。

たとえば、

と表示するプログラムを作ることを考える。

単純に順次構造だけで考えると、以下のようになるが、さすがに冗長である。

そこで、このコードを簡略化して読みやすくすることを考える。

まずは、「表示する」コードが何度も登場するため、繰り返しを使ってまとめたい。

表示させる内容は

・2回のうち1回は「、」
・2回のうちもう1回は「●色」

であるが 「●色」は順番によって異なるため、単純に繰り返しだけではまとまりそうにない。

このようなとき、プログラミングでは配列を使って(色を)管理する

(※今回はわかりやすいように要素番号は「1」から始まるものとする

そうすると、 (02)~ (15)行目を以下のようにまとめられそうだと気づくことができる。

続いて

の部分を考える。

実現させたいプログラムとしては、

「表示させたい具体的な色」の部分が以下のように繰り返しの回数に応じて順番に変わって表示されるようにすることである。

ここで、配列に格納している色の順番を思い出そう。

配列には「表示させたい順」に色を管理(代入)している。

つまり、「配列の指定」を使って書き換えると以下のようになる。

ここで注目したいのは、

•「繰り返し回数(●回目)」
•「配列の要素番号(配列の●番目)」

の数字が一致している(同じである)ことである。

つまり、右の表のようになる。

for文ではカウンター変数(今回は「 i 」を使うものとする)

で繰り返し回数(「●回目」)を管理するのだから、

「繰り返し回数」と「表示させたい色の要素番号」が同じ

だということは、

 i 回目 に表示させたい色はRainbow[ i ](番目)の色

と表現することができる。

【繰り返し回数と表示させたい色を格納している要素番号一覧】

このように考えると、繰り返し条件を配列Rainbowの要素数と一致させればよいので、以下のコードのようになる。

念のため、ループ全体を以下の表で確認しよう。

また、当初のコードと比べてもコードも簡略化できている。

(当初のプログラム:15行 、完成後:5行)

このように、プログラムのソースコードを簡略化できるため、for文と配列が相性が良く、共通テストでも頻出なのである。

なぜ変数と相性が良いのか?

なぜ、for文が変数と相性が良く、頻出なのか。それは

繰り返し回数(繰り返しの終了条件)に「変数」を使いやすいからである。

さきほどの虹の色を順に表示させるプログラムを再度確認しよう。

(03) 行目の繰り返し条件を見てみよう。

(03) i を 1 から 7 まで 1 ずつ増やしながら繰り返す:とあるが、

カウンター変数 i を「1から7」にしている理由はなぜだろうか?

それは、 「1から7」が要素番号の開始と終わりの数字だからである。

では仮に、配列 Rainbow の要素数が8個ならば、先ほどの繰り返し条件はどうするだろう?

繰り返しブロックでは、配列Rainbow のすべての要素に【繰り返す内容】(ここでは(04) と (05)行目) を行うため、配列 Rainbow の要素数が個ならば、

繰り返し条件は、

「 i を 1 から 8 まで 1 ずつ増やしながら繰り返す: 」となるはずである。

同様に、もし仮に配列 Rainbow の要素数が個ならば、

繰り返し条件は、

「 i を 1 から 9 まで 1 ずつ増やしながら繰り返す: 」となり、

もし仮に配列 Rainbow の要素数が10個ならば、

繰り返し条件は、

「 i を 1 から 10 まで 1 ずつ増やしながら繰り返す: 」となるはずである。

つまり、繰り返しの終了条件として指定する値は配列Rainbowの要素数と一致するのである。

さらに、プログラミングでは、繰り返しの終了条件を「配列の要素数」を使って表現することが一般的である

さきほどの虹の色を順に表示させるプログラムを上記に沿って修正すると以下のようになる。

「要素数(Rainbow)」とは、配列Rainbowの要素数を調べるコードである。ここでは(01)行目で7個の要素が代入されているので、「要素数(Rainbow)」7を表すことになる。

※「要素数(配列名)」は()内に指定した配列の要素数を返す関数。関数は別途解説。

また、「要素数(Rainbow)」で調べた結果の値(ここでは7)を別の変数で受け取ることも可能である(下記プログラム(03)行目)。そして、その受け取った変数を繰り返し条件において使用することも可能である。

このように、繰り返し条件(特に終了条件)を変数を使って表すことができるため、for文と変数は相性が良く、頻出なのである。

くり返しの問題では「トレース表」の制作が鍵

共通テスト「情報」において、繰り返しを使ったコードは必ずと言って良いほど出題される。ただし頭の中だけでループの処理や変数の推移を追うことはなかなか困難である。ここでは「繰り返しがどう動くか」をイメージするために、「トレース表(追跡表)」を使って考えてみよう。

トレース表とは、プログラムの実行過程を記録し、変数の値や処理の流れなどを確認するための表のこと。

たとえば、先ほどの虹の色を順に表示させるプログラムでは、たとえば、図18がトレース表となる。

トレース表の書き方には明確なルールは無い。しかし、プログラムの実行過程で変遷を追いかけたい数値を漏れなく表に盛り込むことを意識すればよい。

特に、

  • カウンター変数の推移
  • (カウンター変数が変化したことで次の)ループ条件を満たすか
  • (カウンター変数や繰り返し回数が変化したことで)配列のどの要素を指すことになるのか
  • 最終的な演算の結果

を表にまとめながら変化の推移を確認できるようにしよう。

トレース表を用いて考えよう。くり返し条件は「0からyousosu -1 まで」とあり、yousosuは「6」なので、「0からyousosu -1 まで」とは「0から 5 まで」と読み替えることができる。

これらをもとに、トレース表を記入していくと以下のようになる。よって答えは「6回」となる。

関数

数学でも「関数」という語句が登場するが、情報科のプログラミングでは、意味が異なる。プログラミングにおける関数とは、「複数の処理をひとまとめにして、(ひとまとめにしたものに)名前を付けて呼び出せるようにする仕組み」である。

関数のイメージ

小学生や中学生の頃に「前にならえ」と言われたことはあるだろうか?

生徒が列になって並ぶ際に整列する際に行う、あれである。

では、いま「前にならえ」と言われたらできるだろうか?

きっと、できるはずである。

さらに、

①両手を前に並ぶ人の肩の位置付近まで上げる

②挙げた両手をまっすぐ伸ばす

③背筋を伸ばす

④(なおれと言われるまで)②~③を維持する

これらの一連の行為を頭に浮かべたに違いない。

それは「前にならえ」という名称の命令が①~④を実行することとして記憶されていて、実際に「前にならえ」という号令があると、その号令を受け取った者は①~④を実行するからである。

このように「複数の処理を特定の名称で名付け、実際に(その名称の)命令を発することで、決められた処理内容を行う」こと。

プログラミングにおける「関数」はこの考え方に近い。

関数の定義・呼び出し

関数では

●複数の処理を特定の名称で名付けること:関数の定義

●実際に(その名称の)命令を発する(発して、決められた処理を実施する)こと:関数の呼び出し

という。実際には「関数の定義」は、すでに行われており問題文の中でその詳細が説明されているか、問題を解きながら設定するかのいずれかである。

擬似言語での表記ルールを確認しよう。

戻り値・引数

関数を理解するには、

●「戻り値」

●「引数」

が何なのかを理解しなければならない。

これらを理解するために実際に「三角形の面積を計算するプログラム」をイメージしよう。

「三角形の面積を計算するプログラム」を「三角形の面積(底辺, 高さ)」という関数で定義していたとする (この関数の説明は図20の通りとする)。

この関数を使って、図19の三角形の面積を求める場合、

●引数(底辺)… 5

●引数(高さ)… 8

●戻り値 … 20

となる。

つまり、引数とは

その関数を呼び出すときに実際に使うデータ(値)のことを指し、

関数を実行して求められた結果を戻り値だと覚えておこう。 なお、戻り値は「値を返す」と表記されていることもある。「値を返す」と表記されているときも「戻り値」のことだと判断しよう。

「関数の説明」をまずは確認しよう。この関数では与えられた配列の要素数を戻り値として返すことがわかる。今回、引数として与えらえる配列「Items」の要素は3つなので、戻り値も「3」となる。

コメント

コメントとは、ソースコードを見返したり、他者が読む際に助けとなるメモ書きのことである。共通テストの問題で登場した際には、そのコードのヒントだと考えていればOKである。

まとめ

改めて、読めるようになろうという目標で紹介した以下のコードを確認しよう。

これまで学んだ内容を活かしコードを解読して以下の問題を解いてみよう。

まずはくり返し条件を確認しよう。「0からTensuの要素数-1」とあり、配列Tensuの要素は5つなので、「Tensuの要素数-1」は「4」を示す。よって、「0からTensuの要素数-1」は「0から4」と読み替えることができる。

これをもとにトレース表を作成すると以下のようになる。

以上より、「表示する(goukakusya)」で表示されるのは「3」である。よって、答えは「3」。

変更されるのはくり返しの中の条件分岐の部分なので、くり返し回数に変化はない。

さらに、配列Tensuの要素にも変化はないので、70以上の要素は3つあるため、

ループを終えた時点での変数goukakusyaに代入されている値は「3」である。

「表示する(goukakusya)」で表示されるのは「3」である。よって、答えは「3」。

いかがだったでしょうか。

情報I、大学入学共通テスト「情報」科の範囲となっているプログラミング問題について、読み解くコツを解説した。

これらのコツを知った上で、プログラムを多く読み解くようにすれば何を行いたいのかがわかりやすくなる。

プログラムコードを読み進めると同時に、各行でどういったことが行われているか、つまり「いま何をしているのか」を読み解けるようになればプログラム問題に強くなれるでしょう。

コトゼニ
コトゼニ

「情報」科で高得点を目指すためにプログラミング問題を解けるようにしていきましょうね。

最後まで読んでいただきありがとうございました。

この記事が少しでも参考になれば幸いです。

それではまたここで会いましょう!

ブログランキング・にほんブログ村へにほんブログ村

ブログ村に参加中です。上のバナーをクリックいただくだけで当ブログにポイントが入ります。いつも応援クリックありがとうございます。

Twitter

Twitter やってます。

新着記事のお知らせをしていますのでぜひフォローしてください!

人気の記事

この記事を読んだ人はこちらの記事も読んでいます。

▶︎「【塾長分析】大学入学共通テスト2025「情報」まとめ【難易度・対策】

共通テスト情報・対策共通テスト「情報」対策に必要なことは?塾講師が解説!勉強法と参考書

▶︎「【最新】(情報1)共通テスト試作問題 難易度と3つの対策

eyecatch-2491【最新】(情報1)共通テスト試作問題 難易度と3つの対策

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA