このページでは平成26年秋期 基本情報技術者試験のC言語問題のソースコードを実際に実行できるように変更したものを公開しています。C言語問題対策のためにも、こちらのソースコードをコピペして実際にプログラムを動作させ、どのように動作するのか、正解以外の選択肢を選んだ場合にどのような動きになるか、どう仕様を満たさないかを確認するために使用してみてください。
問題
平成26年秋期のC言語問題はIPAの下記ページで公開されています。
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2014h26_2/2014h26a_fe_pm_qs.pdf
問題の解説
問題の解き方の解説は下記ページで行なっています。自分でプログラムの動きが追うのが困難な場合などに参考にしてください。
平成27年(H27)秋期 基本情報技術者試験 アルゴリズム問題 解き方解説スポンサーリンク
設問1
スポンサーリンク
C言語ソースコード
#include<stdio.h>
#include<string.h>
#define BitS 0x08
#define BitO 0x04
#define BitR 0x01
FILE *NewFile, *OldFile;
int NewEof, OldEof;
char NewID[9], OldID[9];
char NewName[11], OldName[11];
unsigned char NewAttr, OldAttr;
char NewDate[9], OldDate[9];
void ReadNewRecord(){
fscanf(NewFile, "%s %s %c %s", NewID, NewName, &NewAttr, NewDate);
if(feof(NewFile) != 0) {
NewEof = EOF;
strcpy(NewID, "\xFF");
}
}
void ReadOldRecord() {
fscanf(OldFile, "%s %s %c %s", OldID, OldName, &OldAttr, OldDate);
if(feof(OldFile) != 0) {
OldEof = EOF;
strcpy(OldID, "\xFF");
}
}
void main() {
NewFile = fopen("NewFile", "rb");
OldFile = fopen("OldFile", "rb");
NewEof = 0;
OldEof = 0;
ReadNewRecord();
ReadOldRecord();
/* 設問1[a] */
while ((NewEof != EOF) || (OldEof != EOF)) {
if (strcmp(NewID, OldID) == 0) {
/* 設問1[b] */
if ((NewAttr & (BitS + BitO)) != (OldAttr & (BitS + BitO))) {
printf("\n%-8s %-10s", NewID, NewName);
if ((NewAttr & BitS) > (OldAttr & BitS))
printf(" 特権S 付加");
if ((NewAttr & BitS) < (OldAttr & BitS))
printf(" 特権S 解除");
if ((NewAttr & BitO) > (OldAttr & BitO))
printf(" 特権O 付加");
if ((NewAttr & BitO) < (OldAttr & BitO))
printf(" 特権O 解除");
}
/* 設問1[c] */
ReadNewRecord();
ReadOldRecord();
}
else {
/* 設問1[d] */
if (strcmp(NewID, OldID) < 0) {
printf("\n%-8s %-10s 利用者ID 追加", NewID, NewName);
if ((NewAttr & BitS) == BitS) printf(" 特権S 付加");
if ((NewAttr & BitO) == BitO) printf(" 特権O 付加");
ReadNewRecord();
}
else {
printf("\n%-8s %-10s 利用者ID 削除", OldID, OldName);
if ((OldAttr & BitS) == BitS) printf(" 特権S 解除");
if ((OldAttr & BitO) == BitO) printf(" 特権O 解除");
ReadOldRecord();
}
}
}
fclose(OldFile);
fclose(NewFile);
}
実行方法
ソースコードをコンパイルし、実行ファイルを生成します。さらに、下記をコピペしてNewFileというファイルと、OldFileというファイルを作成します。
NewFile
AE001 UserE1 A 20140419 AE002 UserE2 H 20141014 AE003 UserE3 H 20140716 AP005 UserP5 F 20141015 AP006 UserP6 D 00000000
OldFile
AE001 UserE1 @ 20140419 AE002 UserE2 D 20140712 AE003 UserE3 L 20140716 AP004 UserP4 E 20140715 AP005 UserP5 D 20150713
問題の図1のNewFileとOldFileとは、属性部分が異なることに注意してください。
属性は問題文の[プログラムの説明]の(2)に記載の通り、「1桁」です。さらに8ビットのデータです。図1ではビットの並びが分かりやすいように16進数表記されていますが、実際は上のように図1の16進数をアスキーコードとした文字が格納されているはずです。
16進数の数字がどの文字に当てはまるかは、下記リンク先にあるようなアスキーコード表から紐づけることが可能です。
http://www3.nit.ac.jp/~tamura/ex2/ascii.html
例えば図1の属性「48」は文字で表すと「H」となります。
ちなみに属性を図1のままでNewFileとOldFileを作成してしまうとプログラムは上手く動作しません。
スポンサーリンク
実行結果
プログラムは上記のNewFileとOldFileを読み込んで動作し、下記のように利用者ID管理情報を表示します。問題の図2と同じ結果になるはずです。NewFileとOldFileの中身を変更すれば、出力結果も変わります。
AE002 UserE2 特権S 付加 特権O 解除 AE003 UserE3 特権O 解除 AP004 UserP4 利用者ID 削除 特権O 解除 AP006 UserP6 利用者ID 追加 特権O 付加
スポンサーリンク
動作確認用の変更箇所
特になし
動作確認用の変更点は特にありません。
設問2
スポンサーリンク
C言語ソースコード
#include<stdio.h>
#include<string.h>
#define BitS 0x08
#define BitO 0x04
#define BitR 0x01
FILE *NewFile, *OldFile;
int NewEof, OldEof;
char NewID[9], OldID[9];
char NewName[11], OldName[11];
unsigned char NewAttr, OldAttr;
char NewDate[9], OldDate[9];
void ReadNewRecord(){
fscanf(NewFile, "%s %s %c %s", NewID, NewName, &NewAttr, NewDate);
if(feof(NewFile) != 0) {
NewEof = EOF;
strcpy(NewID, "\xFF");
}
}
void ReadOldRecord() {
fscanf(OldFile, "%s %s %c %s", OldID, OldName, &OldAttr, OldDate);
if(feof(OldFile) != 0) {
OldEof = EOF;
strcpy(OldID, "\xFF");
}
}
void main() {
NewFile = fopen("NewFile", "rb");
OldFile = fopen("OldFile", "rb");
NewEof = 0;
OldEof = 0;
ReadNewRecord();
ReadOldRecord();
/* 設問1[a] */
while ((NewEof != EOF) || (OldEof != EOF)) {
if (strcmp(NewID, OldID) <= 0) {
/* 設問2[e] */
if (((NewAttr & BitR) == BitR) || (strcmp(NewID, OldID) == 0 && strcmp(NewDate, OldDate) == 0)) {
printf("\n%-8s %-10s", NewID, NewName);
if((NewAttr & BitR) == BitR)
printf(" 現在使用不可");
if(strcmp(NewID, OldID) == 0 && strcmp(NewDate, OldDate) == 0)
printf(" 期間中未使用");
}
ReadNewRecord();
}
else
ReadOldRecord();
}
fclose(OldFile);
fclose(NewFile);
}
実行方法
実行方法は設問1と同じです。
スポンサーリンク
実行結果
プログラムはNewFileとOldFileを読み込んで動作し、下記のように利用者IDの使用状況を表示します。
AE001 UserE1 現在使用不可 期間中未使用 AE003 UserE3 期間中未使用
スポンサーリンク
動作確認用の変更箇所
特になし
設問1同様に問題文から変更点はなしです。
他の回のソースコード
他の回のソースコードについても下記ページで公開していますので、是非ソースコードを使用してプログラムの動きを見てみてください。
基本情報技術者試験C言語問題のプログラムを動かしてみよう(まとめ)本ページのプログラムについて
プログラムはIPA公開の過去問題から引用し、さらに動作確認できるように必要な部分に関してのみ加工して使用させていただいております。
出典:平成26年度 秋期 基本情報技術者試験(FE)試験区分 午後 問9