Download : sample-001.c ( SJIS 版 )
/* * 2015/10/30 sample-001.c */ /* * 多次元配列 * * 利用方法 * コンパイル * cc -I../include -o BASENAME.exe sample-001.c * 実行 * ./BASENAME.exe */ #include <stdio.h> /* * main * */ int main( int argc, char *argv[] ) { int a[3][4]; /* 二次元配列の宣言 3 x 4 個の変数を宣言 */ /* int a00, a01, .., a03, a10, .., a13, .., a23; と同様 */ int i; int j; a[0][0] = 0; /* 添字は、二つ必要 ( 二次なので.. ) で、0 から始まる */ a[2][3] = 6; /* 添字の大きさは、配列の大きさ - 1 まで */ /* 0 〜 2 と 0 〜 3 のかけ算表をつくってみる */ for ( i = 0; i < 3; i++ ) { for ( j = 0; j < 4; j++ ) { a[i][j] = i * j; } } printf ( "2 * 1 = %d\n", a[2][1] ); /* 2 と表示される筈 */ if ( a[1][2] == a[2][1] ) { /* 1 * 2 = 2 * 1 か ? */ printf ( "1 * 2 = 2 * 1 が成立\n" ); } else { printf ( "1 * 2 = 2 * 1 が成立しない.. 何か変だ..\n" ); } /* 0 〜 2 と 0 〜 3 のかけ算表を画面に表示 */ printf ( " * |" ); for ( j = 0; j < 4; j++ ) { printf ( "%2d", j ); } printf ( "\n" ); printf ( "---+---------\n" ); for ( i = 0; i < 3; i++ ) { printf ( " %1d |", i ); for ( j = 0; j < 4; j++ ) { printf ( "%2d", a[i][j] ); } printf ( "\n" ); } return 0; }
Can not access : program/sample-001.out
Download : sample-002.c ( SJIS 版 )
/* * 2015/10/30 sample-002.c */ /* * 集合の操作は操作の集合 * * 利用方法 * コンパイル * cc -I../include -o BASENAME.exe sample-002.c * 実行 * ./BASENAME.exe */ #include <stdio.h> /* * main * */ #define ARRAY_SIZE 5 /* 配列のサイズを 5 とする */ int main( int argc, char *argv[] ) { int a[ARRAY_SIZE]; /* ARRAY_SIZE の配列の宣言 */ int i; for ( i = 0; i < ARRAY_SIZE; i++ ) { a[i] = 2 * i; /* 一桁の偶数の表を作る */ } /* 偶数を出力 */ for ( i = 0; i < ARRAY_SIZE; i++ ) { printf ( "%d ", a[i] ); } printf ( "\n" ); /* 全ての要素に 1 を加えれば奇数の表になる */ for ( i = 0; i < ARRAY_SIZE; i++ ) { a[i] = a[i] + 1; } /* 奇数を出力 */ for ( i = 0; i < ARRAY_SIZE; i++ ) { printf ( "%d ", a[i] ); } printf ( "\n" ); return 0; }
Can not access : program/sample-002.out
Download : sample-003.c ( SJIS 版 )
/* * 2015/10/30 sample-003.c */ /* * 文字配列と文字列 (1) * * 利用方法 * コンパイル * cc -I../include -o BASENAME.exe sample-003.c * 実行 * ./BASENAME.exe */ #include <stdio.h> /* * main * */ #define CSIZE 10 #define EOS '\0' int main( int argc, char *argv[] ) { char cary[CSIZE]; cary[0] = 'a'; cary[1] = 'b'; cary[2] = 'c'; cary[3] = EOS; /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'c'|EOS| ? | ? | ? | ? | ? | ? | */ printf ( "普通に文字列 \"abc\" を出力してみる : %s\n", "abc" ); /* 文字列を出力する場合の書式は「%s」を利用する */ printf ( "文字列の代りに文字配列を出力してみる : %s\n", cary ); /* 文字列の代りに文字配列名が使える */ return 0; }
$ ./sample-003.exe 普通に文字列 "abc" を出力してみる : abc 文字列の代りに文字配列を出力してみる : abc $
Download : sample-004.c ( SJIS 版 )
/* * 2015/10/30 sample-004.c */ /* * 文字配列と文字列 (2) * * 利用方法 * コンパイル * cc -I../include -o BASENAME.exe sample-004.c * 実行 * ./BASENAME.exe */ #include <stdio.h> /* * main * */ #define CSIZE 10 #define EOS '\0' int main( int argc, char *argv[] ) { char cary[CSIZE] = { 'a', 'b', 'c', 'd', 'e', EOS }; /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'c'|'d'|'e'|EOS| ? | ? | ? | ? | */ int i; int l; /* * 文字列と文字配列 */ printf ( "最初の cary = %s\n", cary ); /* * 文字の変更 */ cary[2] = 'A'; /* 文字列の途中の文字を差し替える */ /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'A'|'d'|'e'|EOS| ? | ? | ? | ? | */ printf ( "文字列の途中の文字を変更すると cary = %s\n", cary ); /* * 文字の尻尾を切断 */ cary[3] = EOS; /* 文字列の後ろを切断 */ /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'A'|EOS|'e'|EOS| ? | ? | ? | ? | */ printf ( "文字列を途中で切ると cary = %s\n", cary ); /* * 文字を尻尾に追加 */ cary[3] = 'X'; cary[5] = 'Y'; cary[6] = 'Z'; cary[7] = EOS; /* 文字列の最後に EOS を忘れずに !! */ /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'A'|'X'|'e'|'Y'|'Z'|EOS| ? | ? | */ printf ( "文字列の後ろに文字を追加すると cary = %s\n", cary ); /* * 文字配列の出力 */ printf ( "printf を使わず、文字配列を文字列のように出力すると : " ); for ( i = 0; cary[i] != EOS; i++ ) { putchar ( cary[i] ); } printf ( "と、なります。\n" ); /* 文字列の長さを求める */ for ( l = 0; cary[l] != EOS; l++ ) { /* やる事は何もない (l を増やす事が目的) */ } /* cary の中の文字列の長さは、変数 l に入る */ printf ( "文字列 %d の長さは %d です。\n", cary, l ); /* * 途中の文字を削除 */ for ( i = 3; cary[i] != EOS; i++ ) { cary[i] = cary[i+1]; } /* 文字列の途中(4 文字目)の文字('X')を削除 */ /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'A'|'X'|'e'|'Y'|'Z'|EOS| ? | ? | | | | / / / / |'a'|'b'|'A'|'e'|'Y'|'Z'|EOS|EOS| ? | ? | */ printf ( "文字列の途中の文字を削除すると cary = %s\n", cary ); return 0; }
Can not access : program/sample-004.out
Download : sample-005.c ( SJIS 版 )
/* * 2015/10/30 sample-005.c */ /* * 文字配列と文字列 (2) * * 利用方法 * コンパイル * cc -I../include -o sample-005.exe sample-005.c * 実行 * ./sample-005.exe */ #include <stdio.h> /* * main * */ #define CSIZE 10 #define EOS '\0' int main( int argc, char *argv[] ) { char cary[CSIZE] = { 'a', 'b', 'c', 'd', 'e', EOS }; /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'c'|'d'|'e'|EOS| ? | ? | ? | ? | */ int i; int l; /* * 文字列と文字配列 */ printf ( "最初の cary = %s\n", cary ); /* * 文字の変更 */ cary[2] = 'A'; /* 文字列の途中の文字を差し替える */ /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'A'|'d'|'e'|EOS| ? | ? | ? | ? | */ printf ( "文字列の途中の文字を変更すると cary = %s\n", cary ); /* * 文字の尻尾を切断 */ cary[3] = EOS; /* 文字列の後ろを切断 */ /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'A'|EOS|'e'|EOS| ? | ? | ? | ? | */ printf ( "文字列を途中で切ると cary = %s\n", cary ); /* * 文字を尻尾に追加 */ cary[3] = 'X'; cary[5] = 'Y'; cary[6] = 'Z'; cary[7] = EOS; /* 文字列の最後に EOS を忘れずに !! */ /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'A'|'X'|'e'|'Y'|'Z'|EOS| ? | ? | */ printf ( "文字列の後ろに文字を追加すると cary = %s\n", cary ); /* * 文字配列の出力 */ printf ( "printf を使わず、文字配列を文字列のように出力すると : " ); for ( i = 0; cary[i] != EOS; i++ ) { putchar ( cary[i] ); } printf ( "と、なります。\n" ); /* 文字列の長さを求める */ for ( l = 0; cary[l] != EOS; l++ ) { /* やる事は何もない (l を増やす事が目的) */ } /* cary の中の文字列の長さは、変数 l に入る */ printf ( "文字列 %d の長さは %d です。\n", cary, l ); /* * 途中の文字を削除 */ for ( i = 3; cary[i] != EOS; i++ ) { cary[i] = cary[i+1]; } /* 文字列の途中(4 文字目)の文字('X')を削除 */ /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'A'|'X'|'e'|'Y'|'Z'|EOS| ? | ? | | | | / / / / |'a'|'b'|'A'|'e'|'Y'|'Z'|EOS|EOS| ? | ? | */ printf ( "文字列の途中の文字を削除すると cary = %s\n", cary ); return 0; }
Can not access : program/sample-005.out
Download : sample-010.c ( SJIS 版 )
/* * 2015/10/30 sample-010.c */ /* * 様々な配列の要素の参照方法 * * 利用方法 * コンパイル * cc -I../include -o BASENAME.exe sample-010.c * 実行 * ./BASENAME.exe */ #include <stdio.h> /* * main * */ int main( int argc, char *argv[] ) { int a[3][4]; /* 二次元配列の宣言 3 x 4 個の変数を宣言 */ /* int a00, a01, .., a03, a10, .., a13, .., a23; と同様 */ int i; int j; a[0][0] = 0; /* 添字は、二つ必要 ( 二次なので.. ) で、0 から始まる */ a[2][3] = 6; /* 添字の大きさは、配列の大きさ - 1 まで */ /* 0 〜 2 と 0 〜 3 のかけ算表をつくってみる */ for ( i = 0; i < 3; i++ ) { for ( j = 0; j < 4; j++ ) { a[i][j] = i * j; } } printf ( "2 * 1 = %d\n", a[2][1] ); /* 2 と表示される筈 */ if ( a[1][2] == a[2][1] ) { /* 1 * 2 = 2 * 1 か ? */ printf ( "1 * 2 = 2 * 1 が成立\n" ); } else { printf ( "1 * 2 = 2 * 1 が成立しない.. 何か変だ..\n" ); } /* 0 〜 2 と 0 〜 3 のかけ算表を画面に表示 */ printf ( " * |" ); for ( j = 0; j < 4; j++ ) { printf ( "%2d", j ); } printf ( "\n" ); printf ( "---+---------\n" ); for ( i = 0; i < 3; i++ ) { printf ( " %1d |", i ); for ( j = 0; j < 4; j++ ) { printf ( "%2d", a[i][j] ); } printf ( "\n" ); } return 0; }
Can not access : program/sample-010.out
/* * 課題 20151023-02 * * 20151023 20151023-02-QQQQ.c * * 二次元行列型の定義と計算 */ #include <stdio.h> /* * */ #define DIMENSION 2 /* 二次元 */ /* * 行列 A は、2 x 2 = 4 の要素をもっている * * A = ( 1 2 ) = ( a[0][0] a[0][1] ) * 3 4 a[1][0] a[1][1] * */ typedef struct { double a[DIMENSION][DIMENSION]; /* 二次元の行列の要素は 2 x 2 */ } Matrix2D; /* Matrix2D 型の宣言 */ /* * Matrix2D make_Matrix2D ( double a, double b, double c, double d ) * 「行列」を作成する * * A = ( a b ) = ( a[0][0], a[0][1] ) * ( c d ) ( a[1][0], a[1][1] ) */ Matrix2D make_Matrix2D ( double a, double b, double c, double d ) { Matrix2D newMatrix2D; /* 新しい行列 */ newMatrix2D.a[0][0] = a; newMatrix2D.a[0][1] = b; newMatrix2D.a[1][0] = c; newMatrix2D.a[1][1] = d; return newMatrix2D; } /* * void print_Matrix2D ( Matrix2D ary ); * 「行列」を表示する (表示の都合上、常に独立した行に出力する) * Matrix2D ary; 二次元行列 */ void print_Matrix2D ( Matrix2D ary ) { int r; /* 行 ( row ) */ int c; /* 列 ( colomun ) */ for ( r = 0; r < DIMENSION; r++ ) { printf ( "(" ); for ( c = 0; c < DIMENSION; c++ ) { printf ( " %10.5f", ary.a[r][c] ); /* * [注意] %10.5f は %f と同じく浮動小数点数を出力するが * 「全体の桁数は 10 桁、小数点数以下は 5 桁にする」 * という「表示上の指定」も加わっている * 詳しくは google で「printf 書式」で検索 */ } printf ( " )\n" ); } } /* * Matrix2D add_Matrix2D ( Matrix2D a1, Matrix2D a2 ); * 「行列」の和 * * ( a b ) + ( e f ) = ( a + e b + f ) * ( c d ) ( g h ) ( c + g g + h ) */ Matrix2D add_Matrix2D ( Matrix2D a1, Matrix2D a2 ) { Matrix2D result; /* 計算結果 */ int r; /* 行 ( row ) */ int c; /* 列 ( colomun ) */ for ( r = 0; r < DIMENSION; r++ ) { for ( c = 0; c < DIMENSION; c++ ) { result.a[r][c] = a1.a[r][c] + a2.a[r][c]; } } return result; } /* * Matrix2D sub_Matrix2D ( Matrix2D a1, Matrix2D a2 ); * 「行列」の差 * * ( a b ) - ( e f ) = ( a - e b - f ) * ( c d ) ( g h ) ( c - g g - h ) */ Matrix2D sub_Matrix2D ( Matrix2D a1, Matrix2D a2 ) { Matrix2D result; /* 計算結果 */ int r; /* 行 ( row ) */ int c; /* 列 ( colomun ) */ for ( r = 0; r < DIMENSION; r++ ) { for ( c = 0; c < DIMENSION; c++ ) { result.a[r][c] = a1.a[r][c] - a2.a[r][c]; } } return result; } /* * Matrix2D mul_Matrix2D ( Matrix2D a1, Matrix2D a2 ); * 「行列」の積 * * ( a b ) ( e f ) = ( a * e + b * g a * f + b * h ) * ( c d ) ( g h ) ( c * e + d * g c * f + d * h ) */ Matrix2D mul_Matrix2D ( Matrix2D a1, Matrix2D a2 ) { Matrix2D result; /* 計算結果 */ int r; /* 行 ( row ) */ int c; /* 列 ( colomun ) */ int i; for ( r = 0; r < DIMENSION; r++ ) { for ( c = 0; c < DIMENSION; c++ ) { double products = 0.0; /* a1 の r 行と a2 の c 列の内積の結果 */ /* a1 の r 行と a2 の c 列の内積を計算する */ for ( i = 0; i < DIMENSION; i++ ) { products = products + a1.a[r][i] * a2.a[i][c]; } result.a[r][c] = products; } } return result; } /* * print_result 演算結果を出力する */ void print_result ( Matrix2D a1, Matrix2D a2, char *operator, Matrix2D a ) \ { printf ( "%s の計算\n", operator ); print_Matrix2D ( a1 ); printf ( " と、 \n" ); print_Matrix2D ( a2 ); printf ( " との、%s は \n", operator ); print_Matrix2D ( a ); printf ( " です。\n\n" ); } /* * main */ int main( int argc, char *argv[] ) { /* a1 = ( 1 2 ) ( 3 -1 ) a2 = ( -3 1 ) ( 1 -2 ) */ Matrix2D a1 = make_Matrix2D ( 1.0, 2.0, 3.0, -1.0 ); Matrix2D a2 = make_Matrix2D ( -3.0, 1.0, 1.0, -2.0 ); /* 和の出力 */ print_result ( a1, a2, "和", add_Matrix2D ( a1, a2 ) ); /* 差の出力 */ print_result ( a1, a2, "差", sub_Matrix2D ( a1, a2 ) ); /* 積の出力 */ /* ** この部分を完成させなさい */ return 0; }
/* * 課題 20151023-01 * * 2015/10/23 20151023-01-QQQQ.c * * 浮動小数点数の配列の要素内の数値の総和を求める。 */ #include <stdio.h> /* * 浮動小数点数の配列の要素内の数値の総和を求める。 * * 利用方法 * コンパイル * cc -o BASENAME.exe 20151023-01-QQQQ.c * 実行 * ./BASENAME.exe */ #include <stdio.h> /* * double dsum ( double ary[], int size ) * 浮動小数点数の配列の要素内の数値の総和を求める関数 * double ary[]; 総和を求める要素を含む配列 * int size; 配列のサイズ */ double dsum ( double ary[], int size ) { double sum = 0.0; /* 総和は最初は 0 */ int i; /* 配列の要素を参照する添字変数 */ for ( i = 0; i < size; i++ ) { /* i = 0 〜 sum - 1 の間.. */ /* ** この部分を完成させなさい */ /* 「sum += ary[i]」とも書きける */ } return sum; /* 結果を返す */ } /* * main */ #define ARY_SIZE 5 int main( int argc, char *argv[] ) { double data[ARY_SIZE]; /* 大きさ ARY_SIZE の配列の宣言 */ int i; /* 配列の要素を参照する添字変数 */ double sum; /* 総和の計算結果を保持する */ printf ( "%d 個のデータを入力します。\n", ARY_SIZE ); for ( i = 0; i < ARY_SIZE; i++ ) { printf ( "%d 番目の数値を入力してください : ", i + 1 ); scanf ( "%lf", &data[i] ); } sum = dsum ( data, ARY_SIZE ); printf ( "入力されたデータの総和は %f です。\n", sum ); return 0; }
#include <stdio.h> #define ARRAY_SIZE 10 int main(void) { int ary[ARRAY_SIZE]; /* サイズが ARRAY_SIZE は整数型変数の配列 */ /* 整数配列 */ int i; /* 配列は、for 文相性がよく、添字で参照 */ /* ary[i] = i*i となるように初期化 */ for ( i = 0; i < ARRAY_SIZE; i++ ) { ary[i] = i*i; } /* この結果、ary[] は、i=0 〜 9 の時に関数 f(x)=x^2 と同じ振舞をする*/ /* 出力 */ printf ( "添字 値\n" ); for ( i = 0; i < ARRAY_SIZE; i++ ) { printf ( "%d %d\n", i, ary[i] ); } return 0; }
#include <stdio.h> #define ARRAY_SIZE 10 int main(void) { int ary[ARRAY_SIZE]; /* サイズが ARRAY_SIZE は整数型変数の配列 */ /* 整数配列 */ int i; /* 配列は、for 文相性がよく、添字で参照 */ /* ary[i] = i*i となるように初期化 */ for ( i = 0; i < ARRAY_SIZE; i++ ) { ary[i] = i*i; } /* この結果、ary[] は、i=0 〜 9 の時に関数 f(x)=x^2 と同じ振舞をする*/ /* 出力 */ printf ( "添字 値\n" ); for ( i = 0; i < ARRAY_SIZE; i++ ) { printf ( "%d %d\n", i, ary[i] ); } /* 配列名に * をつけると .. 配列の先頭の要素を「表現」する */ /* 「要素」=「配列は、変数の集まりで、その要素なので、変数 */ /* 実質 *ary は ary[0] と同じ意味 */ printf ( "*ary = %d\n", *ary ); /* cf 文字列に * をつけると、先頭の文字が取り出せた */ printf ( "*\"abc\" = %c, \"abc\"[0] =%c\n", *"abc", "abc"[0] ); /* *ary == *(ary + 0) == ary[0] */ /* *(ary + 1) == ary[1] */ /* *(ary + i) == ary[i] */ printf ( "添字 値[添字] 間接参照\n" ); for ( i = 0; i < ARRAY_SIZE; i++ ) { printf ( "%d %d %d\n", i, ary[i], *(ary+i) ); } return 0; }
#include <stdio.h> #define ARRAY_SIZE 10 int main(void) { int ary[ARRAY_SIZE]; /* サイズが ARRAY_SIZE は整数型変数の配列 */ /* 整数配列 */ int i; /* 配列は、for 文相性がよく、添字で参照 */ /* ary[i] = i*i となるように初期化 */ for ( i = 0; i < ARRAY_SIZE; i++ ) { ary[i] = i*i; } /* ary(x) = x^2 */ /* この結果、ary[] は、i=0 〜 9 の時に関数 f(x)=x^2 と同じ振舞をする*/ /* 出力 */ printf ( "添字 値\n" ); for ( i = 0; i < ARRAY_SIZE; i++ ) { printf ( "%d %d\n", i, ary[i] ); } /* 配列名に * をつけると .. 配列の先頭の要素を「表現」する */ /* 「要素」=「配列は、変数の集まりで、その要素なので、変数 */ /* 実質 *ary は ary[0] と同じ意味 */ printf ( "*ary = %d\n", *ary ); /* cf 文字列に * をつけると、先頭の文字が取り出せた */ printf ( "*\"abc\" = %c, \"abc\"[0] =%c\n", *"abc", "abc"[0] ); /* *ary == *(ary + 0) == ary[0] */ /* *(ary + 1) == ary[1] */ /* *(ary + i) == ary[i] */ printf ( "添字 値[添字] 間接参照\n" ); for ( i = 0; i < ARRAY_SIZE; i++ ) { printf ( "%d %d %d\n", i, ary[i], *(ary+i) ); } /* */ ary[5] = 5 * 5 * 5; /* わざと違う値に.. */ printf ( "添字 値[添字] 間接参照\n" ); for ( i = 0; i < ARRAY_SIZE; i++ ) { printf ( "%d %d %d\n", i, ary[i], *(ary+i) ); } /* */ *(ary+5) = 5 * 5; /* ary[5] = 5 * 5 と同じ (元に戻す) */ printf ( "添字 値[添字] 間接参照\n" ); for ( i = 0; i < ARRAY_SIZE; i++ ) { printf ( "%d %d %d\n", i, ary[i], *(ary+i) ); } /* */ printf ( "%d\n", 5[ary] ); /* 5[ary] == *(5+ary) = *(ary+5) == ary[5] */ printf ( "%c\n", 2["abcdefg"] ); /* */ return 0; }
#include <stdio.h> #define ARRAY_SIZE 10 void print_ary(int ary[ARRAY_SIZE]) { int i; /*添字の変数は main のそれとは無関係なので関数内で宣言*/ /* 出力 */ printf ( "添字 値\n" ); for ( i = 0; i < ARRAY_SIZE; i++ ) { printf ( "%d %d\n", i, ary[i] ); } } int main(void) { int ary[ARRAY_SIZE]; /* サイズが ARRAY_SIZE は整数型変数の配列 */ /* 整数配列 */ int i; /* 配列は、for 文相性がよく、添字で参照 */ /* ary[i] = i*i となるように初期化 */ for ( i = 0; i < ARRAY_SIZE; i++ ) { ary[i] = i*i; } print_ary ( ary ); /* 引数 ary, ary[] ary[ARRAY_SIZE] */ /* 「配列」を利用する関数を作る場合 仮引数の宣言は、「とりあえず」共有する配列と同じ表現が使える 実引数は、「配列名」を指定する 「配列名」は、* をつけると、「変数」変る「値」 「値」は、関数に渡したり、関数の値にできる */ return 0; }
#include <stdio.h> #define ARRAY_SIZE_1 10 #define ARRAY_SIZE_2 20 void print_ary(int ary[], int size) { int i; /*添字の変数は main のそれとは無関係なので関数内で宣言*/ /* 出力 */ printf ( "添字 値\n" ); for ( i = 0; i < size; i++ ) { printf ( "%d %d\n", i, ary[i] ); } } int main(void) { int ary1[ARRAY_SIZE_1]; /* サイズが ARRAY_SIZE は整数型変数の配列 */ /* 整数配列 */ int ary2[ARRAY_SIZE_2]; /* サイズが ARRAY_SIZE は整数型変数の配列 */ /* 整数配列 */ int i; /* 配列は、for 文相性がよく、添字で参照 */ /* ary[i] = i*i となるように初期化 */ for ( i = 0; i < ARRAY_SIZE_1; i++ ) { ary1[i] = i*i; } for ( i = 0; i < ARRAY_SIZE_2; i++ ) { ary2[i] = i*i*i; } print_ary ( ary1, ARRAY_SIZE_1 ); /* 引数 ary, ary[] ary[ARRAY_SIZE] */ print_ary ( ary2, ARRAY_SIZE_2 ); /* 配列を関数と共有するには、 配列名と、配列のサイズを別に渡す必要がある */ print_ary ( ary2, ARRAY_SIZE_1 ); /* 「配列」を利用する関数を作る場合 仮引数の宣言は、「とりあえず」共有する配列と同じ表現が使える 実引数は、「配列名」を指定する 「配列名」は、* をつけると、「変数」に変る「値」 「値」は、関数に渡したり、関数の値にできる */ return 0; }
#include <stdio.h> typedef struct { int x; int y; int z; } Pint3D; void print3D ( Point3D pt ) { printf ( "(%d, %d, %d)", pt.x, pt.y, pt.z ); } int main(void) { Point3D p1; p1.x = 1; p1.y = 2; p1.z = 3; print3D ( pt ); }
#include <stdio.h> /* 10 個の整数値を入力して、その総和を求める この時、main 関数で、この数値を配列に保存し、 関数をつかって、この数値の総和を求める */ #define DATA_SIZE 10 int isum ( int ary[], int size ) { int i; int sum = 0; /* 総和の結果を保存 */ for ( i = 0; i < size; i++ ) { /* i++ <-> i = i + 1 */ sum = sum + ary[i]; /* sum += ary[i] */ /* 引数 (ary) 値を利用して、配列の要素の値を参照 */ } return sum; } int main(void) { int data[DATA_SIZE]; /* 入力するデータ値を保存する配列 */ int i; /* データの入力 */ for ( i = 0; i < DATA_SIZE; i++ ) { printf ( "第 %d 番目の数値を入力してください : ", i + 1 ); scanf ( "%d", &data[i] ); } printf ( "全体の総和は %d です\n", isum ( data, DATA_SIZE ) ); return 0; }
#include <stdio.h> /* 10 個の整数値を入力して、その総和を求める この時、main 関数で、この数値を配列に保存し、 関数をつかって、この数値の総和を求める */ #define DATA_SIZE 10 int isum ( int ary[], int size ) { int i; int sum = 0; /* 総和の結果を保存 */ for ( i = 0; i < size; i++ ) { /* i++ <-> i = i + 1 */ sum = sum + ary[i]; /* sum += ary[i] */ /* 引数 (ary) 値を利用して、配列の要素の値を参照 */ } return sum; } void input_array ( int ary[], int size ) { int i; for ( i = 0; i < size; i++ ) { printf ( "第 %d 番目の数値を入力してください : ", i + 1 ); scanf ( "%d", &ary[i] ); /* 引数 (ary) 値を利用して、配列の要素そのものを参照 */ } } int main(void) { int data[DATA_SIZE]; /* 入力するデータ値を保存する配列 */ int i; /* データの入力 */ input_array ( data, DATA_SIZE ); /* 関数の中で、main の変数の内容を書き換える事ができてしまう */ printf ( "全体の総和は %d です\n", isum ( data, DATA_SIZE ) ); return 0; }
#include <stdio.h> typedef struct { int x; int y; int z; } Point3D; void print3D ( Point3D pt ) { printf ( "(%d, %d, %d)\n", pt.x, pt.y, pt.z ); } void scan3D ( Point3D pt ) { scanf ( "%d", &pt.x ); scanf ( "%d", &pt.y ); scanf ( "%d", &pt.z ); printf ( "scan3D\n" ); print3D ( pt ); } int main(void) { Point3D pt; pt.x = 1; pt.y = 2; pt.z = 3; printf ( "main 1:\n" ); print3D ( pt ); printf ( "main 2:\n" ); scan3D ( pt ); printf ( "main 3:\n" ); print3D ( pt ); return 0; }
#include <stdio.h> void set_simple ( int v ) { printf ( "元の値 : %d\n", v ); v = 1111; /* 値を変更 */ printf ( "変更後 : %d\n", v ); } void set_one_array ( int v[] ) { printf ( "元の値 : %d\n", v[0] ); v[0] = 2222; /* 値を変更 */ printf ( "変更後 : %d\n", v[0] ); } int main(void) { int i; int a[1]; i = 1; printf ( "呼ぶ前 %d\n", i ); set_simple ( i ); printf ( "呼んだ後 %d\n", i ); a[0] = 2; printf ( "呼ぶ前 %d\n", a[0] ); set_one_array ( a ); printf ( "呼んだ後 %d\n", a[0] ); return 0; }
#include <stdio.h> /* * 一つの配列の内容を、他の配列に複写する */ void array_copy ( int dst[], int src[], int size ) { int i; for ( i = 0; i < size; i++ ) { dst[i] = src[i]; } } typedef struct { int arry[10]; } Ary10; int main(void) { Ary10 a; Ary10 b; int A[10]; int B[10]; a = b; for ( i = 0; i < 10; i++ ) { A[i] = B[i]; } }
#include <stdio.h> /* 文字配列と文字列 文字配列=「文字型の『変数』の集まり」 文字列=「文字の並びで、最期にEOS('\0')」 */ int main(void) { printf ( "abc\n" ); printf ( "AAA%sBBB\n", "abc" ); return 0; }
#include <stdio.h> /* 文字配列と文字列 文字配列=「文字型の『変数』の集まり」 文字列=「文字の並びで、最期にEOS('\0')」 */ #define EOS '\0' int main(void) { char abc[4]; abc[0] = 'a'; abc[1] = 'b'; abc[2] = 'c'; abc[3] = EOS; /* abc <- { 'a', 'b', 'c', '\0' } */ printf ( "AAA%sBBB\n", abc ); printf ( "AAA%sBBB\n", "abc" ); /* 文字配列を利用して、文字列操作が可能になる */ abc[1] = 'B'; printf ( "AAA%sBBB\n", abc ); abc[1] = EOS; printf ( "AAA%sBBB\n", abc ); abc[1] = 'X'; abc[2] = EOS; printf ( "AAA%sBBB\n", abc ); return 0; }
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
なお「名前(P,Q,R,..)」の部分が同じ所には同じものが入ります。
Download : 20151030-01.c ( SJIS 版 )
/* * 課題 20151023-01 * * 2015/10/23 20151023-01-QQQQ.c * * 浮動小数点数の配列の要素内の数値の総和を求める。 */ #include <stdio.h> /* * 浮動小数点数の配列の要素内の数値の総和を求める。 * * 利用方法 * コンパイル * cc -o BASENAME.exe 20151023-01-QQQQ.c * 実行 * ./BASENAME.exe */ #include <stdio.h> /* * double dsum ( double ary[], int size ) * 浮動小数点数の配列の要素内の数値の総和を求める関数 * double ary[]; 総和を求める要素を含む配列 * int size; 配列のサイズ */ double dsum ( double ary[], int size ) { double sum = 0.0; /* 総和は最初は 0 */ int i; /* 配列の要素を参照する添字変数 */ for ( i = 0; i < size; i++ ) { /* i = 0 〜 sum - 1 の間.. */ /* ** この部分を完成させなさい */ /* 「sum += ary[i]」とも書きける */ } return sum; /* 結果を返す */ } /* * main */ #define ARY_SIZE 5 int main( int argc, char *argv[] ) { double data[ARY_SIZE]; /* 大きさ ARY_SIZE の配列の宣言 */ int i; /* 配列の要素を参照する添字変数 */ double sum; /* 総和の計算結果を保持する */ printf ( "%d 個のデータを入力します。\n", ARY_SIZE ); for ( i = 0; i < ARY_SIZE; i++ ) { printf ( "%d 番目の数値を入力してください : ", i + 1 ); /* ** この部分を完成させなさい */ } sum = dsum ( data, ARY_SIZE ); printf ( "入力されたデータの総和は %f です。\n", sum ); return 0; }
2.3 9.1 5.9 2.7 3.2
$ ./20151030-01-QQQQ.exe 5 個のデータを入力します。 1 番目の数値を入力してください : 2.300000 2 番目の数値を入力してください : 9.100000 3 番目の数値を入力してください : 5.900000 4 番目の数値を入力してください : 2.700000 5 番目の数値を入力してください : 3.200000 入力されたデータの総和は 23.200000 です。 $
Download : 20151030-02.c ( SJIS 版 )
/* * 課題 20151023-02 * * 20151023 20151023-02-QQQQ.c * * 文字列の途中に文字を挿入する * * 利用方法 * コンパイル * cc -o BASENAME.exe 20151023-02-QQQQ.c * 実行 * ./BASENAME.exe */ #include <stdio.h> /* * */ /* * main * */ #define CSIZE 10 #define EOS '\0' int main( int argc, char *argv[] ) { char cary[CSIZE] = { 'a', 'b', 'c', 'd', 'e', EOS }; /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'c'|'d'|'e'|EOS| ? | ? | ? | ? | */ int i; int l; printf ( "最初の cary = %s\n", cary ); /* 文字列 "abcde" の入った文字配列 cary の 3 文字目 ('c') と 4 文字目 'd' の間に、一文字 'X' を入れる */ /* 文字列の長さを求める */ /* ** この部分を完成させなさい */ /* cary の中の文字列の長さは、変数 l に入る */ for ( i = l; 3 <= i; i-- ) { /* 後ろからコピーする必要がある */ /* ** この部分を完成させなさい */ } cary[3] = 'X'; /* 空けた場所に 'X' を入れる */ /* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cary|'a'|'b'|'c'|'d'|'e'|EOS| ? | ? | ? | ? | | | | \ \ \ cary|'a'|'b'|'c'|'X'|'d'|'e'|EOS| ? | ? | ? | ? | */ printf ( "'X' を挿入した結果 : %s\n", cary ); return 0; }
123 987 456
$ ./20151030-02-QQQQ.exe 最初の cary = abcde 'X' を挿入した結果 : abcXde $