Download : sample-001.c
/* * 2018/09/28 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
/* * 2018/09/28 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
/* * 2018/09/28 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
/* * 2018/09/28 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
/* * 2018/09/28 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 乱数を出力します : 2116658382 $
#include <stdio.h> /* 完全に動くプログラムで、いろいろなプログラムの元になる */ int main(int argc, char *argv[]) { printf ( "Hello, World\n" ); return 0; }
#include <stdio.h> /* 完全に動くプログラムで、いろいろなプログラムの元になる */ int main(int argc, char *argv[]) { printf ( "Hello, World\n" ); /* 命令 A */ printf ( "Hello, World, again\n" ); /* 命令 B */ return 0; }
#include <stdio.h> /* 完全に動くプログラムで、いろいろなプログラムの元になる */ int main(int argc, char *argv[]) { printf ( "Hello, World, again\n" ); /* 命令 B */ printf ( "Hello, World\n" ); /* 命令 A */ return 0; }
#include <stdio.h> /* */ int main(int argc, char *argv[]) { /* キーボードから 1 文字入力し、'a' だったら Hello, そうでなかったら、bye を出力する */ if ( getchar() == 'a' ) { printf ( "Hello\n" ); /* 条件が成立したとき */ } else { printf ( "Bye\n" ); /* 条件が成立しなかったとき */ } return 0; }
#include <stdio.h> /* 再帰呼び出しを利用して、繰り返しを行う ntimes_print */ void ntimes_print ( int times, char *string ) { if ( times <= 0 ) { /* 条件 P */ /* なにもしない */ } else { printf ( string ); /* 繰り返ししたい命令 A */ ntimes_print ( times - 1, string ); /* 再帰呼び出し */ /* 自分自身を呼び出す */ } } int main(int argc, char *argv[]) { ntimes_print ( 3, "Hello, World\n" ); ntimes_print ( 5, "Bye Bye\n" ); return 0; }
#include <stdio.h> /* p-001.c の 9 行目に hello という名前をつけて、 main ではそれを利用するして、同じ結果を実現する。 */ void hello (void) { /* hello という関数の定義 */ printf ( "Hello, World\n" ); } int main(int argc, char *argv[]) { hello(); /* hello 関数の呼び出し */ return 0; }
#include <stdio.h> /* 引数をつけた関数 引数で指定された文字列を三度書く */ void three_print (char *string) { /* hello という関数の定義 */ printf ( string ); printf ( string ); printf ( string ); } int main(int argc, char *argv[]) { three_print( "Hello, World\n" ); /* hello 関数の呼び出し */ three_print( "Bye, Bye\n" ); /* hello 関数の呼び出し */ return 0; }
#include <stdio.h> /* * 引数で与えられた、一文字の内容によって、 Hello ( 文字が 'a' の場合)か、Bye (その他) を出力する */ void if_sample ( char ch ) { if ( ch == 'a' ) { printf ( "Hello\n" ); /* 条件が成立したとき */ } else { printf ( "Bye\n" ); /* 条件が成立しなかったとき */ } } int main(int argc, char *argv[]) { /* キーボードから 1 文字入力し、'a' だったら Hello, そうでなかったら、bye を出力する */ if_sample ( getchar() ); /* 一文字入力して、その結果を 関数 if_sample に渡す */ return 0; }
#include <stdio.h> /* * 引数で与えられた、一文字の内容によって、 'a' "Hello" 'b' "Good morning" other "Bye" */ void if_sample ( char ch ) { if ( ch == 'a' ) { printf ( "Hello\n" ); /* 条件が成立したとき */ } else { /* a でなかった... */ if ( ch == 'b' ) { /* 改めて、b かどうかを判定する */ printf ( "Good morning\n" ); /* 条件が成立したとき */ } else { printf ( "Bye\n" ); /* 条件が成立しなかったとき */ } } } int main(int argc, char *argv[]) { /* キーボードから 1 文字入力し、'a' だったら Hello, そうでなかったら、bye を出力する */ if_sample ( getchar() ); /* 一文字入力して、その結果を 関数 if_sample に渡す */ return 0; }
#include <stdio.h> /* * 引数で与えられた、一文字の内容によって、 'a' "Hello" 'b' "Good morning" other "Bye" */ void if_sample ( char ch ) { if ( ch == 'a' ) { printf ( "Hello\n" ); /* 条件が成立したとき */ } else { /* nothing */ } if ( ch == 'b' ) { /* 改めて、b かどうかを判定する */ printf ( "Good morning\n" ); /* 条件が成立したとき */ } else { printf ( "Bye\n" ); /* 条件が成立しなかったとき */ } } int main(int argc, char *argv[]) { /* キーボードから 1 文字入力し、'a' だったら Hello, そうでなかったら、bye を出力する */ if_sample ( getchar() ); /* 一文字入力して、その結果を 関数 if_sample に渡す */ return 0; }
#include <stdio.h> /* * 引数で与えられた、一文字の内容によって、 'a' "Hello" 'b' "Good morning" 'c' "Good night" other "Bye" */ void if_sample ( char ch ) { if ( ch == 'a' ) { printf ( "Hello\n" ); /* 条件が成立したとき */ } else { /* a でなかった... */ if ( ch == 'b' ) { /* 改めて、b かどうかを判定する */ printf ( "Good morning\n" ); /* 条件が成立したとき */ } else { if ( ch == 'c' ) { /* 改めて、c かどうかを判定する */ printf ( "Good night\n" ); /* 条件が成立したとき */ } else { printf ( "Bye\n" ); /* 条件が成立しなかったとき */ } } } } int main(int argc, char *argv[]) { /* キーボードから 1 文字入力し、'a' だったら Hello, そうでなかったら、bye を出力する */ if_sample ( getchar() ); /* 一文字入力して、その結果を 関数 if_sample に渡す */ return 0; }
#include <stdio.h> /* * 引数で与えられた、一文字の内容によって、 'a' "Hello" 'b' "Good morning" 'c' "Good night" other "Bye" */ void if_sample ( char ch ) { if ( ch == 'a' ) { printf ( "Hello\n" ); /* 条件が成立したとき */ } else if ( ch == 'b' ) { /* 改めて、b かどうかを判定する */ printf ( "Good morning\n" ); /* 条件が成立したとき */ } else if ( ch == 'c' ) { /* 改めて、c かどうかを判定する */ printf ( "Good night\n" ); /* 条件が成立したとき */ } else if ( ch == 'd' ) { /* 改めて、c かどうかを判定する */ printf ( "sayonara\n" ); /* 条件が成立したとき */ } else { printf ( "Bye\n" ); /* 条件が成立しなかったとき */ } } int main(int argc, char *argv[]) { /* キーボードから 1 文字入力し、'a' だったら Hello, そうでなかったら、bye を出力する */ if_sample ( getchar() ); /* 一文字入力して、その結果を 関数 if_sample に渡す */ return 0; }
#include <stdio.h> /* */ void if_sample ( char ch ) { if ( ch == 'a' ) { printf ( "Hello\n" ); /* 条件が成立したとき */ } else { /* nothing */ /* 条件が、不成立の場合に何もしないなら、 else 節ごと省略可能 */ } } int main(int argc, char *argv[]) { /* キーボードから 1 文字入力し、'a' だったら Hello, そうでなかったら、bye を出力する */ if_sample ( getchar() ); /* 一文字入力して、その結果を 関数 if_sample に渡す */ return 0; }
#include <stdio.h> /* */ void if_sample ( char ch ) { if ( ch == 'a' ) { printf ( "Hello\n" ); /* 条件が成立したとき */ } /* else 節の文が何もないので、省略 */ } int main(int argc, char *argv[]) { /* キーボードから 1 文字入力し、'a' だったら Hello, そうでなかったら、bye を出力する */ if_sample ( getchar() ); /* 一文字入力して、その結果を 関数 if_sample に渡す */ return 0; }
#include <stdio.h> /* */ void if_sample ( char ch ) { if ( ch == 'a' ) { /* ここは、何もなくても、省略できない .. */ } else { printf ( "Hello\n" ); /* 条件が成立しないとき */ } } int main(int argc, char *argv[]) { /* キーボードから 1 文字入力し、'a' だったら Hello, そうでなかったら、bye を出力する */ if_sample ( getchar() ); /* 一文字入力して、その結果を 関数 if_sample に渡す */ return 0; }
#include <stdio.h> /* */ void if_sample ( char ch ) { if ( ! (ch == 'a') ) { /* ! を利用して、条件を反転できる */ /* 「!(ch == 'a')」 は「 ch != 'a'」と同じ */ printf ( "Hello\n" ); /* 条件が成立しないとき */ } } int main(int argc, char *argv[]) { /* キーボードから 1 文字入力し、'a' だったら Hello, そうでなかったら、bye を出力する */ if_sample ( getchar() ); /* 一文字入力して、その結果を 関数 if_sample に渡す */ return 0; }
#include <stdio.h> /* */ void if_sample ( char ch ) { if ( ! (ch == 'a') ) printf ( "Hello\n" ); else printf ( "Bye\n" ); /* 文が一つしかない場合は、 {, } を省略可能 */ /* ぶらさがり構文 */ /* !!!! 「絶対に省略しない方がよい」*/ } int main(int argc, char *argv[]) { /* キーボードから 1 文字入力し、'a' だったら Hello, そうでなかったら、bye を出力する */ if_sample ( getchar() ); /* 一文字入力して、その結果を 関数 if_sample に渡す */ return 0; }
#include <stdio.h> /* */ void if_sample ( char ch ) { if ( ch != 'a' ) if ( ch != 'b' ) printf ( "Good morning\n"); else printf ( "Bye\n" ); /* a でも b でもなければ、Good morning a だったら Bye b だったら なにもでない [考えた事] if ( ch != 'a' ) { if ( ch != 'b' ) { printf ( "Good morning\n"); } else { } } else { printf ( "Bye\n" ); } [機械的に省略] if ( ch != 'a' ) if ( ch != 'b' ) printf ( "Good morning\n"); else printf ( "Bye\n" ); [誤解を受ける..] if ( ch != 'a' ) { if ( ch != 'b' ) { printf ( "Good morning\n"); } else { printf ( "Bye\n" ); } } else { } */ } int main(int argc, char *argv[]) { /* キーボードから 1 文字入力し、'a' だったら Hello, そうでなかったら、bye を出力する */ if_sample ( getchar() ); /* 一文字入力して、その結果を 関数 if_sample に渡す */ return 0; }
#include <stdio.h> int main(int argc, char *argv[]) { char buf[100]; gets ( buf ); return 0; }
#include <stdio.h> extern void even ( int n ); void odd ( int n ) { if ( n <= 0 ) { /**/ } else { printf ( "奇数\n" ); even ( n-1 ); } } void even ( int n ) { if ( n <= 0 ) { /**/ } else { printf ( "偶数\n" ); odd ( n-1 ); } } int main(int argc, char *argv[]) { odd ( 5 ); return 0; }
#include <stdio.h> #include "s_print.h" int inc(int n) { return n + 1; /* 与えれた整数値に 1 を加える */ } /* 関数 inc は純粋関数 inc(10)の結果は 11 だが inc(10)+inc(10) と 2*inc(10) の結果は同じ */ int main(int argc, char *argv[]) { s_print_int ( 10 ); s_print_string ( "に 1 を加えると" ); s_print_int ( inc(10) ); s_print_string ( "になる。" ); return 0; }
#include <stdio.h> #include "s_print.h" int inc(int n) { return n + 1; /* 与えれた整数値に 1 を加える */ } /* 関数 inc は純粋関数 inc(10)の結果は 11 だが inc(10)+inc(10) と 2*inc(10) の結果は同じ */ int main(int argc, char *argv[]) { s_print_int ( inc(10) + inc(10) ); s_print_string ( "になる。\n" ); s_print_int ( 2 * inc(10) ); s_print_string ( "になる。\n" ); return 0; }
#include <stdio.h> #include "s_print.h" int inc(int n) { putchar ( 'x' ); /* 出力 : 副作用の例 */ return n + 1; /* 与えれた整数値に 1 を加える */ } /* 関数 inc は純粋関数 inc(10)の結果は 11 だが inc(10)+inc(10) と 2*inc(10) の結果は同じ */ int main(int argc, char *argv[]) { s_print_int ( inc(10) + inc(10) ); s_print_string ( "になる。\n" ); s_print_int ( 2 * inc(10) ); s_print_string ( "になる。\n" ); return 0; }
#include <stdio.h> int main(int argc, char *argv[] ) { /* シーザ暗号 */ /* a => c b => d .. */ printf ( "一文字入力してください : " ); putchar ( getchar () + 2 ); putchar ( '\n' ); return 0; }
#include <stdio.h> int main(int argc, char *argv[] ) { /* シーザ暗号 */ /* a => c b => d .. */ printf ( "一文字入力してください : " ); if ( getchar() >= 'y' ) { putchar ( 'a' + getchar() - 'y' ); /* 'y' -> 'a' + 'y' - 'y' => 'a' 'z' => 'a' + 'z' - 'y' => 'a' + 1 => 'b' */ } else { putchar ( getchar() + 2 ); } putchar ( '\n' ); return 0; }
#include <stdio.h> void f(int ch) { /* getchar() が返す値は、変数 ch にコピーされ.. */ if ( ch >= 'y' ) { /* 変数を何度参照しても、同じ値 */ putchar ( 'a' + ch - 'y' ); /* 'y' -> 'a' + 'y' - 'y' => 'a' 'z' => 'a' + 'z' - 'y' => 'a' + 1 => 'b' */ } else { putchar ( ch + 2 ); } putchar ( '\n' ); } int main(int argc, char *argv[] ) { /* シーザ暗号 */ /* a => c b => d .. */ printf ( "一文字入力してください : " ); f(getchar()); /* getchar() を一度しか呼ばない */ return 0; }
[前回] レーシングゲームを作ってみた C 言語で作成されているので、C 言語の知識が必要 => 前期(ソフトウェア概論 A)の知識で十分 アプリケーション固有(ゲーム)の知識が必要 リアルタイムなキー入力が必要 画面操作(画面表示の一部だけを書き換える機能) 乱数 アイディア 手順を作る(アルゴリズム) [ガイダンス] 前期(ソフトウェア概論 A)やコンピュータ概論と方針は同じ ソフトウェア概論 Aの知識は仮定 うるさくするな 課題と試験で成績を付ける [復習(ソフトウェア概論 A)] ソフトウェア概論 A/B の目的 C 言語でプログラムが作成できるようにしよう 自分の目的に沿ったプログラムができるとうれしい => 自分の環境を良くしたい ソフトウェア概論 A/B の内容 C 言語そのものの知識(C 言語で、どのように、目的の機能を表現するか) 表現方法なので、語学 プログラムのコンパイルの仕方と実行の仕方 コンピュータの操作方法 プログラミング: どのように考えて、プログラムを作成するか => アルゴリズム概論でやる この講義でも少しずつふれる 「分割統治法」 C 言語そのもの 「Hello, World」 printf, getchar, putchar : 入出力関数 プログラムと人間の間でデータの交換ができる 構文 : 複数の命令を組み合わせて新しい命令を作る仕組み 順接 : 二つの命令 A, B があったときに, 「A を実行してから B を実行する」という命令を作る 条件判定 (if 構文) : 一つの条件 P と、二つの命令 A, B があったときに, 「条件 P の成立、不成立によって A, B のどちらか一方を実行する」 if ( P ) { A } else { B } !! この表現では A と B のどちらか一方しか実行されない 繰り返し : 条件 P と命令が A にあったときに 条件 P が成立するかぎり、A を繰り返す !! A の記述は一度だが、実行は N 回(複数回)になる(かもしれない) 「再帰呼び出しを使う」 [まとめ] 任意のプログラム(上記の三つの構文以外の構文を利用したプログラム)に対して、それと同じ機能で、上記の三つの構文だけで作られたプログラムを作る事ができる。 => 他の(かっこよさげな..)構文を知らなくても、任意のプログラムが書ける。 [関数] プログラム(の一部)に名前をつけて、 その名前だけで、そのプログラムを実行する仕組み そのためのつくられたもの 例 : main, printf, ... (自分でも作れる) 関数の作り方(関数宣言) 関数の利用の仕方(printf で、最初にやっている..) 最初は引数無し => 引数を付けた場合 引数付き 引数と条件分岐を利用して、再帰呼び出し [型] 「型」は「値の集合」+「その値の操作方法」 int : 整数値( 0. 1. 2, .., -1, -2, .. ) + 四則(+.-,*,/, .. ) char : 文字集合('A','b', '1'..)と、文字操作 (入出力、+1, -1 文字がずれる..) 引数変数の「型」 ある型の変数は、その型の値を記録している 関数呼び出しをするときの引数の型と、関数定義をするときの仮引数変数の型は一致している必要がある。 ソフトウェア概論 A では、たくさんの「おまじない」があった cf. #include <stdio.h>, char * (文字列..), etc.. ソフトウェア概論 B では謎解きを行う予定 == [ソフトウェア概論 B] 条件分岐 二つの命令のどちらか N の命令のいずれかの場合にも if 構文を組み合わせて(入れ子にして..)実現できる why : N => 1 + (N-1) の二つ分ければよい 二つなので、 N は if 構文で処理可能 N-1 の部分は、改めて考えればよい ( 再帰呼び出し / 数学的帰納法の考え方 ) 再帰呼び出し 関数の本体で自分自身を呼び出すこと 再帰的関数定義 : 再帰呼び出しを含む関数の定義 再帰呼び出しを「限定的」に利用する事で、「繰り返し」が実現できる 入出力は、副作用(関数の値を決める事以外の目的で働く機能)を持つ 副作用を持つ関数を呼び出すと、 呼び出した回数だけ、副作用が生じるので、 呼び出す回数に意味がある 一方、副作用をもたない関数(純粋関数)は、そのような事はない。 p-018.c では、getchar() が何か所も現れるが、呼び出し回数が 複数になるので、それぞれの関数の値は違うものになる => 同じものとみなすと失敗する
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20180928-01.c
/* * 20180928-01-QQQQ.c * * 数当てを行う * * コンパイル : * cc -I ~/c/include -c 20180928-01-QQQQ.c * cc -o 20180928-01-QQQQ.exe 20180928-01-QQQQ.o * 実行 : * ./20180928-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 : 20180928-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; }
$ ./20180928-02-QQQQ.exe 12の素因数分解は 2 2 3 となります。 $