Powered by SmartDoc

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

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

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

追加ファイル

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

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2011/12/02 sample-001.c
 */

/*
 *
 */

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

/*
 * 二つの整数を入力し、その和を計算して出力する ( Input-Process-Output )
 */

int main ( void ) {
  int a;
  int b;
  int wa;

  /*
   * データの入力 (Input)
   */

  s_print_string ( "変数 a の値(整数値)を入力してください : " );
  a = s_input_int();

  s_print_string ( "変数 b の値(整数値)を入力してください : " );
  b = s_input_int();

  /*
   * データの処理 (Process)
   */

  wa = a + b;

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

  s_print_int ( a );
  s_print_string ( "と、" );
  s_print_int ( b );
  s_print_string ( "の和は" );
  s_print_int ( wa );
  s_print_string ( "です。\n" );

  /*
   * 
   */

  return 0;
}

/*
 *
 */
入力例
4
8
sample-001.c の実行結果
C:\usr\c\> sample-001<  sample-001.in
変数 a の値(整数値)を入力してください : 4
変数 b の値(整数値)を入力してください : 8
4と、8の和は12です。
C:\usr\c\> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2011/12/02 sample-002.c
 */

/*
 *
 */

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

/*
 * 整数値の入力
 */

int input_int_with_message ( char *name ) {

  s_print_string ( "変数 " );
  s_print_string ( name );
  s_print_string ( "の値(整数値)を入力してください : " );

  return s_input_int();
}

/*
 * 和の出力 : あまり便利になっていない
 */

int output_wa ( int a, int b, int wa ) {

  s_print_int ( a );
  s_print_string ( "と、" );
  s_print_int ( b );
  s_print_string ( "の和は" );
  s_print_int ( wa );
  s_print_string ( "です。\n" );

}

/*
 * 二つの整数を入力し、その和を計算して出力する ( Input-Process-Output )
 */

int main ( void ) {
  int a;
  int b;
  int wa;

  /*
   * データの入力 (Input)
   */

  a = input_int_with_message ( "a" );
  b = input_int_with_message ( "b" );

  /*
   * データの処理 (Process)
   */

  wa = a + b;

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

  output_wa ( a, b, wa );
 
  /*
   * 
   */

  return 0;
}

/*
 *
 */
入力例
4
8
sample-002.c の実行結果
C:\usr\c\> sample-002<  sample-002.in
変数 aの値(整数値)を入力してください : 4
変数 bの値(整数値)を入力してください : 8
4と、8の和は12です。
C:\usr\c\> 

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 2011/12/02 sample-003.c
 */

/*
 *
 */

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

/*
 *
 */

#define	EOS	'\0'


/*
 * 文字列の中に整数値を埋め込んだ出力
 */

void print_string_with_one_int ( char msg[], int value ) {
  int i;

  for ( i = 0; msg[i] != EOS; i++ ) {
	if ( msg[i] != '%' ) {		/* 文字列の中に '%' があったら int にする */
	  s_print_char ( msg[i] );
	} else {
	  s_print_int ( value );
	}
  }
}

/*
 * 整数値の入力
 */

int input_int_with_message ( char *name ) {

  s_print_string ( "変数 " );
  s_print_string ( name );
  s_print_string ( "の値(整数値)を入力してください : " );

  return s_input_int();
}

/*
 * 和の出力 : 少し簡便化
 */

int output_wa ( int a, int b, int wa ) {

  print_string_with_one_int ( "% と、", a );
  print_string_with_one_int ( "% の和は", b );
  print_string_with_one_int ( "% です。\n", wa );

}

/*
 * 二つの整数を入力し、その和を計算して出力する ( Input-Process-Output )
 */

int main ( void ) {
  int a;
  int b;
  int wa;

  /*
   * データの入力 (Input)
   */

  a = input_int_with_message ( "a" );
  b = input_int_with_message ( "b" );

  /*
   * データの処理 (Process)
   */

  wa = a + b;

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

  output_wa ( a, b, wa );
 
  /*
   * 
   */

  return 0;
}

/*
 *
 */
入力例
4
8
sample-003.c の実行結果
C:\usr\c\> sample-003<  sample-003.in
変数 aの値(整数値)を入力してください : 4
変数 bの値(整数値)を入力してください : 8
4 と、8 の和は12 です。
C:\usr\c\> 

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 2011/12/02 sample-004.c
 */

/*
 *
 */

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

/*
 *
 */

#define	EOS	'\0'


/*
 * 複数の整数を文字列の中に埋め込む
 */

void print_string_with_ints ( char msg[], int value, ... ) {
  int i;
  int *pvalue = &value;

  for ( i = 0; msg[i] != EOS; i++ ) {
	if ( msg[i] != '%' ) {		/* 文字列の中に '%' があったら int にする */
	  s_print_char ( msg[i] );
	} else {
	  s_print_int ( *pvalue++ );	/* *pvalue を出力, pvalue = pvalue + 1 */
	}
  }
}

/*
 * 整数値の入力
 */

int input_int_with_message ( char *name ) {

  s_print_string ( "変数 " );
  s_print_string ( name );
  s_print_string ( "の値(整数値)を入力してください : " );

  return s_input_int();
}

/*
 * 和の出力 : 
 */

int output_wa ( int a, int b, int wa ) {

  print_string_with_ints ( "% と、% の和は% です。\n", a, b, wa );

}

/*
 * 二つの整数を入力し、その和を計算して出力する ( Input-Process-Output )
 */

int main ( void ) {
  int a;
  int b;
  int wa;

  /*
   * データの入力 (Input)
   */

  a = input_int_with_message ( "a" );
  b = input_int_with_message ( "b" );

  /*
   * データの処理 (Process)
   */

  wa = a + b;

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

  output_wa ( a, b, wa );
 
  /*
   * 
   */

  return 0;
}

/*
 *
 */
入力例
4
8
sample-004.c の実行結果
C:\usr\c\> sample-004<  sample-004.in
変数 aの値(整数値)を入力してください : 4
変数 bの値(整数値)を入力してください : 8
4 と、8 の和は12 です。
C:\usr\c\> 

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 2011/12/02 sample-005.c
 */

/*
 *
 */

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

/*
 *
 */

#define	EOS	'\0'

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

void print_ints_with_format ( char msg[], int value, ... ) {
  int i;
  int *pvalue = &value;

  for ( i = 0; msg[i] != EOS; i++ ) {
	if ( msg[i] == '%' ) {		/* 文字列の中に '%' があったら特別処理する */
	  i++; 						/* 次の文字をみる */
	  switch ( msg[i] ) {
	  case 'd':					/* 10 進数 */
		  s_print_int ( *pvalue++ );
		  break;
	  case 'o':					/* 8 進数 */
		  s_print_oct ( *pvalue++ );
		  break;
	  case 'x':					/* 16 進数 */
		  s_print_hex ( *pvalue++ );
		  break;
	  case '%':					/* '%' が重なったら.. */
		s_print_char ( '%' );	/* '%' を出力 */
		  break;
	  default:					/* その他 : よくわからないので 10 進で.. */
		  s_print_int ( *pvalue++ );
		  break;
	  }
	} else {	/* そうでなけれ .. */
	  s_print_char ( msg[i] );	/* そのままその文字を出力 */
	}
  }
}

/*
 * 整数値の入力
 */

int input_int_with_message ( char *name ) {

  s_print_string ( "変数 " );
  s_print_string ( name );
  s_print_string ( "の値(整数値)を入力してください : " );

  return s_input_int();
}

/*
 * 整数を入力し、それを 10, 8, 16 進数で出力する
 */

int main ( void ) {
  int a;

  /*
   * データの入力 (Input)
   */

  a = input_int_with_message ( "a" );

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

print_ints_with_format ( "%d は 8 進(%%o) だと %o になり、は 16 進(%%x) だと %x \
    になります。\n", a, a, a );
   
  /*
   * 
   */

  return 0;
}

/*
 *
 */
入力例
123
sample-005.c の実行結果
C:\usr\c\> sample-005<  sample-005.in
変数 aの値(整数値)を入力してください : 123
123 は 8 進(%o) だと 173 になり、は 16 進(%x) だと 7b になります。
C:\usr\c\> 

sample-006

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 2011/12/02 sample-006.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-006.c の実行結果
C:\usr\c\> sample-006
整数値(%d) : 123, 文字(%c) : 'a', 文字列(%s) : "xyz", 浮動小数点数(%f) : \
    1.230000
C:\usr\c\> 

sample-007

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * 2011/12/02 sample-007.c
 */

/*
 *
 */

#include <stdio.h>

/*
 *
 */

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

int main ( void ) {
  int i;
  char c;
  char s[10];
  double d;

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

  scanf ( "%d%c%s%lf", &i, &c, s, &d );

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

  printf ( 
				 "整数値(%%d) : %d, 文字(%%c) : '%c', 文字列(%%s) : \"%s\", 浮動小数点数(%%f) : \
    %f\n",
					 i, c, s, d );

  /*
   * 
   */

  return 0;
}

/*
 *
 */
入力例
123 a xyz 1.23
sample-007.c の実行結果
C:\usr\c\> sample-007<  sample-007.in
C:\usr\c\> 

sample-008

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 2011/12/02 sample-008.c
 */

/*
 *
 */

#include <stdio.h>

/*
 *
 */

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

int main ( void ) {
  int i;
  char c;
  char s[10];
  double d;

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

  scanf ( "%d", &i );
  scanf ( "%c", &c );
  scanf ( "%s", s );
  scanf ( "%lf", &d );

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

  printf ( 
					 "整数値(%%d) : %d, 文字(%%c) : '%c', 文字列(%%s) : \"%s\", 浮動小数点数(%%f) : \
    %f\n",
					 i, c, s, d );

  /*
   * 
   */

  return 0;
}

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

本日の課題

課題 20111202-01

Download : 20111202-01.c ( SJIS 版 )

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

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

/*
 *
 */

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

typedef struct {
  Point2D sp;
  Point2D ep;
} Line2D;

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

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

  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) の形式で出力する */
		myprintf ( "(%d,%d)", pv.x, pv.y );
	/*
	**	 この部分を完成させなさい
	*/
			/* 次のデータを処理するために pvalue 変更 */
		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;
}

/*
 *
 */
入力例
1
2
3
4
5
6
7
8
9
0
0
1
0
1
0
1
0
0
20111202-01.c の実行結果
C:\usr\c\> 01<  01.in
整数値(%d) : 123, 文字(%c) : 'a', 文字列(%s) : "xyz", 浮動小数点数(%f) : \
    1.230000, 点の座標 (%D) : (2,-3)
C:\usr\c\> 

Links