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\>