Download : sample-001.c
/* * 2020/05/08 sample-001.c */ /* * 似た表現の繰返しのあるプログラムを複数に分割する * 変更前 */ #include <stdio.h> int main ( void ) { printf ( "こんにちは、田中さん\n" ); printf ( "田中さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); printf ( "こんにちは、鈴木さん\n" ); printf ( "鈴木さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); return 0; }
$ ./sample-001.exe こんにちは、田中さん 田中さんは、元気していましたか ? また、一緒に働きましょうか ? こんにちは、鈴木さん 鈴木さんは、元気していましたか ? また、一緒に働きましょうか ? $
Download : sample-002.c
/* * 2020/05/08 sample-002.c */ /* * 似た表現の繰返しのあるプログラムを複数に分割する * 関数化 */ #include <stdio.h> void hello_tanaka(void) { printf ( "こんにちは、田中さん\n" ); printf ( "田中さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); } void hello_suzuki(void) { printf ( "こんにちは、鈴木さん\n" ); printf ( "鈴木さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); } int main ( void ) { hello_tanaka(); hello_suzuki(); return 0; }
$ ./sample-002.exe こんにちは、田中さん 田中さんは、元気していましたか ? また、一緒に働きましょうか ? こんにちは、鈴木さん 鈴木さんは、元気していましたか ? また、一緒に働きましょうか ? $
Download : sample-003.c
/* * 2020/05/08 sample-003.c */ /* * 似た表現の繰返しのあるプログラムを複数に分割する * 共通部分を繰り出すために、プログラムを変形 (リファクタリング) * リファクタリング * プログラムの「振舞」を変更しない範囲で、「表現」を変更 * => 「関数化」等をしやすいように書き換える * => 「理解しやすさ」を高める事が目的 */ #include <stdio.h> void hello_tanaka(void) { printf ( "こんにちは、" ); printf ( "田中" ); /* 異る部分("田中")を分離 */ printf ( "さん\n" ); printf ( "田中" ); /* 「文字列」の部分しか分離できない.. */ printf ( "さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); } void hello_suzuki(void) { printf ( "こんにちは、" ); printf ( "鈴木" ); /* 異る部分("鈴木")を分離 */ printf ( "さん\n" ); printf ( "鈴木" ); printf ( "さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); } int main ( void ) { hello_tanaka(); hello_suzuki(); return 0; }
$ ./sample-003.exe こんにちは、田中さん 田中さんは、元気していましたか ? また、一緒に働きましょうか ? こんにちは、鈴木さん 鈴木さんは、元気していましたか ? また、一緒に働きましょうか ? $
Download : sample-004.c
/* * 2020/05/08 sample-004.c */ /* * 似た表現の繰返しのあるプログラムを複数に分割する * 共通部分を変数化する事により、抽象化(引数付き関数) */ #include <stdio.h> void hello_YOU( char *YOU ) { /* 変数(YOU)の宣言 (仮引数宣言) */ printf ( "こんにちは、" ); printf ( YOU ); /* 異る部分は、変数(YOU)として抽象化 */ printf ( "さん\n" ); printf ( YOU ); /* 異る部分は、変数(YOU)として抽象化 */ printf ( "さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); } int main ( void ) { hello_YOU ( "田中" ); /* 変数(YOU)の値を指定 (実引数の指定) */ hello_YOU ( "鈴木" ); /* 変数(YOU)の値を指定 (実引数の指定) */ return 0; }
$ ./sample-004.exe こんにちは、田中さん 田中さんは、元気していましたか ? また、一緒に働きましょうか ? こんにちは、鈴木さん 鈴木さんは、元気していましたか ? また、一緒に働きましょうか ? $
Download : sample-005.c
/* * 2020/05/08 sample-005.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-005.exe 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 柳の鞭で ぶちましょか いえ いえ それはかわいそう 唄を忘れた 金糸雀(かなりや)は 象牙の船に 銀の櫂 月夜の海に 浮べれば 忘れた唄を おもいだす $
Download : sample-006.c
/* * 2020/05/08 sample-006.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-006.exe 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 柳の鞭で ぶちましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 象牙の船に 銀の櫂 月夜の海に 浮べれば 忘れた唄を おもいだす $
Download : sample-007.c
/* * 2020/05/08 sample-007.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-007.exe 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 柳の鞭で ぶちましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 象牙の船に 銀の櫂 月夜の海に 浮べれば 忘れた唄を おもいだす $
Download : sample-008.c
/* * 2020/05/08 sample-008.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-008.exe 唄を忘れた 金糸雀(かなりや)は 後の山に 棄てましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 背戸の小薮に 埋けましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 柳の鞭で ぶちましょか いえ いえ それはなりませぬ 唄を忘れた 金糸雀(かなりや)は 象牙の船に 銀の櫂 月夜の海に 浮べれば 忘れた唄を おもいだす $
Download : sample-009-01.c
/* * 2020/05/08 sample-009-01.c */ /* * 関数 hello_YOU を分離 */ #include <stdio.h> void hello_YOU( char *YOU ) { /* 変数(YOU)の宣言 (仮引数宣言) */ printf ( "こんにちは、" ); printf ( YOU ); /* 異る部分は、変数(YOU)として抽象化 */ printf ( "さん\n" ); printf ( YOU ); /* 異る部分は、変数(YOU)として抽象化 */ printf ( "さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); }
Download : sample-009.c
/* * 2020/05/08 sample-009.c */ /* * 関数 hello_YOU を利用 */ extern void hello_YOUp( char *YOU ); /* extern 宣言 */ int main ( void ) { hello_YOU ( "田中" ); /* 変数(YOU)の値を指定 (実引数の指定) */ hello_YOU ( "鈴木" ); /* 変数(YOU)の値を指定 (実引数の指定) */ return 0; }
$ ./sample-009.exe こんにちは、田中さん 田中さんは、元気していましたか ? また、一緒に働きましょうか ? こんにちは、鈴木さん 鈴木さんは、元気していましたか ? また、一緒に働きましょうか ? $
/* * 20200508-01-QQQQ.c * 引数で指定された名前に、三度、「こんにちは」をする関数の作成 */ #include <stdio.h> /* * hello ( char *name ) * 引数で指定された名前(name)に、一度、「こんにちは」をする関数 */ void hello ( char *name ) { printf ( "こんにちは" ); printf ( name ); printf ( "さん\n" ); } /* * hello_three_times ( char *name ) * 引数で指定された名前(name)に、三度、「こんにちは」をする関数 */ void hello_three_times ( char *name ) { /* 挨拶を三度行う */ hello ( name ); /* 一度、挨拶をする */ hello ( name ); /* 一度、挨拶をする */ hello ( name ); /* 一度、挨拶をする */ } /* * main */ int main ( void ) { /* 田中さんに三度挨拶 */ hello_three_times ( "田中" ); /* 三回挨拶 */ /* 鈴木さんに三度挨拶 */ hello_three_times ( "鈴木" ); /* 三回挨拶 */ return 0; }
#include <stdio.h> int main(void) { printf ( "Hello, World\n" ); /* 画面に「Hello, World」[改行]を表示 */ /* 命令 */ return 0; }
#include <stdio.h> int main(void) { printf ( "Hello, World\n" ); /* 命令 */ printf ( "Hello, World\n" ); /* 命令 */ printf ( "Hello, World\n" ); /* 命令 */ return 0; }
#include <stdio.h> int main(void) { printf ( "1. Hello, World\n" ); /* 命令 */ printf ( "2. Hello, World\n" ); /* 命令 */ printf ( "3. Hello, World\n" ); /* 命令 */ return 0; }
#include <stdio.h> /* 100 回数 Hello, World を出力 */ void hello_50_times(void) { /* 50 行に hello_50_times という名前をつけた */ /* C 言語での「名前」は、「英字から始まり、英字、数字、_からなる文字並び」 */ /* 関数定義 ( hello_50_times を定義し、その内容が 50 行) */ 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" ); /* 命令 */ 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" ); /* 命令 */ 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" ); /* 命令 */ printf ( "Hello, World\n" ); /* 命令 */ printf ( "Hello, World\n" ); /* 命令 */ } int main(void) { hello_50_times(); /* 関数 hello_50_times を呼び出す */ hello_50_times(); /* 関数 hello_50_times を呼び出す */ hello_50_times(); /* 関数 hello_50_times を呼び出す */ return 0; }
/* * 2020/05/08 sample-001.c */ /* * 似た表現の繰返しのあるプログラムを複数に分割する * 二つの関数を作る */ #include <stdio.h> /* 全体の 6 行を 3 行 + 3 行に分ける hello_tanaka hello_suzuki */ void hello_tanaka(void) { printf ( "こんにちは、田中さん\n" ); printf ( "田中さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); } void hello_suzuki(void) { printf ( "こんにちは、鈴木さん\n" ); printf ( "鈴木さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); } int main ( void ) { hello_tanaka(); hello_suzuki(); return 0; }
/* * 2020/05/08 sample-001.c */ /* * 似た表現の繰返しのあるプログラムを複数に分割する * 二つの関数を作る */ #include <stdio.h> /* この二つの関数をまとめて、一つの引数付き関数にしたい => 異なる部分を「変数」にする <準備> 異なる部分が「際立つ(独立)」になるように書き換える => プログラムの内容(実行結果)は変えずに表現だけを変える リファクタリング プログラムの表現を、扱いやすいように整理する事が目的 => 引数付き関数を作りやすいようにする */ void hello_tanaka(void) { /* printf ( "こんにちは、鈴木さん\n" ); */ printf ( "こんにちは、" ); printf ( "田中" ); printf ( "さん\n" ); /* printf ( "田中さんは、元気していましたか ?\n" ); */ printf ( "田中" ); printf ( "さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); } void hello_suzuki(void) { printf ( "こんにちは、" ); printf ( "鈴木" ); printf ( "さん\n" ); printf ( "鈴木" ); printf ( "さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); } int main ( void ) { hello_tanaka(); hello_suzuki(); return 0; }
/* * 2020/05/08 sample-001.c */ /* * 似た表現の繰返しのあるプログラムを複数に分割する * 二つの関数を作る */ #include <stdio.h> /* この二つの関数をまとめて、一つの引数付き関数にしたい => 異なる部分を「変数」にする 異なる部分を変数して、 一つの統合した、関数にしてしまう hello_YOU 異なる部分を変数に置き換える 変数名として YOU 関数名の後ろの「(void)」に、(void を削って) 変数名を入れる 変数名の前に「char *」をいれる */ void hello_YOU(char *YOU) { printf ( "こんにちは、" ); printf ( YOU ); /* "田中"/"鈴木" => YOU */ printf ( "さん\n" ); printf ( YOU ); printf ( "さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); } int main ( void ) { /* hello_tanaka(); */ hello_YOU( "田中" ); /* 引数付き関数を呼び出す場合は */ /* 実引数(引数付き関数内の変数の値を指定する)が必要 */ /* hello_suzuki(); */ hello_YOU( "鈴木" ); hello_YOU( "栗野" ); /* 実引数を色々変えれば色々な事が可能 */ /* 引数付き関数にすることにより、汎用な関数が作れる */ /* 挙動 */ /* 1. hello_YOU ( "栗野" ); */ /* 関数名 hello_YOU が探される */ /* 2. "栗野" => YOU 実引数と仮引数の対応付けがおきる => printf ( "こんにちは、" ); printf ( YOU ); printf ( "さん\n" ); printf ( YOU ); printf ( "さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); */ /* 3. "栗野" => YOU 実引数と仮引数の対応付けがおきる => printf ( "こんにちは、" ); printf ( "栗野" ); printf ( "さん\n" ); printf ( "栗野" ); printf ( "さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); */ /* 4. => printf ( "こんにちは、" ); printf ( "栗野" ); printf ( "さん\n" ); printf ( "栗野" ); printf ( "さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); => こんにちは、栗野さん 栗野さんは、元気していましたか ? また、一緒に働きましょうか ? */ return 0; } /* 関数定義 f(x)=x*x 関数 f(x) の定義 関数呼び出し f(3) 1. f が探される 2. 関数 f(x)の定義から 3 -> x x*x 3. 3*3 => 9 */
/* * 2020/05/08 sample-001.c */ /* * 似た表現の繰返しのあるプログラムを複数に分割する * 二つの関数を作る */ #include <stdio.h> void hello_YOU(char *YOU) { printf ( "こんにちは、" ); printf ( YOU ); /* "田中"/"鈴木" => YOU */ printf ( "さん\n" ); printf ( YOU ); printf ( "さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); } int main ( void ) { hello_YOU( "田中" ); hello_YOU( "鈴木" ); hello_YOU( "栗野" ); return 0; }
/* * 2020/05/08 p-009-01.c */ /* * main はなく、関数 hello_YOU だけが定義さている */ #include <stdio.h> void hello_YOU(char *YOU) { printf ( "こんにちは、" ); printf ( YOU ); /* "田中"/"鈴木" => YOU */ printf ( "さん\n" ); printf ( YOU ); printf ( "さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); }
/* * 2020/05/08 sample-001.c */ /* * 似た表現の繰返しのあるプログラムを複数に分割する * 二つの関数を作る */ #include <stdio.h> /* * main 関数だけある */ extern void hello_YOU(char *YOU); /* 関数 hello_YOU の extern (外部参照) 宣言 */ /* 関数 hello_YOU は、別の C ファイルで定義されている */ /* その形は、上記の「プロトタイプ宣言」の形をしている */ int main ( void ) { hello_YOU( "田中" ); hello_YOU( "鈴木" ); hello_YOU( "栗野" ); return 0; }
/* * 2020/05/08 p-010.c */ #include <stdio.h> /* * main 関数だけある */ extern void hello_YOU(char *YOU); /* p-009-01.c で定義され、コンパイルされた p-009-01.o に入っている 関数 hello_YOUは、 p-009.exe でも利用できる し、同じく p-010.exe でも利用できる => p-009-01.o の中の関数 hello_YOU が、 二つのプログラム p-009.exe と p-010.exe で共有できる => 分割コンパイルしたおかげ p-008.c -> p-009.c と「分割」したので hello_YOU を単独で、再利用できた !!! 関数を再利用するには、 !!! main 関数を切り離す必要がある !!! => 別の main との組み合わせが可能 */ int main ( void ) { hello_YOU( "日大" ); hello_YOU( "理工" ); hello_YOU( "数学" ); return 0; }
/* * 2020/05/08 sample-001.c */ /* * 似た表現の繰返しのあるプログラムを複数に分割する * 変更前 */ #include <stdio.h> int main ( void ) { printf ( "こんにちは、田中さん\n" ); printf ( "田中さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); printf ( "こんにちは、鈴木さん\n" ); printf ( "鈴木さんは、元気していましたか ?\n" ); printf ( "また、一緒に働きましょうか ?\n" ); return 0; }
前回(2020/05/01)の内容 プログラムとは 計算機への指示(作業手順)を記述したもの 「命令」を並べたもの これらの命令が、順に実行される !! コンピュータの操作 !! コンピュータに一々指示を出す !! コンピュータは、指示が出されるために何かをする !! <= コンピュータにまとまった何かをさせる !! => 人間がついている必要がある !! コンピュータを使っている間 !! 他のことができない !! 指示をまとめて出して、それを一気に実行できる !! コンピュータが仕事をしている(プログラムを実行している)間 !! 他の作業ができる プログラムの表現方法 人間が書く => 人間が書きやすいことが望ましい コンピュータが実行(読む) => コンピュータの都合に合わせること望ましい この二つの立場の矛盾を解決するために プログラミング言語 人間向きのプログラムの表現方法 コンパイル(翻訳)をすることにより コンピュータ向きのプログラムに変換可能なもの コンパイルとは 人間に判り易い形式(C 言語)から計算機が実行できる形(機械語)に変換する C 言語 この講義で学ぶ、プログラミング言語の名前 ちょっと古い言語 今の新しい言語の元となる言語(共通/基礎) 色々な表現を学ぶ 一年を通して、C 言語を一通り学ぶ printf : メッセージを出力する関数 順接 : 「命令」を並べると、その並べた「順」に命令が実行される 「命令の実行順序」を決めている 関数 : 「幾つかの命令列」に「名前を付けたもの」 関数の定義 : 命令列に名前を付ける 命令列 => 複雑なものに「名前」という単純なものを対応させる 関数の呼び出し : 名前を使って、命令列を呼び出す 「名前」を利用するだけで(複雑かもしれない)命令列がよびだせる 演習 コンパイルの仕方を覚える プログラムを書いてみよう Hello, World 単純で完全なプログラム プログラム作成の出発点 プログラムを少し変えては、実行して確認をする # 差分的プログラミング 命令(関数呼び出し)を並べてみよう(順接) 関数を作ってみよう(命令に名前を付ける) == 引数付き関数 関数本体の一部を「変数(へんすう)」にしたもの 「変数」具体的な値を割り当てられるもの => 値が割り当てられていない場合は、無意味 変数(割り当てによって、値が変化する「変わる数」)を含む命令 値が定まっていないとそのままでは実行できない 例 : 英語 S V S 主語 => I V 動詞 => stand S V => I stand. S 主語 => You V 動詞 => stand S V => You stand. 「変数」の内容を、後(実行時)に決める事により、振舞を変更できる (引数を持たない関数に比較して) より「抽象的な」関数 引数(ひきすう):引数付き関数に現れる「変数」 <数学> 関数定義 : f(x)=x*x ^ 仮引数 関数適用 : f(3)=3*3=9 ^ 実引数 <C 言語> 仮引数(かりひきすう) : 関数の本体に現れる「変数」の宣言 (関数定義) 実引数(じつひきすう) : 「変数」の内容 (関数呼出し) 引数付き関数の効用 (本質的には「再利用[コピペ]」が目的) f3 = 3*3 f2 = 2*2 y = f3 + f2 f(x) = x*x y = f(3)+f(2) // 関数 f(x) の定義が再利用されている 一つの関数定義で(実引数の値を変更する事により..) (本体に含まれる変数(仮引数)値が異なるので異なる)複数の関数として利用できる make 最初に make をインストールする sudo apt install make パスワードは「soft」といれる
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20200508-01.c
/* * 20200508-01-QQQQ.c * 引数で指定された名前に、三度、「こんにちは」をする関数の作成 */ #include <stdio.h> /* * hello ( char *name ) * 引数で指定された名前(name)に、一度、「こんにちは」をする関数 */ void hello ( char *name ) { printf ( "こんにちは" ); /* ** この部分を完成させなさい */ } /* * hello_three_times ( char *name ) * 引数で指定された名前(name)に、三度、「こんにちは」をする関数 */ void hello_three_times ( char *name ) { /* 挨拶を三度行う */ hello ( name ); /* ** この部分を完成させなさい */ } /* * main */ int main ( void ) { /* 田中さんに三度挨拶 */ hello_three_times ( "田中" ); /* 鈴木さんに三度挨拶 */ /* ** この部分を完成させなさい */ return 0; }
$ ./20200508-01-QQQQ.exe こんにちは田中さん こんにちは田中さん こんにちは田中さん こんにちは鈴木さん こんにちは鈴木さん こんにちは鈴木さん $
Download : 20200508-02.c
/* * 20200508-02-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; }
$ ./20200508-02-QQQQ.exe 一番星みつけた。 あれあの森の 杉の木のうえに。 二番星みつけた。 あれあのどての 柳の木のうえに。 三番星みつけた。 あれあの山の 松の木のうえに。 $