当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/*
* 2011/05/27 sample-001.c
*/
/*
* 最初のプログラムは "Hello, World"
*/
#include <stdio.h>
int main ( void ) {
printf ( "Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */
return 0;
}
C:\usr\c\> sample-001 Hello, World C:\usr\c\>
Download : sample-002.c ( SJIS 版 )
/*
* 2011/05/27 sample-002.c
*/
/*
* おまじないだらけのプログラム
*/
#include <stdio.h> /* <= おまじない */
int main ( void ) { /* <= おまじない */
printf ( "Hello, World\n" ); /* ここに何かをかくと動く */
return 0; /* <= おまじない */
} /* <= おまじない */
C:\usr\c\> sample-002 Hello, World C:\usr\c\>
Download : sample-003.c ( SJIS 版 )
/*
* 2011/05/27 sample-003.c
*/
/*
* "Hello, World" を出力するが..
*/
#include <stdio.h>
void prt ( char *str ) {
printf ( str );
}
void myMain() {
prt ( "Hello, World\n" ); /* この部分は sample-001.c の main と同じ */
}
int main ( void ) {
myMain();
return 0;
}
/*
sample-001.c の構造
[ main -> printf ]
sample-003.c の構造
main -> [ myMain -> pr ] -> printf
sample-003 の「 myMain -> pr 」の部分は sample-001 の 「myMain -> pr」と同じ
sample-001 の main は誰からか、勝手に呼出される
sample-003 の myMain は main から呼出される
sample-001 の printf は、何処でも定義していない
sample-003 の prt は自分で定義している
*/
C:\usr\c\> sample-003 Hello, World C:\usr\c\>
Download : sample-004.c ( SJIS 版 )
/*
* 2011/05/27 sample-004.c
*/
/*
* main 関数への引数
*/
#include <stdio.h>
int main ( int argc, char *argv[] ) { // またまた、新しいおまじない
printf ( argv[1] ); // コマンドラインの一つ目の引数が表示される
return 0;
}
C:\usr\c\> sample-004 C:\usr\c\>
Download : sample-005.c ( SJIS 版 )
/*
* 2011/05/27 sample-005.c
*/
#include <stdio.h>
/*
* 別のファイルの関数を呼出す main 関数
*/
int main () {
prt ( "Hello, World\n" ); // sample-006.c の中に定義されている prt 関数を利用している
return 0;
}
C:\usr\c\> sample-005 Hello, World C:\usr\c\>
Download : sample-006.c ( SJIS 版 )
/*
* 2011/05/27 sample-006.c
*/
#include <stdio.h>
/*
*
*/
void prt ( char *str ) { /* この関数は sample-005.c の main から呼出す */
printf ( str );
}
C:\usr\c\> cc -c sample-006.c C:\usr\c\>
Download : sample-007.c ( SJIS 版 )
/*
* 2011/05/27 sample-007.c
*/
/*
* include も printf も使かわない main
*/
int main () {
return 0;
}
C:\usr\c\> sample-007 C:\usr\c\>
Download : sample-008.c ( SJIS 版 )
/*
* 2011/05/27 sample-008.c
*/
/*
* include はないが printf を使う main
*/
int main () {
printf ( "Hello, World\n" );
return 0;
}
C:\usr\c\> sample-008 Hello, World C:\usr\c\>
Download : sample-009.c ( SJIS 版 )
/*
* 2011/05/27 sample-009.c
*/
/*
* include の代わりにプロトタイプ宣言をする
*/
extern int printf ( char * ); /* プロトタイプ宣言 */
/*
*
*/
int main () {
printf ( "Hello, World\n" );
return 0;
}
C:\usr\c\> sample-009 Hello, World C:\usr\c\>
Download : sample-010.c ( SJIS 版 )
/*
* 2011/05/27 sample-010.c
*/
/*
* sample-005.c に prt のプロトタイプ宣言をした
*/
extern void prt ( char * ); /* prt のプロトタイプ */
/*
*
*/
int main () {
prt ( "Hello, World\n" ); // sample-006.c の中に定義されている prt 関数を利用している
return 0;
}
C:\usr\c\> sample-010 Hello, World C:\usr\c\>
Download : sample-011.c ( SJIS 版 )
/*
* 2011/05/27 sample-011.c
*/
#include "prt.h" // prt のプロトタイプの代りに prt.h を include
/*
*
*/
int main () {
prt ( "Hello, World\n" ); // sample-006.c の中に定義されている prt 関数を利用している
return 0;
}
C:\usr\c\> sample-011 Hello, World C:\usr\c\>
/* * 2011/05/27 prt.h */ extern int prt ( char * ); /* プロトタイプ宣言 */ /* * */
Download : 20110527-01.c ( SJIS 版 )
/*
* 20110527-1-QQQQ.c
* 余りを計算するプログラム
*/
#include <stdio.h>
#include <string.h>
/*
* 余りの定義
* n, m が自然数の時に n mod m ( n を m で割った余り ) とは何か ( m > 0 )
*
* n ( m > n の時 )
* n mod m {
* (n-m) mod m ( その他の時 )
*/
void remainder_sub ( char *n, char *m, char *mm, char *nn ) {
/* ^ ^ 変化*/
/* ^^ 最初の m を記憶して、後から利用できるようにしている */
/* ^^ 割り始め n を覚えておく */
if ( !strcmp ( m, "" ) ) { /* m が 0 : 引き算が終った */
/*
** この部分を完成させなさい
*/
} else if ( !strcmp ( n, "" ) ) { /* n が 0 : m の方が大きかった */
printf ( nn ); /* 余りを出力 */
} else {
/*
** この部分を完成させなさい
*/
}
}
/*
* remainder : print ( n mod m )
*/
void remainder ( char *n, char *m ) {
/*
** この部分を完成させなさい
*/
}
/*
* main
*/
int main()
{
printf ( "10 mod 4 = " );
remainder ( "**********", "****" );
printf ( "\n" );
printf ( "10 mod 3 = " );
remainder ( "**********", "***" );
printf ( "\n" );
printf ( "10 mod 2 = " );
remainder ( "**********", "**" );
printf ( "\n" );
return 0;
}
/*
remainder ( "**********", "****" )
remainder_sub ( "**********", "****", "****", "**********" )
remainder_sub ( "*********", "***", "****", "**********" )
remainder_sub ( "********", "**", "****", "**********" )
remainder_sub ( "*******", "*", "****", "**********" )
remainder_sub ( "******", "", "****", "**********" )
10 - 4 -> 6
remainder_sub ( "******", "****", "****", "******" )
remainder_sub ( "*****", "***", "****", "******" )
remainder_sub ( "****", "**", "****", "******" )
remainder_sub ( "***", "*", "****", "******" )
remainder_sub ( "**", "", "****", "******" )
(10 - 4) - 4 -> 2
remainder_sub ( "**", "****", "****", "**" )
remainder_sub ( "*", "***", "****", "**" )
remainder_sub ( "", "**", "****", "**" )
2 < 4
printf ( "**" );
なので答は「**」となる
*/
C:\usr\c\> 20110527-01 10 mod 4 = ** 10 mod 3 = * 10 mod 2 = C:\usr\c\>
Download : 20110527-02.c ( SJIS 版 )
/*
* 20210527-2-QQQQ.c
* ミクを歩かせて、八角形に二周目回るようにしなさい
*/
#include <stdio.h>
#include <string.h>
#include "s_walk.h"
/*
* 引数の文字列の長さ (n) だけ turn する
*/
void n_turn( char *str ) {
if ( !strcmp ( str, "" ) ) {
/* str が 空文字 ("") の時はすることがない */
} else {
s_walk_turn(); /* とりあえず、1 回向きをかえて */
n_turn ( str + 1 ); /* 残りは再帰で処理 */
}
}
/*
* 一度、向きをかえてから、ニ歩前に進む
*/
void turn_and_step() {
s_walk_turn();
s_walk_move();
s_walk_move();
}
/*
* 引数の文字列の長さ (n) だけ turn_and_step を行う
*/
void n_turn_and_step( char *str ) {
if ( !strcmp ( str, "" ) ) {
/* str が 空文字 ("") の時はすることがない */
} else {
/*
** この部分を完成させなさい
*/
}
}
/*
* 八角形に歩く
*/
void walk_octagon() {
/*
** この部分を完成させなさい
*/
}
/*
* 八角形に歩く
*/
// main関数
int main()
{
/* 向きをかえて */
n_turn( "**" );
/* 二度八角形に歩く */
walk_octagon();
walk_octagon();
/* 正面を向く */
n_turn( "******" );
return 0;
}
C:\usr\c\> 20110527-02 Loading Models... Done. C:\usr\c\>