プロデルで始める日本語プログラミング言語入門(#5) 「配列」

連載プロデル入門の5話目になりました。今回は「配列」についてご紹介します。

配列はたくさんのデータを扱うときに便利な機能です。コンピュータは計算するための道具から始まったということは少しお話しましたが、今のコンピュータは大量のデータを一瞬で処理できます。プロデルで配列を使ってデータを処理する方法を紹介します。

この記事では、前回の記事を紹介した 「繰り返し文」をたくさん使っています。もしご覧になっていない方は、そちらから読むことをおすすめします。

配列とは、複数の値を一度に格納できる変数です。

配列には、値を入れるための細かい仕切りがあり、それぞれの仕切られた空間を要素と言います。要素には、添字(そえじ)と呼ばれる番号が付いています。配列では、添字を指定して値を出し入れします。

例えば、アパートのようにたくさんの部屋がある建物を配列とイメージすると分かりやすいです。

配列を使ってみる

それでは早速、配列を使ってみましょう。配列を作るには、次のように書きます。

《配列変数名》は{《1番目の式》, 《2番目の式》, 《3番目の式》,...}

配列の要素として入れたい値を{ }の中で、カンマ(もしくは読点)で区切って指定します。要素はいくつでも指定できます。0個でもOKです。

例えば次のように書くと、4つの要素が入った配列を作れます。

果物は{「りんご」,「バナナ」,「ぶどう」,「なし」}

次に作られた配列から指定した添字の要素を取り出すには、次のような式で書きます。

《配列変数名》(《添字》)

もしくは日本語風に次のように書くこともできます。

《配列変数名》の《添字》番目

《添字》には、1から始まる数値を指定します。例えば、「果物」配列から2番目の要素を取り出すには、次のように書きます。

//「バナナ」と表示されます
果物(2)を表示する
果物の2番目を表示する

添字は、具体的な数値の代わりに、計算式や変数も指定できます。例えば、次のように繰り返し文のカウント変数を使えば、すべての要素を順番に報告させることもできます。

果物は{「りんご」,「バナナ」,「ぶどう」,「なし」}
番号を増やしながら1から果物の個数まで繰り返す
	果物(番号)を報告する
繰り返し終わり

要素の内容を変える

代入文を使って配列の要素の内容を後から変えられます。

《配列変数名》(《添字》)は、《入れる値》

例えば次の例では、配列の4番目の内容を「なし」から「もも」に変えます。

果物は{「りんご」,「バナナ」,「ぶどう」,「なし」}
果物を表示する
果物(4)は、「もも」
果物を表示する

配列を操作する

プロデルには、配列を扱うのに便利な機能がいくつか用意されています。 たくさんありますが順番に紹介します。

要素を加える

「加える」という動詞を使うと、配列に新たに要素を加えることもできます。

果物は{「りんご」,「バナナ」,「ぶどう」,「なし」}
果物に「スイカ」を加える
果物を表示する  //りんご,バナナ,ぶどう,なし,スイカとなる

「挿入する」という動詞を使うと、すでにある要素の間に新しい要素を挿入できます。

果物は{「りんご」,「バナナ」,「ぶどう」,「なし」}
果物の2番目に「スイカ」を挿入する
果物を表示する

要素を消す

配列から要素を消すには、「消す」動詞を使います。「消す」は、指定した番号の要素を消した新しい配列を作ります。

果物は{「りんご」,「バナナ」,「ぶどう」,「なし」}
果物は、果物の3番目を消したもの
果物を表示する

要素の個数を調べる

配列に入っている要素の個数は、「個数」という名詞を使います。

果物は{「りんご」,「バナナ」,「ぶどう」,「なし」}
果物の個数を表示する  //4と表示される

それぞれ繰り返す(foreach)

繰り返し文には、「それぞれ繰り返す」という便利な書き方があります。それぞれ繰り返すを使うと、配列の要素の個数だけ繰り返します。その時に、ひとつひとつ決められた変数に値を入れてくれます。カウンタ変数を使わないのでシンプルに書けます。

一覧は{「N-03B」,「F-04B」,「P-09A」,「SH-08B」}

一覧を要素へそれぞれ繰り返す
  要素を報告する
繰り返し終わり

「すべて」後置子

繰り返し文を使わずにもっと短く書くこともできます。配列変数名の直後に「すべて」と付けると、その文全体を要素の数だけ繰り返し実行してくれます。

一覧は{「N-03B」,「F-04B」,「P-09A」,「SH-08B」}
一覧すべてを報告する

ソートする

「並べ替える」という動詞を使うと、配列の要素を決まった法則で並べ替えてくれます。

値一覧は{1,10,5,2,0}
値一覧を小さい順に並び替える
値一覧を報告する
値一覧を大きい順に並び替える
値一覧を報告する

要素が文字列の場合も順番に並べ替えてくれます。

昼ご飯は{「すし」,「うな重」,「ラーメン」,「カレーライス」}
昼ご飯を名前順に並び替える
昼ご飯を表示する

合計や平均、最大値などを求める

配列の内容から合計や平均を計算することもできます。配列には「合計」や「平均」という名詞がありこの名詞を使うと、簡単な集計なら1行で調べられます。

値段一覧は{290,90,120,160}
値段一覧の合計を報告する
クラス成績一覧は{95,65,70,43}
「平均:[クラス成績一覧の平均]」を報告する
「偏差値:[クラス成績一覧の偏差値]」を報告する
「分散:[クラス成績一覧の分散]」を報告する
「最大値:[クラス成績一覧の最大値]」を報告する
「最小値:[クラス成績一覧の最小値]」を報告する

多次元配列(配列の配列)

配列の要素として、さらに配列を入れることもできます。これを多次元配列と呼びます。例えば、次のように配列の要素に配列を入れると2次元配列を作れます。

行列は{
	{17, 169, 1290},
	{24, 173, 5400},
	{31, 166, 7120},
}

多次元配列では、添字を重ねて書きます。添字を指定するときは、外側の{ }から順番に指定します。例えば『行列(2)(3)』と書くと、2行目の3列目の要素を表します。

行列は{
	{17, 169, 1290},
	{24, 173, 5400},
	{31, 166, 7120},
}
行列(2)(3)を報告する

2次元配列から指定した列の要素だけを取り出すには

「すべて」後置子を使うと、すべての行の配列の特定の列にある値だけを集めた配列を作ることもできます。

行列は{
	{17, 169, 1290},
	{24, 173, 5400},
	{31, 166, 7120},
}

行列すべての1番目を報告する
行列すべての3番目の合計を報告する

サンプル: 模様を作る

2次元配列は、ゲームを作る時にマップを表現したりするためによく使います。一例として、「マップ」という2次配列を作ってその内容に合わせて模様を表示するプログラムを作ってみます。

「アイコン」には、3種類の文字を指定します。マップには、縦横にその場所にどのアイコンを表示するか、アイコンの添字で指定します。

アイコンは{「□」, 「☆」, 「■」}
マップは{
	{3, 3, 3, 3, 3, 3},
	{3, 1, 3, 3, 1, 3},
	{3, 1, 1, 1, 1, 3},
	{3, 3, 3, 3, 1, 3},
	{3, 2, 1, 1, 1, 3},
	{3, 3, 3, 3, 3, 3},
}

縦を1から(マップの個数)まで増やしながら繰り返す
	横を1から(マップ(縦)の個数)まで増やしながら繰り返す
		アイコン(マップ(縦)(横))を改行せず報告する
	繰り返し終わり
	「」を報告する
繰り返し終わり

繰り返し文では、マップの左上から右方向、下方向へ順番にアイコンを報告していきます。

実行すると、「調査ウィンドウ」にマップで指定した番号に合わせたアイコンが模様として表示されます。

「アイコン」配列の要素を変えて記号の種類を変えたり、「マップ」配列を書き換えて、模様を変えてみましょう。

サンプル: 100までの素数を求めよ

最後に、配列を使って素数を求めるプログラムを作ってみましょう。素数とは、1かその数でしか割れない数のことですが、100までの間にある素数が何かをコンピュータに調べてもらいましょう。

素数を求める方法(アルゴリズム)は、「エラトステネスのふるい」が有名です。

このアルゴリズムでは、2から100までの整数を順番に並めておきます。先頭にある数(最初は2)を素数として選び、その数で割りきれる数(倍数)をすべてふるい落としていきます。その数の倍数をすべてふるい落とされたら、残った数で先頭にある数を素数として選び、またふるい落としていきます。これを100まで繰り返します。

このような操作をプロデルで書くと次のようになります。

総数は、100
探索リストは{}
iを2から総数まで1ずつ増やしながら繰り返す
  探索リストのi番目は、1
繰り返し終わり

iを2から総数まで1ずつ増やしながら繰り返す
  もし探索リストのi番目が1なら
    iを報告する
    jをiから総数まで1ずつ増やしながら繰り返す
      探索リストの(i×j)番目は、0
    繰り返し終わり
  もし終わり
繰り返し終わり

このプログラムは、「探索リスト」の添字が素数の候補となる数です。「探索リスト」の要素には、1か0の値が入っていて、1がふるい落とされていないことを表す印、0がふるい落とされた印を表します。

  • プログラムの4行目の繰り返し文では、「探索リスト」に2番目から100番目までの要素にそれぞれ1を入れておきます。
  • 8行目の繰り返し文では、ふるい落とされていない数(要素の内容が1である要素の添字)から先頭の数を素数として選びます。
  • 11行目の繰り返し文では、選ばれた素数の倍数番目にある要素を0にしてふるい落とします。

繰り返し中に選ばれた素数を報告していくと、次のように素数がすべて表示されます。

人間が紙とペンで同じ事をすると、とても時間が掛かりますが、コンピュータは一瞬でやってしまいます。

練習問題!

まとめの練習問題です!

次のような食べ物の名前が入った配列から、実行する度にランダムに1つだけ選んで表示するプログラムを作ってみましょう。

食べ物一覧は{「カレーライス」,「牛丼」,「ラーメン」,「チャーハン」,「餃子」,「うどん」,「そば」,「シチュー」,「オムライス」,「スパゲッティ」,「グラタン」,「ピザ」}

どのように作れば、よいか思いつかない時には、ロジックを一つ一つ考えてみましょう。やりたいことを小さいことに分けて順番に考えて作っていけば、完成します。

  • 12個からランダムに1つを決める→1から12までの乱数を調べる
  • 決めた数から食べ物を選ぶ

まとめ

今回は、配列について紹介しました。Excelのように大量のデータを処理する時やゲームを作る時など、配列はいろいろな時に使います。記事では具体例と一緒に紹介しましたが、説明することがたくさんあり、難しかったかもしれません。ですが最後まで読んで頂きありがとうございます。

プログラミングに必要な言葉はまだまだ沢山ありますが、この連載で今後も順番に紹介していきたいと思いますので、引き続きよろしくお願いします。

次回もお楽しみに。

※当ブログの記事の著作権はゆうとにあります。プロデルに関係が無い目的で、文章や図表,プログラムを複製したり改変して掲載することを堅く禁止します

  • いいね (154)
  • 続編を読みたい (50)

コメントを残す