当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/* * 2011/11/18 sample-001.c */ /* * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ void print_a ( int a0, int a1, int a2 ) { /* f.a0 +----+ | 0 | <- m.a0 の値が copy f.a1 +----+ | 1 | <- m.a1 の値が copy f.a2 +----+ | 2 | <- m.a2 の値が copy +----+ main の a1 (m.a1) と print_a の a1(f.a1) は 別の物 */ /* a0 */ s_print_string ( "a0=" ); s_print_int ( a0 ); // f.a0 の値だが m.a0 と同じ 0 が表示 s_print_newline(); /* a1 */ s_print_string ( "a1=" ); s_print_int ( a1 ); s_print_newline(); /* a2 */ s_print_string ( "a2=" ); s_print_int ( a2 ); s_print_newline(); } /* * */ int main ( void ) { int a0 = 0; /* int ( 4byte) a0 +----+ + 0 + +----+ */ int a1 = 1; /* a1 +----+ + 1 + +----+ */ int a2 = 2; /* a2 +----+ + 2 + +----+ */ print_a ( a0, a1, a2 ); /* f.a0 +----+ | 0 | <- m.a0 の値が copy f.a1 +----+ | 1 | <- m.a1 の値が copy f.a2 +----+ | 2 | <- m.a2 の値が copy +----+ */ return 0; } /* * */
C:\usr\c\> sample-001 a0=0 a1=1 a2=2 C:\usr\c\>
Download : sample-002.c ( SJIS 版 )
/* * 2011/11/18 sample-002.c */ /* * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ void print_a ( int a0, int a1, int a2 ) { /* f.a0 +----+ | 0 | <- m.a0 の値が copy f.a1 +----+ | 1 | <- m.a1 の値が copy f.a2 +----+ | 2 | <- m.a2 の値が copy +----+ */ int *pa = &a0; /* int * pa +----+ int | +---->f.a0 +----+ +----+ | 0 | <- m.a0 の値が copy pa+1 ----> f.a1 +----+ | 1 | <- m.a1 の値が copy pa+2 ---> f.a2 +----+ | 2 | <- m.a2 の値が copy +----+ */ int i; for ( i = 0; i < 3; i++ ) { s_print_string ( "a" ); s_print_int ( i ); s_print_string ( "=" ); s_print_int ( pa[i] ); /* pa[i] == *(pa + i) pa + i == pa の番地から 同じ型の変数の サイズ i 個先 cf. pa + 0 == 0 個先なので pa と同じ &a0 pa + 1 == 1 個先なので &a1 と同じ pa + 2 == 2 個先なので &a2 と同じ pa[0] == *(pa + 0) == *(&a0) == a0 pa[1] == *(pa + 1) == *(&a1) == a1 pa[2] == *(pa + 2) == *(&a2) == a2 */ s_print_newline(); } } /* * */ int main ( void ) { int a0 = 0; int a1 = 1; int a2 = 2; print_a ( a0, a1, a2 ); return 0; } /* * */
C:\usr\c\> sample-002 a0=0 a1=1 a2=2 C:\usr\c\>
Download : sample-003.c ( SJIS 版 )
/* * 2011/11/18 sample-003.c */ /* * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ void print_a ( int pa[] ) { /* int *pa と書いてもよい */ int i; for ( i = 0; i < 3; i++ ) { s_print_string ( "a" ); s_print_int ( i ); s_print_string ( "=" ); s_print_int ( pa[i] ); s_print_newline(); } } /* * */ int main ( void ) { int aa[3] = { 0, 1, 2 }; /* 配列の初期化 */ /* int aa[3]; '=, int aa[0], int aa[1], int aa[2]; int aa, aa[0] +---+ | 0 | aa[1] +---+ | 1 | aa[2] +---+ | 2 | +---+ cf. int a0, a1, a2; int a0 +---+ | 0 | a1 +---+ | 1 | a2 +---+ | 2 | +---+ aa[3] = { 0, 1, 2 }; aa[0] = 0; aa[1] = 1; aa[2] = 2; // この配列のまとめ代入は初期化の時しか使えない */ /* 途中で aa = { 3, 4, 5}; などとはできない。 */ print_a ( aa ); /* 配列名のみ */ /* int[] == int * pa +----+ | *----> aa aa[0] +----+ +----+ | 0 | +----+ aa という配列名が、&aa[0] の値を持つ print_a ( aa ); の代わりに print_a ( &aa[0] ); としてもよい &aa[0] == &(aa[0])== &(*(aa+0)) = &(*aa) = (&*)aa == aa cf. *(&a) == a ( 任意の変数で成立 ) &(*a) == a ( a がポインターの時に成立 ) */ /* もし、 print_a ( aa[0], aa[1], aa[2] ); としたら、前と同じ ( 配列としての旨味はない ) */ return 0; } /* * */
C:\usr\c\> sample-003 a0=0 a1=1 a2=2 C:\usr\c\>
Download : sample-004.c ( SJIS 版 )
/* * 2011/11/18 sample-004.c */ /* * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ int main ( void ) { int a0; int a1; int a2; a0 = 0; a1 = 1; a2 = a0 - a1; s_print_string ( "a2 = " ); s_print_int ( a2 ); s_print_newline(); return 0; } /* * */
C:\usr\c\> sample-004 a2 = -1 C:\usr\c\>
Download : sample-005.c ( SJIS 版 )
/* * 2011/11/18 sample-005.c */ /* * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ int main ( void ) { int a[3]; a[0] = 0; a[1] = 1; a[2] = a[0] - a[1]; s_print_string ( "a[2] = " ); s_print_int ( a[2] ); s_print_newline(); /* * sizeof */ s_print_string ( "sizeof int = " ); s_print_int ( sizeof(int) ); s_print_newline(); s_print_string ( "sizeof a = " ); s_print_int ( sizeof(a) ); s_print_newline(); return 0; } /* * */
C:\usr\c\> sample-005 a[2] = -1 sizeof int = 4 sizeof a = 12 C:\usr\c\>
Download : sample-006.c ( SJIS 版 )
/* * 2011/11/18 sample-006.c */ /* * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ int main ( void ) { int a[3]; int i; for ( i = 0; i < 3; i++ ) { /* for ( i = 1; i <= 3; i++ ) { */ a[2-i] = i; /* a[2-i] == *(a + (2-i)) == *(a+2 -i) */ } for ( i = 0; i < 3; i++ ) { s_print_string ( "a[" ); s_print_int ( i ); s_print_string ( "]=" ); s_print_int ( a[i] ); s_print_newline(); } return 0; } /* * */
C:\usr\c\> sample-006 a[0]=2 a[1]=1 a[2]=0 C:\usr\c\>
Download : sample-007.c ( SJIS 版 )
/* * 2011/11/18 sample-007.c */ /* * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ #define ARRAY_SIZE 3 /* * */ void print_a ( int pa[] ) { int i; for ( i = 0; i < ARRAY_SIZE; i++ ) { /* 配列のサイズは解らないで 3 で試すと.. */ s_print_string ( "a" ); s_print_int ( i ); s_print_string ( "=" ); s_print_int ( pa[i] ); s_print_newline(); } } /* * */ int main ( void ) { int dummy01 = -1000; int aa[2] = { 10, 20 }; /* 配列の初期化/サイズは 2 */ int dummy02 = -2000; /* dummy01 +------+ |-1000 | aa aa[0]+------+ <- aa = &aa[0] | 10 | aa[1]+------+ | 20 | dummy02 +------+ <= aa[2] |-2000 | +------+ */ print_a ( aa ); /* 配列名のみ */ return 0; } /* * */
C:\usr\c\> sample-007 a0=10 a1=20 a2=-2000 C:\usr\c\>
Download : sample-008.c ( SJIS 版 )
/* * 2011/11/18 sample-008.c */ /* * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ #define ARRAY_SIZE 3 /* * */ void print_a ( int pa[] ) { int i; for ( i = 0; i < ARRAY_SIZE; i++ ) { /* 定数を利用する */ s_print_string ( "a" ); s_print_int ( i ); s_print_string ( "=" ); s_print_int ( pa[i] ); s_print_newline(); } } /* * */ int main ( void ) { int aa[ARRAY_SIZE] = { 1, 20, 300 }; print_a ( aa ); /* 配列名のみ */ return 0; } /* * */
C:\usr\c\> sample-008 a0=1 a1=20 a2=300 C:\usr\c\>
Download : sample-009.c ( SJIS 版 )
/* * 2011/11/18 sample-009.c */ /* * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ #define ARRAY_SIZE 3 typedef int int3D[ARRAY_SIZE]; /* 配列のサイズが記録される */ /* * */ void print_a ( int3D pa ) { int i; for ( i = 0; i < sizeof(int3D)/sizeof(int); i++ ) { s_print_string ( "a" ); s_print_int ( i ); s_print_string ( "=" ); s_print_int ( pa[i] ); s_print_newline(); } } /* * */ int main ( void ) { int3D aa = { 1, 20, 300 }; /* int3D 型の変数 */ print_a ( aa ); return 0; } /* * */
C:\usr\c\> sample-009 a0=1 a1=20 a2=300 C:\usr\c\>
Download : sample-010.c ( SJIS 版 )
/* * 2011/11/18 sample-010.c */ /* * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ #define ARRAY_SIZE 3 /* * */ void print_a ( int pa[], int size ) { int i; for ( i = 0; i < size; i++ ) { s_print_string ( "a" ); s_print_int ( i ); s_print_string ( "=" ); s_print_int ( pa[i] ); s_print_newline(); } } /* * */ int main ( void ) { int aa[ARRAY_SIZE] = { 1, 20, 300 }; /* int3D 型の変数 */ print_a ( aa, ARRAY_SIZE ); return 0; } /* * */
C:\usr\c\> sample-010 a0=1 a1=20 a2=300 C:\usr\c\>
Download : sample-011.c ( SJIS 版 )
/* * 2011/11/18 sample-010.c */ /* * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ void print_a ( int pa[], int size ) { int i; for ( i = 0; i < size; i++ ) { /* 配列のサイズを引数で別に指定する */ s_print_string ( "a" ); s_print_int ( i ); s_print_string ( "=" ); s_print_int ( pa[i] ); s_print_newline(); } } /* * */ int main ( void ) { int aa1[2] = { 10, 20 }; int aa2[4] = { 100, 200, 300, 400 }; s_print_string ( "aa1[2]\n" ); print_a ( aa1, 2 ); s_print_string ( "aa2[4]\n" ); print_a ( aa2, 4 ); s_print_string ( "aa2[3]\n" ); print_a ( aa2, 3 ); s_print_string ( "aa2[3]\n" ); print_a ( aa2 + 1, 2 ); /* aa2 はポインター値なので計算もできる */ /* aa2 + 1 = &aa2[1] .. 二つめの要素から二つ表示 */ /* pa == &aa2[1] pa[0] = *(pa+0) = *( &aa2[1] + 0 ) = *&(aa2[1]) = aa2[1] pa[1] = *(pa+1) = *( &aa2[1] + 1 ) = *&(*(aa2+1+1)) = aa2[2] */ return 0; } /* * */
C:\usr\c\> sample-011 aa1[2] a0=10 a1=20 aa2[4] a0=100 a1=200 a2=300 a3=400 aa2[3] a0=100 a1=200 a2=300 aa2[3] a0=200 a1=300 C:\usr\c\>
Download : 20111118-01.c ( SJIS 版 )
/* * 20111118-1-QQQQ.c */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * 5 個の整数値をキーボードから入力し、それを逆順に出す */ #define DATA_SIZE 5 /* * */ int main ( void ) { int data[ DATA_SIZE ]; /* int 型, サイズ 5 の配列 data を宣言 */ int i; for ( i = 0; i < DATA_SIZE; i++ ) { s_print_int ( i ); s_print_string ( "番目の数値 = " ); data[i] = s_input_int(); } /* ** 入力されたデータを逆順に出力 */ for ( i = 0; i < DATA_SIZE; i++ ) { s_print_int ( i ); s_print_string ( "番目の数値 = " ); /* ** この部分を完成させなさい */ s_print_newline(); } return 0; } /* * */
100 3 84 90 123
C:\usr\c\> 01< 01.in 0番目の数値 = 100 1番目の数値 = 3 2番目の数値 = 84 3番目の数値 = 90 4番目の数値 = 123 0番目の数値 = 123 1番目の数値 = 90 2番目の数値 = 84 3番目の数値 = 3 4番目の数値 = 100 C:\usr\c\>
Download : 20111118-02.c ( SJIS 版 )
/* * 20111118-2-QQQQ.c */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * 配列の n 個の要素の総和を求める * sum_n */ int sum_n ( int array[], int size ) { int sum = 0; int i; for ( i = 0; i < size; i++ ) { /* ** この部分を完成させなさい */ } return sum; } #define DATA_SIZE 5 /* * */ int main ( void ) { int data[ DATA_SIZE ]; /* int 型, サイズ 5 の配列 data を宣言 */ for ( i = 0; i < DATA_SIZE; i++ ) { s_print_int ( i ); s_print_string ( "番目の数値 = " ); data[i] = s_input_int(); } s_print_string ( "0 〜 4 までの総和 = " ); s_print_int ( sum_n ( data, 5 ) ); s_print_newline(); s_print_string ( "1 〜 3 までの総和 = " ); /* ** この部分を完成させなさい */ s_print_newline(); return 0; } /* * */
100 3 84 90 123
C:\usr\c\> 02< 02.in 0番目の数値 = 100 1番目の数値 = 3 2番目の数値 = 84 3番目の数値 = 90 4番目の数値 = 123 0 〜 4 までの総和 = 400 1 〜 3 までの総和 = 177 C:\usr\c\>