このページでは平成28年秋期 基本情報技術者試験のC言語問題のソースコードを実際に実行できるように変更したものを公開しています。C言語問題対策のためにも、こちらのソースコードをコピペして実際にプログラムを動作させ、どのように動作するのか、正解以外の選択肢を選んだ場合にどのような動きになるか、どう仕様を満たさないかを確認するために使用してみてください。
問題
平成28年秋期のC言語問題はIPAの下記ページで公開されています。
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2016h28_2/2016h28a_fe_pm_qs.pdf
問題の解説
問題の解き方の解説は下記ページで行なっています。自分でプログラムの動きが追うのが困難な場合などに参考にしてください。
平成28年(H28)秋期 基本情報技術者試験 C言語問題 解き方解説スポンサーリンク
設問1・設問2
C言語ソースコード
#include <stdio.h>
#include <string.h>
#define NUM_JOB 5
typedef struct {
char pr_code[9];
int job_term;
int target_term;
} JOB;
void job_scheduling(int, JOB[], int[]);
void print_schedule(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 = 0; i < num_s; i++) {
job_sch[i] = i;
}
ft = 0;
i = 0;
while (i < num_s - 1) {
ft_a = ft;
ft_b = ft;
wt_a = 0;
wt_b = 0;
for (j = 0; j < 2; j++) {
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;
}
/* 設問1の[a] */
ft_b += job[job_sch[i - j + 1]].job_term;
if (ft_b > job[job_sch[i - j + 1]].target_term) {
wt_b += ft_b - job[job_sch[i - j + 1]].target_term;
}
}
if (wt_a > wt_b) {
job_no = job_sch[i];
/* 設問1の[b] */
job_sch[i] = job_sch[i + 1];
job_sch[i + 1] = job_no;
if (i > 0) {
/* 設問1の[c] */
ft -= job[job_sch[--i]].job_term;
}
} else {
/* 設問1の[d] */
ft += job[job_sch[i++]].job_term;
}
}
}
void print_schedule(int num_s, JOB job[num_s], int job_sch[num_s]) {
int ft, wt, wt_sum, i;
ft = 0;
wt_sum = 0;
for (i = 0; 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 = 0;
}
printf("%3d %10s %10d %10d\n",
i + 1, job[job_sch[i]].pr_code, wt, wt_sum);
}
}
int main(void) {
JOB job[NUM_JOB];
int job_sch[NUM_JOB];
int i;
/* 図1の対象サブシステム情報を格納 */
strcpy(job[0].pr_code, "APL12339");
job[0].job_term = 25;
job[0].target_term = 27;
strcpy(job[1].pr_code, "GGL08001");
job[1].job_term = 27;
job[1].target_term = 29;
strcpy(job[2].pr_code, "MSO16101");
job[2].job_term = 21;
job[2].target_term = 30;
strcpy(job[3].pr_code, "CAN03022");
job[3].job_term = 28;
job[3].target_term = 77;
strcpy(job[4].pr_code, "ORA14031");
job[4].job_term = 12;
job[4].target_term = 93;
job_scheduling(NUM_JOB, job, job_sch);
printf("job_scheduling実行後の作業順序\n");
for (i = 0; i < NUM_JOB; i++) {
printf(" job_sch[%d] : %d\n", i, job_sch[i]);
}
printf("\n");
print_schedule(NUM_JOB, job, job_sch);
}
実行方法
プログラムの中で入力データを用意していますので、ソースコードをコンパイルしてやれば実行可能になります。
スポンサーリンク
実行結果
下記のようにjob_scheduling関数実行後の各ジョブの作業順序と、その作業順序で作業した時の各ジョブの遅延日数、遅延合計日数が表示されます。
job_scheduling実行後の作業順序
job_sch[0] : 0
job_sch[1] : 2
job_sch[2] : 1
job_sch[3] : 4
job_sch[4] : 3
1 APL12339 0 0
2 MSO16101 16 16
3 GGL08001 44 60
4 ORA14031 0 60
5 CAN03022 36 96
動作確認用の変更箇所
main関数追加
動作させるためにmain関数を追加しています。JOB構造体には図1の対象サブシステムの情報をそのまま格納しています。格納後、job_scheduling関数とprint_schedule関数を実行しています。
他の回のソースコード
他の回のソースコードについても下記ページで公開していますので、是非ソースコードを使用してプログラムの動きを見てみてください。
基本情報技術者試験C言語問題のプログラムを動かしてみよう(まとめ)本ページのプログラムについて
プログラムはIPA公開の過去問題から引用し、さらに動作確認できるように必要な部分に関してのみ加工して使用させていただいております。
出典:平成28年度 秋期 基本情報技術者試験(FE)試験区分 午後 問9