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