Download : sample-001.c
/* * 2021/07/02 sample-001.c * * [コンパイル] * cc -I ~/include -c sample-001.c * [リンク] * cc -o sample-001.exe sample-001.o * [実行] * ./sample-001.exe */ /* * 入力を一度だけ処理 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * main 関数 */ int main ( int argc, char *argv[] ) { s_print_string ( "整数値を一つ入力してください、一つ増やした値を出力します:" ); s_print_int ( s_input_int() + 1 ); /* 整数値を入力し、1 を増やし、出力 */ s_print_newline(); return 0; }
123
$ ./sample-001.exe < sample-001.in 整数値を一つ入力してください、一つ増やした値を出力します:123 124 $
Download : sample-002.c
/* * 2021/07/02 sample-002.c * * [コンパイル] * cc -I ~/include -c sample-002.c * [リンク] * cc -o sample-002.exe sample-002.o * [実行] * ./sample-002.exe */ /* * 入力を複数回処理 * 入力関数(s_input_int())が呼び出される度に、入力が行われる */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * main 関数 */ int main ( int argc, char *argv[] ) { /* * 一回目 */ s_print_string ( "一回目:整数値を一つ入力してください、一つ増やした値を出力します:" ); s_print_int ( s_input_int() + 1 ); s_print_newline(); /* * ニ回目 */ s_print_string ( "ニ回目:整数値を一つ入力してください、一つ増やした値を出力します:" ); s_print_int ( s_input_int() + 1 ); s_print_newline(); /* * */ return 0; }
123 456
$ ./sample-002.exe < sample-002.in 一回目:整数値を一つ入力してください、一つ増やした値を出力します:123 124 ニ回目:整数値を一つ入力してください、一つ増やした値を出力します:456 457 $
Download : sample-003.c
/* * 2021/07/02 sample-003.c * * [コンパイル] * cc -I ~/include -c sample-003.c * [リンク] * cc -o sample-003.exe sample-003.o * [実行] * ./sample-003.exe */ /* * 一つの入力を複数回処理 * 入力関数の呼出し(入力)は一回だが、値(入力値)は複数利用したい * 関数(変数)を利用するしかない */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * 引数で与えらえた値を複数回利用する(関数/引数変数の特権 !!) */ void print_add_one_result ( int value ) { s_print_string ( "整数値 " ); s_print_int ( value ); /* 一度目の利用 */ s_print_string ( " に 1 を加えた値は " ); s_print_int ( value + 1 ); /* 二度目の利用 */ s_print_string ( "これを 2 倍した値は " ); s_print_int ( value * 2 ); /* 三度目の利用 */ s_print_string ( " になります。\n" ); } /* * main 関数 */ int main ( int argc, char *argv[] ) { /* * 一回目 */ print_add_one_result ( s_input_int() ); /* 「入力(機能)」は「ここ」で一回 */ /* 「入力値」は、関数内で、何度も利用可能 */ /* * ニ回目 */ print_add_one_result ( s_input_int() ); /* 二度目の入力 */ /* * */ return 0; }
123 456
$ ./sample-003.exe < sample-003.in 123 整数値 123 に 1 を加えた値は 124これを 2 倍した値は 246 になります。 456 整数値 456 に 1 を加えた値は 457これを 2 倍した値は 912 になります。 $
Download : sample-004.c
/* * 2021/07/02 sample-004.c * * [コンパイル] * cc -I ~/include -c sample-004.c * [リンク] * cc -o sample-004.exe sample-004.o * [実行] * ./sample-004.exe */ /* * インプットループ * 入力を繰り返す関数 */ #include <stdio.h> /* * 改行 ('\n') が入力されるまで、文字を入力し、それを二度ずつ出力する */ void print_twice_char ( char ch ) { putchar ( ch ); /* とりあえず二度出力 */ putchar ( ch ); if ( ch == '\n' ) { /* 改行だった / もうこれ以上処理しない */ /* 何もしない */ } else { /* まだ処理する必要がある */ print_twice_char ( getchar() ); /* 入力をして、再帰 */ } } /* * main 関数 */ int main ( int argc, char *argv[] ) { /* * 最初の呼出しは main で.. */ print_twice_char ( getchar() ); /* * */ return 0; }
abc$
$ ./sample-004.exe < sample-004.in abc$ aabbcc$$ $
Download : sample-005.c
/* * 2021/07/02 sample-005.c * * [コンパイル] * cc -I ~/include -c sample-005.c * [リンク] * cc -o sample-005.exe sample-005.o * [実行] * ./sample-005.exe */ /* * 乱数 */ #include <stdio.h> #include "s_print.h" #include "s_random.h" /* s_random を利用するので.. */ /* s_init_random() --- 乱数系列を現在の時刻を利用して決定 s_random() --- 整数値を持つ(疑似)一様乱数を返す */ /* * main 関数 */ int main ( int argc, char *argv[] ) { /* * */ s_init_random(); /* 乱数系列の初期化 */ /* * */ s_print_string ( "乱数を出力します : " ); s_print_int ( s_random() ); s_print_newline(); /* * */ return 0; }
$ ./sample-005.exe 乱数を出力します : 725633840 $
/* * 課題 CNAME-01 * * CDATE FILENAME * * キーボードから一文字入力し、その文字によって異る国の挨拶をする */ #include <stdio.h> /* * hello ( char contry ) * char contry : 国を表す一文字 * j : 日本 * e : 英語 * c : 中国 * f : フランス語 * g : ドイツ語 */ void hello ( char cmd ) { /* if 構文版を参考してほしい */ switch ( cmd ) { case 'j': /* 'j' の時は、日本語にする */ printf ( "こんにちは\n" ); break; case 'e': /* 'e' の時は、英語にする */ printf ( "Good Afternoon\n" ); break; case 'c': /* 'c' の時は、中国語にする */ printf ( "ニイハオ\n" ); break; case 'f': /* 'f' の時は、フランス語にする */ printf ( "Bonjour\n" ); break; case 'g': /* 'g' の時は、ドイツ語にする */ printf ( "Guten tag\n" ); break; default: /* どれでもなければ.. */ printf ( "???\n" ); break; } } /* * main */ int main( void ) { printf ( "国を表す文字を入力してください\n" ); printf ( "\tj\t日本\n" ); printf ( "\te\t英語\n" ); printf ( "\tc\t中国\n" ); printf ( "\tf\tフランス\n" ); printf ( "\tg\tドイツ\n" ); hello ( getchar() ); /* getchar() で文字を入力し、それに対応する結果を出す */ return 0; }
#include <stdio.h> /* 関数 f(x) = x^2 */ #include "s_print.h" #include "s_input.h" /* 与えれた整数値を二乗した値を返す関数 */ int f (int x) { /* x^2 = x * x */ return x * x; /* return 命令によって、関数が返す値を指定することができる */ /* return 命令の後ろに、 返したい値を計算する式を書くと、 その式の値が計算され、関数の返り値になる この命令を実行すると、 関数はその時点で終了になる !! 値を返さない ( void 関数 ) の場合であっても !! return 命令の後ろに式を書かず、return; 命令を実行することができる !! => その時点で、関数を終了させ、関数の呼び出し元に戻る !! return 命令は、「制御命令」である !! 制御命令 : 命令の実行順序を変更する命令 !! if 構文 */ } int main(void) { s_print_string ( "整数値を入力してください : " ); s_print_int ( f( s_input_int() ) ); s_print_newline(); return 0; }
#include <stdio.h> int f(int x) { printf ( "関数 f が呼び出されました\n" ); return x * x; } int g(int x) { printf ( "関数 g が呼び出されました\n" ); return x + 2; } int h(int x) { printf ( "関数 h が呼び出されました\n" ); return 3 * x; } int main(void) { printf ( "Main Start\n" ); f(g(h(1))); /* 計算は行われるが結果は捨てられる */ printf ( "Main End\n" ); return 0; }
#include <stdio.h> int f(int x, int y) { printf ( "関数 f が呼び出されました\n" ); return x * y; } int g(int x) { printf ( "関数 g が呼び出されました\n" ); return x + 2; } int h(int x) { printf ( "関数 h が呼び出されました\n" ); return 3 * x; } int main(void) { printf ( "Main Start\n" ); f(g(2),h(3)); /* 計算は行われるが結果は捨てられる */ printf ( "Main End\n" ); return 0; }
#include <stdio.h> #include "s_input.h" #include "s_print.h" /* トランプの数から、その札のマークを出力 1 => A 2-10 => そのまま数字 11 => J 12 => Q 13 => K その他の場合 => ? if 構文を利用した版 */ void trump ( int n ) { if ( n == 1 ) { printf ( "A\n" ); } else if ( n == 11 ) { printf ( "J\n" ); } else if ( n == 12 ) { printf ( "Q\n" ); } else if ( n == 13 ) { printf ( "K\n" ); } else { if ( 2 <= n ) { if ( n <= 10 ) { s_print_int ( n ); s_print_newline(); } else { s_print_string ( "?\n" ); } } else { s_print_string ( "?\n" ); } } } int main(void) { printf ( "整数値を入力し、それに対応するトランプのマークを出力します : " ); trump ( s_input_int() ); return 0; }
#include <stdio.h> #include "s_input.h" #include "s_print.h" /* トランプの数から、その札のマークを出力 1 => A 2-10 => そのまま数字 11 => J 12 => Q 13 => K その他の場合 => ? switch 構文を利用した場合 */ void trump ( int n ) { switch ( n ) { /* 一つの共通な式「n」に対して.. */ case 1: /* その値が 1 の時 */ /* if ( n == 1 ) { printf ( "A\n" ); } */ printf ( "A\n" ); break; /* case 1 ( n == 1 ) の命令は、ここで終了 */ case 11: /* その値が 11 の時 */ /* if ( n == 11 ) { printf ( "J\n" ); } */ printf ( "J\n" ); break; case 12: /* その値が 12 の時 */ /* if ( n == 12 ) { printf ( "Q\n" ); } */ printf ( "Q\n" ); break; case 13: /* その値が 13 の時 */ /* if ( n == 13 ) { printf ( "Q\n" ); } */ printf ( "K\n" ); break; default: /* 上記のどれにも当てはまらない場合 */ /* else 節 */ if ( 2 <= n ) { if ( n <= 10 ) { s_print_int ( n ); s_print_newline(); } else { s_print_string ( "?\n" ); } } else { s_print_string ( "?\n" ); } break; } } int main(void) { printf ( "整数値を入力し、それに対応するトランプのマークを出力します : " ); trump ( s_input_int() ); return 0; }
#include <stdio.h> #include "s_input.h" #include "s_print.h" /* トランプの数から、その札のマークを出力 1 => A 2-10 => そのまま数字 11 => J 12 => Q 13 => K その他の場合 => ? switch 構文で、break を上手に利用する場合 */ void trump ( int n ) { switch ( n ) { /* 一つの共通な式「n」に対して.. */ case 1: /* その値が 1 の時 */ /* if ( n == 1 ) { printf ( "A\n" ); } */ printf ( "A\n" ); break; /* case 1 ( n == 1 ) の命令は、ここで終了 */ case 11: /* その値が 11 の時 */ /* if ( n == 11 ) { printf ( "J\n" ); } */ printf ( "J\n" ); break; case 12: /* その値が 12 の時 */ /* if ( n == 12 ) { printf ( "Q\n" ); } */ printf ( "Q\n" ); break; case 13: /* その値が 13 の時 */ /* if ( n == 13 ) { printf ( "Q\n" ); } */ printf ( "K\n" ); break; default: /* 上記のどれにも当てはまらない場合 */ /* else 節 */ if ( 2 <= n ) { if ( n <= 10 ) { /* 2 <= n <= 10 */ s_print_int ( n ); s_print_newline(); break; /* この時に break するので、ここで switch 構文が終了 */ /* この命令の後ろの命令は実行されない */ } /* else {} */ } /* else {} */ s_print_stirng ( "?\n" ); /* この命令は break が実行されない時に実行される */ break; } } int main(void) { printf ( "整数値を入力し、それに対応するトランプのマークを出力します : " ); trump ( s_input_int() ); return 0; }
#include <stdio.h> #include "s_input.h" #include "s_print.h" /* トランプの数から、その札のマークを出力 1 => A 2-10 => そのまま数字 11 => J 12 => Q 13 => K その他の場合 => ? switch 構文で、break を上手に利用する場合 */ void trump ( int n ) { switch ( n ) { /* 一つの共通な式「n」に対して.. */ case 1: /* その値が 1 の時 */ /* if ( n == 1 ) { printf ( "A\n" ); } */ printf ( "A\n" ); break; /* case 1 ( n == 1 ) の命令は、ここで終了 */ case 11: /* その値が 11 の時 */ /* if ( n == 11 ) { printf ( "J\n" ); } */ printf ( "J\n" ); break; case 12: /* その値が 12 の時 */ /* if ( n == 12 ) { printf ( "Q\n" ); } */ printf ( "Q\n" ); break; case 13: /* その値が 13 の時 */ /* if ( n == 13 ) { printf ( "Q\n" ); } */ s_print_int ( n ); s_print_newline(); break; case 2: s_print_int ( n ); s_print_newline(); break; case 3: s_print_int ( n ); s_print_newline(); break; case 4: s_print_int ( n ); s_print_newline(); break; case 5: s_print_int ( n ); s_print_newline(); break; case 6: s_print_int ( n ); s_print_newline(); break; case 7: s_print_int ( n ); s_print_newline(); break; case 8: s_print_int ( n ); s_print_newline(); break; case 9: s_print_int ( n ); s_print_newline(); break; case 10: s_print_int ( n ); s_print_newline(); break; default: /* 上記のどれにも当てはまらない場合 */ s_print_stirng ( "?\n" ); /* この命令は break が実行されない時に実行される */ break; } } int main(void) { printf ( "整数値を入力し、それに対応するトランプのマークを出力します : " ); trump ( s_input_int() ); return 0; }
#include <stdio.h> #include "s_input.h" #include "s_print.h" /* トランプの数から、その札のマークを出力 1 => A 2-10 => そのまま数字 11 => J 12 => Q 13 => K その他の場合 => ? switch 構文で、break を上手に利用する場合 */ void trump ( int n ) { switch ( n ) { /* 一つの共通な式「n」に対して.. */ case 1: /* その値が 1 の時 */ /* if ( n == 1 ) { printf ( "A\n" ); } */ printf ( "A\n" ); break; /* case 1 ( n == 1 ) の命令は、ここで終了 */ case 2: /* break; */ /* break 命令がないので case 2 => case 3 にゆく */ case 3: /* break; */ case 4: case 5: case 6: case 7: case 8: case 9: case 10: /* case 2-9 の場合 break がないので、case 10 のところに雪崩こむ */ s_print_int ( n ); s_print_newline(); break; case 11: /* その値が 11 の時 */ /* if ( n == 11 ) { printf ( "J\n" ); } */ printf ( "J\n" ); break; case 12: /* その値が 12 の時 */ /* if ( n == 12 ) { printf ( "Q\n" ); } */ printf ( "Q\n" ); break; case 13: /* その値が 13 の時 */ /* if ( n == 13 ) { printf ( "Q\n" ); } */ printf ( "K\n" ); break; default: /* 上記のどれにも当てはまらない場合 */ s_print_stirng ( "?\n" ); /* この命令は break が実行されない時に実行される */ break; } } int main(void) { printf ( "整数値を入力し、それに対応するトランプのマークを出力します : " ); trump ( s_input_int() ); return 0; }
#include <stdio.h> #include "s_print.h" #include "s_input.h" /* 階和 sumn(n) = 1 + 2 + .. + (n-1) + n => n * ( n + 1 ) / 2 条件 : n >= 0 関数を次のように、再帰的に定義する 数学的帰納法風の表現 1) n=0 の時 sumn(n) = sumn(0) = 0 2) n=k+1 の時 sumn(n) = sumn(k+1) = (k+1)+sumn(k) とする 0 (n=0 の時) sumn(n) = { n + sumn(n-1) (その他 [n>0 の時]) */ int sumn( int n ) { if ( n <= 0 ) { /* n = 0 ( n >= 0 という仮定なので..) */ /* n<0 の場合も考えるのは「予防的プログラミング」 */ /* 予防的プログラミング(保険) 悪いことが起きそうな場合に、前もって、 その悪い場合に備えて、プログラムを考える */ /* 「マーフィの法則」=「悪いことが起きる可能性があれば関らず起きる」 */ return 0; } else { /* その他 */ return n + sumn(n-1); /* 再帰呼び出し */ } } int main(void) { s_print_string ( "非負の整数値を入力して、その階和を計算する : " ); s_print_int ( sumn( s_input_int() ) ); s_print_newline(); return 0; }
#include <stdio.h> /* 単純な繰り返し helloN(n) 引数で指定した整数回だけ "Hello, World" を出力 */ void helloN( int n ) { if ( n <= 0 ) { /* n == 0, n < 0 を考えたのは、予防的な発想 */ /* n == 0 なので、0 回出力する => 何もしない */ } else { printf ( "Hello, World\n" ); /* 繰り返したい命令 */ helloN( n - 1 ); /* 再帰呼び出し */ } } int main(void) { helloN ( 10 ); return 0; }
#include <stdio.h> #include "s_input.h" #include "s_print.h" /* 先頭の n 個数の奇数の和を求める n = 3 1 + 3 + 5 = 9 = 3^2 蓄積型 関数の値を蓄積してゆく 総和の帰納的定義 n n-1 Σ a_i = Σ a_i + a_n i=1 i=1 0 Σ a_i = 0 i=1 an = 2n-1 の時 n n-1 Σ (2i-1) = ( Σ (2i-1) ) + (2n-1) i=1 i=1 考え方 n Σ a_i = a1 + a2 + .. + an i=1 = (a1 + a2 + .. ) + an n-1 = Σ a_i + an i=1 */ int squre( int n ) { if ( n <= 0 ) { /* n == 0, n < 0 を考えたのは、予防的な発想 */ return 0;/* n == 0 なので、0 個の奇数 */ } else { return squre( n - 1 ) + ( 2 * n - 1 ); /* 一つ下の関数の値を計算して、それに、積み上げる */ } } int main(void) { s_print_string ( "整数 n に対して、その二乗を出力する : " ); s_print_int ( squre ( s_input_int() ) ); s_print_newline(); return 0; }
#include <stdio.h> #include "s_input.h" #include "s_print.h" /* 先頭の n 個数の奇数の和を求める n = 3 1 + 3 + 5 = 9 = 3^2 蓄積型 関数の値を蓄積してゆく 総和の帰納的定義 n n-1 Σ a_i = Σ a_i + a_n i=1 i=1 0 Σ a_i = 0 i=1 an = 2n-1 の時 n n-1 Σ (2i-1) = ( Σ (2i-1) ) + (2n-1) i=1 i=1 考え方 n Σ a_i = a1 + a2 + .. + an i=1 = a1 + ( a2 + .. + an ) n-1 = Σ a_i + an i=1 squre_sub ( n, 0 ) squre_sub ( n-1, 0+an ) qure_sub ( n-2, 0 + a_n + a_{n-1} ) ... qure_sub ( 0, 0 + a1 + a2 + .. + a_n + a_{n-1} ) => return 0 + a1 + a2 + .. + a_n + a_{n-1}; => return Σ an */ int squre_sub ( int n, int sum ) { if ( n <= 0 ) { /* n == 0, n < 0 を考えたのは、予防的な発想 */ return sum; /* n == 0 なので、0 個の奇数 */ /* 計算が終了しているの引数に答えがたまってる */ } else { return squre_sub( n - 1, sum + ( 2 * n - 1 ) ); /* 関数の値を引数に蓄積してゆく */ } } int squre( int n ) { return squre_sub ( n, 0 ); } int main(void) { s_print_string ( "整数 n に対して、その二乗を出力する : " ); s_print_int ( squre ( s_input_int() ) ); s_print_newline(); return 0; }
#include <stdio.h> #include <string.h> #include "s_print.h" #include "s_input.h" /* 指定された文字列の中に、指定した文字があるかどうか調べる あれば、その文字のところから出力する search ( "abc", 'b' ) => "bc" みつからない場合は、空文字列 もし、文字列の先頭が、指定した文字ならば、そのまま返す そうでなければ、 先頭の文字を削って、さらに探す */ char *search( char *string, char ch ) { if ( !strcmp ( string, "" ) ) { /* string が空文字列 */ return string; /* 発見できなかった */ } else if ( *string == ch ) { return string; /* 発見できた */ } else { return search ( string + 1, ch ); /* さらに探す */ } } int main(void) { s_print_string ( "文字列を入力してください。その中の 'x' を探します : " ); s_print_string ( search ( s_input_string(), 'x' ) ); s_print_newline(); return 0; }
?O??(2021/06/25)????e ?u?`???e ??l(??????)??????? ?????^ C ?????u?????l?v??\??????u?^?v ?u?^?v= <?l??W??,???Z??W???> ?????^ = <{ 0, 1, -1, 2, -2, ..., +- 20 ?? },{ +, -, *, /, %, .. }> cf. ?????^ = < ASCII ????, { +, -, *, /, %, getchar(), putchar()} > ????????f?[?^???A???^??????A ?^??????A????U?????????? ?? ?ux + 1?v??????\?? ??? x ??????????f?[?^??^?????????????? ?????? => ??????Z????? ???? => ??????? (ASCII Code ?\??]??) ?????^ => 1 ?????????? !! ?u????v:????????????? ( <= ?????`???????A?????^???w???????? ) !! => ???????A????????????A?u?????яo???v?????邱???????? !! ?? : f(x)+1 !! => ??????`???????A????????l??^???w???????? ?????l????o?? s_print_int ?o?? s_input_int ???? ??????? ???w????????????? f(g(h(x))) ????????v?Z????? ????? y=h(x) ???v?Z????A????l y ?? g ?????A ????A x=g(y) ???v?Z????A????l z ?? f ?????A ???? w=f(z) ???v?Z????A????l???A???uf(g(h(x)))?v??l???? ??: f(x) = x * x f(4) = 4 * 4 = 16 g(x) = x + 2 g(3) = 3 + 2 = 5 f(g(5)) g(5) = 5 + 2 = 7 f(7) = 7 * 7 = 49 !! ?O??????v?Z???? ( ????W?J ) !! f(g(5)) = g(5)*g(5) !! = (5+2)*(5+2) !! = (7)*(7) <<== 5+2 ????v?Z !! = 49 !! !! ?O????v?Z??????????p?^?[?? !! !! ???????????????????? !! !! ????????v?Z??????????A??????????????A??????v?Z?????? !! !! ??: !! !! f(g(x+1)) !! !! ???? : g(x+1) = (x+1)+2 = x+3 <= ?v?Z???~??? !! !! ?O?? : ??????v?Z?????????????A?????v????? C ??????A????v?Z??A????????s?? f(g(h(x))) => h, g, f ?????v?Z???s?? ?????????????????????A???????????v?Z?????? f(g(x),h(y)) => h, g, f ???????s(?v?Z)????? ??????????A???????l?A???????s??????????????(????\??) ???s???????A?\?L???(?ォ???A??????E)????v???????? ???????? (if ?\??) ???@ if ( ???? ) { ????????????????????? } else { ???????s???????????? ( otherwise : ??????? ) } ??? ????A?u?????v???A??????????????????A ?u?????????????????????v?????s ?????????????? ?u???????s????????????v?????s ????B => if ?\????A?u????v?????u????\???v?????B ??????????A?V???????????? ?????????????s????? ??????????????? 1. else ?????? ( ???????s???????????? ) ????????? ?? : if ( ???? ) { ???? } else {} => else ????????????????? ?? : if ( ???? ) { ???? } <= then ?????? ( ?????????????????? ) ??????????????????A then ??????????? ?? : if ( ???? ) {} else { ???? } => ?uif ( ???? ) else { ???? }?v???????? 2. else ??????? if ?\??????? ?? : if ( ???? ) { ???? } else { if (????2) {????a} else {????b} } => else ??? {, } ?????????? ?? : if ( ???? ) { ???? } else if (????2) {????a} else {????b} if ( ???? ) { ???? } else { if (????2) { ????a } else { ????b } } => else ??? {, } ?????????? if ( ???? ) { ???? } else if (????2) { ????a } else { ????b } 2a. then ??????(?????????????????????)??? else ??????(???????s????????????)????A ???????????? {, } ???????\ !! <?^??> !! ???????Athen ?? / else ???A !! {, } ?????????A???????????????????{????\?? !! ????????? 0 ??? 2 ???????? {} ???K?v !! <= ????? 1 ????????A{} ???????K????????? 2021/07/02 switch ?\?? if ?\???????A?????????????????s???\?? switch - case ?\?? ?@?\ ??????\?? if ?\???? 2 ????? switch ?\???? n ???? !! if ?\???????q????邱?????A !! ???????\ !! ?\???????G???錙???????? ?\?? <switch ??> ::= switch ( <??> ) { <case ????> } <case ????> ::= <case> ??J??? <case> ::= <label> : ?????? <label> := case <??> | default switch - case ??p????? ???????l?????A??????l???v???????????f????A ????l??????A??X?????(????????)???s???????? ??1 ???? <switch ??>?????A???? <label> ?????鎖??????? ??2 ????????? break ????????A???????s??????Aswitch ????I?????? break ??????????????? switch ?\?????I???????? !! if ?\??????????? break ??????????? ( cf. return ) ??? ?????A?u???v??l???u???v???????????A ??????x?????????????s???? ??????????A ?????Adefualt ???????A??????x?????????????s???? ?????????????????A????????? ???????? break ????????s??????Aswitch ?S????I?????? break ??????????A?????A???x?????????A??????????????s????? ??A??o?? ????????{???A?????????g???o???????? ?u????????w??x?x???o???v?? ?u?????????o?????v???w???x?x????яo??????\?????????? ???? : ?????u??A??o???v???L?q?????A?u???????[?v?v???? ?u??A??o?????w?I???x??????v?d?g???u??}?I??????v????K?v?????? ?u????????v???K?{ ( ??A??яo????????????????? ) ??A?? : P ??A??~?????A A ??J????????A X' ?? X ????v?Z????A?w???????x P(X)?????????? ?L?q?`?? : f(X) { if ( P(X) ) { /* P(X) ??A??? f(X) ????A??яo??????????? */ /* ??A??яo???????????A??????I?????邱???????? */ } else { A(X); /* ?J???????? */ f(X'); /* ??A??яo?? : X -> X' */ /* ??? f ??A???? X ??^????? X -> X' -> (X')' -> .. -> X''..' => P(X'..') ?????????? */ X ?????R??????A -1 ???????A??????? 0 ?????? P(X) ?? X==0 ????? X ???????????A +1 ?????A??????? "" ?????? P(X) ?? !strcmp(X,"") ????? */ } } ??? : f(X) ??????AP(X''..')???????????? A(X) ???J???? ?|?C???g : ?uA(X) ???J?????v?????uf() ????A???`?v???? ??A??? ??A??o?????s???`???`??????? ?J??? : ????????(?L?q)?????x????яo???d?g ??A??o????p???鎖????A?u?J????v??????????? ??A?????A?u??????J????v????????????? ??A??o???A???J???g ??A??o?? : ?u?J????v???\??(?w?\???x????l??d?g??) ?w???x???w?????x??w?J?????x?? ? ?P????J??? ( N ???J??? ) ???????e??J??? / N ????????J??? ?~??^??J??? ?v?Z?????~????? (???a) ????l????p / ???????~?? ?????^??J??? ?J?????r???????????f????? (??I???B?????????J???) ?J??????\?z???????? (????????????????\????????) ????p(???o???)??~?? ??????v?Z??~???????A????p(???o??)??~????I????? ???????A ??A??o?????????s???? ?P????u?J????v??????? / ?v?Z????c??????\????????
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20210702-01.c
/* * 20210702-01-QQQQ.c * * 数当てを行う * * コンパイル : * cc -I ~/c/include -c 20210702-01-QQQQ.c * cc -o 20210702-01-QQQQ.exe 20210702-01-QQQQ.o * 実行 : * ./20210702-01-QQQQ.exe * */ #include <stdio.h> #include "s_print.h" /* s_print_int を利用するので.. */ #include "s_input.h" /* s_input_int を利用するので.. */ #include "s_random.h" /* s_random を利用するので.. */ /* * prompt * メッセージを出力し、キーボードから整数値を読み込んで、 * その値を返す関数 */ int prompt(void) { s_print_string ( "私が選んだ数を予想して入力してください : " ); return s_input_int(); } /* */ void game ( int input, int answer ) { if ( input == answer ) { /* 入力と答えが一致した */ s_print_string ( "お見事です。あたりました。\n" ); } else { if ( input > answer ) { /* 入力が、答えより大きい */ /* ** この部分を完成させなさい */ } else { /* 入力が、答えより小さい */ s_print_string ( "その数は小さすぎます。\n" ); } /* 未だ、答えが、当っていないので、ゲームを続ける.. */ /* ** この部分を完成させなさい */ } } /* * main */ int main( void ) { s_init_random(); /* 乱数系列の初期化 */ s_print_string ( "私が考えた 1 〜 100 数を予想して当ててみてください。\n" ); game ( prompt(), (s_random()%100) + 1 ); return 0; }
50 75 83 90 85 84
$ ./20180928-01-QQQQ.exe 私が考えた 1 〜 100 の数を予想して当ててみてください。 私が選んだ数を予想して入力してください : 5 5 その数は小さすぎます。 私が選んだ数を予想して入力してください : 60 60 その数は大きすぎます。 私が選んだ数を予想して入力してください : 30 30 お見事です。あたりました。 $
Download : 20210702-02.c
/* * CDATE FILENAME * * 与えられた自然数の素因数を出力する * * 12 は.. * * [コンパイル] * cc -I ~/include -c FILENAME * [リンク] * cc -o BASENAME.exe BASENAME.o * [実行] * ./BASENAME.exe * */ #include <stdio.h> #include "s_print.h" /* s_print_int を利用するので.. */ /* * void print_prime_factor_sequence ( int n, int p ) * 機能 : p 以上の n の素因数を小さい順に並べで表示する * 条件 : n には p 未満の素因数を含まれていないものとする * int n : p 未満の素因数を含まれていない自然数 * 返り値 : なし */ void print_prime_factor_sequence ( int n, int p ) { if ( p > n ) { /* もう n には p 以上の素因数を含まない */ /* 何もしなくてよい */ /* 本来、ここにくるのは n = 1 の時だが、念の為 */ } else if ( n % p == 0 ) { /* n が p を素因数として含む */ s_print_char ( ' ' ); /* 隙間を空け */ s_print_int ( p ); /* 素因数を表示し */ /* もう一度 p の要素があるかもしれないので、そこから試す [再帰] */ /* ** この部分を完成させなさい */ } else { /* n が p を素因数として含まない */ /* 本来は p の次の素数を試すべきだが.. */ /* その代りに p + 1 を試す (のは無駄だが、正く動く) [再帰] */ /* ** この部分を完成させなさい */ } } /* * void print_prime_factor_of ( int n ) * 機能 : n の素因数を出力する * int n : 素因数を表示したい自然数 * 返り値 : なし */ void print_prime_factor_of ( int n ) { if ( n < 1 ) { /* 与えらた数が自然数ではない */ s_print_int ( n ); s_print_string ( "は、自然数ではありません\n" ); } else if ( n == 1 ) { /* 与えられた数が 1 の場合 */ s_print_int ( n ); s_print_string ( "の素因数はありません\n" ); } else { s_print_int ( n ); s_print_string ( "の素因数分解は" ); /* ** この部分を完成させなさい */ s_print_string ( " となります。\n" ); } } /* * main */ int main( void ) { print_prime_factor_of ( 12 ); return 0; }
$ ./20210702-02-QQQQ.exe 12の素因数分解は 2 2 3 となります。 $
Download : 20210702-03.c
/* * 20210702-03-QQQQ.c * フィボナッチ数列の第 n 項を返す関数 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * int fibonacci ( int n ) * 引数で指定された n 番目 ( n = 0 〜 ) のフィボナッチ数を値として返す関数 * ただし、n 番目のフィボナッチ数 fib(n) は次のように再帰的に定義 * 0 (n = 0 の時) * fib(n) = { 1 (n = 1 の時) * fib(n-1) + fib(n-2) (n > 1 の時) * * 注意 : 引数に負の数を指定された場合の値は「未定義」 */ int fibonacci ( int n ) { if ( n < 2 ) { /* 本来は n = 0, n = 1 の時の処理 */ /* fib(0) = 0, fib(1) = 1 なので 0 <= n <= 1 の時 fib(n) = n */ return n; /* n < 0 (負の数) の時は、『未定義』なので、勝手に n を返している */ /* 本来は『未定義』の場合を含めるべきでない */ } else { /* 再帰を利用して計算 */ /* ** この部分を完成させなさい */ } } /* * */ void print_fibonacci ( int n ) { s_print_int ( n ); s_print_string ( " 番目のフィボナッチ数は " ); s_print_int ( fibonacci ( n ) ); s_print_string ( " です。\n" ); } /* * main */ int main ( void ) { s_print_string ( "整数値 n を入力してください : " ); print_fibonacci ( s_input_int() ); s_print_string ( "整数値 n を入力してください : " ); print_fibonacci ( s_input_int() ); return 0; }
4 10
$ ./20210702-03-QQQQ.exe 整数値 n を入力してください : 4 4 番目のフィボナッチ数は 3 です。 整数値 n を入力してください : 10 10 番目のフィボナッチ数は 55 です。 $