Powered by SmartDoc

ソフトウェア概論B (2010/01/15)
Ver. 1.0

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

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

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

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 順次 : プログラムは上から下へ実行される
 */

#include <stdio.h>

/*
 * main
 */

int main ( void ) {

  /* 処理を上から下に並べれば、その順に処理が実行される */

  printf ( "1: このメッセージ 1 が、最初に表示されます。\n" );
  printf ( "2: 次に、このメッセージ 2 が、表示されます。\n" );
  printf ( "3: 最後に、このメッセージ 3 が、表示されます。\n" );

  return 0;
}
sample-001.c の実行結果
C:\usr\c\> sample-001
1: このメッセージ 1 が、最初に表示されます。
2: 次に、このメッセージ 2 が、表示されます。
3: 最後に、このメッセージ 3 が、表示されます。
C:\usr\c\> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 選択: if 文を利用すれば、条件によって、処理を選択できる
 */

#include <stdio.h>

/*
 * main
 */

int main ( void ) {
  FILE	*fp;

  /* if 文を利用すれば、複数の処理を条件によって選択して実行できる */

  if ( ( fp = fopen ( "sample-010.c", "r" ) ) != NULL ) {
    /* ファイル 「sample-010.c」があればオープンに成功する */
    printf ( "今日のサンプルは 10 個数以上も有るらしい。\n" );
    fclose ( fp ); /* オープンに成功した場合はクローズが必要 */
  } else {
    /* オープンに失敗したのでファイルが存在しない */
    printf ( "今日のサンプルは 10 個より少いので楽勝\n" );
  }

  return 0;
}
sample-002.c の実行結果
C:\usr\c\> sample-002
今日のサンプルは 10 個より少いので楽勝
C:\usr\c\> 

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 繰返し: 同じ命令を繰り返し実行する様に指定できる
 */

#include <stdio.h>

/*
 * main
 */

int main ( void ) {
  int i;

  printf ( "これから同じ「こんにちは !!」というメッセージを 10 回表示します。\n" );

  /* for 文などを利用すれば、同じ命令を何度も繰り返す事ができる */
  for ( i = 0; i < 10; i++ ) {
    /* 実行する回数は、プログラムの長さと関係ない
      10 回を -> 99 回として、実行回数を 10 倍近くにしても
      プログラムの長さは同じ */

    printf ( "こんにちは !!\n" );
  }

  printf ( "これだけ挨拶すれば十分かな ?\n" );

  return 0;
}
sample-003.c の実行結果
C:\usr\c\> sample-003
これから同じ「こんにちは !!」というメッセージを 10 回表示します。
こんにちは !!
こんにちは !!
こんにちは !!
こんにちは !!
こんにちは !!
こんにちは !!
こんにちは !!
こんにちは !!
こんにちは !!
こんにちは !!
これだけ挨拶すれば十分かな ?
C:\usr\c\> 

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 手続きの基本構造 (入力, 処理, 出力)
 */

#include <stdio.h>

/*
 * main
 */

int main ( void ) {
  int a;		/* 足される数を保存する変数 */
  int b;		/* 足す数を保存する変数 */
  int c;		/* 足した結果を保存する変数 */

  /* 入力 : 計算に必要なデータを変数に取り込む */

  printf ( "足される数を入力してください\n" );
  scanf ( "%d", &a );

  printf ( "足す数を入力してください\n" );
  scanf ( "%d", &b );

  /* 処理 : 二つの数を足し合わせて、その結果を変数に保存する */

  c = a + b;

  /* 出力 : 処理結果の返す */

  printf ( "%d と %d の和は %d です\n", a, b, c );

  return 0;
}
入力例
23
49
sample-004.c の実行結果
C:\usr\c\> sample-004
足される数を入力してください
足す数を入力してください
23 と 49 の和は 72 です
C:\usr\c\> 

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 関数 : 手続きに名前を付けたもの
 */

#include <stdio.h>

/*
 * wa : 二つの数を和を計算する関数
 *	引数で与えられた二つの数の和を計算し、その結果を返す
 */

int wa ( int a, int b ) {
  int c;

  /* 入力 : 入力は、引数の形で与えられる */



  /* 処理 : 処理の部分は同じ */

  c = a + b;

  /* 出力 : 出力は計算結果を、return 文で指定する */

  return c;

}

/*
 * main
 */

int main ( void ) {
  int a;		/* 足される数を保存する変数 */
  int b;		/* 足す数を保存する変数 */
  int c;		/* 足した結果を保存する変数 */

  /* 入力 : 計算に必要なデータを変数に取り込む */

  printf ( "足される数を入力してください\n" );
  scanf ( "%d", &a );

  printf ( "足す数を入力してください\n" );
  scanf ( "%d", &b );

  /* 処理 : wa の結果を変数に保存する */

  /* 関数呼び出し : 処理を wa に依頼
   *    処理(計算) に必要な情報 (a,b) を、引数の形で与えると
   *    処理結果が、関数値として戻ってくるので、それを変数 (c) に代入する
   */

  c = wa ( a, b );

  /* 出力 : 処理結果の返す */

  printf ( "%d と %d の和は %d です\n", a, b, c );

  return 0;
}
入力例
23
49
sample-005.c の実行結果
C:\usr\c\> sample-005
足される数を入力してください
足す数を入力してください
23 と 49 の和は 72 です
C:\usr\c\> 

sample-006

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * アルゴリズムの例 : ユークリッドの互除法
 */

#include <stdio.h>

/*
 * euclid : ユークリッドの互除法を利用して二つの自然数の最大公約数を求める
 */

int euclid ( int m, int n ) {

  /* ユークリッドの互除法で最大公約数を求める */

  while ( m != n ) {	/* 二つの数が異る間、以下の作業を繰り返す */
    /* 大きい方の数を小さい方数だけ減らす */
    if ( m > n ) {	/* m の方が大きい */
      m = m - n;	/* m を n だけ減らす */
    } else {		/* n の方が大きい */
      n = n - m;	/* n を m だけ減らす */
    }
  }

  /* ここに来たということは、 m == n が成立している */
  /* 実は、その値が、最初の m, n の値の最大公約数 */

  return m;		/* その値を最大公約数として返す */
}

/*
 * main
 */

int main ( void ) {
  int m;		/* 一つ目の自然数 */
  int n;		/* 二つ目の自然数 */
  int c;		/* 最大公約数を保存する変数 */

  /* 入力 : 計算に必要なデータを変数に取り込む */

  printf ( "一つ目の自然数を入力してください\n" );
  scanf ( "%d", &m );

  printf ( "二つ目の自然数を入力してください\n" );
  scanf ( "%d", &n );

  /* 処理 : 関数 euclid を利用して、最大公約数を求める */

  c = euclid ( m, n );

  /* 出力 : 処理結果を画面に出力 */

  printf ( "%d と %d の最大公約数は %d\n", m, n, c );

  return 0;
}
入力例
24
18
sample-006.c の実行結果
C:\usr\c\> sample-006
一つ目の自然数を入力してください
二つ目の自然数を入力してください
24 と 18 の最大公約数は 6
C:\usr\c\> 

sample-007

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * ユークリッドの互除法 (再帰版)
 */

#include <stdio.h>

/*
 * euclid : ユークリッドの互除法を利用して二つの自然数の最大公約数を求める
 */

int euclid ( int m, int n ) {

  /* ユークリッドの互除法で最大公約数を求める */

  if ( m == n ) {	/* 二つの数が同じ */
    return m;		/* その数が答 */
  } else {		/* そうでなければ、大きい方から小さい数を引いて.. */
    if ( m > n ) {	/* m の方が大きい */
      return euclid ( m - n, n );	/* 再帰 */
    } else {		/* n の方が大きい */
      return euclid ( m, n - m );	/* 再帰 */
    }
  }
}

/*
 * main
 */

int main ( void ) {
  int m;		/* 一つ目の自然数 */
  int n;		/* 二つ目の自然数 */
  int c;		/* 最大公約数を保存する変数 */

  /* 入力 : 計算に必要なデータを変数に取り込む */

  printf ( "一つ目の自然数を入力してください\n" );
  scanf ( "%d", &m );

  printf ( "二つ目の自然数を入力してください\n" );
  scanf ( "%d", &n );

  /* 処理 : 関数 euclid を利用して、最大公約数を求める */

  c = euclid ( m, n );

  /* 出力 : 処理結果を画面に出力 */

  printf ( "%d と %d の最大公約数は %d\n", m, n, c );

  return 0;
}
入力例
24
18
sample-007.c の実行結果
C:\usr\c\> sample-007
一つ目の自然数を入力してください
二つ目の自然数を入力してください
24 と 18 の最大公約数は 6
C:\usr\c\> 

sample-008

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 色々な型のデータの入出力
 */

#include <stdio.h>

/*
 * main
 */

int main ( void ) {
  int iv;		/* 整数型 */
  float fv;		/* 単精度浮動小数点型 */
  char sv[10];		/* 文字列 */
//  double dv;		/* 倍精度浮動小数点型 */

  /* 入力 */

  scanf ( "%d", &iv );		/* 型によって書式指定が異なる */
  scanf ( "%f", &fv );
  scanf ( "%s", sv );
//  scanf ( "%lf", &dv);

  /* 出力 */

  printf ( "iv=%d\n", iv );	/* 型によって書式指定が異なる */
  printf ( "fv=%f\n", fv );
  printf ( "sv=%s\n", sv );
//  printf ( "dv=%f\n", dv );

  return 0;
}
入力例
1
1
1
sample-008.c の実行結果
C:\usr\c\> sample-008
iv=1
fv=1.000000
sv=1
C:\usr\c\> 

sample-009

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 色々な型のデータの入出力
 */

#include <stdio.h>

/*
 * main
 */

int main ( void ) {
  int iv;		/* 整数型 */
  float fv;		/* 単精度浮動小数点型 */
  char sv[10];		/* 文字列 */

  /* 入力 */

  scanf ( "%d", &iv );
  scanf ( "%d", &fv );		/* 書式指定を間違えると.. */
  scanf ( "%s", sv );

  /* 出力 */

  printf ( "iv=%d\n", iv );	/* 型によって書式指定が異なる */
  printf ( "fv=%f\n", fv );
  printf ( "sv=%s\n", sv );

  return 0;
}
入力例
1
1
1
sample-009.c の実行結果
C:\usr\c\> sample-009
iv=1
fv=0.000000
sv=1
C:\usr\c\> 

sample-010

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 様々な演算子
 */

#include <stdio.h>

/*
 * main
 */

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

  printf ( "一つ目の数\n" );
  scanf ( "%d", &a );

  printf ( "二つ目の数\n" );
  scanf ( "%d", &b );


  printf ( "%d + %d = %d\n", a, b, a + b );	/* 演算子 '+' */
  printf ( "%d - %d = %d\n", a, b, a - b );	/* 演算子 '-' */
  printf ( "%d & %d = %d\n", a, b, a & b );	/* 演算子 '&' */
  printf ( "%d && %d = %d\n", a, b, a && b );	/* 演算子 '&&' */

  return 0;
}
入力例
6
3
sample-010.c の実行結果
C:\usr\c\> sample-010
一つ目の数
二つ目の数
6 + 3 = 9
6 - 3 = 3
6 & 3 = 2
6 && 3 = 1
C:\usr\c\> 

課題

復習 / 試験対策

課題20100122-01
再帰を利用して、与えられた引数で与えられた整数値を二進数表記で出力しなさい。
課題20100122-02
様々な型のデータを入力し、それをそのままに出力するプログラムを作成しなさい。
課題20100122-03
様々な演算を行い、その結果を出力するプログラムを作成しなさい。