Powered by SmartDoc

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

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

目次

講義資料

当日の OHP 資料

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

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2013/12/20 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> 

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

本日の課題

課題 20140110-01 : myprintf で Point2D 型を出力する %D が扱えるように拡張する

Download : 20140110-01.c ( SJIS 版 )

20140110-01.c
/*
 * DATE-DIR-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;
}

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