prime[i]は、iが素数であればtrueの値をもつ。
program sieve(input,output); const n = 1000; var i, j : integer; prime : array [2..n] of boolean; begin for i := 2 to n do prime[i] := true; for i := 2 to trunc(sqrt(n)) do if prime[i] = true then begin j := i + i; while j <= n do begin prime[j] := false; j := j + i end end; for i := 2 to n do if prime[i] = true then write(i); writeln end.
配列を用いれば 行列をプログラムの中で扱うことができます。
行列とは、n次元ベクトルが、m個ならんだものでした。n次元ベ
クトルのデータを表現する型は
type line = array [1..n] of real;でした。そしてこれがm個ならんだデータの型は、
type line = array [1..n] of real; matrix = array [1..m] of line;となるわけです。特に、行だけ格納する変数を使用するようなことがなければ、
type matrix = array [1..m] of array [1..n] of real;と書いてもかまいません。さらに、Pascalでは次のように省略できることになっ てます。
type matrix = array [1..m, 1..n] of real;
次のような変数宣言があったとします。
var a : matrix;変数aには行列を表現するデータが格納されるわけです。 添字付変数
a[2]には、その配列の2行目の「行」が格納されています。さらに、 添字付き変数
a[2][3]には、その配列の2行目3列目の要素が格納されています。 したがって、2行目3列目のところを0にしたいときには、
a[2][3] := 0でよいわけです。また、添字付変数にもコンマによる省略記法が用意されてい ます。上の添字付変数は
a[2,3]と書いても構いません。
さてこのような配列の操作について考えてみましょう。
基本形パターンは
for i := 1 to n do for j := 1 to n do 〜 a[i,j] 〜です。
... const n = 5; type index = 1..n; matrix = array [index, index] of real; var a : matrix; i,j : index; ... begin ... for i := 1 to n do for j := 1 to n do read(a[i,j]); ...
for i := 1 to n do for j := 1 to n do if i = j then a[i,j] := 1 else a[i,j] := 0;
行列のマイナス(符号の反転)を考えてみなさい。
... const n = 5; type index = 1..n; matrix = array [index, index] of real; var a, b: matrix; i,j : index; ... begin ... for i := 1 to n do for j := 1 to n do a[i,j] := b[i,j]; ...とする必要はなく、単に
a := bでよい。
for i := 1 to n do for j := 1 to n do c[i,j] := a[i,j] + b[i,j]
\begin{verbatim} ... const n = 5; type index = 1..n; matrix = array [index, index] of real; var a, b: matrix; i,j,k : index; x : real; ... begin ... for i := 1 to n do j := 1 to n do x := 0; for k := 1 to n do x := x + a[i,k] * b[k,j]; c[i,j] := x;