当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/*
* 2011/06/24 sample-001.c
*/
/*
* sizeof 演算子
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
void print_size_of_type ( char *name, int size ) {
s_print_string ( "sizeof ( " );
s_print_string ( name );
s_print_string ( " ) = " );
s_print_int ( size );
s_print_newline();
}
/*
*
*/
int main ( void ) {
print_size_of_type ( "char", sizeof( char ) );
print_size_of_type ( "int", sizeof( int ) );
print_size_of_type ( "double", sizeof( double ) );
print_size_of_type ( "char *", sizeof( char * ) );
return 0;
}
/*
*
*/
C:\usr\c\> sample-001 sizeof ( char ) = 1 sizeof ( int ) = 4 sizeof ( double ) = 8 sizeof ( char * ) = 4 C:\usr\c\>
Download : sample-002.c ( SJIS 版 )
/*
* 2011/06/24 sample-002.c
*/
/*
* 2 進数表示 ( 8 bit )
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
#define CHAR_BIT_SIZE ( 8 * sizeof ( char ) ) /* char 型の bit 長さ */
/*
*
*/
void print_binary_digit ( char number, int digits ) {
if ( digits <= 0 ) {
/* 全ての桁を表示したのでやることなし */
} else {
print_binary_digit ( number / 2, digits - 1 ); /* とりあえず上位の桁を表示 */
s_print_int ( number % 2 ); /* 最下位の桁一桁を表示 */
}
}
/*
*
*/
void print_char_and_bin ( char number ) {
print_binary_digit ( number, CHAR_BIT_SIZE );
s_print_string ( " == " );
s_print_int ( number );
s_print_newline();
}
/*
*
*/
int main ( void ) {
print_char_and_bin ( 1 );
print_char_and_bin ( 2 );
print_char_and_bin ( 3 );
print_char_and_bin ( 10 );
print_char_and_bin ( 100 );
return 0;
}
/*
*
*/
C:\usr\c\> sample-002 00000001 == 1 00000010 == 2 00000011 == 3 00001010 == 10 01100100 == 100 C:\usr\c\>
Download : sample-003.c ( SJIS 版 )
/*
* 2011/06/24 sample-003.c
*/
/*
* 1 の補数 / 2 の補数 ( 8 bit )
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
#define CHAR_BIT_SIZE ( 8 * sizeof ( char ) ) /* char 型の bit 長さ */
/*
*
*/
void print_binary_digit ( unsigned char number, int digits ) {
if ( digits <= 0 ) {
/* 全ての桁を表示したのでやることなし */
} else {
print_binary_digit ( number / 2, digits - 1 ); /* とりあえず上位の桁を表示 */
s_print_int ( number % 2 ); /* 最下位の桁一桁を表示 */
}
}
/*
*
*/
void print_one_negative ( unsigned char number, int digits ) {
if ( digits <= 0 ) {
/* 全ての桁を表示したのでやることなし */
} else {
print_one_negative ( number / 2, digits - 1 ); /* とりあえず上位の桁を表示 */
s_print_int ( ( 1 + 0 ) - number % 2 ); /* 最下位の桁一桁を 0/1 反転させて表示 */
}
}
/*
*
*/
void print_negatives ( char number ) {
s_print_int ( number );
s_print_newline();
s_print_string ( " 元の数 : " );
print_binary_digit ( (unsigned char)number, CHAR_BIT_SIZE );
s_print_newline();
s_print_string ( "一の補数 : " );
print_one_negative ( (unsigned char)number, CHAR_BIT_SIZE );
s_print_newline();
s_print_string ( "二の補数 : " );
print_binary_digit ( (unsigned char)(-number), CHAR_BIT_SIZE ); /* 負の数は、実は \
2 補数になっている.. */
s_print_newline();
s_print_newline();
}
/*
*
*/
int main ( void ) {
print_negatives ( 0 );
print_negatives ( 1 );
print_negatives ( 2 );
print_negatives ( 5 );
print_negatives ( 10 );
print_negatives ( 72 );
return 0;
}
/*
*
*/
C:\usr\c\> sample-003 0 元の数 : 00000000 一の補数 : 11111111 二の補数 : 00000000 1 元の数 : 00000001 一の補数 : 11111110 二の補数 : 11111111 2 元の数 : 00000010 一の補数 : 11111101 二の補数 : 11111110 5 元の数 : 00000101 一の補数 : 11111010 二の補数 : 11111011 10 元の数 : 00001010 一の補数 : 11110101 二の補数 : 11110110 72 元の数 : 01001000 一の補数 : 10110111 二の補数 : 10111000 C:\usr\c\>
Download : sample-004.c ( SJIS 版 )
/*
* 2011/06/24 sample-003.c
*/
/*
* 負の数と二の補数 ( 8 bit )
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
#define CHAR_BIT_SIZE ( 8 * sizeof ( char ) ) /* char 型の bit 長さ */
/*
*
*/
void print_binary_digit ( unsigned char number, int digits ) {
if ( digits <= 0 ) {
/* 全ての桁を表示したのでやることなし */
} else {
print_binary_digit ( number / 2, digits - 1 ); /* とりあえず上位の桁を表示 */
s_print_int ( number % 2 ); /* 最下位の桁一桁を表示 */
}
}
/*
*
*/
void print_char_and_bin ( char number ) {
print_binary_digit ( (unsigned char)number, CHAR_BIT_SIZE );
s_print_string ( " == " );
s_print_int ( number );
s_print_newline();
}
/*
*
*/
int main ( void ) {
print_char_and_bin ( 0 );
print_char_and_bin ( -0 );
print_char_and_bin ( 1 );
print_char_and_bin ( -1 );
print_char_and_bin ( 72 );
print_char_and_bin ( -72 );
return 0;
}
/*
*
*/
C:\usr\c\> sample-004 00000000 == 0 00000000 == 0 00000001 == 1 11111111 == -1 01001000 == 72 10111000 == -72 C:\usr\c\>
Download : sample-005.c ( SJIS 版 )
/*
* 2011/06/24 sample-005.c
*/
/*
* 負の数の 2 進数表示 ( 32 bit : int 型 )
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
#define INT_BIT_SIZE ( 8 * sizeof ( int ) ) /* int 型の bit 長さ */
/*
*
*/
void print_binary_digit ( unsigned int number, int digits ) {
if ( digits <= 0 ) {
/* 全ての桁を表示したのでやることなし */
} else {
print_binary_digit ( number / 2, digits - 1 ); /* とりあえず上位の桁を表示 */
s_print_int ( number % 2 ); /* 最下位の桁一桁を表示 */
}
}
/*
*
*/
void print_dec_and_bin ( int number ) {
print_binary_digit ( (unsigned int)number, INT_BIT_SIZE );
s_print_string ( " == " );
s_print_int ( number );
s_print_newline();
}
/*
*
*/
int main ( void ) {
print_dec_and_bin ( 10 );
print_dec_and_bin ( -10 );
return 0;
}
/*
*
*/
C:\usr\c\> sample-005 00000000000000000000000000001010 == 10 11111111111111111111111111110110 == -10 C:\usr\c\>
Download : sample-006.c ( SJIS 版 )
/*
* 2011/06/24 sample-006.c
*/
/*
* 論理演算
*/
#include <stdio.h>
#include "s_print.h"
/*
* 論理値 ( 真/偽 ) を、1 bit の整数値で表現
*/
#define TRUE 1 /* 「真」を 1 で表現 */
#define FALSE 0 /* 「偽」を 0 で表現 */
#define Boolean int /* Boolean (真偽値) を int でコーディングする事にする */
/*
* print_boolean ( Boolean a )
*/
void print_boolean ( Boolean a ) /* 真偽値を表示 */
{
if ( a == TRUE ) { /* a が真ならば.. */
s_print_string ( "True" );
} else { /* a が真でないので ( 多分、偽だから.. ) */
s_print_string ( "False" );
}
}
/*
* boolean_and ( Boolean a, Boolean b ) == a & b
*/
int boolean_and ( Boolean a, Boolean b ) {
if ( a == TRUE ) { /* もし、 a が真で、.. */
if ( b == TRUE ) { /* しかも b も真ならば.. */
return TRUE; /* a and b は真 */
} else { /* b が真でないので ( 多分、偽だから.. ) */
return FALSE; /* 偽を返す */
}
} else { /* a が真でないので ( 多分、偽だから.. ) */
return FALSE; /* b を見るまでもなく偽を返す */
}
}
/*
* boolean_or ( Boolean a, Boolean b ) == a & b
*/
int boolean_or ( Boolean a, Boolean b ) {
if ( a == TRUE ) { /* もし、 a が真なら.. */
return TRUE; /* b と無関係に真 */
} else if ( b == TRUE ) { /* a が偽でも b が真なら.. */
return TRUE; /* やっぱり真 */
} else { /* いずれでもなければ.. */
return FALSE; /* 偽となる */
}
}
/*
* boolean_not ( Boolean a ) == ~ a
*/
int boolean_not ( Boolean a ) {
if ( a == TRUE ) { /* もし、 a が真なら.. */
return FALSE; /* 偽となる */
} else { /* そうでなければ.. */
return TRUE; /* 真となる */
}
}
/*
* boolean_xor ( Boolean a, Boolean b ) == a ^ b
*/
int boolean_xor ( Boolean a, Boolean b ) {
if ( a != b ) { /* もし、 a と b が異れば */
return TRUE; /* 真となる */
} else { /* それ以外は */
return FALSE; /* 偽となる */
}
}
/*
* print_or ( Boolean a, Boolean b )
*/
void print_or ( Boolean a, Boolean b ) {
print_boolean ( a );
s_print_string ( " | " );
print_boolean ( b );
s_print_string ( " == " );
print_boolean ( boolean_or ( a, b ) );
s_print_newline();
}
/*
* print_and ( Boolean a, Boolean b )
*/
void print_and ( Boolean a, Boolean b ) {
print_boolean ( a );
s_print_string ( " & " );
print_boolean ( b );
s_print_string ( " == " );
print_boolean ( boolean_and ( a, b ) );
s_print_newline();
}
/*
* print_not ( Boolean a, Boolean b )
*/
void print_not ( Boolean a ) {
s_print_string ( "~ " );
print_boolean ( a );
s_print_string ( " == " );
print_boolean ( boolean_not ( a ) );
s_print_newline();
}
/*
* print_xor ( Boolean a, Boolean b )
*/
void print_xor ( Boolean a, Boolean b ) {
print_boolean ( a );
s_print_string ( " ^ " );
print_boolean ( b );
s_print_string ( " == " );
print_boolean ( boolean_xor ( a, b ) );
s_print_newline();
}
/*
*
*/
int main ( void ) {
s_print_string ( "[and]\n" );
print_and ( TRUE, TRUE );
print_and ( TRUE, FALSE );
print_and ( FALSE, TRUE );
print_and ( FALSE, FALSE );
s_print_newline();
s_print_string ( "[or]\n" );
print_or ( TRUE, TRUE );
print_or ( TRUE, FALSE );
print_or ( FALSE, TRUE );
print_or ( FALSE, FALSE );
s_print_newline();
s_print_string ( "[not]\n" );
print_not ( TRUE );
print_not ( FALSE );
s_print_newline();
s_print_string ( "[xor]\n" );
print_xor ( TRUE, TRUE );
print_xor ( TRUE, FALSE );
print_xor ( FALSE, TRUE );
print_xor ( FALSE, FALSE );
s_print_newline();
return 0;
}
/*
*
*/
C:\usr\c\> sample-006 [and] True & True == True True & False == False False & True == False False & False == False [or] True | True == True True | False == True False | True == True False | False == False [not] ~ True == False ~ False == True [xor] True ^ True == False True ^ False == True False ^ True == True False ^ False == False C:\usr\c\>
Download : sample-007.c ( SJIS 版 )
/*
* 2011/06/24 sample-007.c
*/
/*
* 論理演算による一ビットの数の和の計算
*/
#include <stdio.h>
#include "s_print.h"
/*
* 論理値 ( 真/偽 ) を、1 bit の整数値で表現
*/
#define TRUE 1 /* 「真」を 1 で表現 */
#define FALSE 0 /* 「偽」を 0 で表現 */
#define Boolean int /* Boolean (真偽値) を int でコーディングする事にする */
/*
* print_boolean ( Boolean a )
*/
void print_boolean ( Boolean a ) /* 真偽値を表示 */
{
if ( a == TRUE ) { /* a が真ならば.. */
s_print_string ( "True" );
} else { /* a が真でないので ( 多分、偽だから.. ) */
s_print_string ( "False" );
}
}
/*
* boolean_and ( Boolean a, Boolean b ) == a & b
*/
int boolean_and ( Boolean a, Boolean b ) {
if ( a == TRUE ) { /* もし、 a が真で、.. */
if ( b == TRUE ) { /* しかも b も真ならば.. */
return TRUE; /* a and b は真 */
} else { /* b が真でないので ( 多分、偽だから.. ) */
return FALSE; /* 偽を返す */
}
} else { /* a が真でないので ( 多分、偽だから.. ) */
return FALSE; /* b を見るまでもなく偽を返す */
}
}
/*
* boolean_or ( Boolean a, Boolean b ) == a & b
*/
int boolean_or ( Boolean a, Boolean b ) {
if ( a == TRUE ) { /* もし、 a が真なら.. */
return TRUE; /* b と無関係に真 */
} else if ( b == TRUE ) { /* a が偽でも b が真なら.. */
return TRUE; /* やっぱり真 */
} else { /* いずれでもなければ.. */
return FALSE; /* 偽となる */
}
}
/*
* boolean_not ( Boolean a ) == ~ a
*/
int boolean_not ( Boolean a ) {
if ( a == TRUE ) { /* もし、 a が真なら.. */
return FALSE; /* 偽となる */
} else { /* そうでなければ.. */
return TRUE; /* 真となる */
}
}
/*
* boolean_xor ( Boolean a, Boolean b ) == a ^ b
*/
int boolean_xor ( Boolean a, Boolean b ) {
if ( a != b ) { /* もし、 a と b が異れば */
return TRUE; /* 真となる */
} else { /* それ以外は */
return FALSE; /* 偽となる */
}
}
/*
* print_half_adder ( Boolean a, Boolean b ) : 一桁の二進数の和の計算を、論理演算で行う
*/
void print_half_adder ( Boolean a, Boolean b ) {
s_print_int ( boolean_and ( a, b ) ); /* 二桁目は、二つの数の論理積 */
s_print_int ( boolean_xor ( a, b ) ); /* 一桁目は、二つの数の排他論理和 (論理差) */
}
/*
* print_1bit_add ( Boolean a, Boolean b ) : 一桁の二進数の和の計算の表示
*/
void print_1bit_add ( Boolean a, Boolean b ) {
s_print_int ( a );
s_print_string ( " + " );
s_print_int ( b );
s_print_string ( " == " );
print_half_adder ( a, b );
s_print_newline();
}
/*
*
*/
int main ( void ) {
s_print_string ( "一ビットの数の和\n" );
print_1bit_add ( 0, 0 );
print_1bit_add ( 1, 0 );
print_1bit_add ( 0, 1 );
print_1bit_add ( 1, 1 );
return 0;
}
/*
*
*/
C:\usr\c\> sample-007 一ビットの数の和 0 + 0 == 00 1 + 0 == 01 0 + 1 == 01 1 + 1 == 10 C:\usr\c\>
Download : sample-008.c ( SJIS 版 )
/*
* 2011/06/24 sample-008.c
*/
/*
* 論理演算による二進数の和の計算
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
#define CHAR_BIT_SIZE ( 8 * sizeof ( char ) ) /* char 型の bit 長さ */
/*
*
*/
void print_binary_digit ( unsigned int number, int digits ) {
if ( digits <= 0 ) {
/* 全ての桁を表示したのでやることなし */
} else {
print_binary_digit ( number / 2, digits - 1 ); /* とりあえず上位の桁を表示 */
s_print_int ( number % 2 ); /* 最下位の桁一桁を表示 */
}
}
/*
* 論理値 ( 真/偽 ) を、1 bit の整数値で表現
*/
#define TRUE 1 /* 「真」を 1 で表現 */
#define FALSE 0 /* 「偽」を 0 で表現 */
#define Boolean int /* Boolean (真偽値) を int でコーディングする事にする */
/*
* print_boolean ( Boolean a )
*/
void print_boolean ( Boolean a ) /* 真偽値を表示 */
{
if ( a == TRUE ) { /* a が真ならば.. */
s_print_string ( "True" );
} else { /* a が真でないので ( 多分、偽だから.. ) */
s_print_string ( "False" );
}
}
/*
* boolean_and ( Boolean a, Boolean b ) == a & b
*/
int boolean_and ( Boolean a, Boolean b ) {
if ( a == TRUE ) { /* もし、 a が真で、.. */
if ( b == TRUE ) { /* しかも b も真ならば.. */
return TRUE; /* a and b は真 */
} else { /* b が真でないので ( 多分、偽だから.. ) */
return FALSE; /* 偽を返す */
}
} else { /* a が真でないので ( 多分、偽だから.. ) */
return FALSE; /* b を見るまでもなく偽を返す */
}
}
/*
* boolean_or ( Boolean a, Boolean b ) == a & b
*/
int boolean_or ( Boolean a, Boolean b ) {
if ( a == TRUE ) { /* もし、 a が真なら.. */
return TRUE; /* b と無関係に真 */
} else if ( b == TRUE ) { /* a が偽でも b が真なら.. */
return TRUE; /* やっぱり真 */
} else { /* いずれでもなければ.. */
return FALSE; /* 偽となる */
}
}
/*
* boolean_not ( Boolean a ) == ~ a
*/
int boolean_not ( Boolean a ) {
if ( a == TRUE ) { /* もし、 a が真なら.. */
return FALSE; /* 偽となる */
} else { /* そうでなければ.. */
return TRUE; /* 真となる */
}
}
/*
* boolean_xor ( Boolean a, Boolean b ) == a ^ b
*/
int boolean_xor ( Boolean a, Boolean b ) {
if ( a != b ) { /* もし、 a と b が異れば */
return TRUE; /* 真となる */
} else { /* それ以外は */
return FALSE; /* 偽となる */
}
}
/*
* calc_carray_with_carray ( Boolean a, Boolean b, Boolean carray ) 三つの 1 \
bit の数の繰り上がりの計算をする
*/
Boolean calc_carray_with_carray ( Boolean a, Boolean b, Boolean carray ) {
return boolean_or ( boolean_and ( a, b ), boolean_or ( boolean_and ( a, \
carray ), boolean_and ( b, carray ) ) );
}
/*
* calc_1bit_with_carray ( Boolean a, Boolean b, Boolean carray ) 三つの 1 bit \
の数の一桁目を計算する
*/
Boolean calc_1bit_with_carray ( Boolean a, Boolean b, Boolean carray ) {
return boolean_xor ( boolean_xor ( a, b ), carray );
}
/*
* print_nbit_adder_with_carray ( unsigned int aa, unsigned int bb, Boolean \
carray, int digits ) 繰り上がり付きの計算
*/
void print_nbit_adder_with_carray ( unsigned int aa, unsigned int bb, \
Boolean carray, int digits ) {
if ( digits <= 0 ) { /* 全ての桁を計算したので .. */
s_print_int ( carray ); /* 繰り上がりを表示 */
} else { /* そうでなければ.. */
print_nbit_adder_with_carray ( aa / 2, bb / 2, calc_carray_with_carray ( \
aa % 2, bb % 2, carray ), digits - 1 );
/* 繰り上がり付きで、上位桁を表示 : 再帰呼出 */
s_print_int ( calc_1bit_with_carray ( aa % 2, bb % 2, carray ) );
/* 繰り上がり付きで、最下位桁を表示 */
}
}
/*
* print_nbit_adder ( int aa, int bb ) n bit の和の計算
*/
void print_nbit_adder ( int aa, int bb ) {
print_binary_digit ( aa, CHAR_BIT_SIZE );
s_print_string ( " + " );
print_binary_digit ( bb, CHAR_BIT_SIZE );
s_print_string ( " == " );
print_nbit_adder_with_carray ( aa, bb, 0, CHAR_BIT_SIZE );
s_print_newline();
}
/*
*
*/
int main ( void ) {
s_print_string ( "76543210 76543210 876543210\n" );
print_nbit_adder ( 0, 0 );
print_nbit_adder ( 1, 0 );
print_nbit_adder ( 0, 1 );
print_nbit_adder ( 1, 1 );
print_nbit_adder ( 3, 5 );
print_nbit_adder ( 10, 20 );
print_nbit_adder ( 11, 21 );
return 0;
}
/*
*
*/
C:\usr\c\> sample-008 76543210 76543210 876543210 00000000 + 00000000 == 000000000 00000001 + 00000000 == 000000001 00000000 + 00000001 == 000000001 00000001 + 00000001 == 000000010 00000011 + 00000101 == 000001000 00001010 + 00010100 == 000011110 00001011 + 00010101 == 000100000 C:\usr\c\>
Download : sample-009.c ( SJIS 版 )
/*
* 2011/06/24 sample-009.c
*/
/*
* 二進数の和の計算でのオーバーフロー
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
#define CHAR_BIT_SIZE ( 8 * sizeof ( char ) ) /* char 型の bit 長さ */
/*
*
*/
void print_binary_digit ( unsigned int number, int digits ) {
if ( digits <= 0 ) {
/* 全ての桁を表示したのでやることなし */
} else {
print_binary_digit ( number / 2, digits - 1 ); /* とりあえず上位の桁を表示 */
s_print_int ( number % 2 ); /* 最下位の桁一桁を表示 */
}
}
/*
* 論理値 ( 真/偽 ) を、1 bit の整数値で表現
*/
#define TRUE 1 /* 「真」を 1 で表現 */
#define FALSE 0 /* 「偽」を 0 で表現 */
#define Boolean int /* Boolean (真偽値) を int でコーディングする事にする */
/*
* print_boolean ( Boolean a )
*/
void print_boolean ( Boolean a ) /* 真偽値を表示 */
{
if ( a == TRUE ) { /* a が真ならば.. */
s_print_string ( "True" );
} else { /* a が真でないので ( 多分、偽だから.. ) */
s_print_string ( "False" );
}
}
/*
* boolean_and ( Boolean a, Boolean b ) == a & b
*/
int boolean_and ( Boolean a, Boolean b ) {
if ( a == TRUE ) { /* もし、 a が真で、.. */
if ( b == TRUE ) { /* しかも b も真ならば.. */
return TRUE; /* a and b は真 */
} else { /* b が真でないので ( 多分、偽だから.. ) */
return FALSE; /* 偽を返す */
}
} else { /* a が真でないので ( 多分、偽だから.. ) */
return FALSE; /* b を見るまでもなく偽を返す */
}
}
/*
* boolean_or ( Boolean a, Boolean b ) == a & b
*/
int boolean_or ( Boolean a, Boolean b ) {
if ( a == TRUE ) { /* もし、 a が真なら.. */
return TRUE; /* b と無関係に真 */
} else if ( b == TRUE ) { /* a が偽でも b が真なら.. */
return TRUE; /* やっぱり真 */
} else { /* いずれでもなければ.. */
return FALSE; /* 偽となる */
}
}
/*
* boolean_not ( Boolean a ) == ~ a
*/
int boolean_not ( Boolean a ) {
if ( a == TRUE ) { /* もし、 a が真なら.. */
return FALSE; /* 偽となる */
} else { /* そうでなければ.. */
return TRUE; /* 真となる */
}
}
/*
* boolean_xor ( Boolean a, Boolean b ) == a ^ b
*/
int boolean_xor ( Boolean a, Boolean b ) {
if ( a != b ) { /* もし、 a と b が異れば */
return TRUE; /* 真となる */
} else { /* それ以外は */
return FALSE; /* 偽となる */
}
}
/*
* calc_carray_with_carray ( Boolean a, Boolean b, Boolean carray ) 三つの 1 \
bit の数の繰り上がりの計算をする
*/
Boolean calc_carray_with_carray ( Boolean a, Boolean b, Boolean carray ) {
return boolean_or ( boolean_and ( a, b ), boolean_or ( boolean_and ( a, \
carray ), boolean_and ( b, carray ) ) );
}
/*
* calc_1bit_with_carray ( Boolean a, Boolean b, Boolean carray ) 三つの 1 bit \
の数の一桁目を計算する
*/
Boolean calc_1bit_with_carray ( Boolean a, Boolean b, Boolean carray ) {
return boolean_xor ( boolean_xor ( a, b ), carray );
}
/*
* print_nbit_adder_with_carray ( unsigned int aa, unsigned int bb, Boolean \
carray, int digits ) 繰り上がり付きの計算
*/
void print_nbit_adder_with_carray ( unsigned int aa, unsigned int bb, \
Boolean carray, int digits ) {
if ( digits <= 0 ) { /* 全ての桁を計算したので .. */
s_print_int ( carray ); /* 繰り上がりを表示 */
} else { /* そうでなければ.. */
print_nbit_adder_with_carray ( aa / 2, bb / 2, calc_carray_with_carray ( \
aa % 2, bb % 2, carray ), digits - 1 );
/* 繰り上がり付きで、上位桁を表示 : 再帰呼出 */
s_print_int ( calc_1bit_with_carray ( aa % 2, bb % 2, carray ) );
/* 繰り上がり付きで、最下位桁を表示 */
}
}
/*
* print_nbit_adder ( int aa, int bb ) n bit の和の計算
*/
void print_nbit_adder ( int aa, int bb ) {
print_binary_digit ( aa, CHAR_BIT_SIZE );
s_print_string ( " + " );
print_binary_digit ( bb, CHAR_BIT_SIZE );
s_print_string ( " == " );
print_nbit_adder_with_carray ( aa, bb, 0, CHAR_BIT_SIZE );
s_print_newline();
}
/*
*
*/
int main ( void ) {
s_print_string ( "76543210 76543210 876543210\n" );
print_nbit_adder ( 126, 1 );
print_nbit_adder ( 127, 1 );
print_nbit_adder ( -128,0 );
print_nbit_adder ( -127, -1 );
print_nbit_adder ( -128, -1 );
return 0;
}
/*
*
*/
C:\usr\c\> sample-009 76543210 76543210 876543210 01111110 + 00000001 == 001111111 01111111 + 00000001 == 010000000 10000000 + 00000000 == 010000000 10000001 + 11111111 == 110000000 10000000 + 11111111 == 101111111 C:\usr\c\>
Download : sample-010.c ( SJIS 版 )
/*
* 2011/06/24 sample-010.c
*/
/*
* 整数計算でのオーバーフロー
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
int main ( void ) {
s_print_string ( "2147483646 + 1 = " );
s_print_int ( 2147483646 + 1 );
s_print_newline();
s_print_string ( "2147483647 + 1 = " );
s_print_int ( 2147483647 + 1 );
s_print_newline();
s_print_string ( "-2147483647 - 1 = " );
s_print_int ( -2147483647 - 1 );
s_print_newline();
s_print_string ( "-2147483648 - 1 = " );
s_print_int ( -2147483648 - 1 );
s_print_newline();
return 0;
}
/*
*
*/
C:\usr\c\> sample-010 2147483646 + 1 = 2147483647 2147483647 + 1 = -2147483648 -2147483647 - 1 = -2147483648 -2147483648 - 1 = 2147483647 C:\usr\c\>
Download : sample-011.c ( SJIS 版 )
/*
* 2011/06/24 sample-011.c
*/
/*
* ポインター演算子 ( 「&」) と、間接参照演算子 ( 「*」 )
*/
#include <stdio.h>
#include "s_print.h"
/*
* ポインター値による、間接参照
*/
void int_poiner_arg_func ( int *pv ) {
s_print_int ( *pv ); /* pv == &v なので *pv = *(&v) == v と同じ */
s_print_newline();
/*
+-----------+
pv -> | 0x04 | <= *pv
+-----------+
| 0x03 |
+-----------+
| 0x02 |
+-----------+
| 0x01 |
+-----------+
*/
}
/*
*
*/
void int_arg_func ( int v ) {
s_print_string ( "直接 : " );
s_print_int ( v );
s_print_newline();
/*
+-----------+
v => | 0x04 |
+-----------+
| 0x03 |
+-----------+
| 0x02 |
+-----------+
| 0x01 |
+-----------+
*/
s_print_string ( "間接 : " );
int_poiner_arg_func ( &v ); /* v のポインターをとりだし、それを値として渡す */
/*
+-----------+
&v -> | 0x04 |
+-----------+
| 0x03 |
+-----------+
| 0x02 |
+-----------+
| 0x01 |
+-----------+
*/
}
/*
*
*/
int main ( void ) {
int_arg_func ( 0x01020304 );
/*
+-----------+
引数 => | 0x04 |
+-----------+
| 0x03 |
+-----------+
| 0x02 |
+-----------+
| 0x01 |
+-----------+
*/
return 0;
}
/*
*
*/
C:\usr\c\> sample-011 直接 : 16909060 間接 : 16909060 C:\usr\c\>
Download : sample-012.c ( SJIS 版 )
/*
* 2011/06/24 sample-012.c
*/
/*
*
*/
#include <stdio.h>
#include "s_print.h"
/*
* 文字型へのポインター ( char * 型 )
*/
void char_poiner_arg_func ( char *pv ) {
s_print_hex ( (int) pv );
s_print_string ( " : " );
s_print_int ( *pv );
/*
+-----------+
pv -> | 0x04 | <= *pv : char * なので、 1 byte だけ参照される
+-----------+
| 0x03 |
+-----------+
| 0x02 |
+-----------+
| 0x01 |
+-----------+
*/
s_print_newline();
}
/*
* 整数型へのポインター ( int * 型 )
*/
void int_poiner_arg_func ( int *pv ) {
s_print_hex ( (int) pv );
s_print_string ( " : " );
s_print_int ( *pv );
/*
+-----------+
pv -> | 0x04 | <= *pv : int * なので、 4 byte 全体が参照される
+-----------+
| 0x03 |
+-----------+
| 0x02 |
+-----------+
| 0x01 |
+-----------+
*/
s_print_newline();
}
/*
*
*/
void int_arg_func ( int v ) {
s_print_string ( "直接 : " );
s_print_int ( v );
s_print_newline();
s_print_string ( " int *: " );
int_poiner_arg_func ( &v ); /* v のポインターを (int *) で渡す */
s_print_string ( "char *: " );
char_poiner_arg_func ( (char *)&v ); /* v のポインターを (char *) で渡す */
}
/*
*
*/
int main ( void ) {
int_arg_func ( 0x01020304 );
/*
+-----------+
引数 => | 0x04 |
+-----------+
| 0x03 |
+-----------+
| 0x02 |
+-----------+
| 0x01 |
+-----------+
*/
return 0;
}
/*
*
*/
C:\usr\c\> sample-012 直接 : 16909060 int *: bfeab5a0 : 16909060 char *: bfeab5a0 : 4 C:\usr\c\>
Download : sample-013.c ( SJIS 版 )
/*
* 2011/06/24 sample-013.c
*/
/*
* ポインターの型の違いによるアドレス値の違い
*/
#include <stdio.h>
#include "s_print.h"
/*
* 文字型へのポインター ( char * 型 )
*/
void char_poiner_arg_func ( char *pv ) {
/* *(pv+0) */
s_print_hex ( (int) pv + 0 );
s_print_string ( " : " );
s_print_int ( *(pv+0) );
/*
+-----------+
pv -> | 0x04 | <= *(pv + 0) : char * なので、 1 byte だけ参照される
+-----------+
| 0x03 |
+-----------+
| 0x02 |
+-----------+
| 0x01 |
+-----------+
*/
s_print_newline();
/* *(pv+1) */
s_print_hex ( (int) pv + 1 );
s_print_string ( " : " );
s_print_int ( *(pv+1) );
/*
+-----------+
pv+0 -> | 0x04 |
+-----------+
pv+1 -> | 0x03 | <= *(pv + 1) : char * なので、 1 byte だけ参照される
+-----------+
| 0x02 |
+-----------+
| 0x01 |
+-----------+
*/
s_print_newline();
/* *(pv+2) */
s_print_hex ( (int) pv + 2 );
s_print_string ( " : " );
s_print_int ( *(pv+2) );
/*
+-----------+
pv+0 -> | 0x04 |
+-----------+
| 0x03 |
+-----------+
pv+2 -> | 0x02 | <= *(pv + 2) : char * なので、 1 byte だけ参照される
+-----------+
| 0x01 |
+-----------+
*/
s_print_newline();
/* *(pv+3) */
s_print_hex ( (int) pv + 3 );
s_print_string ( " : " );
s_print_int ( *(pv+3) );
/*
+-----------+
pv+0 -> | 0x04 |
+-----------+
| 0x03 |
+-----------+
| 0x02 |
+-----------+
pv+2 -> | 0x01 | <= *(pv + 2) : char * なので、 1 byte だけ参照される
+-----------+
*/
s_print_newline();
}
/*
*
*/
void int_arg_func ( int v ) {
s_print_int ( v );
s_print_newline();
char_poiner_arg_func ( (char *)&v ); /* v のポインターを (char *) で渡す */
}
/*
*
*/
int main ( void ) {
int_arg_func ( 0x01020304 );
/*
+-----------+
引数 => | 0x04 |
+-----------+
| 0x03 |
+-----------+
| 0x02 |
+-----------+
| 0x01 |
+-----------+
*/
return 0;
}
/*
*
*/
C:\usr\c\> sample-013 16909060 bfb46560 : 4 bfb46561 : 3 bfb46562 : 2 bfb46563 : 1 C:\usr\c\>
Download : sample-014.c ( SJIS 版 )
/*
* 2011/06/24 sample-014.c
*/
/*
* ポインターの型の違いによる参照領域の違い
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
void int_arg_func ( int v0, int v1 ) {
s_print_string ( "sizeof ( int ) = " );
s_print_int ( sizeof ( int ) );
s_print_newline();
s_print_string ( "元のポインター値 : " );
s_print_hex ( (int) &v0 );
s_print_newline();
s_print_string ( " 値 : " );
s_print_hex ( (int) *&v0 );
s_print_newline();
s_print_string ( "元のポインター値 : " );
s_print_hex ( (int) (&v0+1) );
s_print_newline();
s_print_string ( " 値 : " );
s_print_hex ( (int) *(&v0+1) );
s_print_newline();
/*
+-----------+
v0 => | 0x04 | <- &v0 + 0
+-----------+
| 0x03 |
+-----------+
| 0x02 |
+-----------+
| 0x01 |
+-----------+
+-----------+
v1 => | 0x08 | <- &v0 + 1
+-----------+
| 0x07 |
+-----------+
| 0x06 |
+-----------+
| 0x05 |
+-----------+
*/
s_print_newline();
s_print_string ( "sizeof ( char ) = " );
s_print_int ( sizeof ( char ) );
s_print_newline();
s_print_string ( "元のポインター値 : " );
s_print_hex ( (int)(char *)&v0 );
s_print_newline();
s_print_string ( " 値 : " );
s_print_hex ( (int) *(char *)&v0 );
s_print_newline();
s_print_string ( "ポインター値 + 1 : " );
s_print_hex ( (int) ((char *)&v0+1) );
s_print_newline();
s_print_string ( " 値 : " );
s_print_hex ( (int) *((char *)&v0+1) );
s_print_newline();
/*
+-----------+
&v0 -> | 0x04 | <- (char *) &v0 + 0
+-----------+
| 0x03 | <- (char *) &v0 + 1
+-----------+
| 0x02 |
+-----------+
| 0x01 |
+-----------+
+-----------+
v1 => | 0x08 | <- (char *) &v0 + 4
+-----------+
| 0x07 | <- (char *) &v0 + 5
+-----------+
| 0x06 |
+-----------+
| 0x05 |
+-----------+
*/
s_print_string ( "ポインター値 + 4 : " );
s_print_hex ( (int) ((char *)&v0+4) );
s_print_newline();
s_print_string ( " 値 : " );
s_print_hex ( (int) *((char *)&v0+4) );
s_print_newline();
s_print_string ( "ポインター値 + 5 : " );
s_print_hex ( (int) ((char *)&v0+5) );
s_print_newline();
s_print_string ( " 値 : " );
s_print_hex ( (int) *((char *)&v0+5) );
s_print_newline();
}
/*
*
*/
int main ( void ) {
int_arg_func ( 0x01020304, 0x05060708 );
/*
+-----------+
引数 | 0x04 |
+-----------+
| 0x03 |
+-----------+
| 0x02 |
+-----------+
| 0x01 |
+-----------+
+-----------+
| 0x08 |
+-----------+
| 0x07 |
+-----------+
| 0x06 |
+-----------+
| 0x05 |
+-----------+
*/
return 0;
}
/*
*
*/
C:\usr\c\> sample-014
sizeof ( int ) = 4
元のポインター値 : bfb79a90
値 : 1020304
元のポインター値 : bfb79a94
値 : 5060708
sizeof ( char ) = 1
元のポインター値 : bfb79a90
値 : 4
ポインター値 + 1 : bfb79a91
値 : 3
ポインター値 + 4 : bfb79a94
値 : 8
ポインター値 + 5 : bfb79a95
値 : 7
C:\usr\c\>
Download : sample-015.c ( SJIS 版 )
/*
* 2011/06/24 sample-015.c
*/
/*
* ポインターにより、異なる型としてメモリセルを参照する
*/
#include <stdio.h>
#include "s_print.h"
/*
* 文字型へのポインター値 ( char * )
*/
void char_poiner_arg_func ( char *pv ) {
/* *(pv+0) */
s_print_hex ( (int) pv );
s_print_string ( " : " );
s_print_int ( pv[0] );
s_print_string ( " " );
s_print_int ( pv[1] );
s_print_string ( " " );
s_print_int ( pv[2] );
s_print_string ( " " );
s_print_int ( pv[3] );
s_print_newline();
/*
+-----------+
pv -> | 0x04 | <= pv[0]
+-----------+
| 0x03 | <= pv[1]
+-----------+
| 0x02 | <= pv[2]
+-----------+
| 0x01 | <= pv[3]
+-----------+
*/
}
/*
*
*/
void int_arg_func ( int v ) {
s_print_hex ( v );
s_print_newline();
char_poiner_arg_func ( (char *)&v ); /* v のポインターを (char *) で渡す */
/*
+-----------+
&v -> | 0x04 | <= v
+-----------+
| 0x03 |
+-----------+
| 0x02 |
+-----------+
| 0x01 |
+-----------+
*/
}
/*
*
*/
int main ( void ) {
int_arg_func ( 0x01020304 );
/*
+-----------+
| 0x04 | <= 引数
+-----------+
| 0x03 |
+-----------+
| 0x02 |
+-----------+
| 0x01 |
+-----------+
*/
return 0;
}
/*
*
*/
C:\usr\c\> sample-015 1020304 bfdc92a0 : 4 3 2 1 C:\usr\c\>
Download : sample-016.c ( SJIS 版 )
/*
* 2011/06/24 sample-016.c
*/
/*
* 連続した引数を間接的に参照する
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
void print_data_while_positive ( int *pv ) {
if ( *pv <= 0 ) { /* 値が負だった */
/* なにもすることはない */
/*
+-----------+
| 3 |
+-----------+
| 4 |
+-----------+
| 9 |
+-----------+
| 12 |
+-----------+
| -1 | <- pv : 最後を指している
+-----------+
*/
} else {
s_print_int ( *pv ); /* とりあえず、一個出力 */
s_print_string ( " " ); /* 間に空白を入れて.. */
print_data_while_positive ( pv + 1 ); /* 残りは再帰で */
/*
+-----------+
| 3 |
+-----------+
*pv => | 4 | <- pv : 途中を指している
+-----------+
| 9 | <- pv + 1 : 残りを指している
+-----------+
| 12 |
+-----------+
| -1 |
+-----------+
*/
}
}
/*
*
*/
void print_many_args ( int v, ... ) { /* ... は、幾つ引数があるかわからないという事.. */
print_data_while_positive ( &v ); /* 複数の引数の先頭のポインターを渡す */
s_print_newline();
/*
+-----------+
v => | 3 | <- &v
+-----------+
| 4 |
+-----------+
| 9 |
+-----------+
| 12 |
+-----------+
| -1 |
+-----------+
*/
}
/*
*
*/
int main ( void ) {
print_many_args ( 3, 4, 9, 12, -1 );
/*
+-----------+
引数 | 3 |
+-----------+
| 4 |
+-----------+
| 9 |
+-----------+
| 12 |
+-----------+
| -1 |
+-----------+
*/
print_many_args ( 9, 2, 8, -2, 3, 5, -1 );
/*
+-----------+
引数 | 9 |
+-----------+
| 2 |
+-----------+
| 8 |
+-----------+
| -2 |
+-----------+
| 3 |
+-----------+
| 5 |
+-----------+
| -1 |
+-----------+
*/
return 0;
}
/*
*
*/
C:\usr\c\> sample-016 3 4 9 12 9 2 8 C:\usr\c\>
Download : sample-017.c ( SJIS 版 )
/*
* 2011/06/24 sample-017.c
*/
/*
* 階乗の計算 ( 数学的な解釈 )
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
int factrial ( int n ) {
if ( n == 1 ) {
return 1;
} else {
return n * factrial ( n - 1 );
}
}
/*
*
*/
int main ( void ) {
s_print_string ( "4! = " );
s_print_int ( factrial ( 4 ) );
s_print_newline();
/*
数学的解釈
f ( 4 )
=> 4 * f ( 3 )
=> 4 * ( 3 * f ( 2 ) )
=> 4 * ( 3 * ( 2 * f ( 1 ) ) )
=> 4 * ( 3 * ( 2 * 1 ) )
=> 4 * ( 3 * 2 )
=> 4 * 6
=> 24
*/
s_print_string ( "6! = " );
s_print_int ( factrial ( 6 ) );
s_print_newline();
return 0;
}
/*
*
*/
C:\usr\c\> sample-017 4! = 24 6! = 720 C:\usr\c\>
Download : sample-018.c ( SJIS 版 )
/*
* 2011/06/24 sample-018.c
*/
/*
* 階乗の計算 ( メモリモデル的解釈 )
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
int factrial ( int n ) {
s_print_string ( "メモリ : " );
s_print_hex ( &n );
s_print_string ( " -> " );
s_print_int ( n );
s_print_newline();
if ( n == 1 ) {
return 1;
} else {
return n * factrial ( n - 1 );
}
}
/*
*
*/
int main ( void ) {
s_print_string ( "4! = " );
s_print_int ( factrial ( 4 ) );
s_print_newline();
/*
メモリモデル
f ( 4 )
+---------------+
n=> | 4 |
+---------------+
=> f ( 3 )
+---------------+
| 4 |
+---------------+
| ? |
+---------------+
n=> | 3 |
+---------------+
=> f ( 2 )
+---------------+
| 4 |
+---------------+
| ? |
+---------------+
| 3 |
+---------------+
| ? |
+---------------+
n=> | 2 |
+---------------+
=> f ( 1 )
+---------------+
| 4 |
+---------------+
| ? |
+---------------+
| 3 |
+---------------+
| ? |
+---------------+
| 2 |
+---------------+
| ? |
+---------------+
n=> | 1 |
+---------------+
=> return 1;
=> 1
+---------------+
| 4 |
+---------------+
| ? |
+---------------+
| 3 |
+---------------+
| ? |
+---------------+
n=> | 2 |
+---------------+
=> return n * 1;
=> return 2 * 1;
=> return 2;
=> 2
+---------------+
| 4 |
+---------------+
| ? |
+---------------+
n=> | 3 |
+---------------+
=> return n * 2;
=> return 3 * 2;
=> return 6;
=> 6
+---------------+
n=> | 4 |
+---------------+
=> return n * 6;
=> return 4 * 6;
=> return 24;
=> 24
*/
s_print_string ( "6! = " );
s_print_int ( factrial ( 6 ) );
s_print_newline();
return 0;
}
/*
*
*/
C:\usr\c\> sample-018 4! = メモリ : bf9d60c0 -> 4 メモリ : bf9d60a0 -> 3 メモリ : bf9d6080 -> 2 メモリ : bf9d6060 -> 1 24 6! = メモリ : bf9d60c0 -> 6 メモリ : bf9d60a0 -> 5 メモリ : bf9d6080 -> 4 メモリ : bf9d6060 -> 3 メモリ : bf9d6040 -> 2 メモリ : bf9d6020 -> 1 720 C:\usr\c\>
Download : sample-019.c ( SJIS 版 )
/*
* 2011/06/24 sample-019.c
*/
/*
* ポインター型変数のポインター値
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
#define EOS '\0'
/*
*
*/
void print_many_string_args_while_empty ( char *ptr[] )
{
if ( *ptr[0] == EOS ) { /* 空文字列が与えられた */
/* なにもする必要はない */
/*
+-----------+ +-----+
| *-------+-------------------------------------> | 'a' |
+-----------+ +-----+ +-----+
| *-------+------------------------> | '1' | | 'b' |
+-----------+ +-----+ +-----+ +-----+
| *-------+-------------> | | | '2' | | 'c' |
+-----------+ +-----+ + '日'+ +-----+ +-----+
ptr -> | *-------+-> | \0 | | | | '3' | |'\0' |
+-----------+ +-----+ +-----+ +-----+ +-----+
| | | '4' |
+ '本'+ +-----+
| | | '5' |
+-----+ +-----+
| | |'\0' |
+ '語'+ +-----+
| |
+-----+
|'\0' |
+-----+
*/
} else { /* プリントするものがある */
s_print_string ( ptr[0] ); /* 先頭の文字列を出力 */
s_print_newline();
print_many_string_args_while_empty ( ptr + 1 ); /* 残りを出力 */
/*
+-----------+ +-----+
ptr -> | *-------+-------------------------------------> | 'a' | <- ptr[0]
+-----------+ +-----+ +-----+
ptr+1-> | *-------+------------------------> | '1' | | 'b' |
+-----------+ +-----+ +-----+ +-----+
| *-------+-------------> | | | '2' | | 'c' |
+-----------+ +-----+ + '日'+ +-----+ +-----+
| *-------+-> | \0 | | | | '3' | |'\0' |
+-----------+ +-----+ +-----+ +-----+ +-----+
| | | '4' |
+ '本'+ +-----+
| | | '5' |
+-----+ +-----+
| | |'\0' |
+ '語'+ +-----+
| |
+-----+
|'\0' |
+-----+
*/
}
}
/*
*
*/
void print_many_string_args ( char *top, ... ) { /* 引数が沢山 */
print_many_string_args_while_empty ( &top );
/*
+-----------+ +-----+
top => | *-------+-------------------------------------> | 'a' |
+-----------+ +-----+ +-----+
| *-------+------------------------> | '1' | | 'b' |
+-----------+ +-----+ +-----+ +-----+
| *-------+-------------> | | | '2' | | 'c' |
+-----------+ +-----+ + '日'+ +-----+ +-----+
| *-------+-> | \0 | | | | '3' | |'\0' |
+-----------+ +-----+ +-----+ +-----+ +-----+
| | | '4' |
+ '本'+ +-----+
| | | '5' |
+-----+ +-----+
| | |'\0' |
+ '語'+ +-----+
| |
+-----+
|'\0' |
+-----+
*/
}
/*
*
*/
int main ( void ) {
print_many_string_args ( "abc", "12345", "日本語", "" );
s_print_newline();
/*
+-----------+ +-----+
| *-------+-------------------------------------> | 'a' |
+-----------+ +-----+ +-----+
| *-------+------------------------> | '1' | | 'b' |
+-----------+ +-----+ +-----+ +-----+
| *-------+-------------> | | | '2' | | 'c' |
+-----------+ +-----+ + '日'+ +-----+ +-----+
| *-------+-> | \0 | | | | '3' | |'\0' |
+-----------+ +-----+ +-----+ +-----+ +-----+
| | | '4' |
+ '本'+ +-----+
| | | '5' |
+-----+ +-----+
| | |'\0' |
+ '語'+ +-----+
| |
+-----+
|'\0' |
+-----+
*/
print_many_string_args ( "1111", "bbb", "漢漢漢漢漢", "A", "" );
s_print_newline();
return 0;
}
/*
*
*/
C:\usr\c\> sample-019 abc 12345 日本語 1111 bbb 漢漢漢漢漢 A C:\usr\c\>
Download : sample-020.c ( SJIS 版 )
/*
* 2011/06/24 sample-020.c
*/
/*
* main 関数の引数
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
#define EOS '\0'
/*
*
*/
void print_many_string_args_while_empty ( int argc, char *argv[] ) {
if ( argc <= 0 ) {
/* なにもする必要はない */
} else { /* プリントするものがある */
s_print_string ( argv[0] ); /* 先頭の文字列を出力 */
s_print_newline();
print_many_string_args_while_empty ( argc - 1, argv + 1 );
}
}
/*
*
*/
int main ( int argc, char *argv[] ) {
print_many_string_args_while_empty ( argc, argv );
return 0;
}
/*
*
*/
C:\usr\c\> sample-020 ./a.out C:\usr\c\>
Download : 20110624-01.c ( SJIS 版 )
/*
* 20110624-1-QQQQ.c
* 論理演算による符号なし 8 bit 二進数の足し算
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
#define CHAR_BIT_SIZE ( 8 * sizeof ( char ) ) /* char 型の bit 長さ */
/*
*
*/
void print_binary_digit ( unsigned int number, int digits ) {
if ( digits <= 0 ) {
/* 全ての桁を表示したのでやることなし */
} else {
print_binary_digit ( number / 2, digits - 1 ); /* とりあえず上位の桁を表示 */
s_print_int ( number % 2 ); /* 最下位の桁一桁を表示 */
}
}
/*
* 論理値 ( 真/偽 ) を、1 bit の整数値で表現
*/
#define TRUE 1 /* 「真」を 1 で表現 */
#define FALSE 0 /* 「偽」を 0 で表現 */
#define Boolean int /* Boolean (真偽値) を int でコーディングする事にする */
/*
* print_boolean ( Boolean a )
*/
void print_boolean ( Boolean a ) /* 真偽値を表示 */
{
if ( a == TRUE ) { /* a が真ならば.. */
s_print_string ( "True" );
} else { /* a が真でないので ( 多分、偽だから.. ) */
s_print_string ( "False" );
}
}
/*
* boolean_and ( Boolean a, Boolean b ) == a & b
*/
int boolean_and ( Boolean a, Boolean b ) {
if ( a == TRUE ) { /* もし、 a が真で、.. */
if ( b == TRUE ) { /* しかも b も真ならば.. */
return TRUE; /* a and b は真 */
} else { /* b が真でないので ( 多分、偽だから.. ) */
return FALSE; /* 偽を返す */
}
} else { /* a が真でないので ( 多分、偽だから.. ) */
return FALSE; /* b を見るまでもなく偽を返す */
}
}
/*
* boolean_or ( Boolean a, Boolean b ) == a & b
*/
int boolean_or ( Boolean a, Boolean b ) {
if ( a == TRUE ) { /* もし、 a が真なら.. */
return TRUE; /* b と無関係に真 */
} else if ( b == TRUE ) { /* a が偽でも b が真なら.. */
return TRUE; /* やっぱり真 */
} else { /* いずれでもなければ.. */
return FALSE; /* 偽となる */
}
}
/*
* boolean_not ( Boolean a ) == ~ a
*/
int boolean_not ( Boolean a ) {
if ( a == TRUE ) { /* もし、 a が真なら.. */
return FALSE; /* 偽となる */
} else { /* そうでなければ.. */
return TRUE; /* 真となる */
}
}
/*
* boolean_xor ( Boolean a, Boolean b ) == a ^ b
*/
int boolean_xor ( Boolean a, Boolean b ) {
if ( a != b ) { /* もし、 a と b が異れば */
return TRUE; /* 真となる */
} else { /* それ以外は */
return FALSE; /* 偽となる */
}
}
/*
* calc_carray_with_carray ( Boolean a, Boolean b, Boolean carray ) 三つの 1 \
bit の数の繰り上がりの計算をする
*/
Boolean calc_carray_with_carray ( Boolean a, Boolean b, Boolean carray ) {
return boolean_or ( boolean_and ( a, b ), boolean_or ( boolean_and ( a, \
carray ), boolean_and ( b, carray ) ) );
}
/*
* calc_1bit_with_carray ( Boolean a, Boolean b, Boolean carray ) 三つの 1 bit \
の数の一桁目を計算する
*/
Boolean calc_1bit_with_carray ( Boolean a, Boolean b, Boolean carray ) {
return boolean_xor ( boolean_xor ( a, b ), carray );
}
/*
* calc_nbit_adder_with_carray ( unsigned int aa, unsigned int bb, Boolean \
carray, int digits ) 繰り上がり付きの計算
*/
int calc_nbit_adder_with_carray ( unsigned int aa, unsigned int bb, Boolean \
carray, int digits ) {
if ( digits <= 0 ) { /* 全ての桁を計算したので .. */
/*
** この部分を完成させなさい
*/
} else { /* そうでなければ.. */
return
/*
** この部分を完成させなさい
*/
/* 繰り上がり付きで、上位桁を計算したものを 2 倍にして : 再帰呼出 */
+
/*
** この部分を完成させなさい
*/
/* 繰り上がり付きで、最下位桁の計算結果と加える */
}
}
/*
* calc_nbit_adder ( int aa, int bb )
*/
int calc_nbit_adder ( int aa, int bb ) {
return calc_nbit_adder_with_carray ( aa, bb, 0, CHAR_BIT_SIZE );
}
/*
* print_bin_and_dec ( int aa )
*/
void print_bin_and_dec ( int aa, int digits ) {
print_binary_digit ( aa, digits );
s_print_string ( " ( " );
s_print_int ( aa );
s_print_string ( " ) " );
}
/*
* print_nbit_adder ( int aa, int bb ) n bit の和の計算
*/
void print_nbit_adder ( int aa, int bb ) {
print_bin_and_dec ( aa, CHAR_BIT_SIZE );
s_print_string ( " + " );
print_bin_and_dec ( bb, CHAR_BIT_SIZE );
s_print_string ( " == " );
print_bin_and_dec ( calc_nbit_adder ( aa, bb ), CHAR_BIT_SIZE + 1 ); /* 結果は \
1 bit 長くなる可能性がある.. */
s_print_newline();
}
/*
*
*/
int main ( void ) {
print_nbit_adder ( 0, 0 );
print_nbit_adder ( 1, 0 );
print_nbit_adder ( 0, 1 );
print_nbit_adder ( 1, 1 );
print_nbit_adder ( 3, 5 );
print_nbit_adder ( 10, 20 );
print_nbit_adder ( 11, 21 );
return 0;
}
/*
*
*/
C:\usr\c\> 20110624-01 00000000 ( 0 ) + 00000000 ( 0 ) == 000000000 ( 0 ) 00000001 ( 1 ) + 00000000 ( 0 ) == 000000001 ( 1 ) 00000000 ( 0 ) + 00000001 ( 1 ) == 000000001 ( 1 ) 00000001 ( 1 ) + 00000001 ( 1 ) == 000000010 ( 2 ) 00000011 ( 3 ) + 00000101 ( 5 ) == 000001000 ( 8 ) 00001010 ( 10 ) + 00010100 ( 20 ) == 000011110 ( 30 ) 00001011 ( 11 ) + 00010101 ( 21 ) == 000100000 ( 32 ) C:\usr\c\>
Download : 20110624-02.c ( SJIS 版 )
/*
* 20110624-2-QQQQ.c
*
*/
/*
* 連続した引数の和を計算する
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
int sum_data_while_positive ( int *pv ) {
if ( *pv <= 0 ) { /* 値が負だった */
/* なにも足す事はない */
return 0; /* 0 を返す */
/*
+-----------+
| 3 |
+-----------+
| 4 |
+-----------+
| 9 |
+-----------+
| 12 |
+-----------+
| -1 | <- pv : 最後を指している
+-----------+
*/
} else {
/*
** この部分を完成させなさい
*/
/* 現在の値と、残りの和を加えればよい */
/*
+-----------+
| 3 |
+-----------+
*pv => | 4 | <- pv : 途中を指している
+-----------+
| 9 | <- pv + 1 : 残りを指している
+-----------+
| 12 |
+-----------+
| -1 |
+-----------+
*/
}
}
/*
*
*/
int sum_many_args ( int v, ... ) { /* ... は、幾つ引数があるかわからないという事.. */
return sum_data_while_positive ( &v ); /* 複数の引数の先頭のポインターを渡す */
/*
+-----------+
v => | 3 | <- &v
+-----------+
| 4 |
+-----------+
| 9 |
+-----------+
| 12 |
+-----------+
| -1 |
+-----------+
*/
}
/*
*
*/
int main ( void ) {
s_print_int ( sum_many_args ( 3, 4, 9, 12, -1 ) );
s_print_newline();
/*
+-----------+
引数 | 3 |
+-----------+
| 4 |
+-----------+
| 9 |
+-----------+
| 12 |
+-----------+
| -1 |
+-----------+
*/
s_print_int ( sum_many_args ( 9, 2, 8, -2, 3, 5, -1 ) );
s_print_newline();
/*
+-----------+
引数 | 9 |
+-----------+
| 2 |
+-----------+
| 8 |
+-----------+
| -2 |
+-----------+
| 3 |
+-----------+
| 5 |
+-----------+
| -1 |
+-----------+
*/
return 0;
}
/*
*
*/
C:\usr\c\> 20110624-02 28 19 C:\usr\c\>