Download : sample-001.c ( utf8 版 )
/* * 2016/10/28 sample-001.c */ /* * 多次元配列 * * 利用方法 * コンパイル * cc -I../include -o sample-001.exe sample-001.c * 実行 * ./sample-001.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; }
$ ./sample-001.exe 2 * 1 = 2 1 * 2 = 2 * 1 が成立 * | 0 1 2 3 ---+--------- 0 | 0 0 0 0 1 | 0 1 2 3 2 | 0 2 4 6 $
Download : sample-002.c ( utf8 版 )
/* * 2016/10/28 sample-002.c */ /* * 集合の操作は操作の集合 * * 利用方法 * コンパイル * cc -I../include -o sample-002.exe sample-002.c * 実行 * ./sample-002.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; }
$ ./sample-002.exe 0 2 4 6 8 1 3 5 7 9 $
Download : sample-003.c ( utf8 版 )
/* * 2016/10/28 sample-003.c */ /* * 文字配列と文字列 (1) * * 利用方法 * コンパイル * cc -I../include -o sample-003.exe sample-003.c * 実行 * ./sample-003.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 ( utf8 版 )
/* * 2016/10/28 sample-004.c */ /* * 文字配列と文字列 (2) * * 利用方法 * コンパイル * cc -I../include -o sample-004.exe sample-004.c * 実行 * ./sample-004.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; }
$ ./sample-004.exe 最初の cary = abcde 文字列の途中の文字を変更すると cary = abAde 文字列を途中で切ると cary = abA 文字列の後ろに文字を追加すると cary = abAXeYZ printf を使わず、文字配列を文字列のように出力すると : abAXeYZと、なります。 文字列 -2075021440 の長さは 7 です。 文字列の途中の文字を削除すると cary = abAeYZ $
Download : sample-005.c ( utf8 版 )
/* * 2016/10/28 sample-005.c */ /* * 配列の要素の参照 * * 利用方法 * コンパイル * cc -I../include -o sample-005.exe sample-005.c * 実行 * ./sample-005.exe */ #include <stdio.h> /* * main * */ #define ARRAY_SIZE 10 int main( int argc, char *argv[] ) { int iary[ARRAY_SIZE]; int i; /* 配列の初期化 */ /* iary[i] = i*i */ for ( i = 0; i < ARRAY_SIZE; i++ ) { iary[i] = i*i; } /* これで、iary は i=0〜9 なら、関数 f(x)=x^2 と同じ振舞いをする */ return 0; }
$ ./sample-005.exe $
Download : sample-010.c ( utf8 版 )
/* * 2016/10/28 sample-010.c */ /* * 様々な配列の要素の参照方法 * * 利用方法 * コンパイル * cc -I../include -o sample-010.exe sample-010.c * 実行 * ./sample-010.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; }
$ ./sample-010.exe 2 * 1 = 2 1 * 2 = 2 * 1 が成立 * | 0 1 2 3 ---+--------- 0 | 0 0 0 0 1 | 0 1 2 3 2 | 0 2 4 6 $
/* * 課題 20161021-02 * * 20161021 20161021-02-QQQQ.c * * 二次元行列型の定義と計算 */ #include <stdio.h> /* * #define A B -> 以後、A が現れると B に置き換えられる */ #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] * * A = ( a_11 a_12 ) = ( a b ) => typedef struct { * a_21 a_22 c d double a; double b; double c; double d; } */ 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]; } } /* typedef struct { double a; double b; double c; double d; }Matrix2D; としていたら、この部分は result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; result.d = a1.d + a2.d; 二次だと大した量ではない これが三次だと、9個になり、四次だと16個になるのだ大変 */ 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 列の内積を計算する */ /* result.a[r][c] = (a1[r][0] a1[r][1]) ( a2[0][c] ) a2[1][c] = a1[r][0]*a2[0][c]+a1[r][1]*a2[1][c] products = a1[r][0]*a2[0][c]+a1[r][1]*a2[1][c]; products = 0.0 +a1[r][0]*a2[0][c] +a1[r][1]*a2[1][c]; products = 0.0 prdoucts = prdoucts + a1[r][0]*a2[0][c] prdoucts = prdoucts + a1[r][1]*a2[1][c] products = 0.0 i=0; prdoucts = prdoucts + a1[r][i]*a2[i][c] i=1; prdoucts = prdoucts + a1[r][i]*a2[i][c] products = 0.0 i=0; prdoucts = prdoucts + a1[r][i]*a2[i][c] i=i+1; prdoucts = prdoucts + a1[r][i]*a2[i][c] i=i+1; */ for ( i = 0; i < DIMENSION; i++ ) { prdoucts = prdoucts + a1[r][i]*a2[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 ) ); /* 差の出力 */ /* ** この部分を完成させなさい */ /* 積の出力 */ /* ** この部分を完成させなさい */ return 0; }
/* * 課題 20161021-03 * * 20161021 20161021-03-QQQQ.c * * 整数型の配列を作り、それに 5 個のデータを入力し * その値を 5 倍にしたものと 2 分の 1 にした値を * それぞれ、画面に出力するプログラムを作りなさい * */ #include <stdio.h> int main(int ac, char *av[]) { int a[5]; /* サイズ 5 の整数型の配列 */ int i; /* 添字変数 i を宣言 */ /* i++ <-> i=i+1 */ for ( i = 0; i < 5; i++ ) { /* 配列 a に数値を読み込む */ printf ( "%d 番目の整数値を入力してください : ", i+1 ); scanf ( "%d", &a[i] ); } /* 入力された個々の値を 5 倍した物を出力 */ for ( i = 0; i < 5; i++ ) { printf ( "%d\n", a[i] * 5 ); /* 5 倍 */ } /* 入力された個々の値を 1/2 した物を出力 */ for ( i = 0; i < 5; i++ ) { printf ( "%d\n", /* q:ここ */ ); /* 2 分の 1 */ } return 0; }
#include <stdio.h> int main(int ac, char *av[]) { int a; /* 三つの変数を宣言 */ int b; int c; printf ( "1 つ目の整数 : " ); scanf ( "%d", &a ); printf ( "2 つ目の整数 : " ); scanf ( "%d", &b ); printf ( "3 つ目の整数 : " ); scanf ( "%d", &c ); if ( a < b ) { if ( b < c ) { printf ( "一番大きいのは %d です\n", c ); } else { printf ( "一番大きいのは %d です\n", b ); } } else { if ( a < c ) { printf ( "一番大きいのは %d です\n", c ); } else { printf ( "一番大きいのは %d です\n", a ); } } return 0; }
#include <stdio.h> int main(int ac, char *av[]) { int v[3]; /* 三つの要素を持つ配列を宣言 */ /* v[0], v[1], v[2] という三つの変数が宣言されたのと同じ */ /* v[i] => 繰り返しと組み合わせで、プログラムが短くなる */ printf ( "1 つ目の整数 : " ); scanf ( "%d", &v[0] ); printf ( "2 つ目の整数 : " ); scanf ( "%d", &v[1] ); printf ( "3 つ目の整数 : " ); scanf ( "%d", &v[2] ); if ( v[0] < v[1] ) { if ( v[1] < v[2] ) { printf ( "一番大きいのは %d です\n", v[2] ); } else { printf ( "一番大きいのは %d です\n", v[1] ); } } else { if ( v[0] < v[2] ) { printf ( "一番大きいのは %d です\n", v[2] ); } else { printf ( "一番大きいのは %d です\n", v[0] ); } } return 0; }
#include <stdio.h> int main(int ac, char *av[]) { int v[3]; /* 三つの要素を持つ配列を宣言 */ /* v[0], v[1], v[2] という三つの変数が宣言されたのと同じ */ /* 配列 v の要素 ( v[0], v[1], v[2] ) を参照する場合は v[整数式] と書けばよい v[1+1] => v[2] v[3-3] => v[0] さらに i=2 v[i-1] => v[2-1] => v[1] 「v[i]」が、「v[0]」になるか、それとも「v[1]」 になるかは、i の値に決まる a=1; 変数 a に必ず 1 が入る v[0]=1 配列 v の最初の要素に 1 が入る v[i]=1 配列 v のどの要素に 1 が入るかは、i 次第 悪し : 判りにくい(どの要素にはいるのかわからない) 良し : どの要素にいれるかを後から決められる 間接参照の利点 */ int i; /* 配列参照するための変数(インデックス[添え字]変数) */ i=0; while ( i < 3 ) { printf ( "%d つ目の整数 : ", i + 1 ); scanf ( "%d", &v[i] ); i=i+1; /* i=1 */ } /* 配列は、同じ型(同じ処理の対象なる物を表現する)変数の並び */ /* 繰り返しと組みあわせて、利用すると良い */ /* 構造体が、順接と組みあせる */ if ( v[0] < v[1] ) { if ( v[1] < v[2] ) { printf ( "一番大きいのは %d です\n", v[2] ); } else { printf ( "一番大きいのは %d です\n", v[1] ); } } else { if ( v[0] < v[2] ) { printf ( "一番大きいのは %d です\n", v[2] ); } else { printf ( "一番大きいのは %d です\n", v[0] ); } } return 0; }
#include <stdio.h> int main(int ac, char *av[]) { int v[3]; /* 三つの要素を持つ配列を宣言 */ /* v[0], v[1], v[2] という三つの変数が宣言されたのと同じ */ /* 配列 v の要素 ( v[0], v[1], v[2] ) を参照する場合は v[整数式] と書けばよい v[1+1] => v[2] v[3-3] => v[0] さらに i=2 v[i-1] => v[2-1] => v[1] 「v[i]」が、「v[0]」になるか、それとも「v[1]」 になるかは、i の値に決まる a=1; 変数 a に必ず 1 が入る v[0]=1 配列 v の最初の要素に 1 が入る v[i]=1 配列 v のどの要素に 1 が入るかは、i 次第 悪し : 判りにくい(どの要素にはいるのかわからない) 良し : どの要素にいれるかを後から決められる 間接参照の利点 */ int i; /* 配列参照するための変数(インデックス[添え字]変数) */ int mi; /* max number index (最大の数が入っている要素の添え字) */ i=0; while ( i < 3 ) { printf ( "%d つ目の整数 : ", i + 1 ); scanf ( "%d", &v[i] ); i=i+1; /* i=1 */ } /* 配列は、同じ型(同じ処理の対象なる物を表現する)変数の並び */ /* 繰り返しと組みあわせて、利用すると良い */ /* 構造体が、順接と組みあせる */ /* 以下は、一番大きい数値を出力する */ /* 配列の場合、一番大きい数値を持つ要素の添え字を考える */ mi=0; /* 最初は、v[0] が一番大きい数をもっていると仮定 */ if ( v[mi] < v[1] ) { /* v[mi] ( = v[0] ) と v[i] を比較 */ mi=1; /* v[0] より v[1] の方が大きいので、mi=0は誤りで、 より正しいのは mi=1 である */ } /* else { mi=0; } は、もともとも mi=0 なので不要 */ if ( v[mi] < v[2] ) { mi=2; } printf ( "一番大きいのは %d です\n", v[mi] ); return 0; }
#include <stdio.h> #define NUMBERS 10 /* 10 個の数の中から最大値を求める */ int main(int ac, char *av[]) { int v[NUMBERS]; int i; /* 配列参照するための変数(インデックス[添え字]変数) */ int mi; /* max number index (最大の数が入っている要素の添え字) */ i=0; while ( i < NUMBERS ) { printf ( "%d つ目の整数 : ", i + 1 ); scanf ( "%d", &v[i] ); i=i+1; /* i=1 */ } /* 配列は、同じ型(同じ処理の対象なる物を表現する)変数の並び */ /* 繰り返しと組みあわせて、利用すると良い */ /* 構造体が、順接と組みあせる */ /* 以下は、一番大きい数値を出力する */ /* 配列の場合、一番大きい数値を持つ要素の添え字を考える */ mi=0; /* 最初は、v[0] が一番大きい数をもっていると仮定 */ i=1; while ( i < NUMBERS ) { if ( v[mi] < v[i] ) { mi=i; } i=i+1; } printf ( "一番大きいのは %d です\n", v[mi] ); return 0; }
#include <stdio.h> /* 構造体では、メンバーとして、基本型(C 言語で予め用意されている 型:例えば、int, char, double, etc..等)の他に、ユーザーが作った 型(例えば、構造体型)も許される。 例 typedef struct { int x; int y; } Point; 点型 typedef struct { Point pt; char name; } NamedPoint; 名前つきの点 !! もちろん、配列もメンバーに含めることができる typedef struct { int x[3]; } Point3D; => 配列も、基本型の配列だけでなく、ユーザ定義の型が使える Point points[10]; Point 型の配列 配列の配列も作れる */ int main(int ac, char *av[]) { int a[3]; /* a[0], a[1], a[2] の三つの要素[変数]を持つ配列 */ int b[3] = { 1,2,3 }; /* 配列の要素の値をまとめて所期化できる */ /* b[0] = 1; b[1] = 2: b[2] = 3: と同じ */ int c[3][2]; /* 配列の配列 */ /* => { c[0], c[1], c[2] } => c[0]={c[0][0], c[0][1]} c[0] はサイズ 2 の整数型の配列 */ /* => { { c[0][0], c[0][1] }. { c[1][0], c[1][1] }. { c[2][0], c[2][1] } } */ /* サイズ 2 の配列を要素とする、 サイズ 3 の配列 */ /* 「実質」、二次元配列 = 行列 c[0][0], c[0][1], c[1][0], c[1][1], c[2][0], c[2][1] の 6 = 2 x 3 の要素を持つ */ */ /* さらに、配列の配列の配列(3 次元の配列)も作れるし、 一般い k 次元の配列が利用できる */ return 0; }
#include <stdio.h> int main(int ac, char *av[]) { int a[5] = { 0, 1, 4, 9, 16 }; /* a[i] = i^2 = i * i */ /* 配列を関数表と利用する : 定義域 0 ... の非負の整数だけ */ int i; for ( i = 0; i < 5; i++ ) { printf ( "a[%d]=%d, %d*%d = %d\n", i, a[i], i, i, i*i ); } return 0; }
#include <stdio.h> /* あたかも、「a = array」となっているかのように見える */ void print5array ( int a[5] ) { int i; for ( i = 0; i < 5; i++ ) { printf ( "a[%d]=%d, %d*%d = %d\n", i, a[i], i, i, i*i ); } } int main(int ac, char *av[]) { int array[5] = { 0, 1, 4, 9, 16 }; /* array[i] = i^2 = i * i */ /* 配列を関数表と利用する : 定義域 0 ... の非負の整数だけ */ print5array ( array ); /* 配列名は、引数に与えることができる */ return 0; }
#include <stdio.h> typedef struct { int array[5]; } Array5; /* 構造体を利用した型では、代入ができる では、配列は ? 見かけは、代入できているように見えるが、実は、違う */ void print5array ( Array5 a ) { int i; for ( i = 0; i < 5; i++ ) { printf ( "a[%d]=%d, %d*%d = %d\n", i, a.array[i], i, i, i*i ); } } int main(int ac, char *av[]) { Array5 a = {{ 0, 1, 4, 9, 16 }}; /* Array5.array[i] = i^2 = i * i */ /* 配列を関数表と利用する : 定義域 0 ... の非負の整数だけ */ print5array ( a ); /* 配列名は、引数に与えることができる */ return 0; }
#include<stdio.h> #define SIZE 100000 int add_2_elements ( int a[SIZE] ) { return a[0] + a[1]; } int main(int ac, char *av[]) { int a[SIZE] = { 1, 2, }; /* 3 っ目以後は省略 */ int i; for ( i = 0; i < 10000; i++ ) { add_2_elements ( a ); /* 無意味に関数を繰り返し呼ぶ */ } return 0; }
#include<stdio.h> #define SIZE 100000 typedef struct { int body[SIZE]; } StructA; int add_2_elements ( StructA a ) { return a.body[0] + a.body[1]; } int main(int ac, char *av[]) { StructA a = {{ 1, 2, }}; /* 3 っ目以後は省略 */ int i; for ( i = 0; i < 10000; i++ ) { add_2_elements ( a ); /* 無意味に関数を繰り返し呼ぶ */ } return 0; }
#include <stdio.h> void sub(int array[3]) { printf ( "array[0] = %d\n", array[0] ); array[0] = 999; printf ( "array[0] = %d\n", array[0] ); } int main(int ac, char *av[]) { int a[3]; a[0] = 10; sub ( a ); printf ( "a[0] = %d\n", a[0] ); return 0; }
#include <stdio.h> typedef struct { int body[3]; } Array3; void sub(Array3 array) { printf ( "array.body[0] = %d\n", array.body[0] ); array.body[0] = 999; printf ( "array.body[0] = %d\n", array.body[0] ); } int main(int ac, char *av[]) { Array3 b; b.body[0] = 10; sub ( b ); printf ( "b.body[0] = %d\n", b.body[0] ); return 0; }
Download : 20161028-01.c ( utf8 版 )
/* * 課題 20161028-01 * * 2016/10/28 20161028-01-QQQQ.c * * 浮動小数点数の配列の要素内の数値の総和を求める。 */ #include <stdio.h> /* * 浮動小数点数の配列の要素内の数値の総和を求める。 * * 利用方法 * コンパイル * cc -o BASENAME.exe 20161028-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
$ ./20161028-01-QQQQ.exe 5 個のデータを入力します。 1 番目の数値を入力してください : 2.300000 2 番目の数値を入力してください : 9.100000 3 番目の数値を入力してください : 5.900000 4 番目の数値を入力してください : 2.700000 5 番目の数値を入力してください : 3.200000 入力されたデータの総和は 23.200000 です。 $
Download : 20161028-02.c ( utf8 版 )
/* * 課題 20161028-02 * * 20161028 20161028-02-QQQQ.c * * 文字列の途中に文字を挿入する * * 利用方法 * コンパイル * cc -o BASENAME.exe 20161028-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
$ ./20161028-02-QQQQ.exe 最初の cary = abcde 'X' を挿入した結果 : abcXde $