Java 入社試験問題
関係データベースに関する次の記述を読んで、設問1,2に答えよ

ある情報システム開発会社は、顧客であるA社の組織情報を関係データベースに することになり、まず、部署と、所属についての設計を行った。
A社の部門は、英字2文字からなる部門コードで一意に識別できる。 A社の社員は、4桁の数字からなる社員番号で一意に識別でき、必ず一つの部門に所属しているものとする。
図1に A 社の部門と所属の情報を示す。括弧内は、部門コード又は社員番号である。 A社の部門と所属情報

設問1 次の記述中の  に入れる正しい答えを、解答群から選べ。

情報システム開発会社の初級技術者 B 君は、案1と案2の二つの関係データベースの構造を考えた。しかし、上級技術者から、案1と案2の両方で、A社の組織を現すには 不都合な  という現象が起こり、案1では、さらに  という不都合な現象も起こると指摘された。
そこで B 君は、指摘に基づき、案3を考えた。
案1~3を、図2に示す。下線は、その項目が主キーであることを表す。案1〜3解答群
 ア 転属した社員の所属部門を、変更することができない
 イ 新入社員を、登録することができない
 ウ 退職した社員を、削除することができない
 エ 同姓同名の社員を、登録することができない
 オ 配属者未定の新設部門を、登録することができない

設問2 次の記述中の  に入れる正しい答えを、解答群の中から選べ。

A 社の制度が変更され、社員が本務として所属する部門に加え、その他の1部門までの兼務ができることになった。
このたび、新設部門として宣伝(SD)部門が設置され、本務が営業(EG)である綾瀬恵と 本務が庶務(SM)である、上戸満夫が、兼務として宣伝(SD)に配属されることになった。
B君は、これらに対応し、どの項目の内容も空にならない案4を考えた。
案4のデータベース構造において、今回の制度の変更、部門の新設および配属の後、兼務の登録件数(行数)は、  となる。
案4を図3に示す。下線は、その項目が主キーであることを表す。 案4 cに関する解答群
ア 1 イ 2 ウ 3 エ 4 オ 5 d,eに関する解答群
ア 氏名 イ 社員番号 ウ 部門コード

問題(C言語)
問1 次のCプログラムの説明及びプログラムを読んで、設問1,2に答えよ

[プログラムの説明]
リーグ戦の勝敗表を出力するプログラムである。
(1) 勝敗表の出力例を図1に示す。

チーム名 勝ち 負け 勝率
Bishops27230.540
Kings33170.660
Knights27230.540
Pawns12380.240
Queens32180.640
Rooks19310.380

(2) チームの勝敗情報は構造体RECORDで表現する。引き分けはないものとする。

	typedef struct {			/* 勝敗情報 */
		char   name[MAX_LENGTH+1];	/* チーム名 */
		int    wins;     		/* 勝ち数 */
		int    losses;   		/* 負け数 */
		double average;  		/* 勝率 */
	} RECORD;

全チームの勝敗情報は構造体RECORDの配列teamに格納されている。
チーム名、勝ち数、負け数はあらかじめ格納されているが、勝率は格納されていない。

(3) プログラム中の関数calcAverageとprintの仕様は次のとおりである。

        void calcAverage()
         機能:全チームの勝率を計算し、それぞれのメンバaverageに格納する。
           試合数が0の場合、勝率は0.0とする。
        void print()
         機能:勝敗表を出力する。

[プログラム1]
	#include <stdio.h>
	#define TEAMNUM 6                 	/* チーム数 */
	#define MAX_LENGTH 10             	/* チーム名の長さの上限 */
	
	typedef struct {                  	/* 勝敗情報 */
		char  name[MAX_LENGTH+1];     /* チーム名 */
		int   wins;                   /* 勝ち数 */
		int   losses;                 /* 負け数 */
		double  average;                /* 勝率 */
	} RECORD;
	
	void calcAverage();
	void print();
	RECORD team[TEAMNUM];
	
	void calcAverage(){
		int i, total;
		for(i = 0; i < TEAMNUM; i++){
			total = team[i].wins + team[i].losses;
				if(  ){
					team[i].average = 0.0;
				} else {
					   ;
				}
			}
		}

	void print(){
		int i;
		calcAverage();
		printf("チーム名  勝ち  負け  勝率\n");
		for(i = 0; i < TEAMNUM; i++){
			printf("%-10s %4d %4d  %5.3f\n",
				team[i].name, team[i].wins,
				team[i].losses, team[i].average);
		}
	}
						
設問1 プログラム1中の  に入れる正しい答えを、解答群の中から選べ。
	aに関する解答群
		ア team[i].average < 0.0	イ team[i].average > 0.0
		ウ total != 0			エ total == 0
					  
	bに関する解答群
		ア (double)team[i].average = team[i].wins / total
		イ team[i].average = (double)(team[i].wins / total)
		ウ team[i].average = (double)team[i].wins / total
		エ team[i].average = team[i].wins / total
設問2 順位の項目を加え、勝率の高いチームから順に出力する関数printRankを作成した。
勝率順の勝敗表の出力例を図2に示す。勝率が同率の場合は同順位とする。
順位 チーム名 勝ち 負け 勝率
1Kings3317 0.660
2Queens32180.640
3Bishops27230.540
3Knights27230.540
5Rooks19310.380
6Pawns12380.240

図2  勝率順の勝敗表の出力例

処理手順は次のとおりである。
(1)TEAMNUM個の要素をもつポインタ配列pTeamを定義する。
(2)配列teamの各要素のアドレスを,先頭要素から順番に配列pTeamの各要素に格納する。これによ
って要素番号iに対応するチームの勝率team[i].averageは,pTeam[i]->averageによっても参照
できる。
(3)配列team自体を整列する代わりに配列pTeamの要素を整列して,勝率順の勝敗表を出力する。
次の関数があらかじめ定義されているものとする。
void sort(RECORD *pTeam[TEAMNUM])
機能:TEAMNUM個の要素からなり、各要素がRECORD型の構造体へのポインタである配列
pTeamの要素を、勝率の降順になるように整列する。
プログラム2中の  に入れる正しい答えを、解答群の中から選べ。
[プログラム 2]
  	void printRank();
  	void sort(RECORD *[TEAMNUM]);
  	
  	void printRank(){
  		int i;
  		int rank = 1;
  		RECORD *pTeam[TEAMNUM];
  		
  		calcAverage();
  		for(i = 0; i < TEAMNUM; i++){
			  
  		}
  		sort(pTeam);
  		printf("順位 チーム名 勝ち 負け 勝率\n");
  		for(i = 0; i < TEAMNUM; i++){
  			if(i > 0){
  				if(pTeam[i]->average != pTeam[i-1]->average){
					  
  				}
  			}
  			
  		printf("%1d	%-10s %4d %4d	%5.3f\n", rank,
  			  ->wins,
  			  ->average);
  		}
  	}
	
cに関する解答群
ア pTeam[i] = &team[i]	 イ pTeam[i] = team
ウ team[i] = **pTeam エ team[i] = *pTeam[i]
		
dに関する解答群
ア rank++ イ rank = i ウ rank = i + 1 エ rank = TEAMNUM - (i + 1)
オ rank = TEAMNUM - i
		
eに関する解答群
ア (&team[i]) イ (&team[rank]) ウ pTeam[i] エ pTeam[rank]