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

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

h26f_1_c.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言語ソースコード

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

コメントを残す

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