当日のOHP資料です。
c:\usr\soft> cc -I. walk2.c GLMetaseq.c pthreadVC1.lib c:\usr\soft>
c:\usr\soft> walk2 Loading Models... Done.
Download : sample-001.c ( SJIS 版 )
/* * 2011/06/17 sample-001.c */ /* * double */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ #define ABC 123 /* 定数名 「ABC」を定義し、その値を「123」としている */ #define MYNAME "栗野俊一" /* 定数名 「MYNAME」を定義し、その値を「"栗野俊一"」としている */ /* * */ int main ( void ) { s_print_int ( 123 ); /* もちろん、「123」と出力される */ s_print_newline (); s_print_int ( ABC ); /* 定数名 「ABC」の参照、上記と同じく「123」と出力される */ s_print_newline (); s_print_string ( MYNAME ); /* 「"MYNAME"」でない事に注意 */ s_print_newline (); return 0; } /* * */
C:\usr\c\> sample-001 123 123 栗野俊一 C:\usr\c\>
Download : sample-002.c ( SJIS 版 )
/* * 2011/06/17 sample-001.c */ /* * double */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ int main ( void ) { s_print_string ( "小数点数付きの数をキーボードから入力してください。その数を二倍にします : " ); s_print_double ( s_input_double() * 2.0 ); s_print_newline(); return 0; } /* * */
12.34
C:\usr\c\> sample-002 C:\usr\c\>
Download : sample-003.c ( SJIS 版 )
/* * 2011/06/17 sample-003.c */ /* * double */ #include <stdio.h> #include <math.h> /* 数学関数を利用する場合はこれを追加する */ #include "s_print.h" #include "s_input.h" /* * */ void plot_dot_sub ( double pos, double value ) { if ( pos >= value ) { /* 印刷位置まだきた */ s_print_char ( '*' ); /* 「点」を出力 */ s_print_newline (); /* この行は終り */ } else { s_print_char ( ' ' ); /* 空白を出力 */ plot_dot_sub ( pos + 1.0, value ); /* 続きを計算 */ } } /* * 0 〜 79 で、 -1.0 〜 1.0 を表現するには、 * x | -1.0 〜 1.0 | x * --+-------------+--------------- * y | 0 〜 79 | ( x + 1 ) * 40 */ #define WIDTH 80.0 /* 一行の中のカラム数を定義 */ void plot_dot ( double value ) { plot_dot_sub ( 0.0, ( value + 1.0 ) * WIDTH/2.0 ); } /* * */ void print_sin_curve( double top, double end, double step ) { if ( top >= end ) { /* 何もする必要はない */ } else { plot_dot ( sin ( top ) ); /* sin は正弦関数 */ print_sin_curve ( top + step, end, step ); /* 次のステップを実行 */ } } /* * */ #define PI 3.141592 int main ( void ) { print_sin_curve( 0, 2 * PI, 0.1 ); /* PI は 円周率 */ return 0; } /* * */
C:\usr\c\> sample-003 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * C:\usr\c\>
Download : sample-004.c ( SJIS 版 )
/* * 2011/06/17 sample-004.c */ /* * double */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ int main ( void ) { s_print_string ( "13/3 = " ); s_print_int ( 13/3 ); /* 整数同士の割り算の結果は整数になる */ s_print_newline (); s_print_string ( "13.0/3.0 = " ); s_print_double ( 13.0/3.0 ); /* 浮動小数点数同士の割り算の結果は浮動小数点数同士になる */ s_print_newline (); s_print_string ( "13.0/3 = " ); s_print_double ( 13.0/3 ); /* 浮動小数点数が含まれると、整数は浮動小数点に変換されてから計算される */ s_print_newline (); s_print_string ( "13/3.0 = " ); s_print_double ( 13/3.0 ); /* 浮動小数点数が含まれると、整数は浮動小数点に変換されてから計算される */ s_print_newline (); return 0; } /* * */
C:\usr\c\> sample-004 C:\usr\c\>
Download : sample-005.c ( SJIS 版 )
/* * 2011/06/17 sample-005.c */ /* * double */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ int main ( void ) { /* int */ s_print_string ( "Int Print : \n" ); s_print_int ( 1.0 ); /* 浮動小数点数を整数として出力しても... うまくゆかない */ s_print_newline (); s_print_int ( (int)1.0 ); /* 「(int)」で、キャスト(型変換)すればよい */ s_print_newline (); /* double */ s_print_string ( "Double Print : \n" ); s_print_double ( (double)1 ); /* 「(double)」で、キャスト(型変換)すればよい */ s_print_newline (); s_print_double ( 1 * 1.0 ); /* 浮動小数点数との計算をしても自動的に変換される */ s_print_newline (); return 0; } /* * */
C:\usr\c\> sample-005 C:\usr\c\>
Download : sample-006.c ( SJIS 版 )
/* * 2011/06/17 sample-006.c */ /* * char * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ int main ( void ) { s_print_char ( * "abc" ); /* 文字列 「"abc"」の最初の文字を取り出す */ s_print_newline(); s_print_char ( * ( "abc" + 1 ) ); /* 文字列 「"abc"」の次の文字を取り出す */ s_print_newline(); s_print_char ( "abc"[0] ); /* 文字列 「"abc"」の最初の文字を取り出す */ s_print_newline(); s_print_char ( * ( "abc" + 1 ) ); /* 文字列 「"abc"」の次の文字を取り出す */ s_print_newline(); s_print_int ( * ( "abc" + 3 ) ); /* 文字列 「"abc"」の末尾には、'\0' == 0 が入っている。 */ s_print_newline(); return 0; } /* * */
C:\usr\c\> sample-006 a b a b 0 C:\usr\c\>
Download : sample-007.c ( SJIS 版 )
/* * 2011/06/17 sample-007.c */ /* * char * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ #define EOS '\0' /* End Of String */ void my_print_string ( char *str ) { if ( *str == EOS ) { /* もうプリントする文字は存在しない */ } else { s_print_char ( *str ); /* 先頭の文字を出力し .. */ my_print_string ( str + 1 ); /* 残りを出せばよい */ } } /* * */ int main ( void ) { my_print_string ( "abc" ); s_print_newline(); my_print_string ( "xyz" ); s_print_newline(); return 0; } /* * */
C:\usr\c\> sample-007 abc xyz C:\usr\c\>
Download : sample-008.c ( SJIS 版 )
/* * 2011/06/17 sample-008.c */ /* * char * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ #define EOS '\0' void print_address_and_char ( char *string ) { if ( *string == EOS ) { /* 文字列の最後 */ s_print_hex ( string ); /* アドレスの表示 */ s_print_string ( " : " ); s_print_int ( *string ); /* 文字コードの表示 */ s_print_newline(); } else { s_print_hex ( string ); /* アドレスの表示 */ s_print_string ( " : " ); s_print_int ( *string ); /* 文字コードの表示 */ s_print_string ( " : " ); s_print_char ( *string ); /* 文字の表示 */ s_print_newline(); print_address_and_char ( string + 1 ); /* 残りの表示 */ } } /* * */ int main ( void ) { s_print_string ( "abc" ); s_print_newline(); print_address_and_char ( "abc" ); s_print_string ( "1234" ); s_print_newline(); print_address_and_char ( "1234" ); return 0; } /* * */
C:\usr\c\> sample-008 abc 8048b27 : 97 : a 8048b28 : 98 : b 8048b29 : 99 : c 8048b2a : 0 1234 8048b2b : 49 : 1 8048b2c : 50 : 2 8048b2d : 51 : 3 8048b2e : 52 : 4 8048b2f : 0 C:\usr\c\>
Download : sample-009.c ( SJIS 版 )
/* * 2011/06/17 sample-009.c */ /* * char * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ #define EOS '\0' int string_to_int_sub ( char *string, int value ) { if ( *string == EOS ) { /* 文字列の最後 */ return value; } else { return string_to_int_sub ( string + 1, value * 10 + ( *string - '0' ) ); } } int string_to_int ( char *string ) { return string_to_int_sub ( string, 0 ); } /* * */ int main ( void ) { s_print_int ( string_to_int ( "123" ) ); s_print_newline(); return 0; } /* * */
C:\usr\c\> sample-009 123 C:\usr\c\>
Download : sample-010.c ( SJIS 版 )
/* * 2011/06/17 sample-010.c */ /* * char * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ void too_may_int_args ( int v0, int v1, int v2, int v3, int v4, int v5, int v6, int v7, int v8, int v9 ) { s_print_int ( v0 ); s_print_newline(); s_print_int ( v1 ); s_print_newline(); s_print_int ( v2 ); s_print_newline(); s_print_int ( v3 ); s_print_newline(); s_print_int ( v4 ); s_print_newline(); s_print_int ( v5 ); s_print_newline(); s_print_int ( v6 ); s_print_newline(); s_print_int ( v7 ); s_print_newline(); s_print_int ( v8 ); s_print_newline(); s_print_int ( v9 ); s_print_newline(); } /* * */ int main ( void ) { too_may_int_args ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ); return 0; } /* * */
C:\usr\c\> sample-010 0 1 2 3 4 5 6 7 8 9 C:\usr\c\>
Download : sample-011.c ( SJIS 版 )
/* * 2011/06/17 sample-010.c */ /* * char * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ void too_may_int_args ( int v0, int v1, int v2, int v3, int v4, int v5, int v6, int v7, int v8, int v9 ) { s_print_hex ( &v0 ); /* v0 には 0 が入っているが、その 0 が入っている場所 (アドレス) は &v0 で得られる */ s_print_newline(); s_print_hex ( &v1 ); /* 変数 v1 は、メモリのどこの部分(アドレスで示される)に対応するかが判る */ s_print_newline(); s_print_hex ( &v2 ); s_print_newline(); s_print_hex ( &v3 ); s_print_newline(); s_print_hex ( &v4 ); s_print_newline(); s_print_hex ( &v5 ); s_print_newline(); s_print_hex ( &v6 ); s_print_newline(); s_print_hex ( &v7 ); s_print_newline(); s_print_hex ( &v8 ); s_print_newline(); s_print_hex ( &v9 ); s_print_newline(); } /* * */ int main ( void ) { too_may_int_args ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ); return 0; } /* * */
C:\usr\c\> sample-011 bfaf7950 bfaf7954 bfaf7958 bfaf795c bfaf7960 bfaf7964 bfaf7968 bfaf796c bfaf7970 bfaf7974 C:\usr\c\>
Download : sample-012.c ( SJIS 版 )
/* * 2011/06/17 sample-010.c */ /* * char * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ void too_may_int_args ( int v0, int v1, int v2, int v3, int v4, int v5, int v6, int v7, int v8, int v9 ) { s_print_string ( "&v0" ); s_print_newline(); s_print_hex ( &v0 ); s_print_newline(); s_print_string ( "&v0+1" ); s_print_newline(); s_print_hex ( &v0 + 1 ); s_print_newline(); s_print_string ( "&v1" ); s_print_newline(); s_print_hex ( &v1 ); s_print_newline(); s_print_string ( "v1" ); s_print_newline(); s_print_int ( v1 ); s_print_newline(); s_print_int ( *(&v1) ); /* '*' を付けると、その場所の、その型のデータを取り出す */ s_print_newline(); /* v1 は int 型の変数なので &v1 は int 型のデータがある場所のアドレスになる */ /* 「*(&v1)」は v1 のアドレスの所にある v1 と同じ型のデータを取り出すので、 */ /* 「v1」と同じ意味 */ s_print_int ( *(&v0 + 1) ); /* 「&v0」は v0 のアドレスになる / v0 は int 型なので int \ のデータが入っている*/ /* 「&v0 + 1」 は、int 型なので、アドレスは 4 ( int が一つ入るサイズ ) だけ増える */ /* このアドレスは、実は、次の変数である 「&v1」と同じもの */ /* 結局 「*(&v0 + 1)」==「*(&v1)」==「v1」と同じ */ } /* * */ int main ( void ) { too_may_int_args ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ); return 0; } /* * */
C:\usr\c\> sample-012 &v0 bf844c90 &v0+1 bf844c94 &v1 bf844c94 v1 1 1 1C:\usr\c\>
Download : sample-013.c ( SJIS 版 )
/* * 2011/06/17 sample-012.c */ /* * char * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ void print_int_args ( int *top ) { if ( *top == 9 ) { /* 最後は 9 が入っているはず.. */ s_print_int ( *top ); s_print_newline(); } else { s_print_int ( *top ); s_print_newline(); print_int_args ( top + 1 ); } } /* * */ void too_may_int_args ( int v0, int v1, int v2, int v3, int v4, int v5, int v6, int v7, int v8, int v9 ) { print_int_args ( &v0 ); } /* * */ int main ( void ) { too_may_int_args ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ); return 0; } /* * */
C:\usr\c\> sample-013 0 1 2 3 4 5 6 7 8 9 C:\usr\c\>
Download : sample-014.c ( SJIS 版 )
/* * 2011/06/17 sample-014.c */ /* * char * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ int main ( void ) { s_print_string ( "abc" ); /* 「abc」が出力される */ s_print_newline(); s_print_string ( "abc" + 1 ); /* 1文字みじかくなった 「bc」が出力される */ s_print_newline(); s_print_string ( "abc" + 2 ); /* 「c」が出力される */ s_print_newline(); s_print_string ( "abc" + 3 ); /* 「」が出力される */ s_print_newline(); return 0; } /* * */
C:\usr\c\> sample-014 abc bc c C:\usr\c\>
Download : sample-015.c ( SJIS 版 )
/* * 2011/06/17 sample-015.c */ /* * char * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ void print_top_of_string ( char *string ) { /* char (*string) */ s_print_char ( *string ); /* print_top_of_string ( "abc" ); => \ s_print_char ( * "abc" ); */ } void print_top_of_string2 ( char *string ) { /* char (*string) */ s_print_char ( string[0] ); /* print_top_of_string ( "abc" ); => \ s_print_char ( * "abc" ); */ /* X[0] == *X == *(X+0) X[n] == *(X+n) X[n] : X が何かの並びの時の n + 1 番目の要素 ( n は 0 から始まり、0 の時先頭の要素 ) 特に、「文字列」は、「文字の並び」なので、[n] で (n+1) 番目の文字が得られる */ } /* * */ int main ( void ) { print_top_of_string ( "abc" ); s_print_newline(); print_top_of_string ( "xyz" ); s_print_newline(); print_top_of_string2 ( "abc" ); s_print_newline(); print_top_of_string2 ( "xyz" ); s_print_newline(); return 0; } /* * */
C:\usr\c\> sample-015 a x a x C:\usr\c\>
Download : sample-016.c ( SJIS 版 )
/* * 2011/06/17 sample-016.c */ /* * 桁数を求める */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * num は非負の整数とする */ int keta ( int num ) { if ( num < 10 ) { /* 10 より小さい場合は */ return 1; /* 1 桁 */ } else { /* そうでない場合は.. */ return 1 + keta ( num / 10 ); /* 一桁目を取り除いた数の桁を求めて 1 を加えれば全体の桁数 */ } } /* * */ int main ( void ) { s_print_string ( "123 は " ); s_print_int ( keta ( 123 ) ); s_print_string ( "桁です。" ); s_print_newline(); s_print_string ( "99999 は " ); s_print_int ( keta ( 99999 ) ); s_print_string ( "桁です。" ); s_print_newline(); return 0; } /* * */
C:\usr\c\> sample-016 123 は 3桁です。 99999 は 5桁です。 C:\usr\c\>
Download : sample-017.c ( SJIS 版 )
/* * 2011/06/17 sample-017.c */ /* * */ #include <stdio.h> #include "s_print.h" /* * +----------+ * "abc" ---> 0x80487cf | 'a' | * +----------+ * | 'b' | 0x80487cf + 1 <-------+ * +----------+ | * | 'c' | 0x80487cf + 2 | * +----------+ | * | '\0' | 0x80487cf + 3 | * +----------+ | * | | | * "abc" + 1 == 0x80487cf + 1 == 0x80487d0 -------------------------+ */ int main ( void ) { s_print_hex ( "abc" ); /* 文字列 "abc" のある場所(アドレス)の出力 */ s_print_newline(); s_print_char ( *((char*)0x80487cf+1) ); s_print_newline(); return 0; } /* * */
C:\usr\c\> sample-017 80487cf b C:\usr\c\>
Download : sample-018.c ( SJIS 版 )
/* * 2011/06/17 sample-018.c */ #include <stdio.h> #include "s_print.h" #define EOS '\0' /* * 課題 2 は * "abc" -> 3 文字 * "日本語" -> 6 文字でよい * * でも、漢字一文字は一文字と感ぞえたい場合は、例えば、次のようにする。 */ int count_warry_about_japanese ( char *str ) { if ( *str == EOS ) { /* この時は、SJIS でも ASCII でも 0 文字 */ return 0; } else { if ( (unsigned char)*str < 128 ) { /* 128 より小さいならば ASCII Code だろう.. */ return count_warry_about_japanese ( str + 1 ) + 1; } else { /* ASCII でないので、漢字と信じる事にする */ return count_warry_about_japanese ( str + 2 ) + 1; /* 2 文字分短くする */ } /* 厳密には、「半角カナ」があるので、これだと正しくない.. */ } } main() { s_print_int ( count_warry_about_japanese ( "abc" ) ); /* => 3 */ s_print_newline(); s_print_int ( count_warry_about_japanese ( "日本" ) ); /* => 2 */ s_print_newline(); }
C:\usr\c\> sample-018 3 2 C:\usr\c\>
Download : 20110617-01.c ( SJIS 版 )
/* * 20110617-1-QQQQ.c * cos のグラフ */ #include <stdio.h> #include <math.h> /* 数学関数を利用する場合はこれを追加する */ #include "s_print.h" #include "s_input.h" /* * */ void plot_dot_sub ( double pos, double value ) { if ( pos >= value ) { /* 印刷位置まだきた */ s_print_char ( '*' ); /* 「点」を出力 */ s_print_newline (); /* この行は終り */ } else { s_print_char ( ' ' ); /* 空白を出力 */ plot_dot_sub ( pos + 1.0, value ); /* 続きを計算 */ } } /* * 0 〜 79 で、 -1.0 〜 1.0 を表現するには、 * x | -1.0 〜 1.0 | x * --+-------------+--------------- * y | 0 〜 79 | ( x + 1 ) * 40 */ #define WIDTH 80.0 /* 一行の中のカラム数を定義 */ void plot_dot ( double value ) { plot_dot_sub ( 0.0, ( value + 1.0 ) * WIDTH/2.0 ); } /* * */ void print_cos_curve( double top, double end, double step ) { if ( top >= end ) { /* 何もする必要はない */ } else { /* ** この部分を完成させなさい */ } } /* * */ #define PI 3.141592 int main ( void ) { print_cos_curve( 0, 2 * PI, 0.1 ); /* PI は 円周率 */ return 0; } /* * */
C:\usr\c\> 20110617-01 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * C:\usr\c\>
Download : 20110617-02.c ( SJIS 版 )
/* * 20110617-2-QQQQ.c * */ #include <stdio.h> #include "s_print.h" /* * */ #define EOS '\0' /* End Of String */ int my_string_length ( char *str ) { if ( *str == EOS ) { /* "" は 長さ 0 */ /* ** この部分を完成させなさい return 0; /* 長さは 0 */ */ } else { /* 残りの長さ + 1 */ /* ** この部分を完成させなさい return ????; */ } } /* * */ int main ( void ) { s_print_int ( my_string_length ( "abc" ) ); /* 3 と表示されるはず */ s_print_newline(); return 0; } /* * */
C:\usr\c\> 20110617-02 3 C:\usr\c\>