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

このページでは平成27年秋期 基本情報技術者試験のC言語問題のソースコードを実際に実行できるように変更したものを公開しています。C言語問題対策のためにも、こちらのソースコードをコピペして実際にプログラムを動作させ、どのように動作するのか、正解以外の選択肢を選んだ場合にどのような動きになるか、どう仕様を満たさないかを確認するために使用してみてください。

問題

平成27年秋期のC言語問題はIPAの下記ページで公開されています。

https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2015h27_2/2015h27a_fe_pm_qs.pdf

問題の解説

問題の解き方の解説は下記ページで行なっています。自分でプログラムの動きが追うのが困難な場合などに参考にしてください。

平成27年(H27)秋期 基本情報技術者試験 C言語問題 解き方解説

スポンサーリンク

設問1

C言語ソースコード

h27f_1_c.c
#include<stdio.h>
#include<string.h>

FILE *logFile;
int logEOF = 0;
char cardID[5] = "----", date[9] = "--------", time[7] = "------",
     door[3] = "--", dir[2] = "-", act[2] = "-",
    name[11] = "----------";
char lastID[5] = "----";

void getRecord();
void putRecord();

void main() {
  logFile = fopen("Access.Log", "r");
  getRecord();
  while (logEOF != EOF) {
    putRecord();
    getRecord();
  }
  fclose(logFile);
}

void getRecord() {
  if (fscanf(logFile, "%4c%8c%6c%2c%1c%1c%10c\n",
    cardID, date, time, door, dir, act, name) == EOF)
    /* 設問1[a] */
    logEOF = EOF;
}

void putRecord() {
  int putSpace;

  if(strcmp(cardID, lastID) == 0)
    printf("%18s", " ");
  else {
    printf("\n%4s  %10s  ", cardID, name);
    /* 設問1[b] */
    strcpy(lastID, cardID);
  }
  putSpace = door[0] - '0' - 1;
  while (0 < putSpace--) {
    printf("%20s", " ");
  }
  printf("%.2s-%.2s %.2s:%.2s %2s ",
    date+4, date+6, time, time+2, door);
  if (strcmp(act, "R") == 0) printf("%s", "(R)");
  if (strcmp(dir, "I") == 0) printf("%s\n", "IN");
  else printf("%s\n", "OUT");
}

実行方法

ソースコードをコンパイルし、実行ファイルを生成します。さらに、下記をコピペしてAccess.Logというファイルを実行ファイルと同じ場所に設置します。これで準備は完了で、あとはプログラムを実行すれば良いです。

S0012015101809000011IASys Op Lib
S0012015101809100421ISSys Op Lib
S0012015101809200831IASys Op Lib
S0012015101809301231OASys Op Lib
S0012015101809401621OASys Op Lib
S0012015101809502011OASys Op Lib
V0012015101811004812IAVisitor 01
V0012015101811105222IRVisitor 01
V0012015101811205612OAVisitor 01

実行結果

プログラムは上記のAccess.Logを読み込んで動作し、下記のように退出記録を表示します(ブラウザによってはずれて見えるかも)。

S001  Sys Op Lib  10-18 09:00 11 IN
                                      10-18 09:10 21 IN
                                                          10-18 09:20 31 IN
                                                          10-18 09:30 31 OUT
                                      10-18 09:40 21 OUT
                  10-18 09:50 11 OUT

V001  Visitor 01  10-18 11:00 12 IN
                                      10-18 11:10 22 (R)IN
                  10-18 11:20 12 OUT

動作確認用の変更箇所

特になし

この回のソースコードではmain関数も問題に掲載されていますので、動作させるために必要な修正・追加はありませんでした。

設問2

C言語ソースコード

h27f_2_c.c
#include<stdio.h>
#include<string.h>

FILE *logFile;
int logEOF = 0;
char cardID[5] = "----", date[9] = "--------", time[7] = "------",
     door[3] = "--", dir[2] = "-", act[2] = "-",
    name[11] = "----------";
char lastID[5] = "----";
int level = 0;

void getRecord();
void putRecord();
void checkLevel();
void clearLevel();

void main() {
  logFile = fopen("Access.Log", "r");
  getRecord();
  while (logEOF != EOF) {
    putRecord();
    getRecord();
    clearLevel();
  }
  fclose(logFile);
}

void getRecord() {
  if (fscanf(logFile, "%4c%8c%6c%2c%1c%1c%10c\n",
    cardID, date, time, door, dir, act, name) == EOF)
    /* 設問1[a] */
    logEOF = EOF;
}

void putRecord() {
  int putSpace;

  if(strcmp(cardID, lastID) == 0)
    printf("%18s", " ");
  else {
    printf("\n%4s  %10s  ", cardID, name);
    /* 設問1[b] */
    strcpy(lastID, cardID);
  }
  checkLevel();
  putSpace = door[0] - '0' - 1;
  while (0 < putSpace--) {
    printf("%20s", " ");
  }
  printf("%.2s-%.2s %.2s:%.2s %2s ",
    date+4, date+6, time, time+2, door);
  if (strcmp(act, "R") == 0) printf("%s", "(R)");
  if (strcmp(dir, "I") == 0) printf("%s\n", "IN");
  else printf("%s\n", "OUT");
}

void checkLevel() {
  int afterLevel, beforeLevel, doorLevel;

  doorLevel = door[0] - '0';
  beforeLevel = doorLevel;
  afterLevel = doorLevel;
  if (strcmp(dir, "I") == 0)
    beforeLevel = doorLevel - 1;
  else
    afterLevel = doorLevel - 1;
  if(strcmp(act, "R") == 0)
    afterLevel = beforeLevel;
  if (level != beforeLevel)
    printf("***** Level %d-->%d\n%18s",
      level, beforeLevel, " ");
  level = afterLevel;
}

void clearLevel() {
  if (logEOF == EOF || (strcmp(cardID, lastID) != 0))
    if (level > 0) {
      printf("%18s***** Level %d-->0\n", " ", level);
      level = 0;
    }
}

実行方法

設問1同様にソースコードをコンパイルし、実行ファイルを生成します。さらに、下記をコピペしてAccess.Logというファイルを実行ファイルと同じ場所に設置します。設問1に比べて下の3行を追加しており、これが不整合のあるレコードとなります。これで準備は完了で、あとはプログラムを実行すれば良いです。

S0012015101809000011IASys Op Lib
S0012015101809100421ISSys Op Lib
S0012015101809200831IASys Op Lib
S0012015101809301231OASys Op Lib
S0012015101809401621OASys Op Lib
S0012015101809502011OASys Op Lib
V0012015101811004812IAVisitor 01
V0012015101811105222IRVisitor 01
V0012015101811205612OAVisitor 01
T0012015101810002411IATest Use 1
T0012015101810202831IATest Use 1
T0012015101810403221OATest Use 1

実行結果

プログラムは上記のAccess.Logを読み込んで動作し、下記のように退出記録と発生した不整合の情報を表示します(こちらもブラウザによってはずれて見えるかも)。

S001  Sys Op Lib  10-18 09:00 11 IN
                                      10-18 09:10 21 IN
                                                          10-18 09:20 31 IN
                                                          10-18 09:30 31 OUT
                                      10-18 09:40 21 OUT
                  10-18 09:50 11 OUT

V001  Visitor 01  10-18 11:00 12 IN
                                      10-18 11:10 22 (R)IN
                  10-18 11:20 12 OUT

T001  Test Use 1  10-18 10:00 11 IN
                  ***** Level 1-->2
                                                          10-18 10:20 31 IN
                  ***** Level 3-->2
                                      10-18 10:40 21 OUT
                  ***** Level 1-->0

動作確認用の変更箇所

特になし

設問1同様に主な変更点はなしです。

 

他の回のソースコード

他の回のソースコードについても下記ページで公開していますので、是非ソースコードを使用してプログラムの動きを見てみてください。

基本情報技術者試験C言語問題のプログラムを動かしてみよう(まとめ)

本ページのプログラムについて

プログラムはIPA公開の過去問題から引用し、さらに動作確認できるように必要な部分に関してのみ加工して使用させていただいております。

出典:平成27年度 秋期 基本情報技術者試験(FE)試験区分 午後 問9

コメントを残す

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