情報処理演習資料

今日の内容
配列の必要性2. 配列の宣言
3. 配列変数のイメージ
4. 配列変数を使用した例
5. 多次元配列変数
6. 多次元配列変数を使用した例
7. データのソーティング
8. 今日の練習問題
1.

第９回
配列(array)型の変数（添字付きの変数）

1. 配列の必要性

2. 配列の宣言

多数のデータ処理

 一般の変数を宣言する場所で配列も宣言する。

(要求)10,000人分の成績データをもらって、合計点の大きい順に並べ替えて出力したい。

(方法)

ひとまず、全部のデータを変数に入れておく。

(問題)

しかし、var d1,d2,d3,..,d10000:integer;のように、10,000個も変数を書けるか？

(解決策) 配列を使おう!!
var d: array[1..10000] of integer;と書くだけでd[1]～d[10000]まで、10,000個の変数を使うことができる。

3. 配列変数のイメージ
12個の箱が並んでいると考える。
先頭から順番に1、2、3、…12と添え字が付く。
2LastDay

配列名 : array[下限..上限] of 型;– 配列名は変数名と同様、アルファベット・数字・記号からなる。
• 最初の文字はアルファベットであること。
• 記号は一部しか使用できない。

– 下限と上限で添字の範囲を指定する。
• 下限は1以外の数でもよい。
例えば、-5..100 のように書いてもよい。
• 下限と上限は列挙型（整数、文字など）の値でなければならない。

– 型は構成要素の型を表す。

配列変数へのデータの代入と参照

LastDay : array[1..12] of integer;1

 宣言の一般形

12

program LastDayOfMonth;{$APPTYPE CONSOLE}
uses SysUtils;
var LastDay : array[1..12] of integer;month : integer;
begin
LastDay[1]:=31; LastDay[2]:=28; LastDay[3]:=31;LastDay[4]:=30; LastDay[5]:=31; LastDay[6]:=30;
LastDay[7]:=31; LastDay[8]:=31; LastDay[9]:=30;
LastDay[10]:=31; LastDay[11]:=30; LastDay[12]:=31;
write('月の日数を答えます。何月を知りたい？:');
readln(month);
writeln(month, '月は', LastDay[month], '日です。');
readlnLastDay[1] := 31; ← 代入文
添え字

LastDay131

end.
1LastDay2

1231 28 31 30 31 30 31 31 30 31 30 31

1

情報処理演習資料

4. 配列を使用した例

プログラム例

 ある会社に2つの支店（A支店とB支店）があるとする。

program sales;{$apptype console}uses SysUtils;var Branch_A, Branch_B : array[1..3] of integer;
Company : array[1..3] of integer;month : integer;
begin
Branch_A[1]:=100000; Branch_A[2]:=70000;
Branch_A[3]:=80000;
Branch_B[1]:=50000;
Branch_B[2]:=60000;
Branch_B[3]:=90000;
for month := 1 to 3 do
{各月で計算}Company[month] := Branch_A[month] + Branch_B[month];
writeln('この会社の売上額');
for month := 1 to 3 do
{各月で売上額を表示}
writeln(month, '月は', Company[month], '円');
readlnend.

 各支店で1月～3月の各月の売上額が下の表のようなデータとしてある場合、この会社の各月の売上額を計算する。
123100,000

70,00080,000

12350,000

60,00090,000Branch_A

Branch_B

1Company23150,000 130,000 170,000

Company[1] := Branch_A[1] + Branch_B[1];配列を使用した例（偏差値）

偏差値の計算 テストの成績データがあったとして各学生の偏差値を

 偏差値は下に示す式で求まる。

計算するプログラムを作成してみよう。
学生番号
成績

12

3

4

5

6

学生iの偏差値 =

8

成績
68
94
77

偏差値??
??
??

63

平均 =

個々の得点の総和 d1 + d 2 + d 3 + L + d10 1 10=
= ∑ di
学生数
1010 i =1(個々の得点 − 平均) 2 の総和
1 10=∑ ( d i − m) 2
学生数10 i =1

標準偏差 =
123(学生iの得点 − 平均) × 10+ 50
標準偏差 平均と標準偏差を求める。

上の表は下のような配列
変数に格納されたデータと考えることができる。
10 総和を求める計算
mark 68 94 77

109 1068 94 77 52 73 85 79 71 86 63

出力例

学生番号
123763

プログラム片z 繰り返し文を使ってプログラム??

wa := 0;for i := 1 to 10 do
wa := wa + d[i];z 右のプログラム片で計算できる。

ループ終了後、変数waの値が総和

5. 多次元配列変数

プログラム例
program Hensachi;{$APPTYPE CONSOLE}
uses SysUtils;
const N = 10;
mark : array[1..N] of integer = (68,94,77,52,73,85,79,71,86,63);
var wa, y : integer;m, sigma, wa2 : real;i : integer;
begin
wa := 0;for i := 1 to N do wa := wa + mark[i]; {総和を求める}
m := wa / N;
wa2 := 0;
for i := 1 to N do wa2 := wa2 + sqr(mark[i] - m);sigma := sqrt(wa2 / N);
writeln('学生番号成績偏差値');
for i := 1 to N do begin {各学生の偏差値を計算し、表示する}
y := round(10 * (mark[i] - m) / sigma + 50);
writeln(i:5, '', mark[i]:3, '', y:3)
end;
readlnend.

 1次元配列： 一列（直線的）に並べた変数
123N 2次元配列： 平面的に並べた変数
11223Nz 行と列を指定して1つの箱を特定する。
z 添え字として2つの値を持つ。

var B : array[1..M, 1..N] of integer;

B[2, 3]
M行列2情報処理演習資料

6. 多次元配列を使用した例

多次元配列変数の数学との対応
意味を与えた添字付きの変数を使う計算
例 cij := aij + bij(行列の和の計算)

Pascal１次元配列 a[i]２次元配列 b[i,j]３次元配列 c[i,j,k]

数学
数列 ai
行列 bij???? cijk

 ある会社に2つの支店（A支店とB支店）があるとする。
 各支店で1月～3月の各月の商品1、商品2の売上数が下の表のようなデータとしてある場合、この会社の各月の各商品の売上数を計算する。
Branch_A
12123190
120

1407580155

1Branch_B

Pascalの配列では、何次元配列でも作ることができる。

1例) var b : array[1..n, 1..m] of integer;
配列bは、n×m 行列

2program Sales2;{$APPTYPE CONSOLE}
uses SysUtils;var Branch_A, Branch_B : array[1..2, 1..3] of integer;
Company : array[1..2, 1..3] of integer;
good, month : integer;
begin
Branch_A[1,1]:=190; Branch_A[1,2]:=140; Branch_A[1,3]:= 80;
Branch_A[2,1]:=120; Branch_A[2,2]:= 75; Branch_A[2,3]:=155;
Branch_B[1,1]:= 80; Branch_B[1,2]:= 95; Branch_B[1,3]:=150;
Branch_B[2,1]:= 70; Branch_B[2,2]:=100; Branch_B[2,3]:=140;
for good := 1 to 2 do
{各商品で処理}for month := 1 to 3 do
{各月で処理}Company[good, month] :=Branch_A[good, month] + Branch_B[good, month];
writeln('この会社の売上数');for good := 1 to 2 do begin {商品ごとに1行で表示}
write('商品', good:1);
for month := 1 to 3 do
write(' ', Company[good, month]:4, '個');
writelnend;
readlnend.

3行3列行列の和の計算
program mat0;{$APPTYPE CONSOLE}
uses SysUtils;
var a, b, c: array[1..3, 1..3] of real;i, j: integer;
begin
writeln('行列A =?');{行列Aの成分を入力}
for i := 1 to 3 dofor j := 1 to 3 do read(a[i,j]) ;writeln('行列B =?');{行列Bの成分を入力}
for i := 1 to 3 dofor j := 1 to 3 do read(b[i,j]);for i := 1 to 3 do
{和C=A+Bを計算}
for j := 1 to 3 do c[i,j]:=a[i,j]+b[i,j];writeln('A + B =');
{和C=A+Bの成分を出力}
for i := 1 to 3 do begin
for j := 1 to 3 do write(c[i,j]);writelnend;
readln
end.

12380
70

95
100

150
140

123270
190

235
175

230295Company

2Company[1,1] := Branch_A[1,1] + Branch_B[1,1];

3行3列行列の和の計算
 数学の行列計算– 3行3列の行列の和を求める問題– 下のような計算• 行列の i 行 j 列の要素の和を計算する
3+3=6⎛ 1 2 3 ⎞ ⎛ 9 6 3 ⎞ ⎛10 8 6 ⎞⎜⎟ ⎜⎟ ⎜⎟
⎜ 4 5 6 ⎟ + ⎜ 8 5 2 ⎟ = ⎜12 10 8 ⎟⎜ 7 8 9 ⎟ ⎜ 7 4 1 ⎟ ⎜14 12 10 ⎟⎝⎠ ⎝⎠ ⎝⎠
126+2=89+1=1031123245637897. データのソーティング
並べ替えイメージ(その1)
小さい順123456

並べ替え前 4 89 6 2 23 21
89 1～6の最大
23 89 1～5の最大
21 23 89 1～4の最大
6 21 23 89 1～3の最大

並べ替え後 2 4 6 21 23 893情報処理演習資料

並べ替えイメージ(その2)プログラム例

隣り合った数を比べ、前の数が大きければ入れ替える。

program bubble_sort;{$APPTYPE CONSOLE}
uses SysUtils;
const N = 6; // 定数Nを宣言
const d: array[1 .. N] of integer = (4,89,6,2,23,21);vari, j, w: integer;
sd: array[1..N] of integer;
begin{並べ替えるために、データを配列sdにコピーする。}
for i := 1 to N do sd[i] := d[i];for i := 1 to N dofor j := 1 to N - i do
if sd[j] > sd[j+1] then begin
w := sd[j];sd[j] := sd[j+1];
sd[j+1] := wend;
writeln('Sorted data :');
for i := 1 to N do write('sd[',i:3,'] '); writeln;
for i := 1 to N do write(sd[i]:7,' '); writeln;
readln
end.

1

2

3

4

5

64 > 89 ? No

1
289 > 6 ? Yes!!
(1)
(2)

(3)

入れ換えW

63, 4, 54

689
89

22321

22321

Max
89 1～6の最大8. 今日の練習問題
LevelCCB
B+AA問題
多次元配列の例題の会社において、3ヶ月間の全売上数を求めるプログラムを作成せよ。
月と日を入力すると、その年の1月1日からの経過日数を表示するプログラムを作成せよ（閏年は考えない）。
配列内の変化の様子を観察できるようにソートの例題
プログラムを変更せよ。
n個のデータをもらって、各データの値だけ「*」を横に並べる棒グラフを描くプログラムを作成せよ。
(参考：テキストp.57の例5.4.2)
上の棒グラフを縦棒のグラフにせよ。
3×3行列の固有値を求めるプログラムを作成せよ。

4