当日の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:
入力の正しさのチェックと
正しい時に、裏返しの自動化をしたい
なし