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


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


  1. 値の並べ替え 難易度★☆☆☆☆

    0から51までの52個の数字を重複無くランダムに表示するプログラムを作成しましょう.なお,結果の表示は13個ずつ4行で表示させてください.

     0  1  2  3  4  5  6  7  8  9 10 11 12 
    13 14 15 16 17 18 19 20 21 22 23 24 25 
    26 27 28 29 30 31 32 33 34 35 36 37 38 
    39 40 41 42 43 44 45 46 47 48 49 50 51 
    
    45 46  9 51 22 37  5 23 30  0 26  2 48 
    32 24  7 43 39 10 44 25 20 19 34 38 27 
    15 49 13 14 17 29 47 28  6 16 31 11 40 
    50 21  8  4 18 35 36 33  3  1 12 42 41
    

    改行は剰余を活用します.
  2. 小テスト得点 難易度★★☆☆☆

    5回分の小テストの点数(10点満点)を各学生ごとに表示し,平均点が最も高い学生の情報を最後に表示するプログラムを作成しましょう.

            1  2  3  4  5  Ave.
    S1871:  6  0  2  3  7  3.6
    S1872:  0  5 10  7  6  5.6
    S1873:  1  1 10  0  2  2.8
    S1874:  7  9  9  0  4  5.8
    S1875:  5 10 10  9  0  6.8
    S1876:  7  9  0  3  0  3.8
    S1877: 10  7 10 10  0  7.4
    S1878:  6 10  3  5  6  6.0
    S1879:  7  4  6  7  3  5.4
    S1880:  8  3  1  4  4  4.0
    S1881:  3  7  1  2  4  3.4
    
    
    The highest score
    Student number: S1877
    Average score: 7.4
    
    

    学生番号も部分的に int 型ですので,配列の中に入れておいて表示させることが可能です.
  3. 組み合わせ 難易度★★★☆☆

    2桁の正の整数を乱数により10個発生させます.それらの中で2つの数の和が最も100に近い組み合わせを探すプログラムを作成しましょう.

    81 13 81 83 23 58 73 25 99 69 
    
    Tha pair of which sum is nearest to 100: 73 + 25 = 98
    

    ペアの添字を覚えておくことが必要です.

解答例

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

int fact(int n);

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

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

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

	int i, j, k, tmp, ary[52];
	int check[52]; //重複の有無判定用
	
	for(i=0; i<=51; i++)
	{
		ary[i] = i;
		printf("%2d ", ary[i]);	
		
		if(i%13==12)
		{
			printf("\n");
		}
		
		check[i] = 0;	
	}
	
	printf("\n");
	
	for(i=0; i<=50; i++)
	{
		k = rand() % (51-i);
		
		tmp = ary[k];
		ary[k] = ary[51-i];
		ary[51-i] = tmp;
	}
	
	for(i=0; i<=51; i++)
	{		
		printf("%2d ", ary[i]);
		
		if(i%13==12)
		{
			printf("\n");
		}	
			
		check[i]++;	//数のチェック
	}
	
	printf("\n\n");
	
	int pro = 1;
	
	for(i=0; i<=51; i++)
	{
		pro *= check[i];
	}
	
	if(pro==1)
	{
		printf("OK\n\n");
	}

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

	int max = 0, sum, student, data[6];
	
	printf("       ");
	
	for(i=1; i<=5; i++)
	{
		printf("%2d ", i);
	}
	
	printf(" Ave.\n");
	
	for(i=0; i<=10; i++)
	{
		printf("S%d: ", 1871 + i);
		
		sum = 0;
		
		for(j=1; j<=5; j++)
		{
			data[i] = rand() % 11;
			printf("%2d ", data[i]);
			sum += data[i];
		}
		
		if(sum > max)
		{
			student = i;
			max = sum;
		}
		
		printf(" %.1f\n", (double) sum / 5);
	}
	
	printf("\n\nThe highest score\n");
	printf("Student number: S%d\n", 1871 + student);
	printf("Average score: %.1f\n\n", (double) max / 5);
			
	
	

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

	int ary2[10], sum2, diff, min = 100, ii, jj;
	
	for(i=0; i<=9; i++)
	{
		ary2[i] = rand() % 90 + 10;
		printf("%d ", ary2[i]);
	}
	
	printf("\n\n");
	
	for(i=0; i<=8; i++)
	{
		for(j=i+1; j<=9; j++)
		{
			sum2 = ary2[i] + ary2[j];
			diff = (sum2 - 100) * (sum2 - 100);
			
			if(diff<min)
			{
				ii = i;
				jj = j;
				min = diff;
			}
		}
	}
	
	printf("Tha pair of which sum is nearest to 100: ");
	printf("%d + %d = %d\n\n", ary2[ii], ary2[jj], ary2[ii] + ary2[jj]);
	
	

	printf("--------------------------- 3 --------------------------\n\n");
	
	return(0);
}