プログラミング実習II 期末試験・想定問題 [S4] 関数

プログラミング実習II 期末試験・想定問題 [S4] 関数


(S4_1) 0以上100以下の整数を入力とし,それが60以上ならそのまま戻り値とし,60未満の場合は0を戻り値とする関数 score_comp を作成せよ.main 関数で試験の成績を入力させ,合格(60点以上)ならばその点数を,不合格ならば 0点を出力するプログラムを完成せよ.
#include <stdio.h>

int score_comp( int );

int main(void)
{
    int score, final;

    printf("試験の点数を入力して下さい>>> ");
    scanf("%d", &score);



    printf("最終成績は %d 点です.\n", final);

    return 0;
}


int score_comp( int score ) {

    int result;





    return result;
}

(S4_2) 以下のプログラムを読み、出力される2つの値(a_sum, a_count)を答えなさい.
#include <stdio.h>

int sum( int[] );
int count( int[] );

int main(void)
{
    int a[] = {3, 9, 18, 2, 14, 6, -1};
    int a_sum, a_count;

    a_sum = sum(a);
    a_count = count(a);

    printf("count = %d, sum = %d\n", a_count, a_sum);

    return 0;
}


int sum( int array[] ) {

    int i, sum=0;

    for( i = 0; array[i] != -1; i++ ){
        sum += array[i];
    }

    return sum;
}

int count( int array[] ) {

    int i = 0, count = 0;

    while( array[i] != -1 ) {
        count++;
        i++;
    }

    return count;
}

(S4_3)下のプログラムは,2つの整数x,yをキーボードから入力し,その和と積を表示するプログラムである. 入力した2つの数の和を計算する関数 sum,さらに2つの数の積を計算する関数 product を作成し,それを利用して計算を行うプログラムを完成せよ.

#include <stdio.h>

/* プロトタイプ宣言*/

int main (void)
{
    int x,y;

    printf("整数xの入力\n");
    scanf("%d",&x);
    printf("整数yの入力\n");
    scanf("%d",&y);

    printf("2つの整数の和は%dです\n", sum(x, y));
    printf("2つの整数の積は%dです\n", product(x, y));

    return 0;
}

/* 和の計算を行う関数を以下に記す */

int sum( int a, int b ){



}

/* 積の計算を行う関数を以下に記す */


(S4_4) ★ 1円=0.013ドル =0.009ユーロ =0.082元とする。 円をドルに変換する関数 int dollar() ユーロに変換する関数 int euro() 元に変換する関数 int gen() を作成し、キーボードから入力した金額をこの関数を呼び出す事で、ドル・ユーロ・元に変換するプログラムを作成せよ.さらに、可能ならばプログラムの実行時に、ドル・ユーロ・元のいずれかを指定する事で、指定した為替に変換出来るようにしてもよい.

(S4_5)★★  キーボードから非負整数nを入力し、順列nPr、組み合わせnCr、重複順列nΠr、 重複組み合わせnHrの値の一覧を作成したい。  rの値は0≦r≦nとする。 次のような手順でプログラムを作成した。

  1. 関数mainにて、キーボードから非負整数nを入力させる部分を作成した。
  2. 階乗を求める関数calculate_factorialを作成した。
  3. 関数calculate_factorialを用いて、順列を求める関数calculate_permutation を作成した。
  4. 関数calculate_factorialと関数calculate_permutationを用いて、組み合わせを 求める関数calculate_combinationを作成した。
  5. 標準ヘッダの一つであるmath.hに含まれている冪乗関数powを用いずに、重複順列を 求める関数calculate_repeated_permutationを作成した。
  6. 関数calculate_combinationを用いて、重複組み合わせを求める関数 calculate_homogeneous_productを作成した。
  7. 作成した階乗を求める関数を除くの4つの関数を用いて、関数mainの中で一覧表を 表示させた。
末尾の空欄のあるプログラム(メインプログラム)を見つつ、次の各問いに答えよ。
  1. プログラムで空欄の箇所[ア]のプログラムを書け。但し、[ア]は作成した5つの関数のプロトタイプ宣言に該当する。
  2. プログラムで空欄の箇所[イ]〜[カ]のプログラムを書け。 但し、[イ]は非負整数nの値をキーボードから入力する部分に該当する。 また、[ウ]〜[カ]は順列を求める関数、組み合わせを求める関数、重複順列を求める 関数、重複組み合わせを求める関数の順でそれぞれ呼び出している。
  3. プログラムで空欄の箇所[キ]〜[ケ]のプログラムを書け。 前述のプログラムの作成手順に沿って、答えるようにすること。 順列nPr、組み合わせnCr、重複順列nΠr、重複組み合わせnHrの式が分からない者は、 各自調べること。
  4. プログラムでは、関数printfを用いて値を表示する際、%2dや%8.0fなどを使っている。 int型の整数24という値に対して%3d、double型の小数2.2360679という値に対して%7.5fを 用いた場合、それぞれどのように表示されるか述べよ。
  5. 非負整数の階乗は整数であるため、階乗を求める関数は次のような、int型の値を返す 関数として定義しても構わない。
        int calculate_factorial( int n )
        {
          int result = 1;
          int i;
    
          for( i = n; i >= 1; i-- ) result *= i;
    
          return result;
        }
    
       しかし、このようにすると、n≦12(12!=479001600)の範囲でしか正常に値を返せなくなってしまう。何故このようなことになるのか、その理由を述べよ。
以下,メインプログラム:
#include <stdio.h>

/* 関数プロトタイプ宣言 */
[ア]

int main( void )
{
  int i, n;

  /* キーボードから値を入力 */
  printf( "非負整数 n を入力して下さい>>> " );
  [イ];

  /* 結果の表示 */
  printf( "\n   n\t r\t         nPr\t    nCr\t              nΠr\t    nHr\n" );
  printf( " ―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\―\\n" );
  for( i = 0; i <= n; i++ )
  {
    printf( "  %2d\t%2d\t%13.0f\t%8.0f", n, i, [ウ], [エ] );
    printf( "\t%18.0f\t%8.0f\n", [オ], [カ] );
  }
}

/* 階乗を求める関数 */
double calculate_factorial( int n )
{
  double result = 1.0;
  int i;

  for( i = n; i >= 1; i-- ) result *= i;

  return result;
}

/* 順列を求める関数 */
double calculate_permutation( int n, int r )
{
  return [キ];
}

/* 組み合わせを求める関数 */
double calculate_combination( int n, int r )
{
  return [ク];
}

/* 重複順列を求める関数 */
double calculate_repeated_permutation( int n, int r )
{
  double result = 1.0;
  int i;

  for( i = 0; i < r; i++ ) result *= n;

  return result;
}

/* 重複組合せを求める関数 */
double calculate_homogeneous_product( int n, int r )
{
  return [ケ];
}