3.  TURBO PASCAL 編


 
   3.1  簡単な PASCAL プログラムの例とその作成法
 
   3.2  PASCAL で扱うデータの型
 
         変数    定数
 
   3.3  TURBO PASCAL プログラムの構成
 
         予約語
 
   3.4  TURBO PASCAL サンプルプログラム
 
     [1]数値変数、ディスプレイ表示
     [2]文字列定数
       【日本語入力時の注意】
     [3]文字列の結合
     [4]変数への代入
     [5]整数値演算
     [6]実数の編集表示
     [7]繰り返し(repeat)
     [8]繰り返し(while)
 
       ・・・・・・・
 
    続きは JAVA 画面 で見て下さい。  JAVA画面に飛ぶ

 

. TURBO  PASCAL  


 

.  簡単な PASCAL プログラムの例とその作成法


 
 
[1] 初めて PASCAL プログラミングを体験する人のために、ディスプレイに
  Hello, world!  と1行出力するプログラムの例と、その詳しい作成法をここ
  で説明する。
 
 
 作成するプログラム
 
  program hello;
    begin
      WriteLn('Hello, world!');
    end.
 
 
 作成法
 
 (1)Turbo Pascal を起動したら、[F10](メニュー) を押す。
 
    ・画面最上行のメニュー項目のどれかがハイライト(反転)表示される筈
     である。ハイライト表示されないときは [F10] をもう一度押してみ
     る。
 
 (2)矢印キー(←、→) で  Edit(エディット)  を選び [Enter] を押すと、編
  集モードになる。
 
 (3)上記のプログラムをキーボードから打ち込む。
 
    ・キーを押すと、画面上で点滅するガイド(カーソル, cursor)の位置
     に文字が挿入される。
 
    ・行を変えるときは [Enter] を押す。  ([Enter] キー は キャリッ
     ジリターンキー, リターンキー, 改行キー, エンターキー などと呼
     ばれる。このテキストの他の部分で [CR] と書くこともある。)
 
    ・打ち込みに失敗したら、[←] または [BS] キーを押して間違った文
     字を消去し正しい文字を再入力する。
 
    ・'Hello, world!'  の両端にある  '  は、[SHIFT]+[7] を押す。
 
 (4)作成したプログラムをあらかじめ準備したディスクに保存する。
 
    ・[F10] を押し、 ←, →  で File(ファイル) を選び [Enter] を押す。
 
    ・↓, ↑ で
 
       Save as(名前を変えて保存)...
           (-->作ったプログラムを初めて保存するとき)
 
       Write to
           (-->作ったプログラムを初めて保存するとき)
 
       Save(ファイルの保存)
           (-->そのプログラムを保存するのが2度目以上のとき)
 
     を選び [Enter] を押す。
 
    ・初めて保存するときは、保存する際のファイル名の問い合わせがある
     ので、四角枠の中に英文字あるいは数字8文字以内でファイル名を
     入力して [Enter] する。
 
        例 : rei[Enter]
             〔ファイル名の時は、英大文字 REI でも同じ〕
 
     [注意] i)保存時  NONAME.PAS(=名無しのゴンベエ)  が枠内に表
           示されたときは、無視して入力すればよい。ファイル名
           には空白文字(スペース)を含めてはいけない
 
         ii)ファイル名に漢字も使える(漢字1文字=英数字2文字分)。
 
         iii)PASCAL言語のプログラムであることを示すため、 .PAS
          をファイル名に付けてもよい (例:REI.PAS) (→ .PAS
          がないときは、エディタが自動的に .PAS を付けてくれ
          る)
 
 (5)プログラムを コンパイル〜リンク〜ラン(実行) する。
 
      [F10] --> Run(実行) --> Run(実行)
 
 (6)プログラムに誤りがなければ、ディスプレイ画面が一瞬まばたく。
 
           *これはプログラムが瞬時に実行されて(実行画面に
            Hello, world! と表示して)、またエディタ画面に戻
            ってくるためである。
 
     [GRPH]+[F5](【PC98】)  (【DOS/V, FMR】では [ALT]+[F5])
 
  あるいは
 
     [F10] --> Window(ウインドウ) --> User screen(ユーザー画面)
 
     [F10] --> Run --> User screen
 
  と操作して、実行画面に Hello, world! と表示されていることを確認する。
 
 (7)プログラムに文法上の誤りがあれば、誤りのある行がハイライト表示され
  るので [Enter]  を押してエディタ画面に移り修正する。修正後 (4) に戻
  る。
 
 
以上がプログラムの作成・保存・実行の流れである。
 
 
[練習] I love you.  と画面に表示するプログラムを書き、正しく表示するこ
   とを確認し、renshu.pas 名でディスクに保存せよ。
 
    (ヒント)上の例プログラムを編集対象にしておき、 Hello, world! の
         ところを I love you. に直す。 ディスクへの保存には
         Write to  もしくは  Save as ... (ファイル名を指定して
         書き出す) を使う。
 
 
 
 プログラムの中には注釈(コメント)を書くことができる。Turbo Pascal での
注釈は一連の文章(注釈文)を  {  と  }  で囲んだものである。この注釈は
コンパイルの際に読み飛ばされ、(コンパイル)結果には何の影響も与えない。注
釈付きで上のプログラムをもう一度書いてみよう。(今後のサンプルプログラム
はこの形式をとる。)
 
  program hello;            {プログラム名}
    begin              {プログラムの開始}
      WriteLn('Hello, world!');  {画面に Hello, world! と書く}
    end.               {プログラムの終了(.に注意)}
 
 
 Turbo Pascal では、'.....' の中以外では大文字と小文字は区別されないので
 
   WriteLn('Hello, world!');  あるいは  WRITELN('Hello, world!');
 
などと書いてもよい。また、プログラムの書き方にはかなりの自由度があるので、
PASCALの文法を守った上で各自の好みの表現を行ってよい。例えば、改行せずに
 
   program hello;  begin   WriteLn('Hello, world!')   end.
 
などと書いてもよい。
                                   
 
 
[2] 次のプログラムは画面に表示されている文字を全て消去(clear screen)する
  プログラムである。
 
  program shoukyo;    {プログラム名}
 
    uses Crt;      {使う部品名}
 
    begin        {プログラムの開始}
      ClrScr;     {部品 Crt の中にある画面消去の手続きを実行}
    end.        {プログラムの終了}
 
 
 画面を消去する手続き ClrScr は、その機能を実行するための"部品"を必要と
する。 uses Crt; はその"部品"をプログラム本体に取り込むための記述である
(Crt = Cathode ray tube = 陰極線管(ブラウン管)方式のディスプレイ)。
"部品"は Crt(テキスト画面関係) の他に  Graph(グラフィックス画面関係),
Dos(MS-DOS関係), Printer(プリンタ関係) などがあり、必要に応じて指定する。
                                   
 
 
 

. PASCALで扱うデータの型


 
 
 コンピュータのメモリに情報(数値・文字など)を記憶する方法は、情報の
種類に対応していろいろなデータ形式がある。これらは必要に応じて使い分け
られるが(→1.2 1バイトの世界 参照)、このテキストに現れるものを中心に、
以下に必要最小限をまとめる。
 
 
    形式     |         説明
   ----------------+---------------------------------------------
    byte       1バイトで 0 から 255 の整数を表す
    integer     2バイトで -32768〜32767の整数を表す
    longint     4バイトで -2147483648〜2147483647の整数値を表す
    word       2バイトで 0〜65535の整数を表す
    char       1バイト(半角1文字)からなる文字型データ
    boolean     'true' , 'false' のいずれかの値をとる論理型データ
                   -38   38
    real       6バイトで ±約10  〜10  の実数(有効11桁)を表す
                   -308   308
    double      8バイトで±約10   〜10  の実数(有効15桁)を表す
    string      複数文字からなる文字型データ(最大長255文字)
    text       定義済のファイル型(文字行からなるファイル)
                                   
 
 
 
【変数(variables)
 
  x:=2, x:=5 などのように色々な値を代入できるものを変数という。
 
 
 [変数の定義の仕方]
 
  var x : integer;    変数 x は-32768〜32767の値をとる整数値変数
    keydata : char;   変数 keydata は半角1文字の文字型データ
    mesg : string[80];  変数 mesg は最大80文字の文字列データ
 
  〔注意〕コロン(:)、セミコロン(;) を見分けること。
                                   
 
 
 
 
定数(constants)
 
 プログラムの最初である値が定められ、以後値が変らない(変えられない)
ものを定数という。
 
 
 [定数の定義の仕方I(型なし定数)]
 
  const c1 = 1;          {定数 c1 は 数値の 1 と同等}
     charA = 'A';        {定数 charA は文字 A と同等}
     mesg1 = 'End ?';      {定数 mesg1 は文字列 End ? と同等}
 
    〔註〕 'A' , 'End ?'  の両端にある  '  は、[SHIFT]+[7] を押す。
 
 
 [定数の定義の仕方II(型つき定数)](初期値を持った変数)
 
  const c1 : integer=1;     {c1 は 1 の値をとるinteger型定数}
     charA : char='A';    {charA は文字 A よりなる文字型定数}
     mesg1 : string[5]='End ?';   {定数 mesg1 は5文字の文字列}
 
 
注意:このテキストでは「型」の練習の立場から  II(型つき定数)  の形式を
   とることにする。
                                   
 
 
 
 

. TURBO PASCAL プログラムの構成


 
 
 このテキストで扱う Turbo Pascal プログラムの構成は、大体次の様になって
いる。
 
 
 program  プログラム名 ;
 
  uses  ユニット名1, ... ,ユニット名n;  (例) uses Crt, Graph;
 
  const  定数の定義;     (例) const  C100 : integer = 100;
                       mesg : string[5] = 'Start';
 
  var   変数の定義;     (例) var  i, j, k : integer;
                      x, y, z : real;
 
  procedure 手続き名1;    <---  プログラム内で使われる手続き1の記述
    const  ... ;       {手続き1の中だけで使用可能な定数の定義}
    var   ... ;       {手続き1の中だけで使用可能な変数の定義}
    begin         <---  手続1の記述開始
 
      手続1の本体
 
    end;          <---  手続1の記述終了( ; に注意)
 
 begin   <----- プログラム本体の開始(プログラムはここから実行される)
 
 
  プログラム本体(必要に応じて本体に先立って準備した 手続き関数 を使う)
 
 
 end.   <-----  プログラム本体の終了( . に注意)
 
 
        * 実際のプログラムでは、プログラム本体の begin end.
          の前に procedure(手続き), function(関数) が沢山入っ
          ている。
          ただし、プログラムはプログラム本体の begin 直後の行
          から順に実行が開始される。
                                   
 
 
 
[注意] const, var 中で使う定数・変数名、あるいは、手続き・関数名はプロ
    グラマが自由に決めてよいが Turbo Pascal 自身が使っている言葉
    予約語)は使えない。
 
  《予約語一覧》
 
  absolute  and  array  asm  begin  case  const constructor
  destructor  div  do  downto  else  end  external  file for
  forward  function  goto  if  implementation  in  inline
  interface  interrupt  label  mod  nil  not  object  of  or
  packed procedure  program  record  repeat  set  shl  shr  string
  then  to  type  unit  until  uses  var  while  with  xor など
                                   
 
 
 
 

.  TURBO PASCAL サンプルプログラム


 
 
 以下に示すプログラムは、Turbo Pascal でプログラミングを行うための必要
最小限の機能を、18の簡単なサンプルプログラムとしてまとめたものである。
これらを必要に応じて参照すれば、各自が行う日常的なプログラム程度は記述可
能であろう。
 
           * サンプルプログラム15〜18は、グラフィックス、プ
            リンタへの印刷、ディスク上データの読み書きであ
            る。当面必要のない人は省略してよい。
 
 
 
サンプルプログラム1】(数値定数、ディスプレイ表示)
 
 データ(数値・文字他)をコンピュータで扱うためには、データをプログラム中
に取り込む必要がある。定数による方法は最初からプログラム中に入れておく方
法である。あとで、プログラム実行中にキーボードからデータを取り込む方法を
学ぶ。
 また、コンピュータの持っているデータを外部に出力する手段として、ディス
プレイ表示は最も手軽かつ重要な方法である。
 
 
 program  sample1;
 const  n : integer = 123;      {n は 123 という整数値を表す定数}
     m : integer = 654;      {m は 654 という整数値を表す定数}
 begin    {プログラム本体の始まり}
  WriteLn('N=', n, '  M=', m, '  N+M=',n+m);
           {N=, M=, N+M= と書いて、数値 n, m, n+m を表示する}
 end.    {プログラム本体の終了(end の後のピリオドに注意する)}
 
 
  [練習1] n+m を n-m に変えて、ディスプレイに
 
        N=123   M=654   N-M=-531
 
       と正しく表示する。
 
  [練習2] n=20000, m=30000 として  n+m  を表示してみる (正しく表示
       されない理由を考えよ。→データの型 3.2 参照)。
                                   
 
 
 
サンプルプログラム2】(文字列定数)
 
 文字列はいろいろな長さをもつデータ(可変長データ)であるので、プログラミ
ングの際には常にデータ長を考慮する必要がある。(ちなみに Turbo Pascal が
扱える文字列の最大データ長は255である。)
 
 program  sample2;
 const  w : string[14] = '私は三重大学の';   {w は文字列定数で「三 }
          { 重大学の」を表す.漢字1文字は半角2文字に相当する}
     m : string[4] = '男子';
     f : string[4] = '女子';
     g : string[10] = '学生です。';
 begin    {プログラム本体の始まり}
   WriteLn('今から、文字列を表示します');      {文字列を直接表示}
   WriteLn;                     {一行空白行を作る}
   WriteLn(w,m,g);     {文字列定数 w, m, g の内容を順次画面に表示}
 end.    {プログラム本体の終了}
 
 
  [練習1]「男子」と表示しているところを、「女子」と表示する行をプロ
       グラムに追加する。
 
  [練習2] 文字列定数を使っていろいろな文字列を画面に打ち出してみる。
       (文字列定数の最大字数に注意すること。)
 
 
  〔解説〕 WriteLn は文字を表示したあと、位置を自動的に次行先頭に移動
       (改行)する。Write を使うと、改行せずに最後に表示した文字の
       次の位置にとどまったままになる。文字を表示せずに単に改行の
       みを行いたいときは WriteLn; とする。
                                   
 
 
 
【日本語入力時の注意】
 
 日本語入力のあと、そのまま元に戻さず全角(漢字文字サイズ)の  ’;  を
書いてもダメである(→日本語入力を解除して、半角の  ';  を打つのが正しい
)。特に、全角の空白文字をプログラム文の不正な位置に紛れ込ませてしまう
ラーは、最も分かりにくいものの一つである。なぜなら、不正な位置にある全角
空白文字はコンパイラにとっては意味不明の文字であるが、一方我々の目には正
しい位置に半角の空白文字が2つあるように見えてしまう。したがって、いつま
でたっても誤りの位置が発見されない。
 
           *プログラムの構文エラーがないのに、コンパイルエラー
 
               Error  5 : Syntax error.
               エラー 5 : 構文エラーです
 
            が出るときには、この可能性を疑ってみる。前後の行
            を含めた空白部分をすべて削除し、改めて、半角空白
            文字を挿入してみるとよい。
                                   
 
 
 
サンプルプログラム3】(文字列の結合)
 
 2つの文字列 '.....' と '*****' があるとき、それらをつなぎ合わせた文字
列 '.....*****' は、Turbo Pascal では '.....'+'*****' と表す。他の言語で
はこうは簡単にいかないことが多い。
 
 
 program  sample3;
 const  w : string[14] = '私は三重大学の';
     m : string[4] = '男子';
     f : string[4] = '女子';
     g : string[10] = '学生です。';
 begin
   WriteLn(w);                    {文字列 w を表示}
   WriteLn(w+m);             {文字列 w と m の結合を表示}
   WriteLn(w+m+g);          {文字列 w と m と g の結合を表示}
 end.
 
  [練習1] 表示テキスト中の「女子」を「男子」に入れ替えて表示する。
 
  [練習2]   const  saita  : string[8] = 'さいた  ';
            sakura : string[10] = 'さくらが  ';
 
       から、サンプルプログラム2と3の方法でそれぞれ
 
          「さいた  さいた  さくらが  さいた  」
 
       と画面に表示する。
 
 
  〔参考〕 文字列の長さをいちいち指定するのが面倒なときは、
 
          m : string = '男子';
 
       のように長さ  [4]  を省略できる。ただし、この場合文字列の
       長さとして  [4]  ではなく、最大長の  [255]  が自動的に確
       保されるのでメモリの無駄使いになる。
                                   
 
 
 
サンプルプログラム4】(変数への代入)
 
 数値変数 n の値に変数あるいは定数 a の値を加えて、その結果をまた n に
代入する操作を、PASCAL では(教育的に配慮して) n:=n+a と書く。他のコンパ
イラでは、数式としてみると少しおかしい表現である  n=n+a  としていること
が多い。
 文字列を結合して文字列変数に代入する操作も同様に := を使うが、代入され
る文字列変数には十分な長さを確保しておく必要がある(最大長は255文字まで)。
 
 
 program  sample4;
 var  n : integer;      {n は -32768..32767 の値をとる整数値変数}
 begin
  n:=1;                  {変数 n に 初期値 1 を代入}
  WriteLn('N=', n);        {N= と書いて、変数 n の値を表示する}
  n:=n+1;             {n に 1 を足した値を改めて n に代入}
  WriteLn('N=', n);                    {N=2 となる}
  n:=n+1;             {n に 1 を足した値を改めて n に代入}
  WriteLn('N=', n);                    {N=3 となる}
 end.
 
  [練習] N=9, 8, 7 と変化させてみる
 
  〔参考〕(文字列変数への代入の例〕
 
      program  sample4A;
       const  saita  : string[8] = 'さいた  ';
          sakura : string[10] = 'さくらが  ';
       var  msg : string;   {変数 msg には255文字分が確保される}
       begin
        msg:=saita;      {msg に文字列 「さいた」 をコピー}
        msg:=msg+saita;     {msg に文字列 「さいた」 を結合}
        msg:=msg+sakura;    {msg に文字列 「さくらが」 を結合}
        msg:=msg+saita;     {msg に文字列 「さいた」 を結合}
        WriteLn(msg);             {msg を画面に表示}
       end.
 
 
     変数 msg の内容
        ↓
       ‖??????????????????????????????????????????‖
        ↓ msg:=saita;
       ‖さいた  ??????????????????????????????????‖
            ↓ msg:=msg+saita;
       ‖さいた  さいた  ??????????????????????????‖
                ↓ msg:=msg+sakura;
       ‖さいた  さいた  さくらが  ????????????????‖
                     ↓ msg:=msg+saita;
       ‖さいた  さいた  さくらが  さいた  ????????‖
                                   
 
 
 
サンプルプログラム5】(整数値演算 +, -, *, /, div, mod)
 
 
 program  sample5;
 const  a : integer= 123;    b : integer = 100;
 begin
  WriteLn('a=',a,'  b=',b);
  WriteLn('加  a+b =',a+b);
  WriteLn('減  a-b =',a-b);
  WriteLn('乗  a*b =',a*b);
  WriteLn('除  a/b =',a/b);       {実数値の割り算(結果は実数)}
  WriteLn('商  a div b =',a div b);   {整数値の割り算(結果は整数)}
  WriteLn('余  a mod b =',a mod b);       {整数値の割り算の余り}
 end.
 
     註: a/b = 1.230000E+000  の見方については、次のサンプルプログ
       ラムを参照
 
 
  [練習] a=123, b=1000 の時は ? (a*b が正しく計算されない理由を考
       えよ。integer longint に変えたらどうか → データの型
       3.2 参照。)
                                   
 
 
 
サンプルプログラム6】(実数の編集表示)
 
 実数定数  a : real = 123.456;  を単に  WriteLn(a);  で表示すると
 
       1.23456E+002
 
                        2
というような形式で表示される。 E+002 は 「... x10 」 を意味するので、
                    2
       1.23456E+002 = 1.23456x10  = 123.456
 
となる。 一般に実数 x=x x x 〜x  . x  x  〜 を
        1 2 3  p   p+1 p+2
 
                     p-1
      x  . x x 〜x x  x  〜 x 10
       1   2 3  p p+1 p+2
 
のように小数点位置を移動して表す方法を浮動小数点形式表示という。コンピュ
ータの内部では実数はこの形式の2進数で処理されているので、我々の通常の表
示形式(固定小数点形式表示)にするためには編集という作業が必要になる。
 
 
 program  sample6;
 const  a : real = -123.456;  b : real = 789.0123;
 begin
  WriteLn('a=',a,'  b=',b);
  WriteLn('加  a+b =',a+b);           {a+b を無編集で表示}
  WriteLn('加  a+b =',a+b:10:3);        {a+b を 編集して表示}
                {表示全文字数=10,うち,小数点以下桁数=3}
  WriteLn('減  a-b =',a-b);
  WriteLn('減  a-b =',a-b:10:3);
  WriteLn('乗  a*b =',a*b);
  WriteLn('乗  a*b =',a*b:10:3);
  WriteLn('除  a/b =',a/b);             {実数値の割り算}
  WriteLn('除  a/b =',a/b:10:3);           {実数値の割り算}
 end.
 
  〔註〕 一般に、
 
        WriteLn(表示する数値:全体の桁数:小数点以下の桁数);
 
      であるが、全体の桁数は、数値の符号のための1文字分を含んでい
      る。また、表示する数値のデータ形式が整数の場合は、「:小数点
      以下の桁数」の部分を省略する。
 
  [練習] 計算を倍精度(double, →データの型3.2参照)で行い、表示字数
       を全体で 12 、少数点以下を 6 桁にする。
 
 
  〔参考〕 最近のパソコンは、ほとんど数値演算プロセッサ(浮動小数点演
       算を高速に行う装置)を内蔵しているので、real  よりも  double
       を指定したほうが計算が速くなる。
                                   
 
 
 
サンプルプログラム7】(繰り返し(1): repeat until
 
 ある作業を何回も繰り返すということは機械(コンピュータ)の得意とするとこ
ろである。回数を設定して繰り返しを行うためには、繰り返し回数を数えるカウ
ンタ(下の例では変数 n)に関して以下の3つの作業が伴う:
 
  i) カウンタの初期値の設定 (下の例では n:=1),
  ii) カウンタのアップ(or ダウン) (下の例では n:=n+1),
 iii) 終了条件の判定 (下の例では until n>500).
 
 
 program  sample7;
 var  n : integer;                  {ループ用カウンタ}
 begin
  n:=1;                     {n に 初期値 1 を代入}
  repeat               {repeat until の間を繰り返す}
   WriteLn('N=', n);                  {n の値を表示}
   n:=n+1;                     {n の値を1アップ}
  until n>500;       {ここに来たとき n>500 なら繰り返しを止める}
 end.
 
 〔repeat until 間には複数の実行文があるが、 この場合(例外的に)
    begin   end; でくくる必要はない。
 
 
     (start)
       |
     |n:=1|         カウンタの初期値の設定
  +------>|
  | /nの値を表示/
  |    |
  |  |n:=n+1|         カウンタのアップ
  |    |
  +-----<n>500>          終了条件の判定
  no    ↓yes
     (end)
 
 
  [練習] 500, 499, 498, ... , 2, 1 と表示するように直す。(繰り返し
       の終了条件の設定に注意せよ)
 
   [注意!!] 練習のプログラムで、繰り返しの終了条件の設定に失敗する
         といつまでたっても実行が終了しない(暴走!)。
         このときは、
 
           【PC98】 では [STOP] で止める
           【DOS/V,FMR】 では [CTRL]+[PAUSE] で止める
 
         (→ 2.4 Turbo Pascal/C の (Y/N) メッセージ 参照)。
                                   
 
 
 
サンプルプログラム8】(繰り返し(2): while do
 
 前サンプルの  repeat until 終了条件  による繰り返しでは、「繰り返す
内容」を実行してから終了条件をチェックしていたが、ここで学ぶ while 継続
条件 do による繰り返しでは、「繰り返す内容」を実行する前に継続条件をチェ
ックする。
 
 
 program  sample8;
 var  n : integer;                  {ループ用カウンタ}
 begin
  n:=1;                     {n に 初期値 1 を代入}
  while n<=500 do    {n≦500 の間,do直後の begin end を繰り返す}
   begin                     {while ループの開始}
    WriteLn('N=', n);                 {n の値を表示}
    n:=n+1;                    {n の値を1アップ}
   end;                     {while ループの終了}
 end.
 
  〔begin end; では、〜 の部分に複数の実行文を ; で区切って
      記述することにより、
 
          begin ...; ...; ...; end;   (;(セミコロン)に注意)
 
      を全体で1つの文のように扱っている(複合文)。
                                   
 
 
 
  ・・・・・ 以下省略・・・・・
 
続きは JAVA 画面 で見て下さい。
 
   JAVA画面に飛ぶ