配列 教科書11章 電子1(木曜クラス) 2005/06/02(Thu.) 1 最大値を見つけるプログラム /* */ /* 作成日: 2005/06/02(Thu.) 作成者:本荘太郎 学籍番号:b06b0xx ソースファイル:find_max.c 実行ファイル:find_max 説明:n個の実数から最大値を見つけるプログラム。 入力:データ数として、 標準入力からデータの個数を表す 1つの正の整数nを入力。 続いて、データとして、 標準入力からn個の実数を任意の順番で入力。 出力:標準出力にデータ中の最大値を出力。 次のページに続く */ 2 /* 続き */ #include <stdio.h> /*マクロ定義*/ #define DATANUM int main() { /* 変数宣言 int n; int i; 1000 /* データ個数の上限 */ */ /* データ数*/ /* ループカウンタ、 配列dataの添字 */ double max; /*最大値*/ double data[DATANUM]; /*データを入れる配列*/ /* 次のページに続く */ 3 /* 変数の初期化 n=0; i=0; max=0.0; */ /* 配列要素の初期化 */ for(i=0;i<DATANUM;i++) { data[i]=0.0; } /* 入力処理*/ /*データ数の入力*/ printf("データ数を入力して下さい。\n"); printf("n= ?\n"); scanf("%d",&n); 4 /*データ数nのチェック*/ if(n<=0) { /* 不正な入力:データ数が0以下*/ printf("データが無いのですね。\n”); return -1; } /* これ以降では、nは正の整数*/ if(n>DATANUM) { /* 不正な入力:上限オーバー*/ printf(”データが多すぎます。\n”); return -1; } /* これ以降では、nは1からDATANUMまでの整数*/ 5 /*続き*/ /* 標準入力から配列へデータを読み込む/ for(i=0;i<n;i++) { /* n個の実数データの入力 */ printf("data[%d] = ?",i); scanf("%lf",&data[i]); } /* 次に続く */ 6 /* 続き */ /*最大値を見つける*/ max=data[0]; /*仮の最大値の設定*/ for(i=0;i<n;i++) { if(max<data[i]) { /*data[0]からdata[i-1]までの最大値より data[i]の値が真に大きい場合は、 data[i]が仮の最大値 */ max=data[i]; } /*ここでは、max内にはdata[0]からdata[i]まで の最大値が入っている。*/ } 7 } /*続き*/ /*出力処理*/ printf("最大値は %6.2fです。\n",max); return 0; 8 実行例1 $make gcc find_max.c -o find_max $ ./find_max データ数を入力して下さい。 n= ? 3 data[0]= ?1.0 data[1]= ?3.0 data[2]= ?-2.0 最大値は 3.00です。 $ 9 実行例2 $./find_max データ数を入力して下さい。 n= ? 0 データが無いのですね。 $ 実行例3 $./find_max データ数を入力して下さい。 n= ? 2000 データが多すぎます。 $ 10 配列 同じ型の変数を複数集めたもの。 個々の要素(配列要素)は、普通の変数として扱える。 宣言: 要素のデータ型 配列名[要素数]; 配列を宣言する際は、 マクロを用いた方が良い。 例 #define SIZE double x[SIZE]; double x[100]; 4 注意: 1.変数は要素数分 用意される。 2.宣言で用いる要素数は 定数でなくてはならない (変数で指定することは、 不可) 11 使い方: 配列名[添字] で普通の変数のようにつかえる。配列要素は、整数型の値 (定数、変数、式)で指定される。要素を指定する整数値を 添字(インデックス)と呼ぶこともある。 ただし、添字の値は、 「0から(要素数-1)」でなければなら ない。 例 添字の値が不正 になるようなプログ ラムでも、コンパイ max=x[0]; if(max<x[i]) ルはできてしまう。 { 十分注意する事。 } max=x[i]; 注意:添字にはint型の式を使い、 添字の値が取りえる範囲に気を付ける事。 12 イメージ char c; char a[5]; int i; int b[5]; double f; double d[5]; a[4] までの配列要素 しか用意されない。 c a[0] a[1] a[2] a[3] a[4] a[5]はない a[5]='A'; i b[1] b[0] b[2] b[3] b[4] f d[0] d[1] d[2] d[3] d[4] 13 数学の変数とC言語の配列 6444444444444444444444n7個444444444444444444444484 x0 x1 x2 L xi L xn- 1 b b b b b x[0] x[1] x[2] L x[i] L x[n - 1] 14444444444444444444442444444444444444444444434 n個 14 /* test_array.c 配列実験 コメント省略 */ #include <stdio.h> #include <math.h> #define SIZE 3 int main() { int i; double a[SIZE]; double b[SIZE]; double c[SIZE]; /* 次に続く */ 15 /* 配列要素の初期化 同じ要素数の配列なので, 同じforループで初期化できる。*/ for(i=0;i<SIZE;i++) { a[i]=0.0; b[i]=0.0; c[i]=0.0; } /*値の代入*/ b[0]=M_PI; b[SIZE]=M_E; /*間違い*/ /* 次に続く */ 16 /*配列内容表示*/ for(i=0;i<SIZE;i++) { printf("a[%d] =%f \n",i,a[i]); } for(i=0;i<SIZE;i++) { printf("b[%d] = %f \n",i,b[i]); } for(i=0;i<SIZE;i++) { printf("c[%d] = %f \n",i,c[i]); } /* 続く */ 17 /*配列要素の間違った利用*/ printf("c[%d] = %f \n",SIZE,c[SIZE]); } return 0; 18 最大値を求めるアルゴリズム max:0から(i-1)番目までの データ内での最大値 スタート max=x[0]; i=0; 偽 i<n? 真 max<x[i] i++ 偽 maxが最大値 真 max=x[i] エンド 19 最大値を求める。(配列を用いないとき。) /* find_max2.c #include <stdio.h> int main() { /*変数宣言*/ double max; double x0; double x1; double x2; double x3; /* 次に続く コメント省略 */ */ 20 /*続き*/ max=0.0; x0=0.0; x1=0.0; x2=0.0; x3=0.0; printf(“x0 = ?”); scanf(“%lf”,&x0); printf(“x1= ?”); scanf(“%lf”,&x1); printf(“x2= ?”); scanf(“%lf”,&x2); printf(“x3= ?”); scanf(“%lf”,&x3); 21 } max=x0; if(max<x1) { max=x1; } if(max<x2) { max=x2; } if(max<x3) { max=x3; } printf("最大値は %6.2f です。\n",max); return 0; 22 最大値を求める。(配列を用いたら。) /* find_max3.c コメント省略 */ #include <stdio.h> #define SIZE 4 int main() { int i; /*ループカウンタ、配列xの添字*/ double max; double x[SIZE]; /*初期化*/ i=0; max=0.0; for(i=0;i<SIZE;i++) { x[i]=0.0; } /* つづく */ 23 /*入力処理*/ for(i=0;i<SIZE;i++) { printf(“x[%d]=?\n”,i); scanf(“%lf”,&x[i]); } /* 次に続く */ 24 /*最大値を求める*/ max=x[0]; for(i=0;i<SIZE;i++) { if(max<x[i]) { max=x[i]; } } /* 出力処理 */ printf("最大値は %6.2fです。\n",max); } return 0; 25 最大値を求める。(仮最大値の添え字を利用すると。) /* find_max3.c コメント省略 */ #include <stdio.h> #define SIZE 4 int main() { int i; /*ループカウンタ、配列xの添字*/ int maxindex;/*仮の最大値の添字*/ double x[SIZE]; /*初期化*/ i=0; maxindex=0; for(i=0;i<SIZE;i++) { x[i]=0.0; } /* つづく */ 26 /*入力処理*/ for(i=0;i<SIZE;i++) { printf(“x[%d]=?\n”,i); scanf(“%lf”,&x[i]); } /* 次に続く */ 27 maxindex=0; /*仮の最大値を持つ要素の 添字の設定*/ for(i=0;i<SIZE;i++) { if(x[maxindex]<x[i]) { maxindex=i; } } printf("最大値はx[%2d]の %6.2fです。\n", maxindex,x[maxindex]); } return 0; 28 2次元配列 宣言: 要素のデータ型 配列名[行の要素数][列の要素数]; 例 #define #define TATE 5 YOKO 3 double m[TATE][YOKO]; 使いかた: 配列名[添字1][添字2] で普通の変数のようにつかえる。 また、添字には(整数型の) 変数や式も使える。 29 2次元配列のイメージ j m[0][0] i m[i][j] m[TATE-1][YOKO-1] 30 2次元配列でよくある間違い 間違い1 配列名[添字1,添字2] m[i,j] 数学の座標のように、カンマで区切るのは 間違い。 間違い2 配列の添字を入れ替えてしまう。 m[i][j] のつもりで、 m[j][i] とする。 31 2次元配列の初期化 forループを用いて初期化しましょう。 配列とforループは相性が良いので、 一緒に使うと便利です。 double m[TATE][YOKO]; int i; /*配列mの次元1の添字*/ int j; /*配列mの次元2の添字*/ for(i=0;i<TATE;i++) { for(j=0;j<YOKO;j++) { m[i][j]=0.0; } } 32 多次元配列 宣言: データ型 配列名[次元1の要素数][次元2の要素数][次元3の要素数]・・・; 例 #define #define #define TATE 5 YOKO 4 OKU 3 double cube[TATE][YOKO][OKU]; 使いかた: 配列名[添字1][添字2][添字3]・・・ で普通の変数のようにつかえる。 また、添え字には(整数型の) 変数や式も使える。 33 3次元配列のイメージ j cube[0][0][0] cube[0][3][2] k i cube[4][3][2] cube[2][1][0] 34 3次元配列の初期化例 double cube[TATE][YOKO][OKU]; int i; /*配列cubeの次元1の添字*/ int j; /*配列cubeの次元2の添字*/ int k; /*配列cubeの次元3の添字*/ for(i=0;i<TATE;i++) { for(j=0;j<YOKO;j++) { for(k=0;k<OKU;k++) { cube[i][j][k]=0.0; } } } 35
© Copyright 2024 ExpyDoc