Powered by SmartDoc

ソフトウェア概論A/B (2013/10/25)
Ver. 1.0

2013年10月25日
栗野 俊一
kurino@math.cst.nihon-u.ac.jp
http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/2013/soft/soft.html
ソフトウェア概論 A/B2013年10月25日 の資料

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

講義で利用するサンプルプログラム

サンプルファイル

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 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;
}
sample-001.c の実行結果
C:\usr\c>sample-001
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
C:\usr\c> 

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 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;
}
sample-002.c の実行結果
C:\usr\c>sample-002
■■■■■■■
■■■■■■■
■■■■■■■
■■■■■■■
■■■■■■■
■■■■■■■
■■■■■■■
C:\usr\c> 

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 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;
}
sample-003.c の実行結果
C:\usr\c>sample-003
■■■■■■
■■■■■■
■■■■■■
■■■■■■
■■■■■■
■■■■■■
C:\usr\c> 

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 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;
}
sample-004.c の実行結果
C:\usr\c>sample-004
■■■■■■
■■■■■■
■■■■■■
■■■■■■
■■■■■■
■■■■■■
■■■■■■
■■■■■■
C:\usr\c> 

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 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;
}
sample-005.c の実行結果
C:\usr\c>sample-005
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
■■■■■■■■
C:\usr\c> 

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 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;
}
sample-006.c の実行結果
C:\usr\c>sample-006
■■■■■■
■■■■■■
■■■■■■
■■■■■■
■■■■■■
■■■■■■
■■■■■■
■■■■■■
C:\usr\c> 

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * 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;
}
sample-007.c の実行結果
C:\usr\c>sample-007
a = 2
sum of a = 2
a = -2
C:\usr\c> 

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 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;
}
sample-008.c の実行結果
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 版 )

sample-009.c
/*
 * 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;
}
sample-009.c の実行結果
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 版 )

sample-010.c
/*
 * 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;
}
sample-010.c の実行結果
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 版 )

sample-011.c
/*
 * 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;
}
sample-011.c の実行結果
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 版 )

sample-012.c
/*
 * 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;
}
sample-012.c の実行結果
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 版 )

sample-013.c
/*
 * 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;
}
sample-013.c の実行結果
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 版 )

sample-014.c
/*
 * 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;
}
sample-014.c の実行結果
C:\usr\c>sample-014
おめでとう。
おめでとう。
おめでとう。
C:\usr\c> 

Download : sample-015.c ( SJIS 版 )

sample-015.c
/*
 * 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;
}
sample-015.c の実行結果
C:\usr\c>sample-015
おめでとう。
おめでとう。
おめでとう。
C:\usr\c> 

Download : sample-016.c ( SJIS 版 )

sample-016.c
/*
 * 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;
}
sample-016.c の実行結果
C:\usr\c>sample-016
おめでとう。
おめでとう。
おめでとう。
C:\usr\c> 

Download : sample-017.c ( SJIS 版 )

sample-017.c
/*
 * 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;
}
sample-017.c の実行結果
C:\usr\c>sample-017
おめでとう。
おめでとう。
おめでとう。
C:\usr\c> 

Download : sample-018.c ( SJIS 版 )

sample-018.c
/*
 * 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;
}
sample-018.c の実行結果
C:\usr\c>sample-018
おめでとう。
おめでとう。
おめでとう。
C:\usr\c> 

Download : sample-019.c ( SJIS 版 )

sample-019.c
/*
 * 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;
}
sample-019.c の実行結果
C:\usr\c>sample-019
data[2] = 4
data[4] = 2
data[7] = 10
C:\usr\c> 

Download : sample-020.c ( SJIS 版 )

sample-020.c
/*
 * 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;
}
sample-020.c の実行結果
C:\usr\c>sample-020
data[2] = 4
C:\usr\c> 

講議中に作成したプログラム

本日の課題

なし

Links