当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/* * 2011/11/04 sample-001.c */ /* * */ #include <stdio.h> #include "s_print.h" /* * n から 1 までの整数を出力し、改行する */ void printn1 ( int n ) { while ( n > 0 ) { /* n が 0 より大きい間繰り返す */ /* 繰返し部分 */ s_print_int ( n ); s_print_string ( " " ); n--; /* n = n - 1 : 状態を変化させる */ } s_print_newline(); } /* * */ int main ( void ) { s_print_string ( "5 から 1 まで出力 : " ); printn1 ( 5 ); s_print_string ( "10 から 1 まで出力 : " ); printn1 ( 10 ); return 0; } /* * */
C:\usr\c\> sample-001 5 から 1 まで出力 : 5 4 3 2 1 10 から 1 まで出力 : 10 9 8 7 6 5 4 3 2 1 C:\usr\c\>
Download : sample-002.c ( SJIS 版 )
/* * 2011/11/04 sample-002.c */ /* * */ #include <stdio.h> #include "s_print.h" /* * n から 1 までの整数を出力し、改行する ( 再帰版 ) */ void printn1_sub ( int n ) { if ( n > 0 ) { /* while が if に変化 */ /* 繰返し部分はそのまま */ s_print_int ( n ); s_print_string ( " " ); n--; printn1_sub ( n ); /* 最後に再帰呼び出し */ } } /* * n から 1 までの整数を出力し、改行する ( 再帰版 ) */ void printn1 ( int n ) { printn1_sub ( n ); /* while 文が再帰関数になる */ s_print_newline(); } /* * */ int main ( void ) { s_print_string ( "5 から 1 まで出力 : " ); printn1 ( 5 ); s_print_string ( "10 から 1 まで出力 : " ); printn1 ( 10 ); return 0; } /* * */
C:\usr\c\> sample-002 5 から 1 まで出力 : 5 4 3 2 1 10 から 1 まで出力 : 10 9 8 7 6 5 4 3 2 1 C:\usr\c\>
Download : sample-003.c ( SJIS 版 )
/* * 2011/11/04 sample-003.c */ /* * */ #include <stdio.h> #include "s_print.h" /* * 1 から n までの整数を出力し、改行する * 変数 i を制御変数として利用する while 文 */ void print1n ( int n ) { int i = 1; /* 初期化 */ while ( i <= n ) { /* 条件判定 */ /* 処理本体 */ s_print_int ( i ); s_print_string ( " " ); i++; /* 値の変更 */ } s_print_newline(); } /* * */ int main ( void ) { s_print_string ( "1 から 5 まで出力 : " ); print1n ( 5 ); s_print_string ( "1 から 10 まで出力 : " ); print1n ( 10 ); return 0; } /* * */
C:\usr\c\> sample-003 1 から 5 まで出力 : 1 2 3 4 5 1 から 10 まで出力 : 1 2 3 4 5 6 7 8 9 10 C:\usr\c\>
Download : sample-004.c ( SJIS 版 )
/* * 2011/11/04 sample-004.c */ /* * */ #include <stdio.h> #include "s_print.h" /* * 1 から n までの整数を出力し、改行する * 変数 i を制御変数として利用する for 文 */ void print1n ( int n ) { int i; /* 宣言のみ */ for ( i = 1; i <= n; i++ ) { /* 制御変数の処理が一箇所にまとまっている */ /* 処理本体は同じ */ s_print_int ( i ); s_print_string ( " " ); } s_print_newline(); } /* * */ int main ( void ) { s_print_string ( "1 から 5 まで出力 : " ); print1n ( 5 ); s_print_string ( "1 から 10 まで出力 : " ); print1n ( 10 ); return 0; } /* * */
C:\usr\c\> sample-004 1 から 5 まで出力 : 1 2 3 4 5 1 から 10 まで出力 : 1 2 3 4 5 6 7 8 9 10 C:\usr\c\>
Download : sample-005.c ( SJIS 版 )
/* * 2011/11/04 sample-005.c */ /* * */ #include <stdio.h> #include "s_print.h" /* * 1 から n までの整数を出力し、改行する * ただし数値の間に ',' をいれる */ void print1n ( int n ) { int i; /* 宣言のみ */ for ( i = 0; i <= n; i++ ) { /* 制御変数の処理が一箇所にまとまっている */ s_print_int ( i ); if ( i == n ) { break; /* break が実行されると繰返しは中断される */ } s_print_string ( ", " ); } s_print_newline(); } /* * */ int main ( void ) { s_print_string ( "1 から 5 まで出力 : " ); print1n ( 5 ); s_print_string ( "1 から 10 まで出力 : " ); print1n ( 10 ); return 0; } /* * */
C:\usr\c\> sample-005 1 から 5 まで出力 : 0, 1, 2, 3, 4, 5 1 から 10 まで出力 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 C:\usr\c\>
Download : sample-006.c ( SJIS 版 )
/* * 2011/11/04 sample-006.c */ /* * */ #include <stdio.h> #include "s_print.h" /* * 文字列の中に指定した文字があればそれを表示する */ #define EOS '\0' void findchar ( char *str, char ch ) { for ( ; *str != EOS; str++ ) { /* for 文の個々の要素は省略可 */ s_print_char ( *str ); if ( *str == ch ) { /* 探ししている文字を見付けた */ /* 見付けた事をレポートし.. */ s_print_char ( ':' ); s_print_char ( ch ); s_print_string ( " をみつけました" ); break; /* 繰返しはここで終了 */ } s_print_char ( ' ' ); } s_print_newline(); } /* * */ int main ( void ) { s_print_string ( "\"abc123\" の中に '1' はあるか ?\n" ); findchar ( "abc123", '1' ); s_print_string ( "\"abc123\" の中に 'x' はあるか ?\n" ); findchar ( "abc123", 'x' ); return 0; } /* * */
C:\usr\c\> sample-006 "abc123" の中に '1' はあるか ? a b c 1:1 をみつけました "abc123" の中に 'x' はあるか ? a b c 1 2 3 C:\usr\c\>
Download : sample-007.c ( SJIS 版 )
/* * 2011/11/04 sample-007.c */ /* * */ #include <stdio.h> #include "s_print.h" /* * */ int main ( void ) { int i; int j; int seki; /* かけ算九九の表 */ s_print_string ( " | " ); for ( j = 1; j < 10; j++ ) { s_print_int ( j ); s_print_string ( " " ); } s_print_newline(); s_print_string ( "--+---------------------------\n" ); for ( i = 1; i < 10; i++ ) { s_print_int ( i ); s_print_string ( " |" ); for ( j = 1; j < 10; j++ ) { seki = i * j; if ( seki < 10 ) { s_print_char ( ' ' ); } s_print_int ( seki ); s_print_char ( ' ' ); } s_print_newline(); } return 0; } /* * */
C:\usr\c\> sample-007 | 1 2 3 4 5 6 7 8 9 --+--------------------------- 1 | 1 2 3 4 5 6 7 8 9 2 | 2 4 6 8 10 12 14 16 18 3 | 3 6 9 12 15 18 21 24 27 4 | 4 8 12 16 20 24 28 32 36 5 | 5 10 15 20 25 30 35 40 45 6 | 6 12 18 24 30 36 42 48 54 7 | 7 14 21 28 35 42 49 56 63 8 | 8 16 24 32 40 48 56 64 72 9 | 9 18 27 36 45 54 63 72 81 C:\usr\c\>
Download : sample-008.c ( SJIS 版 )
/* * 2011/11/04 sample-008.c */ /* * */ #include <stdio.h> #include "s_print.h" #define EOS '\0' /* * 二つの文字列の中に共通の文字があればそれを出力する ( 二重ループ ) */ int commoncharprint ( char *str1, char *str2 ) { char *p1; char *p2; for ( p1 = str1; *p1 != EOS; p1++ ) { for ( p2 = str2; *p2 != EOS; p2++ ) { if ( *p1 == *p2 ) { /* 共通の文字がみつかった */ s_print_char ( *p1 ); /* それを出力 */ } } } return EOS; /* みつからなかった場合 */ } /* * */ void check_report ( char *str1, char *str2 ) { int cch; s_print_char ( '"' ); s_print_string ( str1 ); s_print_string ( "\" と、\"" ); s_print_string ( str2 ); s_print_string ( "\" の共通部分は " ); commoncharprint ( str1, str2 ); s_print_string ( " です\n" ); } /* * */ int main ( void ) { check_report ( "abcd1234", "xycz2p3qr" ); check_report ( "abcd1234", "xywz7p8qr" ); return 0; } /* * */
C:\usr\c\> sample-008 "abcd1234" と、"xycz2p3qr" の共通部分は c23 です "abcd1234" と、"xywz7p8qr" の共通部分は です C:\usr\c\>
Download : sample-009.c ( SJIS 版 )
/* * 2011/11/04 sample-009.c */ /* * */ #include <stdio.h> #include "s_print.h" #define EOS '\0' /* * 二つの文字列の中に共通の文字があればそれを返す */ int commonchar ( char *str1, char *str2 ) { char *p1; char *p2; for ( p1 = str1; *p1 != EOS; p1++ ) { for ( p2 = str2; *p2 != EOS; p2++ ) { if ( *p1 == *p2 ) { /* 共通の文字がみつかった */ return *p1; /* それを結果としてかえす */ } } } return EOS; /* みつからなかった場合 */ } /* * */ void check_report ( char *str1, char *str2 ) { int cch; s_print_char ( '"' ); s_print_string ( str1 ); s_print_string ( "\" と、\"" ); s_print_string ( str2 ); s_print_string ( "\" の共通部分は" ); cch = commonchar ( str1, str2 ); if ( cch == EOS ) { s_print_string ( "ありませんでした\n" ); } else { s_print_string ( " `" ); s_print_char ( cch ); s_print_string ( "' です\n" ); } } /* * */ int main ( void ) { check_report ( "abcd1234", "xycz2p3qr" ); check_report ( "abcd1234", "xywz7p8qr" ); return 0; } /* * */
C:\usr\c\> sample-009 "abcd1234" と、"xycz2p3qr" の共通部分は `c' です "abcd1234" と、"xywz7p8qr" の共通部分はありませんでした C:\usr\c\>
Download : sample-010.c ( SJIS 版 )
/* * 2011/11/04 sample-010.c */ /* * */ #include <stdio.h> #include "s_print.h" #define EOS '\0' /* * 二つの文字列の中に共通の文字があればそれを返す */ void narigato ( int n ) { int i; for ( i = 0; i < n; i++ ) { /* 制御変数 i で、繰返しが制御されている.. */ /* for ( i = n; i > 0; i-- ) { */ s_print_string ( "ありがとう\n" ); /* 繰返しの本体では、i に関わりがない */ } } /* * */ int main ( void ) { narigato ( 10 ); return 0; } /* * */
C:\usr\c\> sample-010 ありがとう ありがとう ありがとう ありがとう ありがとう ありがとう ありがとう ありがとう ありがとう ありがとう C:\usr\c\>
Download : sample-011.c ( SJIS 版 )
/* * 2011/11/04 sample-010.c */ /* * */ #include <stdio.h> #include "s_print.h" #define EOS '\0' /* * 1 から n - 1 までの階和 */ int kaiwa ( int n ) { int i; int sum = 0; for ( i = 0; i < n; i++ ) { /* 制御変数 i で、繰返しが制御されている.. */ /* for ( i = 1; i <= n; i++ ) { sum = sum + i; /* 繰返しの中で i が利用されている */ } return sum; } /* * */ int main ( void ) { s_print_string ( "1 から 10 までの和 " ); s_print_int ( kaiwa ( 10 ) ); s_print_string ( "です.\n" ); return 0; } /* * */
C:\usr\c\> sample-011 1 から 10 までの和 0です. C:\usr\c\>
Download : sample-012.c ( SJIS 版 )
/* * 2011/11/04 sample-012.c */ /* * */ #include <stdio.h> #include "s_print.h" #define EOS '\0' /* * 2 の平方根を求めたい ( sqrt を使わない ) * f(x) = x^2 - 2 を考えると、これは、f(x) = 0 の時に、x は 2 の平方根 * f(0) = 0^2 - 2 = - 2 < 0, f(2) = 2^2 - 2 = 2 > 0 => 2 平方根は、0 と 2 の間にある * Y | | f(x) | / | 1 / -------------------+---+-/-----+-------- X 0 | / 2 |/ | */ void zeropoint ( ) { double lwr = 0.0; double upr = 2.0; double middle; while ( upr - lwr > 0.0001 ) { middle = ( lwr + upr ) / 2.0; if ( middle * middle - 2 < 0 ) { lwr = middle; } else { upr = middle; } s_print_doubleb ( middle ); /* 本来は、s_print_double ( middle ); とすべきだが \ s_print.h に誤りがある.. */ s_print_newline(); } } /* * */ int main ( void ) { zeropoint ( ); return 0; } /* * */
C:\usr\c\> sample-012 1.000000 1.500000 1.250000 1.375000 1.437500 1.406250 1.421875 1.414062 1.417969 1.416016 1.415039 1.414551 1.414307 1.414185 1.414246 C:\usr\c\>
Download : sample-013.c ( SJIS 版 )
/* * 2011/11/04 sample-013.c */ /* * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ #define ON 1 #define OFF 0 int main ( void ) { int power = ON; /* 最初は電源がはいっている */ int cmd; int charge = 0; /* charge は 0 */ while ( power == ON ) { /* 電源が入っている限り続く */ s_print_string ( "命令 :\n" ); s_print_string ( "\ts -- switch off\n" ); s_print_string ( "\t1 -- 1 円\n" ); s_print_string ( "\t5 -- 5 円\n" ); s_print_string ( "\tm -- はらいもどし\n" ); s_print_string ( "\tb -- 買う (商品は 7 円)\n" ); cmd = s_input_char(); switch ( cmd ) { case 's': power = OFF; s_print_string ( "電源を切ります\n" ); break; case '1': charge = charge + 1; s_print_string ( "1 円入りました\n" ); break; case '5': charge = charge + 5; s_print_string ( "5 円入りました\n" ); break; case 'm': if ( charge > 0 ) { s_print_int ( charge ); s_print_string ( " 円かえしました\n" ); charge = 0; } break; case 'b': if ( charge >= 7 ) { s_print_string ( "商品をだします\n" ); charge = charge - 7; } else { s_print_string ( "料金が不足です\n" ); } break; default: s_print_string ( "意味不明です\n" ); break; } } return 0; } /* * */
1 5 5 b m s
C:\usr\c\> sample-013< sample-013.in 命令 : s -- switch off 1 -- 1 円 5 -- 5 円 m -- はらいもどし b -- 買う (商品は 7 円) 1 1 円入りました 命令 : s -- switch off 1 -- 1 円 5 -- 5 円 m -- はらいもどし b -- 買う (商品は 7 円) 5 5 円入りました 命令 : s -- switch off 1 -- 1 円 5 -- 5 円 m -- はらいもどし b -- 買う (商品は 7 円) 5 5 円入りました 命令 : s -- switch off 1 -- 1 円 5 -- 5 円 m -- はらいもどし b -- 買う (商品は 7 円) b 商品をだします 命令 : s -- switch off 1 -- 1 円 5 -- 5 円 m -- はらいもどし b -- 買う (商品は 7 円) m 4 円かえしました 命令 : s -- switch off 1 -- 1 円 5 -- 5 円 m -- はらいもどし b -- 買う (商品は 7 円) s 電源を切ります C:\usr\c\>
Download : sample-014.c ( SJIS 版 )
/* * 2011/11/04 sample-014.c */ /* * */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ #define GOKIGEN 1 #define FUTSU 0 #define FUKIGEN -1 int main ( void ) { int kigen = FUTSU; int ch; while ( 1 ) { /* 永遠に.. ( CTRL-C で終了 ) */ s_print_string ( "h - ほめる\n" ); s_print_string ( "k - けなす\n" ); s_print_string ( "o - おねだり\n" ); ch = s_input_char(); /* なにをする (入力) */ if ( ch == 0 ) { /* 入力が終りなった. */ break; } switch ( kigen ) { case GOKIGEN: switch ( ch ) { case 'h': s_print_string ( "いやねぇ..\n" ); break; case 'o': s_print_string ( "もちろん OK..\n" ); kigen = FUTSU; break; case 'k': s_print_string ( "なによ ...\n" ); kigen = FUTSU; break; } break; case FUTSU: switch ( ch ) { case 'h': s_print_string ( "ありがとう..\n" ); kigen = GOKIGEN; break; case 'o': s_print_string ( "どうしようかしら..\n" ); break; case 'k': s_print_string ( "ふんだ ...\n" ); kigen = FUKIGEN; break; } break; case FUKIGEN: switch ( ch ) { case 'h': s_print_string ( "ほめたって何もでないよ..\n" ); kigen = FUTSU; break; case 'o': s_print_string ( "ダメにきまっているわ..\n" ); break; case 'k': s_print_string ( "喧嘩売き ?\n" ); break; } break; } } return 0; } /* * */
o h o k k o h o h o
Can not access : program/sample-014.out
Download : sample-015.c ( SJIS 版 )
/* * sample-0 */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ #define YES 1 #define NO 0 #define EOS '\0' /* * 入力された文字列が、C 言語の 8 進整数を表すかどうかを判定する関数 * 引数は文字列で、結果は関数の返り値とする * 返り値の意味 : 1 - 8 進整数 / 0 - それ以外 * 8 進整数の正規表現 : -?0[0-7]* */ /* -> [0] -+- '_a-zA-Z' --+-> [1] -- '_a-zA-Z0-9' ----+ ^ | | v +---------------------------+ */ /* * */ #define S0 0 /* 状態[0] */ #define S1 1 /* 状態[1] */ #define SI S0 /* 初期状態 */ #define SE (-1) /* エラー状態 */ int isname ( char *str ) { int result; /* 判定結果 */ int status = SI; /* 最初は初期状態 */ while ( *str != EOS ) { /* 文字列が最後になるまで */ switch ( status ) { case SE: /* エラー状態は何がきてもエラーのまま */ break; case S0: if ( *str == '_' ) { status = S1; } else if ( 'A' <= *str && *str <= 'Z' ) { status = S1; } else if ( 'a' <= *str && *str <= 'z' ) { status = S1; } else { status = SE; } break; case S1: if ( *str == '_' ) { } else if ( 'A' <= *str && *str <= 'Z' ) { } else if ( 'a' <= *str && *str <= 'z' ) { } else if ( '0' <= *str && *str <= '9' ) { } else { status = SE; } break; } str++; /* str = str + 1 */ } /* 終了状態の確認 */ switch ( status ) { case S1: /* この時だけ「受理」*/ result = YES; break; default: /* それ以外は、全て「不受理」*/ result = NO; break; } return result; /* 結果を関数値として返す */ } /* * */ int main ( void ) { char *inputs; s_print_string ( "文字列を入力してください : " ); inputs = s_chop ( s_input_string() ); /* 改行を取り除く */ s_print_string ( "\"" ); s_print_string ( inputs ); s_print_string ( "\" は シンボル名で" ); if ( isname ( inputs ) == YES ) { s_print_string ( "した" ); } else { s_print_string ( "ありません" ); } s_print_string ( "。\n" ); return 0; } /* * */
abc123
C:\usr\c\> sample-015< sample-015.in 文字列を入力してください : "abc123" は シンボル名でした。 C:\usr\c\>
Download : 20111104-01.c ( SJIS 版 )
/* * 20111104-1-QQQQ.c */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ /* * 1 から n 個の奇数の和を求める */ int sumodd ( int n ) { int i; int sum = 0; for ( i = 1; i <= n; i++ ) { /* ** この部分を完成させなさい */ } return sum; } /* * */ int main ( void ) { s_print_string ( "1 から 4 個の奇数の和は " ); s_print_int ( sumodd ( 4 ) ); s_print_string ( " です。\n" ); s_print_string ( "1 から 7 個の奇数の和は " ); s_print_int ( sumodd ( 7 ) ); s_print_string ( " です。\n" ); return 0; } /* * */
-077
C:\usr\c\> 01< 01.in 1 から 4 個の奇数の和は 16 です。 1 から 7 個の奇数の和は 49 です。 C:\usr\c\>
Download : 20111104-02.c ( SJIS 版 )
/* * 20111104-2-QQQQ.c */ #include <stdio.h> #include "s_print.h" #include "s_input.h" /* * */ #define YES 1 #define NO 0 #define EOS '\0' /* * 入力された文字列が、C 言語の 8 進整数を表すかどうかを判定する関数 * 引数は文字列で、結果は関数の返り値とする * 返り値の意味 : 1 - 8 進整数 / 0 - それ以外 * 8 進整数の正規表現 : -?0[0-7]* */ /* -> [0] -+- '-' -> [1] -+ +-- | | ^ v v | +--------------+- '0' -> [2] - '0-7' --+ ^ | | v +------------+ */ /* * */ #define S0 0 /* 状態[0] */ #define S1 1 /* 状態[1] */ #define S2 2 /* 状態[2] */ #define SI S0 /* 初期状態 */ #define SE (-1) /* エラー状態 */ int isoctal ( char *str ) { int result; /* 判定結果 */ int status = SI; /* 最初は初期状態 */ while ( *str != EOS ) { /* 文字列が最後になるまで */ switch ( status ) { case SE: /* エラー状態は何がきてもエラーのまま */ break; case S0: /* ** この部分を完成させなさい */ break; case S1: switch ( *str ) { case '0': status = S2; break; default: status = SE; break; } break; case S2: if ( '0' <= *str && *str <= '7' ) { /* status = S2; */ } else { status = SE; } break; } str++; /* str = str + 1 */ } /* 終了状態の確認 */ /* ** この部分を完成させなさい */ return result; /* 結果を関数値として返す */ } /* * */ int main ( void ) { char *inputs; s_print_string ( "文字列を入力してください : " ); inputs = s_chop ( s_input_string() ); /* 改行を取り除く */ s_print_string ( "\"" ); s_print_string ( inputs ); s_print_string ( "\" は 8 進数で" ); if ( isoctal ( inputs ) == YES ) { s_print_string ( "した" ); } else { s_print_string ( "ありません" ); } s_print_string ( "。\n" ); return 0; } /* * */
-077
C:\usr\c\> 02< 02.in 文字列を入力してください : "-077" は 8 進数でした。 C:\usr\c\>