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