プログラミング入門II 確認テスト 2019.05.27

Back


解答に際しては以下のことに注意すること.


  1. 約数表示 難易度★☆☆☆☆

    6桁の正の整数を乱数によりどれか一つ発生させ,その整数の約数を全て表示するプログラムを作成します.約数表示部分を関数とするプログラムを作ってください.

    Divisors of 965576 : 1 2 4 8 137 274 548 881 1096 1762 3524 7048 120697 241394 482788 965576
    

  2. 階乗冪の計算 難易度★★☆☆☆

    階乗冪(べき)とは以下の式で表現される操作です.

    n
    Π(x + k -1) = x(x+1)(x+2)・・・(x+n-1)
    k=1

    以下に示す階乗の再帰関数を参考に,階乗冪の計算を行うプログラムを作成します.

    変数 x として,3〜6の整数を, n として5〜7の整数をそれぞれ乱数により発生させて,階乗冪の値を求めるプログラムとしましょう.

    int fact(int n)	//階乗の再帰関数
    {
    	if(n==1)
    	{
    		return 1;
    	}
    	else
    	{
    		return n * fact(n-1);
    	}
    }
    

    Factorial power P(x=6,n=7) = 3991680
    

  3. 標準偏差 難易度★★☆☆☆

    50〜59までの整数を乱数により10個発生させて,それらの平均値と標準偏差(不偏分散の平方根)を自作関数により求めるプログラムを作成します.double型の平均と標準偏差を求める関数をそれぞれ用意して作りましょう.

    54 55 52 59 51 52 59 54 58 54 
    Mean: 54.8
    Standard deviation: 2.94
    

    配列を学習していないので,手作業で標準偏差を求める必要があります.で,残差Sを求める式はどうでしたっけね?

    S = Σ(x i - m)2 = Σ x i 2 - (Σ x i )2 / n

解答例

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

void divisor(int n);
int fact(int n);
double mean(int n, int sum);
double stdev(int n, int sum, int sum2);

int main()
{
	srand((unsigned) time(NULL));

//	まずは学生番号と氏名を入力してください.
	
	printf("プログラミング入門II 確認テスト 2019.05.27\n\n");
	printf("学生番号:                      \n");
	printf("氏名:                          \n\n");

	printf("【1】\n\n");
//    1.の解答はこの下の部分に記入すること           

	int num = rand() % 900000 + 100000;
	
	printf("Divisors of %d : ", num);
	
	divisor(num);
	
	printf("\n");
	

	printf("--------------------------- 1 --------------------------\n\n");
	
	printf("【2】\n\n");
//    2.の解答はこの下の部分に記入すること          

	int n = rand() % 3 + 5;
	int	x = rand() % 4 + 3;

	printf("Factorial power P(x=%d,n=%d) = %d\n\n", x, n, fact(x+n-1)/fact(x-1));


	printf("--------------------------- 2 --------------------------\n\n");
	
	printf("【3】\n\n");
//    3.の解答はこの下の部分に記入すること          

	int i, nn = 10, num2, sum = 0, sum2 = 0;
	
	for(i=1; i<=nn; i++)
	{
		num2 = rand() % 10 + 50;
		printf("%d ", num2);
		
		sum += num2;
		sum2 += num2 * num2;
	}
		
	printf("\nMean: %.1f\n", mean(nn, sum));
	printf("Standard deviation: %.2f\n\n", stdev(nn, sum, sum2));


	printf("--------------------------- 3 --------------------------\n\n");
	printf("********************** End of Text *********************\n\n");
	
	return(0);
}

//自作関数はここ以降に記述すること

void divisor(int n)
{
	int i;
	
	for(i=1; i<=n; i++)
	{
		if(n%i==0)
		{
			printf("%d ", i);
		}
	}
	
	printf("\n");
}

int fact(int n)
{
	if(n==0)
	{
		return 1;
	}
	else
	{
		return n * fact(n-1);
	}
}

double mean(int n, int sum)
{
	return (double) sum / n;
}

double stdev(int n, int sum, int sum2)
{
	double ss;
	
	ss = sum2 - (double) sum * sum / n;
	return sqrt(ss / (n - 1));
}

Back