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