Powered by SmartDoc

ソフトウェア概論B (2011/11/11)
Ver. 1.0

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

目次

おしらせ

講義資料

当日の OHP 資料

当日のOHP資料です。

追加ファイル

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

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2011/11/11 sample-001.c
 */

/*
 *
 */

#include <stdio.h>
#include "s_print.h"
#include "s_input.h"

/*
 *	データ型(平面上の点)を表す型(Point2D)の定義
 */

typedef struct {
  int x;		/* x 座標 */
  int y;		/* y 座標 */
} Point2D;		/* 新しい型 Point2D の定義 */

/*
 *	入力 (Input)
 * キーボードから「点」を「座標の形」で入力してもらる
 */

Point2D	input_Point2D() {
	Point2D result;

	s_print_string ( "x=" );	/* x 座標の入力 */
	result.x = s_input_int();

	s_print_string ( "y=" );	/* y 座標の入力 */
	result.y = s_input_int();

	return result;				/* 入力した結果を返す */
}

/*
 *	出力 (Output)
 *		「点」を、画面に出力する ( 座標の形で.. )
 */

void	output_Point2D( Point2D pt ) {

	s_print_string ( "( " );
	s_print_int ( pt.x );
	s_print_string ( ", " );
	s_print_int ( pt.y );
	s_print_string ( " )" );

}

/*
 *	move_x_Point2D
 *	x 方向の移動: 点 pt を x 軸方向に dx だけ平行移動する関数
 */

Point2D	move_x_Point2D( Point2D pt, int dx ) {

  pt.x += dx;	/* 点 pt の x 座標だけを dx だけ増やす */
				/* pt.x は pt の x の部分 */
		/*
			「pt.x += dx」は「pt.x = pt.x + dx」 の省略形
			( cf. x++ ⇔ x += 1 ⇔ x = x + 1 )
		*/

		/* pt が (2,4)で dx が 3 だったら
		   この代入文で (2,5) になる */

  return pt;	/* この計算した (座標) を結果として返す */

  /*
	Point2D	result;		// 結果の値を入れる変数

  result.x = pt.x + dx;	// 新しい x 座標は、元の座標+移動距離
  result.y = pt.y;		// 新しい y 座標は、元と同じ

  return result;		// 新しい座標を結果として返す

   */

}

/*
 *	y 方向の移動
 */

Point2D	mopte_y_Point2D( Point2D pt, int dy ) {

	pt.y += dy;

	return pt;
}

/*
 *	90 度回転
 */

Point2D	rotate_Point2D( Point2D pt ) {
  Point2D result;	/* 90 回転した結果を入れる */
	  /*
		(x,y) -> (y,-x)
	  */

	result.x = - pt.y;	/* 新しい x 座標は、元の y 座標の符号をかえたもの */
	result.y = pt.x;	/* 新しい y 座標は、元の x 座標 */

	return result;		/* 結果を返す */
}

/*
 *
 */

int main ( void ) {
	Point2D pt;
	Point2D pt2;
	int c;

	s_print_string ( "一つ目の点の座標をいれてください。\n" );
	pt = input_Point2D();

	output_Point2D( pt );
	s_print_string ( "が入力されました。\n" );

	s_print_string ( "x 軸方向の移動量をいれてください\n" );
	c = s_input_int();
	s_print_int ( c );
	s_print_string ( "だけ x 軸方向に移動します。\n" );

	pt2 = move_x_Point2D ( pt, c );
	output_Point2D( pt2 );
	s_print_string ( " になりました\n" );

	s_print_string ( " 90 度回転した結果は " );
	output_Point2D( rotate_Point2D ( pt ) );
	s_print_string ( " となります\n" );

	return 0;
}

/*
 *
 */
入力例
2 3
4
sample-001.c の実行結果
C:\usr\c\> sample-001<  sample-001.in
一つ目の点の座標をいれてください。
x=2
y=3
( 2, 3 )が入力されました。
x 軸方向の移動量をいれてください
4
4だけ x 軸方向に移動します。
( 6, 3 ) になりました
 90 度回転した結果は ( -3, 2 ) となります
C:\usr\c\> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2011/11/11 sample-002.c
 */

/*
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include "s_print.h"
#include "s_input.h"

/*
 *	有理数(分数)を表す型(Rational)の定義
 */

typedef struct {
  int bunbo;		/* 分母 (自然数 > 0) */
  int bunshi;		/* 分子 (整数)*/
} Rational;		/* 新しい型 Rational の定義 */

int iabs ( int v ) {
  if ( v < 0 ) {
	v = -v;
  }

  return v;
}

int gcm ( int m, int n ) {

  if ( n == 0 ) {
	return m;
  } else {
	return gcm ( n, m % n );
  }
}

Rational normalize_Rational ( Rational r ) {
  int g;	/* 分母、分子の共通因数 */

  if ( r.bunbo == 0 ) {		/* 有理数としては表現不可 */
	s_print_string ( "分母が 0 なので、終了します\n" );
	exit ( -1 ); /* プログラムを終了する。その時 error code -11 とする */
  }

  if ( r.bunbo < 0 ) {	/* -2/-4 -> 2/4 */
	r.bunbo = - r.bunbo;
	r.bunshi = - r.bunshi;
  }

  /* 約分をする */
  g = gcm ( r.bunbo, iabs ( r.bunshi ) );

  r.bunbo /= g;		/* r.bunbo =  r.bunbo / g */
  r.bunshi /= g;

  return r;
}

/*
	0 (整数値)は、<1,0> (分母が 1 となる) 形にする
/*
 *	入力 (Input)
 * キーボードから「点」を「座標の形」で入力してもらる
 */

Rational	input_Rational() {
	Rational result;

	s_print_string ( "分子=" );	/* 分子の入力 */
	result.bunshi = s_input_int();

	s_print_string ( "分母=" );	/* 分母の入力 */
	result.bunbo = s_input_int();

	return normalize_Rational ( result );		/* 入力した結果を正規化して返す */	
}

/*
 *	出力 (Output)
 *		「有理数」を、画面に出力する ( 分数の形で.. )
 */

void	output_Rational( Rational r ) {

  s_print_int ( r.bunshi );

  if ( r.bunbo > 1 ) {
	s_print_string ( " / " );
	s_print_int ( r.bunbo );
  }

}

/*
 *	multiply_Rational : 有理数のかけ算
 */

Rational multiply_Rational ( Rational a, Rational b ) {
  Rational result;

  result.bunshi = a.bunshi * b.bunshi;
  result.bunbo = a.bunbo * b.bunbo;
  
  return normalize_Rational ( result );	/* 約分の問題も解決 */
}

/*
 *
 */

int main ( void ) {
	Rational r;
	Rational s;

	s_print_string ( "一つ目の有理数をいれてください。\n" );
	r = input_Rational();

	output_Rational( r );
	s_print_string ( "が入力されました。\n" );

	s_print_string ( "二つ目の有理数をいれてください。\n" );
	s = input_Rational();

	output_Rational( r );
	s_print_string ( " と " );
	output_Rational( s );
	s_print_string ( " の積は " );
	output_Rational( multiply_Rational ( r, s ) );
	s_print_string ( " となります。\n" );

	return 0;
}

/*
 *
 */
入力例
1
2
2
3
sample-002.c の実行結果
C:\usr\c\> sample-002<  sample-002.in
一つ目の有理数をいれてください。
分子=1
分母=2
1 / 2が入力されました。
二つ目の有理数をいれてください。
分子=2
分母=3
1 / 2 と 2 / 3 の積は 1 / 3 となります。
C:\usr\c\> 

本日の課題

課題 20111111-01

Download : 20111111-01.c ( SJIS 版 )

20111111-01.c
/*
 * 20111111-1-QQQQ.c
 */

#include <stdio.h>
#include "s_print.h"
#include "s_input.h"

/*
 * データ型 : Vector2D の定義
 */

typedef struct {
	int x;			/* x 成分 */
	int y;			/* y 成分 */
} Vector2D;

/*
typedef struct {
	int length;		// 長さ
	int angle;		// 角度
} Vector2D;			// 極座標表現

	|   v
	|  /
	| / 長さ
	|/    角度
----+---------
 */

/*
 *	入力 (Input)
 */

Vector2D	input_Vector2D() {
	Vector2D result;

	s_print_string ( "x=" );
	result.x = s_input_int();


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


	return result;
}

/*
 *	出力 (Output)
 */

void	output_Vector2D( Vector2D v ) {

	s_print_string ( "( " );
	s_print_int ( v.x );
	s_print_string ( ", " );

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

	s_print_string ( " )" );

}

/*
 *	定数倍
 */

Vector2D	scale_Vector2D( int c, Vector2D v ) {

	v.x *= c;		/* v.x = v.x * c の事 */

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


	return v;
}

/*
 *	和
 */

Vector2D	add_Vector2D( Vector2D v, Vector2D w ) {
	Vector2D result;

	result.x = v.x + w.x;

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


	return result;
}

/*
 *
 */

int main ( void ) {
	Vector2D v;
	Vector2D w;
	Vector2D r;
	int c;

	s_print_string ( "一つ目のベクトルをいれてください。\n" );
	v = input_Vector2D();

	output_Vector2D( v );
	s_print_string ( "が入力されました。\n" );

	s_print_string ( "拡大サイズをいれてください\n" );
	c = s_input_int();
	s_print_int ( c );
	s_print_string ( " 倍します\n" );

	r = scale_Vector2D ( c, v );
	s_print_string ( "結果は \n" );
	output_Vector2D( r );
	s_print_string ( " です。\n" );

	s_print_string ( "二つ目のベクトルをいれてください。\n" );
	w = input_Vector2D();

	output_Vector2D( v );
	s_print_string ( " と " );
	output_Vector2D( w );
	s_print_string ( " の和は " );
	output_Vector2D( add_Vector2D ( v, w ) );
	s_print_string ( " となります\n" );

	return 0;
}

/*
 *
 */
入力例
3
4
2
-2
9
20111111-01.c の実行結果
C:\usr\c\> 01<  01.in
一つ目のベクトルをいれてください。
x=3
y=4
( 3, 4 )が入力されました。
拡大サイズをいれてください
2
2 倍します
結果は 
( 6, 8 ) です。
二つ目のベクトルをいれてください。
x=-2
y=9
( 3, 4 ) と ( -2, 9 ) の和は ( 1, 13 ) となります
C:\usr\c\> 

Links