プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也 多重ループ ループの中にループが入れ子になったもの (ネスト構造). 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;
© Copyright 2024 ExpyDoc