当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/* * 2011/06/03 sample-001.c */ /* * 整数の扱い */ #include <stdio.h> #include "s_print.h" int main ( void ) { s_print_int ( 1 ); /* 整数 1 を出力する */ s_print_newline(); /* 改行 */ return 0; }
C:\usr\c\> sample-001 1 C:\usr\c\>
Download : sample-002.c ( SJIS 版 )
/* * 2011/06/03 sample-002.c */ /* * 整数と文字列の扱い */ #include <stdio.h> #include "s_print.h" int main ( void ) { s_print_int ( 123 ); /* 整数 123 を出力する */ s_print_newline(); /* 改行 */ s_print_string ( "123" ); /* 文字列 "123" を出力する */ s_print_newline(); /* 改行 */ return 0; }
C:\usr\c\> sample-002 123 123 C:\usr\c\>
Download : sample-003.c ( SJIS 版 )
/* * 2011/06/03 sample-003.c */ /* * 整数と文字列と取り違えると .. ? */ #include <stdio.h> #include "s_print.h" int main ( void ) { s_print_int ( "123" ); /* 文字列を整数として出力しようとした */ s_print_newline(); /* 改行 */ s_print_string ( 123 ); /* 整数を文字列として出力しようとした */ s_print_newline(); /* 改行 */ return 0; }
C:\usr\c\> sample-003 C:\usr\c\>
Download : sample-004.c ( SJIS 版 )
/* * 2011/06/03 sample-004.c */ /* * 関数に整数を渡す */ #include <stdio.h> #include "s_print.h" /* * 同じ整数を二度出力する */ void print_int_two ( int n ) { // 引数が整数なので、引数の宣言は int になる s_print_int ( n ); s_print_newline(); s_print_int ( n ); s_print_newline(); } /* * main */ int main ( void ) { s_print_int_two ( 123 ); /* 整数 123 を二度出力する */ return 0; }
C:\usr\c\> sample-004 C:\usr\c\>
Download : sample-005.c ( SJIS 版 )
/* * 2011/06/03 sample-005.c */ /* * 整数の計算 */ #include <stdio.h> #include "s_print.h" /* * 二つの和を出力する */ void print_int_wa ( int n, int m ) { s_print_int ( n ); s_print_string ( " と " ); s_print_int ( m ); s_print_string ( " の和は " ); s_print_int ( n + m ); s_print_string ( " です。" ); s_print_newline(); } /* * main */ int main ( void ) { print_int_wa ( 123, 957 ); print_int_wa ( -21, 45 ); return 0; }
C:\usr\c\> sample-005 123 と 957 の和は 1080 です。 -21 と 45 の和は 24 です。 C:\usr\c\>
Download : sample-006.c ( SJIS 版 )
/* * 2011/06/03 sample-006.c */ /* * 整数の大小比較 */ #include <stdio.h> #include "s_print.h" /* * 二つの比較結果を出力する */ void print_int_compare ( int n, int m ) { s_print_int ( n ); s_print_string ( " と " ); s_print_int ( m ); s_print_string ( " では " ); if ( n > m ) { /* n の方が大きければ.. */ s_print_int ( n ); } else { s_print_int ( m ); } s_print_string ( " の方が大きい。" ); s_print_newline(); } /* * main */ int main ( void ) { print_int_compare ( 10, 20 ); print_int_compare ( 40, 30 ); print_int_compare ( 4, -4 ); return 0; }
C:\usr\c\> sample-006 10 と 20 では 20 の方が大きい。 40 と 30 では 40 の方が大きい。 4 と -4 では 4 の方が大きい。 C:\usr\c\>
Download : sample-007.c ( SJIS 版 )
/* * 2011/06/03 sample-007.c */ /* * 整数の等号比較 ( == を使う ) */ #include <stdio.h> #include "s_print.h" /* * 二つの比較結果を出力する */ void print_int_equal ( int n, int m ) { s_print_int ( n ); s_print_string ( " と " ); s_print_int ( m ); s_print_string ( " は等し" ); if ( n == m ) { /* n と m は等しい */ s_print_string ( "い" ); } else { s_print_string ( "くない" ); } s_print_string ( "です。" ); s_print_newline(); } /* * main */ int main ( void ) { print_int_equal ( 10, 20 ); print_int_equal ( 30, 30 ); return 0; }
C:\usr\c\> sample-007 10 と 20 は等しくないです。 30 と 30 は等しいです。 C:\usr\c\>
Download : sample-008.c ( SJIS 版 )
/* * 2011/06/03 sample-008.c */ /* * 整数の等号比較 ( != を使う ) */ #include <stdio.h> #include "s_print.h" /* * 二つの比較結果を出力する */ void print_int_equal ( int n, int m ) { s_print_int ( n ); s_print_string ( " と " ); s_print_int ( m ); s_print_string ( " は等し" ); if ( n != m ) { /* n と m は等しくない */ s_print_string ( "くない" ); } else { s_print_string ( "い" ); } s_print_string ( "です。" ); s_print_newline(); } /* * main */ int main ( void ) { print_int_equal ( 10, 20 ); print_int_equal ( 30, 30 ); return 0; }
C:\usr\c\> sample-008 10 と 20 は等しくないです。 30 と 30 は等しいです。 C:\usr\c\>
Download : sample-009.c ( SJIS 版 )
/* * 2011/06/03 sample-009.c */ /* * 再帰と整数 */ #include <stdio.h> #include "s_print.h" /* * n から 1 までを出力する */ void print_n_to_one ( int n ) { if ( n == 0 ) { /* n が 0 の時 */ /* なにもしなくてよい */ } else { /* そうでなければ... */ s_print_int ( n ); /* n を出し.. */ s_print_newline(); print_n_to_one ( n - 1 ); /* 再帰で残りをする */ } } /* * main */ int main ( void ) { s_print_string ( "5 〜 1 : \n" ); print_n_to_one ( 5 ); /* 5 〜 1 を出力 */ s_print_newline(); s_print_string ( "10 〜 1 : \n" ); print_n_to_one ( 10 ); /* 10 〜 1 を出力 */ return 0; }
C:\usr\c\> sample-009 5 〜 1 : 5 4 3 2 1 10 〜 1 : 10 9 8 7 6 5 4 3 2 1 C:\usr\c\>
Download : sample-010.c ( SJIS 版 )
/* * 2011/06/03 sample-010.c */ /* * 総和の計算 */ #include <stdio.h> #include "s_print.h" /* * n から 1 までを sum に加えた結果を出力する */ void print_n_to_one_sum_sub ( int n, int sum ) { if ( n == 0 ) { /* n が 0 の時 */ /* もう計算しなくてもよいので結果を出力 */ s_print_string ( "合計は " ); s_print_int ( sum ); s_print_string ( "です。" ); s_print_newline(); } else { /* そうでなければ... */ print_n_to_one_sum_sub ( n - 1, sum + n ); /* 再帰処理 */ } } void print_n_to_one_sum ( int n ) { print_n_to_one_sum_sub ( n, 0 ); /* 最初は 1 〜 n を 0 に加える */ } /* * main */ int main ( void ) { s_print_string ( "1 から 5 : " ); print_n_to_one_sum ( 5 ); s_print_string ( "1 から 10 : " ); print_n_to_one_sum ( 10 ); return 0; }
C:\usr\c\> sample-010 1 から 5 : 合計は 15です。 1 から 10 : 合計は 55です。 C:\usr\c\>
Download : sample-011.c ( SJIS 版 )
/* * 2011/06/03 sample-011.c */ /* * 何かを n 回繰り返す */ #include <stdio.h> #include "s_print.h" /* * 文字列を 10 回出力する */ void print_string_n_times ( int n, char *str ) { if ( n == 0 ) { /* n が 0 の時 */ /* 仕事はすんだので何もしない */ } else { /* そうでなければ... */ s_print_string ( str ); /* 取りあえず、文字列を出力し.. */ print_string_n_times ( n - 1, str ); /* 再帰処理 */ } } /* * main */ int main ( void ) { print_string_n_times ( 3, "Hello, World\n" ); /* "Hello, World\n" を 3 回出力 \ */ print_string_n_times ( 5, "こんにちは\n" ); /* "こんにちは\n" を 5 回出力 */ return 0; }
C:\usr\c\> sample-011 Hello, World Hello, World Hello, World こんにちは こんにちは こんにちは こんにちは こんにちは C:\usr\c\>
Download : sample-012.c ( SJIS 版 )
/* * 2011/06/03 sample-012.c */ /* * 何かを n 回繰り返す */ #include <stdio.h> #include "s_print.h" /* * "*" を n 回出力 */ void print_asta_n_times ( int n ) { if ( n == 0 ) { /* n が 0 の時 */ /* 仕事はすんだので何もしない */ } else { /* そうでなければ... */ s_print_string ( "*" ); /* 取りあえず、"*" 出力し.. */ print_asta_n_times ( n - 1 ); /* 再帰処理 */ } } void print_triangle ( int n ) { if ( n == 0 ) { /* n が 0 の時 */ /* 仕事はすんだので何もしない */ } else { /* そうでなければ... */ print_asta_n_times ( n ); /* アスタリスクを n 個出力 */ s_print_newline(); print_triangle ( n - 1 ); /* 再帰処理 */ } } /* * main */ int main ( void ) { print_triangle ( 3 ); s_print_newline(); print_triangle ( 5 ); return 0; }
C:\usr\c\> sample-012 *** ** * ***** **** *** ** * C:\usr\c\>
Download : sample-013.c ( SJIS 版 )
/* * 2011/06/03 sample-013.c */ #include <stdio.h> #include "s_print.h" /* * ペアノの公理 (自然数の定義) * i) 0 は自然数 * ii) x が自然数ならば x + 1 も自然数 * iii) i) と ii) 以外に自然数はない */ /* * 和の定義 * n, m が自然数の時に n + m とは何か * * m ( n が 0 の時 ) * n + m { * ( x + m ) + 1 ( n = x + 1 の時 ) */ /* * a と b の和を計算する */ void addition ( int n, int m ) { if ( n == 0 ) { /* n が 0 の時 */ s_print_int ( m ); } else { addition ( n - 1, m + 1 ); /* x + m を計算 */ } } main() { addition ( 3, 4 ); printf ( "\n" ); addition ( 5, 9 ); printf ( "\n" ); /* 足し算をする */ }
C:\usr\c\> sample-013 7 14 C:\usr\c\>
Download : sample-014.c ( SJIS 版 )
/* * 2011/06/03 sample-014.c */ #include <stdio.h> #include "s_print.h" /* * 積の定義 * n, m が自然数の時に n * m とは何か * * 0 ( n が 0 の時 ) * n + m { * ( x * m ) + m ( n = x + 1 の時 ) */ /* * n と m のかけ算 */ void multiply_sub ( int n, int m, int mul ) { if ( n == 0 ) { /* n が 0 の時 */ s_print_int ( mul ); /* 結果を出力 */ } else { multiply_sub ( n - 1, m, mul + m ); /* x * m を計算 */ } } void multiply ( int n, int m ) { multiply_sub ( n, m, 0 ); } main() { multiply ( 3, 4 ); s_print_newline(); multiply ( 5, 8 ); s_print_newline(); }
C:\usr\c\> sample-014 12 40 C:\usr\c\>
Download : sample-015.c ( SJIS 版 )
/* * 2011/06/03 sample-015.c */ #include <stdio.h> #include "s_print.h" /* * 引き算の定義 * n, m が自然数の時に n - m とは何か ( n >= m ) * * n ( m が 0 の時 ) * n - m { * y - x ( m = x + 1 の時 ) * ( n = y + 1 の時 ) */ /* * n と m の差 */ void diffirence ( int n, int m ) { if ( m == 0 ) { /* m が 0 の時 */ s_print_int ( n ); } else { diffirence ( n - 1, m - 1 ); /* y - x を計算 */ } } main() { diffirence ( 7, 3 ); printf ( "\n" ); diffirence ( 13, 8 ); printf ( "\n" ); }
C:\usr\c\> sample-015 4 5 C:\usr\c\>
Download : 20110603-01.c ( SJIS 版 )
/* * 20110603-1-QQQQ.c * 余りを計算するプログラム */ #include <stdio.h> #include "s_print.h" /* * 余りの定義 * n, m が自然数の時に n mod m ( n を m で割った余り ) とは何か ( m > 0 ) * * n ( m > n の時 ) * n mod m { * (n-m) mod m ( その他の時 ) */ void remainder_sub ( int n, int m, int mm, int nn ) { /* ^ ^ 変化*/ /* ^^ 最初の m を記憶して、後から利用できるようにしている */ /* ^^ 割り始め n を覚えておく */ if ( m == 0 ) { /* m が 0 : 引き算が終った */ /* ** この部分を完成させなさい */ } else if ( n == 0 ) { /* n が 0 : m の方が大きかった */ s_print_int ( nn ); /* 余りを出力 */ } else { /* ** この部分を完成させなさい */ } } /* * remainder : print ( n mod m ) */ void remainder ( int n, int m ) { /* ** この部分を完成させなさい */ } /* * main */ int main() { printf ( "10 mod 4 = " ); remainder ( 10, 4 ); printf ( "\n" ); printf ( "10 mod 3 = " ); remainder ( 10, 3 ); printf ( "\n" ); printf ( "10 mod 2 = " ); remainder ( 10, 2 ); printf ( "\n" ); return 0; }
C:\usr\c\> 20110603-01 10 mod 4 = 2 10 mod 3 = 1 10 mod 2 = 0 C:\usr\c\>
Download : 20110603-02.c ( SJIS 版 )
/* * 20210603-2-QQQQ.c * 忍者を歩かせて、八角形に二周目回るようにしなさい */ #include <stdio.h> #include "s_ninja.h" /* * 引数 n だけ turn する */ void n_turn( int n ) { if ( n == 0 ) { /* n が 0 のときはなにもしなくてよい */ } else { s_ninja_turn(); /* とりあえず、1 回向きをかえて */ n_turn ( n - 1 ); /* 残りは再帰で処理 */ } } /* * 一度、向きをかえてから、ニ歩前に進む */ void turn_and_step() { s_ninja_turn(); s_ninja_move(); s_ninja_move(); } /* * 引数 n だけ turn_and_step を行う */ void n_turn_and_step( int n ) { if ( n == 0 ) { /* n が 0 のときはなにもしなくてよい */ } else { /* ** この部分を完成させなさい */ } } /* * 八角形に歩く */ void walk_octagon() { /* ** この部分を完成させなさい */ } /* * 八角形に歩く */ // main関数 int main() { /* 向きをかえて */ n_turn( 2 ); /* 二度八角形に歩く */ walk_octagon(); walk_octagon(); /* 正面を向く */ n_turn( 6 ); return 0; }
C:\usr\c\> 20110603-02 Loading Models... Done. C:\usr\c\>