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