Powered by SmartDoc

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

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

目次

おしらせ

講義資料

当日の OHP 資料

当日のOHP資料です。

追加ファイル

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

sample-001

Download : sample-001.c ( SJIS 版 )

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

/*
 *
 */

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

/*
 *	n から 1 までの整数を出力し、改行する
 */

void printn1 ( int n ) {

  while ( n > 0 ) {		/* n が 0 より大きい間繰り返す */

	/* 繰返し部分 */
	s_print_int ( n );
	s_print_string ( " " );
	n--;				/* n = n - 1 : 状態を変化させる */

  }
  s_print_newline();

}

/*
 *
 */

int main ( void ) {

  s_print_string ( "5 から 1 まで出力 : " );
  printn1 ( 5 );

  s_print_string ( "10 から 1 まで出力 : " );
  printn1 ( 10 );

  return 0;
}

/*
 *
 */
sample-001.c の実行結果
C:\usr\c\> sample-001
5 から 1 まで出力 : 5 4 3 2 1 
10 から 1 まで出力 : 10 9 8 7 6 5 4 3 2 1 
C:\usr\c\> 

sample-002

Download : sample-002.c ( SJIS 版 )

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

/*
 *
 */

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

/*
 *	n から 1 までの整数を出力し、改行する ( 再帰版 )
 */

void printn1_sub ( int n ) {

  if ( n > 0 ) {				/* while が if に変化 */

	/* 繰返し部分はそのまま */
	s_print_int ( n );
	s_print_string ( " " );
	n--;

	printn1_sub ( n );	/* 最後に再帰呼び出し */
  }

}

/*
 *	n から 1 までの整数を出力し、改行する ( 再帰版 )
 */

void printn1 ( int n ) {

  printn1_sub ( n );	/* while 文が再帰関数になる */

  s_print_newline();

}

/*
 *
 */

int main ( void ) {

  s_print_string ( "5 から 1 まで出力 : " );
  printn1 ( 5 );

  s_print_string ( "10 から 1 まで出力 : " );
  printn1 ( 10 );

  return 0;
}

/*
 *
 */
sample-002.c の実行結果
C:\usr\c\> sample-002
5 から 1 まで出力 : 5 4 3 2 1 
10 から 1 まで出力 : 10 9 8 7 6 5 4 3 2 1 
C:\usr\c\> 

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 2011/11/04 sample-003.c
 */

/*
 *
 */

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

/*
 *	1 から n までの整数を出力し、改行する
 *		変数 i を制御変数として利用する while 文
 */

void print1n ( int n ) {
  int i = 1;				/* 初期化 */

  while ( i <= n ) {		/* 条件判定 */

	/* 処理本体 */
	s_print_int ( i );
	s_print_string ( " " );

	i++;					/* 値の変更 */
  }
  s_print_newline();

}

/*
 *
 */

int main ( void ) {

  s_print_string ( "1 から 5 まで出力 : " );
  print1n ( 5 );

  s_print_string ( "1 から 10 まで出力 : " );
  print1n ( 10 );

  return 0;
}

/*
 *
 */
sample-003.c の実行結果
C:\usr\c\> sample-003
1 から 5 まで出力 : 1 2 3 4 5 
1 から 10 まで出力 : 1 2 3 4 5 6 7 8 9 10 
C:\usr\c\> 

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 2011/11/04 sample-004.c
 */

/*
 *
 */

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

/*
 *	1 から n までの整数を出力し、改行する
 *		変数 i を制御変数として利用する for 文
 */

void print1n ( int n ) {
  int i;					/* 宣言のみ */

  for ( i = 1; i <= n; i++ ) {	/* 制御変数の処理が一箇所にまとまっている */

	/* 処理本体は同じ */
	s_print_int ( i );
	s_print_string ( " " );

  }
  s_print_newline();

}

/*
 *
 */

int main ( void ) {

  s_print_string ( "1 から 5 まで出力 : " );
  print1n ( 5 );

  s_print_string ( "1 から 10 まで出力 : " );
  print1n ( 10 );

  return 0;
}

/*
 *
 */
sample-004.c の実行結果
C:\usr\c\> sample-004
1 から 5 まで出力 : 1 2 3 4 5 
1 から 10 まで出力 : 1 2 3 4 5 6 7 8 9 10 
C:\usr\c\> 

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 2011/11/04 sample-005.c
 */

/*
 *
 */

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

/*
 *	1 から n までの整数を出力し、改行する
 *		ただし数値の間に ',' をいれる
 */

void print1n ( int n ) {
  int i;					/* 宣言のみ */

  for ( i = 0; i <= n; i++ ) {	/* 制御変数の処理が一箇所にまとまっている */

	s_print_int ( i );

	if ( i == n ) {
	  break;				/* break が実行されると繰返しは中断される */
	}

	s_print_string ( ", " );

  }
  s_print_newline();

}

/*
 *
 */

int main ( void ) {

  s_print_string ( "1 から 5 まで出力 : " );
  print1n ( 5 );

  s_print_string ( "1 から 10 まで出力 : " );
  print1n ( 10 );

  return 0;
}

/*
 *
 */
sample-005.c の実行結果
C:\usr\c\> sample-005
1 から 5 まで出力 : 0, 1, 2, 3, 4, 5
1 から 10 まで出力 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
C:\usr\c\> 

sample-006

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 2011/11/04 sample-006.c
 */

/*
 *
 */

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

/*
 *	文字列の中に指定した文字があればそれを表示する
 */

#define	EOS	'\0'

void findchar ( char *str, char ch ) {

  for ( ; *str != EOS; str++ ) {	/* for 文の個々の要素は省略可 */

	s_print_char ( *str );

	if ( *str == ch ) {		/* 探ししている文字を見付けた */
							/* 見付けた事をレポートし.. */
	  s_print_char ( ':' );
	  s_print_char ( ch );
	  s_print_string ( " をみつけました" );
	  break;				/* 繰返しはここで終了 */
	}

	s_print_char ( ' ' );
  }

  s_print_newline();

}

/*
 *
 */

int main ( void ) {

  s_print_string ( "\"abc123\" の中に '1' はあるか ?\n" );
  findchar ( "abc123", '1' );

  s_print_string ( "\"abc123\" の中に 'x' はあるか ?\n" );
  findchar ( "abc123", 'x' );

  return 0;
}

/*
 *
 */
sample-006.c の実行結果
C:\usr\c\> sample-006
"abc123" の中に '1' はあるか ?
a b c 1:1 をみつけました
"abc123" の中に 'x' はあるか ?
a b c 1 2 3 
C:\usr\c\> 

sample-007

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * 2011/11/04 sample-007.c
 */

/*
 *
 */

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

/*
 *
 */

int main ( void ) {
  int i;
  int j;
  int seki;

  /* かけ算九九の表 */

  s_print_string ( "  | " );
  for ( j = 1; j < 10; j++ ) {
	s_print_int ( j );
	s_print_string ( "  " );
  }
  s_print_newline();

  s_print_string ( "--+---------------------------\n" );

  for ( i = 1; i < 10; i++ ) {
	s_print_int ( i );
	s_print_string ( " |" );

	for ( j = 1; j < 10; j++ ) {
	  seki = i * j;

	  if ( seki < 10 ) {
		s_print_char ( ' ' );
	  }

	  s_print_int ( seki );
	  s_print_char ( ' ' );
	}
	s_print_newline();
  }

  return 0;
}

/*
 *
 */
sample-007.c の実行結果
C:\usr\c\> sample-007
  | 1  2  3  4  5  6  7  8  9  
--+---------------------------
1 | 1  2  3  4  5  6  7  8  9 
2 | 2  4  6  8 10 12 14 16 18 
3 | 3  6  9 12 15 18 21 24 27 
4 | 4  8 12 16 20 24 28 32 36 
5 | 5 10 15 20 25 30 35 40 45 
6 | 6 12 18 24 30 36 42 48 54 
7 | 7 14 21 28 35 42 49 56 63 
8 | 8 16 24 32 40 48 56 64 72 
9 | 9 18 27 36 45 54 63 72 81 
C:\usr\c\> 

sample-008

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 2011/11/04 sample-008.c
 */

/*
 *
 */

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

#define EOS '\0'

/*
 * 二つの文字列の中に共通の文字があればそれを出力する ( 二重ループ )
 */

int commoncharprint ( char *str1, char *str2 ) {
  char *p1;
  char *p2;

  for ( p1 = str1; *p1 != EOS; p1++ ) {
	for ( p2 = str2; *p2 != EOS; p2++ ) {
	  if ( *p1 == *p2 ) { /* 共通の文字がみつかった */
		s_print_char ( *p1 );	/* それを出力 */
	  }
	}
  }

  return EOS; /* みつからなかった場合 */

}

/*
 *
 */

void check_report ( char *str1, char *str2 ) {
  int cch;

  s_print_char ( '"' );
  s_print_string ( str1 );
  s_print_string ( "\" と、\"" );
  s_print_string ( str2 );
  s_print_string ( "\" の共通部分は " );

  commoncharprint ( str1, str2 );

  s_print_string ( " です\n" );

}

/*
 *
 */

int main ( void ) {

  check_report ( "abcd1234", "xycz2p3qr" );
  check_report ( "abcd1234", "xywz7p8qr" );

  return 0;
}

/*
 *
 */
sample-008.c の実行結果
C:\usr\c\> sample-008
"abcd1234" と、"xycz2p3qr" の共通部分は c23 です
"abcd1234" と、"xywz7p8qr" の共通部分は  です
C:\usr\c\> 

sample-009

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 2011/11/04 sample-009.c
 */

/*
 *
 */

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

#define EOS '\0'

/*
 * 二つの文字列の中に共通の文字があればそれを返す
 */

int commonchar ( char *str1, char *str2 ) {
  char *p1;
  char *p2;

  for ( p1 = str1; *p1 != EOS; p1++ ) {
	for ( p2 = str2; *p2 != EOS; p2++ ) {
	  if ( *p1 == *p2 ) { /* 共通の文字がみつかった */
		return *p1;       /* それを結果としてかえす */
	  }
	}
  }

  return EOS; /* みつからなかった場合 */

}

/*
 *
 */

void check_report ( char *str1, char *str2 ) {
  int cch;

  s_print_char ( '"' );
  s_print_string ( str1 );
  s_print_string ( "\" と、\"" );
  s_print_string ( str2 );
  s_print_string ( "\" の共通部分は" );

  cch = commonchar ( str1, str2 );

  if ( cch == EOS ) {
	s_print_string ( "ありませんでした\n" );
  } else {
	s_print_string ( " `" );
	s_print_char ( cch );
	s_print_string ( "' です\n" );
  }

}

/*
 *
 */

int main ( void ) {

  check_report ( "abcd1234", "xycz2p3qr" );
  check_report ( "abcd1234", "xywz7p8qr" );

  return 0;
}

/*
 *
 */
sample-009.c の実行結果
C:\usr\c\> sample-009
"abcd1234" と、"xycz2p3qr" の共通部分は `c' です
"abcd1234" と、"xywz7p8qr" の共通部分はありませんでした
C:\usr\c\> 

sample-010

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 2011/11/04 sample-010.c
 */

/*
 *
 */

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

#define EOS '\0'

/*
 * 二つの文字列の中に共通の文字があればそれを返す
 */

void narigato ( int n ) {
  int i;

    for ( i = 0; i < n; i++ ) {			/* 制御変数 i で、繰返しが制御されている.. */
/*  for ( i = n; i > 0; i-- ) {			*/
	s_print_string ( "ありがとう\n" );	/* 繰返しの本体では、i に関わりがない */
  }

}

/*
 *
 */


int main ( void ) {

  narigato ( 10 );

  return 0;
}

/*
 *
 */
sample-010.c の実行結果
C:\usr\c\> sample-010
ありがとう
ありがとう
ありがとう
ありがとう
ありがとう
ありがとう
ありがとう
ありがとう
ありがとう
ありがとう
C:\usr\c\> 

sample-011

Download : sample-011.c ( SJIS 版 )

sample-011.c
/*
 * 2011/11/04 sample-010.c
 */

/*
 *
 */

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

#define EOS '\0'

/*
 * 1 から n - 1 までの階和
 */

int kaiwa ( int n ) {
  int i;
  int sum = 0;

  for ( i = 0; i < n; i++ ) {			/* 制御変数 i で、繰返しが制御されている.. */
/*  for ( i = 1; i <= n; i++ ) {
	sum = sum + i;						/* 繰返しの中で i が利用されている */
  }

  return sum;
}

/*
 *
 */

int main ( void ) {

  s_print_string ( "1 から 10 までの和 " );
  s_print_int ( kaiwa ( 10 ) );
  s_print_string ( "です.\n" );

  return 0;
}

/*
 *
 */
sample-011.c の実行結果
C:\usr\c\> sample-011
1 から 10 までの和 0です.
C:\usr\c\> 

sample-012

Download : sample-012.c ( SJIS 版 )

sample-012.c
/*
 * 2011/11/04 sample-012.c
 */

/*
 *
 */

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

#define EOS '\0'

/*
 * 2 の平方根を求めたい ( sqrt を使わない )
 *	f(x) = x^2 - 2 を考えると、これは、f(x) = 0 の時に、x は 2 の平方根
 *  f(0) = 0^2 - 2 = - 2 < 0, f(2) = 2^2 - 2 = 2 > 0 => 2 平方根は、0 と 2 の間にある
 *

                    Y
                    |
                    |         f(x)
                    |       /
                    |   1  /
 -------------------+---+-/-----+-------- X
                 0  |   /       2
                    |/
                    |

 */


void zeropoint (  ) {
  double lwr = 0.0;
  double upr = 2.0;
  double middle;

  while (  upr - lwr > 0.0001 ) {

	middle = ( lwr + upr ) / 2.0;

	if ( middle * middle - 2 < 0 ) {
	  lwr = middle;
	} else {
	  upr = middle;
	}
	s_print_doubleb ( middle );			/* 本来は、s_print_double ( middle ); とすべきだが \
    s_print.h に誤りがある.. */
	s_print_newline();
  }
}


/*
 *
 */

int main ( void ) {

  zeropoint ( );

  return 0;
}

/*
 *
 */
sample-012.c の実行結果
C:\usr\c\> sample-012
1.000000
1.500000
1.250000
1.375000
1.437500
1.406250
1.421875
1.414062
1.417969
1.416016
1.415039
1.414551
1.414307
1.414185
1.414246
C:\usr\c\> 

sample-013

Download : sample-013.c ( SJIS 版 )

sample-013.c
/*
 * 2011/11/04 sample-013.c
 */

/*
 *
 */

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

/*
 *
 */

#define	ON	1
#define	OFF	0

int main ( void ) {
  int power = ON;		/* 最初は電源がはいっている */ 
  int cmd;
  int charge = 0;		/* charge は 0 */

  while ( power == ON ) {	/* 電源が入っている限り続く */
	s_print_string ( "命令 :\n" );
	s_print_string ( "\ts -- switch off\n" );
	s_print_string ( "\t1 -- 1 円\n" );
	s_print_string ( "\t5 -- 5 円\n" );
	s_print_string ( "\tm -- はらいもどし\n" );
	s_print_string ( "\tb -- 買う (商品は 7 円)\n" );

	cmd = s_input_char();

	switch ( cmd ) {
	case 's':
	  power = OFF;
	  s_print_string ( "電源を切ります\n" );
	  break;
	case '1':
	  charge = charge + 1;
	  s_print_string ( "1 円入りました\n" );
	  break;
	case '5':
	  charge = charge + 5;
	  s_print_string ( "5 円入りました\n" );
	  break;
	case 'm':
	  if ( charge > 0 ) {
		s_print_int ( charge );
		s_print_string ( " 円かえしました\n" );
		charge = 0;
	  }
	  break;
	case 'b':
	  if ( charge >= 7 ) {
		s_print_string ( "商品をだします\n" );
		charge = charge - 7;
	  } else {
		s_print_string ( "料金が不足です\n" );
	  }
	  break;
	default:
		s_print_string ( "意味不明です\n" );
	  break;
	}
  }

  return 0;
}

/*
 *
 */
入力例
1
5
5
b
m
s
sample-013.c の実行結果
C:\usr\c\> sample-013<  sample-013.in
命令 :
	s -- switch off
	1 -- 1 円
	5 -- 5 円
	m -- はらいもどし
	b -- 買う (商品は 7 円)
 1
1 円入りました
命令 :
	s -- switch off
	1 -- 1 円
	5 -- 5 円
	m -- はらいもどし
	b -- 買う (商品は 7 円)
 5
5 円入りました
命令 :
	s -- switch off
	1 -- 1 円
	5 -- 5 円
	m -- はらいもどし
	b -- 買う (商品は 7 円)
 5
5 円入りました
命令 :
	s -- switch off
	1 -- 1 円
	5 -- 5 円
	m -- はらいもどし
	b -- 買う (商品は 7 円)
 b
商品をだします
命令 :
	s -- switch off
	1 -- 1 円
	5 -- 5 円
	m -- はらいもどし
	b -- 買う (商品は 7 円)
 m
4 円かえしました
命令 :
	s -- switch off
	1 -- 1 円
	5 -- 5 円
	m -- はらいもどし
	b -- 買う (商品は 7 円)
 s
電源を切ります
C:\usr\c\> 

sample-014

Download : sample-014.c ( SJIS 版 )

sample-014.c
/*
 * 2011/11/04 sample-014.c
 */

/*
 *
 */

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

/*
 *
 */

#define	GOKIGEN	1
#define	FUTSU	0
#define	FUKIGEN	-1


int main ( void ) {
  int kigen = FUTSU;
  int ch;

  while ( 1 ) {	/* 永遠に.. ( CTRL-C で終了 ) */
	s_print_string ( "h - ほめる\n" );
	s_print_string ( "k - けなす\n" );
	s_print_string ( "o - おねだり\n" );

	ch = s_input_char();	/* なにをする (入力) */

	if ( ch == 0 ) {		/* 入力が終りなった. */
	  break;
	}

	switch ( kigen ) {
	case GOKIGEN:
	  switch ( ch ) {
	  case 'h':
		s_print_string ( "いやねぇ..\n" );
		break;
	  case 'o':
		s_print_string ( "もちろん OK..\n" );
		kigen = FUTSU;
		break;
	  case 'k':
		s_print_string ( "なによ ...\n" );
		kigen = FUTSU;
		break;
	  }
	  break;
	case FUTSU:
	  switch ( ch ) {
	  case 'h':
		s_print_string ( "ありがとう..\n" );
		kigen = GOKIGEN;
		break;
	  case 'o':
		s_print_string ( "どうしようかしら..\n" );
		break;
	  case 'k':
		s_print_string ( "ふんだ ...\n" );
		kigen = FUKIGEN;
		break;
	  }
	  break;
	case FUKIGEN:
	  switch ( ch ) {
	  case 'h':
		s_print_string ( "ほめたって何もでないよ..\n" );
		kigen = FUTSU;
		break;
	  case 'o':
		s_print_string ( "ダメにきまっているわ..\n" );
		break;
	  case 'k':
		s_print_string ( "喧嘩売き ?\n" );
		break;
	  }
	  break;
	}


  }

  return 0;
}

/*
 *
 */
入力例
o
h
o
k
k
o
h
o
h
o
sample-014.c の実行結果
Can not access : program/sample-014.out

sample-015

Download : sample-015.c ( SJIS 版 )

sample-015.c
/*
 * sample-0
 */

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

/*
 *
 */

#define	YES	1
#define	NO	0

#define	EOS	'\0'

/*
 * 入力された文字列が、C 言語の 8 進整数を表すかどうかを判定する関数
 * 引数は文字列で、結果は関数の返り値とする
 * 返り値の意味 : 1 - 8 進整数 / 0 - それ以外
 * 8 進整数の正規表現 : -?0[0-7]*
 */

/*

-> [0] -+- '_a-zA-Z' --+-> [1] -- '_a-zA-Z0-9' ----+
				       ^			  			   |
					   |			  			   v
					   +---------------------------+
 */

/*
 *
 */

#define	S0	0		/* 状態[0] */
#define	S1	1		/* 状態[1] */

#define	SI	S0		/* 初期状態 */
#define	SE	(-1)	/* エラー状態 */

int isname ( char *str ) {
	int result;				/* 判定結果 */
	int status = SI;		/* 最初は初期状態 */

	while ( *str != EOS ) {	/* 文字列が最後になるまで */

		switch ( status ) {
		case SE:			/* エラー状態は何がきてもエラーのまま */
			break;
		case S0:
		  if ( *str == '_' ) {
				status = S1;
		  } else if ( 'A' <= *str && *str <= 'Z' ) {
				status = S1;
		  } else if ( 'a' <= *str && *str <= 'z' ) {
				status = S1;
		  } else {
				status = SE;
		  }
		  break;
		case S1:
		  if ( *str == '_' ) {
		  } else if ( 'A' <= *str && *str <= 'Z' ) {

		  } else if ( 'a' <= *str && *str <= 'z' ) {

		  } else if ( '0' <= *str && *str <= '9' ) {

		  } else {
				status = SE;
		  }
		  break;
		}

		str++;		/* str = str + 1 */
	}

	/* 終了状態の確認 */

	switch ( status ) {
	case S1:		/* この時だけ「受理」*/
		result = YES;
		break;
	default:		/* それ以外は、全て「不受理」*/
		result = NO;
		break;
	}

	return result;	/* 結果を関数値として返す */
}

/*
 *
 */

int main ( void ) {
	char *inputs;

	s_print_string ( "文字列を入力してください : " );
	inputs = s_chop ( s_input_string() );	/* 改行を取り除く */

	s_print_string ( "\"" );
	s_print_string ( inputs );
	s_print_string ( "\" は シンボル名で" );
	if ( isname ( inputs ) == YES ) {
		s_print_string ( "した" );
	} else {
		s_print_string ( "ありません" );
	}
	s_print_string ( "。\n" );

	return 0;
}

/*
 *
 */
入力例
abc123
sample-015.c の実行結果
C:\usr\c\> sample-015<  sample-015.in
文字列を入力してください : "abc123" は シンボル名でした。
C:\usr\c\> 

本日の課題

課題 20111104-01

Download : 20111104-01.c ( SJIS 版 )

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

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

/*
 *
 */

/*
 * 1 から n 個の奇数の和を求める
 */

int sumodd ( int n ) {
	int i;
	int sum = 0;

	for ( i = 1; i <= n; i++ ) {

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

	}

	return sum;
}

/*
 *
 */

int main ( void ) {


	s_print_string ( "1 から 4 個の奇数の和は " );
	s_print_int ( sumodd ( 4 ) );
	s_print_string ( " です。\n" );
	s_print_string ( "1 から 7 個の奇数の和は " );
	s_print_int ( sumodd ( 7 ) );
	s_print_string ( " です。\n" );
  

	return 0;
}

/*
 *
 */
入力例
-077
20111104-01.c の実行結果
C:\usr\c\> 01<  01.in
1 から 4 個の奇数の和は 16 です。
1 から 7 個の奇数の和は 49 です。
C:\usr\c\> 

課題 20111104-02

Download : 20111104-02.c ( SJIS 版 )

20111104-02.c
/*
 * 20111104-2-QQQQ.c
 */

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

/*
 *
 */

#define	YES	1
#define	NO	0

#define	EOS	'\0'

/*
 * 入力された文字列が、C 言語の 8 進整数を表すかどうかを判定する関数
 * 引数は文字列で、結果は関数の返り値とする
 * 返り値の意味 : 1 - 8 進整数 / 0 - それ以外
 * 8 進整数の正規表現 : -?0[0-7]*
 */

/*

-> [0] -+- '-' -> [1] -+		  +--
        |              |		  ^
        v              v		  |
        +--------------+- '0' -> [2] - '0-7' --+
								  ^			   |
								  |			   v
								  +------------+

 */

/*
 *
 */

#define	S0	0		/* 状態[0] */
#define	S1	1		/* 状態[1] */
#define	S2	2		/* 状態[2] */

#define	SI	S0		/* 初期状態 */
#define	SE	(-1)	/* エラー状態 */

int isoctal ( char *str ) {
	int result;				/* 判定結果 */
	int status = SI;		/* 最初は初期状態 */

	while ( *str != EOS ) {	/* 文字列が最後になるまで */

		switch ( status ) {
		case SE:			/* エラー状態は何がきてもエラーのまま */
			break;
		case S0:

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

			break;
		case S1:
			switch ( *str ) {
			case '0':
				status = S2;
				break;
			default:
				status = SE;
				break;
			}
			break;
		case S2:
			if ( '0' <= *str && *str <= '7' ) {
				/* status = S2; */
			} else {
				status = SE;
			}
			break;
		}

		str++;		/* str = str + 1 */
	}

	/* 終了状態の確認 */


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


	return result;	/* 結果を関数値として返す */
}

/*
 *
 */

int main ( void ) {
	char *inputs;

	s_print_string ( "文字列を入力してください : " );
	inputs = s_chop ( s_input_string() );	/* 改行を取り除く */

	s_print_string ( "\"" );
	s_print_string ( inputs );
	s_print_string ( "\" は 8 進数で" );
	if ( isoctal ( inputs ) == YES ) {
		s_print_string ( "した" );
	} else {
		s_print_string ( "ありません" );
	}
	s_print_string ( "。\n" );

	return 0;
}

/*
 *
 */
入力例
-077
20111104-02.c の実行結果
C:\usr\c\> 02<  02.in
文字列を入力してください : "-077" は 8 進数でした。
C:\usr\c\> 

Links