Powered by SmartDoc

ソフトウェア概論A (2012/06/22)
Ver. 1.0

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

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

追加資料

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

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2012/06/15 sample-001.c
 */

#include <stdio.h>
#include "s_print.h"
#include "s_input.h"	/* 入力のために必要 */

/*
 * main
 */

int main(void)
{

  s_print_string ( "整数をキーボードから入力して、改行キーを押してください : " );
  s_print_int ( s_input_int() );	/*  */
  s_print_newline();

  s_print_string ( "文字をキーボードから入力して、改行キーを押してください : " );
  s_print_char ( s_input_char() );	/*  */
  s_print_newline();

  return 0;

}

/*
 *
 */
入力例
123
c
sample-001.c の実行結果
C:\usr\c>sample-001<  sample-001.in
整数をキーボードから入力して、改行キーを押してください : 123
123
文字をキーボードから入力して、改行キーを押してください :  c
c
C:\usr\c> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2012/06/15 sample-002.c
 */

#include <stdio.h>
#include "s_print.h"
#include "s_input.h"	/* 入力のために必要 */

/*
 * input_add
 */

int input_add ( int n )
{

   s_print_string ( "整数をキーボードから加える数を入力して、改行キーを押してください : " );

   return n + s_input_int();

}

/*
 * main
 */

int main(void)
{

  s_print_string ( "一つ目の整数をキーボードから入力して、改行キーを押してください : " );
  s_print_int ( input_add ( s_input_int() ) );
  s_print_newline();

  return 0;

}

/*
 *
 */
入力例
123
392
sample-002.c の実行結果
C:\usr\c>sample-002<  sample-002.in
一つ目の整数をキーボードから入力して、改行キーを押してください : 123
整数をキーボードから加える数を入力して、改行キーを押してください : 392
515
C:\usr\c> 

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 2012/06/15 sample-003.c
 */

#include <stdio.h>
#include <stdlib.h>	/* rand を使うために必要 */
#include "s_print.h"

/*
 * main
 */

int main(void)
{

  s_print_int ( rand() );	/* rand には引数が要らない */
  s_print_newline();

  s_print_int ( rand() );	/* 呼出す毎に異なる値になる */
  s_print_newline();

  s_print_int ( rand() );
  s_print_newline();

  s_print_int ( rand() );
  s_print_newline();

  return 0;

}

/*
 *
 */
sample-003.c の実行結果
C:\usr\c>sample-003
1804289383
846930886
1681692777
1714636915
C:\usr\c> 

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 2012/06/15 sample-004.c
 */

#include <stdio.h>
#include <stdlib.h>	/* rand を使うために必要 */
#include "s_print.h"

/*
 * saikoro
 */

int saikoro(void) {

  return rand() % 6 + 1;	/* 6 で割った余りは 0 〜 5, これに 1 を加えれば 1 〜 6 になる */
}

/*
 * main
 */

int main(void)
{

  s_print_int ( saikoro() );	/* saikoro には引数が要らない */
  s_print_newline();

  s_print_int ( saikoro() );	/* 呼出す毎に異なる値になる */
  s_print_newline();

  s_print_int ( saikoro() );
  s_print_newline();

  s_print_int ( saikoro() );
  s_print_newline();

  return 0;

}

/*
 *
 */
sample-004.c の実行結果
C:\usr\c>sample-004
2
5
4
2
C:\usr\c> 

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 2012/06/15 sample-005.c
 */

#include <stdio.h>
#include "s_print.h"
#include "s_input.h"	/* 入力のために必要 */

/*
 * min_max_game_check
 */

extern void min_max_game ( int question, int count );

/*
 * min_max_game_check
 */

void min_max_game_check ( int question, int count, int answer )
{

  if ( question == answer ) {
	s_print_string ( "正解です。" );
	s_print_newline();
	s_print_int ( count );
	s_print_string ( "回で発見できました。" );
  } else if ( question < answer ) {
	s_print_string ( "大きすぎます" );
	s_print_newline();
	min_max_game ( question, count + 1 );
  } else {
	s_print_string ( "小さすぎます" );
	s_print_newline();
	min_max_game ( question, count + 1 );
  }

}


/*
 * min_max_game
 */

void min_max_game ( int question, int count ) 
{

  s_print_int ( count );
  s_print_string ( "回目の予想です。" );
  s_print_newline();

  s_print_string ( "予想する数を入力してください :" );
  min_max_game_check ( question, count, s_input_int() );

}

/*
 * main
 */

int main( void )
{

  s_print_string ( "1 〜 1000 の数を予想してください\n" );
  min_max_game ( rand() % 1000 + 1, 1 );

  return 0;
}

/*
 *
 */
入力例
100
500
400
300
350
370
380
385
384
sample-005.c の実行結果
C:\usr\c>sample-005<  sample-005.in
1 〜 1000 の数を予想してください
1回目の予想です。
予想する数を入力してください :100
小さすぎます
2回目の予想です。
予想する数を入力してください :500
大きすぎます
3回目の予想です。
予想する数を入力してください :400
大きすぎます
4回目の予想です。
予想する数を入力してください :300
小さすぎます
5回目の予想です。
予想する数を入力してください :350
小さすぎます
6回目の予想です。
予想する数を入力してください :370
小さすぎます
7回目の予想です。
予想する数を入力してください :380
小さすぎます
8回目の予想です。
予想する数を入力してください :385
大きすぎます
9回目の予想です。
予想する数を入力してください :384
正解です。
9回で発見できました。C:\usr\c> 

講義中に作成したサンプルプログラム

-->

本日の課題

課題 20120622-01

Download : 20120622-01.c ( SJIS 版 )

20120622-01.c
/*
 * DATE-DIR-QQQQ.c
 *
 *	余りを計算するプログラム
 */

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

/*
 * 余りの定義
 *	n, m が自然数の時に n mod m ( n を m で割った余り ) とは何か ( m > 0 )
 * 
 *                	n        	( m > n の時 ) 
 *      n mod m { 
 *		 	(n-m) mod m	( その他の時 )
 */

void my_remainder_sub ( int n, int m, int mm, int nn ) {
	/*                 ^        ^ 変化*/
	/*                                  ^^ 最初の m を記憶して、後から利用できるようにしている */ 
	/*                                             ^^ 割り始め n を覚えておく */
  if ( m == 0 ) {		/* m が 0 : 引き算が終った */

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

  } else if ( n == 0 ) {	/* n が 0 : m の方が大きかった */
        s_print_int ( nn );					/* 余りを出力 */
  } else {

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

  }

}

/*
 *	my_remainder : print ( n mod m )
 */

void my_remainder ( int n, int m ) {


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

}

/*
 *	main
 */

int main()
{

  printf ( "10 mod 4 = " );
  my_remainder ( 10, 4 );
  printf ( "\n" );

  printf ( "10 mod 3 = " );
  my_remainder ( 10, 3 );
  printf ( "\n" );

  printf ( "10 mod 2 = " );
  my_remainder ( 10, 2 );
  printf ( "\n" );

  return 0;
}
20120622-01.c の実行結果
C:\usr\c\> 20120622-01
10 mod 4 = 2
10 mod 3 = 1
10 mod 2 = 0
C:\usr\c\> 

課題 20120622-02

Download : 20120622-02.c ( SJIS 版 )

20120622-02.c
/*
 * DATE-DIR-QQQQ.c
 *
 *	文字列の長さを計算する my_string_length
 */

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

/*
 *
 */

#define	EOS	'\0'		/* End Of String */

int my_string_length ( char *str ) {

  if ( *str == EOS ) {		/* "" は 長さ 0 */

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

  } else {			/* 残りの長さ + 1 */

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

  }

}

/*
 *
 */

int main ( void ) {

   s_print_int ( my_string_length ( "abc" ) );	/* 3 と表示されるはず */
   s_print_newline();

  return 0;
}

/*
 *
 */
20120622-02.c の実行結果
C:\usr\c\> 20120622-02
3
C:\usr\c\> 

以下の課題は、次回にまわします。

課題 20120622-03

Download : 20120622-03.c ( SJIS 版 )

20120622-03.c
/*
 * DATE-DIR-QQQQ.c
 *
 *	cos のグラフ
 */

#include <stdio.h>
#include <math.h>	/* 数学関数を利用する場合はこれを追加する */
#include "s_print.h"
#include "s_input.h"

/*
 *
 */

void plot_dot_sub ( double pos, double value ) {

  if ( pos >= value ) {			/* 印刷位置まだきた */
	s_print_char ( '*' );			/* 「点」を出力 */
	s_print_newline ();			/* この行は終り */
  } else {
	s_print_char ( ' ' );			/* 空白を出力 */
	plot_dot_sub ( pos + 1.0, value );	/* 続きを計算 */
  }
}

/*
 *	0 〜 79 で、 -1.0 〜 1.0 を表現するには、
 *		x | -1.0 〜 1.0 |       x
 *		--+-------------+---------------
 *		y |    0 〜  79 | ( x + 1 ) * 40 
 */

#define	WIDTH	80.0			/* 一行の中のカラム数を定義 */

void plot_dot ( double value ) {

  plot_dot_sub ( 0.0, ( value + 1.0 ) * WIDTH/2.0 );
}

/*
 *
 */

void print_cos_curve( double top, double end, double step ) {

  if ( top >= end ) {
	/* 何もする必要はない */
  } else {

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

  }

}

/*
 *
 */

#define	PI	3.141592

int main ( void ) {

  print_cos_curve( 0, 2 * PI, 0.1 );	/* PI は 円周率 */

  return 0;
}

/*
 *
 */
20120622-03.c の実行結果
C:\usr\c\> 20120622-03
*
*
*
*
*
*
*
*
*
*
                                                              *
                                                           *
                                                       *
                                                   *
                                               *
                                           *
                                       *
                                   *
                               *
                            *
                        *
                    *
                 *
              *
           *
        *
      *
    *
   *
  *
 *
 *
 *
 *
  *
   *
     *
       *
         *
           *
              *
                  *
                     *
                        *
                            *
                                *
                                    *
                                        *
                                            *
                                                *
                                                    *
                                                        *
                                                           *
                                                               *
*
*
*
*
*
*
*
*
*
C:\usr\c\> 

課題 20120622-04

Download : 20120622-04.c ( SJIS 版 )

20120622-04.c
/*
 * DATE-DIR-QQQQ.c
 *
 *	正の整数値をキーボードから入力し、素数かどうかを判定した結果を表示する
 *  0 以下の値が入った場合は、終了する
 */

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

/*
 *
 */

int min_factor ( int number, int factor ) {

	if ( number % factor == 0 ) {	/* number は factor で割り切れる */
		return factor;				/* それを返す */
	} else {
		/* factor を一つ大きくして、試す */

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

	}

}

void prime_check ( int number, int factor ) {

	if ( factor == number ) {	/* 最大の約数が自分と同じ */
		s_print_int ( number );

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

	} else {
		s_print_int ( number );
		s_print_string ( " は、 " );
		s_print_int ( factor );

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

	}
}

void prime_check_loop ( int number ) {

	 if ( number <= 0 ) { 	/* 0 より小かった */
		s_print_string ( "0 以下の数 " );
		s_print_int ( number );
		s_print_string ( " が入力されたので終了します。\n" );
	} else {
		if ( number == 1 ) {

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

	    } else {
			prime_check ( number, min_factor ( number, 2 ) );
		}
			/* 再帰 */
		s_print_string ( "整数値を入力してください(0 以下で終了) : " );
		prime_check_loop ( s_input_int() );
	}
}

/*
 *
 */

int main ( void ) {

   s_print_string ( "整数値を入力してください(0 以下で終了) : " );
   prime_check_loop ( s_input_int() );

  return 0;
}

/*
 *
 */
入力例
4
1
7
-1
20120622-04.c の実行結果
C:\usr\c\> 20120622-04
整数値を入力してください(0 以下で終了) : 4 は、 2 で割り切れるので、合成数でした。
整数値を入力してください(0 以下で終了) : 1 は、素数でありません。
整数値を入力してください(0 以下で終了) : 7 は、素数でした。
整数値を入力してください(0 以下で終了) : 0 以下の数 -1 が入力されたので終了します。
C:\usr\c\>