pe-6. 配列

109 Views

February 03, 22

スライド概要

pe-6. 配列

profile-image

金子邦彦(かねこくにひこ) 福山大学・工学部・教授 ホームページ: https://www.kkaneko.jp/index.html 金子邦彦 YouTube チャンネル: https://youtube.com/user/kunihikokaneko

シェア

埋め込む »CMSなどでJSが使えない場合

各ページのテキスト
1.

pe-6. 配列 (Pascal プログラミング入門) URL: https://www.kkaneko.jp/cc/pascal/index.html 金子邦彦 1

2.

内容 • 例題1.月の日数 配列とは.配列の宣言.配列の添字. • 例題2.ベクトルの内積 • 例題3.棒グラフを描く • 例題4.Horner 法による多項式の計算 • 例題5.エラトステネスのふるい 配列と繰り返し計算の関係 2

3.

目標 • 配列とは何かを理解し,integer, real の配列を使 ったプログラムを書けるようになる • 配列と繰り返し文を組み合わせて,多量のデータ を扱えるようになる 3

4.

配列 • データの並びで,番号(添字)が付いている 添字 0 1 2 3 4

5.

オンライン開発環境 Online GDB • プログラミングを行えるオンラインのサービス https://www.onlinegdb.com • ウェブブラウザを使う • たくさんの言語を扱うことができる Pascal, Python3, Java, C/C++, C#, JavaScript, R, アセンブリ言語,SQL など • オンラインなので、「秘密にしたいプログラム」を 扱うには十分な注意が必要 5

6.

Online GDB で Pascal を動かす手順 ① ウェブブラウザを起動する ② 次の URL を開く https://www.onlinegdb.com 6

7.

③ 「Language」のところで,「Pascal」を選ぶ 7

8.

実行ボタン エディタ画面 プログラムを 書き換えること ができる 8

9.

例題1.月の日数 • 年と月を読み込んで,日数を求めるプログラムを 作る • うるう年の2月ならば29 • 日数を求めるために,サイズ12(1から12まで) の integer の配列を使う 例) 2021 年 11 月 → 30 9

10.
[beta]
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.

月の日数 実行結果の例 11

12.

プログラムとデータ メモリ num[m]; 配列からの値の 読み出し num[1] 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 12

13.

配列の宣言 • 配列には,名前と型(データの種類のこと)とサ イズがある • 整数データ • 浮動小数データ integer real • 配列を使うには,配列の使用をコンピュータに伝 えること(宣言)が必要 var num : array [1..12] of integer; 名前は num 配列の添字 は1から12 整数 データ 13

14.

array [ ] of の意味 • [] の中に,添字の範囲を書く おのずと,配列のサイズが決まる array [1..12] of integer のとき 添字は,1から12まで 14

15.

配列の添字 添字 1 2 3 4 5 6 7 8 9 10 11 12 配列の中身を読み書きするときに は,配列の名前と添字を書く 例) num[m] 添字 15

16.

配列の読み書き • 配列の名前と添字を書く 例) num[1] := 31; writeln('number of days(' y, '/', m, ') is', num[m] ); 16

17.

例題2.ベクトルの内積 • ベクトル(1.9, 2.8, 3.7)と,ベクトル(4.6, 5.5, 6.4)の内積を表示するプログラムを作る 2つのベクトルの内積の計算のために,サイズ3の配列 を2つ使う 17

18.

ベクトルの内積 ベクトルの成分から内積を求める → a = (a , a , a ) b = (b , b , b ) → 0 → 1 → a •b = 0 2 a b 0 0 + ab 1 1 1 + 2 a b 2 のとき 2 18

19.

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.

ベクトルの内積 実行結果の例 20

21.

プログラムとデータ メモリ u[0] u[1] u[2] 1.9 2.8 3.7 v[0] v[1] v[2] 4.6 5.5 6.4 ip := ip + u[i]*v[i]; 配列からの 読み出し 21

22.

配列の宣言 var u, v : array [0..2] of real; 名前は 添字は 浮動小数 u と v 0から2まで データ 22

23.

プログラム実行順 ip := 0; i := 0; i<3 No Yes ip := ip + u[i]*v[i]; writeln('product =', ip:8:3 ); i := i + 1; 23

24.

ベクトルの内積 i の値 繰り返し 1回目 i=0 繰り返し条件式 が成り立つか i < 3 が成り立つ ip の値 ip := ip + u[0] * v[0]; つまり ip の値は u[0]*v[0] 繰り返し 2回目 i=1 i < 3 が成り立つ ip := ip + u[1] * v[1]; つまり ip の値は u[0]*v[0] + u[1]*v[1] 繰り返し 3回目 繰り返し 4回目 i=2 i < 3 が成り立つ ip := ip + u[2] * v[2]; つまり ip の値は u[0]*v[0] + u[1]*v[1] +u[2]*v[2] i=3 i < 3 が成り立たない 24

25.

例題3.棒グラフを描く • 整数の配列から,その棒グラフを表示するプログ ラムを作る. ループの入れ子で,棒グラフの表示を行う 25

26.

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.

棒グラフを描く 実行結果の例 27

28.

プログラムとデータ メモリ a[1] a[2] a[3] a[4] a[5] a[6] a[7] 6 4 7 1 5 3 2 for j := 1 to a[i] do begin 配列からの 読み出し 28

29.

プログラム実行順 i := 1; i <= 7 No Yes j := 1; readln j <= a[i] Yes No write('*'); writeln; j := j + 1; i := i + 1; 29

30.

例題4. Horner 法による多項式の計算 • n次の多項式 f(x) = a0 + a1・x + a2・x2 + ・・・ +an・xn について,次数 n と,係数 a0 から an を読み込ん で,f(x) を計算するプログラムを作る • まず n を読み込んで,その後に a0 から an を読み込む .最後に x を読み込む. • 次ページで説明する Horner法を使う • 読み込んだ係数は,いったん配列に格納する. n は高々 20とする. 30

31.

Horner法 f(x) n = a0 + a1・x + a2・x + ・・・ +an・x 2 = a0 + ( a1 + ( a2 + ・・・ + ( an-1 + an ・x ) x ・ ・・) x ) x 例えば, 5 + 6x + 3x 2 = 5 + ( 6 + 3x ) x 計算手順 ① an ② an-1 + an・x ③ an-2 + ( an-1 + an・x ) x ・・・ (a0 まで続ける) 31

32.
[beta]
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.

実行結果の例 33

34.

Horner 法 y = a[n]; i := n - 1; i >= 0 Yes No y := y * x + a[i]; i := i - 1; 34

35.

例題5.エラトステネスのふるい • 「エラトステネスのふるい」の原理に基づいて 100以下の素数を求め,結果を表示するプログラ ムを作成する • 100以下の素数を求めるために,2から100まで の配列を使う • 配列には,添字が素数なら1,そうでなければ0をセ ットする 35

36.

エラトステネスのふるい (1/4) 2 3 4 2×2 5 6 2×3 7 8 2×4 9 10 11 ・・・ 2×5 まず,2の倍数を消す 36

37.

エラトステネスのふるい (2/4) 2 3 4 5 6 3×2 7 8 9 10 11 ・・・ 3×3 次に,3の倍数を消す 37

38.

エラトステネスのふるい (3/4) 2 3 4 5 6 7 8 9 10 11 ・・・ 5×2 次に,5の倍数を消す (「4の倍数」は考えない. それは,「4」がすでに消えているから) 38

39.

エラトステネスのふるい (4/4) 2 3 4 5 6 7 8 9 10 11 ・・・ 以上のように,2,3,5,7の倍数を消す. 10(これは100の平方根)を超えたら,この操作を止める (100以下で,11,13・・・の倍数はすでに消えている) 39

40.

program sum; var p : array [2..100] of integer; var n, i : integer; begin for i := 2 to 100 do begin a[2] から a[100] までを p[i] :=1; 「1」にセット end; まず「2」の倍数から n := 2; while n <= sqrt( 100 ) do begin i := 2; n が 100 を超えたら終わり while ( n * i ) <= 100 do begin p[ n * i ] := 0; n の倍数を「消す」 i := i + 1; end; ( n が 100 以上になったら終わり) n := n + 1; n の「次」の 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

41.

実行結果の例 41

42.

演習1.1000 までの素数 • エラトステネスのふるいを使って1000までの数の 素数を求めるプログラムを作りなさい 例題5のプログラムを書き換えなさい 42