当日のOHP資料です。
c:\usr\soft> cc -I. walk2.c GLMetaseq.c pthreadVC1.lib c:\usr\soft>
c:\usr\soft> walk2 Loading Models... Done.
Download : sample-001.c ( SJIS 版 )
/*
* 2011/06/17 sample-001.c
*/
/*
* double
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
*
*/
#define ABC 123 /* 定数名 「ABC」を定義し、その値を「123」としている */
#define MYNAME "栗野俊一" /* 定数名 「MYNAME」を定義し、その値を「"栗野俊一"」としている */
/*
*
*/
int main ( void ) {
s_print_int ( 123 ); /* もちろん、「123」と出力される */
s_print_newline ();
s_print_int ( ABC ); /* 定数名 「ABC」の参照、上記と同じく「123」と出力される */
s_print_newline ();
s_print_string ( MYNAME ); /* 「"MYNAME"」でない事に注意 */
s_print_newline ();
return 0;
}
/*
*
*/
C:\usr\c\> sample-001 123 123 栗野俊一 C:\usr\c\>
Download : sample-002.c ( SJIS 版 )
/*
* 2011/06/17 sample-001.c
*/
/*
* double
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
*
*/
int main ( void ) {
s_print_string ( "小数点数付きの数をキーボードから入力してください。その数を二倍にします : " );
s_print_double ( s_input_double() * 2.0 );
s_print_newline();
return 0;
}
/*
*
*/
12.34
C:\usr\c\> sample-002 C:\usr\c\>
Download : sample-003.c ( SJIS 版 )
/*
* 2011/06/17 sample-003.c
*/
/*
* double
*/
#include <stdio.h>
#include <math.h> /* 数学関数を利用する場合はこれを追加する */
#include "s_print.h"
#include "s_input.h"
/*
*
*/
void plot_dot_sub ( double pos, double value ) {
if ( pos >= value ) { /* 印刷位置まだきた */
s_print_char ( '*' ); /* 「点」を出力 */
s_print_newline (); /* この行は終り */
} else {
s_print_char ( ' ' ); /* 空白を出力 */
plot_dot_sub ( pos + 1.0, value ); /* 続きを計算 */
}
}
/*
* 0 〜 79 で、 -1.0 〜 1.0 を表現するには、
* x | -1.0 〜 1.0 | x
* --+-------------+---------------
* y | 0 〜 79 | ( x + 1 ) * 40
*/
#define WIDTH 80.0 /* 一行の中のカラム数を定義 */
void plot_dot ( double value ) {
plot_dot_sub ( 0.0, ( value + 1.0 ) * WIDTH/2.0 );
}
/*
*
*/
void print_sin_curve( double top, double end, double step ) {
if ( top >= end ) {
/* 何もする必要はない */
} else {
plot_dot ( sin ( top ) ); /* sin は正弦関数 */
print_sin_curve ( top + step, end, step ); /* 次のステップを実行 */
}
}
/*
*
*/
#define PI 3.141592
int main ( void ) {
print_sin_curve( 0, 2 * PI, 0.1 ); /* PI は 円周率 */
return 0;
}
/*
*
*/
C:\usr\c\> sample-003
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
C:\usr\c\>
Download : sample-004.c ( SJIS 版 )
/*
* 2011/06/17 sample-004.c
*/
/*
* double
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
*
*/
int main ( void ) {
s_print_string ( "13/3 = " );
s_print_int ( 13/3 ); /* 整数同士の割り算の結果は整数になる */
s_print_newline ();
s_print_string ( "13.0/3.0 = " );
s_print_double ( 13.0/3.0 ); /* 浮動小数点数同士の割り算の結果は浮動小数点数同士になる */
s_print_newline ();
s_print_string ( "13.0/3 = " );
s_print_double ( 13.0/3 ); /* 浮動小数点数が含まれると、整数は浮動小数点に変換されてから計算される */
s_print_newline ();
s_print_string ( "13/3.0 = " );
s_print_double ( 13/3.0 ); /* 浮動小数点数が含まれると、整数は浮動小数点に変換されてから計算される */
s_print_newline ();
return 0;
}
/*
*
*/
C:\usr\c\> sample-004 C:\usr\c\>
Download : sample-005.c ( SJIS 版 )
/*
* 2011/06/17 sample-005.c
*/
/*
* double
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
*
*/
int main ( void ) {
/* int */
s_print_string ( "Int Print : \n" );
s_print_int ( 1.0 ); /* 浮動小数点数を整数として出力しても... うまくゆかない */
s_print_newline ();
s_print_int ( (int)1.0 ); /* 「(int)」で、キャスト(型変換)すればよい */
s_print_newline ();
/* double */
s_print_string ( "Double Print : \n" );
s_print_double ( (double)1 ); /* 「(double)」で、キャスト(型変換)すればよい */
s_print_newline ();
s_print_double ( 1 * 1.0 ); /* 浮動小数点数との計算をしても自動的に変換される */
s_print_newline ();
return 0;
}
/*
*
*/
C:\usr\c\> sample-005 C:\usr\c\>
Download : sample-006.c ( SJIS 版 )
/*
* 2011/06/17 sample-006.c
*/
/*
* char *
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
*
*/
int main ( void ) {
s_print_char ( * "abc" ); /* 文字列 「"abc"」の最初の文字を取り出す */
s_print_newline();
s_print_char ( * ( "abc" + 1 ) ); /* 文字列 「"abc"」の次の文字を取り出す */
s_print_newline();
s_print_char ( "abc"[0] ); /* 文字列 「"abc"」の最初の文字を取り出す */
s_print_newline();
s_print_char ( * ( "abc" + 1 ) ); /* 文字列 「"abc"」の次の文字を取り出す */
s_print_newline();
s_print_int ( * ( "abc" + 3 ) ); /* 文字列 「"abc"」の末尾には、'\0' == 0 が入っている。 */
s_print_newline();
return 0;
}
/*
*
*/
C:\usr\c\> sample-006 a b a b 0 C:\usr\c\>
Download : sample-007.c ( SJIS 版 )
/*
* 2011/06/17 sample-007.c
*/
/*
* char *
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
*
*/
#define EOS '\0' /* End Of String */
void my_print_string ( char *str ) {
if ( *str == EOS ) {
/* もうプリントする文字は存在しない */
} else {
s_print_char ( *str ); /* 先頭の文字を出力し .. */
my_print_string ( str + 1 ); /* 残りを出せばよい */
}
}
/*
*
*/
int main ( void ) {
my_print_string ( "abc" );
s_print_newline();
my_print_string ( "xyz" );
s_print_newline();
return 0;
}
/*
*
*/
C:\usr\c\> sample-007 abc xyz C:\usr\c\>
Download : sample-008.c ( SJIS 版 )
/*
* 2011/06/17 sample-008.c
*/
/*
* char *
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
*
*/
#define EOS '\0'
void print_address_and_char ( char *string ) {
if ( *string == EOS ) { /* 文字列の最後 */
s_print_hex ( string ); /* アドレスの表示 */
s_print_string ( " : " );
s_print_int ( *string ); /* 文字コードの表示 */
s_print_newline();
} else {
s_print_hex ( string ); /* アドレスの表示 */
s_print_string ( " : " );
s_print_int ( *string ); /* 文字コードの表示 */
s_print_string ( " : " );
s_print_char ( *string ); /* 文字の表示 */
s_print_newline();
print_address_and_char ( string + 1 ); /* 残りの表示 */
}
}
/*
*
*/
int main ( void ) {
s_print_string ( "abc" );
s_print_newline();
print_address_and_char ( "abc" );
s_print_string ( "1234" );
s_print_newline();
print_address_and_char ( "1234" );
return 0;
}
/*
*
*/
C:\usr\c\> sample-008 abc 8048b27 : 97 : a 8048b28 : 98 : b 8048b29 : 99 : c 8048b2a : 0 1234 8048b2b : 49 : 1 8048b2c : 50 : 2 8048b2d : 51 : 3 8048b2e : 52 : 4 8048b2f : 0 C:\usr\c\>
Download : sample-009.c ( SJIS 版 )
/*
* 2011/06/17 sample-009.c
*/
/*
* char *
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
*
*/
#define EOS '\0'
int string_to_int_sub ( char *string, int value ) {
if ( *string == EOS ) { /* 文字列の最後 */
return value;
} else {
return string_to_int_sub ( string + 1, value * 10 + ( *string - '0' ) );
}
}
int string_to_int ( char *string ) {
return string_to_int_sub ( string, 0 );
}
/*
*
*/
int main ( void ) {
s_print_int ( string_to_int ( "123" ) );
s_print_newline();
return 0;
}
/*
*
*/
C:\usr\c\> sample-009 123 C:\usr\c\>
Download : sample-010.c ( SJIS 版 )
/*
* 2011/06/17 sample-010.c
*/
/*
* char *
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
*
*/
void too_may_int_args (
int v0,
int v1,
int v2,
int v3,
int v4,
int v5,
int v6,
int v7,
int v8,
int v9 )
{
s_print_int ( v0 );
s_print_newline();
s_print_int ( v1 );
s_print_newline();
s_print_int ( v2 );
s_print_newline();
s_print_int ( v3 );
s_print_newline();
s_print_int ( v4 );
s_print_newline();
s_print_int ( v5 );
s_print_newline();
s_print_int ( v6 );
s_print_newline();
s_print_int ( v7 );
s_print_newline();
s_print_int ( v8 );
s_print_newline();
s_print_int ( v9 );
s_print_newline();
}
/*
*
*/
int main ( void ) {
too_may_int_args ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 );
return 0;
}
/*
*
*/
C:\usr\c\> sample-010 0 1 2 3 4 5 6 7 8 9 C:\usr\c\>
Download : sample-011.c ( SJIS 版 )
/*
* 2011/06/17 sample-010.c
*/
/*
* char *
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
*
*/
void too_may_int_args (
int v0,
int v1,
int v2,
int v3,
int v4,
int v5,
int v6,
int v7,
int v8,
int v9 )
{
s_print_hex ( &v0 ); /* v0 には 0 が入っているが、その 0 が入っている場所 (アドレス) は &v0 で得られる */
s_print_newline();
s_print_hex ( &v1 ); /* 変数 v1 は、メモリのどこの部分(アドレスで示される)に対応するかが判る */
s_print_newline();
s_print_hex ( &v2 );
s_print_newline();
s_print_hex ( &v3 );
s_print_newline();
s_print_hex ( &v4 );
s_print_newline();
s_print_hex ( &v5 );
s_print_newline();
s_print_hex ( &v6 );
s_print_newline();
s_print_hex ( &v7 );
s_print_newline();
s_print_hex ( &v8 );
s_print_newline();
s_print_hex ( &v9 );
s_print_newline();
}
/*
*
*/
int main ( void ) {
too_may_int_args ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 );
return 0;
}
/*
*
*/
C:\usr\c\> sample-011 bfaf7950 bfaf7954 bfaf7958 bfaf795c bfaf7960 bfaf7964 bfaf7968 bfaf796c bfaf7970 bfaf7974 C:\usr\c\>
Download : sample-012.c ( SJIS 版 )
/*
* 2011/06/17 sample-010.c
*/
/*
* char *
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
*
*/
void too_may_int_args (
int v0,
int v1,
int v2,
int v3,
int v4,
int v5,
int v6,
int v7,
int v8,
int v9 )
{
s_print_string ( "&v0" );
s_print_newline();
s_print_hex ( &v0 );
s_print_newline();
s_print_string ( "&v0+1" );
s_print_newline();
s_print_hex ( &v0 + 1 );
s_print_newline();
s_print_string ( "&v1" );
s_print_newline();
s_print_hex ( &v1 );
s_print_newline();
s_print_string ( "v1" );
s_print_newline();
s_print_int ( v1 );
s_print_newline();
s_print_int ( *(&v1) ); /* '*' を付けると、その場所の、その型のデータを取り出す */
s_print_newline(); /* v1 は int 型の変数なので &v1 は int 型のデータがある場所のアドレスになる */
/* 「*(&v1)」は v1 のアドレスの所にある v1 と同じ型のデータを取り出すので、 */
/* 「v1」と同じ意味 */
s_print_int ( *(&v0 + 1) ); /* 「&v0」は v0 のアドレスになる / v0 は int 型なので int \
のデータが入っている*/
/* 「&v0 + 1」 は、int 型なので、アドレスは 4 ( int が一つ入るサイズ ) だけ増える */
/* このアドレスは、実は、次の変数である 「&v1」と同じもの */
/* 結局 「*(&v0 + 1)」==「*(&v1)」==「v1」と同じ */
}
/*
*
*/
int main ( void ) {
too_may_int_args ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 );
return 0;
}
/*
*
*/
C:\usr\c\> sample-012 &v0 bf844c90 &v0+1 bf844c94 &v1 bf844c94 v1 1 1 1C:\usr\c\>
Download : sample-013.c ( SJIS 版 )
/*
* 2011/06/17 sample-012.c
*/
/*
* char *
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
*
*/
void print_int_args ( int *top ) {
if ( *top == 9 ) { /* 最後は 9 が入っているはず.. */
s_print_int ( *top );
s_print_newline();
} else {
s_print_int ( *top );
s_print_newline();
print_int_args ( top + 1 );
}
}
/*
*
*/
void too_may_int_args (
int v0,
int v1,
int v2,
int v3,
int v4,
int v5,
int v6,
int v7,
int v8,
int v9 )
{
print_int_args ( &v0 );
}
/*
*
*/
int main ( void ) {
too_may_int_args ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 );
return 0;
}
/*
*
*/
C:\usr\c\> sample-013 0 1 2 3 4 5 6 7 8 9 C:\usr\c\>
Download : sample-014.c ( SJIS 版 )
/*
* 2011/06/17 sample-014.c
*/
/*
* char *
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
*
*/
int main ( void ) {
s_print_string ( "abc" ); /* 「abc」が出力される */
s_print_newline();
s_print_string ( "abc" + 1 ); /* 1文字みじかくなった 「bc」が出力される */
s_print_newline();
s_print_string ( "abc" + 2 ); /* 「c」が出力される */
s_print_newline();
s_print_string ( "abc" + 3 ); /* 「」が出力される */
s_print_newline();
return 0;
}
/*
*
*/
C:\usr\c\> sample-014 abc bc c C:\usr\c\>
Download : sample-015.c ( SJIS 版 )
/*
* 2011/06/17 sample-015.c
*/
/*
* char *
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
*
*/
void print_top_of_string ( char *string ) { /* char (*string) */
s_print_char ( *string ); /* print_top_of_string ( "abc" ); => \
s_print_char ( * "abc" ); */
}
void print_top_of_string2 ( char *string ) { /* char (*string) */
s_print_char ( string[0] ); /* print_top_of_string ( "abc" ); => \
s_print_char ( * "abc" ); */
/*
X[0] == *X == *(X+0)
X[n] == *(X+n)
X[n] : X が何かの並びの時の n + 1 番目の要素 ( n は 0 から始まり、0 の時先頭の要素 )
特に、「文字列」は、「文字の並び」なので、[n] で (n+1) 番目の文字が得られる
*/
}
/*
*
*/
int main ( void ) {
print_top_of_string ( "abc" );
s_print_newline();
print_top_of_string ( "xyz" );
s_print_newline();
print_top_of_string2 ( "abc" );
s_print_newline();
print_top_of_string2 ( "xyz" );
s_print_newline();
return 0;
}
/*
*
*/
C:\usr\c\> sample-015 a x a x C:\usr\c\>
Download : sample-016.c ( SJIS 版 )
/*
* 2011/06/17 sample-016.c
*/
/*
* 桁数を求める
*/
#include <stdio.h>
#include "s_print.h"
#include "s_input.h"
/*
* num は非負の整数とする
*/
int keta ( int num ) {
if ( num < 10 ) { /* 10 より小さい場合は */
return 1; /* 1 桁 */
} else { /* そうでない場合は.. */
return 1 + keta ( num / 10 ); /* 一桁目を取り除いた数の桁を求めて 1 を加えれば全体の桁数 */
}
}
/*
*
*/
int main ( void ) {
s_print_string ( "123 は " );
s_print_int ( keta ( 123 ) );
s_print_string ( "桁です。" );
s_print_newline();
s_print_string ( "99999 は " );
s_print_int ( keta ( 99999 ) );
s_print_string ( "桁です。" );
s_print_newline();
return 0;
}
/*
*
*/
C:\usr\c\> sample-016 123 は 3桁です。 99999 は 5桁です。 C:\usr\c\>
Download : sample-017.c ( SJIS 版 )
/*
* 2011/06/17 sample-017.c
*/
/*
*
*/
#include <stdio.h>
#include "s_print.h"
/*
* +----------+
* "abc" ---> 0x80487cf | 'a' |
* +----------+
* | 'b' | 0x80487cf + 1 <-------+
* +----------+ |
* | 'c' | 0x80487cf + 2 |
* +----------+ |
* | '\0' | 0x80487cf + 3 |
* +----------+ |
* | | |
* "abc" + 1 == 0x80487cf + 1 == 0x80487d0 -------------------------+
*/
int main ( void ) {
s_print_hex ( "abc" ); /* 文字列 "abc" のある場所(アドレス)の出力 */
s_print_newline();
s_print_char ( *((char*)0x80487cf+1) );
s_print_newline();
return 0;
}
/*
*
*/
C:\usr\c\> sample-017 80487cf b C:\usr\c\>
Download : sample-018.c ( SJIS 版 )
/*
* 2011/06/17 sample-018.c
*/
#include <stdio.h>
#include "s_print.h"
#define EOS '\0'
/*
* 課題 2 は
* "abc" -> 3 文字
* "日本語" -> 6 文字でよい
*
* でも、漢字一文字は一文字と感ぞえたい場合は、例えば、次のようにする。
*/
int count_warry_about_japanese ( char *str ) {
if ( *str == EOS ) { /* この時は、SJIS でも ASCII でも 0 文字 */
return 0;
} else {
if ( (unsigned char)*str < 128 ) { /* 128 より小さいならば ASCII Code だろう.. */
return count_warry_about_japanese ( str + 1 ) + 1;
} else { /* ASCII でないので、漢字と信じる事にする */
return count_warry_about_japanese ( str + 2 ) + 1; /* 2 文字分短くする */
} /* 厳密には、「半角カナ」があるので、これだと正しくない.. */
}
}
main()
{
s_print_int ( count_warry_about_japanese ( "abc" ) ); /* => 3 */
s_print_newline();
s_print_int ( count_warry_about_japanese ( "日本" ) ); /* => 2 */
s_print_newline();
}
C:\usr\c\> sample-018 3 2 C:\usr\c\>
Download : 20110617-01.c ( SJIS 版 )
/*
* 20110617-1-QQQQ.c
* cos のグラフ
*/
#include <stdio.h>
#include <math.h> /* 数学関数を利用する場合はこれを追加する */
#include "s_print.h"
#include "s_input.h"
/*
*
*/
void plot_dot_sub ( double pos, double value ) {
if ( pos >= value ) { /* 印刷位置まだきた */
s_print_char ( '*' ); /* 「点」を出力 */
s_print_newline (); /* この行は終り */
} else {
s_print_char ( ' ' ); /* 空白を出力 */
plot_dot_sub ( pos + 1.0, value ); /* 続きを計算 */
}
}
/*
* 0 〜 79 で、 -1.0 〜 1.0 を表現するには、
* x | -1.0 〜 1.0 | x
* --+-------------+---------------
* y | 0 〜 79 | ( x + 1 ) * 40
*/
#define WIDTH 80.0 /* 一行の中のカラム数を定義 */
void plot_dot ( double value ) {
plot_dot_sub ( 0.0, ( value + 1.0 ) * WIDTH/2.0 );
}
/*
*
*/
void print_cos_curve( double top, double end, double step ) {
if ( top >= end ) {
/* 何もする必要はない */
} else {
/*
** この部分を完成させなさい
*/
}
}
/*
*
*/
#define PI 3.141592
int main ( void ) {
print_cos_curve( 0, 2 * PI, 0.1 ); /* PI は 円周率 */
return 0;
}
/*
*
*/
C:\usr\c\> 20110617-01
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
C:\usr\c\>
Download : 20110617-02.c ( SJIS 版 )
/*
* 20110617-2-QQQQ.c
*
*/
#include <stdio.h>
#include "s_print.h"
/*
*
*/
#define EOS '\0' /* End Of String */
int my_string_length ( char *str ) {
if ( *str == EOS ) { /* "" は 長さ 0 */
/*
** この部分を完成させなさい return 0; /* 長さは 0 */
*/
} else { /* 残りの長さ + 1 */
/*
** この部分を完成させなさい return ????;
*/
}
}
/*
*
*/
int main ( void ) {
s_print_int ( my_string_length ( "abc" ) ); /* 3 と表示されるはず */
s_print_newline();
return 0;
}
/*
*
*/
C:\usr\c\> 20110617-02 3 C:\usr\c\>