Powered by SmartDoc

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

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

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

本日の概要

関数( Text p.114 - 125 )

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

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 二つの整数の大きい方の値を返す関数
 *	List 6-1 ( p.115 )
 */

#include <stdio.h>

/*
 * 大きい方の値を返す
 */

int maxof ( int x, int y ) {

  if ( x > y ) {	/* x と y を大小比較 */
    return x;		/* x が大きい時は x の値を返す */
  } else {
    return y;		/* そうでなければ y の値を返す */
  }
}

/*
 * main
 */

int main ( void ) {
  int na;
  int nb;

  puts ( "二つの整数を入力してください。" );

  printf ( "整数 1:" );
  scanf ( "%d", &na );

  printf ( "整数 2:" );
  scanf ( "%d", &nb );

  printf ( "大きい方の値は %d です。\n", maxof ( na, nb ) );

  return 0;
}
入力例
83
45
sample-001.c の実行結果
C:\usr\c\> sample-001
二つの整数を入力してください。
整数 1:整数 2:大きい方の値は 83 です。
C:\usr\c\> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 関数を利用しない場合
 *	cf. sample-001.c
 */

#include <stdio.h>

/*
 * main
 */

int main ( void ) {
  int na;
  int nb;
  int maxof;	/* 関数の値を入れる変数 : 関数の定義の代わりに関数の値を取る変数を用意 */

  puts ( "二つの整数を入力してください。" );

  printf ( "整数 1:" );
  scanf ( "%d", &na );

  printf ( "整数 2:" );
  scanf ( "%d", &nb );

/*
 * 大きい方の値を返す
 */

  {	/* 関数本体 : 新しいブロックを作ると、そこで変数の宣言ができる */

    /* 関数呼び出し「maxof ( na, nb )」に相当する部分 */

    int x = na;	/* 仮引数 x を宣言し、それに実引数 na の値を代入 */
    int y = nb;	/* 仮引数 y を宣言し、それに実引数 nb の値を代入 */

    if ( x > y ) {	/* x と y を大小比較 */
      /* return x; */	/* x が大きい時は x の値を返す */
      maxof = x;	/* 値を返すという事は、関数の値を決めている事に相当する */
		/* return には、もう一つ、関数を終了するという意味もある */
    } else {
      /* return y; */	/* そうでなければ y の値を返す */
      maxof = y;
    }
  }

  /* この時点で、変数 maxof には na と nb の大きい方の値が入っている */

  printf ( "大きい方の値は %d です。\n", maxof );

  return 0;
}
入力例
83
45
sample-002.c の実行結果
C:\usr\c\> sample-002
二つの整数を入力してください。
整数 1:整数 2:大きい方の値は 83 です。
C:\usr\c\> 

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 三つの int 型整数の最大値を返す関数
 *	List 6-2 (text p.118)
 */

#include <stdio.h>

/*
 * 三つの int 型整数の最大値を返す関数
 */

int max3 ( int x, int y, int z ) {
  int max = x;	/* とりあえず最大値の候補として x を採択 */

  if ( y > max ) {	/* y と現在の候補値を比較し */
    max = y;		/* y の方が大きいならば、y を候補値とする */
  }		/* そうでなければそのまま */

  if ( z > max ) {	/* 同様に、z と現在の候補値を比較し */
    max = z;		/* z の方が大きいならば、z を候補値とする */
  }		/* そうでなければそのまま */

  return max;		/* 最終的な結果が、三つの数内の最大値 */
}

/*
 * 動作を確認する main 関数
 */

int main ( int argc, char *argv[] ) {
  int na;
  int nb;
  int nc;

  puts ( "三つの整数を入力してください。\n" );

  printf ( "整数 1:");
  scanf ( "%d", &na );

  printf ( "整数 2:");
  scanf ( "%d", &nb );

  printf ( "整数 3:");
  scanf ( "%d", &nc );

  printf ( "最も大きい値は %d です。\n", max3 ( na, nb, nc ) );

  return 0;
}
入力例
83
45
25
sample-003.c の実行結果
C:\usr\c\> sample-003
三つの整数を入力してください。

整数 1:整数 2:整数 3:最も大きい値は 83 です。
C:\usr\c\> 

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 二つの整数の二乗の差を求める
 *	List 6-3 (text p.119)
 */

#include <stdio.h>

/*
 * 二乗値を返す
 */

int sqr ( int x ) {

  return x * x;
}

/*
 * 二つの数の差を返す
 */

int diff ( int x, int y ) {

  return (x > y) ? (x - y) : (y - x);
}

/*
 * 動作を確認する main 関数
 */

int main ( int argc, char *argv[] ) {
  int kx;
  int ky;
  int kx2;
  int ky2;

  puts ( "二つの整数を入力してください。\n" );

  printf ( "整数 kx:");
  scanf ( "%d", &kx );

  printf ( "整数 ky:");
  scanf ( "%d", &ky );

  kx2 = sqr ( kx );
  ky2 = sqr ( ky );

  printf ( "kx の二乗と ky の二乗の差は %d です。", diff ( kx2, ky2 ) );

  return 0;
}
入力例
23
49
sample-004.c の実行結果
C:\usr\c\> sample-004
二つの整数を入力してください。

整数 kx:整数 ky:kx の二乗と ky の二乗の差は 1872 です。C:\usr\c\> 

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * べき乗を求める
 *	List 6-4 (text p.120)
 */

#include <stdio.h>

/*
 * dx の no 乗を返す
 */

double power ( double dx, int no ) {
  int i;
  double temp = 1.0;

  for ( i = 0; i < no; i++ ) {
    temp = temp * dx;
  }

  return temp;
}

/*
 * 動作を確認する main 関数
 */

int main ( int argc, char *argv[] ) {
  double x;
  int n;

  printf ( "実数を入力してください : ");
  scanf ( "%lf", &x );

  printf ( "整数を入力してください : ");
  scanf ( "%d", &n );

  printf ( "%.2f の %d 乗は %.2f です。", power ( x, n ) );

  return 0;
}
入力例
4.0
3
sample-005.c の実行結果
C:\usr\c\> sample-005
実数を入力してください : 整数を入力してください : 64.00 の -1078401560 乗は 4.00 です。C:\usr\c\> 

課題

関数

課題20100618-1
三つのint型整数の最小値を返す関数(Text p.118演習問題6-2)
課題20100618-1の穴埋め
課題
/*
 * [参考] Ex. 6-2 (text p.118)
 * [比較] 2010/06/18 List 6-2
 */

/*
 * 三つの int 型整数の最小値を返す関数
 */

#include <stdio.h>

/*
 * 三つの int 型整数の最大値を返す関数
 */

int min3 ( int x, int y, int z ) {

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

}

/*
 * 動作を確認する main 関数
 */

int main ( int argc, char *argv[] ) {
  int na;
  int nb;
  int nc;

  puts ( "三つの整数を入力してください。\n" );

  printf ( "整数 1:");
  scanf ( "%d", &na );

  printf ( "整数 2:");
  scanf ( "%d", &nb );

  printf ( "整数 3:");
  scanf ( "%d", &nc );

  printf ( "最も小さい値は %d です。\n", min3 ( na, nb, nc ) );

  return 0;
}
出力例
出力例
C:\usr\c\> 20100618-1
三つの整数を入力してください。

整数 1:整数 2:整数 3:最も小さい値は 25 です。
C:\usr\c\> 
課題20100618-2
int型整数の四乗値を返す関数(Text p.121演習問題6-4)
課題20100618-2の穴埋め
課題
/*
 * [参考] Ex. 6-4 (text p.121)
 * [比較] 2010/06/18 List 6-3
 */

/*
 * int 型整数の四乗値を返す関数
 */

#include <stdio.h>

/*
 * int 型整数の二乗値を返す関数
 */

int sqr ( int x ) {

   return x * x;
}


/*
 * int 型整数の四乗値を返す関数 : ヒント : sqr は利用してよい
 */

int pow4 ( int x ) {

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

}

/*
 * 動作を確認する main 関数
 */

int main ( int argc, char *argv[] ) {
    int n;

    puts ( "一つの整数を入力してください。\n" );
    printf ( "整数:"); scanf ( "%d", &n );

    printf ( "%d の4乗値は %d です。\n", n, pow4 ( n ) );

    return 0;
}
入力例
入力例
3

出力例
出力例
C:\usr\c\> 20100618-2
一つの整数を入力してください。

整数:3 の4乗値は 81 です。
C:\usr\c\> 
課題20100618-3
警報をno回だけ発する関数(Text p.123演習問題6-5)
課題20100618-3の穴埋め
課題
/*
 * [参考] Ex. 6-5 (text p.123)
 * [比較] 2010/06/18 List 6-3
 */

/*
 * 警報を no 回だけ発する関数
 */

#include <stdio.h>

/*
 * 文字 ch を no 個連続表示
 */

void put_nchar ( int ch, int no ) {

     while ( no-- > 0 ) {
        putchar ( ch );
     }
}

/*
 * 警報を no 回だけ発する関数
 */

void alert ( int no ) {

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

}

/*
 * 動作を確認する main 関数
 */

int main ( int argc, char *argv[] ) {
    int n;

    puts ( "一つの整数を入力してください。\n" );
    printf ( "整数:"); scanf ( "%d", &n );

    printf ( "%d 回数ベルを鳴らします\n", n );
    alert ( n );

    return 0;
}
入力例
入力例
3

出力例
出力例
C:\usr\c\> 20100618-3
一つの整数を入力してください。

整数:3 回数ベルを鳴らします
^G^G^GC:\usr\c\> 
課題20100618-4
画面に「こんにちは。」と表示して改行を行う関数(Text p.125演習問題6-6)
課題20100618-4の穴埋め
課題
/*
 * [参考] Ex. 6-6 (text p.125)
 * [比較] 2010/06/18 List 6-3
 */

/*
 * 画面に「こんにちは。」を表示して改行を行う関数
 */

#include <stdio.h>

/*
 * 画面に「こんにちは。」を表示して改行を行う関数
 */

void hello ( void ) {

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

}

/*
 * 動作を確認する main 関数
 */

int main ( int argc, char *argv[] ) {
    int n;

    hello();

    return 0;
}
出力例
出力例
C:\usr\c\> 20100618-4
こんにちは。
C:\usr\c\> 

参考 Link

-->