pe-6. 配列
1
Pascal プログラミング入門)
URL: https://www.kkaneko.jp/pro/pascal/index.html
金子邦彦
内容
例題1.月の日数
配列とは.配列の宣言.配列の添字.
例題2.ベクトルの内積
例題3.棒グラフを描く
例題4.Horner 法による多項式の計算
例題5.エラトステネスのふるい
配列と繰り返し計算の関係
2
目標
配列とは何かを理解し,integer, real の配列を使
ったプログラムを書けるようになる
配列繰り返し文組み合わせて多量のデータ
を扱えるようになる
3
配列
データの並びで,番号(添字)が付いている
4
添字
オンライン開発環境 Online GDB
プログラミングを行えるオンラインのサービス
https://www.onlinegdb.com
ウェブブラウザを使う
たくさんの言語を扱うことができる
Pascal, Python3, Java, C/C++, C#, JavaScript,
R, アセンブリ言語,SQL など
オンラインなので、「秘密にしたいプログラム」
扱うには十分な注意が必要 5
Online GDB Pascal を動かす手順
ウェブブラウザを起動する
次の URL を開く
https://www.onlinegdb.com
6
Language」のところで,「Pascal」を選ぶ
7
エディタ画面
実行ボタン
プログラムを
書き換えること
ができる
8
例題1.月の日数
年と月を読み込んで,日数を求めるプログラムを
作る
うるう年の2月ならば29
日数を求めるために,サイズ12(1から12まで)
integer 配列を使う
例) 2021 11 30
9
program sum;
var num : array [1..12] of integer;
var y, m : integer;
begin
num[1] := 31; num[2] := 28; num[3] := 31; num[4] := 30;
num[5] := 31; num[6] := 30; num[7] := 31; num[8] := 31;
num[9] := 30; num[10] := 31; num[11] := 30; num[12] := 31;
write('Please Enter y(year): ');
readln(y);
write('Please Enter m(month): ');
readln(m);
if (m=2) and (((y mod 400)=0) or (((y mod 100)<>0) and ((y mod 4)=0))) then begin
writeln('number of days(', y, '/', m, ') is 29');
end
else begin
writeln('number of days(', y, '/', m, ') is ', num[m] );
end;
readln
end.
10
配列からの
読み出し
配列への
書き込み
月の日数
11
実行結果の例
プログラムとデータ
12
メモリ
num[1]
num[m];
配列からの値の
読み出し
num[2]
num[3]
num[4]
num[5]
num[6]
num[7]
num[8]
num[9]
num[10]
num[11]
num[12]
31
28
31
30
31
30
31
31
30
31
30
31
配列の宣言
配列には,名前データの種類のこと)と
イズがある
整数データ integer
浮動小数データ real
配列を使うには,配列の使用をコンピュータに伝
えること(宣言)が必要
13
var num : array [1..12] of integer;
整数
データ
名前は
num 配列の添字
は1から12
array [ ] of の意味
[] の中に,添字の範囲を書く
おのずと,配列のサイズが決まる
14
array [1..12] of integer のとき
添字は,1から12まで
配列の添字
配列の中身を読み書きするときに
は,配列の名前と添字を書く
例) num[m]
15
1
添字
2
3
4
5
6
7
8
9
10
11
12
添字
配列の読み書き
配列の名前と添字を書く
例)
num[1] := 31;
writeln('number of days(' y, '/', m, ') is', num[m] );
16
例題2.ベクトルの内積
ベクトル(1.9, 2.8, 3.7と,ベクトル(4.6, 5.5,
6.4内積を表示するプログラムを作る
2つのベクトルの内積の計算のために,サイズ3の配列
を2つ使う
17
ベクトルの内積
ベクトルの成分から内積を求める
18
aaaa 210 ,,
babababa 221100
bbbb 210 ,,
のとき
program sum;
var u, v : array [0..2] of real;
var i : integer;
var ip : real;
begin
u[0] := 1.9; u[1] := 2.8; u[2] := 3.7;
v[0] := 4.6; v[1] := 5.5; v[2] := 6.4;
ip := 0;
for i := 0 to 2 do begin
ip := ip + u[i] * v[i];
end;
writeln('product =', ip:8:3 );
readln
end. 19
配列からの
読み出し
配列への
書き込み
ベクトルの内積
20
実行結果の例
プログラムとデータ
21
メモリ
u[0]
ip := ip + u[i]*v[i];
配列からの
読み出し
u[1]
u[2]
1.9
2.8
3.7
v[0]
v[1]
v[2]
4.6
5.5
6.4
配列の宣言
22
var u, v : array [0..2] of real;
浮動小数
データ
名前は
u v添字は
0から2まで
プログラム実行順
23
ip := 0;
i < 3 Yes
No
i := 0;
writeln('product =', ip:8:3 );
ip := ip + u[i]*v[i];
i := i + 1;
ベクトルの内積
24
繰り返し
1回目 i = 0i < 3 が成り立つ ip := ip + u[0] * v[0];
繰り返し
2回目
繰り返し
3回目
繰り返し
4回目
i = 1i < 3 が成り立つ ip := ip + u[1] * v[1];
i = 2i < 3 が成り立つ ip := ip + u[2] * v[2];
i = 3 i < 3 が成り立たない
i の値 繰り返し条件式
が成り立つか ip の値
つまり ip の値は u[0]*v[0]
つまり ip の値は u[0]*v[0] + u[1]*v[1]
つまり ip の値は u[0]*v[0] + u[1]*v[1]
+u[2]*v[2]
例題3.棒グラフを描く
整数の配列から,その棒グラフを表示するプログ
ラムを作る.
ループの入れ子で,棒グラフの表示を行う
25
program sum;
var a : array [1..7] of integer;
var i, j : integer;
begin
a[1] := 6; a[2] := 4; a[3] := 7; a[4] := 1;
a[5] := 5; a[6] := 3; a[7] := 2;
for i := 1 to 7 do begin
for j := 1 to a[i] do begin
write('*');
end;
writeln;
end;
readln
end. 26
配列からの
読み出し
配列への
書き込み
棒グラフを描く
27
実行結果の例
プログラムとデータ
28
メモリ
a[1]
for j := 1 to a[i] do begin
配列からの
読み出し
a[2]
a[3]
6
a[4]
a[5]
a[6]
a[7]
4
7
1
5
3
2
プログラム実行順
29
j <= a[i] Yes
No write('*');
j := j + 1;
writeln;
i <= 7 Yes
i:= i + 1;
:= 1;
i := 1;
No
readln
例題4. Horner 法による多項式の計算
n次の多項式
f(x) = a0 + a1x + a2x2 + ・・・ +anxn
について,次数 nと,係数 a0 から an を読み込ん
で,f(x) を計算するプログラムを作る
まず n を読み込んで,その後に a0 から an を読み込む
.最後に x を読み込む.
次ページで説明する Horner法を使う
読み込んだ係数は,いったん配列に格納する. n は高々
20とする.
30
Horner
f(x) = a0 + a1x + a2x + ・・・ +anx
= a0 + ( a1 + ( a2 + ・・・ + ( an-1 + an x ) x
・・) x ) x
例えば, 5 + 6x + 3x
= 5 + ( 6 + 3x ) x
31
計算手順
an
an-1 + anx
an-2 + ( an-1 + anx ) x
・・・ a0まで続ける)
2n
2
program sum;
var a : array [0..20] of real;
var i, n : integer;
var x, y : real;
begin
write('Please Enter n: ');
readln(n);
for i := 0 to n do begin
write('Please Enter a[', i, '] : ');
readln(a[i]);
end;
write('Please Enter x: ');
readln(x);
y := a[n];
i := n - 1;
while i >= 0 do begin
y := y * x + a[i];
i := i - 1;
end;
writeln('y =', y:8:3 );
readln
end. 32
配列からの
読み出し
配列への
書き込み
実行結果の例
33
Horner
34
No
i >= 0 Yes
y = a[n];
i := n - 1;
i := i - 1;
y := y * x + a[i];
例題5.エラトステネスのふる
エラトステネスのふるい」の原理に基づいて
100以下の素数を求め,結果を表示するプログラ
ムを作成する
100以下の素数を求めるために,2から100まで
の配列を使う
配列には,添字が素数なら1そうでなければ0をセ
ットする
35
エラトステネスのふるい (1/4)
36
10 11 ・・・
××××
まず,2の倍数を消す
エラトステネスのふるい (2/4)
37
10 11 ・・・
×
次に,3の倍数を消す
×
エラトステネスのふるい (3/4)
38
10 11 ・・・
次に,5の倍数を消す
(「4の倍数」は考えない.
それは,「4」がすでに消えているから)
×
エラトステネスのふるい (4/4)
39
10 11 ・・・
以上のように,2,3,5,7の倍数を消す.
10(これは100の平方根)を超えたら,この操作を止める
(100以下で,11,13・・・の倍数はすでに消えている)
program sum;
var p : array [2..100] of integer;
var n, i : integer;
begin
for i := 2 to 100 do begin
p[i] :=1;
end;
n := 2;
while n <= sqrt( 100 ) do begin
i := 2;
while ( n * i ) <= 100 do begin
p[ n * i ] := 0;
i := i + 1;
end;
n := n + 1;
while ( p[n] = 0 ) and ( n <= sqrt(100) ) do begin
n := n + 1;
end;
end;
for i := 2 to 100 do begin
if p[i] = 1 then begin
write( i, ',' );
end;
end;
readln
end. 40
a[2] から a[100] までを
「1」にセット
まず「2」の倍数から
n の倍数を「消す」
( n 100 以上になったら終わり
n の「次」の
素数を探す
n 100 を超えたら終わり
求めた素数の表示
実行結果の例
41
演習1.1000 までの素数
エラトステネスのふるいを使って1000までの数の
素数を求めるプログラムを作りなさい
例題5のプログラムを書き換えなさい
42