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 一番星みつけた。 あれあの森の 杉の木のうえに。 二番星みつけた。 あれあのどての 柳の木のうえに。 三番星みつけた。 あれあの山の 松の木のうえに。 $