基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成19年 春期 基本情報技術者 午後 問10
問10   C言語

次のCプログラムの説明及びプログラムを読んで,設問1,2に答えよ。

〔プログラムの説明〕

リーグ戦の勝敗表を出力するプログラムである。

(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

  図1 勝敗表の出力例

(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

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

基本情報技術者試験


設問2 順位の項目を加え,勝率の高いチームから順に出力する関数 printRank を作成した。 勝率順の勝敗表の出力例を図2に示す。勝率が同率の場合は同順位とする。


    順位  チーム名  勝ち  負け  勝率
    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中の に入れる正しい答えを,解答群の中から選べ。

〔プログラム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, 
                  ->name,
 ->wins, 
                  ->losses,
 ->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]

解答 c ←クリックすると正解が表示されます

解答 d ←クリックすると正解が表示されます

解答 e ←クリックすると正解が表示されます


[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]