応用プログラミング 第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
© Copyright 2025 ExpyDoc