ppt

配列
教科書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