Download : sample-001.c
/* * 2021/04/23 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
/* * 2021/04/23 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
/* * 2021/04/23 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
/* * 2021/04/23 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
/* * 2021/04/23 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
/* * 2021/04/23 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
/* * 2021/04/23 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
/* * 2021/04/23 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
/* * CDATE 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
/* * 2021/04/23 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 こんにちは、田中さん 田中さんは、元気していましたか ? また、一緒に働きましょうか ? こんにちは、鈴木さん 鈴木さんは、元気していましたか ? また、一緒に働きましょうか ? $
/* * 20210416-02-QQQQ.c * 「Hello, 自分の名前」と出力する関数 print_hello_me を作成する */ #include <stdio.h> /* * print_hello_me */ void print_hello_me ( void ) { printf ( "Hello, 栗野俊一\n" ); /* 「Hello, 自分の名前」を表示する */ } /* * main */ int main ( void ) { /* 関数 print_hello_me を一回呼び出す */ print_hello_me(); return 0; }
/* * 20210416-03-QQQQ.c * 「Hello, 自分の名前」を 100 回以上出力するプログラム */ #include <stdio.h> /* * sub */ void print1(void) { printf ( "Hello, 栗野俊一\n" ); } void print2(void) { print1(); print1(); /* 1 x 2 = 2 */ } void print4(void) { print2(); print2(); /* 2 x 2 = 4 */ } void print8(void) { print4(); print4(); /* 4 x 2 = 8 */ } void print16(void) { print8(); print8(); /* 8 x 2 = 16 */ } void print32(void) { print16(); print16(); /* 16 x 2 = 32 */ } void print64(void) { print32(); print32(); /* 32 x 1 = 64 */ } void print128(void) { print64(); print64(); /* 64 x 2 = 128 */ } /* * main */ int main ( void ) { print128(); /* 128 回プリント */ return 0; }
/* * 20210423-01-QQQQ.c * 引数で指定された名前に、三度、「こんにちは」をする関数の作成 */ #include <stdio.h> /* * hello ( char *name ) * 引数で指定された名前(name)に、一度、「こんにちは」をする関数 */ /* いきなり、引数付き関数を作るのではなく、 引数無しの関数を考える => 具体的な名前を想定する必要がある 例: 「栗野」 void hello ( void ) { printf ( "こんにちは" ); <= 挨拶 printf ( "栗野" ); <= 人の名前 printf ( "\n" ); <= 改行 } 名前の部分を抽象化 (変数化)したい void hello ( char *name ) { printf ( "こんにちは" ); <= 挨拶 printf ( name ); <= 人の名前 printf ( "\n" ); <= 改行 } 引数付き関数になる */ 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" ); return 0; }
/* コメント : 何が書いてあっても(プログラムとしては..) 無意味 => コンピュータには、無視される <= 人間にとっては、プログラムを理解するヒント */ #include <stdio.h> int main(void) { printf ( "こんちわ、新しい世界へようこそ\n" ); /* 「Hello, World」プログラムでは printf の行だけを、まず理解する 他の行は、無視して考えてよい */ /* この行の、「"」の間の文字列を変更すれば、 プログラム振る舞い(何を画面に表示するか)が変化する */ return 0; }
#include <stdio.h> int main(void) { printf ( "こんちわ、新しい世界へようこそ\n" ); printf ( "Hello, World\n" ); return 0; }
/* 関数を作る 命令列に名前を付ける => 関数の定義 関数の定義方法 1. 名前を決める ( 英文字から始まり、英数文字列 ) 例 : HelloWorld ( <= 関数名 ) 2. 名前をつける命令列をきめる 例 : printf ( "Hello, World\n" ); 3. 次の作業(関数定義) 3.1 関数名を「int main 上の行に」書く 3.2 頭に 「void」、お尻に「 (void) {」とか各 3.3 次の行に 「}」を書く 3.4 「{」と、「}」の間に、2 の命令を書く 関数の利用法 ( 呼び出し方 ) 4.その名前を付けた命令列を実行したいところで、 次の記述を行う 4.1 関数名を書く 例 : HelloWorld ( <= 関数名 ) 4.2 後ろに「 ();」を追加する */ #include <stdio.h> /* HelloWorld 関数の定義 */ void HelloWorld (void) { printf ( "Hello, World\n" ); } int main(void) { printf ( "こんちわ、新しい世界へようこそ\n" ); HelloWorld(); /* 関数 HelloWorld の呼び出し */ return 0; }
/* 関数を作る 命令列に名前を付ける => 関数の定義 関数の定義方法 1. 名前を決める ( 英文字から始まり、英数文字列 ) 例 : HelloWorld ( <= 関数名 ) 2. 名前をつける命令列をきめる 例 : printf ( "Hello, World\n" ); 3. 次の作業(関数定義) 3.1 関数名を「int main 上の行に」書く 3.2 頭に 「void」、お尻に「 (void) {」とか各 3.3 次の行に 「}」を書く 3.4 「{」と、「}」の間に、2 の命令を書く 関数の利用法 ( 呼び出し方 ) 4.その名前を付けた命令列を実行したいところで、 次の記述を行う 4.1 関数名を書く 例 : HelloWorld ( <= 関数名 ) 4.2 後ろに「 ();」を追加する */ #include <stdio.h> /* HelloWorld 関数の定義 */ void HelloWorld (void) { printf ( "Hello, World\n" ); } void Konnitiwa(void) { printf ( "こんちわ、新しい世界へようこそ\n" ); } int main(void) { Konnitiwa(); HelloWorld(); /* 関数 HelloWorld の呼び出し */ Konnitiwa(); /* <= もう一度呼び出す */ /* 一度定義した関数は何度でも呼び出せる */ return 0; }
/* p-006.c と同じ、関数を利用しない版 */ #include <stdio.h> int main(void) { printf ( "Hello, World\n" ); printf ( "こんちわ、新しい世界へようこそ\n" ); printf ( "Hello, World\n" ); /* この行は、 9 行目を「コピペ」すれば済む */ return 0; }
/* 関数を作る 命令列に名前を付ける => 関数の定義 関数の定義方法 1. 名前を決める ( 英文字から始まり、英数文字列 ) 例 : HelloWorld ( <= 関数名 ) 2. 名前をつける命令列をきめる 例 : printf ( "Hello, World\n" ); 3. 次の作業(関数定義) 3.1 関数名を「int main 上の行に」書く 3.2 頭に 「void」、お尻に「 (void) {」とか各 3.3 次の行に 「}」を書く 3.4 「{」と、「}」の間に、2 の命令を書く 関数の利用法 ( 呼び出し方 ) 4.その名前を付けた命令列を実行したいところで、 次の記述を行う 4.1 関数名を書く 例 : HelloWorld ( <= 関数名 ) 4.2 後ろに「 ();」を追加する */ #include <stdio.h> /* HelloWorld 関数の定義 */ void HelloWorld (void) { putchar ( 'H' ); /* <= 名前を付ける命令列の「意味」が */ putchar ( 'e' ); /* わかる、適切な名前がついていれば.. */ putchar ( 'l' ); /* 名前を付ける事により「わかりやすくなる」 */ putchar ( 'l' ); putchar ( 'o' ); putchar ( '\n' ); } void Konnitiwa(void) { printf ( "こんちわ、新しい世界へようこそ\n" ); } int main(void) { Konnitiwa(); HelloWorld(); Konnitiwa(); /* <= もう一度呼び出す */ /* 一度定義した関数は何度でも呼び出せる */ HelloWorld(); return 0; }
#include <stdio.h> void print_hello_me (void) { printf ( "Hello, 栗野俊一\n" ); } int main(void) { print_hello_me(); return 0; }
#include <stdio.h> void print_hello_me (void) { printf ( "Hello, 栗野俊一\n" ); } int main(void) { print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); return 0; }
#include <stdio.h> void print_hello_me (void) { printf ( "Hello, 栗野俊一\n" ); } void print5(void) { print_hello_me(); /* 5 回数分 */ print_hello_me(); print_hello_me(); print_hello_me(); print_hello_me(); } void print25(void) { print5(); /* 5 行分の命令に名前をつけた */ print5(); /* 二度呼び出せば 5 x 2 = 10 行分 */ print5(); print5(); print5(); /* 五回呼び出せば 5x5 = 25 */ } int main(void) { print_hello_me(); /* 1 行分 */ /* => 100 行分書くか.. ?? */ print25(); print25(); print25(); print25(); /* 25 x 4 = 100 */ return 0; }
/* 関数を作る 命令列に名前を付ける 命令列の内容が違うならば、違う関数にする必要 命令の一部だけが異なる、似た関数が現れる事はよくある 例: HelloWorld, Konnitiwa 二行目の()の中身が違う => 異なる一部を「変数化」できる */ #include <stdio.h> /* 引数付き(ひきすうつき)関数 異なる複数の関数の抽象化に相当する => 汎用な(色々な場合に利用な)関数が作れるようになる 1. 名前をつけたい命令の中に、変数が含まれている 2. 関数名の後ろに (「(void)」の代わりに) に (char *変数名)を書く 3. 引数付き関数の呼び出し方 関数名 ( 変数に入れたい物 ); */ void HelloAny (char *X) { /* void の代わりに変数名 X と「char *」を書く */ printf ( "Hello," ); printf ( X ); /* 二つの関数の異なる部分を、変数「X」で置き換えた */ /* 「X」は変数名なので、なんでもよい */ } /* HelloWorld 関数の定義 */ void HelloWorld (void) { printf ( "Hello," ); printf ( "World\n" ); } void Konnitiwa(void) { printf ( "Hello," ); printf ( "世界\n" ); } int main(void) { /* Konnitiwa(); */ /* HelloAny の中の X に "世界\n" が入っている */ HelloAny ( "世界\n" ); /* HelloWorld();*/ /* 関数 HelloWorld の呼び出し */ HelloAny ( "World\n" ); /* Konnitiwa(); */ HelloAny ( "世界\n" ); HelloAny ( "みなさん\n" ); return 0; }
前回(2021/04/16)の復習 初回回(2021/04/09)の内容 ガイダンス 去年(コンピュータ概論)と同じ 演習環境を作る Ubuntu 上で、gcc をインストール Windows と Ubuntu のファイル共有 ( c:\usr\c の作成 ) # 実際にコンパイルできる ( gcc が動く ) 事を確認した 前回(2021/04/16)の内容 プログラミング <= ソフトウェア概論の目標 A/B 一年の講義が終了したら、「プログラミングができるようになる」 プログラム : コンピュータへの指示を並べたもの プログラミング : プログラムを作る 「作る(動詞)」=> How to / やりたいことを、どう「表現」してゆくか ? How to => Rule ( 文法、単語の意味.. ) 語学を学ぶ 「表現」 => 思考法 プログラミング固有の発想法 プログラミング言語 ( C 言語 ) プログラムを記述するための人工言語 ( <=> 自然言語:日本語,英語..) 効率はよいが、融通が利かない => 色々な種類がある C 言語 (<= ソフトウェア概論で学ぶ) python (<= AI でよく使われるので、最近有名) Fortan (<= 最初のプログラミング言語) etc.. 実は、コンピュータ自身が理解できる言語は 機械語とよばれている言語だけ => CPU 毎に異なる <= いちいち対応できない 高級言語 人間にわかりやすい言語でプログラムを書く => 機械語に翻訳、あるいは通訳して、そのプログラムをコンピュータにやらせる C 言語の場合 C 言語という高級言語で記述した、プログラム(ソース)を 機械語で記述されたプログラム(オブジェクト)に 通訳(コンパイル)して、利用する 「Hello, World」プログラム => 完全で、わかりやすいプログラム例 # => 自分で新しいプログラムを作るときには、出発点になる 実習内容 Ubuntu でのコンパイル 課題の提出 先週 : 時間を早めた 「順接/関数の作り方」をやらなかった ( 課題 2, 3 をやっていない ) => 前回の続き 関数 => 引数付き関数 分割コンパイル / make [順接] 「Hello, World」 C のプログラムは、あるが、 => コンパイルして、実行できる <= 書いてある事の意味は説明されていない プログラムは、命令をならべたもの 命令 : コンピュータに何かをやらせる記述 例 : 「printf ( "文字列" );」が、 コンピュータに対して、「文字列」を表示させる「命令」である => 命令を並べたら.. ? C 言語の命令は、 命令を並べると、その命令は、並べた順に実行される => この仕組みを「順接」と呼ぶ # 順接を学べば、本質的に「有限な結果」であれば、 # その結果を出すようように、プログラムを書く事ができる [関数] 命令列に対して、名前を付ける事ができる => 名前を付けた命令列は、その付けた名前だけで、(再)利用できる 名前を付けた命令列の事を「(C 言語)関数」 !! 数学で学ぶ「関数」(今の時点では..)異なる [引数付き関数]
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20210423-01.c
/* * 20210423-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; }
$ ./20210423-01-QQQQ.exe こんにちは田中さん こんにちは田中さん こんにちは田中さん こんにちは鈴木さん こんにちは鈴木さん こんにちは鈴木さん $
Download : 20210423-02.c
/* * 20210423-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; }
$ ./20210423-02-QQQQ.exe 一番星みつけた。 あれあの森の 杉の木のうえに。 二番星みつけた。 あれあのどての 柳の木のうえに。 三番星みつけた。 あれあの山の 松の木のうえに。 $