入門書をつづけて何冊か読むことが、その世界に入っていくための最良のトレーニングになる。よくわからない所はとばしてよいからどんどん読みすすむ。入門書で出てきた分からないことというのは、たいてい著者の説明不足から起きている事であって、別の入門書を読むか、中級書を読めばすぐにわかるというのがほとんどなのである。それをそこで考え込んでみてもわかるはずがない。
一般に本を読んでいてわからないことに出会ったら、すぐに自分の頭の悪さに責を帰さないで、著者の頭が悪いか、著者の説明の仕方が悪いのではないかと疑ってみることが大事である。事実そうである場合が非常に多い。また内容的によい書であっても、表現力の不足、説明不充分ということがよくある。そういうところを無理にわかろうとして時間を費やすのは無駄というべきである。
『「知」のソフトウェア』立花隆著より引用
Delphi プログラムのうち最もシンプルな、コンソールにメッセージをプリントするプログラムを見ていこう。
F9 キーを押して、プログラムを実行すると、次のようなウィンドウが表示される。
リターンキーを押すとプログラムは終了する。では、コードの中身を具体的に見ていく(プログラムのことをソースコードと言ったり、ソース、又はコードとも言ったりする。言葉は短い方が好みなので、今後はソース、又はコードと呼ぶことにする)。
Delphi のエディタ画像を毎回キャプチャするのは面倒なので、以後次のものは、
これを下のように表す。
program Project1; {$APPTYPE CONSOLE} uses SysUtils; begin { TODO -oUser -cConsole Main : この下にコードを記述してください } Writeln('Hello, world'); Readln; end.
また、次のウィンドウを、
これを下のように表すことにする。それぞれ読み替えて欲しい。
Hello, world
それでは、もう一度コードを載せよう。
program Project1; {$APPTYPE CONSOLE} uses SysUtils; begin { TODO -oUser -cConsole Main : この下にコードを記述してください } Writeln('Hello, world'); Readln; end.
短いコードであるが、この中には沢山のことが含まれている。しかし、今のわれわれが理解すべきところというのは、ごくわずかしかない。その部分を抜き出すと、次の 5 行になる(それ以外のコードは、とりあえずは無視して構わない。必要になったときに取り組もう)。
begin { TODO -oUser -cConsole Main : この下にコードを記述してください } Writeln('Hello, world'); Readln; end.
begin
はプログラムの開始、end.
はプログラムの終了を表す。プログラムは、begin
から開始し、次の順序で処理を行う。
そして end.
でプログラムが終了する。
まてよ、次の一行はどうなったのだ?
{ TODO -oUser -cConsole Main : この下にコードを記述してください }
これはコメントと呼ばれるもので、プログラムとして実行されない。コメントとは、その名のとおりプログラムに対するコメント(注釈)を入れるための機能である。{
と }
で囲まれた部分がコメントとなる。ただし、
{$APPTYPE CONSOLE}
これは、{
と }
と囲まれているが、コメントではない。これをエディタから削除してしまうと、プログラムは動かないので削除しないように。{$
と }
で囲まれたものはコメントではなく、「コンパイラ指令」と呼ばれる特別な意味をもつ命令となる。
また、// から行末までもコメントとなる。コメント部分は、エディタが独自の色を付けてくれるので、どの部分がコメントであるか、すぐ分かるようになっている。
Writeln について見ていこう。Writeln はコンソールに文字を書い(write)て、改行する命令である。差し当たり、次のような見方をして欲しい。
Writeln(印字するもの);
印字するもの
が出力される文字だと考えよう。実際に、次のコードを実行して確認してみると分かり易いと思う。
program Project1; {$APPTYPE CONSOLE} uses SysUtils; begin { TODO -oUser -cConsole Main : この下にコードを記述してください } Writeln('Gamow'); Writeln('Polya'); Writeln('Gowers'); Readln; end.
コードを書き終わったら、F9 キーを押して実行する。表示されたウィンドウは次のようになっているはずだ。
Gamow Polya Gowers
まず初めに
Writeln('Gamow');
が実行されることで、 Gamow という文字が表示される。次に、
Writeln('Polya');
が実行され、 Polya という文字が表示される。そして最後に
Writeln('Gowers');
が実行され、Gowers が表示される。シングルクォートで文字を囲んでいることに注意しよう(なぜ囲むかは後述)。
つぎに Readln について見ていこう。Readln はコンソールから文字を読む(read)命令である。
program Project1; {$APPTYPE CONSOLE} uses SysUtils; var s: string; begin { TODO -oUser -cConsole Main : この下にコードを記述してください } Write('Please enter your name: '); Readln(s); Writeln(s); Readln; end.
Please enter your name: Rodrigo Rodrigo
このコードを実行すると、"Please enter your name:" と表示される。キーボードから何か文字を入力し、エンター(Enter)キーを押すと入力された文字が出力される。
このコードの意味はこうだ:
Write('Please enter your name: ');
が実行されて、Please enter your name: と表示される。次に、
Readln(s);
が実行されて、キーボードからの入力を読み取りがはじまる。エンターキーを押すと入力が終了し、入力されたものが変数 s に格納される。そして
Writeln(s);
で、変数 s に格納されている値(つまり入力されたもの)を表示する。最後に
Readln;
で、キーボードからの入力を読み取る。
エンターキーを押すとプログラムは終了する。以上である。
Readln を実行すると、あなた(キーボード)からの入力をコンピュータは待つ。キーボードから何かキーを押すと、押されたキーと同じ文字がウィンドウに表示されるのが分かるはずだ。エンターキーを押す事が入力の終りを告げる合図となる。エンターキーが押されると、コンピュータはあなたからの入力が終わったことを知り、その次に実行すべきプログラムの処理に移る。
Readln(s);
が行うことは、入力されたものを変数 s に格納することである。変数についてはすぐ後で解説する。
さて、最初に載せたコードをもう一度見直してみよう。
program Project1; {$APPTYPE CONSOLE} uses SysUtils; begin { TODO -oUser -cConsole Main : この下にコードを記述してください } Writeln('Hello, world'); Readln; end.
Hello, world
簡単なまとめをしておく。
begin
から開始される{
と }
で囲まれたものはコメントとなる(ただし、{$
と }
で囲まれたものはコメントではなく、「コンパイラ指令」と呼ばれる特別な意味を持つ命令となる)end.
でプログラムは終了するend.
の直前の Readln を取り除いたプログラムを実行するとどうなるだろうか?試してみよう:
program Project1; {$APPTYPE CONSOLE} uses SysUtils; begin { TODO -oUser -cConsole Main : この下にコードを記述してください } Writeln('Hello, world'); end.
F9 キーを押してプログラムを実行してみると、一瞬だけウィンドウが表示されたのが確認できただろうか。もう一度、最初に示したコードを実行してみよう:
program Project1; {$APPTYPE CONSOLE} uses SysUtils; begin { TODO -oUser -cConsole Main : この下にコードを記述してください } Writeln('Hello, world'); Readln; end.
Hello, world
エンターキーを押すとプログラムは終了する。つまり、Readln を実行しないとプログラムの実行が直に終了してしまうから、ウィンドウに表示された文字を見ることが出来ない。その為に Readln を実行している。入力(ここではキーボードからの入力)を読み取ることに使われるのが Readln 本来の役目なのだが、Writeln を実行して表示される文字を見るために、end.
の直前の Readln が存在するわけだ。
残りのコードのうち、解説しなかった部分、すなわち:
program Project1; {$APPTYPE CONSOLE} uses SysUtils;
の部分については、今後もしばらく無視することになる。あなたのエディタからこの部分のコードを消去してしまったら、プログラムを実行することはできないが、私がプログラムとして載せるコードには、これらの部分をとっぱらった方がさっぱりするので、以降この部分を省略することにする。すなわち:
program Project1; {$APPTYPE CONSOLE} uses SysUtils; begin { TODO -oUser -cConsole Main : この下にコードを記述してください } Writeln('Hello, world'); Readln; end.
このコードの begin
から end.
までのコード、すなわち:
begin { TODO -oUser -cConsole Main : この下にコードを記述してください } Writeln('Hello, world'); Readln; end.
の部分だけを載せることにする。適宜読み替えてほしい。
次に、四則演算を行うコードを見ていこう。
begin Writeln(2 + 3); // 2 と 3 を足す Writeln(2 * 3); // 2 と 3 をかける Readln; end.
5 6
+ で足し算、* で掛け算となる。//
から行末まではコメントであることに注意。足し算と掛け算が混ざっていると掛け算がまず先に行われる:
begin Writeln(1 + 2 * 3); Readln; end.
7
括弧を使えば、優先順位を変える事ができる:
begin Writeln((1 + 2) * 3); Readln; end.
9
まとめると、
begin Writeln(2 + 3); Writeln(2 * 3); Writeln(1 + 2 * 3); Writeln((1 + 2) * 3); Readln; end.
5 6 7 9
足し算では、+ 記号を使うが、割り算では div を使う。
begin Writeln(12 div 2); Writeln(90 div 10); Writeln(13 div 3); Readln; end.
6 9 4
割り切れない場合には、演算結果は整数に丸められることに注意。
除算の剰余には mod を使う。
begin Writeln(13 mod 3); Writeln(15 mod 5); Writeln(100 mod 7); Readln; end.
1 0 2
実数の場合も同様。ただし、除算の場合、今度は div ではなく / を使う。
begin Writeln(1.2 + 3.3); Writeln(1.3 * 9.2); Writeln(12.3 / 3); Writeln(12 / 5); Writeln(CurrToStr(1.2 + 3.3)); Writeln(CurrToStr(1.3 * 9.2)); Writeln(CurrToStr(12.3 / 3)); Writeln(CurrToStr(12 / 5)); Readln; end.
4.50000000000000E+0000 1.19600000000000E+0001 4.10000000000000E+0000 2.40000000000000E+0000 4.5 11.96 4.1 2.4
プログラムが実行される前には、そのコードが Delphi 言語の文法として正しいかどうかチェックが行われる。もし、文法的に正しくなければ、エラーが報告されプログラムは実行されない。たとえば、次のコードを実行しようとすると、エラーが報告される。
begin Writeln(1 + 2) Writeln(3 + 4); Readln; end.
演算子またはセミコロン(';')が必要です
これは、「あるべきところにあるはずのセミコロンがない」という意味のエラーである。プログラムは文法に忠実に従ったもので無ければならない。ちなみに、上図エディタの ”[エラー]” と書かれてある行をマウスでダブルクリックすると、エラー行にジャンプできる。
セミコロンを付け足して、もう一度実行してみよう。
begin Writeln(1 + 2); // セミコロンをつけた Writeln(3 + 4); Readln; end.
3 7
今度は無事に実行される。これからプログラムを書いていくうちに、いろんなエラーに出会う事になると思う。もしかしたら、文法書(マニュアル)をよく読んで、きちんと文法を理解してからプログラミングを始めるべきだと考える人がいるかもしれないが、全然そんな必要はない。最初のうちは、他人の書いたコードを少し読んで、それから自分で少しコードを書いて…、の繰り返しだ。そうしていくうちに、だんだんと感覚を掴んでいくはずだ。マニュアルに手を伸ばすのは、ある程度プログラミングに慣れてからにして、まず最初は他人のコードを真似よう。
脱線ついでに言うと、インデント(字下げ)には意味がある。たとえば、
begin Writeln(1 + 2); Writeln(3 + 4); Readln; end.
というコードは、次のように書いてもプログラムは実行できる。
begin Writeln(1 + 2); Writeln(3 + 4); Readln; end.
しかし、だれもこんな書き方はしない。これは少し大げさかもしれないが、
begin Writeln(1 + 2); Writeln(3 + 4); Readln; end.
というコードでも、そうすることによって大きな利点がないなら、すくなくとも止めた方がよい。なぜなら、コードがとても読みにくくなるからだ。ちゃんと、
begin Writeln(1 + 2); Writeln(3 + 4); Readln; end.
のように書こう。今後は、今よりももっと長く複雑なコードが登場する。そのコードが正しくインデントされているということは、とても大切なのである。だから最初のうちは、私のコードを「スペース一個違わずにそっくりそのまま」エディタにタイプしよう。
更新日:2004-12-20