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

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

問題

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

https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2014h26_1/2014h26h_fe_pm_qs.pdf

設問1

C言語ソースコード

h26s_1_c.c
#include<stdio.h>

#define WLEN_MAX 20

/* format_textの第三引数width(1行の最大文字数) */
#define WIDTH_MAX 50

void format_text(char *, char *, int);

void format_text(char *in_file, char *out_file, int width) {
  FILE *ifp, *ofp;
  int ch, lpos = 0, sp = 0;
  char str[WLEN_MAX + 2];

  ifp = fopen(in_file, "r");
  ofp = fopen(out_file, "w");

  while ((ch = fgetc(ifp)) != EOF) {
    if(ch == '\n') {
      str[sp++] = ch;
      str[sp] = '\0';
      fputs(str, ofp);
      /* 設問1[a] */
      lpos = 0;
      sp = 0;
    } else if (ch == ' ') {
      lpos += sp;
      if (lpos >= width) {
        /* 設問1[b] */
        str[sp++] = '\n';
        lpos = 0;
      }
      str[sp] = '\0';
      fputs(str, ofp);
      fputc(ch, ofp);
      lpos++;
      /* 設問1[c] */
      sp = 0;
    } else {
      /* 設問1[d] */
      if ((lpos + sp) >= width) {
        fputc('\n', ofp);
        lpos = 0;
      }
      str[sp++] = ch;
    }
  }
  str[sp] = '\0';
  fputs(str, ofp);

  fclose(ifp);
  fclose(ofp);

}

int main(int argc, char* argv[]) {

  FILE *tfp;

  /* 引数チェック */
  if (argc != 3) {
    printf("入力ファイル名[第一引数]と出力ファイル名[第二引数]を入力してください\n");
    return -1;
  }

  tfp = fopen(argv[1], "r");
  if (tfp == NULL) {
    printf("入力ファイル[第一引数]が開けません\n");
    return -1;
  }
  fclose(tfp);

  tfp = fopen(argv[2], "w");
  if (tfp == NULL) {
    printf("出力ファイル[第二引数]が開けません\n");
    return -1;
  }
  fclose(tfp);

  format_text(argv[1], argv[2], WIDTH_MAX);

  return 0;
}

実行方法

ソースコードをコンパイルし、実行ファイルを生成します。さらに、下記をコピペして適当なファイル名をつけて保存してください。例えば「input.txt」など。

The    Information   Technology   Engineers
   Examination   was  first  administered  in  1969. In 1970,
 it became a national examination.
       Since its commencement, the examination has played
    an important role   in the development of IT    engineers. 

実行時には、第一引数に用意した入力ファイル名を、第二引数に出力ファイル名をしてください。例えばコマンドラインで実行するのであれば、下記のコマンドで実行してください。「input.txt」が入力ファイルで、「output.txt」が出力ファイルになります。出力ファイルはあらかじめ用意しておく必要はありません。

26s_1.exe input.txt output.txt

実行結果

プログラムを実行すると、第一引数に指定した入力ファイルのテキストに対し、50文字を超えた行は50文字で改行するように変換したテキストが出力ファイルに保存されます。例えば上記のテキストを入力とした場合、出力ファイルの中身は下記のようになります。

The    Information   Technology   Engineers
   Examination   was  first  administered  in  
1969. In 1970,
 it became a national examination.
       Since its commencement, the examination has
 played
    an important role   in the development of IT  
  engineers. 

動作確認用の変更箇所

main関数追加

問題にはmain関数がないのでmain関数を追加しています。引数の数と、引数で指定されたファイルが開けるかどうかを確認し、問題なければformat_text関数を実行しています。format_text関数の第三引数は50にしていますが、この数を変更すると出力結果も変わります。

スポンサーリンク

設問2

C言語ソースコード

h26s_2_c.c
#include<stdio.h>

#define WLEN_MAX 20

/* format_textの第三引数width(1行の最大文字数) */
#define WIDTH_MAX 50

void format_text(char *, char *, int);

void format_text(char *in_file, char *out_file, int width) {
  FILE *ifp, *ofp;
  int ch, lpos = 0, sp = 0;
  int lch = '.';
  char str[WLEN_MAX + 2];

  ifp = fopen(in_file, "r");
  ofp = fopen(out_file, "w");

  while ((ch = fgetc(ifp)) != EOF) {
    if(ch == '\n') {
      str[sp++] = ch;
      str[sp] = '\0';
      fputs(str, ofp);
      /* 設問1[a] */
      lpos = 0;
      sp = 0;
    } else if (ch == ' ') {
      lpos += sp;
      if (lpos >= width) {
        /* 設問1[b] */
        str[sp++] = '\n';
        lpos = 0;
      }
      str[sp] = '\0';
      fputs(str, ofp);
      /* 設問2[e] */
      if (lpos != 0) {
        fputc(ch, ofp);
        lpos++;
      }
      /* 設問1[c] */
      sp = 0;
    } else {
      /* 設問1[d] */
      if ((lpos + sp) >= width) {
        fputc('\n', ofp);
        lpos = 0;
      }
      if ((lpos == 0) && (sp == 0) && (lch == '.')) {
        fputc(' ', ofp);
        lpos++;
      }
      /* 設問2[d] */
      lch = ch;
      str[sp++] = ch;
    }
  }
  str[sp] = '\0';
  fputs(str, ofp);

  fclose(ifp);
  fclose(ofp);

}

int main(int argc, char* argv[]) {

  FILE *tfp;

  /* 引数チェック */
  if (argc != 3) {
    printf("入力ファイル名[第一引数]と出力ファイル名[第二引数]を入力してください\n");
    return -1;
  }

  tfp = fopen(argv[1], "r");
  if (tfp == NULL) {
    printf("入力ファイル[第一引数]が開けません\n");
    return -1;
  }
  fclose(tfp);

  tfp = fopen(argv[2], "w");
  if (tfp == NULL) {
    printf("出力ファイル[第二引数]が開けません\n");
    return -1;
  }
  fclose(tfp);

  format_text(argv[1], argv[2], WIDTH_MAX);

  return 0;
}

実行方法

実行方法は設問1と同じです。

実行結果

プログラムを実行すれば下記のようなテキストが第二引数で指定したファイルに書き込まれます。

 The    Information   Technology   Engineers
Examination   was  first  administered  in  1969. 
 In 1970,
it became a national examination.
 Since its commencement, the examination has 
played
an important role   in the development of IT    
engineers. 

動作確認用の変更箇所

main関数追加

設問1と同じmain関数を追加しています。

 

他の回のソースコード

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

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

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

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

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

コメントを残す

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