当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/*
* 2012/10/12 sample-001.c
*/
#include <stdio.h>
#include "s_print.h"
#include "s_memory.h" /* memory モデルを理解するための関数定義 */
/*
* ◯×ゲームのボード (一次元版)
*
* y
* 0 1 2 (y,t)
* +-----+-----+-----+ +-----+
* 0 |(0,0)|(0,1)|(0,2)| |(0,0)| 0 = 0*3+0 = t*3+y
* +-----+-----+-----+ +-----+
* t 1 |(1,0)|(1,1)|(1,2)| |(0,1)| 1 = 0*3+1 = t*3+y
* +-----+-----+-----+ +-----+
* 2 |(2,0)|(2,1)|(2,2)| |(0,2)| 2 = 0*3+2 = t*3+y
* +-----+-----+-----+ +-----+
* |(1,0)| 3 = 1*3+0 = t*3+y
* +-----+
* |(1,1)| 4 = 1*3+1 = t*3+y
* +-----+
* |(1,2)| 5 = 1*3+2 = t*3+y
* +-----+
* |(2,0)| 6 = 2*3+0 = t*3+y
* +-----+
* |(2,1)| 7 = 2*3+1 = t*3+y
* +-----+
* |(2,2)| 8 = 2*3+2 = x*3+y
* +-----+
*
*/
#define BOARD_SIZE 3 /* ボードのサイズ */
#define SENTE_MARK 'o' /* 先手は 'o' (マル) */
#define GOTE_MARK 'x' /* 後手は 'x' (バツ) */
int main ( void ) {
/*
*
*/
char board[BOARD_SIZE*BOARD_SIZE]; /* サイズは 3 × 3 */
/* char board[3*3]; */
/* char board[9]; */
int t; /* 縱 */
int y; /* 横 */
/*
* ある局面
*
* oxx
* xoo
* oox
*/
board[0*BOARD_SIZE+0] = 'o'; /* (0,0) */
board[0*BOARD_SIZE+1] = 'x'; /* (0,1) */
board[0*BOARD_SIZE+2] = 'x'; /* (0,2) */
board[1*BOARD_SIZE+0] = 'x'; /* (1,0) */
board[1*BOARD_SIZE+1] = 'o'; /* (1,1) */
board[1*BOARD_SIZE+2] = 'o'; /* (1,2) */
board[2*BOARD_SIZE+0] = 'o'; /* (2,0) */
board[2*BOARD_SIZE+1] = 'x'; /* (2,1) */
board[2*BOARD_SIZE+2] = 'x'; /* (2,2) */
/*
*
*/
t = 0;
while ( t < BOARD_SIZE ) {
y = 0;
while ( y < BOARD_SIZE ) {
s_print_char ( board[t*BOARD_SIZE+y] );
y = y + 1;
}
s_print_newline();
t = t + 1;
}
/*
*
*/
return 0;
}
/*
*
*/
C:\usr\c>sample-001 oxx xoo oxx C:\usr\c>
Download : sample-002.c ( SJIS 版 )
/*
* 2012/10/12 sample-002.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* ◯×ゲームのボード (一次元版)
*
* y
* 0 1 2 (y,t)
* +-----+-----+-----+ +-----+
* 0 |(0,0)|(0,1)|(0,2)| |(0,0)| 0 = 0*3+0 = t*3+y
* +-----+-----+-----+ +-----+
* t 1 |(1,0)|(1,1)|(1,2)| |(0,1)| 1 = 0*3+1 = t*3+y
* +-----+-----+-----+ +-----+
* 2 |(2,0)|(2,1)|(2,2)| |(0,2)| 2 = 0*3+2 = t*3+y
* +-----+-----+-----+ +-----+
* |(1,0)| 3 = 1*3+0 = t*3+y
* +-----+
* |(1,1)| 4 = 1*3+1 = t*3+y
* +-----+
* |(1,2)| 5 = 1*3+2 = t*3+y
* +-----+
* |(2,0)| 6 = 2*3+0 = t*3+y
* +-----+
* |(2,1)| 7 = 2*3+1 = t*3+y
* +-----+
* |(2,2)| 8 = 2*3+2 = x*3+y
* +-----+
*
*/
#define BOARD_SIZE 3 /* ボードのサイズ */
#define SENTE_MARK 'o' /* 先手は 'o' (マル) */
#define GOTE_MARK 'x' /* 後手は 'x' (バツ) */
/*
* 二次元の座標を一次元に変換する関数
*/
int index2d ( int t, int y ) {
return t * BOARD_SIZE + y;
}
int main ( void ) {
/*
*
*/
char board[BOARD_SIZE*BOARD_SIZE]; /* サイズは 3 × 3 */
int t; /* 縱 */
int y; /* 横 */
/*
* ある局面
*
* oxx
* xoo
* oox
*/
board[index2d(0,0)] = 'o'; /* (0,0) */
board[index2d(0,1)] = 'x'; /* (0,1) */
board[index2d(0,2)] = 'x'; /* (0,2) */
board[index2d(1,0)] = 'x'; /* (1,0) */
board[index2d(1,1)] = 'o'; /* (1,1) */
board[index2d(1,2)] = 'o'; /* (1,2) */
board[index2d(2,0)] = 'o'; /* (2,0) */
board[index2d(2,1)] = 'x'; /* (2,1) */
board[index2d(2,2)] = 'x'; /* (2,2) */
/*
*
*/
t = 0;
while ( t < BOARD_SIZE ) {
y = 0;
while ( y < BOARD_SIZE ) {
s_print_char ( board[index2d(t,y)] );
y = y + 1;
}
s_print_newline();
t = t + 1;
}
/*
*
*/
return 0;
}
/*
*
*/
C:\usr\c>sample-002 oxx xoo oxx C:\usr\c>
Download : sample-003.c ( SJIS 版 )
/*
* 2012/10/12 sample-003.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* ◯×ゲームのボード (二次元版)
*
* y
* 0 1 2
* +-----+-----+-----+
* 0 |(0,0)|(0,1)|(0,2)|
* +-----+-----+-----+
* t 1 |(1,0)|(1,1)|(1,2)|
* +-----+-----+-----+
* 2 |(2,0)|(2,1)|(2,2)|
* +-----+-----+-----+
*
*/
#define BOARD_SIZE 3 /* ボードのサイズ */
#define SENTE_MARK 'o' /* 先手は 'o' (マル) */
#define GOTE_MARK 'x' /* 後手は 'x' (バツ) */
int main ( void ) {
/*
*
*/
char board[BOARD_SIZE][BOARD_SIZE]; /* サイズは 3 × 3 */
int t; /* 縱 */
int y; /* 横 */
/*
* ある局面
*
* oxx
* xoo
* oox
*/
board[0][0] = 'o'; /* (0,0) */
board[0][1] = 'x'; /* (0,1) */
board[0][2] = 'x'; /* (0,2) */
board[1][0] = 'x'; /* (1,0) */
board[1][1] = 'o'; /* (1,1) */
board[1][2] = 'o'; /* (1,2) */
board[2][0] = 'o'; /* (2,0) */
board[2][1] = 'x'; /* (2,1) */
board[2][2] = 'x'; /* (2,2) */
/*
*
*/
t = 0;
while ( t < BOARD_SIZE ) {
y = 0;
while ( y < BOARD_SIZE ) {
s_print_char ( board[t][y] );
y = y + 1;
}
s_print_newline();
t = t + 1;
}
/*
*
*/
return 0;
}
/*
*
*/
C:\usr\c>sample-003 oxx xoo oxx C:\usr\c>
Download : sample-004.c ( SJIS 版 )
/*
* 2012/10/12 sample-004.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* ◯×ゲームのボード (一次元版)
*
* y
* 0 1 2 (y,t)
* +-----+-----+-----+ +-----+
* 0 |(0,0)|(0,1)|(0,2)| |(0,0)| 0 = 0*3+0 = t*3+y
* +-----+-----+-----+ +-----+
* t 1 |(1,0)|(1,1)|(1,2)| |(0,1)| 1 = 0*3+1 = t*3+y
* +-----+-----+-----+ +-----+
* 2 |(2,0)|(2,1)|(2,2)| |(0,2)| 2 = 0*3+2 = t*3+y
* +-----+-----+-----+ +-----+
* |(1,0)| 3 = 1*3+0 = t*3+y
* +-----+
* |(1,1)| 4 = 1*3+1 = t*3+y
* +-----+
* |(1,2)| 5 = 1*3+2 = t*3+y
* +-----+
* |(2,0)| 6 = 2*3+0 = t*3+y
* +-----+
* |(2,1)| 7 = 2*3+1 = t*3+y
* +-----+
* |(2,2)| 8 = 2*3+2 = x*3+y
* +-----+
*
*/
#define BOARD_SIZE 3 /* ボードのサイズ */
#define SENTE_MARK 'o' /* 先手は 'o' (マル) */
#define GOTE_MARK 'x' /* 後手は 'x' (バツ) */
int main ( void ) {
/*
*
*/
char board[BOARD_SIZE][BOARD_SIZE]; /* サイズは 3 × 3 */
int t; /* 縱 */
int y; /* 横 */
/*
*
*/
s_print_string ( "sizeof ( board[0][0] ) = " );
s_print_int ( sizeof ( board[0][0] ) );
s_print_newline();
s_print_string ( "sizeof ( board[0] ) = " );
s_print_int ( sizeof ( board[0] ) );
s_print_newline();
t = 0;
while ( t < BOARD_SIZE ) {
s_print_string ( "board[" );
s_print_int ( t );
s_print_string ( "]=" );
s_print_hex ( &board[t] );
s_print_newline();
y = 0;
while ( y < BOARD_SIZE ) {
/* アドレスの表示 */
s_print_string ( "(" );
s_print_int ( t );
s_print_string ( "," );
s_print_int ( y );
s_print_string ( ") " );
s_print_hex ( &board[t][y] );
s_print_newline();
y = y + 1;
}
s_print_newline();
t = t + 1;
}
/*
*
*/
return 0;
}
/*
*
*/
C:\usr\c>sample-004 sizeof ( board[0][0] ) = 1 sizeof ( board[0] ) = 3 board[0]=bfc6ff4f (0,0) bfc6ff4f (0,1) bfc6ff50 (0,2) bfc6ff51 board[1]=bfc6ff52 (1,0) bfc6ff52 (1,1) bfc6ff53 (1,2) bfc6ff54 board[2]=bfc6ff55 (2,0) bfc6ff55 (2,1) bfc6ff56 (2,2) bfc6ff57 C:\usr\c>
Download : sample-006.c ( SJIS 版 )
/*
* 2012/10/12 sample-006.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* 再帰を利用した階乗の計算(既出)
*
* 1 ( n < 1 )
* n! = {
* n * { (n-1)! }
*/
int fact ( int n ) {
if ( n < 1 ) { // n が 0 の時
return 1;
} else {
return fact ( n - 1 ) * n; // 再帰を利用して計算
}
}
int main ( void ) {
/*
*
*/
int n = 5;
/*
*
*/
s_print_string ( "fact(" );
s_print_int ( n );
s_print_string ( ")=" );
s_print_int ( fact(n) );
s_print_newline();
/*
*
*/
return 0;
}
/*
*
*/
C:\usr\c>sample-006 fact(5)=120 C:\usr\c>
Download : sample-007.c ( SJIS 版 )
/*
* 2012/10/12 sample-007.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* 仮引数変数 n のアドレスと値はどうなっているか ?
*/
int fact ( int n ) {
int f;
s_print_string ( "(fact:前) n = " );
s_print_int ( n );
s_print_string ( ", &n = " );
s_print_hex ( &n );
s_print_newline();
if ( n < 1 ) {
f = 1;
} else {
f = fact ( n - 1 ) * n;
}
s_print_string ( "(fact:後) n = " );
s_print_int ( n );
s_print_string ( ", &n = " );
s_print_hex ( &n );
s_print_newline();
return f;
}
int main ( void ) {
/*
*
*/
int n = 5;
int f;
/*
*
*/
s_print_string ( "(main) n = " );
s_print_int ( n );
s_print_string ( ", &n = " );
s_print_hex ( &n );
s_print_newline();
/*
*
*/
f = fact(n);
s_print_string ( "fact(" );
s_print_int ( n );
s_print_string ( ")=" );
s_print_int ( f );
s_print_newline();
/*
*
*/
return 0;
}
/*
*
*/
C:\usr\c>sample-007 (main) n = 5, &n = bfe0c748 (fact:前) n = 5, &n = bfe0c730 (fact:前) n = 4, &n = bfe0c700 (fact:前) n = 3, &n = bfe0c6d0 (fact:前) n = 2, &n = bfe0c6a0 (fact:前) n = 1, &n = bfe0c670 (fact:前) n = 0, &n = bfe0c640 (fact:後) n = 0, &n = bfe0c640 (fact:後) n = 1, &n = bfe0c670 (fact:後) n = 2, &n = bfe0c6a0 (fact:後) n = 3, &n = bfe0c6d0 (fact:後) n = 4, &n = bfe0c700 (fact:後) n = 5, &n = bfe0c730 fact(5)=120 C:\usr\c>
Download : sample-008.c ( SJIS 版 )
/*
* 2012/10/12 sample-008.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* 引数のアドレスは ? ( 引数の順に並んいる )
*/
int subfunc ( int a, int b ) {
s_print_string ( "a = " );
s_print_int ( a );
s_print_string ( ", &a = " );
s_print_hex ( &a );
s_print_newline();
s_print_string ( "b = " );
s_print_int ( b );
s_print_string ( ", &b = " );
s_print_hex ( &b );
s_print_newline();
}
int main ( void ) {
/*
*
*/
subfunc ( 2, 4 );
/*
*
*/
return 0;
}
/*
*
*/
C:\usr\c>sample-008 a = 2, &a = bf92f230 b = 4, &b = bf92f234 C:\usr\c>
Download : sample-009.c ( SJIS 版 )
/*
* 2012/10/12 sample-009.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* 一つの引数変数から(ポインター経由で..)他の引数変数を参照する事ができる
*/
int subfunc ( int a, int b ) {
s_print_string ( "a = " );
s_print_int ( a );
s_print_string ( ", &a = " );
s_print_hex ( &a );
s_print_newline();
s_print_string ( "b = " );
s_print_int ( b );
s_print_string ( ", &b = " );
s_print_hex ( &b );
s_print_newline();
/*
* 変数 b を利用して変数 a の値が参照できる
*/
s_print_string ( "*(&b-1) = " );
s_print_int ( *(&b-1) );
s_print_string ( ", &b-1 = " );
s_print_hex ( &b-1 );
s_print_newline();
/*
* 変数 b を利用して変数 a の値を変更(代入)できる
*/
*(&b-1) = 10;
s_print_string ( "a = " );
s_print_int ( a );
s_print_newline();
}
int main ( void ) {
/*
*
*/
subfunc ( 2, 4 );
/*
*
*/
return 0;
}
/*
*
*/
C:\usr\c>sample-009 a = 2, &a = bfa21120 b = 4, &b = bfa21124 *(&b-1) = 2, &b-1 = bfa21120 a = 10 C:\usr\c>
Download : sample-010.c ( SJIS 版 )
/*
* 2012/10/12 sample-010.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* 先頭の引数のポインタを利用して、残りの引数を参照する
*/
int subfunc ( int a, ... ) {
s_print_string ( "a = " );
s_print_int ( a );
s_print_string ( ", &a = " );
s_print_hex ( &a );
s_print_newline();
s_print_string ( "*(&a+1) = " );
s_print_int ( *(&a+1) );
s_print_string ( ", &a + 1 = " );
s_print_hex ( &a + 1 );
s_print_newline();
s_print_string ( "*(&a+2) = " );
s_print_int ( *(&a+2) );
s_print_string ( ", &a + 2 = " );
s_print_hex ( &a + 2 );
s_print_newline();
}
int main ( void ) {
/*
*
*/
subfunc ( 1,2,3,4,5 );
/*
*
*/
return 0;
}
/*
*
*/
C:\usr\c>sample-010 a = 1, &a = bf963910 *(&a+1) = 2, &a + 1 = bf963914 *(&a+2) = 3, &a + 2 = bf963918 C:\usr\c>
Download : sample-011.c ( SJIS 版 )
/*
* 2012/10/12 sample-011.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* 引数をアドレス経由で参照する
* 最初の引数 n は、他の引数の個数としての情報を担う
* 関数(のプログラム作成時)側では、
* (実行時の呼出の時に)幾つの引数が指定されるかを知る術がない
* 最初の引数 n の「値」を信じて振る舞うしかない
*/
int subfunc ( int n, ... ) {
int i;
i = 0;
while ( i < n ) {
s_print_string ( "a[" );
s_print_int ( i );
s_print_string ( "]= " );
s_print_int ( *(&n+1+i) );
s_print_newline();
i = i + 1;
}
}
int main ( void ) {
/*
*
*/
s_print_string ( "subfunc ( 5,1,2,3,4,5 );\n" );
subfunc ( 5,1,2,3,4,5 ); // 1 から 5 の追加の引数の個数を適切に指定
s_print_string ( "subfunc ( 3,9,8,7,6 );\n" );
subfunc ( 3,9,8,7,6 ); // 4 つの追加の引数があるのに 3 としているので、最後の値は利用されない
/*
*
*/
return 0;
}
/*
*
*/
C:\usr\c>sample-011 subfunc ( 5,1,2,3,4,5 ); a[0]= 1 a[1]= 2 a[2]= 3 a[3]= 4 a[4]= 5 subfunc ( 3,9,8,7,6 ); a[0]= 9 a[1]= 8 a[2]= 7 C:\usr\c>
Download : sample-012.c ( SJIS 版 )
/*
* 2012/10/12 sample-012.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* 最初の引数に指定した文字列の中に 「%」があったら、後の引数の値に置き換える
*/
int print_int_with_format ( char *fmt, int a, ... ) {
int i;
int j;
j = 0;
i = 0;
while ( fmt[i] != '\0' ) { /* 文字列の終わりがくるまで */
if ( fmt[i] == '%' ) { /* '%' がきたら特別処理
s_print_int ( *(&a+j) ); /* 追加引数の値を取り出し出力 */
j = j + 1; /* 次の引数の準備 */
} else { /* '%' 以外は.. */
s_print_char ( fmt[i] ); /* その文字をそのまま出力 */
}
i = i + 1; /* 次の文字 */
}
}
int main ( void ) {
/*
*
*/
print_int_with_format ( "%\n", 99 );
print_int_with_format ( "i = %, j = %\n", 10, 20 );
print_int_with_format ( "1 st = %, 2nd = %, 3rd = % \n", 10, 20, 90 );
/*
*
*/
return 0;
}
/*
*
*/
C:\usr\c>sample-012 i = , j = 1 st = , 2nd = , 3rd = C:\usr\c>
Download : sample-013.c ( SJIS 版 )
/*
* 2012/10/12 sample-013.c
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
int main ( void ) {
/*
*
*/
// printf ( "..." ); /* これまで printf は「文字列出力」専門だった */
/* 実は、もっと、凄い機能がある */
printf ( "%d\n", 99 );
// 文字列の中に「%d」をいれると、これは、その後の引数の
// 整数値引数の値に書き変わる
/*
* 引数の個数は可変長
*/
printf ( "i=%d, j=%d, k=%d\n", 10, 20, 90 );
/*
* 上と同じ事をする命令列 ( いままでは面倒な事をしていた )
*/
s_print_string ( "i=" );
s_print_int ( 10 );
s_print_string ( ", j=" );
s_print_int ( 20 );
s_print_string ( ", k=" );
s_print_int ( 90 );
s_print_newline();
/*
*
*/
return 0;
}
/*
*
*/
C:\usr\c>sample-013 99 i=10, j=20, k=90 i=10, j=20, k=90 C:\usr\c>
Download : sample-014.c ( SJIS 版 )
/*
* 2012/10/12 sample-014.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* printf を利用してみる
*/
int main ( void ) {
/*
*
*/
printf ( "abc\n" ); /* いままでと同じ */
/* 文字列がそのままでる */
printf ( "i=%d\n", 10 );
/* 文字列の中の 「%d」の部分が、二つ目の引数
10 に変る */
printf ( "i=%d, j=%d\n", 10, 20 );
/* 「%d」が二度でれば二度めは三つ目の引数の値を利用 */
printf ( "a=%f\n", 12.34 );
/* 実数(浮動小数点数) の場合は 「%f」を使う */
printf ( "i=%d, a=%f, c=%c, s=%s\n", 123, 12.34, 'a', "abc" );
/* 混在も可能
%c が文字
%s が文字列(文字型へのポインタ値)
*/
/*
*
*/
return 0;
}
/*
*
*/
C:\usr\c>sample-014 abc i=10 i=10, j=20 a=12.340000 i=123, a=12.340000, c=a, s=abc C:\usr\c>
Download : sample-015.c ( SJIS 版 )
/*
* 2012/10/12 sample-015.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* printf の更なる機能 : 書式付きの出力
*/
int main ( void ) {
/*
* 同じ数値を異る形式(書式 / format)で出力できる
*/
printf ( "a=%10.6f\n", -12.34 );
/* 出力する形式を指定できる 10.6 は、全体 10 桁、小数点以下 6 桁の意味 */
printf ( "a=%20.10f\n", -12.34 );
/* 出力する形式を指定できる 20.10 は、全体 20 桁、小数点以下 10 桁の意味 */
/*
*
*/
return 0;
}
/*
*
*/
C:\usr\c>sample-015 a=-12.340000 a= -12.3400000000 C:\usr\c>
Download : sample-016.c ( SJIS 版 )
/*
* 2012/10/12 sample-016.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* scanf, printf (出力関数) の入力版
*/
int main ( void ) {
/*
*
*/
int i;
/*
*
*/
printf ( "i の値を入力してください " );
scanf ( "%d", &i ); /* '%d' --> printf と同じ */
/* i = s_input_int(); */
/*
i = 99;
の時
scanf ( "%d", i );
は、
scanf ( "%d", 99 );
の意味。
これでは、scanf はどうやっても i の値を得る事ができない。
そこで、「&i」を指定 ( i のポインタ値がわかれば、 i の値が変更できる )
*/
/*
*
*/
printf ( "入力された i の値は %d でした\n", i );o
/*
*
*/
return 0;
}
/*
*
*/
123
C:\usr\c>sample-016< sample-016.in a=-12.340000 a= -12.3400000000 C:\usr\c>
今回は課題なしとなりました。