Powered by SmartDoc

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

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

目次

講義資料

当日の OHP 資料

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

サンプルファイル

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2014/12/05 sample-001.c
 */

/*
 *
 */

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

/*
 *
 */

#define	EOS	'\0'

/*
 * 複数の整数を書式指定して文字列の中に埋め込む
 */

void print_with_format ( char *msg, ... ) {
  int i;
  char *pvalue = (char *)&msg + sizeof( char * );

  for ( i = 0; msg[i] != EOS; i++ ) {
	if ( msg[i] == '%' ) {		/* 文字列の中に '%' があったら特別処理する */
	  i++; 						/* 次の文字をみる */
	  switch ( msg[i] ) {
	  case 'd':					/* 10 進数 */
		s_print_int ( *((int *)pvalue) );			// s_print_int ( *pvalue++ );
		pvalue += sizeof ( int );
		break;
	  case 'o':					/* 8 進数 */
		s_print_int ( *((int *)pvalue) );
		pvalue += sizeof ( int );
		break;
	  case 'x':					/* 16 進数 */
		s_print_int ( *((int *)pvalue) );
		pvalue += sizeof ( int );
		break;
	  case 'c':					/* 文字 */
		s_print_char ( *((char *)pvalue) );
		pvalue += sizeof ( int );	/* char は自動的に int にされる */
		break;
	  case 's':					/* 文字列 */
		s_print_string ( *((char **)pvalue) );
		pvalue += sizeof ( char * );
		break;
	  case 'f':					/* 浮動小数点数 */
		s_print_double ( *((double *)pvalue) );
		pvalue += sizeof ( double );
		break;
	  case '%':					/* '%' が重なったら.. */
		s_print_char ( '%' );	/* '%' を出力 */
		break;
	  default:					/* その他 : よくわからないので読み飛ばす.. */
		  break;
	  }
	} else {	/* そうでなけれ .. */
	  s_print_char ( msg[i] );	/* そのままその文字を出力 */
	}
  }
}

/*
 * 色々な数値の出力
 */

int main ( void ) {

  /*
   * データの出力 (Output)
   */

  print_with_format ( 
					 "整数値(%%d) : %d, 文字(%%c) : '%c', 文字列(%%s) : \"%s\", 浮動小数点数(%%f) : \
    %f\n",
					 123, (int)'a', "xyz", 1.23 );

  /*
   * 
   */

  return 0;
}

/*
 *
 */
sample-001.c の実行結果
C:\usr\c>sample-001
整数値(%d) : 123, 文字(%c) : 'a', 文字列(%s) : "xyz", 浮動小数点数(%f) : \
    1.230000
C:\usr\c> 

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

本日の課題

課題 20141212-01 : ポインターを利用して、整数変数の値を正値にする

Download : 20141212-01.c ( SJIS 版 )

20141212-01.c
/*
 * 20141212-01-QQQQ.c
 * ポインターを利用して、整数変数の値を正値にする
 */

#include <stdio.h>

/*
 *	to_positive_int_variable ( int *iVarPtr )
 *		指定された整数型の変数の値を正値になるようにする
 *		int *iVarPtr : 整数型変数へのポインター値
 */

void to_positive_int_variable ( int *iVarPtr ) {

	if ( *iVarPtr < 0 )	{	/* もし、整数型変数の値が負ならば.. */
		/* その値の符号を変更して、元の変数に代入する */

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

	} /* そうでなければ、何もしない.. */
}

/*
 *
 */

int main ( int argc, char *argv[] ) {
	int pVar = 5;	/* 正の値を持つ整数型変数 */
	int nVar = -2;	/* 負の値を持つ整数型変数 */
	int zVar = 0;	/* 零の値を持つ整数型変数 */

	/* pVar */
	printf ( "前 : pVar = %d\n", pVar );
	to_positive_int_variable ( &pVar );	/* 引数はポインター値を指定する */
	printf ( "後 : pVar = %d\n", pVar );

	/* nVar */
	printf ( "前 : nVar = %d\n", nVar );

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

	printf ( "後 : nVar = %d\n", nVar );

	/* zVar */
	printf ( "前 : zVar = %d\n", zVar );

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

	printf ( "後 : zVar = %d\n", zVar );

  return 0;
}

/*
 *
 */
20141212-01.c の実行結果
C:\usr\c\> 20141212-01-QQQQ
前 : pVar = 5
後 : pVar = 5
前 : nVar = -2
後 : nVar = 2
前 : zVar = 0
後 : zVar = 0
C:\usr\c\> 

課題 20141212-02 : ポインター演算子を利用して構造体を操作

Download : 20141212-02.c ( SJIS 版 )

20141212-02.c
/*
 * 20141212-02-QQQQ.c
 * ポインター演算子を利用して構造体を操作
 */

#include <stdio.h>

/*
 *	二次元の「点」を表す構造体型 Point2D の宣言
 */

typedef	struct {
	int x;
	int y;
} Point2D;

/*
 *	move_to_x_axis_symmetry ( Point2D *p2dPtr )
 *		指定された Point2D 型の変数へのポインターの値を x 軸に対象な点に移す
 *		 Point2D *p2dPtr : Point2D 型の変数へのポインターの値
 */

void move_to_x_axis_symmetry ( Point2D *p2dPtr ) {

	/* x 軸に対称なので、y 座標の符号だけを変更 */

	p2dPtr -> y = - p2dPtr -> y;	/* y 座標の符号を逆転 */

}

/*
 *	move_to_y_axis_symmetry ( Point2D *p2dPtr )
 *		指定された Point2D 型の変数へのポインターの値を y 軸に対象な点に移す
 *		Point2D *p2dPtr : Point2D 型の変数へのポインターの値
 */

void move_to_y_axis_symmetry ( Point2D *p2dPtr ) {

	/* y 軸に対称なので、x 座標の符号だけを変更 */


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


}

/*
 *	move_to_origin_symmetry ( Point2D *p2dPtr )
 *		指定された Point2D 型の変数へのポインターの値を 原点に対象な点に移す
 *		Point2D *p2dPtr : Point2D 型の変数へのポインターの値
 */

void move_to_origin_symmetry ( Point2D *p2dPtr )	{
	/* 原点対称に移動するには、
	   x 軸対称に移動して、から y 軸対称に移動すればよい
	*/

	move_to_x_axis_symmetry ( p2dPtr );	/* 引数は初めからポインター値 */

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


}

/*
 *	print_point2d ( Point2D p2dVar )
 *		指定された Point2D 型の値を表示する
 *		Point2D p2dVar; Point2D 型の値
 */

void print_point2d ( Point2D p2dVar ) {

	 /* x, y 座標をそれぞれ出力するだけ */
	 printf ( "(%d, %d)", p2dVar.x, p2dVar.y );

}

/*
 *
 */

int main ( void ) {
	Point2D Pa = { -1, 3 };	/* 座標 ( -1, 3 ) の点 Pa */
	Point2D Pb = { 2, 5 };	/* 座標 ( 2, 5 ) の点 Pb */

	printf ( "Pa = " );
	print_point2d ( Pa );				/* Point2D の値を指定 */
	printf ( "\nを、x 軸対称な位置に移動すると.." );
	move_to_x_axis_symmetry ( &Pa );	/* Point2D 型の変数のポインター値を指定 */
	print_point2d ( Pa );
	printf ( "になります\n" );

	printf ( "Pb = " );
	print_point2d ( Pb );
	printf ( "\nを、原点対称な位置に移動すると.." );

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

	print_point2d ( Pb );
	printf ( "になります\n" );

    return 0;

}

/*
 *
 */
20141212-02.c の実行結果
C:\usr\c\> 20141212-02-QQQQ
Pa = (-1, 3)
を、x 軸対称な位置に移動すると..(-1, -3)になります
Pb = (2, 5)
を、原点対称な位置に移動すると..(-2, -5)になります
C:\usr\c\> 

課題 20141212-03 : Point2D 型に対応した myprintf を拡張して作る

Download : 20141212-03.c ( SJIS 版 )

20141212-03.c
/*
 * 20141212-03-QQQQ.c
 * Point2D 型に対応した myprintf を拡張して作る
 */

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

/*
 *
 */

typedef struct {
		int x;
		int y;
} Point2D;

/*
 * 複数の引数を書式指定して文字列の中に埋め込む 
 */

void myprintf ( char *msg, ... ) {
  int i;
  char *pvalue = (char *)&msg + sizeof( char * );
  Point2D pv;

  for ( i = 0; msg[i] != EOS; i++ ) {
	if ( msg[i] == '%' ) {		/* 文字列の中に '%' があったら特別処理する */
	  i++; 						/* 次の文字をみる */
	  switch ( msg[i] ) {
	  case 'd':					/* 10 進数 */
		s_print_int ( *((int *)pvalue) );
		pvalue += sizeof ( int );
		break;
	  case 'o':					/* 8 進数 */
		s_print_int ( *((int *)pvalue) );
		pvalue += sizeof ( int );
		break;
	  case 'x':					/* 16 進数 */
		s_print_int ( *((int *)pvalue) );
		pvalue += sizeof ( int );
		break;
	  case 'c':					/* 文字 */
		s_print_char ( *((char *)pvalue) );
		pvalue += sizeof ( int );	/* char は自動的に int にされる */
		break;
	  case 's':					/* 文字列 */
		s_print_string ( *((char **)pvalue) );
		pvalue += sizeof ( char * );
		break;
	  case 'f':					/* 浮動小数点数 */
		s_print_double ( *((double *)pvalue) );
		pvalue += sizeof ( double );
		break;
	  case 'D':					/* Point2D 型 */
		pv = *((Point2D *)pvalue);
			/* pv の値を (%d,%d) の形式で出力する */

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

			/* 次のデータを処理するために pvalue 変更 */

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

		break;
	  case '%':					/* '%' が重なったら.. */
		s_print_char ( '%' );	/* '%' を出力 */
		break;
	  default:					/* その他 : よくわからないので読み飛ばす.. */
		  break;
	  }
	} else {	/* そうでなけれ .. */
	  s_print_char ( msg[i] );	/* そのままその文字を出力 */
	}
  }
}

/*
 * 色々な数値の出力
 */

int main ( void ) {
	Point2D pv;

	pv.x = 2;
	pv.y = -3;

  /*
   * データの出力 (Output)
   */

  myprintf ( 
					 "整数値(%%d) : %d, 文字(%%c) : '%c', 文字列(%%s) : \"%s\", 浮動小数点数(%%f) : %f, \
    点の座標 (%%D) : %D\n",
					 123, (int)'a', "xyz" , 1.23, pv );

  /*
   * 
   */

  return 0;
}

/*
 *
 */
20141212-03.c の実行結果
C:\usr\c\> 20141212-03-QQQQ
整数値(%d) : 123, 文字(%c) : 'a', 文字列(%s) : "xyz", 浮動小数点数(%f) : \
    1.230000, 点の座標 (%D) : (2,-3)
C:\usr\c\> 

Links

関連 Link

logical