Download : sample-001.c
/* * 2021/04/30 sample-001.c */ /* * 最初のプログラムは "Hello, World" */ #include <stdio.h> /* * main 関数 */ int main ( void ) { printf ( "Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ return 0; }
$ ./sample-001.exe Hello, World $
Download : sample-006.c
/* * 2021/04/30 sample-006.c */ #include <stdio.h> #include <string.h> /* strcmp を利用する場合は必要 */ /* * 「金糸雀(かなりや)」 * (c) 西條八十作詞・成田為三作曲 * http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/kanariya.html */ /* * 4 の場合もまとめられないだろうか ? */ /* * void uta(void) * 「唄を忘れた 金糸雀(かなりや)は」を出力する */ void uta(void) { printf ( "唄を忘れた 金糸雀(かなりや)は\n" ); } /* * void ieie(void) * 「いえ いえ それはなりませぬ」を出力する */ void ieie(void) { printf ( "いえ いえ それはなりませぬ\n" ); } /* * void kyoku_1234 ( char *center ) * char *center ; 曲 1 〜 4 で最初に異る部分 * 曲 1 〜 3 は異る部分を、定型で、出力する事により * 曲 4 は、if と strcmp を利用して、区別し、特別扱いする事により * それぞれ、歌詞全体を出力する */ void kyoku_1234 ( char *center ) { /* 1 〜 4 共通部分 */ uta(); printf ( center ); /* 1 〜 3 と 4 では異る部分 */ /* strcmp で、比較し、その結果を if で区別する */ if ( !strcmp ( center, "象牙の船に 銀の櫂\n" ) ) { /* 4 の場合だった */ printf ( "月夜の海に 浮べれば\n" ); printf ( "忘れた唄を おもいだす\n" ); } else { /* それ以外.. */ /* 1 〜 3 の場合だった */ ieie(); } } /* * void kyoku_1(void) * kyoku_1234 を利用して、歌詞 1 を出力 */ void kyoku_1(void) { kyoku_1234 ( "後の山に 棄てましょか\n" ); } /* * void kyoku_2(void) * kyoku_1234 を利用して、歌詞 2 を出力 */ void kyoku_2(void) { kyoku_1234 ( "背戸の小薮に 埋けましょか\n" ); } /* * void kyoku_3(void) * kyoku_1234 を利用して、歌詞 3 を出力 */ void kyoku_3(void) { kyoku_1234 ( "柳の鞭で ぶちましょか\n" ); } /* * void kyoku_4(void) * kyoku_1234 を利用して、歌詞 4 を出力 */ void kyoku_4(void) { kyoku_1234 ( "象牙の船に 銀の櫂\n" ); } /* * int main ( void ) * 四つの歌詞を、間に空行を入れて出力する */ 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/30 sample-007.c */ #include <stdio.h> #include <string.h> /* * 木霊 */ /* * 引数を利用して振舞を変える関数の例 */ /* * void echo ( char *message ) * char *message 与えらえたメッセージ、これをそのまま言い返す(木霊) * message が空の場合は、「言い返せない」と文句を言う */ void echo ( char *message ) { /* message の内容によって振舞を変える */ /* 「""」は「空文字列」を表す */ if ( !strcmp ( message, "" ) ) { /* もし、メッセージが空っぽならば.. */ printf ( "何か言わないと、言い返せないじゃないか.." ); } else { /* そうじゃなければ、そのまま答える */ printf ( message ); } } /* * void chat ( char *message ) * char *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-007.exe 呼掛け : ヤッホー 木霊 : ヤッホー 呼掛け : オーイ 木霊 : オーイ 呼掛け : 木霊 : 何か言わないと、言い返せないじゃないか.. 呼掛け : 生意気なやつだ 木霊 : 生意気なやつだ $
Download : sample-008.c
/* * 2021/04/30 sample-008.c */ #include <stdio.h> #include <string.h> /* * 文字列に 1 を加えると.. ? * 文字の長さが短くなる (頭の部分がなくなる..) */ /* * 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-008.exe abcde bcde cde cde $
Download : sample-009.c
/* * 2021/04/30 sample-009.c */ #include <stdio.h> #include <string.h> /* * void recursive ( char *string ) * char *string 指定した文字列からなる三角形を作る * 実行例 * recursive( "abc\n" ); * -> * abc "abc\n" * bc "bc\n" * c "c\n" * "\n" * 再帰呼出しを利用 */ void recursive ( char *string ) { if ( !strcmp ( string, "" ) ) { /* もし空文字列 ( "" ) ならば */ printf ( "" ); /* これで御仕舞い */ } else { /* そうでなければ、 */ printf ( string ); recursive ( string + 1 ); /* 再帰呼び出しする */ /* +1 を忘れると悲惨な事に.. */ } } /* * main */ int main ( void ) { recursive ( "abcdefg\n" ); recursive ( "xyz\n" ); return 0; }
$ ./sample-009.exe abcdefg bcdefg cdefg defg efg fg g xyz yz z $
Download : sample-010.c
/* * 2021/04/30 sample-010.c */ #include <stdio.h> #include <string.h> /* * 再帰呼出しを利用して、"Hello, World\n" を沢山出力する */ /* * void rec_hello ( char *count ) * char *count 文字列を指定し、その長さで、繰り返えし回数の指数を指定 * 与えられた文字列の長さを n とすると 2^n 回だけ出力する */ void rec_hello ( char *count ) { if ( !strcmp ( count, "" ) ) { /* カラッポなら.. */ printf ( "Hello, World\n" ); /* 一つだけ表示してみる */ } else { /* そうでなければ.. */ rec_hello ( count + 1 ); /* 二倍にして再帰呼び出し */ rec_hello ( count + 1 ); } } /* * main */ int main ( void ) { rec_hello ( "****" ); /* 2^4 = 16 回出力 */ /* 2^10 = 1024 だから、 "**********" を与えれば... */ return 0; }
$ ./sample-010.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-011.c
/* * 2021/04/30 sample-011.c */ #include <stdio.h> #include <string.h> /* * フィボナッチ数の計算 */ /* * void fib ( char *n ) * char *n n の長さで何番目の項かを表す * n 番目のフィボナッチ数だけ '*' を表示する */ 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 ) だけだす */ } } /* * main */ int main ( void ) { printf ( "fib 3 : " ); fib ( "***" ); printf ( "\n" ); printf ( "fib 5 : " ); fib ( "*****" ); printf ( "\n" ); return 0; }
$ ./sample-011.exe fib 3 : *** fib 5 : ******** $
/* * 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 ( "あれあの" ); printf ( basyo ); printf ( "の\n" ); printf ( ki ); printf ( "の木のうえに。\n" ); } void itibanboshi() { uta ( "一", "森", "杉" ); printf ( "\n" ); uta ( "二", "どて", "柳" ); printf ( "\n" ); uta ( "三", "山", "松" ); } /* * main */ int main ( void ) { itibanboshi(); return 0; } /* 0. 最終的に欲しい出力 一番星みつけた。 あれあの森の 杉の木のうえに。 二番星みつけた。 あれあのどての 柳の木のうえに。 三番星みつけた。 あれあの山の 松の木のうえに。 */
#include <stdio.h> int main(void) { printf ( "Hello, World\n" ); /* <= 画面にメッセージを出す */ return 0; }
#include <stdio.h> int main(void) { printf ( "2 Hello, World\n" ); printf ( "1 Hello, World\n" ); printf ( "3 Hello, World\n" ); /* 三行かいたら、三回 */ return 0; }
#include <stdio.h> 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" ); return 0; }
#include <stdio.h> /* 関数の作り方 (その1) 1. 関数名に名前を付けるて、それを #include ? main の間に書く => printTa 2. 関数名の前に 「void」、後に 「(void) {」、次の行に 「}」を書く 3. 名前を付けたい命令列を 「{」と「}」の間にいれる => 関数(printTa)が定義され、その内容が、{ ? } の中身 関数の呼び出しの方法 4. 関数名を書いて、後ろに「();」をつけるだけ */ void printTa ( void ) { printf ( "**************\n" ); printf ( "* * *\n" ); printf ( "* * *\n" ); printf ( "* * *\n" ); printf ( "* * *\n" ); printf ( "**************\n" ); printf ( "* * *\n" ); printf ( "* * *\n" ); printf ( "* * *\n" ); printf ( "* * *\n" ); printf ( "**************\n" ); } int main(void) { /* 漢字の「田」という漢字を、* の並びで書く */ printf ( "一度目の表示:\n" ); printTa(); /* 関数呼び出し */ printf ( "二度目の表示:\n" ); printTa(); /* 関数呼び出し */ return 0; }
#include <stdio.h> void printTa(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" ); printf ( "* * *\n" ); printf ( "* * *\n" ); printf ( "* * *\n" ); printf ( "* * *\n" ); printf ( "* * *\n" ); printf ( "* * *\n" ); printf ( "****************************\n" ); } int main(void) { printTa(); /* 何か、「Ta」を「print」する */ return 0; }
#include <stdio.h> 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" ); printf ( "* * *\n" ); printf ( "**************\n" ); printf ( "* * *\n" ); printf ( "* * *\n" ); printf ( "* * *\n" ); printf ( "**************\n" ); return 0; }
#include <stdio.h> void helloTanaka ( void ) { printf ( "こんにちは" ); printf ( "田中" ); printf ( "さん\n" ); } void helloSuzuki ( void ) { printf ( "こんにちは" ); printf ( "鈴木" ); printf ( "さん\n" ); } int main ( void ) { helloTanaka(); helloSuzuki(); return 0; }
#include <stdio.h> /* 引数付きの関数 0. 動機 helloTanaka と helloSuzuki は、ほぼ同じ => 違う部分がある 名前が付けられている、命令列の中の 「田中」と「鈴木」の部分が違う => この違う部分を「変数」化する事により、 0-1. あとで、決められる 0-2. 一つの関数で、実現できる 1. 引数付き関数の定義の仕方 1.1 名前を決める => 名前なしと同じ操作 helloName 1.2 違う部分を変数名を決めて、それに置き換える name => 引数無し関数の定義は不要 1.3 この変数を、関数名の後ろの「()」の void に置き換える 変数名のまえに「char *」を付ける => 引数付き関数の定義がされる !! ここで関数名の後ろに記述されている変数の事を、 !! 「仮引数変数」と呼び !! 「変数」なので、後で、値が変化する !! 「仮引数」なので、 !! 「引数(ひきすう)」(関数名の後ろの「()」の中にかかれる) !! 「仮」(値がきまっていないから..) 2. 引数付き関数の呼び出し方 2.1 (引数無しと同様..) 関数名を使って呼び出せるが、 この時、引数 ( 関数の後ろの「()」の中)に、 変数に入れたい値(実引数)を書く => 関数呼び出しによって、実行される命令の中の、 仮引数変数の部分が、実引数に置き換えられて、実行される */ void helloName ( char *name ) { /* 「name」は「仮引数変数」*/ printf ( "こんにちは" ); printf ( name ); /* 「"name"」、「name」 */ /* 二つの関数で、異なる「"鈴木"」と「"田中"」を を、変数「name」に置きかえると、 名前を付ける命令列が同じものになる */ printf ( "さん\n" ); } int main ( void ) { helloName( "田中" ); /* helloTanaka() と同じふるまい */ /* 0. helloName( char *name ) の定義がみつかる 1. 0 に基づき、次のような置き換えが起きている(かのようにふるまう) 1.1 仮引数変数 name に、実引数 "田中" が割り当たる 1.2 helloName は、定義された命令に置き換わる printf ( "こんにちは" ); printf ( name ); printf ( "さん\n" ); 2. 命令の中の仮引数変数が実引数に置き換わる printf ( "こんにちは" ); printf ( "田中" ); printf ( "さん\n" ); 3. 2. の命令が実行される cf. 数学の関数 f(x)=2x <= 関数の定義 f(5) <= 関数適用 f(5) f(x) = 2*x --------- f(5) = 2*5 = 10 */ helloName( "鈴木" ); /* helloSuzuki() と同じふるまい */ helloName( "栗野" ); return 0; }
#include <stdio.h> 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" ); return 0; }
#include <stdio.h> /* Step 1 : 全体を三つにわける */ void kashi1(void) { printf ( "一番星みつけた。\n" ); printf ( "あれあの森の\n" ); printf ( "杉の木のうえに。\n" ); } void kashi2 (void) { printf ( "二番星みつけた。\n" ); printf ( "あれあのどての\n" ); printf ( "柳の木のうえに。\n" ); } void kashi3(void) { printf ( "三番星みつけた。\n" ); printf ( "あれあの山の\n" ); printf ( "松の木のうえに。\n" ); } int main(void) { kashi1(); printf ( "\n" ); kashi2(); printf ( "\n" ); kashi3(); return 0; }
#include <stdio.h> /* Step 2 : 関数を共通化するための整理 */ void kashi1(void) { printf ( "一" ); /**/ printf ( "番星みつけた。\n" ); printf ( "あれあの" ); printf ( "森" ); /**/ printf ( "の\n" ); printf ( "杉" ); /**/ printf ( "の木のうえに。\n" ); } void kashi2 (void) { printf ( "二" ); /**/ printf ( "番星みつけた。\n" ); printf ( "あれあの" ); printf ( "どて" ); /**/ printf ( "の\n" ); printf ( "柳" ); printf ( "の木のうえに。\n" ); } void kashi3(void) { printf ( "三" ); /**/ printf ( "番星みつけた。\n" ); printf ( "あれあの" ); printf ( "山" ); /**/ printf ( "の\n" ); printf ( "松" ); /**/ printf ( "の木のうえに。\n" ); } int main(void) { kashi1(); printf ( "\n" ); kashi2(); printf ( "\n" ); kashi3(); return 0; }
#include <stdio.h> /* Step 3 : 引数付き */ void kashi(char *x1,char *x2,char *x3) { printf ( x1 ); /**/ printf ( "番星みつけた。\n" ); printf ( "あれあの" ); printf ( x2 ); /**/ printf ( "の\n" ); printf ( x3 ); /**/ printf ( "の木のうえに。\n" ); } void kashi1(void) { printf ( "一" ); /* x1 = "一" */ printf ( "番星みつけた。\n" ); printf ( "あれあの" ); printf ( "森" ); /* x2 = "森" */ printf ( "の\n" ); printf ( "杉" ); /* x3 = "杉" */ printf ( "の木のうえに。\n" ); } /* kashi1() => kashi x1 = "一" x2 = "森" x3 = "杉" => kashi( "一", "森", "杉" ); */ void kashi2 (void) { printf ( "二" ); /**/ printf ( "番星みつけた。\n" ); printf ( "あれあの" ); printf ( "どて" ); /**/ printf ( "の\n" ); printf ( "柳" ); printf ( "の木のうえに。\n" ); } /* kashi2() => kashi x1 = "二" x2 = "どて" x3 = "柳" => kashi( "二", "どて", "柳" ); */ void kashi3(void) { printf ( "三" ); /**/ printf ( "番星みつけた。\n" ); printf ( "あれあの" ); printf ( "山" ); /**/ printf ( "の\n" ); printf ( "松" ); /**/ printf ( "の木のうえに。\n" ); } int main(void) { kashi( "一", "森", "杉" ); printf ( "\n" ); kashi( "二", "どて", "柳" ); printf ( "\n" ); kashi( "三", "山", "松" ); return 0; }
#include <stdio.h> /* Step 3 : 引数付き */ void kashi(char *x1,char *x2,char *x3) { printf ( x1 ); /**/ printf ( "番星みつけた。\n" ); printf ( "あれあの" ); printf ( x2 ); /**/ printf ( "の\n" ); printf ( x3 ); /**/ printf ( "の木のうえに。\n" ); } int main(void) { kashi( "一", "森", "杉" ); printf ( "\n" ); kashi( "二", "どて", "柳" ); printf ( "\n" ); kashi( "三", "山", "松" ); return 0; }
#include <stdio.h> int main(void) { printf ( "abc" ); /* 画面に a, b, c の三文字が出力される */ /* 改行が表示されない.. */ return 0; }
#include <stdio.h> int main(void) { printf ( "a\nb\nc\n" ); /* 「\n」は二文字で、改行一文字分 */ return 0; }
#include <stdio.h> int main(void) { printf ( "a\tb\tc\n" ); /* 「\t」に文字、タブ一文字分 */ printf ( "漢字\t全角\t日本語\n" ); return 0; }
#include <stdio.h> int main(void) { printf ( "abcdefg\r123\n" ); /* 0. $ - <= カーソルのある場所 1.abcdefg $abcdefg - 2. \r $abcdefg - 3. 123 $123defg - 4. \n $123defg $ - */ return 0; }
前回(2021/04/23)の復習 関数の作り方 命令列に名前を付け、名前で、その命令例を呼び出せる 引数付関数の作り方 命令列の一部を変数にする事により、後から振舞いを変える事ができる ソフトウェア概論の目的 C 言語を利用して、プログラムが書けるようになる C 言語とは何か .. C 言語を使って、自分が望んでいる内容を記述するには ? 色々な表現方法を学ぶ # ソフトウェア概論のメイン プログラムをつくったら、動かなさないと面白くない プログラムの動かし方 => ubuntu 上で、C 言語で記述されたプログラムの実行方法 プログラム ( <= 普通の会話とは異なる ) そのものを学ぶ 初日と二回目 => ubuntu 上での操作方法 プログラムファイルの作り方 ( サクラエディタで入力する ) 拡張子 .c ( <= C 言語のソースプログラムファイル ) 日本語は UTF-8 改行は LF (unix) 保存先のフォルダー C:\usr\c\日付 名前は適当に.. コンパイル cc -c ソースコードファイル名 ( xxx.c ) 具体例 : cc -c p-001.c => (うまくいった場合) オブジェクトファイル ( xxx.o ) できる リンク cc -o 実行ファイル名 ( xxx.exe ) オブジェクトファイル ( xxx.o ) 具体例 : cc -o p-001.exe p-001.o => (うまくいった場合) 実行ファイル ( xxx.exe ) できる 実行 ./実行ファイル名 具体例 : ./p-001.exe => 実行結果が得られる 前回 ( 三回目 ) => C 言語の表現方法 1. printf ( "文字列" ) => 「文字列」が、画面に表示される => 「表示する」という目的(有限なら..) なんでもできる 2. 1. のようなものを並べると、 並べた順に、それがすべて実行される [順接] 3. 「関数」( <= しばらくは、数学の関数とは別物 ) 3.1 命令列に名前を付ける事ができる => 関数の定義 3.2 名前を付けた命令(「関数」とよぶ)を、 その名前(「関数名」)で呼び出す事ができる => 関数呼び出し 関数の効用 関数には、名前が付けられる => 意味のある名前をつければ、 命令列の「意味」が把握しやすい 同じ関数を呼び出せば、同じ命令が実行される事が保証される => 長い命令でも、比較が簡単になる 4. 引数付き関数 命令の一部を変数にする事によって、後で、その関数の振る舞いを変更する仕組み やりたい事を、短い表現で実現できる やりたい事の最終イメージ => 命令の並び => 順接で実現 <= 「効率」が悪い 「効率」の例 => 記述量が増える # 「作成速度」が遅くなる # <= ミスが起きやすい => 関数を導入する 記述量が減る ( メリット ) => 開発効率が高まる プログラムは思い通りに動かない、書いた通りに動く [2021/04/30] C 言語における「文字列」 C 言語における「文字列」 二つの「" (ダブルクォーテーション)」で挟んだ「『文字』の列」 例: 「"abc"」は、三つの文字 「a」, 「b」, 「c」から成る、長さ 3 の文字列 文字列 "abc" は、 a, b, c の三つの文字からなる C 言語における「文字」 : 「(ASCII) 文字」 基本は、キーボードから「1 キー」で入力されて、画面に表示される「モノ」 キーボードで「a」を入力すると、画面に「a」と入る (これが『文字』) 定義(C 言語の『文字』) ASCII Code 表 ( 1 byte で表現可能な「文字」表 ) 半角の英数字、記号 !! 漢字に代表される、「全角文字」は... ? !! => この講義では、「文字」とは扱わない !! <= 文字列の中に全角を入れる事はある printf ( "Hello, World\n" ); 「"Hello, World\n"」が文字列 「H」, 「e」, 「l」, 「l」, 「o」, 「,」,「 」, .. という文字からなる printf ( "こんにちは、みなさん\n" ); 「"こんにちは、みなさん\n"」が文字列 この文字列を構成している「文字」は、考えない 講義中で、「文字列」とか「文字」と呼ぶ場合は、 それぞれ、 ASCII Code で表現される文字の並びと、文字を指す C 言語における「文字」は、ASCII Code 表の 1 byte で表現できる「モノ」 「日本語文字」は、1 byte で表現できない ( ASCII Code 表にない ) 「日本語文字列」は扱えるが、今は説明しない (UTF-8 にする事だけ注意) この講義内では、「日本語文字列」は「対象外」 エスケープシーケンス ASCII コード表の中に、「改行」に相当する「文字」がない # 画面への表示を考えると「改行」は不可欠.. キーボードに表記されていない文字の表現 キーボード上で表現されていない「文字」がある (キーボードは 256 もない) 例 改行, タブコード 表示できないのであれば、 表示できる方法を利用して、それを表す C 言語の表現 基本 : キーボード上に表記されている文字は、 その文字一文字自身が、その文字を表す キーボードの [A] というキーで入力できる 「A」は、C 言語上でも「A」という文字 一方、[改行]を表現する文字はないので、その場合は \(円マーク/バックスラッシュ)で始まる文字の並びで、 その文字を表現する 具体的には 改行(一個の文字) \n ( 「\」+「n」で表現 ) タブ \t キャリッジリターン \r => 行の先頭に移動する \ 自身は \\ エスケープシーケンスを利用して、色々な「文字」を表現する C 言語におけるエスケープ文字 「\ (バックスラッシュ)」が利用される (ubuntu : UTF-8 ) エスケープ ( escape : 逃げる .. ) \ がきたら、その後に続く文字が、通常と異なる解釈をする # 通常から、特別な状態になる(から、エスケープ) # 例 : # n => 通常ならば「n」という英小文字を表す # \n => 「エスケープ文字 \ 」の後ろなので、 # 「改行」という特別な文字を表す表現として扱われる # エスケープシーケンスは、終わったら終わる # => エスケープシーケンスによっては、 # 「\」の後の数文字続く事がありえる # 個別に覚える 必ず覚える必要があるエスケープシーケンス \n 改行 \\ \ そのもの \" 文字列の中で、「"」を表す場合 \' 一文字を表すときに「'」を表す場合 11:25 まで演習 前回の 20210423-02 の問題を解く
a b c 漢字 全角 日本語
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20210430-01.c
/* * 20210430-01-QQQQ.c * */ #include <stdio.h> #include <string.h> /* * こだまでしょうか * (c) 金子みすゞ * http://www.ad-c.or.jp/campaign/self_area/03/index.html */ void kakko ( char *message ) { printf ( "「" ); printf ( message ); printf ( "」" ); } void iu ( char *message ) { kakko ( message ); printf ( "っていうと" ); /* ** この部分を完成させなさい */ } /* * main */ int main ( void ) { iu ( "遊ぼう" ); iu ( "馬鹿" ); iu ( "もう遊ばない" ); printf ( "そうして、あとでさみしくなって、\n" ); iu ( "ごめんね" ); printf ( "こだまでしょうか、いいえ、誰でも。\n" ); return 0; }
$ ./20210430-01-QQQQ.exe 「遊ぼう」っていうと「遊ぼう」っていう。 「馬鹿」っていうと「馬鹿」っていう。 「もう遊ばない」っていうと「遊ばない」っていう。 そうして、あとでさみしくなって、 「ごめんね」っていうと「ごめんね」っていう。 こだまでしょうか、いいえ、誰でも。 $
Download : 20210430-02.c
/* * 20210430-02-QQQQ.c * 底辺の長さが指定した文字列の二倍の長さ - 1 の横向のピラミッドを作成するプログラムを作成する */ #include <stdio.h> #include <string.h> /* */ void down ( char *edge ) { if ( !strcmp ( edge, "" ) ) { /* なにもする必要はない */ } else { printf ( edge ); printf ( "\n" ); down ( edge + 1 ); } } void up ( char *edge ) { if ( !strcmp ( edge, "" ) ) { /* なにもする必要はない */ } else { up ( edge + 1 ); /* ** この部分を完成させなさい */ } } void pyramid ( char *edge ) { up ( edge + 1 ); printf ( edge ); printf ( "\n" ); /* ** この部分を完成させなさい */ } /* * main */ int main ( void ) { pyramid ( "*****" ); printf ( "\n" ); pyramid ( "**********" ); return 0; }
$ ./20210430-02-QQQQ.exe * ** *** **** ***** **** *** ** * * ** *** **** ***** ****** ******* ******** ********* ********** ********* ******** ******* ****** ***** **** *** ** * $