当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/*
* 2011/07/01 sample-001.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-001 3 4 9 12 9 2 8 C:\usr\c\>
Download : sample-002.c ( SJIS 版 )
/*
* 2011/07/01 sample-002.c
*/
/*
* 階乗の計算 ( 数学的な解釈 )
*/
#include <stdio.h>
#include "s_print.h"
/*
* 1 ( n == 1 の時 ) : 規則 1
* factrial ( n ) = {
* n * factrial ( n - 1 ) ( n > 1 の時 ) : 規則 2
*/
int factrial ( int n ) {
if ( n == 1 ) { /* n == 1 なので.. */
return 1; /* 規則 1 を使う */
} else { /* それ以外は.. ( n > 1 だろうから.. ) */
return n * factrial ( n - 1 ); /* 規則 2 を使う */
}
}
/*
*
*/
int main ( void ) {
s_print_string ( "4! = " );
s_print_int ( factrial ( 4 ) );
s_print_newline();
/*
数学的解釈
f ( 4 ) ( 最初の呼出 )
=> 4 * f ( 3 ) ( 4 > 1 なので 規則 2 を使う )
=> 4 * ( 3 * f ( 2 ) ) ( 3 > 1 なので 規則 2 を使う )
=> 4 * ( 3 * ( 2 * f ( 1 ) ) ) ( 2 > 1 なので 規則 2 を使う )
=> 4 * ( 3 * ( 2 * 1 ) ) ( 1 == 1 なので 規則 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-002 4! = 24 6! = 720 C:\usr\c\>
Download : sample-003.c ( SJIS 版 )
/*
* 2011/07/01 sample-003.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-003 4! = メモリ : bff9ce10 -> 4 メモリ : bff9cdf0 -> 3 メモリ : bff9cdd0 -> 2 メモリ : bff9cdb0 -> 1 24 6! = メモリ : bff9ce10 -> 6 メモリ : bff9cdf0 -> 5 メモリ : bff9cdd0 -> 4 メモリ : bff9cdb0 -> 3 メモリ : bff9cd90 -> 2 メモリ : bff9cd70 -> 1 720 C:\usr\c\>
Download : sample-004.c ( SJIS 版 )
/*
* 2011/07/01 sample-004.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-004 abc 12345 日本語 1111 bbb 漢漢漢漢漢 A C:\usr\c\>
Download : sample-005.c ( SJIS 版 )
/*
* 2011/07/01 sample-005.c
*/
/*
* 何も指さないポインター値 (NULL)
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
#define EOS '\0'
/*
*
*/
void print_many_string_args_while_empty ( char *ptr[] )
{
if ( ptr[0] == NULL ) { /* 何も指すないポインタ値(NULL)が指定された */
/* なにもする必要はない */
/*
+-----------+ +-----+
| *-------+-------------------------------------> | 'a' |
+-----------+ +-----+ +-----+
| *-------+------------------------> | '1' | | 'b' |
+-----------+ +-----+ +-----+ +-----+
| *-------+-------------> | | | '2' | | 'c' |
+-----------+ + '日'+ +-----+ +-----+
ptr -> | NULL | <= 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' |
+-----------+ + '日'+ +-----+ +-----+
| NULL | | | | '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", "日本語", NULL );
s_print_newline();
/*
+-----------+ +-----+
| *-------+-------------------------------------> | 'a' |
+-----------+ +-----+ +-----+
| *-------+------------------------> | '1' | | 'b' |
+-----------+ +-----+ +-----+ +-----+
| *-------+-------------> | | | '2' | | 'c' |
+-----------+ +-----+ + '日'+ +-----+ +-----+
| *-------+-> | \0 | | | | '3' | |'\0' |
+-----------+ +-----+ +-----+ +-----+ +-----+
| | | '4' |
+ '本'+ +-----+
| | | '5' |
+-----+ +-----+
| | |'\0' |
+ '語'+ +-----+
| |
+-----+
|'\0' |
+-----+
*/
print_many_string_args ( "1111", "bbb", "漢漢漢漢漢", "A", NULL );
s_print_newline();
return 0;
}
/*
*
*/
C:\usr\c\> ./sample-005 abc 12345 日本語 1111 bbb 漢漢漢漢漢 A C:\usr\c\>
Download : sample-006.c ( SJIS 版 )
/*
* 2011/07/01 sample-006.c
*/
/*
* main 関数の引数
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
void print_many_string_args_while_empty ( int argc, char *argv[] ) {
if ( argc <= 0 ) { /* 引数の個数 ( 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[] ) {
/*
sample-006 abc 123 uvwxyz の時
引数
+-----------+
argc => | 4 | <= 「引数の個数 + 1」が入っている
+-----------+ +-----------+ +-----+
argv => | *-------+-> | *-------+-------------------------------------> | \
's' | <= argv[0][0]
+-----------+ +-----------+ +-----+ +-----+
| *-------+-------------------------> | 'a' | | 'a' | <= argv[0][1]
+-----------+ +-----+ +-----+ +-----+
| *-------+-------------> | '1' | | 'b' | | 'm' |
+-----------+ +-----+ +-----+ +-----+ +-----+
argv[3] => | *-------+-> | 'u' | | '2' | | 'c' | | 'p' |
+-----------+ +-----+ +-----+ +-----+ +-----+
| NULL | | 'v' | | '3' | | EOS | | 'l' |
+-----------+ +-----+ +-----+ +-----+ +-----+
| 'w' | | EOS | | 'e' |
+-----+ +-----+ +-----+
| 'x' | | '-' |
+-----+ +-----+
| 'y' | <= argv[3][4] | '0' |
+-----+ +-----+
| 'z' | | '0' |
+-----+ +-----+
| EOS | | '6' |
+-----+ +-----+
| '.' |
+-----+
| 'e' |
+-----+
| 'x' |
+-----+
| 'e' |
+-----+
| EOS |
+-----+
*/
/*
* 引数 argc に、コマンドラインの引数の個数 + 1 が入っているので、それを利用する
*/
print_many_string_args_while_empty ( argc, argv );
return 0;
}
/*
*
*/
C:\usr\c\> sample-006 abc 12345 日本語 zzz sample-006.exe abc 12345 日本語 zzz C:\usr\c\>
Download : sample-007.c ( SJIS 版 )
/*
* 2011/07/01 sample-007.c
*/
/*
* main 関数の引数
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
void print_many_string_args_while_null ( char *argv[] ) {
if ( *argv == NULL ) { /* 最後の要素 ( NULL なら最後 ) で終了判定 */
/* 何もする必要はない */
} else { /* プリントする文字列がある */
s_print_string ( argv[0] ); /* 先頭の文字列を出力 */
s_print_newline();
print_many_string_args_while_null ( argv + 1 );
}
}
/*
*
*/
int main ( int argc, char *argv[] ) {
/*
sample-006 abc 123 uvwxyz の時
引数
+-----------+
argc => | 4 | <= 「引数の個数 + 1」が入っている
+-----------+ +-----------+ +-----+
argv => | *-------+-> | *-------+-------------------------------------> | \
's' | <= argv[0][0]
+-----------+ +-----------+ +-----+ +-----+
| *-------+-------------------------> | 'a' | | 'a' | <= argv[0][1]
+-----------+ +-----+ +-----+ +-----+
| *-------+-------------> | '1' | | 'b' | | 'm' |
+-----------+ +-----+ +-----+ +-----+ +-----+
argv[3] => | *-------+-> | 'u' | | '2' | | 'c' | | 'p' |
+-----------+ +-----+ +-----+ +-----+ +-----+
最後に NULL がある | NULL | | 'v' | | '3' | | EOS | | 'l' |
+-----------+ +-----+ +-----+ +-----+ +-----+
| 'w' | | EOS | | 'e' |
+-----+ +-----+ +-----+
| 'x' | | '-' |
+-----+ +-----+
| 'y' | <= argv[3][4] | '0' |
+-----+ +-----+
| 'z' | | '0' |
+-----+ +-----+
| EOS | | '6' |
+-----+ +-----+
| '.' |
+-----+
| 'e' |
+-----+
| 'x' |
+-----+
| 'e' |
+-----+
| EOS |
+-----+
*/
/*
* 引数 argv には、コマンドラインの引数だけなく、最後に NULL も入っているので、それを利用する。
*/
print_many_string_args_while_null ( argv );
return 0;
}
/*
*
*/
C:\usr\c\> sample-007 abc 12345 日本語 zzz sample-007.exe abc 12345 日本語 zzz C:\usr\c\>
Download : sample-008.c ( SJIS 版 )
/*
* 2011/07/01 sample-008.c
*/
/*
* main 関数の引数
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
void hello ( char *now ) {
if ( !strcmp ( now, "朝" ) ) { /* 「朝」だったら.. */
s_print_string ( "おはようございます\n" );
} else if ( !strcmp ( now, "夜" ) ) { /* 「夜」だったら.. */
s_print_string ( "こんばんは\n" );
} else { /* 多分、「昼」なんだろう.. */
s_print_string ( "こんにちは\n" );
}
}
/*
*
*/
int main ( int argc, char *argv[] ) {
/*
* argc の値をみることによって、引数の個数を知る事ができる
*/
if ( argc - 1 == 1 ) { /* 引数が一つだけ */
hello ( argv[1] ); /* 最初の引数を関数に渡す */
} else {
s_print_string ( "引数は「朝」「夜」「昼」の一つを指定してください\n" );
}
return 0;
}
/*
*
*/
C:\usr\c\> sample-008 朝 おはようございます C:\usr\c\>
Download : sample-009.c ( SJIS 版 )
/*
* 2011/07/01 sample-009.c
*/
/*
* main 関数の引数
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
#define EOS '\0'
/*
* atoi : 「数字列」を十進数と見做してた時の「数値」を返す
*/
/*
* 0 : "12345"
* => 0 * 10 + '1' - '0' : "2345"
* == 1 : "2345"
* => 1 * 10 + '2' - '0' : "345"
* == 12 : "345"
* => 12 * 10 + '3' - '0' : "45"
* == 123 : "45"
* => 123 * 10 + '4' - '0' : "5"
* == 1234 : "5"
* => 1234 * 10 + '5' - '0' : ""
* == 12345 : ""
* <= 12345
* <= 12345
* <= 12345
* <= 12345
* <= 12345
* 12345
*
*/
int atoi_sub ( int value, char *string ) {
if ( *string == EOS ) {
return value;
} else {
return atoi_sub ( value * 10 + string[0] - '0', string + 1 );
}
}
int atoi ( char *string ) {
return atoi_sub ( 0, string );
}
/*
*
*/
int main ( int argc, char *argv[] ) {
/*
* argc の値をみることによって、引数の個数を知る事ができる
*/
switch ( argc - 1 ) {
case 1: /* 引数が一つ */
s_print_string ( argv[1] ); /* 計算は不要 */
break;
case 3:
switch ( argv[2][0] ) { /* 二つ目の引数は、演算子かも */
case '+': /* '+' なら.. */
s_print_int ( atoi( argv[1] ) + atoi ( argv[3] ) ); /* \
一つ目と三つ目を夫々を整数値として足し算 */
break;
case '-': /* '-' なら.. */
s_print_int ( atoi( argv[1] ) - atoi ( argv[3] ) ); /* \
一つ目と三つ目を夫々を整数値として引き算 */
break;
case '*': /* '*' なら.. */
s_print_int ( atoi( argv[1] ) * atoi ( argv[3] ) ); /* \
一つ目と三つ目を夫々を整数値として掛け算 */
break;
case '/': /* '/' なら.. */
s_print_int ( atoi( argv[1] ) / atoi ( argv[3] ) ); /* \
一つ目と三つ目を夫々を整数値として割り算 */
break;
case '%': /* '%' なら.. */
s_print_int ( atoi( argv[1] ) % atoi ( argv[3] ) ); /* \
一つ目と三つ目を夫々を整数値として余りの計算 */
break;
default:
s_print_string ( "引数は「数 演算子 数」の三つを指定する" );
break;
}
s_print_newline();
break;
defaut: /* 何れでもない */
s_print_string ( "引数は「数 演算子 数」の三つを指定する\n" );
break;
}
return 0;
}
/*
*
*/
C:\usr\c\> sample-009 123 + 89 212 C:\usr\c\>
Download : sample-010.c ( SJIS 版 )
/*
* 2011/07/01 sample-009.c
*/
/*
* main 関数の引数
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
#define EOS '\0'
/*
* strlne ( char *string ) : 文字列の長さを返す
*/
int strlen ( char *string ) {
if ( *string == EOS ) { /* 空文字列ならば.. */
return 0; /* 長さは 0 */
} else { /* そうでなければ */
return 1 + strlen ( string + 1 ); /* 先頭を取り除いた文字列の長さに 1 を加えればよい */
}
}
/*
*
*/
int main ( int argc, char *argv[] ) {
/*
* argc の値をみることによって、引数の個数を知る事ができる
*/
if ( argc - 1 == 1 ) { /* 引数が 1 つの場合 */
return strlen ( argv[1] ); /* 一つしかない引数の文字列の長さを status として返す */
} else { /* それ以外はエラーにする */
return -1; /* 文字列の長さが負になることはないので、エラーだと判る */
}
return 0;
}
/*
*
*/
C:\usr\c\> check abc 123 の長さは 3 でした C:\usr\c\>
Download : sample-011.c ( SJIS 版 )
/*
* 2011/07/01 sample-011.c
*/
/*
* 再三「Hello, World」
*/
#include <stdio.h> /* 他のファイルを取り込む命令 : printf の宣言がふくまれる .. */
/*
* main
*/
int main ( int argc, char *argv[] ) { /* 引数にはコマンドラインの情報が与えられる */
printf ( "Hello, World\n" ); /* printf は文字列を出力する、ライブラリ関数 */
/* 文字列は、文字の並びで、最後には EOS がある */
/* 引数に文字列を指定すると、文字ポインター型の値が渡される */
return 0; /* main は int 型の値を返し、それは stauts となる */
}
/*
*
*/
C:\usr\c\> sample-011 Hello, World C:\usr\c\>
Download : 20110701-01.c ( SJIS 版 )
/*
* 20110701-1-QQQQ.c
* コマンド引数で与えた式を数が八進数だとして計算して出力しなさい
*/
#include <stdio.h>
#include "s_print.h"
#include <stdio.h>
#include "s_print.h"
/*
*
*/
#define EOS '\0'
/*
* atoo : 「数字列」を八進数と見做してた時の「数値」を返す
*/
int atoo_sub ( int value, char *string ) {
if ( *string == EOS ) {
return value;
} else {
/*
** この部分を完成させなさい
*/
}
}
int atoo ( char *string ) {
return atoo_sub ( 0, string );
}
/*
*
*/
int main ( int argc, char *argv[] ) {
/*
* argc の値をみることによって、引数の個数を知る事ができる
*/
switch ( argc - 1 ) {
case 1: /* 引数が一つ */
s_print_string ( argv[1] ); /* 計算は不要 */
break;
case 3:
switch ( argv[2][0] ) { /* 二つ目の引数は、演算子かも */
case '+': /* '+' なら.. */
s_print_oct ( atoo( argv[1] ) + atoo ( argv[3] ) ); /* \
一つ目と三つ目を夫々を八進数値として足し算 */
break;
case '-': /* '-' なら.. */
s_print_oct ( atoo( argv[1] ) - atoo ( argv[3] ) ); /* \
一つ目と三つ目を夫々を八進数値として引き算 */
break;
case '*': /* '*' なら.. */
s_print_oct ( atoo( argv[1] ) * atoo ( argv[3] ) ); /* \
一つ目と三つ目を夫々を八進数値として掛け算 */
break;
case '/': /* '/' なら.. */
s_print_oct ( atoo( argv[1] ) / atoo ( argv[3] ) ); /* \
一つ目と三つ目を夫々を八進数値として割り算 */
break;
case '%': /* '%' なら.. */
s_print_oct ( atoo( argv[1] ) % atoo ( argv[3] ) ); /* \
一つ目と三つ目を夫々を八進数値として余りの計算 */
break;
default:
s_print_string ( "引数は「数 演算子 数」の三つを指定する" );
break;
}
s_print_newline();
break;
defaut: /* 何れでもない */
s_print_string ( "引数は「数 演算子 数」の三つを指定する\n" );
break;
}
return 0;
}
/*
*
*/
C:\usr\c\> 01 123 - 45 56 C:\usr\c\>