int maxof(int a[], int n)

応用プログラミング
第6回
www.fit.ac.jp/~matsuki/AP.html
今日の内容
• 前回の課題の解説
• 前回の復習
• 配列の関数への受け渡し
表示開始
配列とメモリの関係
アドレス
0012FF10
番地
アドレス 0012FF10~0013012Fまでの
メモリの様子
0013012F
番地
デバッグ⇒ウィンドウ⇒メモリ
配列とメモリの関係
0012FF18番地 = x
x[0]
x[1] x[2] x[3]
x[4]
x[0]
0012FF18番地の値
(x + 0)番地の値
x[1]
x[2]
0012FF19番地の値
0012FF1A番地の値
(x + 1)番地の値
(x + 2)番地の値
x[3]
x[4]
0012FF1B番地の値
0012FF1C番地の値
(x + 3)番地の値
(x + 4)番地の値
メモリ番地を調べる方法
変数がメモリのどこに格納されているのか(メモリ
番地)を調べるには、「&」アドレス演算子を使う。
&x
前回の課題解説1
#include <stdio.h>
int main()
{
char x = 7;
int y = 8;
char a[5] = {1,2,3,4,5};
printf(“配列aの先頭アドレスは、%x\n”,a);
printf(“a[4]のアドレスは、%x\n”,&(a[4]));
printf(“変数xのアドレスは、%x\n”,&x);
return 0;
}
前回の課題解説2
次の(1)から(3)の値はいくらになるか?16進
数で答えよ
(1)配列a[1]の値
(2)配列a[3]のアドレス
(3)変数xのアドレス
前回の課題解説3
次の(1)から(3)をprintfを使って表示せよ。
(1)配列a[2]のアドレス
(2)配列a[3]の値
(3)変数xのアドレス
前前回の課題
課題1:配列を使って,10個の整数値を入力さ
せ,その中から最小値,最大値,平均値を表
示するプログラムを作成せよ.
課題1(手順)
(1)10個の値を入力させる
(2)配列に格納
(3)最大値を計算
(4)最小値を計算
(5)平均を計算
(6)結果を表示
計算処理
出力処理
入力処理
課題1(入力処理)
(1)10個の値を入力させる
(2)配列に格納
入力処理
int i;
int x[10];
printf("10個の整数値を入力せよ。\n");
for(i=0;i<10;i++)
{
scanf("%d",&x[i]);
}
課題1(計算処理part3)
int max, min, ave;
int sum = 0;
max=min=x[0];
for ( i = 0; i < 10; i++)
{
最大と最小をまとめて調べつつ,
if(x[i]>max) max=x[i]; x[i]の総和も求める
if(x[i]<min) min=x[i];
sum += x[i];
}
ave = sum / 10; 総和を個数で割って,平均を計算
課題1(出力処理)
printf("最大値:%d\n",max);
printf("最小値:%d\n",min);
printf("平均値:%d\n",ave);
最大値を求めるプログラムの場合
int max;
関数にする
max=x[0];
max=
maxof(x, 10);
for ( i = 0; i < 10; i++)
{
if(x[i]>max) max=x[i];
int maxof(int a [], int n)
}
{
配列から最大値を探す処理
return max;
関数を呼び出す
}
関数maxof(int a[], int n)
int maxof(int a [], int n)
{
配列から最大値を探す処理
return max;
}
• maxofの引数
– int型配列a:走査する対象の配列
– int型n:配列の大きさ
• maxofの戻り値
– int型:最大値
書き方に注意
関数maxof(int a [], int n)
int maxof(int a[], int n)
{
配列の名前=
int i, max;
先頭のメモリアドレス
max = a[0];
for ( i = 0; i < n; i++)
if ( max < a[i] )
max = a[i];
return max;
}
配列の受け渡し(イメージ)
main
maxof
10
コピー
size
8
5
n
7
x[0] x[1] x[2]
a[0] a[1] a[2]
コピー?
実際の配列の受け渡し方
int main()
{
int size;
char x[3];
size = 3;
x[0] = 8;
x[1] = 5;
x[2] = 7;
printf(“%d\n”, maxof(x, size) );
return 0;
}
int maxof(char a[], int n)
{
int i, max;
max = a[0];
for (i=0; i<n; i++)
if (max < a[i])
return max;
}
配列の受け渡し方を確かめてみよう
ソースファイル
#include <stdio.h>
maxof関数
main関数
呼び出される関数:上部
呼び出す関数:下部
配列の受け渡し(実際)
main
10
maxof
コピー(データ値)
size
0x0012FE00
x
n
コピー(アドレス)
a
型のサイズ
• char型:1バイト
• int型:4バイト
多バイトの配置方法
• インテル(x86系):リトルエンディアン(Little Endian)
• モトローラ:ビッグエンディアン(Big Endian)
char a = 0x89;
int x = 0x12345678;
0
12FE30
1
2
03
12FE40
45
12FE50
87
55
//char型(0x12FE48)
//int型(0x12FE33~0x12FE36)
3
4
5
6
78
56
34
12
26
07
0F
21
CF
7
8
9
A
B
A0 FF
D
27
89 12 50 01
FF
C
54
01 03 05 07 09
E
F
多バイトの配置方法
xは,int型の配列 (サイズ3)で,xの値は0x12FE30とする
(1) x
(2) x[2]
(3) &x[1]
(4) x+2
12FE30
0
1
2
3
78
56
34
12
F0 DE BC 9A
73 46 3A 10
26
07
89 12 50 01
12FE40
45
12FE50
87
55
4
5
0F
CF
6
7
21
FF
8
9
A
B
C
D
54
01 03 05 07 09
E
F