当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/* * 2011/05/27 sample-001.c */ /* * 最初のプログラムは "Hello, World" */ #include <stdio.h> int main ( void ) { printf ( "Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */ return 0; }
C:\usr\c\> sample-001 Hello, World C:\usr\c\>
Download : sample-002.c ( SJIS 版 )
/* * 2011/05/27 sample-002.c */ /* * おまじないだらけのプログラム */ #include <stdio.h> /* <= おまじない */ int main ( void ) { /* <= おまじない */ printf ( "Hello, World\n" ); /* ここに何かをかくと動く */ return 0; /* <= おまじない */ } /* <= おまじない */
C:\usr\c\> sample-002 Hello, World C:\usr\c\>
Download : sample-003.c ( SJIS 版 )
/* * 2011/05/27 sample-003.c */ /* * "Hello, World" を出力するが.. */ #include <stdio.h> void prt ( char *str ) { printf ( str ); } void myMain() { prt ( "Hello, World\n" ); /* この部分は sample-001.c の main と同じ */ } int main ( void ) { myMain(); return 0; } /* sample-001.c の構造 [ main -> printf ] sample-003.c の構造 main -> [ myMain -> pr ] -> printf sample-003 の「 myMain -> pr 」の部分は sample-001 の 「myMain -> pr」と同じ sample-001 の main は誰からか、勝手に呼出される sample-003 の myMain は main から呼出される sample-001 の printf は、何処でも定義していない sample-003 の prt は自分で定義している */
C:\usr\c\> sample-003 Hello, World C:\usr\c\>
Download : sample-004.c ( SJIS 版 )
/* * 2011/05/27 sample-004.c */ /* * main 関数への引数 */ #include <stdio.h> int main ( int argc, char *argv[] ) { // またまた、新しいおまじない printf ( argv[1] ); // コマンドラインの一つ目の引数が表示される return 0; }
C:\usr\c\> sample-004 C:\usr\c\>
Download : sample-005.c ( SJIS 版 )
/* * 2011/05/27 sample-005.c */ #include <stdio.h> /* * 別のファイルの関数を呼出す main 関数 */ int main () { prt ( "Hello, World\n" ); // sample-006.c の中に定義されている prt 関数を利用している return 0; }
C:\usr\c\> sample-005 Hello, World C:\usr\c\>
Download : sample-006.c ( SJIS 版 )
/* * 2011/05/27 sample-006.c */ #include <stdio.h> /* * */ void prt ( char *str ) { /* この関数は sample-005.c の main から呼出す */ printf ( str ); }
C:\usr\c\> cc -c sample-006.c C:\usr\c\>
Download : sample-007.c ( SJIS 版 )
/* * 2011/05/27 sample-007.c */ /* * include も printf も使かわない main */ int main () { return 0; }
C:\usr\c\> sample-007 C:\usr\c\>
Download : sample-008.c ( SJIS 版 )
/* * 2011/05/27 sample-008.c */ /* * include はないが printf を使う main */ int main () { printf ( "Hello, World\n" ); return 0; }
C:\usr\c\> sample-008 Hello, World C:\usr\c\>
Download : sample-009.c ( SJIS 版 )
/* * 2011/05/27 sample-009.c */ /* * include の代わりにプロトタイプ宣言をする */ extern int printf ( char * ); /* プロトタイプ宣言 */ /* * */ int main () { printf ( "Hello, World\n" ); return 0; }
C:\usr\c\> sample-009 Hello, World C:\usr\c\>
Download : sample-010.c ( SJIS 版 )
/* * 2011/05/27 sample-010.c */ /* * sample-005.c に prt のプロトタイプ宣言をした */ extern void prt ( char * ); /* prt のプロトタイプ */ /* * */ int main () { prt ( "Hello, World\n" ); // sample-006.c の中に定義されている prt 関数を利用している return 0; }
C:\usr\c\> sample-010 Hello, World C:\usr\c\>
Download : sample-011.c ( SJIS 版 )
/* * 2011/05/27 sample-011.c */ #include "prt.h" // prt のプロトタイプの代りに prt.h を include /* * */ int main () { prt ( "Hello, World\n" ); // sample-006.c の中に定義されている prt 関数を利用している return 0; }
C:\usr\c\> sample-011 Hello, World C:\usr\c\>
/* * 2011/05/27 prt.h */ extern int prt ( char * ); /* プロトタイプ宣言 */ /* * */
Download : 20110527-01.c ( SJIS 版 )
/* * 20110527-1-QQQQ.c * 余りを計算するプログラム */ #include <stdio.h> #include <string.h> /* * 余りの定義 * n, m が自然数の時に n mod m ( n を m で割った余り ) とは何か ( m > 0 ) * * n ( m > n の時 ) * n mod m { * (n-m) mod m ( その他の時 ) */ void remainder_sub ( char *n, char *m, char *mm, char *nn ) { /* ^ ^ 変化*/ /* ^^ 最初の m を記憶して、後から利用できるようにしている */ /* ^^ 割り始め n を覚えておく */ if ( !strcmp ( m, "" ) ) { /* m が 0 : 引き算が終った */ /* ** この部分を完成させなさい */ } else if ( !strcmp ( n, "" ) ) { /* n が 0 : m の方が大きかった */ printf ( nn ); /* 余りを出力 */ } else { /* ** この部分を完成させなさい */ } } /* * remainder : print ( n mod m ) */ void remainder ( char *n, char *m ) { /* ** この部分を完成させなさい */ } /* * main */ int main() { printf ( "10 mod 4 = " ); remainder ( "**********", "****" ); printf ( "\n" ); printf ( "10 mod 3 = " ); remainder ( "**********", "***" ); printf ( "\n" ); printf ( "10 mod 2 = " ); remainder ( "**********", "**" ); printf ( "\n" ); return 0; } /* remainder ( "**********", "****" ) remainder_sub ( "**********", "****", "****", "**********" ) remainder_sub ( "*********", "***", "****", "**********" ) remainder_sub ( "********", "**", "****", "**********" ) remainder_sub ( "*******", "*", "****", "**********" ) remainder_sub ( "******", "", "****", "**********" ) 10 - 4 -> 6 remainder_sub ( "******", "****", "****", "******" ) remainder_sub ( "*****", "***", "****", "******" ) remainder_sub ( "****", "**", "****", "******" ) remainder_sub ( "***", "*", "****", "******" ) remainder_sub ( "**", "", "****", "******" ) (10 - 4) - 4 -> 2 remainder_sub ( "**", "****", "****", "**" ) remainder_sub ( "*", "***", "****", "**" ) remainder_sub ( "", "**", "****", "**" ) 2 < 4 printf ( "**" ); なので答は「**」となる */
C:\usr\c\> 20110527-01 10 mod 4 = ** 10 mod 3 = * 10 mod 2 = C:\usr\c\>
Download : 20110527-02.c ( SJIS 版 )
/* * 20210527-2-QQQQ.c * ミクを歩かせて、八角形に二周目回るようにしなさい */ #include <stdio.h> #include <string.h> #include "s_walk.h" /* * 引数の文字列の長さ (n) だけ turn する */ void n_turn( char *str ) { if ( !strcmp ( str, "" ) ) { /* str が 空文字 ("") の時はすることがない */ } else { s_walk_turn(); /* とりあえず、1 回向きをかえて */ n_turn ( str + 1 ); /* 残りは再帰で処理 */ } } /* * 一度、向きをかえてから、ニ歩前に進む */ void turn_and_step() { s_walk_turn(); s_walk_move(); s_walk_move(); } /* * 引数の文字列の長さ (n) だけ turn_and_step を行う */ void n_turn_and_step( char *str ) { if ( !strcmp ( str, "" ) ) { /* str が 空文字 ("") の時はすることがない */ } else { /* ** この部分を完成させなさい */ } } /* * 八角形に歩く */ void walk_octagon() { /* ** この部分を完成させなさい */ } /* * 八角形に歩く */ // main関数 int main() { /* 向きをかえて */ n_turn( "**" ); /* 二度八角形に歩く */ walk_octagon(); walk_octagon(); /* 正面を向く */ n_turn( "******" ); return 0; }
C:\usr\c\> 20110527-02 Loading Models... Done. C:\usr\c\>