プログラミング言語論0511

プログラミング言語論
第五回
理工学部
情報システム工学科
新田直也
多重ループ

ループの中にループが入れ子になったもの
(ネスト構造).
int x, y, z;
for (z = 1; ; z++) {
for (x = 1; x < z; x++) {
for (y = x; y < z; y++) {
if (x * x + y * y == z * z) {
printf(“x=%d, y=%d, z=%d\n”,x,y,z);
break;
}
}
}
}
配列(1)

もし,配列がなければ… (ソートのプログラム)
int a, a1, a2, a3;
if (a1 < a2) {
a = a2;
a2 = a1;
a1 = a;
}
if (a1 < a3) {
a = a3;
a3 = a2;
a2 = a1;
a1 = a;
} else if (a2 < a3) {
a = a3;
a3 = a2;
a2 = a;
}
•
•
•
•
長くなる
読みにくい
間違えやすい
要素数が変わる度に
書き直し
配列(2)

配列があれば… (ソートのプログラム)
int a, a[3];
int n1, n2;
for (n1 = 0; n1 < 3-1; n1++) {
for (n2 = n1 + 1; n2 < 3;
n2++) {
if (a[n1] < a[n2]) {
a = a[n2];
a[n2] = a[n1];
a[n1] = a;
}
}
}
→要素数が変わった場合,3を変更すればよい.
配列の宣言

配列:任意にアクセスできる変数の列.
a[0]

a[1]
a[2]
a[3]
a[4]
…
配列名と添字
a[3]
配列名 添字 (C, C++, Javaの場合,先頭は0番)

配列宣言
int a[1000];
使用する要素数
配列宣言(Java, VB)

Javaの配列宣言
int[] a = new int[1000];

VBの配列宣言
Dim a(1000) as Integer
多次元配列


たとえば表のデータを扱う場合(2次元配列).
a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[1][0]
a[1][1]
a[1][2]
a[1][3]
a[2][0]
a[2][1]
a[2][2]
a[2][3]
多次元配列の宣言
int a[3][4];
12個のint型の要素が用意される.
配列とメモリ

配列の要素はメモリ上に連続して配置される.
:
0xffff番地
a[3]
b[1][0]
a[2]
b[0][2]
a[1]
a
a[0]
0xffff番地
b[1]
b[0][1]
b, b[0]
b[0][0]
0x0000番地

:
0x0000番地
配列名で先頭アドレスを参照することもできる
(参照のみで代入はできない).
ポインタ

ポインタをURL,ポインタが指す先をWebページと
考えてみる.
アドレスが指す先の内容
int *p;
アドレス
p は指す先が int 型であるポインタ
*p
p
http://www.hogehoge.com
<html>
<body>
<H1>5</H1>
</body>
</html>
ポインタの更新と参照先の更新

p の値の変更と *p の値の変更の違い.
*p = 7; → Webページの更新
*p
p
http://www.hogehoge.com
http://www.hogehoge2.com
*p
p = q;
→ リンク先の変更
7
7
<html>
<body>
<H1>5</H1>
7
</body>
</html>
アドレスの取得

配列の先頭アドレス:
int a[1000];
と宣言したときの a (配列名)

変数のアドレス:
int x;
アドレス
内容
と宣言したときの &x
ポインタを用いた値の共有

以下のプログラムを実行してみる.
内容
int x;
int *p;
アドレス
p = &x;
このとき x の値も同時に 3 になる
*p = 3;
構造体(1)

Webページにはいろんな情報が含まれている.
CELL
構造体名
メンバ
value
next

struct CELL {
int value;
struct CELL *next;
}
struct CELL は新しい型として振舞う.
struct CELL x;
構造体(2)

プログラム例:
struct CELL {
int value;
struct CELL *next;
};
struct CELL x;
struct CELL y;
x.value = 5;
x.next = &y;
y.value = x.value;
y.next = x.next;