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

平成28年 秋期 基本情報技術者 午後 問09
問09   C言語

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

 

〔プログラム1の説明〕

 U社では,半年ごとに社内システムの見直しを行い,4月と 10 月に新たに開発又は 改修するサブシステム(以下,対象サブシステムという)を決定し, 開発又は改修作業(以下,開発作業という)を実施している。 対象サブシステムは複数あり,それぞれに対して目標作業終了日が設定される。 二つ以上の対象サブシステムの開発作業を同時に実施することはない。 各対象サブシステムについて,開発リソースの制約があるので, 必ずしも目標作業終了日までに開発作業を終了できるとは限らない。しかし, 開発作業の終了が目標作業終了日よりも遅れる日数(以下,遅延日数という)の合計は できるだけ少なくしたい。 そこで,対象サブシステムの開発作業順序を求める関数 job_scheduling を作成した。

 

(1) 関数 job_scheduling の仕様は次のとおりである。ここで,引数の値に誤りはないものとする。
 機能 :   対象サブシステムの開発作業順序を求める。
 引数 :   num_s   対象サブシステム数 
     job    対象サブシステム情報(JOB 型の配列)
     job_sch  開発作業順序(int 型の配列)

(2) 構造体を使った JOB 型の定義は次のとおりである。

   typedef struct {
     char pr_code[9];   /* 開発コード */
     int  job_term;    /* 開発作難日数 */
     int  target_term;   /* 目標作業期間 */
   } JOB;

@ 開発コードは,対象サブシステムごとに一意となる長さが8の文字列

A 開発作業日数は,開発作業に掛かる日数

B 目標作業期間は,半年ごとの一連の開発作業を開始する日から, この対象サブシステムの目標作業終了日までの日数

(3) 対象サブシステム情報 job には,次の@〜Bの順で,データが格納されている。

@ 目標作業期間の昇順

A 目標作業期間が同じならば,開発作業日数の昇順

B 目標作業期間も開発作業日数も同じならば,開発コードの昇順

(4) (5) の手順で,開発作業順序を求めると,開発作業順序 job_sch の要素 job_sch[i] には, i+1番目(i = Ø, 1, …, num_s − 1)に開発作業を 実施する対象サブシステムの情報が格納された job[j] の添字の値 j(j = Ø, 1, … , num_s −1)が入る。

(5) 開発作業順序を求める手順は,次のとおりである。

@ 開発作業順序 job_schを,対象サブシステム情報 job の並び順に初期設定し, 開発作業順序の添字 i に初期値 Ø を設定する。

A i < num_s − 1 である間,B〜Eの処理を行う。

B i +1番目に開発作業を実施する対象サブシステム job[job_sch[i]] と i+2 番目に 開発作業を実施する対象サブシステム job[job sch[i+1]] の開発作業を, 順序どおりに実施した場合の二つの対象サブシステムの遅延日数の合計 wt_a と, 順序を入れ替えて実施した場合の二つの対象サブシステムの遅延日数の合計 wt_b を求める。

C 開発作業の実施順序を入れ替えることによって遅延日数の合計が減る場合(wt_a > wt_b)には, 開発作業の実施順序を入れ替える。

D 開発作業の実施順序を入れ替えた場合,i が Ø でなければ,i を 1 減らす。

E 入れ替えなかった場合,i を 1 増やす。

(6) i 番目の対象サブシステムの開発作業が終わるまでの開発作業日数の合計を ft としたとき, i+1番目の対象サブシステムの開発作業が終わったときの遅延日数 wt は,次式で求められる。

 ここで,job_term と target_term は,i+1番目に開発作業を実施する対象サブシステムの 開発作業日数と目標作業期間である。

 

〔プログラム1〕
typedef struct {
    char pr_code[9];    /* 開発コード */
    int  job_term;      /* 開発作業日数 */
    int  target_term;   /* 目標作業期間 */
} JOB;

void job_scheduling(int, JOB[], int[]);

void job_scheduling(int num_s, JOB job[num_s], int job_sch[num_s]) {
    int ft, ft_a, ft_b, wt_a, wt_b, job_no, i, j;

    for (i = Ø; i < num_s; i++) {
        job_sch[i] = i;
    }

    ft = Ø;
    i  = Ø;
    while (i < num_s - 1) {
        ft_a = ft;
        ft_b = ft;
        wt_a = Ø;
        Wt_b = Ø;
        for (j = Ø; j < 2; j++) { /* 遅延日数の合計 wt_a, wt_b を求める */
            ft_a += job[job_sch[i + j]].job_term;
            if (ft_a > job[job_sch[i + j]].target_term) {
                wt_a += ft_a - job[job_sch[i + j]].target_term;
            }
            ft_b += job[job_sch[  ]].job_term;
            if (ft_b > job_sch[  ]].target_term) {
               wt_b += ft_b - job[job_sch[  ]].target_term;
            }
        }

        if (wt_a > wt_b) {
           job_no         = job_sch[i];
           job_sch[i]     = job_sch[  ];
           job_sch[  ] = job_no;
           if (i > Ø) {
               ft -= job[job_sch[  ]].job_term;
           }
        } else {
            ft   job[job_sch[i++]].job_term;
        }
    }
}

 

設問1  プログラム1中の に入れる正しい答えを,解答群の中から選べ。

 

a に関する解答群 ア i + j      イ i + j - 1      ウ i - j      エ i - j + 1

 

b に関する解答群 ア i + 1      イ i - 1      ウ job_no

エ job_no + 1      オ job_no - 1

 

c に関する解答群 ア i + 1      イ i - 1      ウ ++

エ i--      オ ++i      カ --i

d に関する解答群 ア =       イ +=      ウ -=
解答 a ←クリックすると正解が表示されます

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

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

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

基本情報技術者試験


設問2  関数 job_scheduling を実行したときに得られる対象サブシステムの開発作業順序などを 出力する関数 print_scheduling を作成した。次の記述中の に入れる正しい答えを,解答群の中から選べ。

 

(1) 関数 print_schedule の仕様は次のとおりである。ここで,引数の値に誤リはないものとする。
 機能 :   対象サブシステムの開発作業順序などを出力する。
 引数 :   num_s   対象サブシステム数 
     job    対象サブシステム情報(JOB 型の配列)
     job_sch  開発作業順序(int 型の配列)

(2) 図1に示す五つの対象サブシステムの対象サブシステム情報に対して関数 job_scheduling を実行した。このときに得られた開発作業順序を,図2に示す。

 


図1 対象サブシステム情報

 


図2 開発作業順序

 

(3) 続けて,関数 print_ schedule を実行した。その出力結果の3行日を図3に示す。

 


図3 関数 print_schedule の出力結果の3行目

 

〔プログラム2〕
#inctude <<stdio.h>

typedef struct {
    char pr_code[9];      /* 開発コード */
    int  job_term;        /* 開発作業日数 */
    int  target_term;     /* 目標作業期間 */
} JOB;

void print_schedule(int, JOB[], int[]);

void print_schedule(int num_s, JOB job[num_s], int job_sch[num_s]) {
    int ft, wt, wt_sum, i;

    ft      = Ø;
    wt_sum  = Ø;
    for (i = Ø; i < num_s; i++) {
        ft += job[job_sch[i]].job_term;
        if (ft > job[job_sch[i]].target_term) {
            wt = ft - job[job_sch[i]].target_term;
            wt_sum += wt;
        } else {
            wt = Ø;
        }
        printf("%3d  %1Øs  %1Ød  %1Ød\n",
               i + 1, job[job_sch[i]].pr_code, wt, wt_sum);
    }
}

 

e,f に関する解答群 ア Ø      イ 27      ウ 44      エ 46

オ 57      カ 6Ø      キ 73      ク 86

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

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


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