情報ネットワーク導入ユニット Ⅰ C 言語 配列
5 章 : 配列同じ型 (int, double など ) の変数の集まりを 番号 ( 添字 ) で管理する変数 int vc[5]; // 要素数が 5 の配列 vc[0] = 1; vc[1] = 2; vc[2] = 3; vc[3] = 4; vc[4] = 5; printf("vc[0] = %d n", vc[0] ); printf("vc[1] = %d n", vc[1] ); printf("vc[2] = %d n", vc[2] ); printf("vc[3] = %d n", vc[3] ); printf("vc[4] = %d n", vc[4] ); int vc[5]; // 要素数が5の配列 vc[i] = i+1; printf("vc[%d] = %d n", i, vc[i] ); 実行結果 vc[0] = 1 vc[1] = 2 vc[2] = 3 vc[3] = 4 vc[4] = 5
5 章 : 配列同じ型 (int, double など ) の変数の集まりを 番号 ( 添字 ) で管理する変数 普通の変数だと 配列だと int vc0, vc1, vc2, vc3, vc4; int vc[5]; // 要素数が 5 の配列 vc0 = 1; vc1 = 2; vc2 = 3; vc3 = 4; vc4 = 5; vc[0] = 1; vc[1] = 2; vc[2] = 3; vc[3] = 4; vc[4] = 5; 5 つの変数 1 つの配列変数 printf("vc[0] = %d n", vc0 ); printf("vc[1] = %d n", vc1 ); printf("vc[2] = %d n", vc2 ); printf("vc[3] = %d n", vc3 ); printf("vc[4] = %d n", vc4 ); printf("vc[0] = %d n", vc[0] ); printf("vc[1] = %d n", vc[1] ); printf("vc[2] = %d n", vc[2] ); printf("vc[3] = %d n", vc[3] ); printf("vc[4] = %d n", vc[4] );
5 章 : 配列 同じ型 (int, double など ) の変数の集まりを 番号 ( 添字 ) で管理する変数 普通の変数だと 配列だと int vc0, vc1, vc2, vc3, vc4; vc0 = 1; vc1 = 2; vc2 = 3; vc3 = 4; vc4 = 5; printf("vc[0] = %d n", vc0 ); printf("vc[1] = %d n", vc1 ); printf("vc[2] = %d n", vc2 ); printf("vc[3] = %d n", vc3 ); printf("vc[4] = %d n", vc4 ); 別々の変数なので, 処理をまとめられない int vc[5]; // 要素数が5の配列 vc[i] = i+1; 番号 ( 添字 ) で操作 printf("vc[%d] = %d n", i, vc[i] ); 各データの処理が似ていれば,for 文で短く, すっきり書ける
5 章 : 配列同じ型 (int, double など ) の変数の集まりを 番号 ( 添字 ) で管理する変数 少しの変更で, より大きなデータ用のプログラムにできる int vc[5]; // 要素数が5の配列 int vc[100]; // 要素数が100の配列 vc[i] = i+1; for( i=0 ; i<100 ; i++ ) { vc[i] = i+1; printf("vc[%d] = %d n", i, vc[i] ); for( i=0 ; i<100 ; i++ ) { printf("vc[%d] = %d n", i, vc[i] ); 5 個 (5 名 ) 用 100 個 (100 名 ) 用
5 章 : 配列同じ型 (int, double など ) の変数の集まりを 番号 ( 添字 ) で 管理する変数 こんな簡単に個数 ( 人数 ) の変更ができる (#defineの利用) #define NUM 5 // 要素数 int vc[num]; // 配列 for( i=0 ; i<num ; i++ ) { vc[i] = i+1; for( i=0 ; i<num ; i++ ) { printf("vc[%d] = %d n", i, vc[i] ); #define NUM 100 // 要素数 int vc[num]; // 配列 for( i=0 ; i<num ; i++ ) { vc[i] = i+1; for( i=0 ; i<num ; i++ ) { printf("vc[%d] = %d n", i, vc[i] );
5 章 : 配列 配列変数の宣言 vc int vc[ 5 ]; // int 型の 5 つの要素からなる配列 vc 型名前 [ 要素数 ]; 添え字 0 1 2 3 4 vc[0] vc[1] vc[2] vc[3] vc[4] 5 つのデータ用領域が連続して作成される 配列データへのアクセス vc[1] 2つ目のデータ 名前 [ 添え字 ]; 添え字は 0 から始まることに注意! vc[2] = 10; // 2 番のデータ (3つ目のデータ) に10を代入 printf(" 結果 = %d n", vc[0] ); //0 番のデータ ( 先頭のデータ ) を表示 scanf("%d", &vc[4] ); //4 番のデータ (5つ目のデータ) に読み込んだ値を代入する
配列と for 文 配列は for 文と組み合わせて処理する場合が多い. 似たような処理を繰返す List5-2(p.112) int vc[5]; // 要素数が5の配列 vc[0] = 1; vc[1] = 2; : vc[4] = 5; printf("vc[0] =%d n", vc[0] ); printf("vc[1] =%d n", vc[1] ); : printf("vc[2] =%d n", vc[4] ); for 文を使わない場合 似たような処理を連続して記述 ( 要素数分 ) 添え字 vc 0 1 2 3 4 1 2 3 4 5 vc[0] vc[1] vc[2] vc[3] vc[4]
配列と for 文 配列は for 文と組み合わせて処理する場合が多い. 似たような処理を繰返す List5-3(p.112) int vc[5]; // 要素数が5の配列 vc[i] = i+1; printf("vc[%d] = %d n", i, vc[i] ); 添え字 vc vc[ i ] = i+1; i 0 < 要素数 i が添え字 ( 番号 ) に対応する 0 1 2 3 4 1 2 3 4 5 vc[0] vc[1] vc[2] vc[3] vc[4]
double xv[100]; // 要素数 100 double sum = 0.0; for( i=0 ; i<100 ; i++ ) { printf("%d 番目のデータ =", i); scanf("%lf", &xv[i] ); 配列と for 文 100 個のデータを代入する 0 < 要素数 for( i=0 ; i<100 ; i++ ) { printf("%d 番目のデータ =", i); scanf("%lf", &xv[i] ); i が添え字 ( 番号 ) に対応する for( i=0 ; i<100 ; i++ ) { printf("%d 番目 = %7.2f n", i, xv[i]); for( i=0 ; i<100 ; i++ ) { sum += xv[ i ]; printf(" 合計 =%7.2f n", sum ); 添え字 0 1 2 3 99 xv i xv[0] xv[1] xv[2] xv[3] xv[99]
List5-5(p.114) 配列の初期化 int vc[5] = { 5, 4, 3, 2, 1 ; // 初期化 int vc[5]; printf("vc[%d] = %d n", i, vc[i]); vc 5 4 3 2 1 vc[0] vc[1] vc[2] vc[3] vc[4] vc[0] = 5; vc[1] = 4; vc[2] = 3; vc[3] = 2; vc[1] = 1; printf("vc[%d] = %d n", i, vc[i]);
List5-6(p.115) int va[5] = { 15, 20, 30, 0, 0 ; // 初期化 int vb[5]; vb = va; // 配列を全体をコピー 配列のコピー 配列のコピー vb = va; のように配列全体をいっぺんにコピーすることはできない. 一つずつコピーするプログラムにする vb va printf(" va vb n"); printf("%3d%3d n", va[i], vb[i]); vb[0] vb[1] vb[2] vb[3] vb[4] 15 20 30 0 0 15 20 30 0 0 va[0] va[1] va[2] va[3] va[4]
List5-6(p.115) int va[5] = { 15, 20, 30, 0, 0 ; // 初期化 int vb[5]; 配列のコピー 配列のコピー vb = va; のように配列全体をいっぺんにコピーすることはできない. 左のプログラムのように一つずつコピーするプログラムにする vb[i] = va[i]; // 要素毎にコピー printf(" va vb n"); printf("%3d%3d n", va[i], vb[i]); vb[0] vb[1] vb[2] vb[3] vb[4] vb 15 20 30 0 0 va 15 20 30 0 0 va[0] va[1] va[2] va[3] va[4]
List5-7(p.116) int vx[5]; // 要素数 5の整数型の配列 配列の要素に値を読込む scanf("%d", &vx[i] ); & を忘れない! キーボードから読み込んだ整数を vx の要素 i 番目に代入する printf("vx[%d]:", i); scanf("%d", &vx[i] ); printf("vx[%d] = %d n", i, vx[i]); vx[0] : 17 vx[1] : 38 vx[2] : 52 vx[3] : 41 vx[4] : 63 vx[0] = 17 vx[1] = 38 vx[2] = 52 vx[3] = 41 vx[4] = 63 vx[0] vx[1] vx[2] vx[3] vx[4] scanf("%d", &a ); vx a 普通の変数配列
List5-9, 5-10(p.118-119) マクロ命令 : #define int tensu[5]; int sum = 0; 5 名の点数を読み込んで合計と平均を計算 表示 100 名用に変更 int tensu[100]; int sum = 0; 100 名用に変更 3 箇所を変更 変更を忘れる可能性あり printf(" 点数を入力 : n"); printf("%2d 番 : ", i+1 ); scanf("%d", &tensu[i] ); sum += tensu[i]; printf(" 合計点 :%5d n", sum ); printf(" 平均点 :%5.1f n", (double)sum/5 ); printf(" 点数を入力 : n"); for( i=0 ; i<100 ; i++ ) { printf("%2d 番 : ", i+1 ); scanf("%d", &tensu[i] ); sum += tensu[i]; printf(" 合計点 :%5d n", sum ); printf(" 平均点 :%5.1f n", (double)sum/100 );
マクロ命令 : #define List5-9, 5-10(p.118-119) 定数を言葉 ( 文字列 ) で表現する #define で定義された言葉はビルドの時に数字に置き換わる #define NUMBER 5 // 人数 int tensu[5]; int sum = 0; int tensu[number]; int sum = 0; printf(" 点数を入力 : n"); printf("%2d 番 : ", i+1 ); scanf("%d", &tensu[i] ); sum += tensu[i]; printf(" 合計点 :%5d n", sum ); printf(" 平均点 :%5.1f n", (double)sum/5 ); printf(" 点数を入力 : n"); for( i=0 ; i<number ; i++ ) { printf("%2d 番 : ", i+1 ); scanf("%d", &tensu[i] ); sum += tensu[i]; printf(" 合計点 :%5d n", sum ); printf(" 平均点 :%5.1f n", (double)sum/number );
マクロ命令 : #define List5-9, 5-10(p.118-119) 定数を言葉 ( 文字列 ) で表現する #define で定義された言葉はビルドの時に数字に置き換わる #define NUMBER 5 // 人数 int tensu[number]; int sum = 0; 100 名用に変更 #define NUMBER 100 // 人数 int tensu[number]; int sum = 0; 100 名用に変更 1 箇所を変更 変更を忘れる可能性なし printf(" 点数を入力 : n"); for( i=0 ; i<number ; i++ ) { printf("%2d 番 : ", i+1 ); scanf("%d", &tensu[i] ); sum += tensu[i]; printf(" 合計点 :%5d n", sum ); printf(" 平均点 :%5.1f n", (double)sum/number ); printf(" 点数を入力 : n"); for( i=0 ; i<number ; i++ ) { printf("%2d 番 : ", i+1 ); scanf("%d", &tensu[i] ); sum += tensu[i]; printf(" 合計点 :%5d n", sum ); printf(" 平均点 :%5.1f n", (double)sum/number );
配列を用いたデータ処理 :(1) 合計 平均値を求める演習問題集の 29 ページ int i, data[num], sum; double avg; sum=0; 1 1 合計を保存する変数 sum を 0 で初期化する. (sum が 0 とは限らないので ) for( i=0 ; i<num ; i++ ){ 2 2for ループで, データすべて ( データ数 NUM) を回るようにする. sum += data[i]; 3 3i 番目のデータを, それまでの sum に加算する. avg = (double)sum/num; 4 4 合計値をデータ数で割って平均値を出す. 右の文章を見て プログラムを作ってみましょう 実行するためには何かが不足しています わからない場合は写しても OK
配列を用いたデータ処理 : (2) 最大値 ( または最小値 ) を求める 演習問題集の 29 ページ ( 例 )NUM 個のデータの中の, 最大値 とその要素番号を求める. int i, data[num], max, max_no; max=data[0]; max_no=0; 1 10 番のデータをとりあえず最大値とする. for( i=1 ; i<num ; i++ ){ if( data[i] > max ) { 2 3 max = data[i]; 3 max_no = i; 2for ループで, 残りのデータ (1~NUM-1 番 ) を 回り, 大きな値が無いかをチェックする. 3i 番のデータが, それまでの最大値 (max) よりも大きいかをチェック. 3 大きい場合は, そのデータを新しい最大値 として max に代入する. 同時にその要素番号も 記録する (max_no). 右の文章を見て プログラムを作ってみましょう 実行するためには何かが不足しています わからない場合は写しても OK
配列を用いたデータ処理 : (3) 条件にあうデータを探す演習問題集の 29 ページ ( 例 )60 以上のデータの数を数えて, またそのデータを表示する. int i, data[num], count; count=0; for( i=0 ; i<num ; i++ ) { if( data[i] >= 60 ) { 1 2 3 1 条件にあるデータの数を保存する変数 countを0で初期化する. 2forループで, データすべて ( データ数 NUM) を回るようにする. 3i 番のデータが条件にあっているかをチェック. count++; 3 3 条件に合っていれば,count を 1 増やす. printf("%d 番 :%d n", i+1, data[i]); 3'' 3'' また, そのデータを表示する. ( 配列の要素番号は 0 から始まるので, 1 から始まる番号に直すために i+1 とする )
2 次元配列 演習問題集の 31 ページ 例題 1 学生 5 名の 3 科目の成績は表 1 のとおりである.2 次元配列を用いて, 各学生の合計点を表示するプログラムを作成せよ. 2 次元配列 2 つの数字でデータを管理 int ten[5][3]; 整数 3 つのデータ群が,5 つ集まったもの 表 1. 各学生の得点 科目 1 科目 2 科目 3 学生 1 80 60 70 学生 2 90 90 85 学生 3 30 50 30 学生 4 60 80 70 学生 5 50 90 40 2 次元配列 int ten[5][3]; 科目 1 科目 2 科目 3 学生 1 ten[0][0] ten[0][1] ten[0][2] 学生 2 ten[1][0] ten[1][1] ten[1][2] 学生 3 ten[2][0] ten[2][1] ten[2][2] 学生 4 ten[3][0] ten[3][1] ten[3][2] 学生 5 ten[4][0] ten[4][1] ten[4][2] ten[1][2] = 85; printf("%d n", ten[3][1] ); scanf("%d", &ten[4][0] ); // 1 行 2 列 (2 行目 3 番目 ) のデータに85を代入 // 3 行 1 列 (4 行目 2 番目 ) のデータ80を表示 // 4 行 0 列 (5 行目 1 番目 ) に読み込んだデータを代入
2 次元配列 例題 1 学生 5 名の 3 科目の成績は表 1 のとおりである.2 次元配列を用いて, 各学生の合計点を表示するプログラムを作成せよ. #define GAKUSEI 5 /* 学生数 */ #define KAMOKU 3 /* 科目数 */ int ten[gakusei][kamoku]= { { 80, 60, 70, { 90, 90, 85, { 30, 50, 30, { 60, 80, 70, { 50, 90, 40 ; int sum[gakusei]; /* 学生合計用 */ int g, k; // 各学生の合計得点を計算 for( g=0 ; g<gakusei ; g++ ) { sum[g] = 0; // 学生 g の合計初期値 0 for( k=0 ; k<kamoku ; k++ ) { sum[g] += ten[g][k]; //g さん各科目得点 // 結果の表示 printf("-------------------- n"); for( g=0 ; g<gakusei ; g++ ) { printf(" 学生 %d の合計得点 :%3d n", (g+1), sum[g] );