Powered by SmartDoc

ソフトウェア概論A/B (2014/09/26)
Ver. 1.0

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

目次

講義資料

当日の OHP 資料

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

サンプルファイル

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2014/09/26 sample-001.c
 */

/*
 *  printf の書式付き出力
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-001.c
 *		実行
 *			BASENAME
 */

#include <stdio.h>

/*
 *	main
 */

int main( int argc, char *argv[] )
{

	printf ( "書式は、混在させても出せる\n" );
	printf ( "%d, %f, %c, %s\n", 10, 2.3, 'x', "abc" );

	/* 文字と整数値の関係 */

	printf ( "「文字」は「小さな整数値(文字コード)」に対応\n" );
	printf ( "%c -> %d\n", 'x', 'x' );

	printf ( "「小さな整数値(文字コード)」は「文字」に対応\n" );
	printf ( "%d -> %c\n", 97, 97 );

		/*
		 * ASCII Code 表を参照 (http://e-words.jp/p/r-ascii.html)
		 */

	return 0;
}
sample-001.c の実行結果
C:\usr\c>sample-001
書式は、混在させても出せる
10, 2.300000, x, abc
「文字」は「小さな整数値(文字コード)」に対応
x -> 120
「小さな整数値(文字コード)」は「文字」に対応
97 -> a
C:\usr\c> 

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2014/09/26 sample-002.c
 */

/*
 *  printf の書式付き出力
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-002.c
 *		実行
 *			BASENAME
 */

#include <stdio.h>

/*
 *	main
 */

int main( int argc, char *argv[] )
{
	int i;

	printf ( "同じ値でも、書式が異れば、別の形で出力\n" );

	i = 0;
	printf ( "十進\t八進\t十六進\n" );
	while ( i < 20 ) {
		printf ( "%d\t\%o\t%x\n", i, i, i );
			/* 同じ数値をそれぞれ、十進(%d), 八進(%o), 十六進(%x)数の形で出力 */
		i++;
	}

	return 0;
}
sample-002.c の実行結果
C:\usr\c>sample-002
同じ値でも、書式が異れば、別の形で出力
十進	八進	十六進
0	0	0
1	1	1
2	2	2
3	3	3
4	4	4
5	5	5
6	6	6
7	7	7
8	10	8
9	11	9
10	12	a
11	13	b
12	14	c
13	15	d
14	16	e
15	17	f
16	20	10
17	21	11
18	22	12
19	23	13
C:\usr\c> 

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 2014/09/26 sample-003.c
 */

/*
 *  scanf の書式付き入力
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-003.c
 *		実行
 *			BASENAME
 */

#include <stdio.h>

/*
 *	main
 */

int main( int argc, char *argv[] )
{
	int d;		/* 10 進数の 12 を代入する */
	int o;		/* 8 進数の 12 を代入する */
	int x;		/* 16 進数の 12 を代入する */

	/*
	 * 整数値
	 */

	printf ( "12 を三回入力してください : " );

	scanf ( "%d", &d );
	scanf ( "%o", &o );
	scanf ( "%x", &x );
			/* キーボードからは三つの「12」を入力 */
			/* これを、それぞれ別の形式(%d,%o,%x)で解釈する */

	printf ( "一つ目は、10 進で %d, 8 進で %o, 16 進で %x です\n", d, d, d );
	printf ( "二つ目は、10 進で %d, 8 進で %o, 16 進で %x です\n", o, o, o );
	printf ( "三つ目は、10 進で %d, 8 進で %o, 16 進で %x です\n", x, x, x );

	return 0;
}
入力例
12
12
12
sample-003.c の実行結果
C:\usr\c>sample-003<  sample-003.in
12 を三回入力してください : 12

12
一つ目は、10 進で 12, 8 進で 14, 16 進で c です
二つ目は、10 進で 10, 8 進で 12, 16 進で a です
三つ目は、10 進で 18, 8 進で 22, 16 進で 12 です
C:\usr\c> 

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 2014/09/26 sample-004.c
 */

/*
 *  printf で書式を間違えると何がおきるのか
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-004.c
 *		実行
 *			BASENAME
 */

#include <stdio.h>

/*
 *	main
 */

int main( int argc, char *argv[] )
{
	int i = 123;			/* 整数値 */
	double d = 456.789;		/* 浮動小数点数 */

	/*
	 * 整数値を浮動小数点数値として出力
	 */

	printf ( "整数値 %d を浮動小数点数値として出力すると %lf になります。\n", i, i );

	/*
	 * 浮動小数点数を整数値として出力
	 */

	printf ( "浮動小数点数値 %lf を整数値として出力すると %d になります。\n", d, d );

	return 0;
}
sample-004.c の実行結果
C:\usr\c>sample-004
整数値 123 を浮動小数点数値として出力すると 0.000000 になります。
浮動小数点数値 456.789000 を整数値として出力すると -1099511628 になります。
C:\usr\c> 

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 2014/09/26 sample-005.c
 */

/*
 *  scanf の書式付き入力
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-005.c
 *		実行
 *			BASENAME
 */

#include <stdio.h>

/*
 *	main
 */

int main( int argc, char *argv[] )
{
	int i;
	double d;

	/*
	 * 整数値
	 */

	printf ( "整数値を入力してください : " );

	scanf ( "%d", &i );
			/* 整数型なので「%d」の書式を付ける */
			/* 変数 i の前に「&」を付ける(今回は「お呪い」考えてください)*/

	printf ( "整数値 %d が入力されました。\n", i );

	/*
	 * 浮動小数点数
	 */

	printf ( "浮動小数点値を入力してください : " );

	scanf ( "%lf", &d );
			/* 浮動小数点型なので「%lf」の書式を付ける */
			/* 変数 d の前に「&」を付ける(今回は「お呪い」考えてください)*/

	printf ( "浮動小数点値 %f が入力されました。\n", d );

	return 0;
}
入力例
789
123.456
sample-005.c の実行結果
C:\usr\c>sample-005<  sample-005.in
整数値を入力してください : 789
整数値 789 が入力されました。
浮動小数点値を入力してください : 123.456000
浮動小数点値 123.456000 が入力されました。
C:\usr\c> 

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 2014/09/26 sample-006.c
 */

/*
 *  scanf で対応を間違えると..
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-006.c
 *		実行
 *			BASENAME
 */

#include <stdio.h>

/*
 *	main
 */

int main( int argc, char *argv[] )
{
	int i;
	double d;

	/*
	 * 整数値
	 */

	printf ( "整数値を入力してください : " );

	scanf ( "%d", &i );
			/* 整数型なので「%d」の書式を付ける */
			/* 変数 i の前に「&」を付ける(今回は「お呪い」考えてください)*/

	printf ( "整数値 %d が入力されました。\n", i );

	/*
	 * 浮動小数点数
	 */

	printf ( "浮動小数点値を入力してください : " );

	scanf ( "%lf", &d );
			/* 浮動小数点型なので「%lf」の書式を付ける */
			/* 変数 d の前に「&」を付ける(今回は「お呪い」考えてください)*/

	printf ( "浮動小数点値 %f が入力されました。\n", d );

	return 0;
}
入力例
123.456
789
sample-006.c の実行結果
C:\usr\c> sample-002
整数値を入力してください : 123.456
整数値 123 が入力されました。
浮動小数点値を入力してください : 浮動小数点値 0.456000 が入力されました。
C:\usr\c> 

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * 2014/09/26 sample-007.c
 */

/*
 *  sscanf の書式付き入力
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-007.c
 *		実行
 *			BASENAME
 */

#include <stdio.h>

/*
 *	main
 */

int main( int argc, char *argv[] )
{
	int i;

	i = 9999;
		/* 確かに、文字列内からとりだせる事を確認するために最初に 0 で初期化 */

	sscanf ( "123", "%d", &i );
		/* 最初の引数の文字列の中から整数値 「123」が取り出せる */

	printf ( "整数値 %d が文字列の中から取り出せました。\n", i );

		/* 数字でない文字が含まれていると.. */

	i = 9999;
	sscanf ( "a123", "%d", &i );
	printf ( "整数値 %d が文字列の中から取り出せました。\n", i );

		/* 期待した形にならない.. */

		/* 書式で、不要な情報はスキップできる */

	i = 9999;
	sscanf ( "a123", "a%d", &i );
          /*  ^       ^ 注目 */
	printf ( "整数値 %d が文字列の中から取り出せました。\n", i );

		/* 書式にマッチしないと上手くゆかない */

	i = 9999;
	sscanf ( "b123", "a%d", &i );
          /*  ^       ^ 注目 */
	printf ( "整数値 %d が文字列の中から取り出せました。\n", i );

	return 0;
}
入力例
123
sample-007.c の実行結果
C:\usr\c>sample-007<  sample-007.in
整数値 123 が文字列の中から取り出せました。
整数値 9999 が文字列の中から取り出せました。
整数値 123 が文字列の中から取り出せました。
整数値 9999 が文字列の中から取り出せました。
C:\usr\c> 

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 2014/09/26 sample-008.c
 */

/*
 *	ファイルへの I/O (入力 : fscanf)
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-008.c
 *		実行
 *			BASENAME
 *
 *	あらかじめ、整数値が一つ入った "input.txt" を作成してから実行する
 */

#include <stdio.h>

/*
 *	main
 */

int main( int argc, char *argv[] )
{
	FILE *fp;		/* ファイルポインターを收める */
					/* 「FILE *」型なのだが、この詳細は今回は説明しない */
	int v;			/* ファイルから整数値を取り出し、この変数にいれる */

	fp = fopen ( "input.txt", "r" );
			/* ファイル "input.txt" を、読込みの為 ("r") に開く */

	if ( fp != NULL ) {	/* fp が NULL でなければ、open 成功 */

		fscanf ( fp, "%d", &v );	/* fscanf で fp から整数値を取り出す */		

		printf ( "ファイル中の整数値は %d でした。\n", v );

		fclose ( fp );				/* open に成功した場合は最後に必ず close */

	} else {			/* fp が NULL なら open は失敗 */
		printf ( "ファイル(input.txt)の open に失敗しました。\n" );
			/* 失敗した場合は、それが解るように報告する */
	}

	return 0;
}
入力例
123
456.789
sample-008.c の実行結果
C:\usr\c>sample-008<  sample-008.in
ファイル(input.txt)の open に失敗しました。
C:\usr\c> 

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 2014/09/26 sample-009.c
 */

/*
 *	ファイルへの I/O (入力 : fprintf )
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-009.c
 *		実行
 *			BASENAME
 *
 */

#include <stdio.h>

/*
 *	main
 */

int main( int argc, char *argv[] )
{
	FILE *fp;		/* ファイルポインターを收める */
					/* 「FILE *」型なのだが、この詳細は今回は説明しない */
	int v = 123;	/* ファイルに保存する整数値 */

	fp = fopen ( "output.txt", "w" );
			/* ファイル "output.txt" を、書出しの為 ("w") に開く */

	if ( fp != NULL ) {	/* fp が NULL でなければ、open 成功 */

		fprintf ( fp, "%d\n", v );	/* fprintf で fp から整数値を書き出す */		

		fclose ( fp );				/* open に成功した場合は最後に必ず close */

	} else {			/* fp が NULL なら open は失敗 */
		printf ( "ファイル(output.txt)の open に失敗しました。\n" );
			/* 失敗した場合は、それが解るように報告する */
	}

	return 0;
}
sample-009.c の実行結果
C:\usr\c>sample-009
C:\usr\c> 

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 2014/09/26 sample-010.c
 */

/*
 *	平面上の点を扱う
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-010.c -lm
 *		実行
 *			BASENAME
 *
 */

#include <stdio.h>
#include <math.h>		/* sqrt を利用するので必要 (-lm も忘れずに ) */

/*
 * void print_point ( double px, double py )
 * 		「点」を表示する
 *		double px -- 「点」の x 座標
 *		double py -- 「点」の y 座標
 */

void print_point ( double px, double py )		{

	 printf ( "( %f, %f )", px, py );
}


/*
 * double point_distance ( double p1x, double p1y, double p2x, double p2y )
 * 		ニ「点」間の距離を返す
 *		double p1x -- 「始点」の x 座標
 *		double p1y -- 「始点」の y 座標
 *		double p2x -- 「終点」の x 座標
 *		double p2y -- 「終点」の y 座標
 */

double point_distance ( double p1x, double p1y, double p2x, double p2y ) {
	   double dx = p2x - p1x;	/* x 座標の差 */
	   double dy = p2y - p1y;	/* y 座標の差 */

	   return sqrt ( dx*dx + dy*dy );
}

/*
 *	main
 */

int main( int argc, char *argv[] )
{
	double p1x = 1.0;	/* p1 = ( 1.0, 2.0 ) */
	double p1y = 2.0;
	double p2x = 4.0;	/* p2 = ( 4.0, 6.0 ) */
	double p2y = 6.0;

	printf ( "始点 " );
	print_point ( p1x, p1y );
	printf ( " と終点 " );
	print_point ( p2x, p2y );
	printf ( " との距離は %f です。\n", point_distance ( p1x, p1y, p2x, p2y ) );

	return 0;
}
sample-010.c の実行結果
C:\usr\c>sample-010
始点 ( 1.000000, 2.000000 ) と終点 ( 4.000000, 6.000000 ) との距離は \
    5.000000 です。
C:\usr\c> 

Download : sample-011.c ( SJIS 版 )

sample-011.c
/*
 * 2014/09/26 sample-011.c
 */

/*
 *	平面上の点の操作
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-011.c
 *		実行
 *			BASENAME
 *
 */

#include <stdio.h>
#include <math.h>		/* sqrt を利用するので必要 (-lm も忘れずに ) */

/*
 * void print_point ( double px, double py )
 * 		「点」を表示する
 *		double px -- 「点」の x 座標
 *		double py -- 「点」の y 座標
 */

void print_point ( double px, double py )		{

	 printf ( "( %f, %f )", px, py );
}

/*
 * void mirror_x_point ( double py )
 * 		x 軸に対し線対称の「点」の y 座標を求める
 *		double py -- 「点」の y 座標
 */

double mirror_x_point ( double py )		{

	return - py;
}

/*
 * void mirror_y_point ( double px )
 * 		y 軸に対し線対称の「点」の x 座標を求める
 *		double px -- 「点」の x 座標
 */

double mirror_y_point ( double px )		{

	return - px;
}

/*
 *	main
 */

int main( int argc, char *argv[] )
{
	double p1x = 1.0;	/* p1 = ( 1.0, 2.0 ) */
	double p1y = 2.0;
	double p2x;
	double p2y;

			/* x 軸に対して線対象 */

	printf ( "点 " );
	print_point ( p1x, p1y );
	printf ( " と x 軸に対して線対称な点は " );

	p2x = p1x;						/* x 座標は変らない */
	p2y = mirror_x_point ( p1y );	/* y 座標のみ計算 */

	print_point ( p2x, p2y );
	printf ( " となります。\n" );

			/* y 軸に線対象 */

	printf ( "点 " );
	print_point ( p1x, p1y );
	printf ( " と y 軸に対して線対称な点は " );

	p2x = mirror_x_point ( p1x );	/* x 座標のみ計算 */
	p2y = p1y;						/* y 座標は変らない */

	print_point ( p2x, p2y );
	printf ( " となります。\n" );

	return 0;
}
sample-011.c の実行結果
C:\usr\c>sample-011
点 ( 1.000000, 2.000000 ) と x 軸に対して線対称な点は ( 1.000000, -2.000000 ) \
    となります。
点 ( 1.000000, 2.000000 ) と y 軸に対して線対称な点は ( -1.000000, 2.000000 ) \
    となります。
C:\usr\c> 

Download : sample-012.c ( SJIS 版 )

sample-012.c
/*
 * 2014/09/26 sample-012.c
 */

/*
 *	平面上の点の操作
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-012.c
 *		実行
 *			BASENAME
 *
 */

#include <stdio.h>

/*
 * void print_point ( double px, double py )
 * 		「点」を表示する
 *		double px -- 「点」の x 座標
 *		double py -- 「点」の y 座標
 */

void print_point ( double px, double py )		{

	 printf ( "( %lf, %lf )", px, py );
}

/*
 * void mirror_o_point_x ( double px )
 * 		原点に対し点対称の「点」の x 座標を求める
 *		double px -- 「点」の x 座標
 */

double mirror_o_point_x ( double px )		{

	return - px;
}

/*
 * void mirror_o_point_y ( double py )
 * 		原点に対し点対称の「点」の y 座標を求める
 *		double py -- 「点」の y 座標
 */

double mirror_o_point_y ( double py )		{

	return - py;
}

/*
 *	main
 */

int main( int argc, char *argv[] )
{
	double p1x = 1.0;	/* p1 = ( 1.0, 2.0 ) */
	double p1y = 2.0;
	double p2x;
	double p2y;

			/* 原点に点対象 */

	printf ( "点 " );
	print_point ( p1x, p1y );
	printf ( " と原点に対して点線対称な点は " );

		/* x と y の処理を別々に行う.. */
	p2x = mirror_o_point_x ( p1x );
	p2y = mirror_o_point_y ( p1y );

	print_point ( p2x, p2y );
	printf ( " となります。\n" );

	return 0;
}
sample-012.c の実行結果
C:\usr\c>sample-012
点 ( 1.000000, 2.000000 ) と原点に対して点線対称な点は ( -1.000000, -2.000000 ) \
    となります。
C:\usr\c> 

Download : sample-013.c ( SJIS 版 )

sample-013.c
/*
 * 2014/09/26 sample-013.c
 */

/*
 *	平面上の点の操作
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-013.c
 *		実行
 *			BASENAME
 *
 */

#include <stdio.h>
#include <math.h>		/* sqrt を利用するので必要 (-lm も忘れずに ) */

/*
 * void print_point ( double px, double py )
 * 		「点」を表示する
 *		double px -- 「点」の x 座標
 *		double py -- 「点」の y 座標
 */

void print_point ( double px, double py )		{

	 printf ( "( %f, %f )", px, py );
}

/*
 * void mirror_x_point ( double py )
 * 		x 軸に対し線対称の「点」の y 座標を求める
 *		double py -- 「点」の y 座標
 */

double mirror_x_point ( double py )		{

	return - py;
}

/*
 * void mirror_y_point ( double px )
 * 		y 軸に対し線対称の「点」の x 座標を求める
 *		double px -- 「点」の x 座標
 */

double mirror_y_point ( double px )		{

	return - px;
}

/*
 *	main
 */

int main( int argc, char *argv[] )
{
	double p1x = 1.0;	/* p1 = ( 1.0, 2.0 ) */
	double p1y = 2.0;
	double p2x;
	double p2y;

			/* x 軸に対して線対象 */

	printf ( "点 " );
	print_point ( p1x, p1y );
	printf ( " と x 軸に対して線対称な点は " );

	p2x = p1x;						/* x 座標は変らない */
	p2y = mirror_x_point ( p1y );	/* y 座標のみ計算 */

	print_point ( p2x, p2y );
	printf ( " となります。\n" );

			/* y 軸に線対象 */

	printf ( "点 " );
	print_point ( p1x, p1y );
	printf ( " と y 軸に対して線対称な点は " );

	p2x = mirror_x_point ( p1x );	/* x 座標のみ計算 */
	p2y = p1y;						/* y 座標は変らない */

	print_point ( p2x, p2y );
	printf ( " となります。\n" );

	return 0;
}
sample-013.c の実行結果
C:\usr\c>sample-013
点 ( 1.000000, 2.000000 ) と x 軸に対して線対称な点は ( 1.000000, -2.000000 ) \
    となります。
点 ( 1.000000, 2.000000 ) と y 軸に対して線対称な点は ( -1.000000, 2.000000 ) \
    となります。
C:\usr\c> 

Download : sample-014.c ( SJIS 版 )

sample-014.c
/*
 * 2014/09/26 sample-014.c
 */

/*
 *	平面上の点を扱う
 *
 * 利用方法
 *		コンパイル
 *			cc -Ic:\usr\c\include -o BASENAME.exe sample-014.c -lm
 *		実行
 *			BASENAME
 *
 */

#include <stdio.h>
#include <math.h>		/* sqrt を利用するので必要 (-lm も忘れずに ) */

/*
 * 新しい「型」 Point を作成する
 */

typedef struct {		/* 「型」を作る = typedef */
	double x;			/* 新しい型は「構造体」= struct */
	double y;			/* 中身は double が二つで個々の名前は x と y */
} Point;				/* 新しい型の名前は Point */

/*
 * void print_point ( Point pt )
 * 		「点」を表示する
 *		Point pt;「点」
 */

void print_point ( Point pt ) {
		/*
		 * Point 型の pt は x 成分と y 成分の二つからなる
		 * pt の x 成分は pt.x で表現できる(double 型変数と同じように扱える)
		 */

	 printf ( "( %f, %f )", pt.x, pt.y );
}


/*
 * double point_distance ( Point p1, Point p2 )
 * 		ニ「点」間の距離を返す
 *		Point p1; 始点
 *		Point p2; 終点
 */

double point_distance ( Point p1, Point p2 ) {
	   double dx = p2.x - p1.x;	/* x 座標の差 */
	   double dy = p2.y - p1.y;	/* y 座標の差 */

	   return sqrt ( dx*dx + dy*dy );
}

/*
 *	main
 */

int main( int argc, char *argv[] )
{
	Point p1 = { 1.0, 2.0 };	/* 「点」 p1 の宣言 */
	Point p2 = { 4.0, 6.0 };	/* 「点」 p2 の宣言 */

	printf ( "始点 " );
	print_point ( p1 );
	printf ( " と終点 " );
	print_point ( p2 );
	printf ( " との距離は %f です。\n", point_distance ( p1, p2 ) );

	return 0;
}
sample-014.c の実行結果
C:\usr\c>sample-014
始点 ( 1.000000, 2.000000 ) と終点 ( 4.000000, 6.000000 ) との距離は \
    5.000000 です。
C:\usr\c> 

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

本日の課題

課題プログラム内の「/*名前:ここ*/」の部分を書き換えたり、「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。

なお「名前(P,Q,R,..)」の部分が同じ所には同じものが入ります。

課題 20140926-01 : sscanf による文字列から情報の取出し

Download : 20140926-01.c ( SJIS 版 )

20140926-01.c
/*
 * 課題 CNAME-01
 *
 * 20140926 CNAME-01-QQQQ.c
 *
 *	sscanf による文字列から情報の取出し
 */

#include <stdio.h>

/*
 * void parse ( char *text )
 *	sscanf で文字列から数値を取り出す
 *
 *	char *text : 数を含む文字列
 *		text は "int 整数値, double 浮動小数点数" の形式になっている必要がある
 *			例 "int 123, double 123.456"
 */

void parse ( char *text ) {
	 int iv;
	 double dv;


	/*
	**	 この部分を完成させなさい
	*/


	 printf ( "int value = %d, double value = %f\n", iv, dv );

}

/*
 *	main
 */

int main( int argc, char *argv[] )
{

	parse ( "int 123, double 123.456" );
	parse ( "int -987, double 0.00789" );

	return 0;
}
20140926-01.c の実行結果
C:\usr\c\> 20140926-01-QQQQ
int value = 123, double value = 123.456000
int value = -987, double value = 0.007890
C:\usr\c\> 

課題 20140926-02 : fopen/fclose/fprintf によるファイルの書出し

Download : 20140926-02.c ( SJIS 版 )

20140926-02.c
/*
 * 課題 CNAME-02
 *
 * 20140926 20140926-02-QQQQ.c
 *
 *	fopen/fclose/fprintf によるファイルの書出し
 *
 */

#include <stdio.h>

/*
 *
 */

/*
 *	main
 */

int main( int argc, char *argv[] )
{
	FILE	*fp;	/* ファイルポインター */
	int		input;	/* 入力される整数値 */
	int		number; /* 何番目のデータか */


	/*
	**	 この部分を完成させなさい
	*/

			/* ファイル "outfile-02.txt" を出力モードでオープン */
			/* 元々なければ新規に作成されるが元々あると上書きされ、元の内容は失われる */

	if ( fp != NULL ) {	/* オープンに成功 (失敗すると NULL になる) したら */

		number = 1;
		printf ( "No. %d : 正の整数を入力してください : ", number );
		scanf ( "%d", &input );		/* 整数値の入力 */

		while ( input > 0 )	{		/* 入力される整数値が正の間 */

	/*
	**	 この部分を完成させなさい
	*/

									/* 入力データをファイルに書き出す */
			number++;				/* number を一増やす */
			printf ( "No. %d : 正の整数を入力してください : ", number );
			scanf ( "%d", &input );		/* 整数値の入力 */
		}
				/* 負の数が入力された */


	/*
	**	 この部分を完成させなさい
	*/

									/* ファイルをクローズ */
									/* オープンしたら必ず閉じる !! */

	} else {	/* ファイルのオープンに失敗した */
		printf ( "ファイルのオープンに失敗しました\n" );
				/* エラーメッセージに出力 */
	}

	return 0;
}
入力例
10
123
999
-1
20140926-02.c の実行結果
C:\usr\c\> 20140926-02-QQQQ
No. 1 : 正の整数を入力してください : 10
No. 2 : 正の整数を入力してください : 123
No. 3 : 正の整数を入力してください : 999
No. 4 : 正の整数を入力してください : -1
C:\usr\c\> 
ファイル出力結果(outfile-02.txt)
1, 10
2, 123
3, 999

課題 20140926-03 : 3 次元ベクトルの差

Download : 20140926-03.c ( SJIS 版 )

20140926-03.c
/*
 * 課題 CNAME-03
 *
 * 20140926 20140926-03-QQQQ.c
 *
 *	3 次元ベクトル
 *
 */

#include <stdio.h>

/*
 *	3 次元ベクトル
 */

typedef struct {	/* 3 次元ベクトル */
	double x;		/* x 要素 */
	double y;		/* y 要素 */
	double z;		/* z 要素 */
} Vector3D;			/* 新しい型 : Vector3D */

/*
 * void print_Vector3D ( Vector3D v )
 *		ベクトルの内容を書き出す
 *		Vector3D v;		書き出すベクトル
 */	

void print_Vector3D ( Vector3D v ) {

	printf ( "  %f\n", v.x );		/* v の x 要素の出力 */
	printf ( "( %f  )\n", v.y );	/* v の y 要素の出力 */
	printf ( "  %f\n", v.z );		/* v の z 要素の出力 */

	/* TeX で表現するならば、
		printf ( "\\left(\\begin{array}{c} %f \\\\ %f \\\ %f \
    \\end{array}\\right)\n", v.x, v.y, v.z );
	   などととすればよい。
	*/
}

/*
 * Vector3D sub_Vector3D ( Vector3D dst, Vector3D src )
 *		二つのベクトルの差を計算する
 *		Vector3D dst;		引かれるベクトル
 *		Vector3D src;		引くベクトル
 *		帰り値				二つのベクトルの差となるベクトル
 */

Vector3D sub_Vector3D ( Vector3D dst, Vector3D src ) {
	Vector3D result;				/* 計算結果(差)を收める変数 */


	/*
	**	 この部分を完成させなさい
	*/

						/* x 成分の計算 */

	result.y = dst.y - src.y;
				 		/* y 成分の計算 */


	/*
	**	 この部分を完成させなさい
	*/

				 		/* z 成分の計算 */

	return result;					/* 計算した結果を値として返す */
}

/*
 *	main
 */

int main( int argc, char *argv[] )
{
	Vector3D dst;
	Vector3D src;

	dst.x = 1.2;	/*         1.2		*/
	dst.y = 2.3;	/* dst = ( 2.3 )	*/
	dst.z = 3.4;	/*         3.4		*/

	src.x = -9.8;	/*         -9.8		*/
	src.y = 8.7;	/* dst = (  8.7 )	*/
	src.z = 0.0;	/*          0.0		*/

	print_Vector3D ( dst );		/* dst の出力 */
	printf ( "と\n" );
	print_Vector3D ( src );		/* src の出力 */
	printf ( "の差は\n" );
	print_Vector3D ( sub_Vector3D ( dst, src ) );
	printf ( "となります。\n" );

	return 0;
}
入力例
123
456.789
20140926-03.c の実行結果
C:\usr\c\> 20140926-03-QQQQ
  1.200000
( 2.300000  )
  3.400000
と
  -9.800000
( 8.700000  )
  0.000000
の差は
  11.000000
( -6.400000  )
  3.400000
となります。
C:\usr\c\> 

Links

書式指定