当日の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\>