当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/* * 2013/07/05 sample-001.c */ /* * 二分法 * * 一つ浮動小数点数値をキーボードから入力し、その平方根を出力する * 手段としては、「二分法」を使う * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-001.exe sample-001.c * 実行 * sample-001 */ #include <stdio.h> #include <stdlib.h> /* exit を利用するので必要 */ #include "s_input.h" #include "s_print.h" /* * */ #define EPSILON 0.00000001 /* 誤差幅 */ /* * double regula_falsi_square_root ( double a, double min, double mid, \ double max ) * double a 平方根の元になる数(正を仮定している) * double min, max 根の入る区間の範囲 * double mid min と mid の中点 * return a 平方根 * 二分法により、a の平方根を求める * 0 < min < a の平方根 < max */ double regula_falsi_square_root ( double a, double min, double mid, double \ max ) { if ( max - min < EPSILON ) { /* 十分に精度が上った */ return mid; /* 中点の値を答として返す */ } else { /* まだ、狭める必要がある */ /* min が解のどちら側にあるかを調べ.. それに併せて区間を調整 */ /* f(x)=x^2-a */ if ( mid * mid - a < 0.0 ) { /* f(mid) の符号を確認 */ /* 解の左にあった */ return regula_falsi_square_root ( a, mid, (mid+max)/2.0, max ); } else { /* 解の右にあった */ return regula_falsi_square_root ( a, min, (min+mid)/2.0, mid ); } } } /* * double square_root ( double a ) * double a 平方根の元になる数 * return a 平方根 * a の平方根を求めて結果として返すが、 * 計算の基本は、regula_falsi_square_root にまかせる * ここでは、計算の正規化を行う */ double square_root ( double a ) { if ( a < 0.0 ) { /* a が負の数ならば.. */ s_print_string ( "負の平方根は計算できません\n" ); /* エラーメッセージを出力し.. */ exit ( -1 ); /* Error Code (-1) でプログラム終了 */ } else if ( a < 1.0 ) { /* a が 1.0 以下なら */ return regula_falsi_square_root ( a, a, (a+1.0)/2.0, 1.0 ); /* 平方根は a と 1.0 の間にある */ } else { /* そうでなければ.. */ return regula_falsi_square_root ( a, 1.0, (1.0+a)/2.0, a ); /* 平方根は 1.0 と a の間にある */ } } /* * void print_square_root ( double a ) * double a 平方根を計算する数 * 元の数と、平方根を出力する */ void print_square_root ( double a ) { s_print_double ( a ); s_print_string ( " の平方根は " ); s_print_double ( square_root ( a ) ); s_print_string ( " です。\n" ); } /* * main */ int main( double argc, char *argv[] ) { s_print_string ( "実数値を一つ入力してください : " ); print_square_root ( s_input_double() ); return 0; }
2.0
C:\usr\c>sample-001< sample-001.in 実数値を一つ入力してください : 2.000000 2.000000 の平方根は 1.414214 です。 C:\usr\c>
Download : sample-002.c ( SJIS 版 )
/* * 2013/07/05 sample-002.c */ /* * 関数と引数変数 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-002.exe sample-002.c * 実行 * sample-002 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * main */ int main ( int argc, char *argv[] ) { /* 一番 */ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( "後の山に 棄てましょか\n" ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); /* ニ番 */ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( "背戸の小薮に 埋けましょか\n" ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); return 0; }
C:\usr\c>sample-002 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ C:\usr\c>
Download : sample-003.c ( SJIS 版 )
/* * 2013/07/05 sample-003.c */ /* * 関数と引数変数 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-003.exe sample-003.c * 実行 * sample-003 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ void kyoku_1(void) { /* 一番 */ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( "後の山に 棄てましょか\n" ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); } void kyoku_2(void) { /* ニ番 */ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( "背戸の小薮に 埋けましょか\n" ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); } /* * main */ int main ( int argc, char *argv[] ) { kyoku_1(); kyoku_2(); return 0; }
C:\usr\c>sample-003 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ C:\usr\c>
Download : sample-004.c ( SJIS 版 )
/* * 2013/07/05 sample-004.c */ /* * 関数と引数変数 (「置き換え」による理解 ) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-004.exe sample-004.c * 実行 * sample-004 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ void kyoku_n ( char *string ) { s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( string ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); } void kyoku_1(void) { /* 一番 */ kyoku_n ( "後の山に 棄てましょか\n" ); } void kyoku_2(void) { /* ニ番 */ kyoku_n ( "背戸の小薮に 埋けましょか\n" ); } /* * main */ int main ( int argc, char *argv[] ) { kyoku_1(); /* kyoku_1(); ↓ kyoku_n ( "後の山に 棄てましょか\n" ); ↓ string ← "後の山に 棄てましょか\n" s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( string ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); ↓ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( "後の山に 棄てましょか\n" ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); */ kyoku_2(); return 0; }
C:\usr\c>sample-004 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ C:\usr\c>
Download : sample-005.c ( SJIS 版 )
/* * 2013/07/05 sample-005.c */ /* * 関数と引数変数 (「代入」による理解 ) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-005.exe sample-005.c * 実行 * sample-005 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ void kyoku_n ( char *string ) { s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( string ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); } void kyoku_1(void) { /* 一番 */ kyoku_n ( "後の山に 棄てましょか\n" ); } void kyoku_2(void) { /* ニ番 */ kyoku_n ( "背戸の小薮に 埋けましょか\n" ); } /* * main */ int main ( int argc, char *argv[] ) { /* kyoku_1(); */ { char *string = "後の山に 棄てましょか\n"; /* 変数宣言と代入 */ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( string ); /* 代入された値が使われる */ s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); } kyoku_2(); return 0; }
C:\usr\c>sample-005 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ C:\usr\c>
Download : sample-006.c ( SJIS 版 )
/* * 2013/07/05 sample-006.c */ /* * 変数宣言と代入 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-006.exe sample-006.c * 実行 * sample-006 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * main */ int main ( int argc, char *argv[] ) { { char *string = "後の山に 棄てましょか\n"; /* 変数宣言と代入 */ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( string ); /* 代入された値が使われる */ s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); } /* ブロック内の宣言は、ブロックの外では無効 */ { char *string = "背戸の小薮に 埋けましょか\n"; /* 再宣言 */ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( string ); /* 代入された値が使われる */ s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); } return 0; }
C:\usr\c>sample-006 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ C:\usr\c>
Download : sample-007.c ( SJIS 版 )
/* * 2013/07/05 sample-007.c */ /* * 変数宣言と代入 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-007.exe sample-007.c * 実行 * sample-007 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * main */ int main ( int argc, char *argv[] ) { char *string; /* 変数宣言 (変数宣言はブロックの先頭で行う) */ /* 一番 */ string = "後の山に 棄てましょか\n"; /* 代入 */ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( string ); /* 代入された値が使われる */ s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); /* ニ番 */ string = "背戸の小薮に 埋けましょか\n"; /* (再)代入 */ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( string ); /* 最後に代入された値が使われる */ s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); return 0; }
C:\usr\c>sample-007 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ C:\usr\c>
Download : sample-008.c ( SJIS 版 )
/* * 2013/07/05 sample-008.c */ /* * 代入を使わざず、二つの整数の和を計算する * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-008.exe sample-008.c * 実行 * sample-008 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * print_sum */ void print_sum ( int a, int b ) { s_print_int ( a ); s_print_string ( "と" ); s_print_int ( b ); s_print_string ( "の和は" ); s_print_int ( a+b ); s_print_string ( "です。\n" ); } /* * print_sum_one_and_input */ void print_sum_one_and_input ( int a ) { print_sum ( a, s_input_int() ); } /* * main */ int main ( int argc, char *argv[] ) { s_print_string ( "二つの数を入力してください\n" ); print_sum_one_and_input ( s_input_int() ); return 0; }
12 56
C:\usr\c>sample-008< sample-008.in 二つの数を入力してください 12 56 12と56の和は68です。 C:\usr\c>
Download : sample-009.c ( SJIS 版 )
/* * 2013/07/05 sample-009.c */ /* * 代入を利用して、二つの整数の和を計算する * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-009.exe sample-009.c * 実行 * sample-009 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * main */ int main ( int argc, char *argv[] ) { int a; /* 変数の宣言 (ブロックの先頭でしかできない) */ int b; /* 変数の宣言 */ s_print_string ( "二つの数を入力してください\n" ); a = s_input_int(); /* 変数 a への代入 */ b = s_input_int(); /* 変数 b への代入 */ /* 命令の並びの順と、キーボードから入力される順が一致 */ s_print_int ( a ); s_print_string ( "と" ); s_print_int ( b ); s_print_string ( "の和は" ); s_print_int ( a+b ); s_print_string ( "です。\n" ); return 0; }
12 56
C:\usr\c>sample-009< sample-009.in 二つの数を入力してください 12 56 12と56の和は68です。 C:\usr\c>
Download : sample-010.c ( SJIS 版 )
/* * 2013/07/05 sample-010.c */ /* * 1 〜 5 までを出力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-010.exe sample-010.c * 実行 * sample-010 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * main */ int main ( int argc, char *argv[] ) { /* */ s_print_int ( 1 ); s_print_newline(); s_print_int ( 2 ); s_print_newline(); s_print_int ( 3 ); s_print_newline(); s_print_int ( 4 ); s_print_newline(); s_print_int ( 5 ); s_print_newline(); return 0; }
C:\usr\c>sample-010 1 2 3 4 5 C:\usr\c>
Download : sample-011.c ( SJIS 版 )
/* * 2013/07/05 sample-011.c */ /* * 1 〜 5 までを出力 (変数を導入してみる) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-011.exe sample-011.c * 実行 * sample-011 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * main */ int main ( int argc, char *argv[] ) { int i = 1; /* */ s_print_int ( i ); s_print_newline(); i = i + 1; /* 新しい i の値は、古い i の値で計算される */ /* i ← 1 + 1 = 2 */ s_print_int ( i ); s_print_newline(); i = i + 1; /* i ← 2 + 1 = 3 */ s_print_int ( i ); s_print_newline(); i = i + 1; /* i ← 3 + 1 = 4 */ s_print_int ( i ); s_print_newline(); i = i + 1; /* i ← 4 + 1 = 5 */ s_print_int ( i ); s_print_newline(); i = i + 1; /* これは不要だが、規則性を尊んで.. */ return 0; }
C:\usr\c>sample-011 1 2 3 4 5 C:\usr\c>
Download : sample-020.c ( SJIS 版 )
/* * 2013/07/05 sample-020.c */ /* * 再帰呼出しと代入 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-020.exe sample-020.c * 実行 * sample-020 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * factrial */ int factrial ( int n ) { if ( n < 2 ) { return 1; } else { return factrial ( n - 1 ) * n; } } /* * main */ int main ( int argc, char *argv[] ) { int n; int fac; s_print_string ( "一つの数を入力してください\n" ); n = s_input_int(); fac = factrial ( n ); s_print_int ( n ); s_print_string ( "の階乗は" ); s_print_int ( fac ); s_print_string ( "です。\n" ); return 0; }
4
C:\usr\c>sample-020< sample-020.in 一つの数を入力してください 4 4の階乗は24です。 C:\usr\c>
Download : sample-021.c ( SJIS 版 )
/* * 2013/07/05 sample-021.c */ /* * 再帰呼出しと代入 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-021.exe sample-021.c * 実行 * sample-021 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * factrial */ int factrial ( int n ) { int retV; if ( n < 2 ) { retV = 1; } else { int n1 = n - 1; int fac1 = factrial ( n1 ); retV = fac1 * n; } return retV; } /* * main */ int main ( int argc, char *argv[] ) { int number; int fac; s_print_string ( "一つの数を入力してください\n" ); number = s_input_int(); fac = factrial ( number ); s_print_int ( nunber ); s_print_string ( "の階乗は" ); s_print_int ( fac ); s_print_string ( "です。\n" ); return 0; }
4
C:\usr\c>sample-021< sample-021.in 一つの数を入力してください 4 4の階乗は24です。 C:\usr\c>
Download : sample-022.c ( SJIS 版 )
/* * 2013/07/05 sample-022.c */ /* * 再帰呼出しと代入 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-022.exe sample-022.c * 実行 * sample-022 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * factrial */ int factrial ( int n ) { int retV; if ( n < 2 ) { retV = 1; } else { int n1 = n - 1; int fac1; fac1 = factial ( n1 ); の展開 */ retV = fac1 * n; } return retV; } /* * main */ int main ( int argc, char *argv[] ) { int number; int fac; s_print_string ( "一つの数を入力してください\n" ); number = s_input_int(); /* fac = factrial ( number ); の展開 */ { int n = number; /* n (引数) に number の値を入れる */ int retV; if ( n < 2 ) { retV = 1; } else { int n1 = n - 1; int fac1; fac1 = factrial ( n1 ); retV = fac1 * n; } fac = retV; /* return で値を返す代りに、変数に代入 */ } s_print_int ( n ); s_print_string ( "の階乗は" ); s_print_int ( fac ); s_print_string ( "です。\n" ); return 0; }
4
C:\usr\c>sample-022< sample-022.in 一つの数を入力してください 4 4の階乗は24です。 C:\usr\c>
Download : sample-023.c ( SJIS 版 )
/* * 2013/07/05 sample-023.c */ /* * 再帰呼出しと代入 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-023.exe sample-023.c * 実行 * sample-023 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * factrial */ int factrial ( int n ) { int retV; if ( n < 2 ) { retV = 1; } else { int n1 = n - 1; int fac1; /* fac1 = factial ( n1 ); の展開 */ { int n = n1; /* 新しい n (引数) に n1 の値を入れる */ int retV; if ( n < 2 ) { retV = 1; } else { int n1 = n - 1; int fac1; fac1 = factrial ( n1 ); } fac1 = retV; /* 値を返す代りに、変数に代入 */ } retV = fac1 * n; } return fac; } /* * main */ int main ( int argc, char *argv[] ) { int n; int fac; s_print_string ( "一つの数を入力してください\n" ); n = s_input_int(); fac = factrial ( n ); s_print_int ( n ); s_print_string ( "の階乗は" ); s_print_int ( fac ); s_print_string ( "です。\n" ); return 0; }
4
C:\usr\c>sample-023< sample-023.in 一つの数を入力してください 4 4の階乗は24です。 C:\usr\c>
/* * 2013/07/05 sample-001.c */ /* * 二分法 * * 一つ浮動小数点数値をキーボードから入力し、その平方根を出力する * 手段としては、「二分法」を使う * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-001.exe sample-001.c * 実行 * sample-001 */ #include <stdio.h> #include <stdlib.h> /* exit を利用するので必要 */ #include "s_input.h" #include "s_print.h" /* * */ #define EPSILON 0.00000001 /* 誤差幅 */ /* * double regula_falsi_square_root ( double a, double min, double mid, \ double max ) * double a 平方根の元になる数(正を仮定している) * double min, max 根の入る区間の範囲 * double mid min と mix の中点 * return a 平方根 * 二分法により、a の平方根を求める * 0 < min < a の平方根 < max */ double regula_falsi_square_root ( double a, double min, double mid, double \ max ) { if ( max - min < EPSILON ) { /* 十分に精度が上った */ return mid; /* 中点の値を答として返す */ } else { /* まだ、狭める必要がある */ /* min が解のどちら側にあるかを調べ.. それに併せて区間を調整 */ /* f(x)=x^2-a */ if ( mid * mid - a < 0.0 ) { /* f(mid) の符号を確認 */ /* 解の左にあった */ return regula_falsi_square_root ( a, mid, (mid+max)/2.0, max ); } else { /* 解の右にあった */ return regula_falsi_square_root ( a, min, (min+mid)/2.0, mid ); } } } /* * double square_root ( double a ) * double a 平方根の元になる数 * return a 平方根 * a の平方根を求めて結果として返すが、 * 計算の基本は、regula_falsi_square_root にまかせる * ここでは、計算の正規化を行う */ double square_root ( double a ) { /* * f(x) = x^2 - a を使う ( a>0 を想定 ) * f(x) が連続 ( 明らかなので、何も考えず使う * f(i) < 0 < f(a) となる i, a が必要 * これは、与えられていないので、ここで考える */ if ( a < 0.0 ) { /* a が負の数ならば.. */ s_print_string ( "負の平方根は計算できません\n" ); /* エラーメッセージを出力し.. */ exit ( -1 ); /* Error Code (-1) でプログラム終了 */ } else if ( a < 1.0 ) { /* a が 1.0 以下なら */ /* a が 1 より小さい場合と大きい場合に場合分け */ /* * 0 < a < 1 * ---> \sqrt{0} < \sqrt{a} < \sqrt{1} * ---> 0 < \sqrt{a} < 1 * ---> \sqrt{a}*\sqrt{a} < 1*\sqrt{a} * ---> a < \sqrt{a} * ---> 解は [a,1] にある */ return regula_falsi_square_root ( a, a, (a+1.0)/2.0, 1.0 ); /* 平方根は a と 1.0 の間にある */ } else { /* そうでなければ.. */ /* * 1 < a * ---> \sqrt{1} < \sqrt{a} * ---> 1 < \sqrt{a} * ---> 1*\sqrt{a} < \sqrt{a}*\sqrt{a} * ---> \sqrt{a} < a * ---> 解は [1,a] にある */ return regula_falsi_square_root ( a, 1.0, (1.0+a)/2.0, a ); /* 平方根は 1.0 と a の間にある */ } } /* * void print_square_root ( double a ) * double a 平方根を計算する数 * 元の数と、平方根を出力する */ void print_square_root ( double a ) { /* 結果を出力するだけ */ s_print_double ( a ); s_print_string ( " の平方根は " ); /* 平方根の計算は、squre_root にお任せ */ s_print_double ( square_root ( a ) ); s_print_string ( " です。\n" ); } /* * main */ int main( double argc, char *argv[] ) { s_print_string ( "実数値を一つ入力してください : " ); /* \sqrt{a} を求めたい a をキーボードから入力 */ /* その a を引数にして、関数 print_square_root を呼ぶ */ print_square_root ( s_input_double() ); return 0; }
/* * 2013/07/05 sample-001.c */ /* * 二分法 * * 一つ浮動小数点数値をキーボードから入力し、その立方根を出力する * 手段としては、「二分法」を使う * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-001.exe sample-001.c * 実行 * sample-001 */ #include <stdio.h> #include <stdlib.h> /* exit を利用するので必要 */ #include "s_input.h" #include "s_print.h" /* * */ #define EPSILON 0.00000001 /* 誤差幅 */ /* * double regula_falsi_square_root ( double a, double min, double mid, \ double max ) * double a 立方根の元になる数(正を仮定している) * double min, max 根の入る区間の範囲 * double mid min と mix の中点 * return a 立方根 * 二分法により、a の立方根を求める * 0 < min < a の立方根 < max */ double regula_falsi_square_root ( double a, double min, double mid, double \ max ) { if ( max - min < EPSILON ) { /* 十分に精度が上った */ return mid; /* 中点の値を答として返す */ } else { /* まだ、狭める必要がある */ /* min が解のどちら側にあるかを調べ.. それに併せて区間を調整 */ /* f(x)=x^3-a */ if ( mid * mid * mid - a < 0.0 ) { /* f(mid) の符号を確認 */ /* 解の左にあった */ return regula_falsi_square_root ( a, mid, (mid+max)/2.0, max ); } else { /* 解の右にあった */ return regula_falsi_square_root ( a, min, (min+mid)/2.0, mid ); } } } /* * double square_root ( double a ) * double a 立方根の元になる数 * return a 立方根 * a の立方根を求めて結果として返すが、 * 計算の基本は、regula_falsi_square_root にまかせる * ここでは、計算の正規化を行う */ double square_root ( double a ) { /* * f(x) = x^2 - a を使う ( a>0 を想定 ) * f(x) が連続 ( 明らかなので、何も考えず使う * f(i) < 0 < f(a) となる i, a が必要 * これは、与えられていないので、ここで考える */ if ( a < 0.0 ) { /* a が負の数ならば.. */ return - square_root ( -a ); /* \sqrt[3]{a} が欲いのだが、a<0 の時には、 \sqrt[3]{a} = - \sqrt[3]{-a} で、-a > 0 なので、square_root の引数が 正の場合しか計算できなくても、 問題をさける事ができる。 */ } else if ( a < 1.0 ) { /* a が 1.0 以下なら */ /* a が 1 より小さい場合と大きい場合に場合分け */ /* * 0 < a < 1 * ---> \sqrt{0} < \sqrt{a} < \sqrt{1} * ---> 0 < \sqrt{a} < 1 * ---> \sqrt{a}*\sqrt{a} < 1*\sqrt{a} * ---> a < \sqrt{a} * ---> 解は [a,1] にある */ return regula_falsi_square_root ( a, a, (a+1.0)/2.0, 1.0 ); /* 立方根は a と 1.0 の間にある */ } else { /* そうでなければ.. */ /* * 1 < a * ---> \sqrt{1} < \sqrt{a} * ---> 1 < \sqrt{a} * ---> 1*\sqrt{a} < \sqrt{a}*\sqrt{a} * ---> \sqrt{a} < a * ---> 解は [1,a] にある */ return regula_falsi_square_root ( a, 1.0, (1.0+a)/2.0, a ); /* 立方根は 1.0 と a の間にある */ } } /* * void print_square_root ( double a ) * double a 立方根を計算する数 * 元の数と、立方根を出力する */ void print_square_root ( double a ) { /* 結果を出力するだけ */ s_print_double ( a ); s_print_string ( " の立方根は " ); /* 立方根の計算は、squre_root にお任せ */ s_print_double ( square_root ( a ) ); s_print_string ( " です。\n" ); } /* * main */ int main( double argc, char *argv[] ) { s_print_string ( "実数値を一つ入力してください : " ); /* \sqrt{a} を求めたい a をキーボードから入力 */ /* その a を引数にして、関数 print_square_root を呼ぶ */ print_square_root ( s_input_double() ); return 0; }
/* * CDATE FILENAME */ /* * 関数と引数変数 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe FILENAME * 実行 * BASENAME */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * main */ void kashi_n(char *X) { /* X は、仮引数で、「変数」である 変数 : 値が変化するもの 値は、関数を呼出した時の実引数の値が入る */ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( X ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); } void kashi_1(void) { /* 一番 */ kashi_n ( "後の山に 棄てましょか\n" ); /* ここでは、実引数として、「"後の山に 棄てましょか\n"」 が指定されているので、X に、"後の山に 棄てましょか\n" が入る */ } void kashi_2 (void) { /* ニ番 */ kashi_n ( "背戸の小薮に 埋けましょか\n" ); /* ここでは、実引数として、「"背戸の小薮に 埋けましょか\n"」 が指定されているので、X に、"背戸の小薮に 埋けましょか\n" が入る */ } int main ( int argc, char *argv[] ) { kashi_1(); kashi_2(); return 0; }
/* * CDATE FILENAME */ /* * 関数と引数変数 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe FILENAME * 実行 * BASENAME */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * main */ void kashi_n(char *X) { /* X は、仮引数で、「変数」である 変数 : 値が変化するもの 値は、関数を呼出した時の実引数の値が入る */ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( X ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); } void kashi_1(void) { /* 一番 */ kashi_n ( "後の山に 棄てましょか\n" ); /* ここでは、実引数として、「"後の山に 棄てましょか\n"」 が指定されているので、X に、"後の山に 棄てましょか\n" が入る */ } void kashi_2 (void) { /* ニ番 */ kashi_n ( "背戸の小薮に 埋けましょか\n" ); /* ここでは、実引数として、「"背戸の小薮に 埋けましょか\n"」 が指定されているので、X に、"背戸の小薮に 埋けましょか\n" が入る */ } int main ( int argc, char *argv[] ) { kashi_1(); /* kashi_1(); ↓ kashi_n ( "後の山に 棄てましょか\n" ); ↓ X ← "後の山に 棄てましょか\n" s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( X ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); ↓ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( "後の山に 棄てましょか\n" ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); */ kashi_2(); return 0; }
/* * CDATE FILENAME */ /* * 関数と引数変数 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe FILENAME * 実行 * BASENAME */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * main */ void kashi_n(char *X) { /* X は、仮引数で、「変数」である 変数 : 値が変化するもの 値は、関数を呼出した時の実引数の値が入る */ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( X ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); } void kashi_1(void) { /* 一番 */ kashi_n ( "後の山に 棄てましょか\n" ); /* ここでは、実引数として、「"後の山に 棄てましょか\n"」 が指定されているので、X に、"後の山に 棄てましょか\n" が入る */ } void kashi_2 (void) { /* ニ番 */ kashi_n ( "背戸の小薮に 埋けましょか\n" ); /* ここでは、実引数として、「"背戸の小薮に 埋けましょか\n"」 が指定されているので、X に、"背戸の小薮に 埋けましょか\n" が入る */ } int main ( int argc, char *argv[] ) { { char *X = "後の山に 棄てましょか\n"; s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( X ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); } kashi_2(); return 0; }
/* * CDATE FILENAME */ /* * 関数と引数変数 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o BASENAME.exe FILENAME * 実行 * BASENAME */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * main */ void kashi_n(char *X) { /* X は、仮引数で、「変数」である 変数 : 値が変化するもの 値は、関数を呼出した時の実引数の値が入る */ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( X ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); } void kashi_1(void) { /* 一番 */ kashi_n ( "後の山に 棄てましょか\n" ); /* ここでは、実引数として、「"後の山に 棄てましょか\n"」 が指定されているので、X に、"後の山に 棄てましょか\n" が入る */ } void kashi_2 (void) { /* ニ番 */ kashi_n ( "背戸の小薮に 埋けましょか\n" ); /* ここでは、実引数として、「"背戸の小薮に 埋けましょか\n"」 が指定されているので、X に、"背戸の小薮に 埋けましょか\n" が入る */ } int main ( int argc, char *argv[] ) { /* kashi_1(); */ /* kashi_n ( char *X ) { .. } の関数本体「{..}」をそのまま */ { /* プラスα : X ← "後の山に 棄てましょか\n" */ char *X = "後の山に 棄てましょか\n"; /* 変数宣言 : char *X; 代入 : X = "後の山に 棄てましょか\n"; */ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( X ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); } /* kashi_1(); ↓ kashi_n ( "後の山に 棄てましょか\n" ); ↓ X ← "後の山に 棄てましょか\n" s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( X ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); ↓ s_print_string ( "唄を忘れた 金糸雀(かなりや)は\n" ); s_print_string ( "後の山に 棄てましょか\n" ); s_print_string ( "いえ いえ それはなりませぬ\n" ); s_print_newline(); */ kashi_2(); return 0; }
#include <stdio.h> #include "s_print.h" void print_number ( int n ) { s_print_int ( n ); /* ここでは実引数の値 */ s_print_newline(); n = 9999; /* n は変数なので、代入ができる */ s_print_int ( n ); /* 上書きされた 9999 */ s_print_newline(); n = 777; /* n は変数なので、代入ができる */ s_print_int ( n ); /* 上書きされた 9999 */ s_print_newline(); } /* * main */ int main ( int argc, char *argv[] ) { print_number ( 1 ); /* n ← 1 ここでは、n が 1 になっているのに.. n = 9999; n は変数なので、代入ができる その n の値が書き換えられて 9999 になってしまう 元の n の値 (1,10,100) は捨てられてしまう s_print_int ( n ); ここでは、常に 9999 が表示される s_print_newline(); */ print_number ( 10 ); print_number ( 100 ); return 0; }
/* * 二つの数を入力して、小さい順に出すプログラム * 変数を使って、代入を利用して作る */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * main */ int main(int argc, char *argv[] ) { int i1; /* 入力をした値を保持する変数を宣言 */ int i2; /* i1 が一つ目, i2 が二つ目 */ int o1; /* 出力する値を保持する変数を宣言 */ int o2; /* o1 が小さい方、o2 が大きい方 */ /* を保持するようにする */ /* [INPUT] */ /* i1, i2 に、それぞれ整数値をキーボードから入力する */ s_print_string ( "一つ目の数を入力してください : " ); i1 = s_input_int(); s_print_string ( "二つ目の数を入力してください : " ); i2 = s_input_int(); /* [PROCESS] */ /* i1, i2 の値の小さい方を o1 に、 大きい方の値を o2 に入れる */ if ( i1 < i2 ) { /* i2 がおおきくて i1 が小さいので.. */ o1 = i1; o2 = i2; } else { /* 逆だった.. */ o1 = i2; o2 = i1; } /* [OUTPUT] */ /* o1, o2 を出力する */ s_print_int ( o1 ); /* 小さい方が出力される */ s_print_char ( ',' ); s_print_int ( o2 ); /* 大きい方が出力される */ s_print_newline(); return 0; }
/* * 課題 20130628-01 * * 2013/06/28 20130628-01-QQQQ.c * * キーボードから三つの整数を入力し、小さい順に出力する */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * main */ int main( int argc, char *argv[] ) { int i1; /* 三つの入力された整数を保存する変数 */ /* ** この部分を完成させなさい (int i2;) */ int i3; int o1; /* 小さい順に値を入れる */ int o2; /* 小さい順に値を入れる */ /* ** この部分を完成させなさい (int o3;) */ s_print_string ( "一つ目の整数を入力してください : " ); i1 = s_input_int(); s_print_string ( "二つ目の整数を入力してください : " ); i2 = s_input_int(); s_print_string ( "三つ目の整数を入力してください : " ); /* ** この部分を完成させなさい ( i3 = s_input_int(); ) */ /* * 数を比較して、一番小さい物をみつける */ if ( i1 < i2 ) { /* i2 は i1 より大きい */ if ( i2 < i3 ) { /* 更に、i3 は i2 より大きい */ /* i1 < i2 < i3 となっている */ /* ** この部分を完成させなさい ( o1 = i1; o2 = i2.. ) */ /* i3 < i2, i1 < i2 : i1 と i3 の関係が不明 */ } else if ( i1 < i3 ) { /* i1 < i3 が分った.. */ /* i1 < i3 < i2 */ o1 = i1; o2 = i3; o3 = i2; } else { o1 = i3; o2 = i1; o3 = i2; } } else { /* i2 < i1 なので.. */ if ( i1 < i3 ) { o1 = i2; o2 = i1; o3 = i3; } else if ( i2 < i3 ) { /* ** この部分を完成させなさい */ } else { o1 = i3; o2 = i2; o3 = i1; } } /* * 出力 */ /* ** この部分を完成させなさい */ s_print_char ( ',' ); s_print_int ( o2 ); s_print_char ( ',' ); s_print_int ( o3 ); s_print_newline(); return 0; }
#include <stdio.h> #include "s_print.h" int main(int argc, char *argv[] ) { int lv; /* 局所変数の定義 */ /* int 型で名前は lv */ double lv2; /* double 型の変数の宣言 */ lv2 = 1.0; /* 変数は代入して使う */ s_print_double ( lv2 ); /* 1.0 が出力される */ s_print_newline(); { double lv3; /* このブロックの先頭で宣言されたので * このブロック内のみ有効 */ lv3 = lv2 * 2.0; /* ブロックの外で宣言された変数は ブロックの中でも利用できる */ s_print_double ( lv3 ); /* 2.0 が出力される */ s_print_newline(); } /* ブロックの外で、lv3 を利用しようとすると.. */ /* エラーになるので削除 s_print_double ( lv3 ); s_print_newline(); */ { double lv2; /* もし、ブロックの中で同じ名前をつかったら... */ /* 外のブロックの変数が遮蔽され みえなくなり、新しい変数の lv2 が作られる。 以下は、この新しい lv2 が 使われる(代入も参照も..) lv2 = 3.0; /* lv2 に 3.0 を代入したので.. */ s_print_double ( lv2 ); /* 3.0 表示される */ s_print_newline(); } /* ブロックが終了し、ブロック内の lv2 がなくなると 元の lv2 がみえる */ s_print_double ( lv2 ); /* この lv2 はブロックの前の lv2 なので、1.0 が表示される */ s_print_newline(); { double lv2 = lv2 * 10.0; /* lv2 の値の初期化 */ /* 初期化の名前は、宣言の 前の名前と見做す このブロック内の lv2 には、外のブロックの lv2 の値の 10 倍が入る */ s_print_double ( lv2 ); /* 10.0 が表示される */ } return 0; }
Download : 20130705-01.c ( SJIS 版 )
/* * 課題 20130628-01 * * 2013/06/28 20130628-01-QQQQ.c * * キーボードから三つの整数を入力し、小さい順に出力する */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * main */ int main( int argc, char *argv[] ) { int i1; /* 三つの入力された整数を保存する変数 */ /* ** この部分を完成させなさい */ int i3; int o1; /* 小さい順に値を入れる */ int o2; /* 小さい順に値を入れる */ /* ** この部分を完成させなさい */ s_print_string ( "一つ目の整数を入力してください : " ); i1 = s_input_int(); s_print_string ( "二つ目の整数を入力してください : " ); i2 = s_input_int(); s_print_string ( "三つ目の整数を入力してください : " ); /* ** この部分を完成させなさい */ /* * 数を比較して、一番小さい物をみつける */ if ( i1 < i2 ) { if ( i2 < i3 ) { /* ** この部分を完成させなさい */ } else if ( i1 < i3 ) { o1 = i1; o2 = i3; o3 = i2; } else { o1 = i3; o2 = i1; o3 = i2; } } else { if ( i1 < i3 ) { o1 = i2; o2 = i1; o3 = i3; } else if ( i2 < i3 ) { /* ** この部分を完成させなさい */ } else { o1 = i3; o2 = i2; o3 = i1; } } /* * 出力 */ /* ** この部分を完成させなさい */ s_print_char ( ',' ); s_print_int ( o2 ); s_print_char ( ',' ); s_print_int ( o3 ); s_print_newline(); return 0; }
4 1 3
C:\usr\c\> 20130705-01-QQQQ 一つ目の整数を入力してください : 二つ目の整数を入力してください : 三つ目の整数を入力してください : 1,3,4 C:\usr\c\>