当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/*
* 2011/06/03 sample-001.c
*/
/*
* 整数の扱い
*/
#include <stdio.h>
#include "s_print.h"
int main ( void ) {
s_print_int ( 1 ); /* 整数 1 を出力する */
s_print_newline(); /* 改行 */
return 0;
}
C:\usr\c\> sample-001 1 C:\usr\c\>
Download : sample-002.c ( SJIS 版 )
/*
* 2011/06/03 sample-002.c
*/
/*
* 整数と文字列の扱い
*/
#include <stdio.h>
#include "s_print.h"
int main ( void ) {
s_print_int ( 123 ); /* 整数 123 を出力する */
s_print_newline(); /* 改行 */
s_print_string ( "123" ); /* 文字列 "123" を出力する */
s_print_newline(); /* 改行 */
return 0;
}
C:\usr\c\> sample-002 123 123 C:\usr\c\>
Download : sample-003.c ( SJIS 版 )
/*
* 2011/06/03 sample-003.c
*/
/*
* 整数と文字列と取り違えると .. ?
*/
#include <stdio.h>
#include "s_print.h"
int main ( void ) {
s_print_int ( "123" ); /* 文字列を整数として出力しようとした */
s_print_newline(); /* 改行 */
s_print_string ( 123 ); /* 整数を文字列として出力しようとした */
s_print_newline(); /* 改行 */
return 0;
}
C:\usr\c\> sample-003 C:\usr\c\>
Download : sample-004.c ( SJIS 版 )
/*
* 2011/06/03 sample-004.c
*/
/*
* 関数に整数を渡す
*/
#include <stdio.h>
#include "s_print.h"
/*
* 同じ整数を二度出力する
*/
void print_int_two ( int n ) { // 引数が整数なので、引数の宣言は int になる
s_print_int ( n );
s_print_newline();
s_print_int ( n );
s_print_newline();
}
/*
* main
*/
int main ( void ) {
s_print_int_two ( 123 ); /* 整数 123 を二度出力する */
return 0;
}
C:\usr\c\> sample-004 C:\usr\c\>
Download : sample-005.c ( SJIS 版 )
/*
* 2011/06/03 sample-005.c
*/
/*
* 整数の計算
*/
#include <stdio.h>
#include "s_print.h"
/*
* 二つの和を出力する
*/
void print_int_wa ( int n, int m ) {
s_print_int ( n );
s_print_string ( " と " );
s_print_int ( m );
s_print_string ( " の和は " );
s_print_int ( n + m );
s_print_string ( " です。" );
s_print_newline();
}
/*
* main
*/
int main ( void ) {
print_int_wa ( 123, 957 );
print_int_wa ( -21, 45 );
return 0;
}
C:\usr\c\> sample-005 123 と 957 の和は 1080 です。 -21 と 45 の和は 24 です。 C:\usr\c\>
Download : sample-006.c ( SJIS 版 )
/*
* 2011/06/03 sample-006.c
*/
/*
* 整数の大小比較
*/
#include <stdio.h>
#include "s_print.h"
/*
* 二つの比較結果を出力する
*/
void print_int_compare ( int n, int m ) {
s_print_int ( n );
s_print_string ( " と " );
s_print_int ( m );
s_print_string ( " では " );
if ( n > m ) { /* n の方が大きければ.. */
s_print_int ( n );
} else {
s_print_int ( m );
}
s_print_string ( " の方が大きい。" );
s_print_newline();
}
/*
* main
*/
int main ( void ) {
print_int_compare ( 10, 20 );
print_int_compare ( 40, 30 );
print_int_compare ( 4, -4 );
return 0;
}
C:\usr\c\> sample-006 10 と 20 では 20 の方が大きい。 40 と 30 では 40 の方が大きい。 4 と -4 では 4 の方が大きい。 C:\usr\c\>
Download : sample-007.c ( SJIS 版 )
/*
* 2011/06/03 sample-007.c
*/
/*
* 整数の等号比較 ( == を使う )
*/
#include <stdio.h>
#include "s_print.h"
/*
* 二つの比較結果を出力する
*/
void print_int_equal ( int n, int m ) {
s_print_int ( n );
s_print_string ( " と " );
s_print_int ( m );
s_print_string ( " は等し" );
if ( n == m ) { /* n と m は等しい */
s_print_string ( "い" );
} else {
s_print_string ( "くない" );
}
s_print_string ( "です。" );
s_print_newline();
}
/*
* main
*/
int main ( void ) {
print_int_equal ( 10, 20 );
print_int_equal ( 30, 30 );
return 0;
}
C:\usr\c\> sample-007 10 と 20 は等しくないです。 30 と 30 は等しいです。 C:\usr\c\>
Download : sample-008.c ( SJIS 版 )
/*
* 2011/06/03 sample-008.c
*/
/*
* 整数の等号比較 ( != を使う )
*/
#include <stdio.h>
#include "s_print.h"
/*
* 二つの比較結果を出力する
*/
void print_int_equal ( int n, int m ) {
s_print_int ( n );
s_print_string ( " と " );
s_print_int ( m );
s_print_string ( " は等し" );
if ( n != m ) { /* n と m は等しくない */
s_print_string ( "くない" );
} else {
s_print_string ( "い" );
}
s_print_string ( "です。" );
s_print_newline();
}
/*
* main
*/
int main ( void ) {
print_int_equal ( 10, 20 );
print_int_equal ( 30, 30 );
return 0;
}
C:\usr\c\> sample-008 10 と 20 は等しくないです。 30 と 30 は等しいです。 C:\usr\c\>
Download : sample-009.c ( SJIS 版 )
/*
* 2011/06/03 sample-009.c
*/
/*
* 再帰と整数
*/
#include <stdio.h>
#include "s_print.h"
/*
* n から 1 までを出力する
*/
void print_n_to_one ( int n ) {
if ( n == 0 ) { /* n が 0 の時 */
/* なにもしなくてよい */
} else { /* そうでなければ... */
s_print_int ( n ); /* n を出し.. */
s_print_newline();
print_n_to_one ( n - 1 ); /* 再帰で残りをする */
}
}
/*
* main
*/
int main ( void ) {
s_print_string ( "5 〜 1 : \n" );
print_n_to_one ( 5 ); /* 5 〜 1 を出力 */
s_print_newline();
s_print_string ( "10 〜 1 : \n" );
print_n_to_one ( 10 ); /* 10 〜 1 を出力 */
return 0;
}
C:\usr\c\> sample-009 5 〜 1 : 5 4 3 2 1 10 〜 1 : 10 9 8 7 6 5 4 3 2 1 C:\usr\c\>
Download : sample-010.c ( SJIS 版 )
/*
* 2011/06/03 sample-010.c
*/
/*
* 総和の計算
*/
#include <stdio.h>
#include "s_print.h"
/*
* n から 1 までを sum に加えた結果を出力する
*/
void print_n_to_one_sum_sub ( int n, int sum ) {
if ( n == 0 ) { /* n が 0 の時 */
/* もう計算しなくてもよいので結果を出力 */
s_print_string ( "合計は " );
s_print_int ( sum );
s_print_string ( "です。" );
s_print_newline();
} else { /* そうでなければ... */
print_n_to_one_sum_sub ( n - 1, sum + n );
/* 再帰処理 */
}
}
void print_n_to_one_sum ( int n ) {
print_n_to_one_sum_sub ( n, 0 ); /* 最初は 1 〜 n を 0 に加える */
}
/*
* main
*/
int main ( void ) {
s_print_string ( "1 から 5 : " );
print_n_to_one_sum ( 5 );
s_print_string ( "1 から 10 : " );
print_n_to_one_sum ( 10 );
return 0;
}
C:\usr\c\> sample-010 1 から 5 : 合計は 15です。 1 から 10 : 合計は 55です。 C:\usr\c\>
Download : sample-011.c ( SJIS 版 )
/*
* 2011/06/03 sample-011.c
*/
/*
* 何かを n 回繰り返す
*/
#include <stdio.h>
#include "s_print.h"
/*
* 文字列を 10 回出力する
*/
void print_string_n_times ( int n, char *str ) {
if ( n == 0 ) { /* n が 0 の時 */
/* 仕事はすんだので何もしない */
} else { /* そうでなければ... */
s_print_string ( str ); /* 取りあえず、文字列を出力し.. */
print_string_n_times ( n - 1, str );
/* 再帰処理 */
}
}
/*
* main
*/
int main ( void ) {
print_string_n_times ( 3, "Hello, World\n" ); /* "Hello, World\n" を 3 回出力 \
*/
print_string_n_times ( 5, "こんにちは\n" ); /* "こんにちは\n" を 5 回出力 */
return 0;
}
C:\usr\c\> sample-011 Hello, World Hello, World Hello, World こんにちは こんにちは こんにちは こんにちは こんにちは C:\usr\c\>
Download : sample-012.c ( SJIS 版 )
/*
* 2011/06/03 sample-012.c
*/
/*
* 何かを n 回繰り返す
*/
#include <stdio.h>
#include "s_print.h"
/*
* "*" を n 回出力
*/
void print_asta_n_times ( int n ) {
if ( n == 0 ) { /* n が 0 の時 */
/* 仕事はすんだので何もしない */
} else { /* そうでなければ... */
s_print_string ( "*" ); /* 取りあえず、"*" 出力し.. */
print_asta_n_times ( n - 1 );
/* 再帰処理 */
}
}
void print_triangle ( int n ) {
if ( n == 0 ) { /* n が 0 の時 */
/* 仕事はすんだので何もしない */
} else { /* そうでなければ... */
print_asta_n_times ( n ); /* アスタリスクを n 個出力 */
s_print_newline();
print_triangle ( n - 1 );
/* 再帰処理 */
}
}
/*
* main
*/
int main ( void ) {
print_triangle ( 3 );
s_print_newline();
print_triangle ( 5 );
return 0;
}
C:\usr\c\> sample-012 *** ** * ***** **** *** ** * C:\usr\c\>
Download : sample-013.c ( SJIS 版 )
/*
* 2011/06/03 sample-013.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* ペアノの公理 (自然数の定義)
* i) 0 は自然数
* ii) x が自然数ならば x + 1 も自然数
* iii) i) と ii) 以外に自然数はない
*/
/*
* 和の定義
* n, m が自然数の時に n + m とは何か
*
* m ( n が 0 の時 )
* n + m {
* ( x + m ) + 1 ( n = x + 1 の時 )
*/
/*
* a と b の和を計算する
*/
void addition ( int n, int m ) {
if ( n == 0 ) { /* n が 0 の時 */
s_print_int ( m );
} else {
addition ( n - 1, m + 1 ); /* x + m を計算 */
}
}
main()
{
addition ( 3, 4 );
printf ( "\n" );
addition ( 5, 9 );
printf ( "\n" );
/* 足し算をする */
}
C:\usr\c\> sample-013 7 14 C:\usr\c\>
Download : sample-014.c ( SJIS 版 )
/*
* 2011/06/03 sample-014.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* 積の定義
* n, m が自然数の時に n * m とは何か
*
* 0 ( n が 0 の時 )
* n + m {
* ( x * m ) + m ( n = x + 1 の時 )
*/
/*
* n と m のかけ算
*/
void multiply_sub ( int n, int m, int mul ) {
if ( n == 0 ) { /* n が 0 の時 */
s_print_int ( mul ); /* 結果を出力 */
} else {
multiply_sub ( n - 1, m, mul + m ); /* x * m を計算 */
}
}
void multiply ( int n, int m ) {
multiply_sub ( n, m, 0 );
}
main()
{
multiply ( 3, 4 );
s_print_newline();
multiply ( 5, 8 );
s_print_newline();
}
C:\usr\c\> sample-014 12 40 C:\usr\c\>
Download : sample-015.c ( SJIS 版 )
/*
* 2011/06/03 sample-015.c
*/
#include <stdio.h>
#include "s_print.h"
/*
* 引き算の定義
* n, m が自然数の時に n - m とは何か ( n >= m )
*
* n ( m が 0 の時 )
* n - m {
* y - x ( m = x + 1 の時 )
* ( n = y + 1 の時 )
*/
/*
* n と m の差
*/
void diffirence ( int n, int m ) {
if ( m == 0 ) { /* m が 0 の時 */
s_print_int ( n );
} else {
diffirence ( n - 1, m - 1 ); /* y - x を計算 */
}
}
main()
{
diffirence ( 7, 3 );
printf ( "\n" );
diffirence ( 13, 8 );
printf ( "\n" );
}
C:\usr\c\> sample-015 4 5 C:\usr\c\>
Download : 20110603-01.c ( SJIS 版 )
/*
* 20110603-1-QQQQ.c
* 余りを計算するプログラム
*/
#include <stdio.h>
#include "s_print.h"
/*
* 余りの定義
* n, m が自然数の時に n mod m ( n を m で割った余り ) とは何か ( m > 0 )
*
* n ( m > n の時 )
* n mod m {
* (n-m) mod m ( その他の時 )
*/
void remainder_sub ( int n, int m, int mm, int nn ) {
/* ^ ^ 変化*/
/* ^^ 最初の m を記憶して、後から利用できるようにしている */
/* ^^ 割り始め n を覚えておく */
if ( m == 0 ) { /* m が 0 : 引き算が終った */
/*
** この部分を完成させなさい
*/
} else if ( n == 0 ) { /* n が 0 : m の方が大きかった */
s_print_int ( nn ); /* 余りを出力 */
} else {
/*
** この部分を完成させなさい
*/
}
}
/*
* remainder : print ( n mod m )
*/
void remainder ( int n, int m ) {
/*
** この部分を完成させなさい
*/
}
/*
* main
*/
int main()
{
printf ( "10 mod 4 = " );
remainder ( 10, 4 );
printf ( "\n" );
printf ( "10 mod 3 = " );
remainder ( 10, 3 );
printf ( "\n" );
printf ( "10 mod 2 = " );
remainder ( 10, 2 );
printf ( "\n" );
return 0;
}
C:\usr\c\> 20110603-01 10 mod 4 = 2 10 mod 3 = 1 10 mod 2 = 0 C:\usr\c\>
Download : 20110603-02.c ( SJIS 版 )
/*
* 20210603-2-QQQQ.c
* 忍者を歩かせて、八角形に二周目回るようにしなさい
*/
#include <stdio.h>
#include "s_ninja.h"
/*
* 引数 n だけ turn する
*/
void n_turn( int n ) {
if ( n == 0 ) {
/* n が 0 のときはなにもしなくてよい */
} else {
s_ninja_turn(); /* とりあえず、1 回向きをかえて */
n_turn ( n - 1 ); /* 残りは再帰で処理 */
}
}
/*
* 一度、向きをかえてから、ニ歩前に進む
*/
void turn_and_step() {
s_ninja_turn();
s_ninja_move();
s_ninja_move();
}
/*
* 引数 n だけ turn_and_step を行う
*/
void n_turn_and_step( int n ) {
if ( n == 0 ) {
/* n が 0 のときはなにもしなくてよい */
} else {
/*
** この部分を完成させなさい
*/
}
}
/*
* 八角形に歩く
*/
void walk_octagon() {
/*
** この部分を完成させなさい
*/
}
/*
* 八角形に歩く
*/
// main関数
int main()
{
/* 向きをかえて */
n_turn( 2 );
/* 二度八角形に歩く */
walk_octagon();
walk_octagon();
/* 正面を向く */
n_turn( 6 );
return 0;
}
C:\usr\c\> 20110603-02 Loading Models... Done. C:\usr\c\>