基本情報技術者試験 C言語問題のソースコード(平成28年 秋期 )

このページでは平成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言語ソースコード

h28f_c.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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です