当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/* * CDATE sample-001.c */ /* * マジックナンバーの問題点(1) * 8x8 個だけ箱(■)を表示する * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-001.exe sample-001.c * 実行 * sample-001 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int tate; /* 縦(行数)を数えるための変数 */ int yoko; /* 横(文字数)を数えるための変数 */ /* * 8x8 個だけ箱(■)を表示する */ tate = 0; /* 縦(tate) を 0 から 8 の前まで 8 行 */ while ( tate < 8 ) { /* 「8 」って何だろう (マジックナンバー) */ yoko = 0; /* 横(yoko) を 0 から 8 の前まで 8 文字分 */ while ( yoko < 8 ) { /* 「8 」って何だろう (マジックナンバー) */ printf ( "■" ); /* 箱(■)を表示 */ yoko++; /* 箱を一個、表示する度に横(yoko)を増やす */ } /* 一行分の箱はこれで OK */ putchar ( '\n' ); /* 一行終ったので「改行(行がえ)」する */ tate++; /* 行を一行、表示する度に横(tate)を増やす */ } /* 全ての処理を終えた */ return 0; }
C:\usr\c>sample-001 ■■■■■■■■ ■■■■■■■■ ■■■■■■■■ ■■■■■■■■ ■■■■■■■■ ■■■■■■■■ ■■■■■■■■ ■■■■■■■■ C:\usr\c>
Download : sample-002.c ( SJIS 版 )
/* * CDATE sample-002.c */ /* * マジックナンバーの問題点(2) * 8x8 個だけ箱(■)を表示するプログラムから 7x7 のプログラムに変換 * テキストエディタの機能を用いて「8」を「7」に置き換える * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-002.exe sample-002.c * 実行 * sample-002 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int tate; /* 縦(行数)を数えるための変数 */ int yoko; /* 横(文字数)を数えるための変数 */ /* * 7x7 個だけ箱(■)を表示する */ tate = 0; /* 縦(tate) を 0 から 7 の前まで 7 行 */ while ( tate < 7 ) { /* 「7 」って何だろう (マジックナンバー) */ yoko = 0; /* 横(yoko) を 0 から 7 の前まで 7 文字分 */ while ( yoko < 7 ) { /* 「7 」って何だろう (マジックナンバー) */ printf ( "■" ); /* 箱(■)を表示 */ yoko++; /* 箱を一個、表示する度に横(yoko)を増やす */ } /* 一行分の箱はこれで OK */ putchar ( '\n' ); /* 一行終ったので「改行(行がえ)」する */ tate++; /* 行を一行、表示する度に横(tate)を増やす */ } /* 全ての処理を終えた */ return 0; }
C:\usr\c>sample-002 ■■■■■■■ ■■■■■■■ ■■■■■■■ ■■■■■■■ ■■■■■■■ ■■■■■■■ ■■■■■■■ C:\usr\c>
Download : sample-003.c ( SJIS 版 )
/* * CDATE sample-003.c */ /* * マジックナンバーの問題点(3) * 8x8 個だけ箱(■)を表示するプログラムから 6x8 のプログラムに変換 * テキストエディタの機能を用いて「8」を「6」に置き換えると.. ? * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-003.exe sample-003.c * 実行 * sample-003 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int tate; /* 縦(行数)を数えるための変数 */ int yoko; /* 横(文字数)を数えるための変数 */ /* * 6x6 個だけ箱(■)を表示する */ tate = 0; /* 縦(tate) を 0 から 6 の前まで 6 行 */ while ( tate < 6 ) { /* 「6 」って何だろう (マジックナンバー) */ yoko = 0; /* 横(yoko) を 0 から 6 の前まで 6 文字分 */ while ( yoko < 6 ) { /* 「6 」って何だろう (マジックナンバー) */ printf ( "■" ); /* 箱(■)を表示 */ yoko++; /* 箱を一個、表示する度に横(yoko)を増やす */ } /* 一行分の箱はこれで OK */ putchar ( '\n' ); /* 一行終ったので「改行(行がえ)」する */ tate++; /* 行を一行、表示する度に横(tate)を増やす */ } /* 全ての処理を終えた */ return 0; }
C:\usr\c>sample-003 ■■■■■■ ■■■■■■ ■■■■■■ ■■■■■■ ■■■■■■ ■■■■■■ C:\usr\c>
Download : sample-004.c ( SJIS 版 )
/* * CDATE sample-004.c */ /* * マジックナンバーの問題点(1) * 8x8 個だけ箱(■)を表示するプログラムから 6x8 のプログラムに変換 * どの 8 は OK で、どの 8 はだめかをプログラムをみながら変更する必要がある * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-004.exe sample-004.c * 実行 * sample-004 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int tate; /* 縦(行数)を数えるための変数 */ int yoko; /* 横(文字数)を数えるための変数 */ /* * 6x8 個だけ箱(■)を表示する */ tate = 0; /* 縦(tate) を 0 から 8 の前まで 8 行 */ while ( tate < 8 ) { /* 「8 」って何だろう (マジックナンバー) */ yoko = 0; /* 横(yoko) を 0 から 6 の前まで 6 文字分 */ while ( yoko < 6 ) { /* 「6 」って何だろう (マジックナンバー) */ printf ( "■" ); /* 箱(■)を表示 */ yoko++; /* 箱を一個、表示する度に横(yoko)を増やす */ } /* 一行分の箱はこれで OK */ putchar ( '\n' ); /* 一行終ったので「改行(行がえ)」する */ tate++; /* 行を一行、表示する度に横(tate)を増やす */ } /* 全ての処理を終えた */ return 0; }
C:\usr\c>sample-004 ■■■■■■ ■■■■■■ ■■■■■■ ■■■■■■ ■■■■■■ ■■■■■■ ■■■■■■ ■■■■■■ C:\usr\c>
Download : sample-005.c ( SJIS 版 )
/* * CDATE sample-005.c */ /* * マジックナンバーの問題点(5) * 8x8 個だけ箱(■)を表示する(define 版) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-005.exe sample-005.c * 実行 * sample-005 */ #include <stdio.h> /* * シンボル定数の定義 * #define を用いて、定数に「意味のある名前」を付ける * マジックナンバー(意味の解らない魔法の数値)がなくなる */ #define TATE_HABA 8 /* 縦幅は 8 */ #define YOKO_HABA 8 /* 横幅も 8 */ /* * main */ int main( int argc, char *argv[] ) { int tate; /* 縦(行数)を数えるための変数 */ int yoko; /* 横(文字数)を数えるための変数 */ /* * YOKO_HABA x TATE_HABA 個だけ箱(■)を表示する */ tate = 0; /* 縦(tate) を 0 から TATE_HABA の前まで */ while ( tate < TATE_HABA ) { /* TATE_HABA 行だけ繰り返す */ yoko = 0; /* 横(yoko) を 0 から YOKO_HABA の前まで */ while ( yoko < YOKO_HABA ) { /* YOKO_HABA 文字だけ繰り返す */ printf ( "■" ); /* 箱(■)を表示 */ yoko++; /* 箱を一個、表示する度に横(yoko)を増やす */ } /* 一行分の箱はこれで OK */ putchar ( '\n' ); /* 一行終ったので「改行(行がえ)」する */ tate++; /* 行を一行、表示する度に横(tate)を増やす */ } /* 全ての処理を終えた */ return 0; }
C:\usr\c>sample-005 ■■■■■■■■ ■■■■■■■■ ■■■■■■■■ ■■■■■■■■ ■■■■■■■■ ■■■■■■■■ ■■■■■■■■ ■■■■■■■■ C:\usr\c>
Download : sample-006.c ( SJIS 版 )
/* * CDATE sample-006.c */ /* * マジックナンバーの問題点(6) * 6x8 個だけ箱(■)を表示する(define 版) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-006.exe sample-006.c * 実行 * sample-006 */ #include <stdio.h> /* * シンボル定数の定義 */ #define TATE_HABA 8 /* 横幅は 8 */ #define YOKO_HABA 6 /* 横幅は 6 */ /** 変更点は一箇所ですむ **/ /* * 「内容の変更 ( 横幅を 8 → 6 )」 と、 * 「プログラムの変更」が『対応』している */ /* * main */ int main( int argc, char *argv[] ) { int tate; /* 縦(行数)を数えるための変数 */ int yoko; /* 横(文字数)を数えるための変数 */ /* * YOKO_HABA x TATE_HABA 個だけ箱(■)を表示する */ tate = 0; /* 縦(tate) を 0 から TATE_HABA の前まで */ while ( tate < TATE_HABA ) { /* TATE_HABA 行だけ繰り返す */ yoko = 0; /* 横(yoko) を 0 から YOKO_HABA の前まで */ while ( yoko < YOKO_HABA ) { /* YOKO_HABA 文字だけ繰り返す */ printf ( "■" ); /* 箱(■)を表示 */ yoko++; /* 箱を一個、表示する度に横(yoko)を増やす */ } /* 一行分の箱はこれで OK */ putchar ( '\n' ); /* 一行終ったので「改行(行がえ)」する */ tate++; /* 行を一行、表示する度に横(tate)を増やす */ } /* 全ての処理を終えた */ return 0; }
C:\usr\c>sample-006 ■■■■■■ ■■■■■■ ■■■■■■ ■■■■■■ ■■■■■■ ■■■■■■ ■■■■■■ ■■■■■■ C:\usr\c>
Download : sample-007.c ( SJIS 版 )
/* * CDATE sample-007.c */ /* * 配列(1) * 単純変数の利用 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-007.exe sample-007.c * 実行 * sample-007 * */ #include <stdio.h> /* * int sum ( int v ) * 一つの数の和(?)を計算する * int v; 一つの数 * 返り値 : 一つの数の和 */ int sum_single ( int v ) { int result = 0; /* 返り値の計算結果を收める変数 */ result += v; /* result = result + v : 一つの数を加える */ return result; } /* * int minus_single ( int v ) * 一つの数の符号を変換 * int v; 一つの数 * 返り値 : 符号を変換した結果 */ int minus_single ( int v ) { int result = 0; /* 返り値の計算結果を收める変数 */ result = -v; /* 符号の変更 */ return result; } /* * main */ int main( int argc, char *argv[] ) { int a; /* 単純変数 */ int s; a = 1; /* 変数の初期変化 */ a = a * 2; /* 変数値の変更 */ printf ( "a = %d\n", a ); /* 変数値の表示 */ s = sum_single ( a ); /* 関数の引数に利用する */ printf ( "sum of a = %d\n", s ); a = minus_single ( a ); /* 関数の値を入れられる */ printf ( "a = %d\n", a ); return 0; }
C:\usr\c>sample-007 a = 2 sum of a = 2 a = -2 C:\usr\c>
Download : sample-008.c ( SJIS 版 )
/* * CDATE sample-008.c */ /* * 配列(2) * 複数の変数をまとめて扱う * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-008.exe sample-008.c * 実行 * sample-008 * */ #include <stdio.h> /* * int sum ( int v0, int v1, int v2 ) * 三つの数の和を計算する * int v0; 一つ目の数 * int v1; 二つ目の数 * int v2; 三つ目の数 * 返り値 : 三つの数の和 */ int sum ( int v0, int v1, int v2 ) { int result = 0; /* 返り値の計算結果を收める変数 */ result += v0; /* result = result + v0 : 一つ目の数を加える */ result += v1; /* 二つ目の数を加える */ result += v2; /* 三つ目の数を加える */ return result; } /* * main */ int main( int argc, char *argv[] ) { int a0; /* 三つの同様な扱いをする変数 */ int a1; int a2; int s; a0 = 1; /* 変数の初期変化 */ a1 = 4; a2 = 9; a0 = a0 * 2; /* 変数値の変更 */ a1 = a1 * 2; a2 = a2 * 2; printf ( "a0 = %d\n", a0 ); /* 変数値の表示 */ printf ( "a1 = %d\n", a1 ); printf ( "a2 = %d\n", a2 ); s = sum ( a0, a1, a2 ); /* 関数への引き渡し */ printf ( "sum of a = %d\n", s ); /* 複数のデータは関数からの返り値として利用できない */ a0 = - a0; /* 変数値の符号の変更 */ a1 = - a1; a2 = - a2; printf ( "a0 = %d\n", a0 ); /* 変数値の表示 */ printf ( "a1 = %d\n", a1 ); printf ( "a2 = %d\n", a2 ); return 0; }
C:\usr\c>sample-008 a0 = 2 a1 = 8 a2 = 18 sum of a = 28 a0 = -2 a1 = -8 a2 = -18 C:\usr\c>
Download : sample-009.c ( SJIS 版 )
/* * CDATE sample-009.c */ /* * 配列(3) * 単純変数から、構造体へ * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-009.exe sample-009.c * 実行 * sample-009 * */ #include <stdio.h> /* * Triplet の定義 */ typedef struct { int a0; int a1; int a2; } Triplet; /* 三つ組(型) */ /* * int sum_triplet ( Triplet v ) * 三つ組の数の和を計算する * Triplet v; 三つ組 * 返り値 : 三つ組の数の和 */ int sum_triplet ( Triplet v ) { int result = 0; /* 返り値の計算結果を收める変数 */ result += v.a0; /* result = result + v.a0 : 三つ組の一つ目の数を加える */ result += v.a1; /* 三つ組の二つ目の数を加える */ result += v.a2; /* 三つ組の三つ目の数を加える */ return result; } /* * Triplet minus_triplet ( Triplet v ) * 三つ組の数をそれぞれ符号変更する * Triplet v; 三つ組 * 返り値 : 符号を変更した三つ組 */ Triplet minus_triplet ( Triplet v ) { Triplet result; /* 返り値の計算結果を收める変数 */ result.a0 = - v.a0; /* 一つ目の数の符号を変更した結果 */ result.a1 = - v.a1; /* 二つ目の数の符号を変更した結果 */ result.a2 = - v.a2; /* 三つ目の数の符号を変更した結果 */ return result; } /* * main */ int main( int argc, char *argv[] ) { Triplet t; /* 三つ組変数 */ int s; t.a0 = 1; /* 変数の初期変化 */ t.a1 = 4; t.a2 = 9; t.a0 = t.a0 * 2; /* 変数値の変更 */ t.a1 = t.a1 * 2; t.a2 = t.a2 * 2; printf ( "t.a0 = %d\n", t.a0 ); /* 変数値の表示 */ printf ( "t.a1 = %d\n", t.a1 ); printf ( "t.a2 = %d\n", t.a2 ); s = sum_triplet ( t ); /* 関数への引き渡しはまとめて */ printf ( "sum of t = %d\n", s ); t = minus_triplet ( t ); /* 値としても使える */ printf ( "t.a0 = %d\n", t.a0 ); /* 変数値の表示 */ printf ( "t.a1 = %d\n", t.a1 ); printf ( "t.a2 = %d\n", t.a2 ); return 0; }
C:\usr\c>sample-009 t.a0 = 2 t.a1 = 8 t.a2 = 18 sum of t = 28 t.a0 = -2 t.a1 = -8 t.a2 = -18 C:\usr\c>
Download : sample-010.c ( SJIS 版 )
/* * CDATE sample-010.c */ /* * 配列(4) * 三組から、四つ組へ.. * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-010.exe sample-010.c * 実行 * sample-010 * */ #include <stdio.h> /* * Quartet の定義 */ typedef struct { int a0; int a1; int a2; int a3; /* 四つ目を増やした */ } Quartet; /* 四つ組(型) */ /* * int sum_quartet ( Quartet v ) * 四つ組の数の和を計算する * Quartet v; 四つ組 * 返り値 : 四つ組の数の和 */ int sum_quartet ( Quartet v ) { int result = 0; /* 返り値の計算結果を收める変数 */ result += v.a0; /* result = result + v.a0 : 四つ組の一つ目の数を加える */ result += v.a1; /* 四つ組の二つ目の数を加える */ result += v.a2; /* 四つ組の三つ目の数を加える */ result += v.a3; /* 四つ組の四つ目の数を加える */ return result; } /* * Quartet minus_quartet ( Quartet v ) * 四つ組の数をそれぞれ符号変更する * Quartet v; 四つ組 * 返り値 : 符号を変更した四つ組 */ Quartet minus_quartet ( Quartet v ) { Quartet result; /* 返り値の計算結果を收める変数 */ result.a0 = - v.a0; /* 一つ目の数の符号を変更した結果 */ result.a1 = - v.a1; /* 二つ目の数の符号を変更した結果 */ result.a2 = - v.a2; /* 三つ目の数の符号を変更した結果 */ result.a3 = - v.a3; /* 四つ目の数の符号を変更した結果 */ return result; } /* * main */ int main( int argc, char *argv[] ) { Quartet q; /* 四つ組変数 */ int s; q.a0 = 1; /* 変数の初期変化 */ q.a1 = 4; q.a2 = 9; q.a3 = 16; q.a0 = q.a0 * 2; /* 変数値の変更 */ q.a1 = q.a1 * 2; q.a2 = q.a2 * 2; q.a3 = q.a3 * 2; printf ( "q.a0 = %d\n", q.a0 ); /* 変数値の表示 */ printf ( "q.a1 = %d\n", q.a1 ); printf ( "q.a2 = %d\n", q.a2 ); printf ( "q.a3 = %d\n", q.a3 ); s = sum_quartet ( q ); /* 関数への引き渡しはまとめて */ printf ( "sum of t = %d\n", s ); q = minus_quartet ( q ); /* 値としても使える */ printf ( "q.a0 = %d\n", q.a0 ); /* 変数値の表示 */ printf ( "q.a1 = %d\n", q.a1 ); printf ( "q.a2 = %d\n", q.a2 ); printf ( "q.a3 = %d\n", q.a3 ); return 0; }
C:\usr\c>sample-010 q.a0 = 2 q.a1 = 8 q.a2 = 18 q.a3 = 32 sum of t = 60 q.a0 = -2 q.a1 = -8 q.a2 = -18 q.a3 = -32 C:\usr\c>
Download : sample-011.c ( SJIS 版 )
/* * 2013/10/25 sample-011.c */ /* * 配列(5) * 配列を利用して、三組を実現 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-011.exe sample-011.c * 実行 * sample-011 * */ #include <stdio.h> /* * Triplet の定義(配列版) */ #define TRIPLET_ARRAY_SIZE 3 /* 三つ組(型)の要素数は 3 */ typedef struct { int a[TRIPLET_ARRAY_SIZE]; /* 配列の要素数は TRIPLET_ARRAY_SIZE */ } Triplet; /* 三つ組(型) */ /* * int sum_triplet ( Triplet v ) * 三つ組の数の和を計算する * Triplet v; 三つ組 * 返り値 : 三つ組の数の和 */ int sum_triplet ( Triplet v ) { int result = 0; /* 返り値の計算結果を收める変数 */ int index; /* 配列の添字 */ index = 0; /* index を 0 〜 */ while ( index < TRIPLET_ARRAY_SIZE ) { /* TRIPLET_ARRAY_SIZE の一つ前迄 */ result += v.a[index]; /* 三つ組の index つ目の数を加える */ index++; /* index を一つ増やす */ } return result; } /* * Triplet minus_triplet ( Triplet v ) * 三つ組の数をそれぞれ符号変更する * Triplet v; 三つ組 * 返り値 : 符号を変更した三つ組 */ Triplet minus_triplet ( Triplet v ) { Triplet result; /* 返り値の計算結果を收める変数 */ int index; /* 配列の添字 */ index = 0; /* index を 0 〜 */ while ( index < TRIPLET_ARRAY_SIZE ) { /* TRIPLET_ARRAY_SIZE の一つ前迄 */ result.a[index] = - v.a[index]; /* index つ目の数の符号を変更 */ index++; /* index を一つ増やす */ } return result; } /* * main */ int main( int argc, char *argv[] ) { Triplet t; /* 三つ組変数 */ int s; int index; /* 変数の初期変化 */ index = 0; while ( index < TRIPLET_ARRAY_SIZE ) { t.a[index] = (index+1)*(index+1); index++; } /* 変数値の変更 */ index = 0; while ( index < TRIPLET_ARRAY_SIZE ) { t.a[index] = t.a[index] * 2; index++; } /* 変数値の表示 */ index = 0; while ( index < TRIPLET_ARRAY_SIZE ) { printf ( "t.a[%d] = %d\n", index, t.a[index] ); index++; } s = sum_triplet ( t ); /* 関数への引き渡しはまとめて */ printf ( "sum of t = %d\n", s ); t = minus_triplet ( t ); /* 値としても使える */ index = 0; while ( index < TRIPLET_ARRAY_SIZE ) { printf ( "t.a[%d] = %d\n", index, t.a[index] ); index++; } return 0; }
C:\usr\c>sample-011 t.a[0] = 2 t.a[1] = 8 t.a[2] = 18 sum of t = 28 t.a[0] = -2 t.a[1] = -8 t.a[2] = -18 C:\usr\c>
Download : sample-012.c ( SJIS 版 )
/* * 2013/10/25 sample-012.c */ /* * 配列(6) * 配列を利用して、N つ組(ベクトル)を実現 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-012.exe sample-012.c * 実行 * sample-012 * */ #include <stdio.h> /* * Vector の定義(配列版) */ #define VECTOR_SIZE 4 /* n つ組(型)の要素数を試しに 4 にしてみる */ typedef struct { int a[VECTOR_SIZE]; /* 配列の要素数は VECTOR_SIZE */ } Vector; /* n つ組(型) */ /* * int sum_vector ( Vector v ) * n つ組の数の和を計算する * Vector v; n つ組 * 返り値 : n つ組の数の和 */ int sum_vector ( Vector v ) { int result = 0; /* 返り値の計算結果を收める変数 */ int index; /* 配列の添字 */ index = 0; /* index を 0 〜 */ while ( index < VECTOR_SIZE ) { /* VECTOR_SIZE の一つ前迄 */ result += v.a[index]; /* n つ組の index つ目の数を加える */ index++; /* index を一つ増やす */ } return result; } /* * Vector minus_vector ( Vector v ) * n つ組の数をそれぞれ符号変更する * Vector v; n つ組 * 返り値 : 符号を変更したn つ組 */ Vector minus_vector ( Vector v ) { Vector result; /* 返り値の計算結果を收める変数 */ int index; /* 配列の添字 */ index = 0; /* index を 0 〜 */ while ( index < VECTOR_SIZE ) { /* VECTOR_SIZE の一つ前迄 */ result.a[index] = - v.a[index]; /* index つ目の数の符号を変更 */ index++; /* index を一つ増やす */ } return result; } /* * main */ int main( int argc, char *argv[] ) { Vector t; /* n つ組変数 */ int s; int index; /* 変数の初期変化 */ index = 0; while ( index < VECTOR_SIZE ) { t.a[index] = (index+1)*(index+1); index++; } /* 変数値の変更 */ index = 0; while ( index < VECTOR_SIZE ) { t.a[index] = t.a[index] * 2; index++; } /* 変数値の表示 */ index = 0; while ( index < VECTOR_SIZE ) { printf ( "t.a[%d] = %d\n", index, t.a[index] ); index++; } s = sum_vector ( t ); /* 関数への引き渡しはまとめて */ printf ( "sum of t = %d\n", s ); t = minus_vector ( t ); /* 値としても使える */ index = 0; while ( index < VECTOR_SIZE ) { printf ( "t.a[%d] = %d\n", index, t.a[index] ); index++; } return 0; }
C:\usr\c>sample-012 t.a[0] = 2 t.a[1] = 8 t.a[2] = 18 t.a[3] = 32 sum of t = 60 t.a[0] = -2 t.a[1] = -8 t.a[2] = -18 t.a[3] = -32 C:\usr\c>
Download : sample-013.c ( SJIS 版 )
/* * CDATE sample-013.c */ /* * 配列(7) * 二次元配列を利用して、N 次元正方行列を実現 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-013.exe sample-013.c * 実行 * sample-013 * */ #include <stdio.h> /* * Matrix の定義(配列版) */ #define MATRIX_SIZE 4 /* n つ組(型)の要素数を試しに 4 にしてみる */ typedef struct { int a[MATRIX_SIZE][MATRIX_SIZE]; /* 配列の要素数は MATRIX_SIZE^2 */ } Matrix; /* n 次行列(型) */ /* * void print_matrix ( Matrix v ) * 配列の要素の和を計算する * Matrix v; 行列 * 返り値 : なし */ void print_matrix ( Matrix v ) { int result = 0; /* 返り値の計算結果を收める変数 */ int i; /* 配列の添字 */ int j; /* 配列の添字 */ i = 0; /* i を 0 〜 */ while ( i < MATRIX_SIZE ) { /* MATRIX_SIZE の一つ前迄 */ j = 0; /* j を 0 〜 */ while ( j < MATRIX_SIZE ) { /* MATRIX_SIZE の一つ前迄 */ printf ( "%d ", v.a[i][j] ); /* (i,j) 要素を表示 */ j++; } putchar ( '\n' ); i++; /* i を一つ増やす */ } return result; } /* * int sum_matrix ( Matrix v ) * 行列の数の和を計算する * Matrix v; 行列 * 返り値 : 行列の数の和 */ int sum_matrix ( Matrix v ) { int result = 0; /* 返り値の計算結果を收める変数 */ int i; /* 配列の添字 */ int j; /* 配列の添字 */ i = 0; /* i を 0 〜 */ while ( i < MATRIX_SIZE ) { /* MATRIX_SIZE の一つ前迄 */ j = 0; /* j を 0 〜 */ while ( j < MATRIX_SIZE ) { /* MATRIX_SIZE の一つ前迄 */ result += v.a[i][j]; /* (i,j) 要素を加える */ j++; } i++; /* i を一つ増やす */ } return result; } /* * Matrix minus_matrix ( Matrix v ) * 行列の数をそれぞれ符号変更する * Matrix v; 行列 * 返り値 : 符号を変更した行列 */ Matrix minus_matrix ( Matrix v ) { Matrix result; /* 返り値の計算結果を收める変数 */ int i; /* 配列の添字 */ int j; /* 配列の添字 */ i = 0; /* i を 0 〜 */ while ( i < MATRIX_SIZE ) { /* MATRIX_SIZE の一つ前迄 */ j = 0; /* j を 0 〜 */ while ( j < MATRIX_SIZE ) { /* MATRIX_SIZE の一つ前迄 */ result.a[i][j] = -v.a[i][j]; /* (i,j) 要素の符号の変更 */ j++; } i++; /* i を一つ増やす */ } return result; } /* * main */ int main( int argc, char *argv[] ) { Matrix t; /* 行列変数 */ int s; int i; /* 配列の添字 */ int j; /* 配列の添字 */ /* 変数の初期変化 */ i = 0; /* i を 0 〜 */ while ( i < MATRIX_SIZE ) { /* MATRIX_SIZE の一つ前迄 */ j = 0; /* j を 0 〜 */ while ( j < MATRIX_SIZE ) { /* MATRIX_SIZE の一つ前迄 */ t.a[i][j] = i * j; /* (i, j) 要素の値を决める */ j++; } i++; /* i を一つ増やす */ } /* 変数値の変更 */ i = 0; /* i を 0 〜 */ while ( i < MATRIX_SIZE ) { /* MATRIX_SIZE の一つ前迄 */ j = 0; /* j を 0 〜 */ while ( j < MATRIX_SIZE ) { /* MATRIX_SIZE の一つ前迄 */ t.a[i][j] = t.a[i][j] * 2; /* (i, j) 要素の値を二倍に */ j++; } i++; /* i を一つ増やす */ } /* 変数値の表示 */ print_matrix ( t ); /* 面倒なので関数に.. */ s = sum_matrix ( t ); /* 関数への引き渡しはまとめて */ printf ( "sum of t = %d\n", s ); t = minus_matrix ( t ); /* 値としても使える */ print_matrix ( t ); /* 面倒なので関数に.. */ return 0; }
C:\usr\c>sample-013 0 0 0 0 0 2 4 6 0 4 8 12 0 6 12 18 sum of t = 72 0 0 0 0 0 -2 -4 -6 0 -4 -8 -12 0 -6 -12 -18 C:\usr\c>
Download : sample-014.c ( SJIS 版 )
/* * 2013/10/25 sample-014.c */ /* * for 文(1) * 繰返しの系譜 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-014.exe sample-014.c * 実行 * sample-014 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { /* 同じことを三回したい場合は ... 同じ命令を三回繰り返せば良い */ /* 「おめでとう。」を三回出力する */ printf ( "おめでとう。\n" ); /* 一回目 */ printf ( "おめでとう。\n" ); /* ニ回目も一回目と同じ */ printf ( "おめでとう。\n" ); /* 三回目も同様 */ /* * 同じ事を N 回繰り返すレシピ(0) * * 「繰返しの内容」 1 N 回同じ内容を繰り返す * 「繰返しの内容」 2 * .. * 「繰返しの内容」 N */ return 0; }
C:\usr\c>sample-014 おめでとう。 おめでとう。 おめでとう。 C:\usr\c>
Download : sample-015.c ( SJIS 版 )
/* * 2013/10/25 sample-015.c */ /* * for 文(2) * 繰返しの系譜 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-015.exe sample-015.c * 実行 * sample-015 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int count_down = 3; /* 繰返し回数を 3 とする */ /* 同じ命令の繰り返しなら while 文が使える */ /* 「おめでとう。」を三回出力する */ while ( count_down > 0 ) { /* まだ繰返し回数が残っている */ printf ( "おめでとう。\n" ); /* 繰り返す命令を一度だけ実行 */ count_down--; /* 繰返し回数を減らす */ } /* * 同じ事を N 回繰り返すレシピ (1) * * int count_down = 「繰返し回数」; * while ( count_down > 0 ) { * 「繰返しの内容」 * count_down--; * } */ return 0; }
C:\usr\c>sample-015 おめでとう。 おめでとう。 おめでとう。 C:\usr\c>
Download : sample-016.c ( SJIS 版 )
/* * 2013/10/25 sample-016.c */ /* * for 文(3) * 繰返しの系譜 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-016.exe sample-016.c * 実行 * sample-016 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int count_up; /* 残り幾つ(count_down)ではなく、幾つやったか(count_up)という考え方 */ count_up = 0; /* 一度もやっていない */ while ( count_up < 3 ) { /* 繰返し数が必要なだけやっていない */ printf ( "おめでとう。\n" ); /* 繰り返す命令を一度だけ実行 */ count_up++; /* 実行した数を数え上げる */ } /* * 同じ事を N 回繰り返すレシピ (2) * * int count_up; * count_up = 0; * while ( count_up < 「繰返し回数」 ) { * 「繰返しの内容」 * count_up++; * } */ return 0; }
C:\usr\c>sample-016 おめでとう。 おめでとう。 おめでとう。 C:\usr\c>
Download : sample-017.c ( SJIS 版 )
/* * 2013/10/25 sample-017.c */ /* * for 文(4) * 繰返しの系譜 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-017.exe sample-017.c * 実行 * sample-017 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int count_up; /* while を for に置き換える */ /* for 文を利用すると、繰返しの情報が先頭に集約され分かり易い */ for ( count_up = 0; count_up < 3; count_up++ ) { printf ( "おめでとう。\n" ); /* 繰り返す命令を一度だけ実行 */ } /* * 同じ事を N 回繰り返すレシピ (3) * * int count_up; * for ( count_up = 0; count_up < 「繰返し回数」; count_up++ ) { * 「繰返しの内容」 * } */ return 0; }
C:\usr\c>sample-017 おめでとう。 おめでとう。 おめでとう。 C:\usr\c>
Download : sample-018.c ( SJIS 版 )
/* * 2013/10/25 sample-018.c */ /* * for 文(5) * 繰返しの系譜 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-018.exe sample-018.c * 実行 * sample-018 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int count_down; /* 減数型の for 文 */ for ( count_down = 3; count_down > 0; count_down-- ) { printf ( "おめでとう。\n" ); } /* * 同じ事を N 回繰り返すレシピ (4) * * int count_down; * for ( count_down = 「繰返し回数」; count_down > 0; count_down-- ) { * 「繰返しの内容」 * } */ return 0; }
C:\usr\c>sample-018 おめでとう。 おめでとう。 おめでとう。 C:\usr\c>
Download : sample-019.c ( SJIS 版 )
/* * 2013/10/25 sample-019.c */ /* * break (1) * 繰返しの中で、条件判断を行う * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-019.exe sample-019.c * 実行 * sample-019 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int data[] = { -1, -3, 4, -5, 2, -8, -7, 10, 0 }; /* 配列の初期化 */ /* int data[10]; data[0] = -1; data[1] = -3; .. data[9] = 0; と同じ */ int i = 0; while ( data[i] != 0 ) { /* データの最後は 0 */ if ( data[i] > 0 ) { /* データの中身が正の時だけ出す */ printf ( "data[%d] = %d\n", i, data[i] ); } i++; } return 0; }
C:\usr\c>sample-019 data[2] = 4 data[4] = 2 data[7] = 10 C:\usr\c>
Download : sample-020.c ( SJIS 版 )
/* * 2013/10/25 sample-020.c */ /* * break (2) * 繰返しの中で、条件判断を行う * 最初の情報で終了する * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-020.exe sample-020.c * 実行 * sample-020 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int data[] = { -1, -3, 4, -5, 2, -8, -7, 10, 0 }; int i = 0; while ( data[i] != 0 ) { /* データの最後は 0 */ if ( data[i] > 0 ) { /* データの中身が正の時だけ出す */ printf ( "data[%d] = %d\n", i, data[i] ); break; /* これが実行されると loop は終了 */ } i++; } return 0; }
C:\usr\c>sample-020 data[2] = 4 C:\usr\c>
#include <stdio.h> int main( int argc, char *argv[] ) { int tate; int yoko; tate = 0; while ( tate < 8 ) { /* 8 がマジックナンバー */ yoko = 0; while ( yoko < 8 ) { printf ( "■" ); yoko++; } putchar ( '\n' ); tate++; } return 0; }
#include <stdio.h> int main( int argc, char *argv[] ) { int tate; int yoko; tate = 0; while ( tate < 7 ) { yoko = 0; while ( yoko < 7 ) { printf ( "■" ); yoko++; } putchar ( '\n' ); tate++; } return 0; }
#include <stdio.h> int main( int argc, char *argv[] ) { int tate; int yoko; tate = 0; while ( tate < 8 ) { yoko = 0; while ( yoko < 6 ) { printf ( "■" ); yoko++; } putchar ( '\n' ); tate++; } return 0; }
#include <stdio.h> #define TATE_HABA 8 /* 縦幅は 6 */ #define YOKO_HABA 6 /* 横幅も 20 */ int main( int argc, char *argv[] ) { int tate; int yoko; tate = 0; while ( tate < TATE_HABA ) { /* TATE_HABA の大きさだけ書く */ yoko = 0; while ( yoko < YOKO_HABA ) { /* YOKO_HABA の大きさだけ書く */ printf ( "■" ); yoko++; } putchar ( '\n' ); tate++; } return 0; }
/* * CDATE sample-007.c */ /* * 配列(1) * 単純変数の利用 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-007.exe sample-007.c * 実行 * sample-007 * */ #include <stdio.h> /* * int sum ( int v ) * 一つの数の和(?)を計算する * int v; 一つの数 * 返り値 : 一つの数の和 */ int sum_single ( int v ) { int result = 0; /* 返り値の計算結果を收める変数 */ result += v; /* result = result + v : 一つの数を加える */ return result; } /* * int minus_single ( int v ) * 一つの数の符号を変換 * int v; 一つの数 * 返り値 : 符号を変換した結果 */ int minus_single ( int v ) { int result = 0; /* 返り値の計算結果を收める変数 */ result = -v; /* 符号の変更 */ return result; } /* * main */ int main( int argc, char *argv[] ) { int a; /* 単純変数 */ int s; a = 1; /* 変数の初期変化 */ a = a * 2; /* 変数値の変更 */ printf ( "a = %d\n", a ); /* 変数値の表示 */ s = sum_single ( a ); /* 関数の引数に利用する */ printf ( "sum of a = %d\n", s ); a = minus_single ( a ); /* 関数の値を入れられる */ printf ( "a = %d\n", a ); return 0; }
/* * CDATE sample-008.c */ /* * 配列(2) * 複数の変数をまとめて扱う * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-008.exe sample-008.c * 実行 * sample-008 * */ #include <stdio.h> /* * int sum ( int v0, int v1, int v2 ) * 三つの数の和を計算する * int v0; 一つ目の数 * int v1; 二つ目の数 * int v2; 三つ目の数 * 返り値 : 三つの数の和 */ int sum ( int v0, int v1, int v2 ) { int result = 0; /* 返り値の計算結果を收める変数 */ result += v0; /* result = result + v0 : 一つ目の数を加える */ result += v1; /* 二つ目の数を加える */ result += v2; /* 三つ目の数を加える */ return result; } /* * main */ int main( int argc, char *argv[] ) { int a0; /* 三つの同様な扱いをする変数 */ int a1; int a2; int s; a0 = 1; /* 変数の初期変化 */ a1 = 4; a2 = 9; a0 = a0 * 2; /* 変数値の変更 */ a1 = a1 * 2; a2 = a2 * 2; printf ( "a0 = %d\n", a0 ); /* 変数値の表示 */ printf ( "a1 = %d\n", a1 ); printf ( "a2 = %d\n", a2 ); s = sum ( a0, a1, a2 ); /* 関数への引き渡し */ printf ( "sum of a = %d\n", s ); /* 複数のデータは関数からの返り値として利用できない */ /* <a0,a1,a2> = minus ( <a0,a1,a2> ); みたいな事ができると嬉しいが、実際できない。 */ a0 = - a0; /* 変数値の符号の変更 */ a1 = - a1; a2 = - a2; printf ( "a0 = %d\n", a0 ); /* 変数値の表示 */ printf ( "a1 = %d\n", a1 ); printf ( "a2 = %d\n", a2 ); return 0; }
/* * CDATE sample-009.c */ /* * 配列(3) * 単純変数から、構造体へ * a0, a1, a2 が三つで組を作っているならば * それを一つの物として扱えると嬉しいのでは ? * => 構造体を作る * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-009.exe sample-009.c * 実行 * sample-009 * */ #include <stdio.h> /* * Triplet の定義 (三組) */ typedef struct { int a0; int a1; int a2; } Triplet; /* 三つ組(型) */ /* * int sum_triplet ( Triplet v ) * 三つ組の数の和を計算する * Triplet v; 三つ組 * 返り値 : 三つ組の数の和 */ int sum_triplet ( Triplet v ) { int result = 0; /* 返り値の計算結果を收める変数 */ result += v.a0; /* result = result + v.a0 : 三つ組の一つ目の数を加える */ result += v.a1; /* 三つ組の二つ目の数を加える */ result += v.a2; /* 三つ組の三つ目の数を加える */ return result; } /* * Triplet minus_triplet ( Triplet v ) * 三つ組の数をそれぞれ符号変更する * Triplet v; 三つ組 * 返り値 : 符号を変更した三つ組 */ Triplet minus_triplet ( Triplet v ) { Triplet result; /* 返り値の計算結果を收める変数 */ result.a0 = - v.a0; /* 一つ目の数の符号を変更した結果 */ result.a1 = - v.a1; /* 二つ目の数の符号を変更した結果 */ result.a2 = - v.a2; /* 三つ目の数の符号を変更した結果 */ return result; } /* * main */ int main( int argc, char *argv[] ) { Triplet t; /* 三つ組変数 */ /* 一つの変数 t を宣言すると、同時に t.a0, t.a1, t.a2 が変数 として利用できるようになる int a; a +---------+ | | +---------+ a = 1; a +---------+ | 1 | +---------+ Triplet t; t +--------------+ |t.a1 +-------+| | | || |t.a2 +-------+| | | || |t.a3 +-------+| | | || | +-------+| +--------------+ */ int s; t.a0 = 1; /* 変数の初期変化 */ t.a1 = 4; t.a2 = 9; /* 初期化の時だけ Triplet t = { 1, 4, 9 }; とまとめて、代入できます。 */ /* t +--------------+ |t.a1 +-------+| | | 1 || |t.a2 +-------+| | | 4 || |t.a3 +-------+| | | 9 || | +-------+| +--------------+ */ t.a0 = t.a0 * 2; /* 変数値の変更 */ t.a1 = t.a1 * 2; t.a2 = t.a2 * 2; printf ( "t.a0 = %d\n", t.a0 ); /* 変数値の表示 */ printf ( "t.a1 = %d\n", t.a1 ); printf ( "t.a2 = %d\n", t.a2 ); s = sum_triplet ( t ); /* 関数への引き渡しはまとめて */ printf ( "sum of t = %d\n", s ); t = minus_triplet ( t ); /* 値としても使える */ printf ( "t.a0 = %d\n", t.a0 ); /* 変数値の表示 */ printf ( "t.a1 = %d\n", t.a1 ); printf ( "t.a2 = %d\n", t.a2 ); return 0; }
/* * CDATE sample-010.c */ /* * 配列(4) * 三組から、四つ組へ.. * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-010.exe sample-010.c * 実行 * sample-010 * */ #include <stdio.h> /* * Quartet の定義 */ typedef struct { int a0; int a1; int a2; int a3; /* 四つ目を増やした */ } Quartet; /* 四つ組(型) */ /* * int sum_quartet ( Quartet v ) * 四つ組の数の和を計算する * Quartet v; 四つ組 * 返り値 : 四つ組の数の和 */ int sum_quartet ( Quartet v ) { int result = 0; /* 返り値の計算結果を收める変数 */ result += v.a0; /* result = result + v.a0 : 四つ組の一つ目の数を加える */ result += v.a1; /* 四つ組の二つ目の数を加える */ result += v.a2; /* 四つ組の三つ目の数を加える */ result += v.a3; /* 四つ組の四つ目の数を加える */ return result; } /* * Quartet minus_quartet ( Quartet v ) * 四つ組の数をそれぞれ符号変更する * Quartet v; 四つ組 * 返り値 : 符号を変更した四つ組 */ Quartet minus_quartet ( Quartet v ) { Quartet result; /* 返り値の計算結果を收める変数 */ result.a0 = - v.a0; /* 一つ目の数の符号を変更した結果 */ result.a1 = - v.a1; /* 二つ目の数の符号を変更した結果 */ result.a2 = - v.a2; /* 三つ目の数の符号を変更した結果 */ result.a3 = - v.a3; /* 四つ目の数の符号を変更した結果 */ return result; } /* * main */ int main( int argc, char *argv[] ) { Quartet q; /* 四つ組変数 */ int s; q.a0 = 1; /* 変数の初期変化 */ q.a1 = 4; q.a2 = 9; q.a3 = 16; q.a0 = q.a0 * 2; /* 変数値の変更 */ q.a1 = q.a1 * 2; q.a2 = q.a2 * 2; q.a3 = q.a3 * 2; printf ( "q.a0 = %d\n", q.a0 ); /* 変数値の表示 */ printf ( "q.a1 = %d\n", q.a1 ); printf ( "q.a2 = %d\n", q.a2 ); printf ( "q.a3 = %d\n", q.a3 ); s = sum_quartet ( q ); /* 関数への引き渡しはまとめて */ printf ( "sum of t = %d\n", s ); q = minus_quartet ( q ); /* 値としても使える */ printf ( "q.a0 = %d\n", q.a0 ); /* 変数値の表示 */ printf ( "q.a1 = %d\n", q.a1 ); printf ( "q.a2 = %d\n", q.a2 ); printf ( "q.a3 = %d\n", q.a3 ); return 0; }
/* * CDATE sample-011.c */ /* * 配列(5) * 配列を利用して、三組を実現 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-011.exe sample-011.c * 実行 * sample-011 * */ #include <stdio.h> /* * Triplet の定義(配列版) */ #define TRIPLET_ARRAY_SIZE 3 /* 三つ組(型)の要素数は 3 */ typedef struct { int a[TRIPLET_ARRAY_SIZE]; /* int a0; int a1; int a2; int a[3]; とすると a[0], a[1], a[2] が作られる int sum = 0; 三つの数の和 int a0 = 1; int a1 = 4; int a2 = 9; sum += a0; sum ← sum + a0 ( 0 + 1 => 1 ) sum += a1; sum ← sum + a1 ( 1 + 4 => 5 ) sum += a2; sum ← sum + a2 ( 5 + 9 => 14 ) int sum = 0; 配列 int a[3]; sum += a[0]; sum ← sum + a[0] ( 0 + 1 => 1 ) sum += a[1]; sum ← sum + a[1] ( 1 + 4 => 5 ) sum += a[2]; sum ← sum + a[2] ( 5 + 9 => 14 ) int sum = 0; 配列 int index; 添字 int a[3]; index = 0; sum += a[index]; sum ← sum + a[0] ( 0 + 1 => 1 ) index = 1; sum += a[index]; sum ← sum + a[1] ( 1 + 4 => 5 ) index = 2; sum += a[index]; sum ← sum + a[2] ( 5 + 9 => 14 ) index = 0; sum += a[index]; sum ← sum + a[0] ( 0 + 1 => 1 ) index++; index = index + 1 = 1 sum += a[index]; sum ← sum + a[1] ( 1 + 4 => 5 ) index++; index = index + 1 = 2 sum += a[index]; sum ← sum + a[2] ( 5 + 9 => 14 ) index = 0; sum += a[index]; sum ← sum + a[0] ( 0 + 1 => 1 ) index++; index = index + 1 = 1 sum += a[index]; sum ← sum + a[1] ( 1 + 4 => 5 ) index++; index = index + 1 = 2 sum += a[index]; sum ← sum + a[2] ( 5 + 9 => 14 ) index++; index = index + 1 = 2 index = 0; while ( index < 3 ) { sum += a[index]; index++; } */ } Triplet; /* 三つ組(型) */ /* * int sum_triplet ( Triplet v ) * 三つ組の数の和を計算する * Triplet v; 三つ組 * 返り値 : 三つ組の数の和 */ int sum_triplet ( Triplet v ) { int result = 0; /* 返り値の計算結果を收める変数 */ int index; /* 配列の添字 */ index = 0; /* index を 0 〜 */ while ( index < TRIPLET_ARRAY_SIZE ) { /* TRIPLET_ARRAY_SIZE の一つ前迄 */ result += v.a[index]; /* 三つ組の index つ目の数を加える */ index++; /* index を一つ増やす */ } return result; } /* * Triplet minus_triplet ( Triplet v ) * 三つ組の数をそれぞれ符号変更する * Triplet v; 三つ組 * 返り値 : 符号を変更した三つ組 */ Triplet minus_triplet ( Triplet v ) { Triplet result; /* 返り値の計算結果を收める変数 */ int index; /* 配列の添字 */ index = 0; /* index を 0 〜 */ while ( index < TRIPLET_ARRAY_SIZE ) { /* TRIPLET_ARRAY_SIZE の一つ前迄 */ result.a[index] = - v.a[index]; /* index つ目の数の符号を変更 */ index++; /* index を一つ増やす */ } return result; } /* * main */ int main( int argc, char *argv[] ) { Triplet t; /* 三つ組変数 */ int s; int index; /* 変数の初期変化 */ index = 0; while ( index < TRIPLET_ARRAY_SIZE ) { t.a[index] = (index+1)*(index+1); index++ } /* 変数値の変更 */ index = 0; while ( index < TRIPLET_ARRAY_SIZE ) { t.a[index] = t.a[index] * 2; index++ } /* 変数値の表示 */ index = 0; while ( index < TRIPLET_ARRAY_SIZE ) { printf ( "t.a[%d] = %d\n", index, t.a[index] ); index++ } s = sum_triplet ( t ); /* 関数への引き渡しはまとめて */ printf ( "sum of t = %d\n", s ); t = minus_triplet ( t ); /* 値としても使える */ index = 0; while ( index < TRIPLET_ARRAY_SIZE ) { printf ( "t.a[%d] = %d\n", index, t.a[index] ); index++ } return 0; }
/* * CDATE sample-011.c */ /* * 配列(5) * 配列を利用して、三組を実現 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-011.exe sample-011.c * 実行 * sample-011 * */ #include <stdio.h> /* * Triplet の定義(配列版) */ #define TRIPLET_ARRAY_SIZE 10 /* 三つ組(型)の要素数は 3 */ typedef struct { int a[TRIPLET_ARRAY_SIZE]; /* 配列の要素数は TRIPLET_ARRAY_SIZE */ } Triplet; /* 三つ組(型) */ /* * int sum_triplet ( Triplet v ) * 三つ組の数の和を計算する * Triplet v; 三つ組 * 返り値 : 三つ組の数の和 */ int sum_triplet ( Triplet v ) { int result = 0; /* 返り値の計算結果を收める変数 */ int index; /* 配列の添字 */ index = 0; /* index を 0 〜 */ while ( index < TRIPLET_ARRAY_SIZE ) { /* TRIPLET_ARRAY_SIZE の一つ前迄 */ result += v.a[index]; /* 三つ組の index つ目の数を加える */ index++; /* index を一つ増やす */ } return result; } /* * Triplet minus_triplet ( Triplet v ) * 三つ組の数をそれぞれ符号変更する * Triplet v; 三つ組 * 返り値 : 符号を変更した三つ組 */ Triplet minus_triplet ( Triplet v ) { Triplet result; /* 返り値の計算結果を收める変数 */ int index; /* 配列の添字 */ index = 0; /* index を 0 〜 */ while ( index < TRIPLET_ARRAY_SIZE ) { /* TRIPLET_ARRAY_SIZE の一つ前迄 */ result.a[index] = - v.a[index]; /* index つ目の数の符号を変更 */ index++; /* index を一つ増やす */ } return result; } /* * main */ int main( int argc, char *argv[] ) { Triplet t; /* 三つ組変数 */ int s; int index; /* 変数の初期変化 */ index = 0; while ( index < TRIPLET_ARRAY_SIZE ) { t.a[index] = (index+1)*(index+1); index++; } /* 変数値の変更 */ index = 0; while ( index < TRIPLET_ARRAY_SIZE ) { t.a[index] = t.a[index] * 2; index++; } /* 変数値の表示 */ index = 0; while ( index < TRIPLET_ARRAY_SIZE ) { printf ( "t.a[%d] = %d\n", index, t.a[index] ); index++; } s = sum_triplet ( t ); /* 関数への引き渡しはまとめて */ printf ( "sum of t = %d\n", s ); t = minus_triplet ( t ); /* 値としても使える */ index = 0; while ( index < TRIPLET_ARRAY_SIZE ) { printf ( "t.a[%d] = %d\n", index, t.a[index] ); index++; } return 0; }
#include <stdio.h> int main(int argc, char *argv[] ) { int i; for ( i = 0; i < 10; i = i + 2 ) { printf ( "%d\n", i ); } return 0; }
#include <stdio.h> int main(int argc, char *argv[] ) { int i; /* for 文を while 文に変更する for ( i = 0; i < 10; i++ ) { printf ( "%d\n", i ); } 1) for → while while ( i = 0; i < 10; i++ ) { printf ( "%d\n", i ); } 2) 初期化式を前に出す i = 0; while (i < 10; i++ ) { printf ( "%d\n", i ); } 3) 繰返し式を while の最後に移す i = 0; while (i < 10 ) { printf ( "%d\n", i ); i++; } */ i = 0; while (i < 10 ) { printf ( "%d\n", i ); i = i + 2; } return 0; }
#include <stdio.h> int main(int argc, char *argv[] ) { int i; int j; j = 30; i = 0; while ( i < 10 ) { printf ( "i=%d\n", i ); if ( j < i * i ) { /* i = 0, 1, .., 3 の時までは不成立 */ /* i = 4 の時に、 10 < 16 = 4*4 となるので成立 */ break; /* その時に break 文が実行されるので while 文が終了する */ } i++; } return 0; }
/* * 2013/10/25 sample-019.c */ /* * break (1) * 繰返しの中で、条件判断を行う * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-019.exe sample-019.c * 実行 * sample-019 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { /* 今、何らかの理由で 0 以外のデータが 8 個ある 0 はデータ終了という特別な情報 この中から特別なデータを探し出したい。 具体的には、正のデータだけを出したい。 */ int data[] = { -1, -3, 4, -5, 2, -8, -7, 10, 0 }; /* 配列の初期化 */ /* int data[10]; data[0] = -1; data[1] = -3; .. data[8] = 0; と同じ */ int i = 0; while ( data[i] != 0 ) { /* データの最後は 0 */ if ( data[i] > 0 ) { /* データの中身が正の時だけ出す */ printf ( "data[%d] = %d\n", i, data[i] ); } i++; } return 0; }
/* * 2013/10/25 sample-020.c */ /* * break (2) * 繰返しの中で、条件判断を行う * 最初の情報で終了する * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-020.exe sample-020.c * 実行 * sample-020 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int data[] = { -1, -3, 4, -5, 2, -8, -7, 10, 0 }; int i = 0; while ( data[i] != 0 ) { /* データの最後は 0 */ if ( data[i] > 0 ) { /* データの中身が正の時だけ出す */ printf ( "data[%d] = %d\n", i, data[i] ); break; /* これが実行されると loop は終了 */ } i++; } return 0; }
前回は オセロのゲーム盤を作る (途中) call by need ( 必要になったらその場で解説 ) 1. シンボル定数の定義 ( #define の利用 ) 2. 配列 : 同じ型のデータをまとめて処理する 配列の特徴は、添字(の所に式を入れて、間接的に..)で参照できる 配列を利用すると、ループ(while)の形で記述できる 繰返し回数が変化しても、プログラムはかえなくてよい # 繰返し回数(という「数値」)をかえればよい 三組 四組 Triplet Quartet 構造体のまま 構造体のまま 三つの命令が必要 四つの命令が必要 Triplet Quartet 配列を利用する 配列を利用する 繰返しが一つ 繰返しが一つ 繰返し数が 3 繰返し数が 4 !! 二次元 3. for 文 書式: for ( 初期化式; 条件式; 繰返し式 ) { 繰返し文 } 例: /* 0 から 9 までの整数を(一行に一つずつ)画面に出力する */ for ( i = 0; i < 10; i++ ) { printf ( "%d\n", i ); } 実は、while 文の一変形だと思ってよい。 for ( 初期化式; 条件式; 繰返し式 ) { 繰返し文 } の意味は、 初期化式; while ( 条件式 ) { 繰返し文 繰返し式; } と同じ。 4. break; break; は、 loop ( while, for, [do while] ) の中で利用する しかも、普通は、if 文と組み合わせで使う 書式: break; 機能: break 文が実行されると、break を含む、最も 内側の loop 文を終了する。 例: j = 10; i = 0; while ( i < 10 ) { printf ( "i=%d\n", i ); if ( j < i * i ) { /* i = 0, 1, .., 3 の時までは不成立 */ /* i = 4 の時に、 10 < 16 = 4*4 となるので成立 */ break; /* その時に break 文が実行されるので while 文が終了する */ } i++; } i=0 i=1 i=2 i=3 i=4 !! i=5 から i=9 はでない ( j = 10 の時 ) j=10; for ( i = 0; i < 10; i++ ) { /* 10 回の繰返し */ printf ( "i = %d\n", i ); if ( j < i*i ) { break; /* 10 回未満で終了する事もある .. */ } } オセロゲーム盤 v1 : データ型を作り、それを出力する シンボル定数 EMPTY, WHITE, BLACK, BOARD_SIZE, etc.. ゲーム盤のデータ構造 Board の二次元配列の要素を一つもつ構造体 BInfo info[BOARD_SIZE][BOARD_SIZE]; main 初期状態 画面に出力する v2 : 出力の所で「コーディング」を導入した コーディング 内部の状態 ( Board の中身 ) と外部の状態 x -> ● o -> ○ . -> 空白 枠を付けた v3: 入力の部分の追加と、それに対応した表示の変化 「手(どこにどの色のコマをおくか?)」を キーボードから入力するようにした その結果を利用して、ボードの書き換えをする !! 入力にかんしてはコーディングはしなかった v4: 入力の正しさのチェックと 正しい時に、裏返しの自動化をしたい
なし