Download : sample-001.c ( SJIS 版 )
/*
 * 2014/10/10 sample-001.c
 */
/*
 *  複素数型の定義と計算
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-001.c
 *		実行
 *			BASENAME
 */
#include <stdio.h>
/*
 *	複素数型を表す Complex の定義
 *
 *		複素数 z は、二つの実数 x, y を用いて
 *			   z = x + yi ( i は虚数単位 )
 *		と表現できる。
 *			C 言語では実数を表すのに浮動小数点数型の double を用いる
 *				型名 ( Complex ) を大文字で始めるのは「ソフトウェア概論ルール」
 */
typedef struct {
	double real;			/* 実部 */
	double imaginary;		/* 虚部 */
} Complex;					/* 複素数型 */
/*
 *	Complex make_Complex ( double x, double y )
 *		Complex 型の数を作り、返す
 *			x, y -> z = x + yi
 */
Complex make_Complex ( double x, double y ) {
	Complex newComplex;		/* 新しく作られる複素数 */
	newComplex.real = x;	/* 新しく作られた複素数の実部は x */
	newComplex.imaginary = y;	/* 新しく作られた複素数の実部は y */
	return newComplex;		/* 新しく作られる複素数を値として返す */
}
/*
 *	double real_part ( Complex z )
 *		Complex 型の数の実部を返す
 *			z = x + yi -> x
 */
double real_part ( Complex z ) {
	return z.real;
}
/*
 *	double imaginary_part ( Complex z )
 *		Complex 型の数の実部を返す
 *			z = x + yi -> x
 */
double imaginary_part ( Complex z ) {
	return z.imaginary;
}
/*
 *	print_Complex ( Complex z )
 *		Complex 型の数の出力
 *			z = x + y i だが、y < 0 の時は z = x - (-y) i となるように工夫
 */
void print_Complex ( Complex z ) {
	if ( z.imaginary > 0 ) {
		printf ( "%f + %f i", z.real, z.imaginary );
	} else {
		printf ( "%f - %f i", z.real, - z.imaginary );
	}
}
/*
 *	Complex add_Complex ( Complex z1, Complex z2 )
 *		Complex 型の数の足し算
 *			z1 = x1 + y1 i
 *			z2 = x2 + y2 i
 *				-> z1 + z2 = ( x1 + x2 ) + ( y1 + y2 ) i
 */
Complex add_Complex ( Complex z1, Complex z2 ) {
	Complex result;
		/* 複素数の和の実部は、実部の和 */
	result.real = z1.real + z2.real;
		/* 複素数の和の虚部は、虚部の和 */
	result.imaginary = z1.imaginary + z2.imaginary;
	return result;
}
/*
 *	main
 */
int main( int argc, char *argv[] )
{
	Complex z1 = make_Complex ( 2.0, 3.0 );	/* z1 = 2 + 3i */
	Complex z2 = make_Complex ( -1.0, 5.0 ); /* z2 = -1 + 5i */
	Complex z3;
	printf ( " z1 ( = " );
	print_Complex ( z1 );
	printf ( " ) と、" );
	printf ( " z2 ( = " );
	print_Complex ( z2 );
	printf ( " ) の和は 、\n" );
	z3 = add_Complex ( z1, z2 );		/* z3 <- z1 + z2 */
	print_Complex ( z3 );
	printf ( " です。\n" );
	return 0;
}
C:\usr\c>sample-001
z1 ( = 2.000000 + 3.000000 i ) と、 z2 ( = -1.000000 + 5.000000 i ) \
    の和は 、
1.000000 + 8.000000 i です。
C:\usr\c> 
Download : sample-002.c ( SJIS 版 )
/*
 * 2014/10/10 sample-002.c
 */
/*
 *	二次元行列型の定義と計算
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-002.c
 *		実行
 *			BASENAME
 */
#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;
}
/*
 *	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 );
	/* 行列 a1 と行列 a2 の和を計算して出力する */
	print_Matrix2D ( a1 );
	printf ( " と、 \n" );
	print_Matrix2D ( a2 );
	printf ( " との、和は \n" );
	print_Matrix2D ( a );
	printf ( " です。\n" );
	return 0;
}
C:\usr\c>sample-002
z1 ( = 2.000000 + 3.000000 i ) と、 z2 ( = -1.000000 + 5.000000 i ) \
    の和は 、
1.000000 + 8.000000 i です。
C:\usr\c> 
#include <stdio.h>
/*
 * for 文を利用して、0 から 9 の数値を表示する
 */
int main(int ac, char *av[] ) {
  int i; /* for 文の制御変数 */
  for ( i = 0; i < 10; i = i + 1 ) {/* i を 0 〜 9 迄変化 */
	printf ( "%d\n", i );			/* i を出力 */
  }
  return 0;
}
#include <stdio.h>
/*
 * for 文を利用して、1 から 10 の数値を表示する
 */
int main(int ac, char *av[] ) {
  int i; /* for 文の制御変数 */
  for ( i = 1; i <= 10; i = i + 1 ) {/* i を 1 〜 10迄変化 */
	printf ( "%d\n", i );			/* i を出力 */
  }
  return 0;
}
#include <stdio.h>
/*
 * for 文を利用して、0 から 9 の数値を表示する
 */
int main(int ac, char *av[] ) {
  int i; /* for 文の制御変数 */
  for ( i = 0; i < 10; i++ ) {	/* i を 0 〜 9 迄変化 */
								/* i++ は i = i + 1 と同じ */
	printf ( "%d\n", i );		/* i を出力 */
  }
  return 0;
}
#include <stdio.h>
/*
 * for 文を利用して、0 から 9 迄の 10 個の数値を和を表示する
 * sum = \sum_{i=0}^{9} i
 */
int main(int ac, char *av[] ) {
  int i; /* for 文の制御変数 */
  int sum = 0;
  for ( i = 0; i < 10; i++ ) {	/* i を 0 〜 9 迄変化 */
								/* i++ は i = i + 1 と同じ */
	sum = sum + i;				/* sum に i の値を加える */
	printf ( "%d %d\n", i, sum );		/* i と sum を出力 */
  }
  printf ( "最終的には sum = %d\n", sum );
  return 0;
}
#include <stdio.h>
/*
 * for 文を利用して、0 から 9 の数値を表示する
 * プログラムを while に書き直す
 */
int main(int ac, char *av[] ) {
  int i; /* for 文の制御変数 */
  /* 元々のプログラム
	  for ( i = 0; i < 10; i++ ) {
		printf ( "%d\n", i );
	  }
	step-1
		<初期化式> を前にもってくる
	  i = 0;
	  for ( i < 10; i++ ) {
		printf ( "%d\n", i );
	  }
	step-2
		<再初期化式> を、繰返し文の後にもって行く
	  i = 0;
	  for ( i < 10 ) {
		printf ( "%d\n", i );
		i++;					<= { 〜 } の一番最後
	  }
	step-3
		for を while に書き換える
	  i = 0;
	  while ( i < 10 ) {
		printf ( "%d\n", i );
		i++;
	  }
  */
  /* 元々のプログラム
	  for ( i = 0; i < 10; i++ ) {
		printf ( "%d\n", i );
	  }
  */
	  i = 0;
	  while ( i < 10 ) {
		printf ( "%d\n", i );
		i++;
	  }
  return 0;
}
#include <stdio.h>
/*
 * for 文では、条件式がサボれる
 */
int main(int ac, char *av[] ) {
  for ( ;; ) {
	/* while では条件を省略できないが for 文ではできる .. */
	/* 条件が省略されると、「常に真」になるので無限ループ */
	/* プログラムを停止させるには
	 *	 Ctrl-C ([Ctrl] キーを押しながら [C] キーを押す)
	 * を押す。
	 */
	printf ( "動いています...\n" );
  }
  return 0;
}
#include <stdio.h>
/*
 * for 文を利用して、0 から 99 の偶数の数値
 *		アプローチ
 *		(その一)	i を 0 〜 99 として、但し偶数だけを出す
 */
int main(int ac, char *av[] ) {
  int i; /* for 文の制御変数 */
  for ( i = 0; i < 100; i++ ) {	/* i を 0 〜 99 迄変化 */
	/* 但し、i が偶数の時だけ → if 文を利用する */
	if ( i % 2 == 0 ) {	/* i を 2 で割った余り(i%2)が 0 */
	  					/* 即ち i が偶数の時.. */
		printf ( "%d\n", i );		/* i を出力 */
	}
  }
  return 0;
}
#include <stdio.h>
/*
 * for 文を利用して、0 から 99 の偶数の数値
		(そのニ)	i が 0 〜 99 の間の偶数だけを動くようにし、毎回 i を出す
 */
int main(int ac, char *av[] ) {
  int i; /* for 文の制御変数 */
  for ( i = 0; i < 100; /* ここを工夫 */ ) {
						/* i++ だと i = 0, 1, 2, .. */
						/* ○○とすれば i = 0, 2, 4, .. */
						/* i = i + 2 */
		printf ( "%d\n", i );		/* i を出力 */
  }
  return 0;
}
#include <stdio.h>
/*
 * 配列の導入
 *	複数の対象があるが、それらが同じ様な使われ方をする
 *		その対象に対して、似たような操作(命令)が為される事が多い
 *			→ 配列を使うと良い
 */
int main(int ac, char *av[] ) {
  int a0;	/* 三つの変数を用意 */
  int a1;
  int a2;
  /* どの変数にも、0 をいれて、全てを出力する */
  a0=0;	/* それぞれの変数を初期化 */
  a1=0;
  a2=0;
  printf ( "%d\n", a0 );
  printf ( "%d\n", a1 );
  printf ( "%d\n", a2 );
  /* 同じような事があったら、繰返しにしなさい.. */
  return 0;
}
#include <stdio.h>
/*
 * 配列の導入
 *			a0 -> a[0]
 *			a1 -> a[1]
 *			a2 -> a[2]
 */
int main(int ac, char *av[] ) {
  int a[3];	/* 三つの変数 → 三つの要素をもつ一つの配列 */
			/* a[0], a[1], a[2] の三つの変数ができる(のと同等..) */
  /* どの変数にも、0 をいれて、全てを出力する */
  a[0]=0;	/* 代入の対象が、毎回異る */
  a[1]=0;	/* 対象が違うから、繰返しにできない */
  a[2]=0;
  printf ( "%d\n", a[0] );
  printf ( "%d\n", a[1] );
  printf ( "%d\n", a[2] );
  /* 同じような事があったら、繰返しにしなさい.. */
  return 0;
}
#include <stdio.h>
/*
 * 配列をインデックスで参照
 */
int main(int ac, char *av[] ) {
  int a[3];	/* 三つの変数 → 三つの要素をもつ一つの配列 */
			/* a[0], a[1], a[2] の三つの変数ができる(のと同等..) */
  int i;	/* 配列の要素を参照するためのインデクス変数 */
  /* どの変数にも、0 をいれて、全てを出力する */
  /*
  a[0]=0;
  a[1]=0;
  a[2]=0;
  */
  /* 配列(の要素)は、
     添字(index:インデック)を利用して参照できる */
  /* 添字は、式にできる */
  /* 単純な変数 (これまででてきた変数)は名前で参照できる */
  i = 0;
  a[i] = 0;	/* i が 0 なので a[0] = 0 と同じ */
  i = 1;
  a[i] = 0;	/* i が 1 なので a[1] = 0 と同じ */
  i = 2;
  a[i] = 0;	/* i が 2 なので a[2] = 0 と同じ */
  /* a[i] という同一な表現で操作される対象は、
		i の値で変化(異る対象を操作)する */
  printf ( "%d\n", a[0] );
  printf ( "%d\n", a[1] );
  printf ( "%d\n", a[2] );
  /* 同じような事があったら、繰返しにしなさい.. */
  return 0;
}
#include <stdio.h>
/*
 * 配列をインデックスで参照
 */
int main(int ac, char *av[] ) {
  int a[3];	/* 三つの変数 → 三つの要素をもつ一つの配列 */
			/* a[0], a[1], a[2] の三つの変数ができる(のと同等..) */
  int i;	/* 配列の要素を参照するためのインデクス変数 */
  /* どの変数にも、0 をいれて、全てを出力する */
  /*
  a[0]=0;
  a[1]=0;
  a[2]=0;
  */
  /* 配列(の要素)は、
     添字(index:インデック)を利用して参照できる */
  /* 添字は、式にできる */
  /* 単純な変数 (これまででてきた変数)は名前で参照できる */
  i = 0;
  a[i] = 0;
  i++;	/* i が 0 だったので、i は 1 になり i = 1 と同じ */
  a[i] = 0;
  i++;	/* i が 1 だったので、i は 2 になり i = 2 と同じ */
  a[i] = 0;
  /* a[i] という同一な表現で操作される対象は、
		i の値で変化(異る対象を操作)する */
  printf ( "%d\n", a[0] );
  printf ( "%d\n", a[1] );
  printf ( "%d\n", a[2] );
  /* 同じような事があったら、繰返しにしなさい.. */
  return 0;
}
#include <stdio.h>
/*
 * 配列をインデックスで参照
 */
int main(int ac, char *av[] ) {
  int a[3];	/* 三つの変数 → 三つの要素をもつ一つの配列 */
			/* a[0], a[1], a[2] の三つの変数ができる(のと同等..) */
  int i;	/* 配列の要素を参照するためのインデクス変数 */
  i = 0;
  a[i] = 0;	/* 以下、同じ「表現」の繰返し */
  i++;
  a[i] = 0;
  i++;
  a[i] = 0;
  i++;		/* これは不要だが、形式を整るために敢えて追加 */
	
  /* a[i] という同一な表現で操作される対象は、
		i の値で変化(異る対象を操作)する */
  printf ( "%d\n", a[0] );
  printf ( "%d\n", a[1] );
  printf ( "%d\n", a[2] );
  /* 同じような事があったら、繰返しにしなさい.. */
  return 0;
}
#include <stdio.h>
/*
 * 配列をインデックスで参照
 */
int main(int ac, char *av[] ) {
  int a[3];	/* 三つの変数 → 三つの要素をもつ一つの配列 */
			/* a[0], a[1], a[2] の三つの変数ができる(のと同等..) */
  int i;	/* 配列の要素を参照するためのインデクス変数 */
  i = 0;
  while ( i < 3 ) {	/* 同じ表現なので繰返しに.. */
	  a[i] = 0;
	  i++;
  }
  /*
	for ( i = 0; i < 3; i++ ) { 
		a[i] = 0;
	}
   */
  /* a[i] という同一な表現で操作される対象は、
		i の値で変化(異る対象を操作)する */
  /*
  printf ( "%d\n", a[0] );
  printf ( "%d\n", a[1] );
  printf ( "%d\n", a[2] );
  */
  for ( i = 0; i < 3; i++ ) {
	printf ( "%d\n", a[i] );
  }
  /* 
	集合にある操作をする事はある操作をした結果の集合を作る事
	*/
  return 0;
}
#include <stdio.h>
int main(int ac, char *av[]) {
  int point[3];	/* ポイント 10 倍セール */
  int i;
  for ( i = 0; i < 3; i++ ) {
	scanf ( "%d", &point[i] );		/* データを三つ */
  }
  /* 三つの数を全て 10 倍にする */
  for ( i = 0; i < 3; i++ ) {	/* 全体への操作が.. */
	point[i] = point[i] * 2;			/* 個々の操作の繰返しになる */
  }
  for ( i = 0; i < 3; i++ ) {
	printf ( "%d\n", point[i] );		/* データを出力 */
  }
}
#include <stdio.h>
int main(int ac, char *av[]) {
  int point;	/* ポイント 10 倍セール */
  int i;
  scanf ( "%d", &point );
  point = point * 2;
  printf ( "%d\n", point );
}
#include <stdio.h>
int main(int ac, char *av[]) {
  int a[5];	/* サイズ 5 の整数型の配列 */
  int i;	/* 添字変数 i を宣言 */
  for ( i = 0; i < 5; i++ ) {	/* 配列 a に数値を読み込む */
	scanf ( "%d", &a[i] );
  }
  /* 入力された個々の値を 5 倍した物を出力 */
  for ( i = 0; i < 5; i++ )	{
	printf ( "%d\n", /*ココ*/ );	/* 5 倍 */
  }
  /* 入力された個々の値を 1/2 した物を出力 */
  for ( i = 0; i < 5; i++ )	{
	printf ( "%d\n", /*ココ*/ );	/* 2 分の 1 */
  }
  return 0;
}
#include <stdio.h>
/*
	5 倍だけをやってみる
		!!! いきなり全部をしない
		!!! 	-> すこしずつ作っていって、
		!!!			結果を確認しながら進める
*/
int main(int ac, char *av[]) {
  int a[5];	/* サイズ 5 の整数型の配列 */
  int i;	/* 添字変数 i を宣言 */
  for ( i = 0; i < 5; i++ ) {	/* 配列 a に数値を読み込む */
	scanf ( "%d", &a[i] );
  }
  /* 入力された個々の値を 5 倍した物を出力 */
  for ( i = 0; i < 5; i++ )	{
	/* 「ココ」には a[i] の 5 倍を入れるので... */
	printf ( "%d\n", a[i] * 5 );	/* 5 倍 */
  }
	/*
		1/2 の方は... a[i] * (1/2) とすればよさそうだが..
		整数の計算で (1/2) は 0 になっていまうのでだめ
			a[i] * (1/2) = a[i] * 0 = 0
		そこで..
		   a * (1/2) = a/2
		である事を利用して...
	 */
  return 0;
}
for 文とは
	繰返しを記述する構文規則 ( cf. while )
		for ( <初期化式>; <継続条件式>; <再初期化式> ) { <繰返し文> }
	例:
		  for (i = 0;i < 10; i++){printf ( "%d\n", i );}
		<初期化式> : i = 0
			1 回 (必ず)
		<継続条件式> : i < 10
			11 回 ( 1 度は必ず実行 )
		<再初期化式> : i++
			10 回
		<繰返し文> : printf ( "%d\n", i );
			10 回
		初期化式 : 最初に一度だけ、必ず行われる文
			継続条件式 : 毎回、繰返し文の実行「前」に評価されこれが偽の場合は終了になる
			繰返し文 : for 文によって繰り返される命令
			再初期化式 : 繰返し文の実行の後に毎回実行される
	実行例:
		  for (i = 0;i < 10; i++){printf ( "%d\n", i );}
  	  				i			その他		 説明
	<step-0>
			i=0;	0						<初期化式>の実行
	<step-1-1>
			i<10					真		<継続条件式>
	<step-1-2>
			printf ( "%d\n", i );	「0」	<繰返し文>
	<step-1-3>
			i++		1						<再初期化式>
	<step-2-1>
			i<10					真		<継続条件式>
	<step-2-2>
			printf ( "%d\n", i );	「1」	<繰返し文>
	<step-2-3>
			i++		2						<再初期化式>
	..
	<step-9-1>
			i<10					真		<継続条件式>
	<step-9-2>
			printf ( "%d\n", i );	「9」	<繰返し文>
	<step-9-3>
			i++		10						<再初期化式>
	<step-10-1>
			i<10					偽		<継続条件式>
	for 文は終了
イデオム(成句)
	int i;
	for ( i = 0; i < N; i++ ) {
		何か
	}
	i を 0 から N - 1 まで動かしながら「何か」を N 回実行する
	int i;
	for ( i = N; i > 0; i-- ) {	/* i-- は i = i - 1 */
		何か
	}
	i を N から 1 まで動かしながら「何か」を N 回実行する
==
	for 文と while 文の関係
		for 文と while 文は相互に書き換えができる
			だから、while 文だけ知っていれば for 文は要らないのだが、for 文は便利なので..
		for 文から while 文 ( while が解っていれば for 文は解る )
			for ( <初期化式>; <継続条件式>; <再初期化式> ) { <繰返し文> }
				→
			<初期化式>; while ( <継続条件式> ) { <繰返し文> <再初期化式>; }
		while 文から for 文 ( while は for 文の簡略形 )
			while ( <継続条件式> ) { <繰返し文> }
				→
			for ( ; <継続条件式>; ) { <繰返し文> }
			( while 文は for 文の <初期化式>, <再初期化式> が空のもの )
==
問題
	for 文を使って、0 から 99 迄の偶数だけ表示してください
		# 100 未満の偶数を全て出力
		アプローチ
		(その一)	i を 0 〜 99 として、但し偶数だけを出す
		(そのニ)	i が 0 〜 99 の間の偶数だけを動くようにし、毎回 i を出す
==
	配列
		複数の同じ型の変数をまとめたものです
			int a0, a1, a2;  -> int a[3];
		個々要素(変数)は、添字(index)を利用して参照できる
			a0 -> a[0]
	配列を利用し、添字を操作することにより、
		配列の要素(複数)への操作を
			繰返しという一つの操作に変換できる
	特に配列が、集合を表現している場合
		集合全体への操作が、個々の要素の操作の繰返しになる事が多い
==
課題
	整数型の配列を作り、それに 5 個のデータを入力し
	その値を 5 倍にしたものと 2 分の 1 にした値を
	それぞれ、画面に出力するプログラムを作りなさい
		例
			入力を
					3
					8
					13
					2
					4
			とすると
					15						
					40
					65
					10
					20
					1
					4
					6
					1
					2
			と出力する		
課題プログラム内の「/*名前:ここ*/」の部分を書き換えたり、「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
なお「名前(P,Q,R,..)」の部分が同じ所には同じものが入ります。
Download : 20141010-01.c ( SJIS 版 )
/*
 * 課題 20141010-01
 *
 * 2014/10/10 20141010-01-QQQQ.c
 *
 *	複素数型の四則
 */
#include <stdio.h>
/*
 *  複素数型の定義と計算
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe 20141010-01-QQQQ.c
 *		実行
 *			BASENAME
 */
#include <stdio.h>
/*
 *	複素数型を表す Complex の定義
 *
 *		複素数 z は、二つの実数 x, y を用いて
 *			   z = x + yi ( i は虚数単位 )
 *		と表現できる。
 *			C 言語では実数を表すのに浮動小数点数型の double を用いる
 *				型名 ( Complex ) を大文字で始めるのは「ソフトウェア概論ルール」
 */
typedef struct {
	double real;			/* 実部 */
	double imaginary;		/* 虚部 */
} Complex;					/* 複素数型 */
/*
 *	Complex make_Complex ( double x, double y )
 *		Complex 型の数を作り、返す
 *			x, y -> z = x + yi
 */
Complex make_Complex ( double x, double y ) {
	Complex newComplex;		/* 新しく作られる複素数 */
	newComplex.real = x;	/* 新しく作られた複素数の実部は x */
	newComplex.imaginary = y;	/* 新しく作られた複素数の実部は y */
	return newComplex;		/* 新しく作られる複素数を値として返す */
}
/*
 *	double real_part ( Complex z )
 *		Complex 型の数の実部を返す
 *			z = x + yi -> x
 */
double real_part ( Complex z ) {
	return z.real;
}
/*
 *	double imaginary_part ( Complex z )
 *		Complex 型の数の実部を返す
 *			z = x + yi -> x
 */
double imaginary_part ( Complex z ) {
	return z.imaginary;
}
/*
 *	print_Complex ( Complex z )
 *		Complex 型の数の出力
 *			z = x + y i だが、y < 0 の時は z = x - (-y) i となるように工夫
 */
void print_Complex ( Complex z ) {
	if ( z.imaginary > 0 ) {
		printf ( "%f + %f i", z.real, z.imaginary );
	} else {
		printf ( "%f - %f i", z.real, - z.imaginary );
	}
}
/*
 *	Complex add_Complex ( Complex z1, Complex z2 )
 *		Complex 型の数の足し算
 *			z1 = x1 + y1 i
 *			z2 = x2 + y2 i
 *				-> z1 + z2 = ( x1 + x2 ) + ( y1 + y2 ) i
 */
Complex add_Complex ( Complex z1, Complex z2 ) {
	Complex result;
		/* 複素数の和の実部は、実部の和 */
	result.real = z1.real + z2.real;
		/* 複素数の和の虚部は、虚部の和 */
	result.imaginary = z1.imaginary + z2.imaginary;
	return result;
}
/*
 *	Complex sub_Complex ( Complex z1, Complex z2 )
 *		Complex 型の数の引き算
 *			z1 = x1 + y1 i
 *			z2 = x2 + y2 i
 *				-> z1 - z2 = ( x1 - x2 ) + ( y1 - y2 ) i
 */
Complex sub_Complex ( Complex z1, Complex z2 ) {
	Complex result;
		/* 複素数の差の実部は、実部の差 */
	result.real = z1.real - z2.real;
		/* 複素数の差の虚部は、虚部の差 */
	/*
	**	 この部分を完成させなさい
	*/
	return result;
}
/*
 *	Complex mul_Complex ( Complex z1, Complex z2 )
 *		Complex 型の数のかけ算
 *			z1 = x1 + y1 i
 *			z2 = x2 + y2 i
 *		の時
 *			z1 * z2 = (x1 * x2 - y1 * y2) + (x1 * y2 + x2 * y1) i
 */
Complex mul_Complex ( Complex z1, Complex z2 ) {
	Complex result;
	result.real = z1.real * z2.real - z1.imaginary * z2.imaginary;
	/*
	**	 この部分を完成させなさい
	*/
	return result;
}
/*
 *	Complex div_Complex ( Complex z1, Complex z2 )
 *		Complex 型の数の割り算
 *			z1 = x1 + y1 i
 *			z2 = x2 + y2 i
 *		の時
 *			z1 / z2 =   (  x1 * x2 + y1 * y2) / ( x2^2 + y2^2 )
 *                  + ( (- x1 * y2 + x2 * y1) / ( x2^2 + y2^2 ) ) i
 */
Complex div_Complex ( Complex z1, Complex z2 ) {
	Complex result;
	double denominator = z2.real * z2.real + z2.imaginary *z2.imaginary;
		/* 実部、虚部の割る数 |z2|^2 を予め計算しておく */
	/*
	**	 この部分を完成させなさい
	*/
	result.imaginary = ( - z1.real * z2.imaginary + z1.imaginary * z2.real ) / \
    denominator;
	return result;
}
/*
 * print_result 演算結果を出力する
 */
void print_result ( Complex z1, Complex z2, char *operator, Complex z ) {
	print_Complex ( z1 );
	printf ( " と、 " );
	print_Complex ( z2 );
	printf ( " との、%s は ", operator );
	print_Complex ( z );
	printf ( " です。\n" );
}
/*
 *	main
 */
int main( int argc, char *argv[] )
{
	Complex z1 = make_Complex ( 20.0, -15.0 );	/* z1 = 20 - 15i */
	Complex z2 = make_Complex ( 1.0, 2.0 );		/* z2 = 1 + 2i */
		/* 和の出力 */
	print_result ( z1, z2, "和", add_Complex ( z1, z2 ) );
		/* 差の出力 */
	/*
	**	 この部分を完成させなさい
	*/
		/* 積の出力 */
	/*
	**	 この部分を完成させなさい
	*/
		/* 商の出力 */
	print_result ( z1, z2, "商", div_Complex ( z1, z2 ) );
	return 0;
}
C:\usr\c\> 20141010-01-QQQQ
20.000000 - 15.000000 i と、 1.000000 + 2.000000 i との、和 は 21.000000 \
    - 13.000000 i です。
20.000000 - 15.000000 i と、 1.000000 + 2.000000 i との、差 は 19.000000 \
    - 17.000000 i です。
20.000000 - 15.000000 i と、 1.000000 + 2.000000 i との、積 は 50.000000 \
    + 25.000000 i です。
20.000000 - 15.000000 i と、 1.000000 + 2.000000 i との、商 は -2.000000 \
    - 11.000000 i です。
C:\usr\c\> 
Download : 20141010-02.c ( SJIS 版 )
/*
 * 課題 20141003-02
 *
 * 2014/10/03 20141003-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++ ) {
	/*
	**	 この部分を完成させなさい
	*/
		}
	}
	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] = 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;
}
C:\usr\c\> 20141010-02-QQQQ 和 の計算 ( 1.00000 2.00000 ) ( 3.00000 -1.00000 ) と、 ( -3.00000 1.00000 ) ( 1.00000 -2.00000 ) との、和 は ( -2.00000 3.00000 ) ( 4.00000 -3.00000 ) です。 差 の計算 ( 1.00000 2.00000 ) ( 3.00000 -1.00000 ) と、 ( -3.00000 1.00000 ) ( 1.00000 -2.00000 ) との、差 は ( 4.00000 1.00000 ) ( 2.00000 1.00000 ) です。 積 の計算 ( 1.00000 2.00000 ) ( 3.00000 -1.00000 ) と、 ( -3.00000 1.00000 ) ( 1.00000 -2.00000 ) との、積 は ( -1.00000 -3.00000 ) ( -10.00000 5.00000 ) です。 C:\usr\c\>
Download : 20141010-03.c ( SJIS 版 )
/*
 * 課題 CNAME-03
 *
 * 20141010 20141010-03-QQQQ.c
 *
 *	0 〜 99 の偶数を出力する
 *
 */
#include <stdio.h>
/*
 * for 文を利用して、0 から 99 の偶数の数値
		(そのニ)	i が 0 〜 99 の間の偶数だけを動くようにし、毎回 i を出す
 */
int main(int ac, char *av[] ) {
  int i; /* for 文の制御変数 */
  for ( i = 0; i < 100; /* p:ここ */ ) {
						/* i++ だと i = 0, 1, 2, .. */
						/* ○○とすれば i = 0, 2, 4, .. */
		printf ( "%d\n", i );		/* i を出力 */
  }
  return 0;
}
C:\usr\c\> 20141010-03-QQQQ 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 C:\usr\c\>
Download : 20141010-04.c ( SJIS 版 )
/*
 * 課題 CNAME-04
 *
 * 20141010 20141010-04-QQQQ.c
 *
 *		整数型の配列を作り、それに 5 個のデータを入力し
 *		その値を 5 倍にしたものと 2 分の 1 にした値を
 *		それぞれ、画面に出力するプログラムを作りなさい
 *
 */
#include <stdio.h>
int main(int ac, char *av[]) {
  int a[5];	/* サイズ 5 の整数型の配列 */
  int i;	/* 添字変数 i を宣言 */
  for ( i = 0; i < 5; i++ ) {	/* 配列 a に数値を読み込む */
	scanf ( "%d", &a[i] );
  }
  /* 入力された個々の値を 5 倍した物を出力 */
  for ( i = 0; i < 5; i++ )	{
	printf ( "%d\n", /* p:ここ */ );	/* 5 倍 */
  }
  /* 入力された個々の値を 1/2 した物を出力 */
  for ( i = 0; i < 5; i++ )	{
	printf ( "%d\n", /* q:ここ */ );	/* 2 分の 1 */
  }
  return 0;
}
3 8 13 2 4
C:\usr\c\> 20141010-04-QQQQ 3 8 13 2 4 15 40 65 10 20 1 4 6 1 2 C:\usr\c\>