Download : sample-001.c
/* * 2017/05/26 sample-001.c */ #include <stdio.h> #include <string.h> /* * myPrintf (No.1) * * myPrintf の考え方 * * <意味を考える> * 「文字列」を全部を出力 * = 文字列の先頭の文字を出力 + 残りの文字列を出力 * = 「文字列」の先頭の文字を出力 + 「残りの文字列」を全部を出力(再帰) * * <再帰関数の形にする> * myPrintf ( 「文字列」 ) * = putchar ( 「文字列」の先頭 ) + myPrintf ( 「文字列」の残り ) * = putchar ( *「文字列」 ) + myPrintf ( 「文字列」+ 1 ) * * <再帰を利用する場合は「終了の場合」を作る> * myPrintf ( 「文字列」 ) * = if ( 「文字列」が空文字列の時 ) { * なにもしない * } else { * putchar ( *「文字列」 ); * myPrintf ( 「文字列」+ 1 ); * } * */ void myPrintf ( char *string ) { if ( !strcmp ( string, "" ) ) { /* 空文字列なら..(終了条件) */ /* 何もしなくてよい */ } else { /* まだ出力する文字があれば */ putchar ( *string ); /* 先頭の文字を出力する */ myPrintf ( string + 1 ); /* 残りの文字列を出力する */ } } /* * main */ int main ( void ) { myPrintf ( "abcde\n" ); myPrintf ( "xyz\n" ); return 0; }
$ ./sample-001.exe abcde xyz $
Download : sample-002.c
/* * 2017/05/26 sample-002.c */ #include <stdio.h> #include <string.h> /* * myPrintf (No.2) * * 終了条件を EOS ( '\0' : End Of String) で判定 */ void myPrintf ( char *string ) { if ( *string == '\0' ) { /* 先頭が空文字('\0')なら空文字列 */ /* 文字の比較は 「==」で行う */ /* 何もしなくてよい */ } else { /* まだ出力する文字があれば */ putchar ( *string ); /* 先頭の文字を出力する */ myPrintf ( string + 1 ); /* 残りの文字列を出力する */ } } /* * main */ int main ( void ) { myPrintf ( "abcde\n" ); myPrintf ( "xyz\n" ); return 0; }
$ ./sample-002.exe abcde xyz $
Download : sample-003-01.c
/* * CDATE sample-003-01.c */ #include <stdio.h> /* putchar の為に必要 */ /* * println : 文字列を出力するついでに最後に改行を付加する */ void println ( char *string ) { if ( *string == '\0' ) { putchar ( '\n' ); /* 最後に改行を出力する */ } else { putchar ( *string ); println ( string + 1 ); } }
Download : sample-003.c
/* * 2017/05/26 sample-003.c */ #include <stdio.h> /* * println の extern 宣言 */ extern void println ( char *string ); /* 関数の頭部の前に extern 後に ; */ /* * main */ int main ( void ) { println ( "abcde" ); /* 改行(\n)が不要になった */ println ( "xyz" ); return 0; }
$ ./sample-003.exe abcde xyz $
Download : sample-004-01.c
/* * 2017/05/26 sample-004-01.c */ /* もはや printf も putchar も使わないので #include <stdio.h> も不要 */ /* * println の extern 宣言 */ extern void println ( char *string ); /* * triangle again * */ void triangle ( char *string ) { if ( *string == '\0' ) { /* 何もしなくてよい */ } else { println ( string ); /* println を利用する */ triangle ( string + 1 ); } }
Download : sample-004.c
/* * 2017/05/26 sample-004.c */ /* * triangle, println の extern 宣言 */ extern void println ( char *string ); extern void triangle ( char *string ); /* * main */ int main ( void ) { triangle ( "****" ); /* 間接的に println を使うので、改行が不要 */ println ( "" ); /* 空行を出力する */ triangle ( "*******" ); return 0; }
$ ./sample-004.exe **** *** ** * ******* ****** ***** **** *** ** * $
Download : sample-005-01.c
/* * 2017/05/26 sample-005-01.c */ /* * println の extern 宣言 */ extern void println ( char *string ); /* * rtriangle -- triangle の「逆」版 */ void rtriangle ( char *string ) { if ( *string == '\0' ) { /* 何もしなくてよい */ } else { rtriangle ( string + 1 ); /* 最初に残りをやって.. */ println ( string ); /* 最後に先頭を処理する */ } }
Download : sample-005.c
/* * 2017/05/26 sample-005.c */ /* * rtriangle, println の extern 宣言 */ extern void println ( char *string ); extern void triangle ( char *string ); extern void rtriangle ( char *string ); /* * main */ int main ( void ) { triangle ( "****" ); rtriangle ( "*******" ); return 0; }
$ ./sample-005.exe **** *** ** * * ** *** **** ***** ****** ******* $
Download : sample-006-01.c
/* * 2017/05/26 sample-006-01.c */ /* * extern 宣言 */ extern println ( char *string ); /* * string の文字列の長さ回 「Hello World\n」を表示する */ void nhello ( char *string ) { if ( *string == '\0' ) { /* 既に全てすんだ */ /* 何もしなくてよい */ } else { /* まだ、やる事がある */ println ( "Hello, World" ); /* 取り敢えず、一度出力 */ nhello ( string + 1 ); /* 文字列を短くして、残りを行う (再帰) */ } }
Download : sample-006.c
/* * 2017/05/26 sample-006.c */ /* * extern 宣言 */ extern println ( char *string ); extern nhello ( char *string ); /* * n 回数の繰返し */ int main ( void ) { println ( " 3 回 Hello : " ); nhello ( "***" ); /* 長さ 3 の文字列を指定 */ println ( " 5 回 Hello : " ); nhello ( "12345" ); /* 長さ 5 の文字列を指定 */ return 0; }
$ ./sample-006.exe 3 回 Hello : Hello, World Hello, World Hello, World 5 回 Hello : Hello, World Hello, World Hello, World Hello, World Hello, World $
Download : sample-007-01.c
/* * 2017/05/26 sample-007-01.c */ /* * extern 宣言 */ extern println ( char *string ); /* * string の文字列の長さ回 message を出力する * 基本は nhello と同じだが、出力する message が異なる */ void nprintln ( char *string, char *message ) { if ( *string == '\0' ) { /* 既に全てすんだ */ /* 何もしなくてよい */ } else { /* まだ、やる事がある */ println ( message ); /* 取り敢えず、一度出力 */ nprintln ( string + 1, message ); } }
Download : sample-007.c
/* * 2017/05/26 sample-007.c */ /* * extern 宣言 */ extern void nprintln ( char *string, char *message ); /* * n 回数の繰返し */ int main ( void ) { println ( " 3 回「Hello」: " ); nprintln ( "***", "Hello" ); println ( " 5 回「こんにちは」: " ); nprintln ( "12345", "こんにちは" ); return 0; }
$ ./sample-007.exe 3 回「Hello」: Hello Hello Hello 5 回「こんにちは」: こんにちは こんにちは こんにちは こんにちは こんにちは $
Download : sample-008-01.c
/* * 2017/05/26 sample-008-01.c */ #include <stdio.h> /* putchar が必要なので.. */ /* * extern 宣言 */ extern println ( char *string ); /* * itemize ( char *item, char *message ) * 個々の文字の前にマークを付ける */ void itemize ( char *item, char *message ) { if ( *item == '\0' ) { /* 既に全てすんだ */ /* 何もしなくてよい */ } else { /* まだ、やる事がある */ putchar ( *item ); /* 項目 */ putchar ( ' ' ); /* 一文字空けて */ println ( message ); /* 一行出力 */ itemize ( item + 1, message ); } }
Download : sample-008.c
/* * 2017/05/26 sample-008.c */ /* * extern 宣言 */ extern void itemize ( char *item, char *message ); /* * n 回数の繰返し */ int main ( void ) { println ( " 3 回「Hello」: " ); itemize ( "***", "Hello" ); println ( " 5 回「こんにちは」: " ); itemize ( "12345", "こんにちは" ); return 0; }
$ ./sample-008.exe 3 回「Hello」: * Hello * Hello * Hello 5 回「こんにちは」: 1 こんにちは 2 こんにちは 3 こんにちは 4 こんにちは 5 こんにちは $
Download : sample-009-01.c
/* * 2017/05/26 sample-009-01.c */ #include <stdio.h> /* putchar が必要なので.. */ /* * extern 宣言 */ extern println ( char *string ); extern nprintln ( char *string, char *message ); /* * mnprintln ( char *m, char *n, char *message ) * m * n 回数 message を出力する */ void mnprintln ( char *m, char *n, char *message ) { if ( *m == '\0' ) { } else { nprintln ( n, message ); /* n 回数は nprintln にお任せ */ mnprintln ( m + 1, n, message ); } }
Download : sample-009.c
/* * 2017/05/26 sample-009.c */ /* * extern 宣言 */ extern void mnprintln ( char *m, char *n, char *message ); /* * n 回数の繰返し */ int main ( void ) { println ( " 3 x 5 回「Hello」: " ); mnprintln ( "***", "*****", "Hello" ); println ( " 4 x 4 回「こんにちは」: " ); mnprintln ( "1234", "1234", "こんにちは" ); return 0; }
$ ./sample-009.exe 3 x 5 回「Hello」: Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello 4 x 4 回「こんにちは」: こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは $
Download : sample-010-01.c
/* * 2017/05/26 sample-010-01.c */ #include <stdio.h> /* putchar が必要なので.. */ /* * nprinttail * n 回数 message を出力するが、行末を変更する。 */ void nprinttail ( char *tail, char *message ) { if ( *tail == '\0' ) { } else { printf ( message ); if ( *tail == '\n' ) { /* 改行の時のみ */ putchar ( '\n' ); /* 改行する */ } else { /* それ以外は */ /* 何もしない */ } nprinttail ( tail + 1, message ); } }
Download : sample-010.c
/* * 2017/05/26 sample-010.c */ /* * extern 宣言 */ extern void println ( char *message ); extern void nprinttail ( char *tail, char *message ); /* * n 回数の繰返し */ int main ( void ) { println ( "毎回改行「Hello」: " ); nprinttail ( "\n\n\n", "Hello" ); println ( "3 回目, 7 回目だけ改行「Hello」: " ); nprinttail ( "12\n456\n", "Hello" ); return 0; }
$ ./sample-010.exe 毎回改行「Hello」: Hello Hello Hello 3 回目, 7 回目だけ改行「Hello」: HelloHelloHello HelloHelloHelloHello $
Download : sample-011.c
/* * 2017/05/26 sample-011.c */ #include <stdio.h> /* * 文字の扱い */ int main ( void ) { printf ( "abc\n" ); /* 「abc(改行)」とでる */ printf ( "abc\n" + 1 ); /* 「bc(改行)」とでる ( 1 を加えると短くなる ) */ putchar ( 'A' ); /* 「A」とでる */ putchar ( '\n' ); /* 「(改行)」とでる */ putchar ( 'A' + 1 ); /* 文字に 1 を加えると ? */ putchar ( '\n' ); /* 「(改行)」とでる */ return 0; }
$ ./sample-011.exe abc bc A B $
Download : sample-012-01.c
/* * 2017/05/26 sample-012-01.c */ #include <stdio.h> /* putchar が必要なので.. */ /* * printcharln ( char ch ) * 文字を出力して改行する */ void printcharln ( char ch ) { putchar ( ch ); /* 指定された文字を出力 */ putchar ( '\n' ); /* その後に改行 */ }
Download : sample-012.c
/* * 2017/05/26 sample-012.c */ /* * extern 宣言 */ extern void printcharln ( char ch ); /* * 文字の扱い(2) */ int main ( void ) { printcharln ( 'A' + 1 ); /* 'B' になった */ printcharln ( 'B' + 1 ); /* 'C' になる */ printcharln ( 'A' + 1 + 1 ); /* これも 'C' になる */ printcharln ( 'A' + 0 ); /* これはもちろん 'A' */ printcharln ( 'A' + 10 ); /* 'A', 'B', .., 'J', 'K' になるはず */ printcharln ( 'A' + 25 ); /* 'Z' !! */ printcharln ( 'Z' + 1 ); /* ??? */ return 0; }
$ ./sample-012.exe B C C A K Z [ $
Download : sample-013-01.c
/* * 2017/05/26 sample-013-01.c */ #include <stdio.h> /* putchar が必要なので.. */ /* * nprintcharln ( char ch ) * 文字を連続 n 個だけ、出力する */ void nprintcharln ( char *n, char ch ) { if ( *n == '\0' ) { putchar ( '\n' ); /* 改行 */ } else { putchar ( ch ); /* 指定された文字を出力 */ nprintcharln ( n + 1, ch + 1 ); } }
Download : sample-013.c
/* * 2017/05/26 sample-013.c */ /* * extern 宣言 */ extern void nprintcharln ( char *n, char ch ); extern void printcharln ( char ch ); extern void println ( char *string ); /* * 文字の扱い(3) */ int main ( void ) { println ( "'A' から 10 個 :" ); nprintcharln ( "1234567890", 'A' ); println ( "'U' から 10 個 :" ); nprintcharln ( "1234567890", 'U' ); println ( "'k' から 10 個 :" ); nprintcharln ( "1234567890", 'k' ); println ( "'0' から 10 個 :" ); nprintcharln ( "1234567890", '0' ); println ( "'9' + 1 は.. :" ); printcharln ( '9' + 1 ); /* 残念ながら "10" ではない */ return 0; }
$ ./sample-013.exe 'A' から 10 個 : ABCDEFGHIJ 'U' から 10 個 : UVWXYZ[\]^ 'k' から 10 個 : klmnopqrst '0' から 10 個 : 0123456789 '9' + 1 は.. : : $
Download : sample-014-01.c
/* * 2017/05/26 sample-014-01.c */ #include <stdio.h> /* putchar が必要なので.. */ /* * printonedigit ( int n ) * 一桁の整数を出力する */ void printonedigit ( int n ) { putchar ( '0' + n ); /* n が 0 〜 9 の場合だけ、正く動く */ } /* * printonedigitln ( int n ) * 一桁の整数を出力して改行する */ void printonedigitln ( int n ) { printonedigit ( n ); /* 一桁の数値を出力し.. */ putchar ( '\n' ); /* 改行する */ }
Download : sample-014.c
/* * 2017/05/26 sample-014.c */ /* * extern 宣言 */ extern void println ( char *string ); extern void printonedigit ( int n ); extern void printonedigitln ( int n ); /* * 整数 */ int main ( void ) { println ( "整数値 0 の出力" ); printonedigitln ( 0 ); /* 「'0'」 でも 「"0"」 でもなく 「0」 */ println ( "整数値 9 の出力" ); printonedigitln ( 9 ); /* 一桁は OK */ println ( "整数値 11 の出力" ); printonedigitln ( 11 ); /* 上手く行かない */ println ( "整数値 1 + 1 の出力" ); printonedigitln ( 1 + 1 ); /* やっと計算がでてきた */ println ( "整数値 5 - 2 の出力" ); printonedigitln ( 5 - 2 ); /* 引算 */ println ( "整数値 3 * 2 の出力" ); printonedigitln ( 3 * 2 ); /* かけ算 */ println ( "整数値 8 / 3 の出力" ); printonedigitln ( 8 / 3 ); /* 小数点以下は余りは切り捨て */ println ( "整数値 8 % 3 の出力" ); printonedigitln ( 8 % 3 ); /* 余りは「%」をで計算 */ println ( "整数値 8 - ( 8 / 3 ) * 3 の出力" ); printonedigitln ( 8 - ( 8 / 3 ) * 3 ); /* 余りを求めるもう一つの方法 */ return 0; }
$ ./sample-014.exe 整数値 0 の出力 0 整数値 9 の出力 9 整数値 11 の出力 ; 整数値 1 + 1 の出力 2 整数値 5 - 2 の出力 3 整数値 3 * 2 の出力 6 整数値 8 / 3 の出力 2 整数値 8 % 3 の出力 2 整数値 8 - ( 8 / 3 ) * 3 の出力 2 $
Download : sample-015-01.c
/* * 2017/05/26 sample-015-01.c */ #include <stdio.h> /* putchar が必要なので.. */ /* * extern 宣言 */ extern void printonedigit ( int n ); /* * printpositiveintsub ( int n ) * 正の整数を出力する */ void printpositiveintsub ( int n ) { if ( n == 0 ) { /* 0 の場合 */ /* もう出力なくてよい */ } else { printpositiveintsub ( n / 10 ); /* 上位の桁を出力し */ printonedigit ( n % 10 ); /* 1 の位を出力する */ } } /* * printpositiveint ( int n ) * 非負の整数を出力する */ void printpositiveint ( int n ) { if ( n == 0 ) { /* 0 の場合は特別扱い */ putchar ( '0' ); /* 0 を出力 */ } else { /* その他の場合は、n 桁の処理 */ printpositiveintsub ( n ); /* 正の場合の処理 */ } } /* * printpositiveintln ( int n ) * 正の整数を出力して改行する */ void printpositiveintln ( int n ) { printpositiveint ( n ); /* 正の整数値を出力し.. */ putchar ( '\n' ); /* 改行する */ }
Download : sample-015.c
/* * 2017/05/26 sample-015.c */ /* * extern 宣言 */ extern void println ( char *string ); extern void printpositiveint ( int n ); extern void printpositiveintln ( int n ); /* * 整数 */ int main ( void ) { println ( "整数値 0 の出力" ); printpositiveintln ( 0 ); println ( "整数値 11 の出力" ); printpositiveintln ( 11 ); println ( "整数値 12345 の出力" ); printpositiveintln ( 12345 ); println ( "整数値 12 * 34 の出力" ); printpositiveintln ( 12 * 34 ); return 0; }
$ ./sample-015.exe 整数値 0 の出力 0 整数値 11 の出力 11 整数値 12345 の出力 12345 整数値 12 * 34 の出力 408 $
/* * 20170526-01-QQQQ.c * * 与えられた文字列を逆順に出力する rprintf を定義しなさい */ #include <stdio.h> /* * rprintf myprintf ( "abc" ) -> putchar ( 'a' ); "abc" -> 'a' + "bc" myprintf ( "bc" ); rprintf ( "abc" ) -> rprintf ( "bc" ); -> "cb" putchar ( 'a' ); -> 'a' "cba" -> "cb" 'a' */ void rprintf ( char *string ) { if ( *string == '\0' ) { /* 空文字ならば.. */ /* 何もしない */ } else { rprintf ( string + 1 ); putchar ( *string ); } } /* * main */ int main ( void ) { rprintf ( "abcd" ); putchar ( '\n' ); rprintf ( "123456" ); putchar ( '\n' ); return 0; }
#include <stdio.h> void down( char *string ) { if ( !strcmp ( string, "" ) ) { /* 空文字列の時はなにもしない */ } else { printf ( string ); /* 実際に「何か」をする部分 */ down ( string + 1 ); /* 再帰呼び出し */ } } int main(void) { down ( "abc\n" ); /* 文字列の長さが 4 なので、4 行出力 */ down ( "123456789\n" ); /* 10 文字 */ return 0; }
/* 「Hello, 自分の名前」を 100 回 */ void helloMe(void) { printf ( "Hello, 栗野俊一\n" ); } /* 引数で指定した文字列の長さだけ helloMe を呼ぶ */ void nHelloMe( char *times ) { if ( !strcmp ( times, "" ) ) { /* 何もしない */ } else { helloMe(); nHelloMe ( times + 1 ); } } /* 引数で指定した文字列の長さだけ nHelloMe を呼ぶ */ void nnHelloMe( char *times ) { if ( !strcmp ( times, "" ) ) { /* 何もしない */ } else { nHelloMe( "1234567890" ); /* helloMe が 10 回 */ nnHelloMe ( times + 1 ); } } int main(void) { nnHelloMe ( "1234567890" ); /* nHelloMe が 10 回 */ /* 結果的に helloMe が 10 * 10 = 100 回 */ return 0; }
#include <stdio.h> int main(void) { putchar ( 'A' ); /* 文字「A」を画面に出力 */ putchar ( '\n' ); /* 改行を画面に出力 */ return 0; }
#include <stdio.h> int main(void) { printf ( "A\n" ); /* 文字列「A」,改行を画面に出力 */ return 0; }
#include <stdio.h> int main(void) { putchar ( *"ABC" ); /* 文字列 "ABC" の頭に「*」を付けると、 先頭の文字「'A'」が取り出せる それを putchar で出力するので、 「A」が表示される */ putchar ( *("ABC"+1) ); /* 「B」が出る */ putchar ( *("ABC"+2) ); /* "ABC"+2 = ("ABC"+1)+1「C」が出る */ /* *("ABC"+3) -> *"" -> '\0' : EOS によって、「終わり」が解る */ /* *("ABC"+2) == "ABC"[2] *"ABC" == *("ABC"+0) == "ABC"[0] 一般に *(文字列 + 整数値) == 文字列[整数値] */ putchar ( '\n' ); return 0; }
#include <stdio.h> /* *("ABC"+2) == "ABC"[2] *"ABC" == *("ABC"+0) == "ABC"[0] 一般に *(文字列 + 整数値) == 文字列[整数値] */ int main(void) { putchar ( "ABC"[0] ); /* "ABC"[0] == *("ABC"+0):「A」を出力 */ putchar ( "ABC"[1] ); /* 「B」を出力 */ putchar ( "ABC"[2] ); /* 「C」を出力 */ putchar ( '\n' ); return 0; }
/* ?????????????W?????????????A ?????? (?^??) printf ????? myprinf ?????? putchar ?????????? myprintf : ???????????????A????????????e??\?????? myprintf ( "abc" ); -> ????uabc?v?\????????? -> putchar ( 'a' ); ????? putchar ?????鎖 putchar ( 'b' ); putchar ( 'c' ); myprintf ( "12345" ); -> putchar ( '1' ); ????A??????????????????? putchar ( '2' ); putchar ( '3' ); putchar ( '4' ); putchar ( '5' ); myprintf ( "abc" ); -> ????uabc?v?\????????? # ???G???? -> putchar ( 'a' ); -> putchar ( *"abc" ); 'a' ???o?? # ??P??????????? "bc" ???o?? # ?c?????? -> ??A??яo???????????? myprintf ( "bc" ); ?????A myprintf ( char *string ) { putchar ( *string ); ??????? myprintf ( string + 1 ) ?c???????? } ???A??A??яo??????A"" ??????????????? "abc" +-- 'a' | +-- "bc" +-- 'b' | +-- "c" +-- 'c' | +-- "" */ void myprintf ( char *string ) { if ( !strcmp ( string, "" ) ) { /* ??????????d???????????????? */ } else { putchar ( *string ); /* ??????????o?? */ myprintf ( string + 1 ); /* ?c???A??A???? */ } } int main(void) { myprintf ( "abc\n" ); return 0; }
/* */ void myprintf ( char *string ) { if ( *string == '\0' ) { /* ?u!strcmp ( string, "" )?v???????? */ /* ?????r??A string ?? "" ??????????????? */ /* *"" == '\0' (EOF) ???? *string == '\0' ????????? */ /* ???????r?? ?u==?v??s?? */ /* ?u==?v??????? */ /* ?u!=?v?????????? */ /* ???? ?u<?v????A?u>?v????A?u<=?v?A?u>=?v ???????邪?A??????b????? */ } else { putchar ( *string ); /* ??????????o?? */ myprintf ( string + 1 ); /* ?c???A??A???? */ } } int main(void) { myprintf ( "abc\n" ); return 0; }
#include <stdio.h> int main(void) { putchar ( 'A' + 1 ); /* 文字に +1 すると、別の文字になる */ /* 'B' になる */ putchar ( 'B' + 1 ); putchar ( 'Z' + 1 ); putchar ( 'A' - 1 ); putchar ( '0' + 1 ); putchar ( '9' + 1 ); putchar ( '0' + 3 ); /* '0' + 3 = '0' + 1 + 1 + 1 */ /* = ((( '0' + 1 ) + 1 ) + 1 ) */ /* = ( '1'+ 1 ) + 1 */ /* = '2'+ 1 */ /* = '3' */ putchar ( '\n' ); return 0; }
これまで、 「処理の対象」として「文字列」しか扱ってこなかった # 「処理の対象」: Data Type (データ型) 文字列の表現は 「"」から始まり、「"」以外の文字が並んだあとに「"」が来る 例 : "abc" : 「"」のあとに「a」,「b」,「c」がきて「"」が来ている 文字列の意味は 二つの「"」の間の文字がならんでいる 例 : "abc" : 「a」,「b」,「c」の三つの文字からなる 操作 空文字列「""」以外(長さが 1 以上)の文字列は。+1 すると、 先頭の文字が失われ、文字の長さ 1 だけ短くなる。 printf で出力できる 新しい「処理の対象」として「文字(半角英数記号のみ)」を導入 文字の表現 「'」から始まり、「'」以外の文字が一つ来た後「'」が来る 例 : 'A' ( "A" とは違う !! ) 文字の意味は、 二つの「'」の間にある文字を(直接)表現している 操作 putchar ( 文字 ) で、「文字」が出力できる '\n' も「改行」一文字の意味利用する(文字列と同じ) 文字列と文字の関係 直観的な理解 : "ABC" <-> 'A', 'B', 'C' C 言語 : "ABC" <-> 'A' 'B' 'C' '\0' '\0' End Of Strig ( EOS ) と呼ばれる「特別な文字」 文字列の終わりに必ずつけられる文字 「文字列の長さ」は、'\0' 以外の文字の個数 文字列 "ABC" の長さは、3 になって、直観と一致 特に "" (空文字列) も実態は '\0' 一つからなる !! 改めて !! "A" と 'A' と違う !! "A" <-> 'A', '\0' 'A' <-> 'A' 文字列から、文字を取り出す事ができる 文字列の先頭に '*' を付けると、文字列の先頭の文字がとり出せる "abc" + 1 -> "bc" 'a' + 1 -> ?? C 言語の整数: 表現できる数の範囲に限りがある !! どの範囲かは、システムによって異なる 2^30 = (2^10)^3 '=, (10^3)^3 = 10^9 .. 十億位 2^10 = 1024 '=, 10^3 整数値の出力
Download : 20170526-01.c
/* * 20170526-01-QQQQ.c * * 与えられた文字列を逆順に出力する rprintf を定義しなさい */ #include <stdio.h> /* * rprintf */ void rprintf ( char *string ) { if ( *string == '\0' ) { /* 空文字ならば.. */ /* 何もしない */ } else { /* ** この部分を完成させなさい */ } } /* * main */ int main ( void ) { rprintf ( "abcd" ); putchar ( '\n' ); rprintf ( "123456" ); putchar ( '\n' ); return 0; }
$ ./20170526-01-QQQQ.exe dcba 654321 $
Download : 20170526-02.c
/* * 20170526-02-QQQQ.c * 出力する繰返し回数を整数で指定する ntimeprint を作りなさい */ #include <stdio.h> /* * ntimeprint ( int times, char *message ) */ void ntimeprint ( int times, char *message ) { if ( times <= 0 ) { /* 非正なら、回数として不適切か、終わり */ /* 何もしないくてよい */ } else { /* 繰返し回数が正ならば.. */ printf ( message ); /* 少なくても一度は出力し.. */ /* ** この部分を完成させなさい */ } } /* * main */ int main ( void ) { printf ( "「Hello」を 3 回\n" ); ntimeprint ( 3, "Hello\n" ); printf ( "「ハ」を 30 回\n" ); ntimeprint ( 30, "ハ" ); printf ( "\n" ); return 0; }
$ ./20170526-02-QQQQ.exe 「Hello」を 3 回 Hello Hello Hello 「ハ」を 30 回 ハハハハハハハハハハハハハハハハハハハハハハハハハハハハハハ $
Download : 20170526-03.c
/* * 20170526-03-QQQQ.c * 負の整数も処理できる printint を作成しなさい * ただし、正の整数を出力する printpositiveintsub, printpositiveint を利用してよい */ #include <stdio.h> /* * printint */ void printint ( int n ) { if ( n < 0 ) { /* 負の時は.. */ /* ** この部分を完成させなさい */ } else { /* 正の時には.. */ printpositiveint ( n ); } } /* * printintln */ void printintln ( int n ) { printint ( n ); putchar ( '\n' ); } /* * main */ int main ( void ) { printf ( "123 の出力\n" ); printintln ( 123 ); printf ( "-123 の出力\n" ); printintln ( -123 ); printf ( "123 + 456 の出力\n" ); printintln ( 123 + 456 ); printf ( "123 - 456 の出力\n" ); printintln ( 123 - 456 ); return 0; }
$ ./20170526-03-QQQQ.exe $