Download : sample-001.c ( SJIS 版 )
/* * 2014/05/16 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; }
C:\usr\c>sample-001 abcde xyz C:\usr\c>
Download : sample-002.c ( SJIS 版 )
/* * 2014/05/16 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; }
C:\usr\c>sample-002 abcde xyz C:\usr\c>
Download : sample-003-01.c ( SJIS 版 )
/* * 2014/05/16 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 ( SJIS 版 )
/* * 2014/05/16 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; }
C:\usr\c>sample-003 abcde xyz C:\usr\c>
Download : sample-004-01.c ( SJIS 版 )
/* * 2014/05/16 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 ( SJIS 版 )
/* * 2014/05/16 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; }
C:\usr\c>sample-004 **** *** ** * ******* ****** ***** **** *** ** * C:\usr\c>
Download : sample-005-01.c ( SJIS 版 )
/* * 2014/05/16 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 ( SJIS 版 )
/* * 2014/05/16 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; }
C:\usr\c>sample-005 **** *** ** * * ** *** **** ***** ****** ******* C:\usr\c>
Download : sample-006-01.c ( SJIS 版 )
/* * 2014/05/16 sample-006-01.c */ /* * extern 宣言 */ extern println ( char *string ); /* * string の文字列の長さ回 「Hello World\n」を表示する */ void nhello ( char *string ) { if ( *string == '\n' ) { /* 既に全てすんだ */ /* 何もしなくてよい */ } else { /* まだ、やる事がある */ println ( "Hello, World" ); /* 取り敢えず、一度出力 */ nhello ( string + 1 ); /* 文字列を短くして、残りを行う (再帰) */ } }
Download : sample-006.c ( SJIS 版 )
/* * 2014/05/16 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; }
C:\usr\c>sample-006 3 回 Hello : 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World 5 回 Hello : 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World Hello, World C:\usr\c>
Download : sample-007-01.c ( SJIS 版 )
/* * 2014/05/16 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 ( SJIS 版 )
/* * 2014/05/16 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; }
C:\usr\c>sample-007 3 回「Hello」: Hello Hello Hello 5 回「こんにちは」: こんにちは こんにちは こんにちは こんにちは こんにちは C:\usr\c>
Download : sample-008-01.c ( SJIS 版 )
/* * 2014/05/16 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 ( SJIS 版 )
/* * 2014/05/16 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; }
C:\usr\c>sample-008 3 回「Hello」: * Hello * Hello * Hello 5 回「こんにちは」: 1 こんにちは 2 こんにちは 3 こんにちは 4 こんにちは 5 こんにちは C:\usr\c>
Download : sample-009-01.c ( SJIS 版 )
/* * 2014/05/16 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 ( SJIS 版 )
/* * 2014/05/16 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; }
C:\usr\c>sample-009 3 x 5 回「Hello」: Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello 4 x 4 回「こんにちは」: こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは こんにちは C:\usr\c>
Download : sample-010-01.c ( SJIS 版 )
/* * 2014/05/16 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 ( SJIS 版 )
/* * 2014/05/16 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; }
C:\usr\c>sample-010 毎回改行「Hello」: Hello Hello Hello 3 回目, 7 回目だけ改行「Hello」: HelloHelloHello HelloHelloHelloHello C:\usr\c>
Download : sample-011.c ( SJIS 版 )
/* * 2014/05/16 sample-011.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; }
C:\usr\c>sample-011 B C C A K Z [ C:\usr\c>
Download : sample-012-01.c ( SJIS 版 )
/* * 2014/05/16 sample-012-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-012.c ( SJIS 版 )
/* * 2014/05/16 sample-012.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; }
C:\usr\c>sample-012 'A' から 10 個数 : ABCDEFGHIJ 'U' から 10 個数 : UVWXYZ[\]^ 'k' から 10 個数 : klmnopqrst '0' から 10 個数 : 0123456789 '9' + 1 は.. : : C:\usr\c>
Download : sample-013-01.c ( SJIS 版 )
/* * 2014/05/16 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 ( SJIS 版 )
/* * 2014/05/16 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; }
C:\usr\c>sample-013 'A' から 10 個数 : ABCDEFGHIJ 'U' から 10 個数 : UVWXYZ[\]^ 'k' から 10 個数 : klmnopqrst '0' から 10 個数 : 0123456789 '9' + 1 は.. : : C:\usr\c>
Download : sample-014-01.c ( SJIS 版 )
/* * 2014/05/16 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 ( SJIS 版 )
/* * 2014/05/16 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; }
C:\usr\c>sample-014 整数値 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 C:\usr\c>
Download : sample-015-01.c ( SJIS 版 )
/* * 2014/05/16 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 ( SJIS 版 )
/* * 2014/05/16 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; }
C:\usr\c>sample-015 整数値 0 の出力 0 整数値 11 の出力 11 整数値 12345 の出力 12345 整数値 12 * 34 の出力 408 C:\usr\c>
/* 文字列を出力したい "abc" -> 画面に表示させる 答え : printf ( "abc" ); "abc" = { 'a', 'b', 'c', '\0' } -> 文字列は、沢山の物からなる これを処理したい。 "abc" を全部出力する -> これを二つ(直ぐにできるものと残り)にわける "abc" の先頭の 'a' の出力 "abc" の先頭文字は *"abc" と * をつける "abc" のニ文字目以後の出力 "abc" ニ文字目以後 "bc" は "abc" + 1 とする 再帰呼出しを利用できる この考え方を C 風に表現すると myPrinf ( char *string ) = putchar ( *string ); /* 先頭の一文字 */ + myPrintf ( string + 1 ); /* 残り(再帰) */ さらに、「終了条件」を考える myPrinf ( char *string ) = if ( string が空っぽの時 ) { なにもしない } else { putchar ( *string ); /* 先頭の一文字 */ + myPrintf ( string + 1 ); /* 残り(再帰) */ } */ /* * 2014/05/16 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; }
#include <stdio.h> int main() { printf ( "abc(" ); /* 「abc(」が出力される */ putchar ( 'A' ); /* 「A」が出力される */ printf ( ")\n" ); /* 「)<改行>」が出力される */ /* 「abc(A)<改行>」になる */ return 0; }
#include <stdio.h> int main() { putchar ( "abc(" ); /* 態と間違えてみた */ printf ( 'A' ); /* → 間違っているとコンパイラが教えてくれた.. */ putchar ( ")\n" ); return 0; }
#include <stdio.h> int main() { printf ( "abc" ); /* abc */ putchar ( 'A' ); /* A */ printf ( "abc" + 1 ); /* "abc" + 1 = "bc" */ putchar ( 'A' + 1 ); /* 'A' + 1 = ?? */ printf ( "\n" ); return 0; }
#include <stdio.h> /* 引数で指定された文字を二度出力する */ void dublePrintf ( char *string ) { printf ( string ); printf ( string ); } void doublePutchar ( char ch ) { /* 今迄は、引数の前に「char *」を付けきたが これは、引数が「文字列」だったから もし、引数が「文字」の場合は、「char」だけする */ putchar ( ch ); /* 一度目の出力 */ putchar ( ch ); /* 二度目の出力 */ } int main() { doublePutchar ( 'A' ); /* 「A」が二度出力される */ doublePutchar ( 'a' ); /* 「a」が二度出力される */ printf ( "\n" ); return 0; }
#include <stdio.h> /* 引数で指定された文字を二度出力する */ int main() { putchar ( "ABC"[0] ); /* "ABC"[0] は文字列 "ABC" = { 'A', 'B', 'C', '\0' } の 0 番目(先頭) の文字を表すので 'A' と同じ → 「A」が画面に表示される。 [注意] "A"[0] は 'A' となる 'A'[0] は 'A' とはならない (エラーになる) */ printf ( "\n" ); return 0; }
#include <stdio.h> int main() { if ( !strcmp ( "ABC", "ABC" ) ) { /* 「!strmcp ( "ABC", "ABC" )」が「真」になる*/ printf ( "ひとしい\n" ); } else { printf ( "ひとしくない\n" ); } if ( !strcmp ( "ABC", "XYZ" ) ) { /* 「!strmcp ( "ABC", "XYZ" )」が「偽」になる*/ printf ( "ひとしい\n" ); } else { printf ( "ひとしくない\n" ); } if ( strcmp ( "ABC", "ABC" ) ) { /* 「strmcp ( "ABC", "ABC" )」が「偽」になる*/ printf ( "ひとしい\n" ); } else { printf ( "ひとしくない\n" ); } return 0; }
#include <stdio.h> void pprintf ( char *string ) { /* "abc" -> "abc" */ if ( *string == '\0' ) { /* do nothiing */ } else { putchar ( *string ); /* 'a' */ pprintf ( string + 1 ); /* "bc" -> "bc" */ } /* 'a' "bc" -> "abc" */ } void rprintf ( char *string ) { /* "abc" -> "cba" */ if ( *string == '\0' ) { /* do nothiing */ } else { rprintf ( string + 1 ); /* "bc" -> "cb" */ putchar ( *string ); /* 'a' */ } /* "cb" 'a' -> "cba" */ } int main() { pprintf ( "abc" ); /* -> abc */ printf ( "\n" ); rprintf ( "abc" ); /* -> cba */ printf ( "\n" ); return 0; }
/* * 2014/05/16 sample-011.c */ /* * extern 宣言 */ extern void printcharln ( char ch ); /* * 文字の扱い(2) */ int main ( void ) { printcharln ( 'A' + 1 ); /* 'B' になった */ /* C 言語の中で 'A' という文字は、 実は 49 という整数値と同様に扱われる */ /* 「'A' + 1」=「65+ 1」=「66」=「'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; }
/* 具体的な例で、やりたい事を考える ntimeprint ( 3, "abc" ); = "abc" "abc" "abc" = "abc" + "abc" "abc" = println ( "abc" ); + ntimeprint ( 2, "abc" ); 抽象的に、変数を使って考える ntimeprint ( int n, char *string ) = println ( string ); + ntimeprint ( n-1, string ); 再帰を使っているので、何もしない場合を考える ntimeprint ( int n, char *string ) = if ( n == 0 ) { /* n が 0 なら.. */ /* なにもしない */ } else { println ( string ); ntimeprint ( n-1, string ); } */ void ntimeprint ( int times, char *message ) { if ( times == 0 ) { /* n が 0 なら.. */ /* なにもしない */ } else { println ( string ); ntimeprint ( times-1, string ); } } /* このままだと n が負の数の場合が困る 安全のために、 条件の所は if ( n == 0 ) ではなく if ( n <= 0 ) とする */ void ntimeprint ( int times, char *message ) { if ( times <= 0 ) { /* times が 0 以下なら.. */ /* なにもしない */ } else { println ( string ); ntimeprint ( times-1, string ); } }
二つの文字列の比較 if ( !strmcp ( "ABC", "ABC" ) ) { /* 「!strmcp ( "ABC", "ABC" )」が「真」になる*/ printf ( "ひとしい\n" ); } else { printf ( "ひとしくない\n" ); } とすると、 「ひとしい」と表示される if ( !strmcp ( "ABC", "XYZ" ) ) { /* 「!strmcp ( "ABC", "XYZ" )」が「偽」になる*/ printf ( "ひとしい\n" ); } else { printf ( "ひとしくない\n" ); } とすると、 「ひとしくない」と表示される ! をつけるのとつけないのでは、真偽が逆転します。 if ( strmcp ( "ABC", "ABC" ) ) { /* 「strmcp ( "ABC", "ABC" )」が「偽」になる*/ printf ( "ひとしい\n" ); } else { printf ( "ひとしくない\n" ); } とすると、 「ひとしくない」と表示される ひとしい !strcmp ( "ABC", "ABC" ); ひとしくない !strcmp ( "ABC", "XYZ" ); ひとしくない strcmp ( "ABC", "ABC" ); 文字列が空文字列(文字を一つも含まない、長さ 0 文字列で、 「""」で表現される)かどうかの判定は、 /* 引数 string が空文字かどうかの判定方法 */ if ( !strmcp ( string, "" ) ) { ... でもよいが if ( *string == '\0' ) { ... という書方もある --------------------------------------- sample-003.c と sample-003-01.c の説明 sample-003-01.c には、println という関数が定義されている 一方 sample-003.c には、main があり、println を利用している == 引数に与える情報 引数の前に書くもの 文字列 char * 文字 char 整数 int
sample-004.exe : sample-004.o sample-004-01.o sample-003-01.o cc -o sample-004.exe sample-004.o sample-004-01.o sample-003-01.o
Download : 20140516-01.c ( SJIS 版 )
/* * 20140516-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; }
C:\usr\c\> 20140516-01-QQQQ dcba 654321 C:\usr\c\>
Download : 20140516-02.c ( SJIS 版 )
/* * 20140502-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; }
C:\usr\c\> 20140516-02-QQQQ 「Hello」を 3 回 Hello Hello Hello 「ハ」を 30 回 ハハハハハハハハハハハハハハハハハハハハハハハハハハハハハハ C:\usr\c\>
Download : 20140516-03.c ( SJIS 版 )
/* * 20140502-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; }
C:\usr\c\> 20140516-03-QQQQ 123 の出力 123 -123 の出力 -123 123 + 456 の出力 579 123 - 456 の出力 -333 C:\usr\c\>