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 $