Download : sample-001.c
/* * 2018/04/27 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
/* * 2018/04/27 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
/* * 2018/04/27 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
/* * 2018/04/27 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
/* * 2018/04/27 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
/* * 2018/04/27 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
/* * 2018/04/27 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
/* * 2018/04/27 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
/* * 2018/04/27 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
/* * 2018/04/27 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
/* * 2018/04/27 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
/* * 2018/04/27 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
/* * 2018/04/27 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 : ******** $
/* * 20180420-02-QQQQ.c * 「Hello, 自分の名前」と出力する関数 print_hello_me を作成する */ #include <stdio.h> /* * print_hello_me * 「Hello, 自分の名前」画面表示 */ void print_hello_me ( void ) { /* 名前をつけたい、命令を書く */ printf ( "Hello, 栗野俊一\n" ); /* 「Hello, 自分の名前」を表示する */ /* 「\n」-> 改行 */ /* printf の後ろの () 中には、出力するメッセージの内容を、 「"」で挟んで指定する */ } /* printf_hello_me が定義できた => 解答 */ /* * main */ int main ( void ) { /* print_hello_me がちゃんと定義されているか ? を確認 */ /* 関数 print_hello_me を一回呼び出す */ print_hello_me(); return 0; }
/* * 20180420-03-QQQQ.c * 「Hello, 自分の名前」を 100 回以上出力するプログラム * * 考え方 * 100 行 printf を書くのもあり * 愚直にこれを答案としても「正解扱い」します * ただ、つまらないし、今後の学習にも役立たない * => かっこわるい * せっかくだから、今日学んだところまでで、もっと、スマートに * */ #include <stdio.h> /* * sub */ void print1(void) { /* 最低限 1 度は行う */ /* 画面に、「Hello, 自分の名前」と出力する */ printf ( "Hello, 栗野俊一\n" ); /* 「Hello, 自分の名前」を表示する */ } void print2(void) { /* print1 を二度呼ぶのでメッセージが二度出る */ print1(); print1(); } void print4(void) { /* print2 を二度呼ぶので、四度出る */ print2(); print2(); } void print8(void) { /* print4 を二度呼ぶので、八度出る */ print4(); print4(); } void print16(void) { print8(); print8(); } void print32(void) { print16(); print16(); } void print64(void) { print32(); print32(); } void print128() { print64(); print64(); } /* * main */ int main ( void ) { /* せっかくなので、ちょうど 100 回にしてみた */ print64(); print32(); print4(); return 0; }
/* * 2018/04/13 sample-001.c */ /* * 最初のプログラムは "Hello, World" */ #include <stdio.h> /* * main 関数 */ int main ( void ) { printf ( "Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ printf ( "Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ printf ( "Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ return 0; }
/* * 2018/04/13 sample-001.c */ /* * 最初のプログラムは "Hello, World" */ #include <stdio.h> /* * main 関数 */ int main ( void ) { printf ( "1. Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ printf ( "2. Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ printf ( "3. Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ return 0; }
/* * 2018/04/13 sample-001.c */ /* * 最初のプログラムは "Hello, World" */ #include <stdio.h> /* * main 関数 */ int main ( void ) { printf ( "2. Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ printf ( "1. Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ printf ( "3. Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ return 0; }
/* * 2018/04/13 sample-001.c */ /* * 最初のプログラムは "Hello, World" */ #include <stdio.h> void hello (void) { printf ( "Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ } /* 13 行目の命令に、「hello」という名前を付けた */ /* * main 関数 */ int main ( void ) { /* printf ( "Hello, World\n" ); */ hello(); /* hello と名前を付けた命令を実行する */ return 0; }
/* * 2018/04/13 sample-001.c */ /* * 最初のプログラムは "Hello, World" */ #include <stdio.h> void hello (void) { printf ( "Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ } /* 13 行目の命令に、「hello」という名前を付けた */ /* * main 関数 */ int main ( void ) { /* printf ( "Hello, World\n" ); */ hello(); /* hello と名前を付けた命令を実行する */ hello(); /* 一度名前を付けた命令は何度でも使える */ hello(); /* 名前を指定するだけで、命令が実行される */ return 0; }
/* * 2018/04/13 sample-001.c */ /* * 最初のプログラムは "Hello, World" */ #include <stdio.h> void function_of_print_helloworld_message (void) { printf ( "Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ } /* 13 行目の命令に、「hello」という名前を付けた */ /* * main 関数 */ int main ( void ) { /* printf ( "Hello, World\n" ); */ function_of_print_helloworld_message(); /* hello と名前を付けた命令を実行する */ function_of_print_helloworld_message(); /* hello と名前を付けた命令を実行する */ function_of_print_helloworld_message(); /* hello と名前を付けた命令を実行する */ return 0; }
/* * 2018/04/13 sample-001.c */ /* * 最初のプログラムは "Hello, World" */ /* p-008.c hello();を三度実行する命令に名前 three_times_hello をつける */ #include <stdio.h> void hello (void) { printf ( "Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ } /* 13 行目の命令に、「hello」という名前を付けた */ /* * three_times_hello という関数(命令に名前をつけたもの) * hello を三回実行する */ void three_times_hello(void) { hello(); /* hello と名前を付けた命令を実行する */ hello(); /* 一度名前を付けた命令は何度でも使える */ hello(); /* 名前を指定するだけで、命令が実行される */ } /* * main 関数 */ int main ( void ) { three_times_hello(); three_times_hello(); three_times_hello(); /* three_times_hello を三回 hello は 3 x 3 = 9 回実行される hello を一度実行するために、メッセージが一行 => 9 行の Hello, World がでてくる */ return 0; }
前回までの復習 初回 環境の確認 ubuntu で C のコンパイルができるか ? 前回 hello world プログラム 画面に"Hello, World" というメッセージを出力するプログラム 完全に動く意味のあるプログラム => プログラムの基本構造がわかる(おまじないの部分がわかる) これを、自分の作りたいプログラムのスタートにできる 「コンパイル」 「コンパイル」とは何か (what) 高級プログラミング言語(人間にわかりやすい言語)から、機械語(計算機がわかる唯一の言語)に翻訳する事 (why) 機械語は人間にわかりずらい(人間は書きたくない) 一方、計算機は、機械語しか理解(実行できない):そのままでは、意図が通じないない =>コンパイルが必要 (how to) ubuntu 上で cc コマンドで、コンパイルを行う => 実際の方法を説明した 課題 画面に「Hello, 自分の名前」を出力するプログラムを作る C言語で記述されたプログラムを実行する手順 # 以下、作業は、すべて ubuntu 1. コンパイル : xxxx.c -> xxxx.o cc -c xxxx.c # xxxx.c をコンパイルしてください 2. リンク : xxxx.o -> xxxx.exe cc -o xxxx.exe xxxx.o # 実行ファイル xxxx.exe を xxxx.o を材料に作くってください 3. 実行 : xxxx.exe を指定して、プログラムを実行する ./xxxx.exe # 実行ファイル xxxx.exe を実行してください C 言語でのプログラムの書き方(順接) # p-001.c 17 行目の 「printf ...」が「何かをしている」記述 => この「何かをしている記述」を「命令」と呼ぶ 順接(what) 複数の命令をつないで、その順に実行する命令を作る事 # (複数の)命令から(新しい)命令を作る仕組み # A, B が命令なら、 「A B」も命令 (how) 命令を並べるだけ(並べた順に実行される) # cf. 関数計算 # sin(cos(x)) # 式の計算 # 1 + 2 * 3 プログラムは、計算機に対して、まとめて命令を与える記述 => 複数の命令を与える場合 => 命令を並べればよい 順接 : 命令を並べる事 => 複数の命令を指定するだけでなく、するだけでなく、その順番も指定します 複数の命令から、新しい命令を作る、ひとつの方法が、順接 => 新しい命令が作れるのだから、それに名前を付けたい 「名前を付ける」事の重要さ(その 1) 「意味が分かるようになる」」 p-001.c の 17 行目に、名前「hello」をつけたい how to 1. main の前にその名前を書く 2. 名前の前に「void」 名前の後に 「(void)」をつける 3. さらにその後ろに 「{」と「}」を追加 4. 「{」と「}」の間に、名前つけたい命令を書く 名前を付けた命令を実行したい 5. 「名前();」とすればよい このように、命令に名前を付けたものを C 言語では、 「(C 言語)関数」(数学の「関数」とはちょっと違う) 命令に対して名前を付ける事 => 関数の定義 定義された関数を名前を使って利用する事 => 関数呼び出し 関数 (what)命令に名前をつけたもの (why) (その一つ) わかりやすい => 名前は「自分で決められる」ので、わかりやすい 複数の命令に対して一つの名前による関数呼び出しで実行ができる たくさん命令を少ない指示で実行可能になる # C 言語でプログラミンは、結局は、たくさんの関数を定義する事になる できるだけ、関数を作る習慣を身に着ける (how to) : 関数の利用法 関数を定義して、その名前で呼び出す 関数の定義 : main の上に void 名前 (void) { 名前を付けたい命令 } 関数の呼びだし 名前 () ; ! Hello World プログラムに ! printfがある ! <= これも、「関数」です ! ただし、違いが二つ ! 1. 定義が見当たらない ! => 別のところで定義されている ! <= それを、あとからくっつける必要がある ! => そのくっつける作業がリンク ! 2. printf では () の中に何か書く ! => これは、「関数実引数」なのだが、これは、来週 == コマンドの自動化(その 1) 1. shell script (what) ubuntu で、shell に対して、行うコマンドを記録したもの ! 「コマンド」ってなに ? => これは詳しくはいわない ! cc とか ./.. などだとおもってください。 作業内容をファイルに記述して、そのファイルを指定するだけで、自動的、その作業がなされる (why) ubuntu での作業を自動化したい (how) 作業内容をそのまま、ファイルに記録すればよい ./ファイル名 とすれば、その内容が実行される [注意] c-001.sh を winscp でコピーした場合は chmod +x c-001.sh とする必要がある shell script の中で 「$1」かくと、コマンドを実行するときに、 コマンドの後ろにかいた文字列に置き換わる
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20180427-01.c
/* * 20180427-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; }
$ ./20180427-01-QQQQ.exe 一番星みつけた。 あれあの森の 杉の木のうえに。 二番星みつけた。 あれあのどての 柳の木のうえに。 三番星みつけた。 あれあの山の 松の木のうえに。 $