当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/* * 2013/05/17 sample-001.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; }
C:\usr\c>sample-001 abcde bcde cde cde C:\usr\c>
Download : sample-002.c ( SJIS 版 )
/* * 2013/05/17 sample-002.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; }
C:\usr\c>sample-002 abcdefg bcdefg cdefg defg efg fg g xyz yz z C:\usr\c>
Download : sample-003.c ( SJIS 版 )
/* * 2013/05/17 sample-003.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; }
C:\usr\c>sample-003 Hello, World Hello, World Hello, World Hello, World 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-004.c ( SJIS 版 )
/* * 2013/05/17 sample-004.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; }
C:\usr\c>sample-004 fib 3 : *** fib 5 : ******** C:\usr\c>
Download : sample-005.c ( SJIS 版 )
/* * DATE sample-005.c */ #include <stdio.h> #include <string.h> /* strcmp に必要 */ #include "s_turtle.h" /* 亀プログラムの場合に必要 */ /* * 亀プログラム */ /* * void jump_n ( char *n ) * char *n 足跡の長さを表す * 指定された長さだけ現在向いている方向に足跡を残こさず跳ねる */ void jump_n ( char *n ) { if ( !strcmp ( n, "" ) ) { /* n が空文字列 ("") なら何もしない */ } else { s_turtle_jump(); /* とりあえず、一歩跳ねる */ jump_n ( n + 1 ); /* 文字列を短くして、再帰呼出し */ } } /* * void move_n ( char *n ) * * char *n 足跡の長さを表す * 指定された長さだけ現在向いている方向に足跡を残して歩く */ void move_n ( char *n ) { if ( !strcmp ( n, "" ) ) { /* n が空文字列 ("") なら何もしない */ } else { s_turtle_move(); /* とりあえず、一歩歩く */ move_n ( n + 1 ); /* 文字列を短くして、再帰呼出し */ } } /* * void turn_n ( char *n ) * * 現在向いている方向から時計回りに n * 45 度向きを変える */ void turn_n ( char *n ) { if ( !strcmp ( n, "" ) ) { /* n が空文字列 ("") なら何もしない */ } else { s_turtle_turn(); /* とりあえず、45 度向きをかえる */ turn_n ( n + 1 ); /* 文字列を短くして、再帰呼出し */ } } /* * void turn_90 ( void ) * * 現在向いている方向から時計回りに 90 度向きを * 進行方向の「右」に向きを変える */ void turn_90 ( void ) { turn_n ( "**" ); } /* * void turn_180 ( void ) * * 現在向いている方向から時計回りに 180 度向きを * 進行方向の「後ろ」に向きを変える */ void turn_180(void) { turn_n ( "****" ); } /* * void turn_270 ( void ) * * 現在向いている方向から時計回りに 270 度向きを * 進行方向の「左」に向きを変える */ void turn_270 ( void ) { turn_n ( "******" ); } /* * void move_n_and_turn ( char *n ) * * 現在向いている方向から n 歩進んで右を向く * 四角形の一辺を書く */ void move_n_and_turn ( char *n ) { move_n ( n ); /* 向きを変える */ turn_90(); } /* * void draw_n_sqare( char *n ); * * 一辺が n の長さの四角形を書く */ void draw_n_sqare( char *n ) { /* 「長さ n の辺を書いて右を向く」という事を 4 回繰り返す */ move_n_and_turn(n); move_n_and_turn(n); move_n_and_turn(n); move_n_and_turn(n); } /* * main */ int main ( void ) { /* * 最初は真中 (0,0) で上を向いている */ draw_n_sqare ( "********************" ); /* 長さ 20 の矩形を書く */ turn_270(); jump_n ( "****" ); /* 四歩ジャンプする */ draw_n_sqare ( "********************" ); /* 長さ 20 の矩形を書く */ turn_270(); jump_n ( "****" ); /* 四歩ジャンプする */ draw_n_sqare ( "********************" ); /* 長さ 20 の矩形を書く */ turn_270(); jump_n ( "****" ); /* 四歩ジャンプする */ draw_n_sqare ( "********************" ); /* 長さ 20 の矩形を書く */ turn_270(); jump_n ( "****" ); /* 四歩ジャンプする */ return 0; }
C:\usr\c>sample-005 C:\usr\c>
Download : sample-006.c ( SJIS 版 )
/* * 2013/05/17 sample-006.c */ /* * 文字「a」を出力する */ #include <stdio.h> void main ( void ) { putchar ( 'a' ); /* 「a」という「文字」を画面に出力 */ }
C:\usr\c>sample-006 aC:\usr\c>
Download : sample-007.c ( SJIS 版 )
/* * 2013/05/17 sample-007.c */ /* * 文字版「Hello, World」 */ #include <stdio.h> void main ( void ) { putchar ( 'H' ); putchar ( 'e' ); putchar ( 'l' ); putchar ( 'l' ); putchar ( 'o' ); putchar ( ',' ); putchar ( ' ' ); /* 空白の出力 */ putchar ( 'W' ); putchar ( 'o' ); putchar ( 'r' ); putchar ( 'l' ); putchar ( 'd' ); putchar ( '\n' ); /* 改行の出力 */ }
C:\usr\c>sample-007 Hello, World C:\usr\c>
Download : sample-008.c ( SJIS 版 )
/* * 2013/05/17 sample-008.c */ /* * エスケープコード (「\」)の利用 */ #include <stdio.h> void main ( void ) { printf ( "「\\」 を出すには 「'\\\\'」とする ==> " ); putchar ( '\\' ); printf ( "\n" ); printf ( "「'」を出すには 「'\\''」とする ==> " ); putchar ( '\'' ); printf ( "\n" ); printf ( "「ビープ音」を出すには 「'\\a'」とする ==> " ); putchar ( '\a' ); /* ここで文字は表示されず、音が出る */ printf ( "\n" ); printf ( "「\"」を出すには 「'\"'」だけでよい ==> " ); putchar ( '"' ); printf ( "\n" ); }
C:\usr\c>sample-008 「\」 を出すには 「'\\'」とする ==> \ 「'」を出すには 「'\''」とする ==> ' 「ビープ音」を出すには 「'\a'」とする ==> ^G 「"」を出すには 「'"'」だけでよい ==> " C:\usr\c>
Download : sample-009.c ( SJIS 版 )
/* * 2013/05/17 sample-009.c */ /* * 文字列 */ #include <stdio.h> void main ( void ) { printf ( "文字列\n" ); /* 「文字列」+「改行」が表示される */ }
C:\usr\c>sample-009 文字列 C:\usr\c>
Download : sample-010.c ( SJIS 版 )
/* * 2013/05/17 sample-010.c */ /* * 文字列の中のエスケープコード */ #include <stdio.h> void main ( void ) { printf ( "エスケープコード(「\\」)の扱いは、基本文字と同じ\n" ); printf ( "「\\」と出力したければ、「\\\\」とかけばよい\n" ); printf ( "文字では「'」を出すのに「\\'」としたが文字列では「'」で良い\n" ); printf ( "その代わりに文字列では「\"」を出すのには「\\\"」とする必要がある\n" ); }
C:\usr\c>sample-010 エスケープコード(「\」)の扱いは、基本文字と同じ 「\」と出力したければ、「\\」とかけばよい 文字では「'」を出すのに「\'」としたが文字列では「'」で良い その代わりに文字列では「"」を出すのには「\"」とする必要がある C:\usr\c>
Download : sample-011.c ( SJIS 版 )
/* * 2013/05/17 sample-011.c */ /* * 文字列の計算 */ #include <stdio.h> void main ( void ) { printf ( "\"abc\" に 1 を加えると \"bc\" と同じになる ==> " ); printf ( "abc" + 1 ); /* 「bc」と表示される */ printf ( "\n" ); printf ( "*\"abc\" と頭に 「*」をつけると先頭の文字 ('a') になる ==> " ); putchar ( *"abc\n" ); /* 文字列「abc」の先頭の文字「a」が表示される */ printf ( "\n" ); printf ( "\"abc\"[2] とお尻に 「[数値]」をつけると「『数値』番目の文字」になる ==> " ); /* だだし、先頭(1文字目) は 0 番目であり 「n 番目」は 「n + 1 文字目」になる */ putchar ( "abc\n"[2] ); /* 文字列「abc」の 2 番目(2+1文字目) の文字「c」が表示される */ printf ( "\n" ); if ( "abc"[0] == 'b' ) { printf ( "\"abc\"[0] と 'b' は等しいです\n" ); printf ( "実際 \"abc\"[0] は " ); putchar ( "abc"[0] ); printf ( "でした\n" ); } else { printf ( "\"abc\"[0] と 'b' は等しくないです\n" ); printf ( "実際 \"abc\"[0] は " ); putchar ( "abc"[0] ); printf ( "でした\n" ); } if ( "abc"[1] == 'b' ) { printf ( "\"abc\"[1] と 'b' は等しいです\n" ); printf ( "実際 \"abc\"[1] は " ); putchar ( "abc"[1] ); printf ( "でした\n" ); } else { printf ( "\"abc\"[1] と 'b' は等しくないです\n" ); printf ( "実際 \"abc\"[1] は " ); putchar ( "abc"[1] ); printf ( "でした\n" ); } if ( "abc"[3] == '\0' ) { printf ( "\"abc\"[3] は EOS (\\0) が入っています\n" ); } else { printf ( "\"abc\"[3] は EOS (\\9) が入っていません\n" ); } }
C:\usr\c>sample-011 "abc" に 1 を加えると "bc" と同じになる ==> bc *"abc" と頭に 「*」をつけると先頭の文字 ('a') になる ==> a "abc"[2] とお尻に 「[数値]」をつけると「『数値』番目の文字」になる ==> c "abc"[0] と 'b' は等しくないです 実際 "abc"[0] は aでした "abc"[1] と 'b' は等しいです 実際 "abc"[1] は bでした "abc"[3] は EOS (\0) が入っています C:\usr\c>
#include <stdio.h> void aisatsu ( char *kuni ) { /* if ( .. ) { .. } else if ( .. ) { .. } else { .. } */ if ( !strcmp ( kuni, "日本" ) ) { printf ( "こんにちは\n" ); } else if ( !strcmp ( kuni, "アメリカ" ) ) { printf ( "Hello\n" ); } else if ( !strcmp ( kuni, "中国" ) ) { printf ( "にいはお\n" ); } else { printf ( "あなたはどこの国のひとですか ?\n" ); } } int main ( void ) { aisatsu ( "アメリカ" ); aisatsu ( "日本" ); aisatsu ( "フランス" ); return 0; }
#include <stdio.h> int main(void){ printf ( "abc1de\n" + 3 ); return 0; }
#include <stdio.h> void notrecursive ( char *string ) { if ( !strcmp ( string, "" ) ) { printf ( "empty\n" ); } else { printf ( string ); printf ( string + 1 ); } } int main ( void ) { notrecursive ( "" ); /* -> 「empty」がでる */ notrecursive ( "abc\n" ); /* -> 「abc」 と 「bc」がでる */ return 0; }
#include <stdio.h> /* 再帰呼出のパターン 引数の文字列の長さだけ作業を行う void recFunc ( char *string ) { if ( !strcmp ( string, "" ) ) { /* 空の時の処理 ( 「なにもしない」もあり ) */ } else { /* 「何か」作業をする */ recFunc ( string + 1 ); /* 再帰呼出 */ } } */ void recursive ( char *string ) { if ( !strcmp ( string, "" ) ) { printf ( "empty\n" ); } else { printf ( string ); recursive ( string + 1 ); /* ここがポイント */ } } int main ( void ) { recursive ( "" ); /* -> 「empty」がでる */ recursive ( "abc\n" ); recursive ( "abcdefghijklmnopqrstuvwxyz\n" ); return 0; } /* recursive ( "abc\n" ); ↓ recursive ( string ); string = "abc\n" ↓ string = "abc\n" if ( !strcmp ( string, "" ) ) { printf ( "empty\n" ); } else { printf ( string ); recursive ( string + 1 ); } ↓ if ( !strcmp ( "abc\n", "" ) ) { printf ( "empty\n" ); } else { printf ( "abc\n" ); recursive ( "abc\n" + 1 ); } ↓ printf ( "abc\n" ); recursive ( "abc\n" + 1 ); ↓ printf ( "abc\n" ); recursive ( "bc\n" ); ↓ printf ( "abc\n" ); recursive ( string ); string = "bc\n" ↓ printf ( "abc\n" ); string = "bc\n" if ( !strcmp ( string, "" ) ) { printf ( "empty\n" ); } else { printf ( string ); recursive ( string + 1 ); } ↓ printf ( "abc\n" ); if ( !strcmp ( "bc\n", "" ) ) { printf ( "empty\n" ); } else { printf ( "bc\n" ); recursive ( "bc\n" + 1 ); } ↓ printf ( "abc\n" ); printf ( "bc\n" ); recursive ( "bc\n" + 1 ); ↓ printf ( "abc\n" ); printf ( "bc\n" ); recursive ( "c\n" + 1 ); ↓ printf ( "abc\n" ); printf ( "bc\n" ); printf ( "c\n" ); recursive ( "\n" + 1 ); ↓ printf ( "abc\n" ); printf ( "bc\n" ); printf ( "c\n" ); printf ( "\n" ); recursive ( "" ); ↓ printf ( "abc\n" ); printf ( "bc\n" ); printf ( "c\n" ); printf ( "\n" ); string = "" if ( !strcmp ( string, "" ) ) { printf ( "empty\n" ); } else { printf ( string ); recursive ( string + 1 ); } ↓ printf ( "abc\n" ); printf ( "bc\n" ); printf ( "c\n" ); printf ( "\n" ); if ( !strcmp ( "", "" ) ) { printf ( "empty\n" ); } else { printf ( "" ); recursive ( "" + 1 ); } ↓ printf ( "abc\n" ); printf ( "bc\n" ); printf ( "c\n" ); printf ( "\n" ); printf ( "empty\n" ); == recurcive ( "abc\n" ); -> print ( "abc\n" ); recurcive ( "bc\n" ); --> print ( "abc\n" ); print ( "bc\n" ); recurcive ( "c\n" ); --> print ( "abc\n" ); print ( "bc\n" ); print ( "c\n" ); recurcive ( "\n" ); --> print ( "abc\n" ); print ( "bc\n" ); print ( "c\n" ); print ( "\n" ); recurcive ( "" ); --> print ( "abc\n" ); print ( "bc\n" ); print ( "c\n" ); print ( "\n" ); printf ( "empty\n" ); */
#include <stdio.h> void nHoshi ( char *string ) { if ( !strcmp ( string, "" ) ) { /* なにもしない */ } else { printf ( "☆" ); /* ☆を一つ書く */ nHoshi ( string + 1 ); /* 再帰呼出 */ } } int main(void) { nHoshi( "" ); /* なにもしない */ nHoshi( "@@@@" ); /* 4 回☆を書くはず */ printf ( "\n" ); /* 改行をしてくれないので.. */ return 0; }
#include <stdio.h> void nPrint ( char *string, char *message ) { if ( !strcmp ( string, "" ) ) { /* なにもしない */ } else { printf ( message ); /* message を一つ書く */ nPrint ( string + 1, message ); /* 再帰呼出 */ } } int main(void) { nPrint( "", "abc\n" ); /* なにもしない */ nPrint( "@@@@", "abc\n" ); /* 4 回「abc」を書くはず */ nPrint( "000", "xyz\n" ); /* 3 回「xyz」を書くはず */ return 0; } #if 0 void recFunc ( char *string ) { if ( !strcmp ( string, "" ) ) { /* 空の時の処理 ( 「なにもしない」もあり ) */ } else { /* 「何か」作業をする */ recFunc ( string + 1 ); /* 再帰呼出 */ } } recFunc ( "abc" ); -> なにか ( "abc" ); recFunc ( "bc" ); -> なにか ( "abc" ); なにか ( "bc" ); recFunc ( "c" ); -> なにか ( "abc" ); なにか ( "bc" ); なにか ( "c" ); void recFunc ( char *string ) { if ( !strcmp ( string, "" ) ) { /* 空の時の処理 ( 「なにもしない」もあり ) */ } else { recFunc ( string + 1 ); /* 再帰呼出 */ /* 「何か」作業をする */ } } recFunc ( "abc" ); -> recFunc ( "bc" ); なにか ( "abc" ); -> recFunc ( "c" ); なにか ( "bc" ); なにか ( "abc" ); -> なにか ( "c" ); なにか ( "bc" ); なにか ( "abc" ); void recFunc ( char *string ) { if ( !strcmp ( string, "" ) ) { /* 空の時の処理 ( 「なにもしない」もあり ) */ } else { /* 「何か」作業をする */ recFunc ( string + 1 ); /* 再帰呼出 */ /* 「何か」作業をする */ } } #endif
#include <stdio.h> void nHoshi ( char *string ) { if ( !strcmp ( string, "" ) ) { /* なにもしない */ } else { printf ( "*" ); /* 「*」を一つ書く */ nHoshi ( string + 1 ); /* 再帰呼出 */ } } void shitaSankaku ( char *string ) { if ( !strcmp ( string, "" ) ) { /* なにもしない */ } else { nHoshi( string ); printf ( "\n" ); shitaSankaku ( string + 1 ); /* 再帰呼出 */ } } void ueSankaku ( char *string ) { if ( !strcmp ( string, "" ) ) { /* なにもしない */ } else { ueSankaku ( string + 1 ); /* 再帰呼出 */ nHoshi( string ); printf ( "\n" ); } } void piramid ( char *string ) { ueSankaku ( string + 1 ); shitaSankaku ( string ); } int main(void) { piramid ( "abc" ); return 0; }
#include <stdio.h> void nKakko ( char *string ) { if ( !strcmp ( string, "" ) ) { /* なにもしない */ } else { printf ( "(" ); nKakko ( string + 1 ); /* 再帰呼出 */ printf ( ")" ); } } int main(void) { nKakko ( "abc" ); printf ( "\n" ); nKakko ( "zzzzzzzzz" ); printf ( "\n" ); }
Download : 20130517-01.c ( SJIS 版 )
/* * 20130510-01-QQQQ.c * */ #include <stdio.h> #include "s_turtle.h" /* * */ #define EOS '\0' /* EOS を '\0' (End Of String) として使えるようにする */ /* * draw_move ( char *str ) * str の長さと同じだけ前に進む */ void draw_move ( char *str ) { /* str の長さと同じだけ前に進む */ if ( *str == EOS ) { /* str が空文字列 ( 長さ 0 ) なら.. */ /* やる事は何もない */ } else { /* そうでなければ.. */ s_turtle_move(); /* とりあえず一つだけ移動 */ /* ** この部分を完成させなさい */ } } /* * drawcoil ( char *str ) * str の長さの半分の回数の巻数の渦巻をかく */ void drawcoil ( char *str ) { if ( *str == EOS ) { /* str が空文字列 ( 長さ 0 ) なら.. */ /* やる事は何もない */ } else { /* そうでなければ.. */ /* 渦の半分を書く */ /* 渦の半分とは.. +----- | | か、 | | ----+ の事.. */ /* ** この部分を完成させなさい */ drawcoil ( str + 1 ); /* 残りは再帰で.. */ } } void main ( void ) { drawcoil ( "0123456789" ); /* 5 重の渦巻を書く */ }
C:\usr\c\> 20130517-01-QQQQ C:\usr\c\>