Download : sample-001.c
/* * 2017/05/12 sample-001.c */ /* * 最初のプログラムは "Hello, World" */ #include <stdio.h> /* * main 関数 */ int main ( void ) { printf ( "Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ return 0; }
$ ./sample-001.exe Hello, World $
Download : sample-003.c
/* * DATE sample-003.c */ #include <stdio.h> /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * 関数を使わずに愚直に命令を並べた * プログラミングの基本はこれ (実行したい内容をその順に並べる) */ /* * int main ( void ) */ int main ( void ) { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); printf ( "後の山に 棄てましょか\n" ); printf ( "いえ いえ それはなりませぬ\n" ); printf ( "\n" ); printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); printf ( "背戸の小薮に 埋けましょか\n" ); printf ( "いえ いえ それはなりませぬ\n" ); printf ( "\n" ); printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); printf ( "柳の鞭で ぶちましょか\n" ); printf ( "いえ いえ それはかわいそう\n" ); printf ( "\n" ); printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); printf ( "象牙の船に 銀の櫂\n" ); printf ( "月夜の海に 浮べれば\n" ); printf ( "忘れた唄を おもいだす\n" ); return 0; }
$ ./sample-003.exe 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 柳の鞭で ぶちましょか いえ いえ それはかわいそう 唄を忘れた 金糸雀(かなりや)は 象牙の船に 銀の櫂 月夜の海に 浮べれば 忘れた唄を おもいだす $
Download : sample-004.c
/* * DATE sample-004.c */ #include <stdio.h> /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * 共通する部分に名前を付け重複を減らす * 引数を利用しなくてもできる形 */ /* * void uta(void) * 「唄を忘れた 金糸雀(かなりや)は」を出力する */ void uta(void) { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); } /* * void ieie(void) * 「いえ いえ それはなりませぬ」を出力する */ void ieie(void) { printf ( "いえ いえ それはなりませぬ\n" ); } /* * void kyoku_1(void) * 「歌詞 1 」を出力する */ void kyoku_1(void) { uta(); printf ( "後の山に 棄てましょか\n" ); ieie(); } /* * void kyoku_2(void) * 「歌詞 2 」を出力する */ void kyoku_2(void) { uta(); printf ( "背戸の小薮に 埋けましょか\n" ); ieie(); } /* * void kyoku_3(void) * 「歌詞 3 」を出力する */ void kyoku_3(void) { uta(); printf ( "柳の鞭で ぶちましょか\n" ); ieie(); } /* * void kyoku_4(void) * 「歌詞 4 」を出力する */ void kyoku_4(void) { uta(); printf ( "象牙の船に 銀の櫂\n" ); printf ( "月夜の海に 浮べれば\n" ); printf ( "忘れた唄を おもいだす\n" ); } /* * int main ( void ) * 四つの歌詞を、間に空行を入れて出力する */ int main ( void ) { kyoku_1(); /* 一曲目 */ printf ( "\n" ); /* 空行 */ kyoku_2(); /* ニ曲目 */ printf ( "\n" ); /* 空行 */ kyoku_3(); /* 三曲目 */ printf ( "\n" ); /* 空行 */ kyoku_4(); /* 四曲目 */ return 0; }
$ ./sample-004.exe 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 柳の鞭で ぶちましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 象牙の船に 銀の櫂 月夜の海に 浮べれば 忘れた唄を おもいだす $
Download : sample-005.c
/* * DATE sample-005.c */ #include <stdio.h> /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * 1 〜 3 を引数付き関数でおきかえる */ /* * void uta(void) * 「唄を忘れた 金糸雀(かなりや)は」を出力する */ void uta(void) { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); } /* * void ieie(void) * 「いえ いえ それはなりませぬ」を出力する */ void ieie(void) { printf ( "いえ いえ それはなりませぬ\n" ); } /* * void kyoku_123 ( char *center ) * char *center ; 曲 1 〜 3 で異る部分 * 曲 1 〜 3 で異る部分を引数にする事により、歌詞全体を出力する */ void kyoku_123 ( char *center ) { uta(); printf ( center ); /* kyoku 1 〜 3 で異る部分を変数 (center) にした */ ieie(); } /* * void kyoku_1(void) * 「歌詞 1 」を出力する * kyoku_123 を利用して、歌詞 1 固有の部分だけを指定する */ void kyoku_1(void) { kyoku_123 ( "後の山に 棄てましょか\n" ); } /* * void kyoku_2(void) * kyoku_123 を利用して、歌詞 2 を出力 */ void kyoku_2(void) { kyoku_123 ( "背戸の小薮に 埋けましょか\n" ); } /* * void kyoku_3(void) * kyoku_123 を利用して、歌詞 3 を出力 */ void kyoku_3(void) { kyoku_123 ( "柳の鞭で ぶちましょか\n" ); } /* * void kyoku_4(void) * 「歌詞 4 」を出力する * 形が 1 〜 3 と異るので、kyoku_123 は使えない */ void kyoku_4(void) { uta(); printf ( "象牙の船に 銀の櫂\n" ); printf ( "月夜の海に 浮べれば\n" ); printf ( "忘れた唄を おもいだす\n" ); } /* * int main ( void ) * 四つの歌詞を、間に空行を入れて出力する */ int main ( void ) { kyoku_1(); /* 一曲目 */ printf ( "\n" ); /* 空行 */ kyoku_2(); /* ニ曲目 */ printf ( "\n" ); /* 空行 */ kyoku_3(); /* 三曲目 */ printf ( "\n" ); /* 空行 */ kyoku_4(); /* 四曲目 */ return 0; }
$ ./sample-005.exe 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 柳の鞭で ぶちましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 象牙の船に 銀の櫂 月夜の海に 浮べれば 忘れた唄を おもいだす $
Download : sample-006.c
/* * DATE sample-006.c */ #include <stdio.h> #include <string.h> /* strcmp を利用する場合は必要 */ /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * 4 の場合もまとめられないだろうか ? */ /* * void uta(void) * 「唄を忘れた 金糸雀(かなりや)は」を出力する */ void uta(void) { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); } /* * void ieie(void) * 「いえ いえ それはなりませぬ」を出力する */ void ieie(void) { printf ( "いえ いえ それはなりませぬ\n" ); } /* * void kyoku_1234 ( char *center ) * char *center ; 曲 1 〜 4 で最初に異る部分 * 曲 1 〜 3 は異る部分を、定型で、出力する事により * 曲 4 は、if と strcmp を利用して、区別し、特別扱いする事により * それぞれ、歌詞全体を出力する */ void kyoku_1234 ( char *center ) { /* 1 〜 4 共通部分 */ uta(); printf ( center ); /* 1 〜 3 と 4 では異る部分 */ /* strcmp で、比較し、その結果を if で区別する */ if ( !strcmp ( center, "象牙の船に 銀の櫂\n" ) ) { /* 4 の場合だった */ printf ( "月夜の海に 浮べれば\n" ); printf ( "忘れた唄を おもいだす\n" ); } else { /* それ以外.. */ /* 1 〜 3 の場合だった */ ieie(); } } /* * void kyoku_1(void) * kyoku_1234 を利用して、歌詞 1 を出力 */ void kyoku_1(void) { kyoku_1234 ( "後の山に 棄てましょか\n" ); } /* * void kyoku_2(void) * kyoku_1234 を利用して、歌詞 2 を出力 */ void kyoku_2(void) { kyoku_1234 ( "背戸の小薮に 埋けましょか\n" ); } /* * void kyoku_3(void) * kyoku_1234 を利用して、歌詞 3 を出力 */ void kyoku_3(void) { kyoku_1234 ( "柳の鞭で ぶちましょか\n" ); } /* * void kyoku_4(void) * kyoku_1234 を利用して、歌詞 4 を出力 */ void kyoku_4(void) { kyoku_1234 ( "象牙の船に 銀の櫂\n" ); } /* * int main ( void ) * 四つの歌詞を、間に空行を入れて出力する */ int main ( void ) { kyoku_1(); /* 一曲目 */ printf ( "\n" ); /* 空行 */ kyoku_2(); /* ニ曲目 */ printf ( "\n" ); /* 空行 */ kyoku_3(); /* 三曲目 */ printf ( "\n" ); /* 空行 */ kyoku_4(); /* 四曲目 */ return 0; }
$ ./sample-006.exe 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 柳の鞭で ぶちましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 象牙の船に 銀の櫂 月夜の海に 浮べれば 忘れた唄を おもいだす $
Download : sample-007.c
/* * DATE sample-007.c */ #include <stdio.h> #include <string.h> /* * 木霊 */ /* * 引数を利用して振舞をかえる関数の例 */ /* * void echo ( char *message ) * char *message 与えらえたメッセージ、これをそのまま言い返す(木霊) * message が空の場合は、「言い返せない」と文句を言う */ void echo ( char *message ) { /* message の内容によって振舞を変える */ /* 「""」は「空文字列」を表す */ if ( !strcmp ( message, "" ) ) { /* もし、メッセージが空っぽならば.. */ printf ( "何か言わないと、言い返せないじゃないか.." ); } else { /* そうじゃなければ、そのまま答える */ printf ( message ); } } /* * void chat ( char *message ) * char *message 木霊に呼び掛けるメッセージ * こちらからの呼び掛けと、木霊の返答を表示する */ void chat ( char *message ) { printf ( "呼掛け : " ); printf ( message ); printf ( "\n" ); /* 呼掛けの言葉 */ printf ( "木霊 : " ); echo ( message ); printf ( "\n" ); /* 木霊の応答 */ } /* * main */ int main ( void ) { chat ( "ヤッホー" ); chat ( "オーイ" ); chat ( "" ); chat ( "生意気なやつだ" ); return 0; }
$ ./sample-007.exe 呼掛け : ヤッホー 木霊 : ヤッホー 呼掛け : オーイ 木霊 : オーイ 呼掛け : 木霊 : 何か言わないと、言い返せないじゃないか.. 呼掛け : 生意気なやつだ 木霊 : 生意気なやつだ $
Download : sample-008.c
/* * DATE sample-008.c */ #include <stdio.h> #include <string.h> /* * 文字列に 1 を加えると.. ? * 文字の長さが短くなる (頭の部分がなくなる..) */ /* * main */ int main ( void ) { printf ( "abcde\n" ); /* 当然 「abcde」が表示される.. */ printf ( "abcde\n" + 1 ); /* 文字列に 1 を加えるってどうゆうこと.. ? */ printf ( "abcde\n" + 2 ); printf ( "abcde\n" + 1 + 1 ); /* ("abcde\n" + 1) + 1 => "bcde\n" + 1 => "cde\n" */ return 0; }
$ ./sample-008.exe abcde bcde cde cde $
Download : sample-009.c
/* * DATE sample-009.c */ #include <stdio.h> #include <string.h> /* * void recursive ( char *string ) * char *string 指定した文字列からなる三角形を作る * 実行例 * recursive( "abc\n" ); * -> * abc "abc\n" * bc "bc\n" * c "c\n" * "\n" * 再帰呼出しを利用 */ void recursive ( char *string ) { if ( !strcmp ( string, "" ) ) { /* もし空文字列 ( "" ) ならば */ printf ( "" ); /* これで御仕舞い */ } else { /* そうでなければ、 */ printf ( string ); recursive ( string + 1 ); /* 再帰呼び出しする */ /* +1 を忘れると悲惨な事に.. */ } } /* * main */ int main ( void ) { recursive ( "abcdefg\n" ); recursive ( "xyz\n" ); return 0; }
$ ./sample-009.exe abcdefg bcdefg cdefg defg efg fg g xyz yz z $
Download : sample-010.c
/* * DATE sample-010.c */ #include <stdio.h> #include <string.h> /* * 再帰呼出しを利用して、"Hello, World\n" を沢山出力する */ /* * void rec_hello ( char *count ) * char *count 文字列を指定し、その長さで、繰り返えし回数の指数を指定 * 与えられた文字列の長さを n とすると 2^n 回だけ出力する */ void rec_hello ( char *count ) { if ( !strcmp ( count, "" ) ) { /* カラッポなら.. */ printf ( "Hello, World\n" ); /* 一つだけ表示してみる */ } else { /* そうでなければ.. */ rec_hello ( count + 1 ); /* 二倍にして再帰よびだし */ rec_hello ( count + 1 ); } } /* * main */ int main ( void ) { rec_hello ( "****" ); /* 2^4 = 16 回出力 */ /* 2^10 = 1024 だから、 "**********" を与えれば... */ return 0; }
$ ./sample-010.exe Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World $
Download : sample-011.c
/* * DATE sample-011.c */ #include <stdio.h> #include <string.h> /* * フィボナッチ数の計算 */ /* * void fib ( char *n ) * char *n n の長さで何番目の項かを表す * n 番目のフィボナッチ数だけ '*' を表示する */ void fib ( char *n ) { if ( !strcmp ( n, "" ) ) { /* カラッポ(0)なら.. */ printf ( "*" ); /* 一つだけ : fib(0) = 1 だから */ } else if ( !strcmp ( n, "*" ) ) { /* 一つ(1)なら */ printf ( "*" ); /* 一つだけ : fib(1) = 1 だから */ } else { /* そうでなければ.. */ fib ( n + 1 ); /* fib ( n - 1 ) と */ fib ( n + 2 ); /* fib ( n - 2 ) だけだす */ } } /* * main */ int main ( void ) { printf ( "fib 3 : " ); fib ( "***" ); printf ( "\n" ); printf ( "fib 5 : " ); fib ( "*****" ); printf ( "\n" ); return 0; }
$ ./sample-011.exe fib 3 : *** fib 5 : ******** $
/* * 20170512-01-QQQQ.c * 引数付き関数で、if 文で条件判断をするプログラムを作成しなさい */ #include <stdio.h> #include <strings.h> /* * こだまでしょうか * (c) 金子みすゞ * http://www.ad-c.or.jp/campaign/self_area/03/index.html */ void kakko ( char *message ) { /* kakko ( "あそぼ" ) -> 「あそぼ」と表示される */ printf ( "「" ); printf ( message ); printf ( "」" ); } void iu ( char *message ) { /* iu ( "あそぼ" ); -> 「あそぼ」っていうと「あそぼ」っていう */ kakko ( message ); printf ( "っていうと" ); /* iu ( "もう遊ばない" ) -> 「もう遊ばない」っていうと「もう遊ばない」っていう となるが、本当は 「もう遊ばない」っていうと「遊ばない」っていう にしたい。 「もう遊ばない」の時だけ、特別扱いしたい */ if ( !strcmp ( message, "もう遊ばない" ) ) { /* この場合だけは特別扱い */ kakko ( "遊ばない" ); } else { /* それ以外は、いつもと同じ */ kakko ( message ); } printf ( "っていう。\n" ); /* ** この部分を完成させなさい */ } /* * main */ int main ( void ) { iu ( "遊ぼう" ); iu ( "馬鹿" ); iu ( "もう遊ばない" ); printf ( "そうして、あとでさみしくなって、\n" ); iu ( "ごめんね" ); printf ( "こだまでしょうか、いいえ、誰でも。\n" ); return 0; }
/* * DATE-02-QQQQ.c * 底辺の長さが指定した文字列の二倍の長さ - 1 の横向のピラミッドを作成するプログラムを作成する */ #include <stdio.h> #include <strings.h> /* pyramid ( "***" ) * ** up ( "**" ) *** down ( "***" ) ** * down ( "***" ) *** ** * down ( "***" ) printf ( "***" ); printf ( "\n" ); down( "**" ); printf ( "***" ); printf ( "\n" ); down( "***" + 1 ); down ( X ) printf ( X ); printf ( "\n" ); down( X + 1 ); up ( "**" ) * ** up ( "**" ) * printf ( "**" ); printf ( "\n" ): up ( "**" ) up ( "*" ): printf ( "**" ); printf ( "\n" ): up ( "**" + 1 ): printf ( "**" ); printf ( "\n" ): up ( X ) up ( X + 1 ): printf ( X ); printf ( "\n" ): up ( X ) { if ( !strcmp ( X, "" ) ) { } else { up ( X + 1 ): printf ( X ); printf ( "\n" ): } } */ /* */ void down ( char *edge ) { if ( !strcmp ( edge, "" ) ) { /* なにもする必要はない */ } else { printf ( edge ); printf ( "\n" ); down ( edge + 1 ); } } void up ( char *edge ) { if ( !strcmp ( edge, "" ) ) { /* なにもする必要はない */ } else { up ( edge + 1 ); printf ( edge ); printf ( "\n" ); } } void pyramid ( char *edge ) { up ( edge + 1 ); printf ( edge ); printf ( "\n" ); down ( edge + 1 ); } /* * main */ int main ( void ) { pyramid ( "*****" ); printf ( "\n" ); pyramid ( "**********" ); return 0; }
#include <stdio.h> /* 引数の値を出力したあと、 引数の値が "Yes" かどうかで、ふるまいを変える if 構文を利用する事により、 (引数の値によって..) まったく異なる命令を一つの関数に まとめられる */ void if_func ( char *X ) { printf ( "X=" ); /* 引数の内容を表示 */ printf ( X ); printf ( " : " ); if ( !strcmp ( X, "Yes" ) ) { /* 変数 X の値が "Yes" かどうか */ printf ( "はい\n" ); /* 条件が成立 ( X = "Yes" ) だった */ } else { printf ( "いいえ\n" ); /* 条件が不成立 */ } } int main(void) { if_func ( "Yes" ); if_func ( "No" ); if_func ( "yes" ); if_func ( "y" ); if_func ( "はい" ); return 0; }
#include <stdio.h> int main(void) { printf ( "Hello, World\n" + 1 ); /* 文字列に 1 を加える(+) という意味は... ? 「ello, World」が表示された 先頭文字がなくなって、文字列が1文字、短くなる */ printf ( "Hello, World\n" + 2 ); /* "Hello, World\n" + 1 -> "ello, World\n" "Hello, World\n" + 2 "Hello, World\n" + 1 + 1 "ello, World\n" + 1 -> "llo, World\n" */ return 0; }
#include <stdio.h> void prints ( char *string ) { if ( !strcmp ( string, "" ) ) { /* 空文字列だったら.. */ printf ( "空文字列だった\n" ); } else { printf ( string ); printf ( "\n" ); } } int main(void) { prints ( "" ); prints ( "Hello" ); prints ( "Hello" + 1 ); prints ( "Hello" + 2 ); prints ( "Hello" + 3 ); prints ( "Hello" + 4 ); prints ( "Hello" + 5 ); return 0; }
#include <stdio.h> void prints ( char *string ) { if ( !strcmp ( string, "" ) ) { /* 空文字列だったら.. */ printf ( "空文字列だった\n" ); } else { printf ( string ); printf ( "\n" ); prints ( string + 1 ); /* 新しく追加 */ } } int main(void) { prints ( "Hello" ); /* => Hello (*1 ello llo lo o 空文字列だった => prints ( "Hello" ); -> void prints ( char *string ) { if ( !strcmp ( string, "" ) ) { printf ( "空文字列だった\n" ); } else { printf ( string ); printf ( "\n" ); prints ( string + 1 ); } } -> string <- "Hello" if ( !strcmp ( string, "" ) ) { printf ( "空文字列だった\n" ); } else { printf ( string ); printf ( "\n" ); prints ( string + 1 ); } -> if ( !strcmp ( "Hello", "" ) ) { 成立しない printf ( "空文字列だった\n" ); } else { printf ( "Hello" ); printf ( "\n" ); prints ( "Hello" + 1 ); } -> printf ( "Hello" ); printf ( "\n" ); ---> "Hello" --- (*1) prints ( "Hello" + 1 ); -> ---> "Hello" --- (*1) prints ( "ello" ); -> ---> "Hello" --- (*1) prints ( "ello" ); void prints ( char *string ) { if ( !strcmp ( string, "" ) ) { printf ( "空文字列だった\n" ); } else { printf ( string ); printf ( "\n" ); prints ( string + 1 ); } } -> ---> "Hello" --- (*1) string <- "ello" if ( !strcmp ( string, "" ) ) { printf ( "空文字列だった\n" ); } else { printf ( string ); printf ( "\n" ); prints ( string + 1 ); } } -> ---> "Hello" --- (*1) if ( !strcmp ( "ello", "" ) ) { 成立しない printf ( "空文字列だった\n" ); } else { printf ( "ello" ); printf ( "\n" ); prints ( "ello" + 1 ); } } -> ---> "Hello" --- (*1) printf ( "ello" ); printf ( "\n" ); prints ( "ello" + 1 ); -> ---> "Hello" --- (*1) printf ( "ello" ); printf ( "\n" ); ---> "ello" --- (*2) prints ( "llo" ); ... ---> "Hello" --- (*1) ---> "ello" --- (*2) ---> "llo" --- (*3) ---> "lo" --- (*4) ---> "o" --- (*5) prints ( "o" + 1 ); -> prints ( "" ); -> ---> "空文字列だった" */ return 0; }
#include <stdio.h> /* ??A?v???O??????l???? */ /* func ( "abcde\n" ); abcde bcde cde de e */ void func(char *X) { printf ( X ); /* ?????Afunc ( "abcde\n" ) ?? "abcde" .. "e" ???????????? func ( "bcde\n" ) ??A"bcde" .. "e" ??????鎖????????? ?????A????v???O?????? printf ( X ); func ( "bcde\n" ); ???????B????A printf ( X ); func ( X + 1 ); */ printf ( "bcde\n" ); printf ( "cde\n" ); printf ( "de\n" ); printf ( "e\n" ); printf ( "\n" ); } /* void func(char *X) { printf ( X ); func ( X + 1 ); } ?????A??????????????... func ( "abcde\n" ); "abcde" func( "bcde\n") "bcde" func ( "cde\n" ); ... "" func ( "" + 1 ); <= ??O????????K?v?????? void func(char *X) { if ( !strcmp( X, "" ) ) { } else { printf ( X ); func ( X + 1 ); } } */ int main(void) { /* abcde bcde cde de e */ /* printf ( "abcde\n" ); printf ( "bcde\n" ); printf ( "cde\n" ); printf ( "de\n" ); printf ( "e\n" ); printf ( "\n" ); */ func("abcde\n"): return 0; }
/* * 2017/05/12 sample-001.c * 童謡を表示するプログラム作成したい ( ver. 1 ) * ver 1 は、いつでも Hello, World */ /* * 最初のプログラムは "Hello, World" */ #include <stdio.h> /* * main 関数 */ int main ( void ) { printf ( "Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ return 0; }
/* * DATE sample-003.c * 童謡を表示するプログラム (ver 2) * 1. printf でメッセージを出力 * 2. 順接(命令を並べる)により、歌詞の順にメッセージ出力 */ #include <stdio.h> /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * 関数を使わずに愚直に命令を並べた * プログラミングの基本はこれ (実行したい内容をその順に並べる) */ void uta (void) { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); } void ieie(void) { printf ( "いえ いえ それはなりませぬ\n" ); } void kyoku_1(void) { uta(); printf ( "後の山に 棄てましょか\n" ); ieie(); } /* * int main ( void ) */ int main ( void ) { kyoku_1(); printf ( "\n" ); printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); printf ( "背戸の小薮に 埋けましょか\n" ); printf ( "いえ いえ それはなりませぬ\n" ); printf ( "\n" ); printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); printf ( "柳の鞭で ぶちましょか\n" ); printf ( "いえ いえ それはかわいそう\n" ); printf ( "\n" ); printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); printf ( "象牙の船に 銀の櫂\n" ); printf ( "月夜の海に 浮べれば\n" ); printf ( "忘れた唄を おもいだす\n" ); return 0; }
/* * DATE sample-004.c * 童謡を表示するプログラム (ver 3) * 共通な部分を関数としてくくりだしている */ #include <stdio.h> /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * 共通する部分に名前を付け重複を減らす * 引数を利用しなくてもできる形 */ /* * void uta(void) * 「唄を忘れた 金糸雀(かなりや)は」を出力する */ void uta(void) { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); } /* * void ieie(void) * 「いえ いえ それはなりませぬ」を出力する */ void ieie(void) { printf ( "いえ いえ それはなりませぬ\n" ); } /* * void kyoku_1(void) * 「歌詞 1 」を出力する */ void kyoku_1(void) { uta(); printf ( "後の山に 棄てましょか\n" ); ieie(); } /* * void kyoku_2(void) * 「歌詞 2 」を出力する */ void kyoku_2(void) { uta(); printf ( "背戸の小薮に 埋けましょか\n" ); ieie(); } /* * void kyoku_3(void) * 「歌詞 3 」を出力する */ void kyoku_3(void) { uta(); printf ( "柳の鞭で ぶちましょか\n" ); ieie(); } /* * void kyoku_4(void) * 「歌詞 4 」を出力する */ void kyoku_4(void) { uta(); printf ( "象牙の船に 銀の櫂\n" ); printf ( "月夜の海に 浮べれば\n" ); printf ( "忘れた唄を おもいだす\n" ); } /* * int main ( void ) * 四つの歌詞を、間に空行を入れて出力する */ int main ( void ) { kyoku_1(); /* 一曲目 */ printf ( "\n" ); /* 空行 */ kyoku_2(); /* ニ曲目 */ printf ( "\n" ); /* 空行 */ kyoku_3(); /* 三曲目 */ printf ( "\n" ); /* 空行 */ kyoku_4(); /* 四曲目 */ return 0; }
/* * DATE sample-005.c * 童謡を表示するプログラム (ver 4) sample-004.c の 関数 kyoku_1 と kyoku_2 はほとんど同じ ただ、違う部分もある ここで、もし、まったく同じなら、関数できるが 違う部分があるので、「そのまま」では、共通化できない 違う部分を「変数」にして、「あとから値を決める」事により、 共通化できる [元の形] void kyoku_1(void) { uta(); printf ( "後の山に 棄てましょか\n" ); ^^^^^^^^^^^^^^^^^^^^^^^^^^ ieie(); } void kyoku_2(void) { uta(); printf ( "背戸の小薮に 埋けましょか\n" ); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ieie(); } [共通化] void kyoku_123(char *X) { uta(); printf ( X ); ^ 異なる部分を変数(X)にする ieie(); } kyoku_1() -> kyoku_123 ( "後の山に 棄てましょか\n" ) kyoku_2() -> kyoku_123 ( "背戸の小薮に 埋けましょか\n" ) 「引数付き」関数の作り方と利用の仕方 異なる関数(記述)を、一つ(の関数記述)にまとめることができる これによって、プログラムが解りやすくなる(量が減る) 「同じ」である事が保証される 一度「正しく動く」事がわかっていれば、 それが何度でも利用できる 1,2,3 は形が同じなので、共通化できた 4 は、形(行数)がちがう 1,2,3 と 4 とは、まったく違うものと思ってよい まったく違うものを「同じもの」とみなすには、 新しい仕組みが必要 (条件分岐) */ #include <stdio.h> /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * 1 〜 3 を引数付き関数でおきかえる */ /* * void uta(void) * 「唄を忘れた 金糸雀(かなりや)は」を出力する */ void uta(void) { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); } /* * void ieie(void) * 「いえ いえ それはなりませぬ」を出力する */ void ieie(void) { printf ( "いえ いえ それはなりませぬ\n" ); } /* * void kyoku_123 ( char *center ) * char *center ; 曲 1 〜 3 で異る部分 * 曲 1 〜 3 で異る部分を引数にする事により、歌詞全体を出力する */ void kyoku_123 ( char *center ) { uta(); printf ( center ); /* kyoku 1 〜 3 で異る部分を変数 (center) にした */ ieie(); } /* * void kyoku_1(void) * 「歌詞 1 」を出力する * kyoku_123 を利用して、歌詞 1 固有の部分だけを指定する */ void kyoku_1(void) { kyoku_123 ( "後の山に 棄てましょか\n" ); } /* * void kyoku_2(void) * kyoku_123 を利用して、歌詞 2 を出力 */ void kyoku_2(void) { kyoku_123 ( "背戸の小薮に 埋けましょか\n" ); } /* * void kyoku_3(void) * kyoku_123 を利用して、歌詞 3 を出力 */ void kyoku_3(void) { kyoku_123 ( "柳の鞭で ぶちましょか\n" ); } /* * void kyoku_4(void) * 「歌詞 4 」を出力する * 形が 1 〜 3 と異るので、kyoku_123 は使えない */ void kyoku_4(void) { uta(); printf ( "象牙の船に 銀の櫂\n" ); printf ( "月夜の海に 浮べれば\n" ); printf ( "忘れた唄を おもいだす\n" ); } /* * int main ( void ) * 四つの歌詞を、間に空行を入れて出力する */ int main ( void ) { kyoku_1(); /* 一曲目 */ printf ( "\n" ); /* 空行 */ kyoku_2(); /* ニ曲目 */ printf ( "\n" ); /* 空行 */ kyoku_3(); /* 三曲目 */ printf ( "\n" ); /* 空行 */ kyoku_4(); /* 四曲目 */ return 0; }
/* * DATE sample-006.c * [条件分岐] 変数の値によって、 まったく異なる二つ命令のどちらか一方を実行する仕組み 変数の値をチェック(条件判断)し、その結果応じて、 実行する命令を切り替える(分岐) [C 言語での記述] if ( 条件判断 ) { 命令1 : 条件が成立したときの命令 } else { 命令2 : 条件が不成立の時の命令 } 「条件判断」の例 変数(の値)が、特定の文字列と一致しているかどうか 時は、 !strcmp(変数名、文字列) と記述する 例: 変数 X が、文字列"象牙の船に 銀の櫂\n"と一致しているかどうか !strcmp ( X, "象牙の船に 銀の櫂\n" ) */ #include <stdio.h> #include <string.h> /* strcmp を利用する場合は必要 */ /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * 4 の場合もまとめられないだろうか ? */ /* * void uta(void) * 「唄を忘れた 金糸雀(かなりや)は」を出力する */ void uta(void) { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); } /* * void ieie(void) * 「いえ いえ それはなりませぬ」を出力する */ void ieie(void) { printf ( "いえ いえ それはなりませぬ\n" ); } /* * void kyoku_1234 ( char *center ) * char *center ; 曲 1 〜 4 で最初に異る部分 * 曲 1 〜 3 は異る部分を、定型で、出力する事により * 曲 4 は、if と strcmp を利用して、区別し、特別扱いする事により * それぞれ、歌詞全体を出力する */ void kyoku_1234 ( char *center ) { /* 1 〜 4 共通部分 */ uta(); printf ( center ); /* 1 〜 3 と 4 では異る部分 */ /* strcmp で、比較し、その結果を if で区別する */ if ( !strcmp ( center, "象牙の船に 銀の櫂\n" ) ) { /* 4 の場合だった */ printf ( "月夜の海に 浮べれば\n" ); printf ( "忘れた唄を おもいだす\n" ); } else { /* それ以外.. */ /* 1 〜 3 の場合だった */ ieie(); } } /* * void kyoku_1(void) * kyoku_1234 を利用して、歌詞 1 を出力 */ void kyoku_1(void) { kyoku_1234 ( "後の山に 棄てましょか\n" ); } /* * void kyoku_2(void) * kyoku_1234 を利用して、歌詞 2 を出力 */ void kyoku_2(void) { kyoku_1234 ( "背戸の小薮に 埋けましょか\n" ); } /* * void kyoku_3(void) * kyoku_1234 を利用して、歌詞 3 を出力 */ void kyoku_3(void) { kyoku_1234 ( "柳の鞭で ぶちましょか\n" ); } /* * void kyoku_4(void) * kyoku_1234 を利用して、歌詞 4 を出力 */ void kyoku_4(void) { kyoku_1234 ( "象牙の船に 銀の櫂\n" ); } /* * int main ( void ) * 四つの歌詞を、間に空行を入れて出力する */ int main ( void ) { kyoku_1(); /* 一曲目 */ printf ( "\n" ); /* 空行 */ kyoku_2(); /* ニ曲目 */ printf ( "\n" ); /* 空行 */ kyoku_3(); /* 三曲目 */ printf ( "\n" ); /* 空行 */ kyoku_4(); /* 四曲目 */ return 0; }
/* * DATE sample-007.c */ #include <stdio.h> #include <string.h> /* * 木霊 */ /* * 引数を利用して振舞をかえる関数の例 */ /* * void echo ( char *message ) * char *message 与えらえたメッセージ、これをそのまま言い返す(木霊) * message が空の場合は、「言い返せない」と文句を言う */ void echo ( char *message ) { /* message の内容によって振舞を変える */ /* 「""」は「空文字列」を表す */ if ( !strcmp ( message, "" ) ) { /* もし、メッセージが空っぽならば.. */ printf ( "何か言わないと、言い返せないじゃないか.." ); } else { /* そうじゃなければ、そのまま答える */ printf ( message ); } } /* * void chat ( char *message ) * char *message 木霊に呼び掛けるメッセージ * こちらからの呼び掛けと、木霊の返答を表示する */ void chat ( char *message ) { printf ( "呼掛け : " ); printf ( message ); printf ( "\n" ); /* 呼掛けの言葉 */ printf ( "木霊 : " ); echo ( message ); printf ( "\n" ); /* 木霊の応答 */ } /* * main */ int main ( void ) { chat ( "ヤッホー" ); chat ( "オーイ" ); chat ( "" ); chat ( "生意気なやつだ" ); return 0; }
/* * DATE sample-009.c */ #include <stdio.h> #include <string.h> /* * void recursive ( char *string ) * char *string 指定した文字列からなる三角形を作る * 実行例 * recursive( "abc\n" ); * -> * abc "abc\n" * bc "bc\n" * c "c\n" * "\n" * 再帰呼出しを利用 */ void recursive ( char *string ) { if ( !strcmp ( string, "" ) ) { /* もし空文字列 ( "" ) ならば */ printf ( "" ); /* これで御仕舞い */ } else { /* そうでなければ、 */ printf ( string ); recursive ( string + 1 ); /* 再帰呼び出しする */ /* +1 を忘れると悲惨な事に.. */ } } /* * main */ int main ( void ) { recursive ( "abcdefg\n" ); recursive ( "xyz\n" ); return 0; }
[?O??????e] ??W: C ?????v???O??????????????????? ?u?v???O???~???O?v???F?v???O?????????????? ??????????? ???? : ???????s????s?? ?? : printf ( "Hello, World\n" ); -> ???b?Z?[?W???\??????? s_midi_play( "?h" ); -> ?h???????? ???????????u????(??{????)?v???s?? -> ???????? ?F?X???????g?????A???????? API ??m???? ????:????????? -> ??????A???????????????s????? ????????O??t???邱???????A ???O??????????A??????????s????? ???G(???????????)??P????????(??????点??) -> 100 ?s?? hello, ????????O -> ????邱?????A??P?????? ?S?????????A????????l???? ?????l????????A???K?v??l???? ?u?????v(?v???O???????????????????d?g??) ???A?u?????v????????I????B ?uC ????v????e?F?v???O??????????\?????? ?uHello, World?v?v???O???? ??P??????A???S??v???O??????A??????X???鎖????A ????v???O??????????u???`?v???????p????? ?u?????????v??????????邪?A?????????? ?u???????????????v ???????? ?u?R???p?C???v???A?v???O???????s????@?F?v???O????????????s?? ?G?f?B?^?? foobar.c ?????A?g???q?? .c ??t?@?C??????? cc -c foobar.c ??R???p?C?? cc -o foobar.exe foobar.o ??????N ./foobar.exe ????s ?Imake ???????????? midi ??g???? 2017/04/28 ?? midi ??t?H???_??v???O?????t?@?C??????? #include "s_midi.h" ???A#include <stdio.h> ?????}?? printf ????l??As_midi_play_doremi ??????????????w???? ???????w??????????? ???????Aapi.txt ???? == ??A??яo?? ????????{???A???????g????яo?? # ????A?u????????????????p??????ρv??C?????? # ????A???w????E???A?????s??????? # ??1 # ?????Q???? # a_1 = 1 # a_{n+1} = a_n + 3 # ?????? 1 ??A?????? 3 ????? # {a_n} ????? a_{n+1} ?? a_n ??p??????? # ??2 # ?K?? n! # 1 (n=1???) # n! = { # n * (n-1)! (?????????) # 5! = 5 * 4! # = 5 * 4 * 3! # = 5 * 4 * 3! # = 5 * 4 * 3 * 2! # = 5 * 4 * 3 * 2 * 1! # = 5 * 4 * 3 * 2 * 1 # = 120 # ??3 # ?A?[?@ : ???? a), b) ??????????????A?C?????R?? n ?? P(n) ?????? # a) P(1) ?????????? # b) P(k) ?????????????AP(k+1) ????????????? # # ?u??A?v??A?u???w?I?A?[?@?v???A????????????
Download : 20170512-01.c
/* * 20170512-01-QQQQ.c * 引数付き関数で、if 文で条件判断をするプログラムを作成しなさい */ #include <stdio.h> #include <strings.h> /* * こだまでしょうか * (c) 金子みすゞ * http://www.ad-c.or.jp/campaign/self_area/03/index.html */ void kakko ( char *message ) { printf ( "「" ); printf ( message ); printf ( "」" ); } void iu ( char *message ) { kakko ( message ); printf ( "っていうと" ); /* ** この部分を完成させなさい */ } /* * main */ int main ( void ) { iu ( "遊ぼう" ); iu ( "馬鹿" ); iu ( "もう遊ばない" ); printf ( "そうして、あとでさみしくなって、\n" ); iu ( "ごめんね" ); printf ( "こだまでしょうか、いいえ、誰でも。\n" ); return 0; }
$ ./20170512-01-QQQQ.exe 「遊ぼう」っていうと「遊ぼう」っていう。 「馬鹿」っていうと「馬鹿」っていう。 「もう遊ばない」っていうと「遊ばない」っていう。 そうして、あとでさみしくなって、 「ごめんね」っていうと「ごめんね」っていう。 こだまでしょうか、いいえ、誰でも。 $
Download : 20170512-02.c
/* * DATE-02-QQQQ.c * 底辺の長さが指定した文字列の二倍の長さ - 1 の横向のピラミッドを作成するプログラムを作成する */ #include <stdio.h> #include <strings.h> /* */ void down ( char *edge ) { if ( !strcmp ( edge, "" ) ) { /* なにもする必要はない */ } else { printf ( edge ); printf ( "\n" ); down ( edge + 1 ); } } void up ( char *edge ) { if ( !strcmp ( edge, "" ) ) { /* なにもする必要はない */ } else { up ( edge + 1 ); /* ** この部分を完成させなさい */ } } void pyramid ( char *edge ) { up ( edge + 1 ); printf ( edge ); printf ( "\n" ); /* ** この部分を完成させなさい */ } /* * main */ int main ( void ) { pyramid ( "*****" ); printf ( "\n" ); pyramid ( "**********" ); return 0; }
$ ./20170512-02-QQQQ.exe * ** *** **** ***** **** *** ** * * ** *** **** ***** ****** ******* ******** ********* ********** ********* ******** ******* ****** ***** **** *** ** * $