Download : sample-001.c
/* * 2019/04/26 sample-001.c */ /* * 長いプログラムを複数に分割する * 変更前 */ #include <stdio.h> int main ( void ) { /* 16 回同じ亊をする */ printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); return 0; }
$ ./sample-001.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-002.c
/* * 2019/04/26 sample-002.c */ /* * 長いプログラムを複数に分割する * 変更後 */ #include <stdio.h> void fourTimes() { printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); } int main ( void ) { /* 16 回 = 4 × 4 回同じ亊をする */ fourTimes(); fourTimes(); fourTimes(); fourTimes(); return 0; }
$ ./sample-002.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-003.c
/* * 2019/04/26 sample-003.c */ /* * 長いプログラムを複数に分割する * 変更後 */ #include <stdio.h> void fourTimes() { printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); } void fourFourTimes() { fourTimes(); fourTimes(); fourTimes(); fourTimes(); } int main ( void ) { /* 64 回 = 4 × 4 × 4 回同じ亊をする */ fourFourTimes(); fourFourTimes(); fourFourTimes(); fourFourTimes(); return 0; }
$ ./sample-003.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 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 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 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-004.c
/* * 2019/04/26 sample-004.c */ #include <stdio.h> /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ 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-004.exe 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 柳の鞭で ぶちましょか いえ いえ それはかわいそう 唄を忘れた 金糸雀(かなりや)は 象牙の船に 銀の櫂 月夜の海に 浮べれば 忘れた唄を おもいだす $
Download : sample-005.c
/* * 2019/04/26 sample-005.c */ #include <stdio.h> /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * まず、四つの歌にわける */ void kyoku_1() { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); printf ( "後の山に 棄てましょか\n" ); printf ( "いえ いえ それはなりませぬ\n" ); } void kyoku_2() { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); printf ( "背戸の小薮に 埋けましょか\n" ); printf ( "いえ いえ それはなりませぬ\n" ); } void kyoku_3() { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); printf ( "柳の鞭で ぶちましょか\n" ); printf ( "いえ いえ それはなりませぬ\n" ); } void kyoku_4() { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); printf ( "象牙の船に 銀の櫂\n" ); printf ( "月夜の海に 浮べれば\n" ); printf ( "忘れた唄を おもいだす\n" ); } 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
/* * 2019/04/26 sample-006.c */ #include <stdio.h> /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * 更に、共通する部分を抜き出す */ void uta() { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); } void ieie() { printf ( "いえ いえ それはなりませぬ\n" ); } void kyoku_1() { uta(); printf ( "後の山に 棄てましょか\n" ); ieie(); } void kyoku_2() { uta(); printf ( "背戸の小薮に 埋けましょか\n" ); ieie(); } void kyoku_3() { uta(); printf ( "柳の鞭で ぶちましょか\n" ); ieie(); } void kyoku_4() { uta(); printf ( "象牙の船に 銀の櫂\n" ); printf ( "月夜の海に 浮べれば\n" ); printf ( "忘れた唄を おもいだす\n" ); } 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
/* * 2019/04/26 sample-007.c */ #include <stdio.h> /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * 1 〜 3 を引数付き関数でおきかえる */ void uta() { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); } void ieie() { printf ( "いえ いえ それはなりませぬ\n" ); } void kyoku_123 ( char *center ) { if ( !strcmp ( center, "象牙の船に 銀の櫂\n" ) ) { /* 4 */ uta(); printf ( "象牙の船に 銀の櫂\n" ); printf ( "月夜の海に 浮べれば\n" ); printf ( "忘れた唄を おもいだす\n" ); } else { /* 1, 2, 3 */ uta(); printf ( center ); ieie(); } } void kyoku_1() { kyoku_123 ( "後の山に 棄てましょか\n" ); } void kyoku_2() { kyoku_123 ( "背戸の小薮に 埋けましょか\n" ); } void kyoku_3() { kyoku_123 ( "柳の鞭で ぶちましょか\n" ); } void kyoku_4() { /* uta(); printf ( "象牙の船に 銀の櫂\n" ); printf ( "月夜の海に 浮べれば\n" ); printf ( "忘れた唄を おもいだす\n" ); */ kyoku_123 ( "象牙の船に 銀の櫂\n" ); } int main ( void ) { kyoku_1(); printf ( "\n" ); kyoku_2(); printf ( "\n" ); kyoku_3(); printf ( "\n" ); kyoku_4(); return 0; }
$ ./sample-007.exe 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 柳の鞭で ぶちましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 象牙の船に 銀の櫂 月夜の海に 浮べれば 忘れた唄を おもいだす $
Download : sample-008.c
/* * 2019/04/26 sample-008.c */ #include <stdio.h> #include <string.h> /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * 4 の場合もまとめられないだろうか ? */ void uta() { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); } void ieie() { printf ( "いえ いえ それはなりませぬ\n" ); } /* * if と strcmp を使って処理できる */ void kyoku_123 ( char *center ) { uta(); printf ( center ); if ( !strcmp ( center, "象牙の船に 銀の櫂\n" ) ) { printf ( "月夜の海に 浮べれば\n" ); printf ( "忘れた唄を おもいだす\n" ); } else { ieie(); } } void kyoku_1() { kyoku_123 ( "後の山に 棄てましょか\n" ); } void kyoku_2() { kyoku_123 ( "背戸の小薮に 埋けましょか\n" ); } void kyoku_3() { kyoku_123 ( "柳の鞭で ぶちましょか\n" ); } void kyoku_4() { kyoku_123 ( "象牙の船に 銀の櫂\n" ); } int main ( void ) { kyoku_1(); printf ( "\n" ); kyoku_2(); printf ( "\n" ); kyoku_3(); printf ( "\n" ); kyoku_4(); return 0; }
$ ./sample-008.exe 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 柳の鞭で ぶちましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 象牙の船に 銀の櫂 月夜の海に 浮べれば 忘れた唄を おもいだす $
Download : sample-009.c
/* * 2019/04/26 sample-009.c */ #include <stdio.h> #include <string.h> /* * 木霊 */ void echo ( char *message ) { if ( !strcmp ( message, "" ) ) { /* もし、メッセージが空っぽならば.. */ printf ( "何か言わないと、言い返せないじゃないか.." ); } else { /* そうじゃなければ、そのまま答える */ printf ( 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-009.exe 呼掛け : ヤッホー 木霊 : ヤッホー 呼掛け : オーイ 木霊 : オーイ 呼掛け : 木霊 : 何か言わないと、言い返せないじゃないか.. 呼掛け : 生意気なやつだ 木霊 : 生意気なやつだ $
Download : sample-010.c
/* * 2019/04/26 sample-010.c */ #include <stdio.h> #include <string.h> /* * 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-010.exe abcde bcde cde cde $
Download : sample-011.c
/* * 2019/04/26 sample-011.c */ #include <stdio.h> #include <string.h> /* * main */ void recursive ( char *string ) { if ( !strcmp ( string, "" ) ) { /* もし空文字列 ( "" ) ならば */ printf ( "" ); /* これで御仕舞い */ } else { /* そうでなければ、 */ printf ( string ); recursive ( string + 1 ); /* 再帰呼び出しする */ /* +1 を忘れると悲惨な事に.. */ } } int main ( void ) { recursive ( "abcdefg\n" ); recursive ( "xyz\n" ); return 0; }
$ ./sample-011.exe abcdefg bcdefg cdefg defg efg fg g xyz yz z $
Download : sample-012.c
/* * 2019/04/26 sample-012.c */ #include <stdio.h> #include <string.h> /* * */ void rec_hello ( char *count ) { if ( !strcmp ( count, "" ) ) { /* カラッポなら.. */ printf ( "Hello, World\n" ); /* 一つだけ表示してみる */ } else { /* そうでなければ.. */ rec_hello ( count + 1 ); /* 二倍にして再帰よびだし */ rec_hello ( count + 1 ); } } /* * */ int main ( void ) { rec_hello ( "****" ); /* 2^4 = 16 回出力 */ /* 2^10 = 1024 だから、 "**********" を与えれば... */ return 0; }
$ ./sample-012.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-013.c
/* * 2019/04/26 sample-013.c */ #include <stdio.h> #include <string.h> /* * */ 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 ) だけだす */ } } /* * */ int main ( void ) { printf ( "fib 3 : " ); fib ( "***" ); printf ( "\n" ); printf ( "fib 5 : " ); fib ( "*****" ); printf ( "\n" ); return 0; }
$ ./sample-013.exe fib 3 : *** fib 5 : ******** $
/* * 20190426-01-QQQQ.c * 歌詞を出力する */ #include <stdio.h> /* * 「一番星みつけた」 * (C) 生沼勝作詞(注)・信時潔作曲/文部省唱歌(一年) * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/ichibanboshi.html */ /* <最終的に出力したい結果> 一番星みつけた。 あれあの森の 杉の木の上に。 二番星みつけた。 あれあのどての 柳の木の上に。 三番星みつけた。 あれあの山の 松の木の上に。 */ /* <<違う所をみつける:相違点の発見>> 「一」番星みつけた。 あれあの「森」の 「杉」の木の上に。 「二」番星みつけた。 あれあの「どて」の 「柳」の木の上に。 */ /* <<違う所を変数に置き換える:抽象化>> X番星みつけた。 あれあのYの Zの木の上に。 X => ichi Y => basyo Z => ki */ void uta ( char *ichi, char *basyo, char *ki ) { printf ( ichi ); /* 「一」 */ printf ( "番星みつけた。\n" ); /* 「番星みつけた。」*/ printf ( "あれあの" ); /* 「あれあの」*/ printf ( basyo ); /* 「森」*/ printf ( "の\n" ); /* 「の」 */ printf ( ki ); /* 「杉」*/ printf ( "の木の上に。\n" ); /* 「の木の上に。」*/ } void itibanboshi() { /* 一段目 */ uta ( "一", "森", "杉" ); printf ( "\n" ); /* 二段目 */ uta ( "二", "どて", "柳" ); printf ( "\n" ); /* 三段目 */ /* 自分で... 考える */ } /* * main */ int main ( void ) { itibanboshi(); return 0; }
#include <stdio.h> int main() { printf ( "Hello, World\n" ); /* 画面に、 「Hello, World」+「改行」を出力する */ return 0;
#include <stdio.h> int main() { printf ( "1:Hello, World\n" ); printf ( "2:Hello, World\n" ); printf ( "3:Hello, World\n" ); return 0; }
#include <stdio.h> /* 関数 hello の定義 => 命令「printf ( "Hello, World\n" );」に hello という名前を付けた */ void hello() { printf ( "Hello, World\n" ); } int main() { hello(); /* 名前「hello」を指定するだけで、 命令「printf ( "Hello, World\n" );」が 実行される */ hello(); /* 一度定義された関数は、何度でも呼び出せる */ hello(); /* 関数呼び出し */ return 0; }
/* * 2019/04/26 sample-001.c */ /* * 長いプログラムを複数に分割する * 変更後 * <関数定義> * 4 行分に命令に名前を付けたい * 1. 名前を決める * fourtimes * 2. その名前を、#include と main の間の挿入する * 3. 名前の前に void、後ろに () {} をいれる * 4. {と}の間に、名前をつけたい命令列を入れる * <関数呼び出し> * 5. 名前をつけた命令を実行したい場合は、「名前();」をかけばよい * * => sample-002.c と同じなる */ #include <stdio.h> void fourtimes() { printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); } int main ( void ) { /* 16 回同じ亊をする */ fourtimes(); /* 関数呼び出し */ fourtimes(); fourtimes(); fourtimes(); return 0; }
/* * 2019/04/26 sample-003.c */ /* * 長いプログラムを複数に分割する * 変更後 */ #include <stdio.h> void fourTimes() { /* sample-002.c と同じ */ printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); } void fourTimes2() { /* sample-002.c と同じ */ printf ( "Hello, World 2\n" ); printf ( "Hello, World 2\n" ); printf ( "Hello, World 2\n" ); printf ( "Hello, World 2\n" ); } void fourFourTimes() { /* fourfourtimes は、fourtimes を利用している */ /* 一度定義した関数は、他の関数でも利用できる */ /* fourtimes は、main のところだけでなく、 自分で定義する関数でも利用できる */ fourTimes(); fourTimes(); fourTimes(); fourTimes(); } void fourFourTimes2() { /* fourfourtimes は、fourtimes を利用している */ /* 一度定義した関数は、他の関数でも利用できる */ /* fourtimes は、main のところだけでなく、 自分で定義する関数でも利用できる */ fourTimes2(); fourTimes2(); fourTimes2(); fourTimes2(); } int main ( void ) { /* 64 回 = 4 × 4 × 4 回同じ亊をする */ fourFourTimes(); fourFourTimes(); fourFourTimes(); fourFourTimes(); /* Hello, World 65 */ fourFourTimes2(); /* Hello, World 16 */ /* 考察 Hello World 2 と Hello World はほんの少ししか違いがない => なんか、無駄[同じようなことが繰り返される]に感じる => にたものは、異なる部分を切り出すことにより統合できる +/ return 0; }
/* * 2019/04/26 sample-003.c */ /* * 長いプログラムを複数に分割する * 変更後 */ #include <stdio.h> /* 2*2 = 4 3*3 = 9 4*4 = 16 f(x)=x*x x=2 => f(2) = 2*2 => 4 x=4 => f(3) = 3*3 => 9 */ void fourTimesX(char *X) { /* sample-002.c と同じ */ printf ( X ); /* 異なる部分を削除した後に追加された X は変数 */ printf ( X ); /* 命令の中の「X」は、関数の引数の値がはいる */ printf ( X ); printf ( X ); /* fourTimes は、X が "Hello, World\n" の時 fourTImes2 は、X が "Hello, World 2\n" の時 と考えられる */ } void fourTimes() { foruTimesX ( "Hello, World\n" ); } void fourTimes2() { foruTimesX ( "Hello, World 2\n" ); } /* fourTimes と fourTimes2 の差 "Hello, World\n" と "Hello, World 2\n" の違い => 違う部分を削除し、その代わりに「変数」をそこに書く */ void fourFourTimes() { /* fourfourtimes は、fourtimes を利用している */ /* 一度定義した関数は、他の関数でも利用できる */ /* fourtimes は、main のところだけでなく、 自分で定義する関数でも利用できる */ fourTimes(); fourTimes(); fourTimes(); fourTimes(); } void fourFourTimes2() { /* fourfourtimes は、fourtimes を利用している */ /* 一度定義した関数は、他の関数でも利用できる */ /* fourtimes は、main のところだけでなく、 自分で定義する関数でも利用できる */ fourTimes2(); fourTimes2(); fourTimes2(); fourTimes2(); } int main ( void ) { /* 64 回 = 4 × 4 × 4 回同じ亊をする */ fourFourTimes(); fourFourTimes(); fourFourTimes(); fourFourTimes(); /* Hello, World 65 */ fourFourTimes2(); /* Hello, World 16 */ /* 考察 Hello World 2 と Hello World はほんの少ししか違いがない => なんか、無駄[同じようなことが繰り返される]に感じる => にたものは、異なる部分を切り出すことにより統合できる +/ return 0; }
/* * 2019/04/26 sample-001.c */ /* * 長いプログラムを複数に分割する * 変更前 */ #include <stdio.h> int main ( void ) { /* 16 回同じ亊をする */ printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); return 0; }
/* * 2019/04/26 sample-003.c */ /* * 長いプログラムを複数に分割する * 変更後 */ #include <stdio.h> void fourTimes() { /* sample-002.c と同じ */ printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); } void fourFourTimes() { /* fourfourtimes は、fourtimes を利用している */ /* 一度定義した関数は、他の関数でも利用できる */ /* fourtimes は、main のところだけでなく、 自分で定義する関数でも利用できる */ fourTimes(); fourTimes(); fourTimes(); fourTimes(); } int main ( void ) { /* 64 回 = 4 × 4 × 4 回同じ亊をする */ fourFourTimes(); fourFourTimes(); fourFourTimes(); fourFourTimes(); return 0; }
/* * 2019/04/26 sample-004.c */ #include <stdio.h> /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ void utauta(char *X,char *Y) { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); printf ( X ); printf ( Y ); } void uta2(char *X) { utauta(X,"いえ いえ それはかわいそう\n"); } void uta(char *X) { utauta(X,"いえ いえ それはなりませぬ\n"); } void ichi() { uta("後の山に 棄てましょか\n"); } void ni() { uta("背戸の小薮に 埋けましょか\n"); } void san() { uta2 ("柳の鞭で ぶちましょか\n"); } int main ( void ) { ichi(); printf ( "\n" ); ni(); printf ( "\n" ); san(); printf ( "\n" ); printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); printf ( "象牙の船に 銀の櫂\n" ); printf ( "月夜の海に 浮べれば\n" ); printf ( "忘れた唄を おもいだす\n" ); return 0; }
[先週の内容] 1. プログラムは、作業の手順を記述したもの 2. コンパイルの仕方を学んだ コンパイル:人間に分り易い形に記述したものを計算機に分り易い形に変換する事 3. C 言語 人間がプログラムを記述するための専用の言語がある => いろいろある この講義では、そのうちの一つである「C 言語」を学ぶ => 英語や、中国語などと同じ、新しい言語を学ぶ <= プログラミング言語は、人工言語(<=> 自然言語:日本語,英語,etc..)なので、 学び易い(覚える事が少ない) 実行する事ができるので、「分からなくても使える」 [C 言語] a. 「Hello, World」プログラム => 新しいプログラムを作成するスタート地点として利用できる ! printf が、画面にメッセージ出力する命令 b. 順接 : 命令を並べると、その順番に命令が実行される 命令の実行順序を、プログラム内で指定できる c. 関数 : 命令例に名前を付ける事ができて、 その名前を指定するだけで、その命令が実行できる [1 について] プログラムを作る目的は、 コンピュータに、作業をさせたい コンピュータにさせたい作業の手順を記述して、コンピュータに渡して実行させる 作業の手順を「プログラム」と呼ぶ ただし、コンピュータが直接理解できる「プログラム」は、人間には難しい 「難しい」=> 目的を実現する事が困難 困難の理由 コンピュータの場合の困難な理由 量 : コンピュータが直接理解できる命令は、単純な事しかできない。 => やりたいことを実現するためには、たくさんの指示が必要 質 : ミスができない => コンピュータは厳密に命令を解釈するので、ちょっとしたミスで、とんでもないことになる 形式的に、誤りをチェックする仕組みを用意している => 誤りにくい手段の組み合わせで、目的を実現するようにもなっている # 効率とトレードオフしている これらの「困難」の一部を、 コンパイラが担っている(効率を犠牲にして..) [今週の内容] 作業 s_curl の環境を作る 関数(再) sample-001.c => sample-002.c 関数 fourtimes の定義と、その利用 関数を定義する(命令列に名前をつける) 関数の呼び出し(名前を利用して、命令を利用する) 定義された関数は、他の関数(main以外)からでも利用可能 => 基本命令(printf) を組み合わせて、小さな関数を作り、 さらに、その小さな関数を組み合わせて、大きな関数を作ることができる # 関数を作ることによって、「小さな」機能を実現できる # 「大きな」機能は、人間には難しいから <<リダイレクション:方向替え>> プログラム(コマンド)を実行するときに、 後ろに 「>」と、「ファイル名」を続けて指定すると、 プログラムの画面への出力が、その「ファイル」に記録される # 画面への出力を、ファイルへの出力に切り替える(リダイレクション)できる !! 後で学ぶが、入力のリダイレクションも可能 引数付き関数 1. 二つの(引数のない)関数が、ほぼ同じ形をしている時 => 一つの引数付き関数にまとめる事が可能(かもしれない) 2. 違う部分を、変数(x,y,z..) に置き換える => 置き換えた結果、同じ形をしていれば、それは一つの関数にまとめられる 3. 関数定義の関数名の後ろにある「()」の中に変数名を書き、その変数の前「char *」を追加 => 引数付き関数が定義される 4. 引数付き関数を呼び出すには、関数名の後ろの()の中に、変数に入ってほしい物を入れる [step 1] fourTimes() と fourTimes2() が似ている void fourTimes() { printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); } void fourTimes2() { printf ( "Hello, World 2\n" ); printf ( "Hello, World 2\n" ); printf ( "Hello, World 2\n" ); printf ( "Hello, World 2\n" ); } [step 2] 引数付きの関数 fourTimesX() void fourTimesX() { printf ( X ); printf ( X ); printf ( X ); printf ( X ); } [step 3] 引数付きの関数の引数部分を整備 (「char *」の意味はあえて説明しない ) void fourTimesX(char *X) { printf ( X ); printf ( X ); printf ( X ); printf ( X ); } [step 4] 元の関数 (fourTimes, fourTimes2) を、引数付き関数で表現する 引数付き関数の呼び出し時に、変数にいれたい内容を指定する void fourTimes() { printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); printf ( "Hello, World\n" ); } void fourTimes() { foruTimesX( "Hello, World\n" ); } 引数付き関数の良い所 1. 複数の関数を一つまとめる事ができる (無駄が減って、作成作業が楽) 2. 引数は、後から決められる 引数付き関数例 f(x) = x*x f(2) = 2*2 = 4, f(3) = 3*3 = 9 g(x,y) = x + y g(1,2) = 1+2, g(2,3) = 2+3 => 関数の引数は複数でもよい (変数の値は、独立に指定できる) 引数付き関数の考え方 異なる複数のものを、その違いを「変数化」する事によって、一つのもので表現ようにする => 抽象化(パラメーター化) 問題 A => 解決 A 問題 A = 問題 F(a) => 解決 A = 解決 G(a) 問題 B => 解決 B 問題 B = 問題 F(b) ====> 解決 B = 解決 G(b) で得られる 課題 童謡の歌詞を出力するプログラムを作成しなさい => 童謡はなんでもよい(サンプルは、「一番星みつけた」だがなんでもよい ) ただし、できるだけ、引数付き関数を使って欲しい
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20190426-01.c
/* * 20190426-01-QQQQ.c * 歌詞を出力する */ #include <stdio.h> /* * 「一番星みつけた」 * (C) 生沼勝作詞(注)・信時潔作曲/文部省唱歌(一年) * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/ichibanboshi.html */ void uta ( char *ichi, char *basyo, char *ki ) { printf ( ichi ); printf ( "番星みつけた。\n" ); /* ** この部分を完成させなさい */ printf ( ki ); printf ( "の木のうえに。\n" ); } void itibanboshi() { uta ( "一", "森", "杉" ); printf ( "\n" ); /* ** この部分を完成させなさい */ } /* * main */ int main ( void ) { itibanboshi(); return 0; }
$ ./20190426-01-QQQQ.exe 一番星みつけた。 あれあの森の 杉の木のうえに。 二番星みつけた。 あれあのどての 柳の木のうえに。 三番星みつけた。 あれあの山の 松の木のうえに。 $