MinNumChar := IntDigit + B + 1 ; if (e < 0.0) and (eWritten > 0) then
MinNumChar := MinNumChar + 1 ;
Example 5.15.3 例えば,10.255という値をwriteln(x:3:1)で表示すると,10.3となる. ここのx:3:1 の最初の3は, 全部の桁数を表し, 後ろの1は小数点以下の桁数を表している. ExpDigit = 2 とすれば, eWritten = 10.3,IntDigit = 2,MinNumChr = 4となる. おおよそ,上から3+1=4桁めを四捨五入して いる. 実際には,writeln(10.25:3:1)は 10.2を出力し,writeln(10.250000000000001:3:1) は10.3 を出力する.
Remark 5.15.1 SPARCompilerでは,writeln手続きの桁指定子に関してはもっと多くの自由度がある.
詳しくはSPARCompilerのマニュアルを参照.
5.15.3 演習問題
Exercise 5.15.1 標準入力から入力されたファイルの行数を印字するプログラムを書け.
Exercise 5.15.2 標準入力から入力されたファイルの行数,単語の数,文字数を印字するプログラムを書け.
Exercise 5.15.3 標準入力から入力された1文字が英字でなければ,そのまま印字し, 大文字の英字なら 小文字に,小文字の英字なら大文字を印字するプログラムを書け. ただし,改行だけが入力された場合には, 終了するようにしなさい. また,入力された文字はASCIIコードで表現されていることに注意せよ.
5.16.1.2 自己参照
レコード型は,それ自身を参照することができる. これを利用して,リストやツリーといったデータ構造 を実現することができる.
例えば,リストを実現するには, 次のような方法を利用する.
Example 5.16.1 整数と, 次のデータへのポインタを持った構造体は以下のように定義できる.
type
link = ^data ; data = record
str : integer ; next : link ; end ;
このように定義したレコード型を利用して,リストを実現することができる.
Example 5.16.2 Example 5.16.1で定義した構造体を初期化する. 即ち,一番始めのデータには何も入れ ない. はじめに,このようにして定義した自己参照レコード型の変数を確保するために,手続きnewを行な う. 次に必要なことは,一番最後のデータ(最初は一番はじめのデータと同じ)にデータを入力したら,も う一つデータを持ってきて,それを初期化することである.
Id: P8.tex,v 1.2 2000/04/21 02:17:03 naito Exp
program list (output) ; type
link = ^data ; data = record
str : integer ; next : link ; end ;
var
first, p, q : link ;
i : integer ;
begin
new(first) ;
first^.next := nil ; for i:= 1 to 10 do begin
new(p) ;
p^.next := first ; p^.str := i ; first := p ; end ;
q := p ;
while(q^.next <> nil) do begin
writeln(q^.str) ; q := q^.next ; end;
end.
このようにして作ったリスト形式のデータを一番最初のデータから順にアクセスするためには,最初のデー タを指し示すポインタを作成して, nextが次のデータを指ししていることを利用して,ループを使ってア クセスすれば良い.
Example 5.16.3 ここでは,リストの途中にデータを挿入するための手順を示している.
Id: P8.tex,v 1.2 2000/04/21 02:17:03 naito Exp
program list (output) ; type
link = ^data ; data = record
str : integer ; next : link ; end ;
var
first, p, q, r : link ;
i : integer ;
begin
new(first) ;
first^.next := nil ; for i:= 1 to 10 do begin
new(p) ;
p^.next := first ; p^.str := i ; first := p ; end ;
q := p ;
while(q^.next <> nil) do begin
writeln(q^.str) ; q := q^.next ; end;
writeln ; new(r) ; r^.str := 11 ; q := p ; q := p^.next ;
r^.next := q^.next^.next ; q^.next := r ;
q := p ;
while(q^.next <> nil) do begin
writeln(q^.str) ; q := q^.next ; end;
end.
この例では,前から2番めに新しいデータを挿入している.
p
p
p^.next
r^.next
r
ここで確保したメモリ領域は,必要がなくなったら, dispose手続きで領域を開放する.
Example 5.16.4 各データが2つのポインタを持ったツリーを実現するには,次のようなデータ形式を利
用すれば良い.
Id: P8.tex,v 1.2 2000/04/21 02:17:03 naito Exp
type
link = ^data ; data = record
str : integer ; lnext : link ; rnext : link ; end;
5.16.2 演習問題
Exercise 5.16.1 標準入力から,空白で区切られた学籍番号, ID,氏名の組を読み込み,それらをレコード 型の配列として格納し,標準出力に以下のフォーマット(format)(書式)で出力するプログラムを書け.
学籍番号: xxxxx ID : xxxxx 氏名 : xxxxx
この際,入力するデータの数は100以下と仮定して良い.
Exercise 5.16.2 Exercise 5.16.1の問題をリスト形式で書け. この時は, 入力するデータの数はアプリオ リにはわからない.