見出し画像

情報Iはプログラミングして理解する「2-2 座席を決める(その2) 第1回 第3問」


はじめに

連載『情報Iはプログラミングして理解する』では、出版されている情報Iの共通テスト用問題集で気になる問題をピックアップしてそれを実際にプログラミングしてコンピュータ上で動かしてみるということをやっていきます。

今回扱うテキストと出典

今回は、河合出版(河合塾)が出版している

2025共通テスト総合問題集 情報I(ISBN:9784777228249)

を扱っていきます。

特に、本記事では上記問題集の第1回 第3問を扱っていきます。なお、第1回の問題は

'23年度 全統共通テスト高2模試 第3問

として実際に出題された問題になります。


本記事を読む前に

以下の内容を読む前に、第1回の問題を一度解答しておくことをお勧めします。


座席を決めるプログラムを作成する1

今回は、いよいよ座席を決めるプログラムを作成していきます。

プログラム ( i ) + ( iii )

まず、p.28のプログラム ( i ) に続けてp.29のプログラム ( iii ) を実行する部分を作成していきます。

// 座席を決めるプログラム(プログラム(i)+(iii)、失敗)
void setup(){

  String[] Seito = {"アカリ","ダイキ","エミ","ヒロキ","ナナ","ミサキ","シュン"}; // (1)
  String[] Seki = {"空席","空席","空席","空席","空席","空席","空席"}; // (2)
  
  for(int i=1; i<=7; i++){ // (3) iを1から7まで1ずつ増やしながら繰り返す
    int number = random_seisu(); // (4)
    Seki[i-1] = Seito[number-1]; // (5)
  }
  println((Object[])Seki);
}

// 1以上7以下のランダムな整数を生成する関数
int random_seisu(){
  return floor(7.0 * random(1.0)) + 1;
}

ソースコード3 プログラム ( i ) + ( iii )


ソースコード3の解説

ソースコード3では、前回の記事『情報Iはプログラミングして理解する「2-1 座席を決める(その1) 第1回 第3問」』で作成した1以上7以下のランダムな整数を生成する関数 random_seisu を (4)番目の処理で呼び出して利用しています。

あと、ソースコード3のポイントとして、配列の添字の問題があります。p.28に

教室の座席数は 7 であり、配列の添字は 1 から始まるものとする

p.28

とあります。ただ、プログラミング言語 Processing で、配列の添字は 0 から始まります。そこで、今回はソースコード3の

    Seki[i-1] = Seito[number-1]; // (5)

に記載している通り、問題の 1 から始まる配列の添字( i や number )に対して、作成したソースコード内の配列では、その1つ前の添字( i-1 や number-1 )を指すように調整するようにしました。


数回の試行を行ってみる

ソースコード3を、Processing の開発環境ウィンドウを開いて(スケッチ名を「sekigime_failed」としています)、テキストエディタ部分に書いて実行してみると、開発環境ウィンドウのコンソール上に、7 名の生徒の座席の結果が表示されます(図b)。

図b スケッチ「sekigime_failed」の実行結果(試行1回目)

そして、この試行を3回行った結果が以下のようになりました。

1回目 アカリ ミサキ シュン ダイキ ミサキ ナナ ミサキ
2回目 シュン ミサキ ダイキ ナナ シュン アカリ ナナ
3回目 ヒロキ エミ ヒロキ ナナ シュン ナナ ミサキ

今回の試行では、1回目「ミサキ」が3回、2回目「シュン」が2回、「ナナ」が2回、3回目「ヒロキ」が2回、「ナナ」が2回と、 Seki の複数の要素に同じ名前が入る場合があることがわかります。

これが、

問2 アカリさんが、プログラム ( i ) に続けてプログラム ( iii ) を実行することを十分な回数行って実際の生徒の座席を見てみると、【規則】が満たされていなかった。

p.29

の原因であることがわかります。


座席を決めるプログラムを作成する2

次に、プログラム (iii) を修正したプログラム (iv) を利用して座席を決めるプログラムを作成していきます。

プログラム ( i ) + ( iv )

p.28のプログラム ( i ) に続けてp.30のプログラム ( iv ) を実行する部分を作成していきます。

// 座席を決めるプログラム(プログラム(i)+(iv))
void setup(){

  String[] Seito = {"アカリ","ダイキ","エミ","ヒロキ","ナナ","ミサキ","シュン"}; // (1)
  String[] Seki = {"空席","空席","空席","空席","空席","空席","空席"}; // (2)
  
  for(int i=1; i<=7; i++){ // (3) iを1から7まで1ずつ増やしながら繰り返す
    int number = random_seisu(); // (4)
    while( Seito[number-1] == "席決定" ){ // (5) 条件成立の間繰り返す
      number = random_seisu(); // (6)
    }
    Seki[i-1] = Seito[number-1]; // (7)
    Seito[number-1] = "席決定"; // (8)
  }
  println((Object[])Seki);
  println((Object[])Seito);
}

// 1以上7以下のランダムな整数を生成する関数
int random_seisu(){
  return floor(7.0 * random(1.0)) + 1;
}

ソースコード4 プログラム ( i ) + ( iv )


数回の試行を行ってみる

ソースコード4を、Processing の開発環境ウィンドウを開いて(スケッチ名を「sekigime」としています)、テキストエディタ部分に書いて実行してみると、開発環境ウィンドウのコンソール上に、7 名の生徒の座席の結果が表示されます(図c)。

図c スケッチ「sekigime」の実行結果(試行1回目)

そして、この試行を3回行った結果が以下のようになりました。

1回目 シュン ヒロキ エミ ダイキ ナナ アカリ ミサキ
2回目 ダイキ ナナ アカリ エミ シュン ヒロキ ミサキ
3回目 アカリ ナナ シュン ダイキ ミサキ ヒロキ エミ

今回の3回の試行では、いずれも名前が重複することがなくなり、正しく座席を決めることができていることがわかります。


まとめ

今回は、第1回 第3問の本題である座席を決めるプログラムを作成しました。
今回作成したプログラムのポイントは、配列の添字が問題の設定(添字は 1 から始まる)と、プログラミング言語での仕様(添字は 0 から始まる)とで異なる場合にその違いをどう調整していくかという点だと考えています。このような調整はプログラミングでよく行うことなので、頭の片隅に記憶しておいてください。

次の記事では、座席を決めるためのプログラムを改良したものを実装していきたいと思います。


読んだ感想などをお寄せください

本記事を読んだ感想や質問などを以下のお問い合せフォームからお寄せください。(お問合せフォームの本文に、本記事のタイトルを入れてください。)


MK's papa

いいなと思ったら応援しよう!