プログラミングの基本要素 変数・関数・配列など|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門


2023-02-22 更新

基本情報技術者試験は、 2023 年 4 月から新制度で実施されます。

この連載では、新制度で採用される新しい擬似言語(旧制度の擬似言語とは、表記方法に違いがあります)を使って、試験のシラバス(情報処理技術者試験における知識・技能の細目)に示されている代表的なアルゴリズムとデータ構造を、プログラミング入門者向けにやさしく解説します。 受験対策としてだけでなく、アルゴリズムとプログラミングの基礎知識を習得するために、ぜひお読みください。

今回は、コメント、変数の宣言、代入、演算、関数や手続の呼び出し、といった プログラミングの基本要素 を擬似言語で表記する方法を学んでから、配列というデータ構造を取り上げます。

プログラムの基本要素

サンプルプログラム

リスト 1 は、キーボードから入力された 2 つの数値の平均値を画面に表示するプログラムです。 このプログラムから、コメント、変数の宣言、代入、演算、関数や手続の呼び出し、といったプログラムの基本要素を擬似言語で表記する方法を説明しましょう。

プログラミングの学習で示されるプログラムは、構文やアルゴリズムを学ぶためのサンプルであって、多くの場合に実用的ではないことをご了承ください。

swipeプログラムは横スクロールできます

codeキーボードから入力された 2 つの数値の平均値を画面に表示するプログラム
文字列型: s		// キー入力された文字列を格納する変数
実数型: x, y, ave	// 2 つの数値と、それらの平均値を格納する変数
sreadLine()		// readLine 関数はキー入力された文字列を返す
xconvDouble(s)	// convDouble 関数は引数の数字列を実数に変換して返す
sreadLine()
yconvDouble(s)
ave(x + y) ÷ 2
writeLine(ave)		// 手続 writeLine は引数の値を画面に表示する

コメント

コメントは、プログラムの中に任意に記述する注釈です。 コメントの表記方法は、 2 種類あります。

// から行末までをコメントとする方法と、 /* */ で囲まれた部分(複数行でも構いません)をコメントにする方法です。

先ほどのリスト 1 には、 // を使ったコメントがあり、変数の役割、関数と手続の機能を示しています。 試験問題では、このようなコメントが、プログラムの内容を読み取るためのヒントになります。

変数の宣言

変数は、データの値を格納する入れ物です。 変数は

データ型: 変数名

という構文で宣言してから使います。

データ型には、

  • 整数型
  • 実数型
  • 論理型
  • 文字型
  • 文字列型

などがあります。

変数名は、 1 文字でも複数文字でも構いません。 複数名にする場合は、英語または英語の略語にします。

先ほどのリスト 1 では、文字列型の変数 s と、実数型の変数 x 、 y 、 ave があります。 ave は、 average (平均)の略語です。 同じデータ型で複数の変数を宣言する場合は、

実数型: x, y, ave

のように、変数名をカンマで区切って並べます。

コラムプログラムにはなぜ “データ型(型)” が必要なのか

データ型は、データの形式とサイズを指定するものです。

コンピュータの内部では、あらゆるデータは 2 進数の羅列なので、形式とサイズを指定しないと、どこで区切って、どのように解釈すればよいか(整数なのか、実数なのか、文字なのか)がわかりません。 そのため、データ型を指定するのです。

なお、プログラミング言語の中にはプログラムの実行ツールがデータ型を自動的に判断するもの( Python や JavaScript など)もあります。 このような言語でプログラムを記述するときには、データ型の指定が不要です。

代入

変数にデータの値を格納することを代入と呼びます。 代入は

変数 ← データの値

という構文で示します。

データの値 の部分は、演算式や関数の呼び出しにすることもできます。
演算式にした場合は、演算結果の値が変数に代入されます。
関数の呼び出しの場合は、関数の戻り値(処理結果の値)が変数に代入されます。

先ほどのリスト 1 では、

ave(x + y) ÷ 2

で、演算結果を変数 ave に代入しています。

sreadLine()

xconvDouble(s)

などで、関数の戻り値を変数に代入しています。

演算

演算とは、データの値を加工することです。 プログラムで使われる演算には、

  • 算術演算
  • 比較演算
  • 論理演算

などがあります。

演算の種類は、演算を意味する記号や文字列で表され、これを演算子と呼びます。

算術演算子
+ - × ÷ mod (除算の余りを求める)
比較演算子
= > <
論理演算子
not (否定)、 and (論理積)、 or (論理和)

先ほどのリスト 1 では、

ave(x + y) ÷ 2

という代入の右辺で、 + および ÷ という演算子が使われています。

数学と同様に、 × ÷ の方が + - より優先順位が高いので、 + - を先に演算したい場合は ( ) で囲みます。

関数や手続の呼び出し

関数( function )と手続( procedure )は、あらかじめ用意されている処理のまとまりに名前を付けたものです。

関数(引数, ・・・)

および

手続(引数, ・・・)

という構文で、引数を指定して関数や手続を呼び出します。

引数とは、関数や手続に渡して処理するデータです。 呼び出すとは、関数や手続を使うことです。 用途によっては、引数がない場合もあります。
戻り値とは関数の処理の結果、返すデータです。 関数と手続の違いは、戻り値を返すかどうかです。 関数は、戻り値を返します。手続は、戻り値を返しません。

 

どのような関数や手続があるのかは、決められていません。 出題者が、勝手に関数や手続を取り決めます。 したがって、試験問題には、関数や手続の機能の説明があります。

先ほどのリスト 1 では、

  • キー入力された文字列を返す readLine 関数
  • 引数の数字列を実数に変換して返す convDouble 関数( convert double の略語)

が使われ、引数の値を画面に表示する手続 writeLine が使われています。 これらの関数の名前や機能は、筆者が勝手に決めたものです。

プログラムを読む

プログラムの基本要素を擬似言語で表記する方法がわかったところで、あらためてリスト 1 のプログラムを読んでみましょう。

プログラムを読むとは「具体的な値を想定して、処理の流れと値の変化を追いかけること」です。追いかけることを英語で trace と言うので、プログラムを読むことを「トレースする」と呼ぶ場合があります(これ以降では、トレースすると呼びます)。

試験問題の内容は、多くの場合に、プログラムの穴埋めになっています。 プログラムをトレースすることで、プログラムの空欄に入れるべき処理がわかります

トレースのコツ

トレースするときには、暗算でも計算できる値を想定してください。 ここでは、 100 と 200 の平均値を求めることを想定してみましょう。

図 1 は、プログラムをトレースした例です。 ここで、注目してほしいのは、キー入力で得られるのは、文字列であることです。

「 100 」を入力すると、 100 という数値ではなく、 "100" という文字列(擬似言語では " " で囲んで文字列を表します)が得られます。

convDouble 関数は、この "100" という文字列(数字列)を実数型の 100 という数値に変換して返します。

図 1 では、トレースを

   fast_forward 変数の値の変化
   fast_forward 処理内容

のようにプログラムの横に示していますが、実際の試験は CBT (コンピューを使ったテスト)形式で行われるので、メモを取りながら頭の中で行ってください。

図 1 リスト 1 のプログラムをトレースした例
文字列型: s
実数型: x, y, ave
sreadLine()		fast_forward s に "100" が代入される。
xconvDouble(s)  	fast_forward x に 100 が代入される。
sreadLine()         fast_forward s に "200" が代入される。
yconvDouble(s)        fast_forward y に 200 が代入される。
ave(x + y) ÷ 2      fast_forward ave に 150 が代入される。
writeLine(ave)		fast_forward 画面に 150 が表示される。

配列

配列とは?

配列は、複数のデータが並んだデータ構造です。

データ構造の種類には、

  • リスト
  • キュー
  • スタック

などがありますが、すべてのデータ構造の実体は配列です。 なぜなら、コンピュータの記憶装置であるメモリの内部にはデータの格納領域が並んでいて、それらをプログラムで取り扱うための表現が配列だからです。

配列に、つながり方や読み書きの順序のルールなどを設定することで、様々なデータ構造になります(様々なデータ構造は、今後の連載で取り上げます)。

配列のイメージ

配列のイメージは、データを格納する箱が並んだものです。 全体を配列と呼び、個々の箱を要素と呼びます。

配列全体には、例えば a のように(配列のことを英語で array というので、頭文字の a という名前がよく使われます) 1 つの名前を付け、個々の箱は

a[要素番号]

で指定します。 要素番号のことを、添字インデックスと呼ぶこともあります。

 

プログラミング言語の種類によって、先頭の要素番号を 0 とするものと、 1 とするものがあります。 擬似言語では取り決めがないので、問題ごとに、先頭の要素番号を 0 とするか 1 とするかが示されます。

図 2 に配列のイメージを示します。 ここでは、配列の要素数が 5 ですが、先頭の要素番号を 0 とした場合には、末尾の要素番号が 5 ではなく 4 になることに注意してください。

図 2 配列のイメージ

配列を擬似言語で表記する

リスト 2 は、図 2 に示した配列を擬似言語で表記したものです。 配列は

整数型の配列: a

のように、データ型を ○○ 型の配列 という形式で示します。 整数型の配列: a は、配列の個々の要素が整数型であることを意味します。

{ } で囲んで配列の要素をカンマで区切って並べ、それを で配列の変数に代入します。

codeリスト 2 配列の宣言と要素の代入(先頭の要素の要素番号を 1 とする)
整数型の配列: a{ 12, 34, 56, 78, 90 }
writeLine(a[1])		// a[1] を画面に表示する( 12 が表示される)
a[5]99		// a[5] の値を 99 で書き換える
writeLine(a[5])		// a[5] を画面に表示する( 99 が表示される)

配列の個々の要素は、通常の(単独の)変数と同様に読み書きできます。 リスト 2 では、配列の先頭の要素 a[1] の値を画面に表示し、配列の末尾の要素 a[5] の値を 99 に書き換えてから画面に表示しています。

これらの処理には、何の意味もありません。構文を学ぶためのサンプルです。

配列と繰り返し処理

配列の合計値を求める( while 文を使った場合)

多くの場合に、配列の個々の要素は、 while 文や for 文を使った繰り返しで処理されます。

例として、要素数 5 個の配列の合計値を求めるプログラムを作ってみましょう。 while 文を使った場合は、リスト 3 のようになります。

codeリスト 3 while 文を使って配列の合計値を求めるプログラム(先頭の要素の要素番号を 1 とする)
整数型の配列: a{ 12, 34, 56, 78, 90 }
整数型: sum0
整数型: i1
while (i5)
  sumsum + a[i]
  ii + 1
endwhile
writeLine(sum)

リスト 3 の内容を説明しましょう。

合計値を格納する変数 sum には、初期値として 0 を代入しておきます。
配列の要素番号を示す変数 i には、初期値として 1 (配列の先頭の要素の要素番号)を代入しておきます。

while 文では、 while の後のカッコの中にある条件が 真 である限り、 while と endwhile で囲まれた処理が繰り返されます

while (条件)
  処理
endwhile

ここでは、

i5

という条件なので、配列の要素番号 i が 5 以下である限り、

sumsum + a[i]

および

ii + 1

という処理が繰り返されます。

これによって、
変数 i が 1 、2 、3 、4 、5
と変化し、
a[1] 、a[2] 、a[3] 、a[4] 、a[5] が順番に変数 sum に加算
されます。

a[5]を加算した後で

ii + 1

によって変数 i の値は 6 になり、

i5

という条件が偽になるので、 while 文の繰り返し処理が終了します。

最後に

writeLine(sum)

で、変数 sum の値を画面に表示します。

配列の合計値を求める( for 文を使った場合)

リスト 4 は、先ほどのリスト 3 と同じ機能のプログラムを for 文で作ったものです。

for 文では、 for の後のカッコの中にある制御記述にしたがって、 for と endfor で囲まれた処理が繰り返されます

for (制御記述)
  処理
endfor

制御記述の書き方に決まりはありません。 どのように繰り返すかを、式や言葉を使って記述します。

codeリスト 4 for 文を使って配列の合計値を求めるプログラム(先頭の要素の要素番号を 1 とする)
整数型の配列: a{ 12, 34, 56, 78, 90 }
整数型: sum0
整数型: i1
for (i を 1 から 5 まで 1 ずつ増やす)
  sumsum + a[i]
endfor
writeLine(sum)

ここでは

i を 1 から 5 まで 1 ずつ増やす

と記述しています。

これによって、
変数 i が 1 、2 、3 、4 、5
と変化し、
a[1] 、 a[2] 、 a[3] 、 a[4] 、 a[5] が順番に変数 sum に加算
されます。

 

while 文を使ったリスト 3 と、 for 文を使ったリスト 4 を比べると、 for 文を使った方がプログラムを短く効率的に記述できています。 これは、 for 文の制御記述の部分に多くのことを記述できるからです。

ただし、 while 文を使うと、変数 i の値が 1 から始まって、 1 ずつ加算されて、 5 以下という条件が真である限り繰り返される、というプログラムの細かな動きを示せます。

while 文と for 文のどちらを使うのかは、プログラムを作る人の好みですが、それぞれの言葉の意味に合わせて、
「~である限り繰り返す」と考えたら while 文を使い
「~の期間繰り返す」と考えたら for 文を使う とよいでしょう。

今回は、コメント、変数の宣言、代入、演算、関数や手続の呼び出し、といったプログラミングの基本要素を擬似言語で表記する方法を学んでから、配列というデータ構造を取り上げました。

次回以降も、シラバスに示されたアルゴリズムとデータ構造を学んでいきます。

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

label 関連タグ
科目A試験は、
免除できます。
独習ゼミで科目A試験を1年間免除して、科目B試験だけに集中しましょう。
免除試験を受けた 74.9% の方が、
科目A免除資格を得ています。
科目A免除試験 最大 2 回の
受験チャンス !
info_outline
科目A免除試験 最大 2 回の
受験チャンス !
詳しく見てみるplay_circle_filled
label これまでの『新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門』の連載一覧

マージソート|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

二分木の深さ優先探索と幅優先探索|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

比べてわかるキューとスタックの仕組み|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

「リスト」というデータ構造|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

サーチのアルゴリズム (3) ハッシュ表探索法のアルゴリズム|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

クイックソートのアルゴリズム|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

再帰呼び出しのアルゴリズム|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

サーチのアルゴリズム (2) 二分探索法|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

サーチのアルゴリズム (1) 線形探索法|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update

多重ループを使うバブルソート|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門

update
label 著者