1 / 24

第 6 章 配 列

第 6 章 配 列. 配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用. 配列の宣言. 一般形 型宣言子 配列名 [ 要素数 ]; 整数型 int a[ 10 ]; a[0] ~ a[ 9 ] unsigned int u[ 20 ]; u[0] ~ u[ 19 ] 浮動小数点数(実数)型 float f[ 101 ]; f[0] ~ f[ 100 ] double x[ N+1 ]; x[0] ~ x[ N ]. 符号付き整数. 符号なし整数. 単精度浮動小数点数. 倍精度浮動小数点数.

Download Presentation

第 6 章 配 列

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第6章 配 列 配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用

  2. 配列の宣言 • 一般形 型宣言子 配列名[要素数]; • 整数型 int a[10]; a[0]~a[9] unsigned int u[20]; u[0]~u[19] • 浮動小数点数(実数)型 float f[101]; f[0]~f[100] double x[N+1]; x[0]~x[N] 符号付き整数 符号なし整数 単精度浮動小数点数 倍精度浮動小数点数 要素は必ず 0から始まるため、最後の要素番号は(要素数-1)であることに注意

  3. よくやるミス (ex6_2_1a.c) #include<stdio.h> #define N 10 int main(void) { int i, x[N], n=N, total=0; double average; for (i=1; i<=n; i++) printf("x[%d]=% d\n", i, x[i]=i); for (i=1; i<=n; i++) total += x[i]; average = (double)total / n; printf("総 和=% d\n", total); printf("平均点=% .2f\n", average); return 0; } プログラム例 6.2.1改 コンパイルの前に Nを 10にすり替えてくれる

  4. 配列要素の初期値 残りは 0 で初期化 int a[10] = {1, 2, 3, 4}; int b[10] = {0}; static int c[10]; double d[10] = {0}; static double e[10]; すべて 0 で初期化 静的変数は 0 で初期化される すべて 0.0 で初期化 静的変数は 0.0 で初期化される

  5. 配列要素の初期値 (ex6_3_1a.c) #include<stdio.h> #define N 10 int main(void) { int i, x[N], n=N, total=0; double average; for (i = 0; i < n; i++) printf("x[%d]=% d\n", i, x[i]); for (i = 0; i < n; i++) total += x[i]; average = (double)total / n; printf("総 和=% d\n", total); printf("平均点=% .2f\n", average); return 0; } プログラム例 6.3.1改 初期値なしで宣言した場合(自動変数)

  6. 配列要素の初期値 (ex6_3_1b.c) #include<stdio.h> #define N 10 int main(void) { int i, x[N]={0}, n=N, total=0; double average; for (i = 0; i < n; i++) printf("x[%d]=% d\n", i, x[i]); for (i = 0; i < n; i++) total += x[i]; average = (double)total / n; printf("総 和=% d\n", total); printf("平均点=% .2f\n", average); return 0; } プログラム例 6.3.1改2 初期値 0で宣言した場合(自動変数)

  7. 配列要素の初期値 (ex6_3_1c.c) #include<stdio.h> #define N 10 int main(void) { int i, n=N, total=0; static int x[N]; double average; for (i = 0; i < n; i++) printf("x[%d]=% d\n", i, x[i]); for (i = 0; i < n; i++) total += x[i]; average = (double)total / n; printf("総 和=% d\n", total); printf("平均点=% .2f\n", average); return 0; } プログラム例 6.3.1改3 static をつけて宣言した場合(静的変数) staticによりすべて 0に初期化される

  8. 配列の上限(自動変数の場合) #include<stdio.h> #define N 200000 // <= 258522 int main(void) { int i, n=N; int x[N]; // stack size limit = 258522*4? long long sum=0; for (i=0; i < n; i++) x[i] = i+1; for (i=0; i < n; i++) sum += x[i]; printf("総 和=%lld\n", sum); return 0; } プログラム例 6.6.3改 (ex6_6_3a.c) 倍長精度整数型(64bit) long long 整数用書式修飾子

  9. 配列の上限(静的変数の場合) #include<stdio.h> #define N 200000000 // <= 499,107,120 int main(void) { int i, n=N; staticint x[N]; // static limit = 499107120*4? long long sum=0; for (i=0; i < n; i++) x[i] = i+1; for (i=0; i < n; i++) sum += x[i]; printf("総 和=%lld\n", sum); return 0; } プログラム例 6.6.3改2 (ex6_6_3b.c) 倍長精度整数型(64bit) long long 整数用書式修飾子

  10. 配列の上限(大域変数の場合) プログラム例 6.6.3改3 (ex6_6_3c.c) #include<stdio.h> #define N 200000000 // <= 499107117 int x[N]; // static limit = 499107117*4? int main(void) { int i, n=N; long long sum=0; for (i=0; i < n; i++) x[i] = i+1; for (i=0; i < n; i++) sum += x[i]; printf("総 和=%lld\n", sum); return 0; } 倍長精度整数型(64bit) long long 整数用書式修飾子

  11. メモリ領域 • プログラム領域 プログラムコード • 静的領域 静的変数、大域変数 • ヒープ領域 動的確保(malloc) • スタック領域 自動変数 Windows XP(32 bit)の場合、1つのプログラムで使えるメモリは 2 GB まで? スタックより大、ヒープより小 データ領域 仮想メモリも使用可 比較的小さい

  12. 2次元配列の宣言 行 列 • 一般形 型宣言子 配列名[要素数][要素数]; • 整数型 int a[5][10]; unsigned int u[10][20] • 実数型 float f[100][10]; double x[M+1][N+1]; 5行10列 10行20列 a[0][0]~a[0][9] a[1][0]~a[1][9] … a[4][0]~a[4][9] u[0][0]~u[0][19] u[1][0]~u[1][19] … u[9][0]~u[9][19] f[0][0]~f[0][9] f[1][0]~f[1][9] … f[99][0]~f[99][9] x[0][0]~x[0][N] x[1][0]~x[1][N] … x[M][0]~x[M][N] 要素は必ず 0から始まるため、おのおのの最後の要素番号は (要素数-1)であることに注意

  13. 2次元配列要素の初期値 int a[4][4] = {{1, 2, 3, 4},{ 5, 6, 7, 8}, {9,10,11,12},{13,14,15,16}}; int b[4][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16}; int c[][4] = {{1, 2, 3, 4}, 5, 6, 7, 8, 9,10,11,12,{13,14,15,16}}; int d[][] = {{1, 2, 3, 4},{ 5, 6, 7, 8}, {9,10,11,12},{13,14,15,16}}; 省略可 省略できない {}カッコだけでは折り返す場所の情報が伝わらない

  14. 2次元配列要素の初期値 行の大きさは省略できるが、列の大きさは省略できない a[4][4]→a[][4] 記憶領域→1次元的 a[m][n]の行列表現 1行目 2行目 m行目 1行目 折り返し場所の情報は省略できない

  15. 2次元配列要素の初期値 • 整数型 int a[4][4] = {1, 2, 3, 4}; int b[4][4] = {0}; static int c[4][4]; • 浮動小数点数型 double d[4][4] = {0}; static double e[4][4]; 残りは 0 で初期化 すべて 0 で初期化 静的変数は 0 で初期化される すべて 0.0 で初期化 静的変数は 0.0 で初期化される

  16. 2次元配列を用いた例(ex6_7_2a.c) #include<stdio.h> #define N 4 int main(void) { int i, j, k=0, a[N][N]; for (i = 0; i < N; i++) for (j = 0; j < N; j++) a[i][j] = ++k; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("a[%d][%d]=%d\t", i, j, a[i][j]); printf("\n"); } return 0; } プログラム例 6.7.2改 1~16の通し 番号を入力 2次元的に 表示

  17. k ← 0 k ← k+1 a[i] ← k i = 0...N-1 j = 0...N-1 ex6.7.2a i = 0...N-1 j = 0...N-1 "a[%d][%d]=%d\t", i, j, a[i][j] "\n" ex6.7.2a のPAD

  18. 2次元配列の1次元化(ex6_7_2b.c) #include<stdio.h> #define N 4 #define IDX(i,j) ((i)*N+(j)) int main(void) { int i, j, a[N*N]; for (i = 0; i < N*N; i++) a[i] = i + 1; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("a[%d][%d]=%d\t", i, j, a[IDX(i,j)]); printf("\n"); } return 0; } プログラム例 6.7.2改2 2次元→1次元変換用マクロ 1~16の通し 番号を入力 2次元的に 表示

  19. 3次元配列の宣言 段 行 列 • 一般形 型宣言子 配列名[要素数][要素数][要素数]; • 整数型 int a[6][11][21]; • 実数型 double x[L+1][M+1][N+1]; 6段11行21列 a[0][0][0]~a[0][0][20] a[0][1][0]~a[0][1][20] … … a[0][10][0]~a[0][10][20] a[5][0][0]~a[5][0][20] a[5][1][0]~a[5][1][20] … … a[5][10][0]~a[5][10][20] x[0][0][0]~x[0][0][N] x[0][1][0]~x[0][1][N] …… x[0][M][0]~x[0][M][N] x[L][0][0]~x[L][0][N] x[L][1][0]~x[L][1][N] … … x[L][M][0]~x[L][M][N] 要素は必ず 0から始まるため、おのおのの最後の要素番号は (要素数-1)であることに注意

  20. エラトステネスの篩(ふるい) • 整数集合 A = {2, 3, ..., n} を考える。 • 整数 i = 2, 3, ..., n/2 についてi∈Aならば iより大きい iの倍数を Aから除いていく。 • 最後まで Aに残ったものが n以下の素数となる。 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 ……………………………………………………………………………………………… 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 997

  21. エラトステネスの篩(ふるい) #include<stdio.h> #define N 1001 int main(void) { int i, j, k, a[N]; for (i = 2; i < N; i++) a[i] = 1; // 篩(a)の初期化 for (i = 2; i < N/2; i++) if (a[i]) { j = 2 * i; while (j < N) {a[j] = 0; j += i;} // iの倍数を除く } prime.c

  22. k = 0; for (i = 2; i < N; i++) if (a[i]) { printf("%5d", i); if (++k % 15 == 0) printf("\n"); // 15個で改行 } if (k % 15 != 0) printf("\n"); return 0; }

  23. a[i] a[i] kmod 15 ≠ 0 エラトステネスの篩(ふるい)のPAD • 素数 i=2,...,N a[i] ← True ←篩(a)の初期化 j← 2i iの倍数を除く i=2,...,N/2 j≦N a[j] ← False prime k← 0 j←j+i i の出力 i=2,...,N k←k+1 改行 改行 kmod 15 = 0 15個で改行

  24. 本日のパズル次のプログラムは何を出力するか?本日のパズル次のプログラムは何を出力するか? #define PRINTX printf("%d\n",x) main() { int x=2, y, z; x *= 3 + 2; PRINTX; x *= y = z = 4; PRINTX; x = y == z; PRINTX; x == ( y = z ); PRINTX; } 1 2 3 4

More Related