計算機は、プログラム(ソフトウェア)により与えられた指示に従い、入力を受け取り、出力を行う。
計算機は機械語プログラムを受け付ける。一方、人間は、(高級)プログラミング言語を用いてプログラムを記述する。
機械語プログラム
電子回路である計算機に理解しやすいように作られている。計算機の種類により、異なる。
プログラミング言語
人間に理解しやすく、書きやすいように作られている。計算機の種類に依存しない。
人間は、プログラミング言語でプログラムを記述し、その後、コンパイラというプログラムで機械語プログラムに変換する。(コンパイル)
通常のプログラミングの手順
(1)エディターを用いて、プログラミング言語にしたがってプログラムを記述する。
(2)コンパイラを用いて、プログラムをコンパイルする。
(3)コンパイルの結果、生成された機械語プログラムを実行する。
プログラムを書く上でのポイント:
☆プログラミング言語の文法に従う。
☆正しい手順で処理する。
この講義の目標:
☆Pascalの文法の習得を通して、プログラムを文法を従って書くということを身につける。
☆正しい計算の処理ということを学ぶ。
自然言語(英語、日本語)と人工言語(Pascal)との違い。
☆Pascalの文法には曖昧さがない。
☆Pascalはプログラムを記述することのみを目的とする。Pascalでは小説は書けない。
「1+1」の結果を画面に表示するプログラム。
program kantan1(input,output); begin writeln(1+1) end.
文法の説明
ここで正確な定義を与えることもできるのだが、学習しやすいように、簡単な例に対して文法的な説明を与えていってだんだんと文法を覚えていくこととする。
プログラム頭部:プログラムの名前をつける役割。
上の例では、「kantan1」がプログラム名である。「(input,output)」が何を意味するかは後回しにする。
とりあえずは、「呪文」のようなものと理解してほしい。
実行文部:プログラムの計算や処理の手順を記述する役割。
上の例では、「begin 〜 end.」の部分がそれにあたる。実行文部は、一つ以上の文からなる。
文:文とは計算機に対する指令である。
上の例では、「writeln(1+1)」が一つの文である。
writeln文: writeln(式) という形で書き、式を計算してその結果を画面に表示する。ここでいう「式」はPascalの文法用語である。
式:計算して結果を持つようなもの。上の例では、「1+1」がそれにあたる。
つぎに上の簡単な例を変更しつつ複雑なプログラムを見ていこう。
1000と16の和、差、積、商を表示する。
準備:まず、和差積商の式はおのおの次のように書く。
式+式
式−式
式*式
式 div 式
また、複数の文を実行することを記述したいときは、実行文部に複数の文を書けばよい。
文と文の間にはセミコロンを置く。
begin 文; 文; 文; 文 end
以上のことがわかれば、このプログラムは次のように書ける。
program kantan2(input,output); begin writeln(1000+16); writeln(1000-16); writeln(1000*16); writeln(1000 div 16) end.
空白と改行:
「空白はどこにいれてよくてどこにいれるといけないか?」とか「行をどこで分かつのが許されるか?」という疑問をもつかもしれない。これについては後で、厳密に学ぶ。とりあえずは、「空白や行の終わり(改行)は提示した例のように入れる」と覚えておけばよい。
writeln文:writeln文は一つの文で複数の式の計算結果の値を表示することが可能です。
書き方はカッコとカッコの間に式をならべて、式と式との間にはコンマを書きます。
writeln(式, 式, 式, 式)
このことを使えばもう少しシンプルにその2のプログラムは書けます。
program kantan3(input,output); begin writeln(1000+16, 1000-16, 1000*16, 1000 div 16) end.
注意 その2とその3のプログラムは数の表示のスタイルに若干違いがあります。その2のプログラムは、和、差、積、商を4行を使って表示しますが、その3のプログラムでは、1行で表示してしまいます。これについて詳しいことは後で説明することになります。
上のプログラムは、足し算などの計算をしてくれるのですが、どういう数の計算をするのかはプログラムで定められてしまっていました。別の数を計算したいときにはプログラムを書き直さないといけません。これでは不便です。キーボードから数字を入力してもらい、その数字に基づいて計算するプログラムを次に考えてみます。
手始めに、数字を一つ読み取り、それを二倍して画面に出力するプログラムを示します。
program kantan4(input,output); var n : integer; begin read(n); writeln(n*2) end.
新しくでてきた事柄について順に説明していきます。
変数 その4のプログラムがその1からその3までのプログラムと大きく異なるのは「変数」というものを使っているところです。ここでいう変数は数学でいうところの変数とは、その使い方が若干違いがありますので注意してください。Pascalでいうところの変数とは、数値などのデータを格納するための「箱」のようなものであると考えてください。
そして、プログラム中ではその箱には名前がついています。「n」という名前のついた変数を図示すると次のようになります。
上のプログラムでは、変数を整数をキーボードからの入力として受け入れるための受け入れ場所として使用します。変数がどのようにプログラムの中で使われているのかを順を追って説明します。
変数宣言部 上のプログラムでは、「var n : integer;」の部分が相当します。これは、整数(integer)のデータを一つ格納するための箱を一つ使用することをあらかじめ約束しています。実行文部で使用する変数はすべて変数宣言部で宣言(あらかじめ約束)しなければならないことになってます。このプログラムでは、nという名前の整数変数を一つだけ使用することを宣言しているわけです。
型 さて、変数宣言部のintegerは、整数型(整数の型)をあらわしてます。型とは、データの種類のことです。整数型の他にもさまざまな型がPascalにはありますが、とりあえずここでは、integer型だけを紹介しておくにとどめます。
read文 「read(n)」という部分がread文です。read文とは、
read(変数)
という形をした文で、「キーボードから打ち込んだデータを変数に格納せよ!」ということを意味しています。上の例だと
read(n)
という形ですから、「人間にキーボードから整数を打ち込んでもらって、その数値を整数変数nに格納せよ!」ということを意味する文です。
式の中で用いる変数 前のプログラムの例で説明した式は整数と+、*、/、divから作られていました。今説明している変数も式の中で使用することができます。式の中で変数を用いるとどういう意味になるのでしょうか。上のプログラムでは、writeln文中に「n*2」という変数を含む式があります。この場合、「n」という名前を持つ変数の中に入っている整数値を取り出してきて、その整数値と整数2との積を計算してその値を求め、その値が式の計算結果となるわけです。すなわち、式の中に変数があらわれたときには、「…という名前の変数から値を取り出してきて、その値を使って…」と考えればよいわけです。
こういうわけで、「writeln(n*2)」はnという名前の変数から整数値を取り出してきて、その値と整数2との積を計算して、その計算結果を画面に表示する。」ということを意味してます。
簡単なプログラム(その5)
前に取り上げた「簡単なプログラム(その2)」は、1000と16との和、差、積、商を計算して画面に出力するものでした。ここでは、1000、16、といったあらかじめ決められた整数の和、差、積、商ではなくて、キーボードから入力された2つの整数の間の和、差、積、商を計算するプログラムを考えてみましょう。
このプログラムを作成する上で知っておかなければならないこととしては次の事柄があるでしょう。
複数の変数を宣言する変数宣言部 その4のプログラムでは扱う変数は一つだけでしたが、その5のプログラムでは、2つの変数をつかわざるをえません。従って、宣言すべき変数も2個となるわけです。mとnとの二つの整数型の変数をプログラムで使うときには次のように変数宣言部を書きます。
var m:intger; n:integer;
ちなみに三つの整数型の変数lとmとnを使うときには
var l:integer; m:integer; n:integer;
と書きます。
以上のことを踏まえて、その2のプログラムとその4のプログラムを参考にすれば、このプログラムも簡単に書けます。
program kantan5(input,output); var m:integer; n:integer; begin read(m); read(n); writeln(m+n,m-n,m*n,m div n) end.
その3のプログラムでは、writeln文の中に複数の式を書くことができると説明しましたが、read文においても複数の変数を指定することができます。
read(変数,変数)
「read(m,n);」と書く時と「read(m);read(n);」と書く時とは、まったく同一の動作をするということになってます。このことをふまえると、その5のプログラムは次のように書くことができます。
program kantan6(input,output); var m:integer; n:integer; begin read(m,n); writeln(m+n,m-n,m*n,m div n) end.