ある情報システム開発会社は、顧客であるA社の組織情報を関係データベースに
することになり、まず、部署と、所属についての設計を行った。
A社の部門は、英字2文字からなる部門コードで一意に識別できる。
A社の社員は、4桁の数字からなる社員番号で一意に識別でき、必ず一つの部門に所属しているものとする。
図1に A 社の部門と所属の情報を示す。括弧内は、部門コード又は社員番号である。
情報システム開発会社の初級技術者 B 君は、案1と案2の二つの関係データベースの構造を考えた。しかし、上級技術者から、案1と案2の両方で、A社の組織を現すには 不都合な という現象が起こり、案1では、さらに
という不都合な現象も起こると指摘された。
そこで B 君は、指摘に基づき、案3を考えた。
案1~3を、図2に示す。下線は、その項目が主キーであることを表す。解答群
ア 転属した社員の所属部門を、変更することができない
イ 新入社員を、登録することができない
ウ 退職した社員を、削除することができない
エ 同姓同名の社員を、登録することができない
オ 配属者未定の新設部門を、登録することができない
A 社の制度が変更され、社員が本務として所属する部門に加え、その他の1部門までの兼務ができることになった。
このたび、新設部門として宣伝(SD)部門が設置され、本務が営業(EG)である綾瀬恵と
本務が庶務(SM)である、上戸満夫が、兼務として宣伝(SD)に配属されることになった。
B君は、これらに対応し、どの項目の内容も空にならない案4を考えた。
案4のデータベース構造において、今回の制度の変更、部門の新設および配属の後、兼務の登録件数(行数)は、 となる。
案4を図3に示す。下線は、その項目が主キーであることを表す。
cに関する解答群
ア 1 イ 2 ウ 3 エ 4 オ 5
d,eに関する解答群
ア 氏名 イ 社員番号 ウ 部門コード
[プログラムの説明]
リーグ戦の勝敗表を出力するプログラムである。
(1) 勝敗表の出力例を図1に示す。
チーム名 | 勝ち | 負け | 勝率 |
Bishops | 27 | 23 | 0.540 |
Kings | 33 | 17 | 0.660 |
Knights | 27 | 23 | 0.540 |
Pawns | 12 | 38 | 0.240 |
Queens | 32 | 18 | 0.640 |
Rooks | 19 | 31 | 0.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()
機能:勝敗表を出力する。
#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( |
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
順位 | チーム名 | 勝ち | 負け | 勝率 |
1 | Kings | 33 | 17 | 0.660 |
2 | Queens | 32 | 18 | 0.640 |
3 | Bishops | 27 | 23 | 0.540 |
3 | Knights | 27 | 23 | 0.540 |
5 | Rooks | 19 | 31 | 0.380 |
6 | Pawns | 12 | 38 | 0.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中の
に入れる正しい答えを、解答群の中から選べ。
void printRank(); void sort(RECORD *[TEAMNUM]); void printRank(){ int i; int rank = 1; RECORD *pTeam[TEAMNUM]; calcAverage(); for(i = 0; i < TEAMNUM; i++){ |
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]