高速なべき乗の計算

while文の本体の文の実行前と実行後で次の値が保存されているのが味噌です。

     (yのn乗)*result 

このことと、while文の終了時点でnが0であることから、上のプログラムが正しく計算を行うことがわかります。

さて、このプログラムは、nの二進表現を逆向きに表示するプログラムになっている。

文字型

文字 … 文字型のデータ
        '〈1文字〉'
        例) 'a' '1' '$'
※
        '〈1文字以上の文字の並び〉'
は、文字型ではなく、文字列型である。

文字型の変数の宣言
        var ch, ch:char;

比較の演算子

        =  <>  <=  >=  <  >

がつかえる。

文字の大小関係は、計算機/処理系がつかうコードにより異なる。
次の関係は保証されている:

        'A' < 'B' < 'C' <…< 'Z'
        'a' < 'b' < 'c' <…< 'z'
        '0' < '1' < '2' <…< '9'

それぞれ連続している。(下記†参照)

chr(i)  整数 i を文字に
ord(c)  文字 c を整数に

        ord(chr(i)) = i
        chr(ord(c)) = c

が成り立つ。

succ(c) 直後の文字
pred(c) 直前の文字

succ(c) = chr(ord(c)+1)
pred(c) = chr(ord(c)-1)

が成り立つ。

†「連続している」とは

        'a'  'b'  'c' … 'z'

のordの値がそれぞれ、

        97 98 99 … 122

というふうに連続していることである。
if  ('a' <= c) and (c <= 'z') then c := chr(ord(c) - ord('a') + ord('A'))
また、aからzまでの繰り返しをしたいとき(例:aからzまでの文字を表示する。)
for i := ord('a') to ord('z') do write(chr(i))

でもいいのですが、もっと単純に、

for ch := 'a' to 'z' do write(ch)

と書くことができます。for文の制御変数で許容されるのは、整数型を含む順序型と呼ばれるものです。文字型、論理型も順序型です。実数は順序型ではありません。


整数から実数への自動変換

コンパイラ(pc)が機転を利かせて処理してくれる、ということはありません。


統計量

データ x1,...,xnを読み込んで、それらの

                  n
        平均 M = Σ xi/n
                 i=1

                  n                n
        分散 V = Σ (xi-M)^2/n = (Σ xi^2/n)  - M^2
                 i=1              i=1

        標準偏差 sd = V^(1/2)
program statistics(input,output);
const n = 5;
var x         : array[1..n] of real;
   s,m,t,v,sd : real;
   i          : integer;
begin
   for i:=1 to n do read(x[i]);

   s:=0;
   for i:=1 to n do s := s + x[i];
   m := s / n;
   t := 0;
   for i:=1 to n do t := t + sqr(x[i]);
   v := t/n -sqr(m);
   sd := sqrt(v);

   writeln('mean                =', m:7:3);
   writeln('variance            =', v:7:3);
   writeln('standard derivation =', sd:7:3)
end.

実行例

75 61 90 56 82
mean                = 72.800
variance            =161.360
standard derivation = 12.703


program primes(input,output);
const n = 1000;
type num = 1..n;
var a : array[num] of boolean;
    i, p : num;
    k : integer;
begin
    for i:=1 to n do a[i]:=true;
    p:=2;
    while p * p <= n do 
    begin
        if a[p] then for i := 2 to n div p do a[p*i] := false;
        p := p+1;
    end;
    k := 0;
    for p:=2 to n do
    if a[p] then
    begin if k mod 10 = 0 then writeln;
        write(p:5); k := k+1
    end
end.