#include <stdio.h> #include "s_print.h" /* f(x)=x^2 f(3) -> 3*3 -> 9 */ int f(int x) { return x*x; } int main(void) { s_print_string ( "f(3)=" ); s_print_int ( f(3) ); /* f(3) -> x=3 // 変数 x に値 3 が割り当たっている f(x) // 「x に 3 が代入」された -> x=3 return x*x; -> x=3 return 3*3; -> return 9; -> 9 */ s_print_string ( "\n" ); /* 「f(3)=9」と表示されるはず.. */ /* 同様にして f(4) -> x = 4 f(x) .. 16 */ return 0; }
#include <stdio.h> #include "s_print.h" int f(int x) { s_print_string ( "(x=" ); s_print_int ( x ); s_print_string ( ")" ); /* x には 3 が割り当てられていた */ x = 7; /* 「変数 x に値 7 を代入」 代入(の典型的な書かた) */ s_print_string ( "(x=" ); s_print_int ( x ); s_print_string ( ")" ); return x*x; } int main(void) { s_print_string ( "f(3)=" ); s_print_int ( f(3) ); /* x に 3 が代入 */ s_print_string ( "\n" ); /* 「f(3)=(x=3)(x=7)49」 ^^^^^^^^^^ は f の中で出力した と表示されるはず.. */ return 0; }
#include <stdio.h> #include "s_print.h" void fab ( int a, int b ) { s_print_string ( "a= " ); s_print_int ( a ); s_print_string ( ", b= " ); s_print_int ( b ); s_print_string ( "\n" ); a = b; /* a に b の値を代入 */ s_print_string ( "a= " ); s_print_int ( a ); s_print_string ( ", b= " ); s_print_int ( b ); s_print_string ( "\n" ); } void fba ( int a, int b ) { s_print_string ( "a= " ); s_print_int ( a ); s_print_string ( ", b= " ); s_print_int ( b ); s_print_string ( "\n" ); b = a; /* b に a の値を代入 */ s_print_string ( "a= " ); s_print_int ( a ); s_print_string ( ", b= " ); s_print_int ( b ); s_print_string ( "\n" ); } int main(void) { s_print_string ( "fab(3,7) を呼び出す\n" ); fab(3,7); s_print_string ( "fba(3,7) を呼び出す\n" ); fba(3,7); return 0; }
/* 二つの整数型の変数 a, b があり、異る値が入っている ものとする。 このとき、a と b の値を交換したいが、どうすればよいか ? */ void exchange ( int a, int b, int work ) { s_print_string ( "a= " ); s_print_int ( a ); s_print_string ( " b= " ); s_print_int ( b ); s_print_string ( "\n" ); /* a の値と b の値を交換 */ /* a = 3, b = 7, work = 0 [←どうでも良い..] */ work = a; /* a = 3, b = 7, work = 3 */ a = b; /* a = 7, b = 7, work = 3 */ b = work; /* a = 7, b = 3, work = 3 */ /* a = 7, b = 3, work = 3 [←どうでもよい] */ /* 「work」という変数は、 全体の作業をするための中間的な存在 <-反-> 関数の引数 「引数以外の形で使えると便利」 -> 局所(local)変数 [ auto 変数 ] の作りかた 「局所変数宣言」 */ s_print_string ( "a= " ); s_print_int ( a ); s_print_string ( " b= " ); s_print_int ( b ); s_print_string ( "\n" ); } int main(void) { exchange ( 3, 7, 0 ); /* a=3, b=7 a=7, b=3 */ }
/* 二つの整数型の変数 a, b があり、異る値が入っている ものとする。 このとき、a と b の値を交換したいが、どうすればよいか ? */ void exchange ( int a, int b ) { int work; /* work という局所変数の宣言 */ /* work にはどのような値が最初に 割り当たっているかは不明(定) */ s_print_string ( "a= " ); s_print_int ( a ); s_print_string ( " b= " ); s_print_int ( b ); s_print_string ( "\n" ); /* a の値と b の値を交換 */ /* a = 3, b = 7, work = ? [←どうでも良い..] */ work = a; /* 局所変数は、最初に初期化する */ /* a = 3, b = 7, work = 3 */ a = b; /* a = 7, b = 7, work = 3 */ b = work; /* a = 7, b = 3, work = 3 */ /* a = 7, b = 3, work = 3 [←どうでもよい] */ /* 「work」という変数は、 全体の作業をするための中間的な存在 <-反-> 関数の引数 「引数以外の形で使えると便利」 -> 局所(local)変数 [ auto 変数 ] の作りかた 「局所変数宣言」 */ s_print_string ( "a= " ); s_print_int ( a ); s_print_string ( " b= " ); s_print_int ( b ); s_print_string ( "\n" ); } int main(void) { exchange ( 3, 7 ); /* a=3, b=7 a=7, b=3 */ }
#include <stdio.h> #include "s_print.h" /* * 'a' 〜 'z' までの文字を出す */ int main(void) { char ch; ch = 'a'; /* 時間 (0) */ while ( ch <= 'z' ) { /* ch の値が 'z' 以下の間 (t-1) */ putchar ( ch ); /* その文字を出力し (t-2) */ ch = ch + 1; /* 出力する文字の値を 1 ふやす (t-3) */ } /* 時間 (2) */ return 0; } /* 時間 変数 条件(ch <= 'z') 0 ch == 'a' 成立 while に入る直前 0-1 条件が成立するので本体実行 0-2 putchar (ch) -> 'a' 0-3 ch == 'b' ch の値を 1 ふやす 1 ch == 'b' 成立 while に入る直前 1-1 条件が成立するので本体実行 1-2 putchar (ch) -> 'b' 1-3 ch == 'c' ch の値を 1 ふやす 2 ch == 'c' 成立 while に入る直前 2-1 条件が成立するので本体実行 2-2 putchar (ch) -> 'c' 2-3 ch == 'd' ch の値を 1 ふやす .... t ch == 'z' 成立 while に入る直前 t-1 条件が成立するので本体実行 t-2 putchar (ch) -> 'z' t-3 ch == ';' ch の値を 1 ふやす t+1 ch == ';' 不成立 2 終了 while ( ch <= 'z' ) { putchar ( ch ); ch = ch + 1; } 同じ putchar ( ch ); ch = ch + 1; putchar ( ch ); ch = ch + 1; ... putchar ( ch ); ch = ch + 1; */
#include <stdio.h> #include "s_print.h" /* * 'a' 〜 'z' までの文字を出す */ void printatoz ( char ch ) { if ( ch <= 'z' ) { putchar ( ch ); printatoz ( ch + 1 ); } } int main(void) { char ch; printatoz ( 'a' ); return 0; }
1+5/2 -> int 型 = 3 1.0+5/2 -> double 型の値になる A) 3.0 ◎ B) 3.5 × 1.0+5/2 -> 1.0+(5/2) -> (double)1.0+((int)5/(int)2) -> (double)1.0+(int)2 -> (double)1.0+(double)2 -> (double)1.0+(double)2.0 -> (double)3.0 1+5/2.0 -> 1+(5/2.0) -> 1+(5.0/2.0) -> 1+2.5 -> 1.0+2.5 -> 3.5 キャストを使わずに、浮動小数点数に変換 *1.0 +0.0 3*1.0 -> 3.0 4+0.0 -> 4.0 == while 文の構文規則(書き方) while ( 条件 ) { 命令 } while 文の意味 「条件」が成立する間「命令」を繰り返す cf. if の構文とよくにている if ( 条件 ) { 命令 } else {}
Download : 20140627-01.c ( SJIS 版 )
/* * TITLE * * CDATE FILENAME * * 一つ浮動小数点数値をキーボードから入力し、その立方根を出力する * 手段としては、「二分法」を使う */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * */ #define EPSILON 0.00000001 /* 誤差幅 */ /* * double regula_falsi_cubic_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_cubic_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) の符号を確認 */ /* 解の左にあった */ /* ** この部分を完成させなさい */ } else { /* 解の右にあった */ return regula_falsi_cubic_root ( a, min, (min+mid)/2.0, mid ); } } } /* * double cubic_root ( double a ) * double a 立方根の元になる数 * return a 立方根 * a の立方根を求めて結果として返すが、 * 計算の基本は、regula_falsi_cubic_root にまかせる * ここでは、計算の正規化を行う */ double cubic_root ( double a ) { if ( a < 0.0 ) { /* a が負の数ならば.. */ /* -a の立方根を計算し、負数を返す */ /* ** この部分を完成させなさい */ } else if ( a < 1.0 ) { /* a が 1.0 以下なら */ /* ** この部分を完成させなさい */ /* 立方根は a と 1.0 の間にある */ } else { /* そうでなければ.. */ return regula_falsi_cubic_root ( a, 1.0, (1.0+a)/2.0, a ); /* 立方根は 1.0 と a の間にある */ } } /* * void print_cubic_root ( double a ) * double a 立方根を計算する数 * 元の数と、立方根を出力する */ void print_cubic_root ( double a ) { s_print_double ( a ); s_print_string ( " の立方根は " ); /* ** この部分を完成させなさい */ s_print_string ( " です。\n" ); } /* * main */ int main( double argc, char *argv[] ) { s_print_string ( "実数値を一つ入力してください : " ); print_cubic_root ( s_input_double() ); return 0; }
12.34
C:\usr\c\> 20140627-01-QQQQ 実数値を一つ入力してください : 12.340000 12.340000 の立方根は 2.310850 です。 C:\usr\c\>
Download : 20140627-02.c ( SJIS 版 )
/* * TITLE * * CDATE FILENAME * * キーボードから三つの整数を入力し、小さい順に出力する */ #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\> 20140627-02-QQQQ 一つ目の整数を入力してください : 4 二つ目の整数を入力してください : 1 三つ目の整数を入力してください : 3 1,3,4 C:\usr\c\>
-->