Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
岡本安晴 2000.11.09;2001.2.15
2 - 1
Object Pascal 入門 その 2
文
2-1 文と式
2-2 文の種類
附 フロー制御ルーチン
岡本安晴 2000.11.09;2001.2.15
2 - 2
2 文
プログラムの実行は1つ1つの文の実行という形で行われる。文には、単純文と構造化
文がある。単純文には、手続きを呼び出すもの、変数への代入を行うもの、goto 文などが
ある。まず、文と式について簡単に説明する。
2-1 文と式
プログラムにおいて実行される一つ一つの処理は文で表す。文は、if 文や while 文のよ
うな条件文やループ文を除いて、書かれている順番で実行される。
a:=1; b:=2;
sum:=a+b;
とあれば、aに1が代入され、次に bに2が代入されて、最後に aと bの和が sumに代入さ
れる。
変数 := 式;
は式の値を変数に代入する文である。代入は:と=を組み合わせた:=で表す。
式で加減乗除などの演算が求めらるが、「a:=1」における1のように定数だけ、あるいは
「c:=b」における bのように変数だけのものも式として扱われる。
実数型の式・演算・表記
実数型のデータ(定数や変数、式の値)の加減乗除は+,-,*,/で表す。
演算
結果
実数 1 + 実数 2
実数 1 - 実数 2
実数 1 * 実数 2
実数 1 / 実数 2
実数 1と実数 2の和
実数 1と実数 2の差
実数 1と実数 2の積
実数 1と実数 2の商
岡本安晴 2000.11.09;2001.2.15
2 - 3
演算の順序は乗除が加減より優先する。乗除、あるいは加減同士は左側の演算が優先す
る。演算の順序は括弧( )で囲んで明示することができる。したがって、
a*b+c/d
は
(a*b)+(c/d)
と同じであり、
a+b-c
は
(a+b)-c
と同じである。
実数型のデータはコンピュータ内では浮動小数点表記という形で表されている。これは
有効数字を小数点以下の2進数で表し(仮数)、それに2進数表記の指数を掛けて実際の数
を表している。これらの値を読むためには、10進表記に基づく表記による文字列として
表す必要がある。例えば、有効数字の部分が2進数表記で
21.1
であり、指数部分が2のー1乗を表す
1−
であるとき、これはコンピュータでは 21.1 と 1− の組で表される。ここで、 1.1 に下付きで
付いている2は2進数表記であることを表す。この 21.1 と 1− の組で表される数を10進数
表記で表すと
75.02)5.01(21.1 112 =×+=× −−
岡本安晴 2000.11.09;2001.2.15
2 - 4
となる。すなわち、数字0とピリオド.を挟んで7および5が続く文字列’0.75’で表される。
実数型のデータを10進数表記の文字列に変換するための関数として FloatToStrF、手続
きとして Strがある。
関数 FloatToStrF
FloatToStrF は、例えば実数型の変数 aの値を表す10進表記文字列を求めるときは
FloatToStrF( a, ffGeneral, 9, 4 )
のように用いる。
ShowMessage(FloatToStrF( a, ffGeneral, 9, 4 ));
とすると、a の値が指定した形式で表され、手続き ShowMessage によって表示される。
FloatToStrF の( )内の1番目のパラメータに10進表記を求める実数型データをおく。上
の場合は実数型変数 a が置かれている。2番目のパラメータ ffGeneral は変換方式を指定
するものである。ffGeneral のときは、3番目のパラメータの精度で、小数点以下の桁数が
4番目のパラメータで指定される形で数値が表記される。3番目のパラメータの指定より
4番目のパラメータの指定による小数点以下の桁数が多いときは3番目の指定に従う。指
定した有効桁数より小さい桁数で正確に表せるとき、例えば、1.2345 を有効桁数9桁、小
数点以下の桁数7で指定したときは文字列’1.2345’と指定した桁数より少ない文字数で表
される。
一般には、関数 FloatToStrFの( )内の第 1パラメータには変数あるいは実数型の値をと
る式をおく。定数あるいは変数だけのものも式ということに注意。従って、ffGeneralとい
う形式で変換するときは
FloatToStrF( 式, ffGeneral, 精度, 小数点以下の桁数 )
という形で FloatToStrF を呼び出すことになる。
指定した精度の桁数で普通の 10 進表記ができないときは指数形式で表記される。例えば、
12345.67 に対して有効桁数3桁での表記を指定したときは、次の指数表現
41023.167.12345 ×≈
によって有効数字3桁の表記 41023.1 × での近似となり、これを
岡本安晴 2000.11.09;2001.2.15
2 - 5
1.23E4
というように表す。指数形式は一般に
BA 10×
という数を
AEB
という形式で表すものである。
プログラム中において、実数型の値は小数点を伴う 123.45のように表す他、指数形式で
1.2345E2 のように表すこともできる。Eは小文字 eでもよい。したがって、
a:=1.23e3; b:=4.5e2;
c:=(a+b)*(9.5e2);
のように書くことができる。
手続き Str
手続き Str は、次の3通りの使い方がある。ここで、式は実数型の値をとるもの、s は
string 型の変数とする。
(1)Str( 式, s )の形
(2)Str( 式:整数, s )の形
(3)Str( 式:整数 1:整数 2, s )の形
ここで、整数、整数 1、整数 2は整数型の値をとる式でよい。
(1)の形式のときは、有効数字15桁の指数形式で式の値を表した文字列がsに設定
される。
(2)の形式のときは、整数の表す値を有効数字の桁数とする指数形式で式の値を表し
た文字列がsに設定される。
(3)の形式のときは、整数 1 の表す値の文字数で、小数点以下の桁数が整数 2 の値に
なるように式の値が表される。整数 1 で指定した文字数より少ない文字数で式の値が表さ
れるときは、左側に空白文字が必要な数だけ挿入されて、整数1で指定した文字数になる
ように調整される。
岡本安晴 2000.11.09;2001.2.15
2 - 6
数値を表す文字列の変換
実数値を表す文字列をその表す数値に変換するときは、関数 StrToFloatあるいは手続き
Valを用いることができる。
関数 StrToFloatを
StrToFloat(文字列)
の形で呼び出すと、文字列の表す数値が StrToFloatの関数値として返される。
StrToFloat(‘123.45’)
は、数値 123.45 が関数値となる。
変数 aが extended 型であるとき
a:=StrToFloat(‘2.0’)/StrToFloat(‘4.0’);
によって、aには 0.5が格納される。
手続き Valは次のように用いる。
Val( 文字列, 変数, 整数型変数 );
文字列の表す数値が変数に格納される。このとき文字列が正しく数値に変換できたときは
整数型変数には0が格納されるが、数値に変換できない文字列のときはエラーの生じた文
字位置を示す値が整数型変数に返される。
練習問題 2-1
価格に対して消費税(5%)と税込み金額を求めるプログラムを作成せよ。
練習問題 2-2
消費税込みの金額から消費税抜きの価格を求めるプログラムを作成せよ。
整数型の演算
整数型のデータ(定数や変数、式の値)の加減乗除演算には次のものがある。
岡本安晴 2000.11.09;2001.2.15
2 - 7
演算
結果
整数 1 + 整数 2
整数 1 ? 整数 2
整数 1 * 整数 2
整数 1 div 整数 2
整数 1 mod 整数 2
整数 1と整数 2の和
整数 1と整数 2の差
整数 1と整数 2の積
整数 1を整数 2で割ったときの商
整数 1を整数 2で割ったときの余り
演算の優先順位は乗除(*, div, mod)が加減(+, -)に優先する。乗除、あるいは加減同
士では左側の演算が優先する。
整数型の値の割り算を/で行うと、整数型の値は同じ値の実数型に変換されて実数型の割
り算が行われる。したがって、
5/2
は
5.0/2.0
と実数型の割り算に変換されて
2.5
となる。
5 div 2
は、整数型の演算が行われて、演算結果は
2
となる。
岡本安晴 2000.11.09;2001.2.15
2 - 8
整数型と実数型との演算は、整数型の値が同じ値の実数型に変換されて実数型同士の演
算となる。したがって、
1+2.0
は、2.0 が小数点を含む実数型の表記なので整数 1も実数型に変換されて
1.0+2.0
として計算され、演算結果も実数型として
3.0
となる。
整数型の値は、実数型の変数に代入できる。
Var a : extended;
のとき、
a:=1;
により、変数 aには 1.0が格納される。
実数型の値を整数型の変数に代入するときは、適当な関数で整数型に変換してから代入
する。実数型の値を整数型に変換する関数には、四捨五入を行う Round、切捨てを行う Trunc
などがある。
Round(1.7) と Trunc(1.7)
はそれぞれ
2 と 1
を値とする。
整数型の値を表す 10 進数表記の文字列は関数 IntToStr、あるいは手続き Str によって
得ることができる。
変数 sを文字列型とするとき
岡本安晴 2000.11.09;2001.2.15
2 - 9
s:=IntToStr(123);
により、整数値 123を表す文字列
‘123’
が sに格納される。
手続き Strは整数型の式に対して次の2通りの使い方がある。
(1)Str(式, s)
(2)Str(式:整数 1, s)
(1)の場合は、式の値を 10 進数表記で表す文字列が文字列型の変数 s に格納される。
(2)の場合も式の値を 10 進数表記で表す文字列が文字列型の変数 s に格納されるが、
文字列の文字数が整数 1 の値より少ないときは整数 1 の値の文字数になるように左に空白
文字が挿入される。
整数値を表す文字列をその表す整数値に変換するものとして手続き Val、あるいは関数
IntToStr がある。手続き Valの使い方は実数型のときと同じで、
Val( 文字列, 整数型変数 1, 整数型変数 2 );
により、文字列の表す整数値が整数型変数 1 に格納される。文字列が正しく整数値に変換
されたときは整数型変数 2 には0が返されるが、変換が失敗したときはエラーの生じた位
置を示す数値が整数型変数 2 に設定される。
関数 StrToIntは、
StrToInt( 整数値を表す文字列 )
の形で呼び出されると、文字列の表す整数値が関数値として返される。
i:=StrToInt(‘123’);
により、整数型の変数 iに整数値 123が設定される。
岡本安晴 2000.11.09;2001.2.15
2 - 10
練習問題 2-3
2 つの整数を与えて、その商と余りを求めるプログラムを作成せよ。
岡本安晴 2000.11.09;2001.2.15
2 - 11
2-2 文の種類
手続きの呼び出しとか代入を表す文は単純文という。
ShowMessage(‘Hello’);
とか
a:=b+c;
は単純文である。
文には、単純文以外に構造化文がある。構造化文には複合文、条件文、ループ文、with
文がある。ここでは、with 文以外について説明する。With 文はレコード型およびクラス
型ともに用いられるもので、5-2.3 節「レコード型」、第7章「オブジェクトとクラス型」
において説明する。
2-2.1 複合文
複合文は、いくつかの文をセミコロン;で区切って並べたものを begin と end で挟んだも
のである。
begin a:=1; b:=2; c:=a div b; end
は複合文である。複合文は begin~end全体で1つの文として扱われる。
begin ; end
も複合文である。セミコロン;の前には何もない文があると考え、この何もない文は空文
という。
複合文は何も文を含まないもの
begin end
もある。この場合も空文が含まれると考える。beginと endに囲まれた文の並び(文リスト
という)の最後の文はセミコロン;を付けなくてもよい。
岡本安晴 2000.11.09;2001.2.15
2 - 12
複合文
begin ?文? ?;? % ...; 文?;? % end
上の複合文の定義において、%と%で囲まれた部分は任意個(0個以上)の繰り返しを表
し、?と?で挟まれた部分は省略できることを表す。
複合文は、他の構造化文において用いられる。
2-2.2 ループ文
ループ文には、repeat 文、while 文、for 文がある。
2-2.2.1 repeat 文
次のプログラムは1から10までの整数値の和を求めるものである。ただし、sum と i は
Longint 型の変数として宣言されているものとする。
sum:=0; i:=1;
repeat
sum:=sum+i; i:=i+1;
until i > 10;
repeat 文では、repeat と untilで挟まれた文が、until の後ろの条件が満たされるまで
繰り返さる。したがって、上の例では、まず i が1のときの値と0が設定されている sum
との和があらためて sum に代入されることにより sum には1が格納される。その後 i と 1
との和が i に代入されることにより i の値は1増えて2になる。この値は until の後の i
が10より大きいという条件を満たさないので、repeat 文を終了せずに repeat と until
に挟まれた部分の先頭の文に戻る。sumと 2が格納されている iとの和が sum に代入され、
sumには 2が加えられることになる。iの値を1つ増やして 3にする。まだ、until の条件
を満たさないので repeat と untilに挟まれた部分の先頭の文に移る。この iの値を1つ増
やしながら sumに加えるということを繰りかえし、iの値が 10を超えたところで until の
後ろの条件が満たされて repeat~until~;の実行を終了する。この終了したときの sum
には1から10までの和が格納されている。
repeat 文の一般形は次のようである。
岡本安晴 2000.11.09;2001.2.15
2 - 13
repeat 文
repeat 文; %...文; % until 論理型の式
repeat 文の実行は次のようになる。
(1)repeat と untilの間の文を順番に実行する。
(2)論理型の式を評価する。
(2a)式が成り立つ(True)ときは repeat 文を終了する。
(2b)式が成り立たない(False)ときは(1)に戻る。
ここで、論理型の式とは
i > 10
のように条件を表す式のことであり、この式は論理型の値をとる。論理型については 5-1.5
節「論理型」で説明するが、条件を表す論理型の式は、条件が成り立てば値 Trueを、成り
立たないときは値 False をとる。
大小関係の条件を表すのに用いる関係演算子には以下のものがある。
関係演算子
結果
式1 = 式2
式1 <> 式2
式1 < 式2 式1 > 式2
式1の値と式2の値が等しいときは True、 式1の値と式2の値が等しくないときは False
式1の値と式2の値が等しくないときは True 式1の値と式2の値が等しいときは False
式1の値が式2の値より小さいときは True 式1の値が式2の値より小さくないときは False
式1の値が式2の値より大きいときは True 式1の値が式2の値より大きくないときは False
岡本安晴 2000.11.09;2001.2.15
2 - 14
関係演算子
結果
式1 <= 式2
式1 >= 式2
(式1の値) ≦ (式2の値) のときは True (式1の値) ≦ (式2の値)でないときは False
(式1の値) ≧ (式2の値) のときは True (式1の値) ≧ (式2の値)でないときは False
「等しくない」ことは「<」と「>」の組み合わせ「<>」で、等号を含む大小関係「≦」
および「≧」は「<」「>」と「=」の組み合わせ「<=」および「>=」で表されていることに
注意。これらの記号の組み合わせにおいては、例えば「<>」を「< >」というように空白
を入れたり、あるいは改行で分けたりしてはならない。
関係演算子を含む論理型の値をとる式は論理演算子、not、and、or、などと組み合わせ
ることができる。
3 < 5 および 7 > 5
はそれぞれ Trueおよび False を値とするが、
not (3 < 5) および not(7>5)
の値はそれぞれ False および Trueである。
条件式1 and 条件式2
は条件式1と条件式2の両方が Trueであるときに True、それ以外のときは Falseである。
条件式1 or 条件式2
は条件式1あるいは条件式2の少なくともいずれかが True であれば True、両方が同時に
False であれば Falseである。
練習問題 2-4
1から5までの積 5!を repeat 文を用いて求めよ。
岡本安晴 2000.11.09;2001.2.15
2 - 15
2-2.2.2 while 文
1から10までの整数の和を求めるプログラムを while 文を用いて書くと次のように
なる。
sum:=0; i:=1;
while i <= 10 do
begin
sum:=sum+i; i:=i+1;
end;
while 文では while と do で挟まれた条件が成り立つ間、do に続く文が実行される。do
には文が続くので、複数の文を実行するときは beginと endで挟んで複合文とする。
上の例では、和を格納する整数型の変数 sum の値を0に、加える数を設定していく整数
型の変数 iに最初の数1を設定した後、while 文の条件「i <= 10」が調べられる。条件が
成り立っているので、do に続く複合文の実行に移る。1 が設定されている i が sum に加え
られ、iの値が1増やされる。複合文の実行後、whileの後の条件が調べられる。i の値が
このときは2なので条件が成り立ち、複合文が実行される。複合文の実行後、whileの後の
条件が調べられる。というように条件の判定と複合文の実行が条件が成り立たなくなるま
で繰り返される。上の場合、条件が成り立たなくなるのは i が11になったときである。
このとき、while 文の実行が終了し、sumには1から10までの和が格納されている。
while 文の一般形は次のようである。
while 文
while 論理型の式 do 文;
while 文の実行は次のようになる。
(1)条件を表す論理型の式の評価。
(2)(a)式の値が True(条件が成り立つ)であれば、do に続く文を実行する。
文の実行後、(1)に戻る。
(b)式の値が False(条件が成り立たない)であれば、whileの実行を終了
する。
岡本安晴 2000.11.09;2001.2.15
2 - 16
式の値が Trueのときに複数の文を実行するときは複合文を用いる。
練習問題 2-5
1から5までの整数値の積 5!を while 文を用いて求めよ。
2-2.2.3 for 文
1から10までの和を求めるプログラムを for 文で書くと次のようになる。
sum:=0;
for i:=1 to 10 do sum:=sum+i;
上の for 文では、forの後に置かれている変数 iが1から10までの値を順番にとり、各 i
の値に対して doに続く文が実行される。したがって、for 文が終了したときには sum には
1から10までの和が設定されている。
上の for 文において iの値を10から1まで順番に減じるときは次のようになる。
sum:=0;
for i:=10 downto 1 do sum:=sum+i;
for 文の一般形は次のようである。
for 文
for カウンタ := 式1 |to|downto| 式2 do 文
上の for 文の説明における|で挟まれた箇所は、|で区切られた並びの中からいずれかが用
いられることを示す。
カウンタは順序型の変数である。順序型は、Longintのような整数型の他に列挙型などが
あるが、整数値との対応があるものである。順序型については 5-1 節「単純型」において
説明する。
式1および式2はカウンタに代入可能な値をとるものである。実数型は代入できないの
で使えない。カウンタの値が式1の値から式2の値まで1つずつ増えるときは toを、式1
岡本安晴 2000.11.09;2001.2.15
2 - 17
の値から式2の値まで1つずつ減るときは downto を用いる。カウンタの各値に対して do
の後の文が実行される。複数の文を実行するときは複合文を用いる。
練習問題 2-6
1から5までの整数の積 5!を for 文を用いて求めよ。
2-2.3 条件文と goto 文
条件文には、if 文と case 文がある。if 文は条件が成り立つかどうかに応じて実行の選
択が行われる。case 文は、式の値に応じて実行の選択が行われる。
2-2.3.1 case 文
次の case 文
a:=StrToInt(InputBox(‘奇偶の判定 ’,’a = ’, ‘?’));
case (a mod 2) of
0 : ShowMessage(IntToStr(a)+’は偶数です’);
1 : ShowMessage(IntToStr(a)+’は奇数です’);
end;
の場合、整数型の変数 aに設定された値の奇偶に応じた ShowMessageの実行が行われる。a
の値が奇数のときは(a mod 2)の値は1となるので「~は奇数です」を表示する ShowMessage
が実行される。a の値が偶数のときは(a mod 2)の値は0となるので「~は偶数です」を表
示する ShowMessage が実行される。
case 文の一般形は次のようである。
Case 文
case セレクタ式 of
ケースリスト: 文; %...; ケースリスト: 文;% ? else 文; ? end
セレクタ式は整数型など順序型の値をとる式をおく。上の例においては(a mod 2)がセレク
岡本安晴 2000.11.09;2001.2.15
2 - 18
タ式である。式の値に応じた「ケースリスト: 文;」の組み合わせが選ばれ、その組み合わ
せにおける文が実行される。式の値がケースリストに含まれる「ケースリスト: 文;」が選
ばれる。ケースリストには、1つの値、あるいは2つ以上の場合はそれぞれの値をコンマ,
で区切って「1,2,9」のように並べたものを置く。連続した値は最初の値と最後の値を..で
つないで表すことができる。
1,3,4,5,6,7,9,11,12,13,14,15
は
1,3..7,9,11..15
と同じである。
異なるなるケースリストの間では同じ値が重複してはならない。ケースリストに並べる
値は式で与えることもできるが、この式はコンパイル時に決まるものでなければならない。
上の case 文の定義において、%で挟まれた部分は、「ケースリスト: 文;」の形が必要な
だけ繰り返されることを表す。?で挟まれた部分は、必要ならば書かれるが必要がないな
らば省略できることを表す。
式の値が含まれるケースリストが無いときは、「else 文;」における文が実行される。
練習問題 2-7
奇偶の判定を行うプログラムを作成して実行せよ。
2-2.3.2 if 文
次の if 文を用いたプログラム
a:=StrToInt(InputBox(‘奇偶の判定 ’,’a = ’, ‘?’));
if (a mod 2) = 0 then ShowMessage(IntToStr(a)+’は偶数です’);
if (a mod 2) <> 0 then ShowMessage(IntToStr(a)+’は奇数です’);
では整数型の変数 aに設定された値の奇偶に応じた ShowMessageの実行が行われる。
if 文は、
if 条件式 then 文;
岡本安晴 2000.11.09;2001.2.15
2 - 19
の形で用いられたとき、条件式の値が True(条件が成り立つ)ならば thenの後の文が実行
される。条件式の値が False のときは then の後の文は実行されずに if 文を終了する。
上の2つの if 文は簡単に
if (a mod 2) = 0 then ShowMessage(IntToStr(a)+’は偶数です’)
else ShowMessage(IntToStr(a)+’は奇数です’);
と1つの if 文にまとめることができる。
すなわち、if 文は
if 条件式 then 文1 else 文2;
の形で用いられたとき、条件式の値が Trueのときは文1が実行され、条件式の値が False
のときは文2が実行される。
if 文と goto 文を組み合わせるとループ文と同じことができる。1から10までの和を求
めるプログラムは次のように書ける。
sum:=0; i:=1;
wa : sum:=sum+i;
i:=i+1;
if i <= 10 then goto wa;
上のプログラムでは、iの値が10以下であれば goto 文が実行されてラベル「wa」の付い
た文「sum:=sum+i」に実行が移る。
goto 文は次の形で用いる。
goto 文
goto ラベル
goto 文の実行により、ラベルの付いた文に実行が移る。ラベルは
ラベル : 文;
岡本安晴 2000.11.09;2001.2.15
2 - 20
の形式でコロン:を挟んで文に付ける。
ラベルはラベル宣言部で宣言されていなくてはならない。ラベル宣言部は次のような形
のものである。
ラベル宣言部
Label ラベル % , ...,ラベル % ;
ラベルとして用いることができるものは、識別子および 0~9999 の範囲の整数である。%
で挟まれた部分はラベルが任意個(0個以上)コンマ,で区切って並べられることを表す。
ラベル宣言部は宣言部におく。
次の例は、サンプルプログラム PSample21.dprからのものである。
procedure TForm1.Button1Click(Sender: TObject);
Label wa;
var i, sum : Longint;
begin
sum:=0; i:=1;
wa : sum:=sum+i;
i:=i+1;
if i <= 10 then goto wa;
ShowMessage('Sum = '+IntToStr(sum));
Close;
end;
練習問題 2-8
1から5までの整数値の積 5!を if 文を用いて求めよ。
岡本安晴 2000.11.09;2001.2.15
2 - 21
附 フロー制御ルーチン
ループ文における処理の流れを強制的に変えるときなどは、以下の手続きを用いることが
できる。
Abort 手続き
エラーを報告せずに処理を終了する。
Break 手続き
for,while,または repeat 文の制御フローを終了する。
Continue 手続き
for,while,repeat 文の次の繰り返しに制御フローを進める。
Exit 手続き
現在の手続きから抜ける。
Halt 手続き
プログラムを異常終了する。
RunError 手続き
実行を中止して実行時エラーを生成する。パラメータなしで呼び出すと実行時エラー番号は0、パラメータ付きは RunError( ErrorCode: Byte ) の形式で呼び出す。
岡本安晴 2000.11.09;2001.2.15
2 - 22
参考文献
(1) Delphi 5オンラインヘルプ、Inprise Corporation, 1999.
(2) Delphi 5 Object Pascal 言語ガイド、インプライズ株式会社、1999.
(3) 岡本安晴「Delphi プログラミング入門」、CQ 出版社、1997.