Powered by SmartDoc

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

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

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

追加ファイル

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

sample-001

Download : sample-001.c ( SJIS 版 )

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

/*
 *
 */

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

/*
 *
 */

void print_a ( int a0, int a1, int a2 ) {

			/*
			f.a0   +----+
			       | 0  |		<- m.a0 の値が copy
			f.a1   +----+
				   | 1  |		<- m.a1 の値が copy
			f.a2   +----+
			   	   | 2  |		<- m.a2 の値が copy
			       +----+

				main の a1 (m.a1) と print_a の a1(f.a1) は
				別の物  	
			 */

	  /* a0 */
  s_print_string ( "a0=" );
  s_print_int ( a0 );	// f.a0 の値だが m.a0 と同じ 0 が表示
  s_print_newline();

	  /* a1 */
  s_print_string ( "a1=" );
  s_print_int ( a1 );
  s_print_newline();

	  /* a2 */
  s_print_string ( "a2=" );
  s_print_int ( a2 );
  s_print_newline();

}

/*
 *
 */

int main ( void ) {
  int a0 = 0;
			/*  int ( 4byte)
			    a0 +----+
			       + 0  +
			       +----+ */
  int a1 = 1;
			/*  a1 +----+
			       + 1  +
			       +----+ */
  int a2 = 2;
			/*  a2 +----+
			       + 2  +
			       +----+ */

  print_a ( a0, a1, a2 );
			/*
			f.a0   +----+
			       | 0  |		<- m.a0 の値が copy
			f.a1   +----+
				   | 1  |		<- m.a1 の値が copy
			f.a2   +----+
			   	   | 2  |		<- m.a2 の値が copy
			       +----+
			 */

  return 0;
}

/*
 *
 */
sample-001.c の実行結果
C:\usr\c\> sample-001
a0=0
a1=1
a2=2
C:\usr\c\> 

sample-002

Download : sample-002.c ( SJIS 版 )

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

/*
 *
 */

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

/*
 *
 */

void print_a ( int a0, int a1, int a2 ) {

			/*
			f.a0   +----+
			       | 0  |		<- m.a0 の値が copy
			f.a1   +----+
				   | 1  |		<- m.a1 の値が copy
			f.a2   +----+
			   	   | 2  |		<- m.a2 の値が copy
			       +----+
			 */

  int *pa = &a0;
			/*
    int *
pa  +----+          int
	| +---->f.a0   +----+
	+----+	       | 0  |		<- m.a0 の値が copy
pa+1 ---->	f.a1   +----+
				   | 1  |		<- m.a1 の値が copy
pa+2 --->	f.a2   +----+
			   	   | 2  |		<- m.a2 の値が copy
			       +----+
			 */
  int i;

  for ( i = 0; i < 3; i++ ) {
	s_print_string ( "a" );
	s_print_int ( i );
	s_print_string ( "=" );
	s_print_int ( pa[i] );
		/*
			pa[i] == *(pa + i)
				pa + i == pa の番地から 同じ型の変数の
				サイズ i 個先
				cf.
					pa + 0 == 0 個先なので pa と同じ &a0 
					pa + 1 == 1 個先なので &a1 と同じ
					pa + 2 == 2 個先なので &a2 と同じ
			pa[0] == *(pa + 0) == *(&a0) == a0
			pa[1] == *(pa + 1) == *(&a1) == a1
			pa[2] == *(pa + 2) == *(&a2) == a2
		*/

	s_print_newline();
  }

}

/*
 *
 */

int main ( void ) {
  int a0 = 0;
  int a1 = 1;
  int a2 = 2;

  print_a ( a0, a1, a2 );

  return 0;
}

/*
 *
 */
sample-002.c の実行結果
C:\usr\c\> sample-002
a0=0
a1=1
a2=2
C:\usr\c\> 

sample-003

Download : sample-003.c ( SJIS 版 )

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

/*
 *
 */

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

/*
 *
 */

void print_a ( int pa[] ) {		/* int *pa と書いてもよい */
  int i;

  for ( i = 0; i < 3; i++ ) {
	s_print_string ( "a" );
	s_print_int ( i );
	s_print_string ( "=" );
	s_print_int ( pa[i] );
	s_print_newline();
  }

}

/*
 *
 */

int main ( void ) {
  int aa[3] = { 0, 1, 2 };	/* 配列の初期化 */

  /*
		int aa[3];
			'=, int aa[0], int aa[1], int aa[2];

					int
		aa, aa[0]   +---+
					| 0	|
		    aa[1]   +---+
					| 1	|
		    aa[2]   +---+
					| 2	|
				    +---+
		cf.
			int a0, a1, a2;

					int
		    a0      +---+
					| 0	|
		    a1      +---+
					| 1	|
		    a2      +---+
					| 2	|
				    +---+

  	aa[3] = { 0, 1, 2 };
		aa[0] = 0;
		aa[1] = 1;
		aa[2] = 2;
		// この配列のまとめ代入は初期化の時しか使えない
  */

  /*
	途中で
		aa = { 3, 4, 5}; 
	などとはできない。
  */

  print_a ( aa );			/* 配列名のみ */
	  /*
		   int[] == int *
	    pa +----+
		   | *---->  aa aa[0] +----+
	       +----+             | 0  |
		   					  +----+

			aa という配列名が、&aa[0] の値を持つ

		  print_a ( aa );	の代わりに print_a ( &aa[0] ); としてもよい
			&aa[0] == &(aa[0])== &(*(aa+0)) = &(*aa) = (&*)aa == aa
				cf. *(&a) == a ( 任意の変数で成立 )
					&(*a) == a ( a がポインターの時に成立 )

	   */

  /*
	もし、
	  print_a ( aa[0], aa[1], aa[2] );
	としたら、前と同じ ( 配列としての旨味はない )
   */

  return 0;
}

/*
 *
 */
sample-003.c の実行結果
C:\usr\c\> sample-003
a0=0
a1=1
a2=2
C:\usr\c\> 

sample-004

Download : sample-004.c ( SJIS 版 )

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

/*
 *
 */

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

/*
 *
 */

int main ( void ) {
  int a0;
  int a1;
  int a2;

  a0 = 0;
  a1 = 1;
  a2 = a0 - a1;

  s_print_string ( "a2 = " );
  s_print_int ( a2 );
  s_print_newline();

  return 0;
}

/*
 *
 */
sample-004.c の実行結果
C:\usr\c\> sample-004
a2 = -1
C:\usr\c\> 

sample-005

Download : sample-005.c ( SJIS 版 )

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

/*
 *
 */

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

/*
 *
 */

int main ( void ) {
  int a[3];

  a[0] = 0;
  a[1] = 1;
  a[2] = a[0] - a[1];

  s_print_string ( "a[2] = " );
  s_print_int ( a[2] );
  s_print_newline();

  /*
   * sizeof
   */

  s_print_string ( "sizeof int = " );
  s_print_int ( sizeof(int) );
  s_print_newline();

  s_print_string ( "sizeof a = " );
  s_print_int ( sizeof(a) );
  s_print_newline();

  return 0;
}

/*
 *
 */
sample-005.c の実行結果
C:\usr\c\> sample-005
a[2] = -1
sizeof int = 4
sizeof a = 12
C:\usr\c\> 

sample-006

Download : sample-006.c ( SJIS 版 )

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

/*
 *
 */

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

/*
 *
 */

int main ( void ) {
  int a[3];
  int i;

  for ( i = 0; i < 3; i++ ) {
	/*
	  for ( i = 1; i <= 3; i++ ) {
	 */
	a[2-i] = i;
	/*
		a[2-i] == *(a + (2-i)) == *(a+2 -i)
	 */
  }

  for ( i = 0; i < 3; i++ ) {
	s_print_string ( "a[" );
	s_print_int ( i );
	s_print_string ( "]=" );
	s_print_int ( a[i] );
	s_print_newline();
  }

  return 0;
}

/*
 *
 */
sample-006.c の実行結果
C:\usr\c\> sample-006
a[0]=2
a[1]=1
a[2]=0
C:\usr\c\> 

sample-007

Download : sample-007.c ( SJIS 版 )

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

/*
 *
 */

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

/*
 *
 */

#define	ARRAY_SIZE	3

/*
 *
 */

void print_a ( int pa[] ) {
  int i;

  for ( i = 0; i < ARRAY_SIZE; i++ ) {	/* 配列のサイズは解らないで 3 で試すと.. */
	s_print_string ( "a" );
	s_print_int ( i );
	s_print_string ( "=" );
	s_print_int ( pa[i] );
	s_print_newline();
  }

}

/*
 *
 */

int main ( void ) {
  int dummy01 = -1000;
  int aa[2] = { 10, 20 };	/* 配列の初期化/サイズは 2 */
  int dummy02 = -2000;
	  /*
		dummy01 +------+
		        |-1000 |
		aa aa[0]+------+	<- aa = &aa[0]
		        |  10  |
		   aa[1]+------+
		        |  20  |
		dummy02 +------+	<= aa[2]
		        |-2000 |
		        +------+
	  */

  print_a ( aa );			/* 配列名のみ */

  return 0;
}

/*
 *
 */
sample-007.c の実行結果
C:\usr\c\> sample-007
a0=10
a1=20
a2=-2000
C:\usr\c\> 

sample-008

Download : sample-008.c ( SJIS 版 )

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

/*
 *
 */

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

/*
 *
 */

#define	ARRAY_SIZE	3

/*
 *
 */

void print_a ( int pa[] ) {
  int i;

  for ( i = 0; i < ARRAY_SIZE; i++ ) {	/* 定数を利用する */
	s_print_string ( "a" );
	s_print_int ( i );
	s_print_string ( "=" );
	s_print_int ( pa[i] );
	s_print_newline();
  }

}

/*
 *
 */

int main ( void ) {
  int aa[ARRAY_SIZE] = { 1, 20, 300 };

  print_a ( aa );			/* 配列名のみ */

  return 0;
}

/*
 *
 */
sample-008.c の実行結果
C:\usr\c\> sample-008
a0=1
a1=20
a2=300
C:\usr\c\> 

sample-009

Download : sample-009.c ( SJIS 版 )

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

/*
 *
 */

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

/*
 *
 */

#define	ARRAY_SIZE	3

typedef	int int3D[ARRAY_SIZE];	/* 配列のサイズが記録される */

/*
 *
 */

void print_a ( int3D pa ) {
  int i;

  for ( i = 0; i < sizeof(int3D)/sizeof(int); i++ ) {
	s_print_string ( "a" );
	s_print_int ( i );
	s_print_string ( "=" );
	s_print_int ( pa[i] );
	s_print_newline();
  }

}

/*
 *
 */

int main ( void ) {
  int3D aa = { 1, 20, 300 };	/* int3D 型の変数 */

  print_a ( aa );

  return 0;
}

/*
 *
 */
sample-009.c の実行結果
C:\usr\c\> sample-009
a0=1
a1=20
a2=300
C:\usr\c\> 

sample-010

Download : sample-010.c ( SJIS 版 )

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

/*
 *
 */

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

/*
 *
 */

#define	ARRAY_SIZE	3

/*
 *
 */

void print_a ( int pa[], int size ) {
  int i;

  for ( i = 0; i < size; i++ ) {
	s_print_string ( "a" );
	s_print_int ( i );
	s_print_string ( "=" );
	s_print_int ( pa[i] );
	s_print_newline();
  }

}

/*
 *
 */

int main ( void ) {
  int aa[ARRAY_SIZE] = { 1, 20, 300 };	/* int3D 型の変数 */

  print_a ( aa, ARRAY_SIZE );

  return 0;
}

/*
 *
 */
sample-010.c の実行結果
C:\usr\c\> sample-010
a0=1
a1=20
a2=300
C:\usr\c\> 

sample-011

Download : sample-011.c ( SJIS 版 )

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

/*
 *
 */

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

/*
 *
 */

void print_a ( int pa[], int size ) {
  int i;

  for ( i = 0; i < size; i++ ) {	/* 配列のサイズを引数で別に指定する */
	s_print_string ( "a" );
	s_print_int ( i );
	s_print_string ( "=" );
	s_print_int ( pa[i] );
	s_print_newline();
  }

}

/*
 *
 */

int main ( void ) {
  int aa1[2] = { 10, 20 };
  int aa2[4] = { 100, 200, 300, 400 };


  s_print_string ( "aa1[2]\n" );
  print_a ( aa1, 2 );

  s_print_string ( "aa2[4]\n" );
  print_a ( aa2, 4 );

  s_print_string ( "aa2[3]\n" );
  print_a ( aa2, 3 );

  s_print_string ( "aa2[3]\n" );
  print_a ( aa2 + 1, 2 );
	/* aa2 はポインター値なので計算もできる */
  	/* aa2 + 1 = &aa2[1] .. 二つめの要素から二つ表示 */
	/*
	pa == &aa2[1]
	  pa[0] = *(pa+0) = *( &aa2[1] + 0 ) = *&(aa2[1]) = aa2[1]
	  pa[1] = *(pa+1) = *( &aa2[1] + 1 ) = *&(*(aa2+1+1)) = aa2[2]
	*/
  return 0;
}

/*
 *
 */
sample-011.c の実行結果
C:\usr\c\> sample-011
aa1[2]
a0=10
a1=20
aa2[4]
a0=100
a1=200
a2=300
a3=400
aa2[3]
a0=100
a1=200
a2=300
aa2[3]
a0=200
a1=300
C:\usr\c\> 

本日の課題

課題 20111118-01

Download : 20111118-01.c ( SJIS 版 )

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

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

/*
 * 5 個の整数値をキーボードから入力し、それを逆順に出す
 */

#define	DATA_SIZE	5

/*
 *
 */

int main ( void ) {
	int data[ DATA_SIZE ];		/* int 型, サイズ 5 の配列 data を宣言 */
	int i;

	for ( i = 0; i < DATA_SIZE; i++ ) {
		s_print_int ( i );
		s_print_string ( "番目の数値 = " );
		data[i] = s_input_int();
	}

	/*
	** 入力されたデータを逆順に出力
	*/

	for ( i = 0; i < DATA_SIZE; i++ ) {
		s_print_int ( i );
		s_print_string ( "番目の数値 = " );

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

		s_print_newline();
	}

	return 0;
}

/*
 *
 */
入力例
100
3
84
90
123
20111118-01.c の実行結果
C:\usr\c\> 01<  01.in
0番目の数値 = 100
1番目の数値 = 3
2番目の数値 = 84
3番目の数値 = 90
4番目の数値 = 123
0番目の数値 = 123
1番目の数値 = 90
2番目の数値 = 84
3番目の数値 = 3
4番目の数値 = 100
C:\usr\c\> 

課題 20111118-02

Download : 20111118-02.c ( SJIS 版 )

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

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

/*
 * 配列の n 個の要素の総和を求める
 * sum_n
 */

int sum_n ( int array[], int size ) {
	int sum = 0;
	int i;

	for ( i = 0; i < size; i++ ) {

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

	}

	return sum;
}


#define	DATA_SIZE	5

/*
 *
 */

int main ( void ) {
	int data[ DATA_SIZE ];		/* int 型, サイズ 5 の配列 data を宣言 */

	for ( i = 0; i < DATA_SIZE; i++ ) {
		s_print_int ( i );
		s_print_string ( "番目の数値 = " );
		data[i] = s_input_int();
	}

	s_print_string ( "0 〜 4 までの総和 = " );
	s_print_int ( sum_n ( data, 5 ) );
	s_print_newline();

	s_print_string ( "1 〜 3 までの総和 = " );

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

	s_print_newline();


	return 0;
}

/*
 *
 */
入力例
100
3
84
90
123
20111118-02.c の実行結果
C:\usr\c\> 02<  02.in
0番目の数値 = 100
1番目の数値 = 3
2番目の数値 = 84
3番目の数値 = 90
4番目の数値 = 123
0 〜 4 までの総和 = 400
1 〜 3 までの総和 = 177
C:\usr\c\> 

Links