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

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

問題

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

https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2015h27_1/2015h27h_fe_pm_qs.pdf

問題の解説

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

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

スポンサーリンク

設問1

C言語ソースコード

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

#define RSIZ 5
#define CSIZ 13

void enc_str(char[], char[RSIZ][CSIZ]);

void enc_str(char str[], char xchg_t[RSIZ][CSIZ]) {
  int cp[2], rp[2], pos[2],
    flg, i = 0, col, row, p = 0;

  /* 動作確認用に追加 */
  unsigned int alpha = 0, beta = 0;

  while (str[p] != '\0') {
    flg = 0;
    for (row = 0; row < RSIZ; row++) {
      for (col = 0; col < CSIZ; col++) {
        if (str[p] == xchg_t[row][col]) {
          flg = 1;
          break;
        }
      }
      if (flg != 0) break;
    }
    if (flg != 0) {
      /* 動作確認用に追加 */
      alpha++;
      printf("α %d回目:col = %d, row = %d\n", alpha, col, row);

      cp[i] = col;
      rp[i] = row;
      pos[i++] = p;
      if (i == 2) {
        if (str[pos[0]] == str[pos[1]]) {
          str[pos[0]] = str[pos[1]] =
            xchg_t[(rp[0] + 1) % RSIZ]
                  [(cp[0] + 1) % CSIZ];
        } else {
          if (rp[0] == rp[1]) {
            str[pos[0]] = xchg_t[rp[1]][cp[1]];
            str[pos[1]] = xchg_t[rp[0]][cp[0]];
          } else if (cp[0] == cp[1]) {
            str[pos[0]] = xchg_t[rp[0]]
                                [(cp[0] + 1) % CSIZ];
            str[pos[1]] = xchg_t[rp[1]]
                                [(cp[1] + 1) % CSIZ];
          } else {
            str[pos[0]] = xchg_t[rp[1]][cp[0]];
            str[pos[1]] = xchg_t[rp[0]][cp[1]];
          }
        }
        i = 0;

        /* 動作確認用に追加 */
        beta++;
        printf("β %d回目:str=%s\n  cp[0] = %d, cp[1] = %d, rp[0] = %d, rp[1] = %d\n  pos[0] = %d, pos[1] = %d\n"
          , beta, str, cp[0], cp[1], rp[0], rp[1], pos[0], pos[1]);
      }
    }
    p++;
  }
  if (i != 0) {
    str[pos[0]] = xchg_t[RSIZ - 1 - rp[0]][CSIZ - i - cp[0]];
  }
}

int main(int argc, char* argv[]) {
  int i;
  char str[512];
  char chg[RSIZ][CSIZ] = {
    "abcdefghijklm",
    "nopqrstuvwxyz",
    "0123456789,. ",
    "ZYXWVUTSRQPON",
    "MLKJIHGFEDCBA"
  };

  if (argc != 2) {
    printf("文字列を引数として入力してください\n");
    return -1;
  }

  strcpy(str, argv[1]);

  printf("平文 :%s\n", str);

  enc_str(str, chg);

  printf("暗号文:%s\n", str);

  return 0;
}

実行方法

ソースコードをコンパイルして実行ファイルを生成し、引数に入力する文字列を指定します。文字列はダブルクオーテーションで囲って指定してください。例えば下記のような感じで実行すれば動作します。

 ./h27s_c.exe "Function  f(x,y) is given."

実行結果

実行すると、引数として入力された文字列(平文)と、プログラム実行途中結果、暗号化された文字列が出力されます。

平文 :Function  f(x,y) is given.
α 1回目:col = 7, row = 4
α 2回目:col = 7, row = 1
β 1回目:str=Evnction  f(x,y) is given.
  cp[0] = 7, cp[1] = 7, rp[0] = 4, rp[1] = 1
  pos[0] = 0, pos[1] = 1
α 3回目:col = 0, row = 1
α 4回目:col = 2, row = 0
β 2回目:str=Evaption  f(x,y) is given.
  cp[0] = 0, cp[1] = 2, rp[0] = 1, rp[1] = 0
  pos[0] = 2, pos[1] = 3
α 5回目:col = 6, row = 1
α 6回目:col = 8, row = 0
β 3回目:str=Evapgvon  f(x,y) is given.
  cp[0] = 6, cp[1] = 8, rp[0] = 1, rp[1] = 0
  pos[0] = 4, pos[1] = 5
α 7回目:col = 1, row = 1
α 8回目:col = 0, row = 1
β 4回目:str=Evapgvno  f(x,y) is given.
  cp[0] = 1, cp[1] = 0, rp[0] = 1, rp[1] = 1
  pos[0] = 6, pos[1] = 7
α 9回目:col = 12, row = 2
α 10回目:col = 12, row = 2
β 5回目:str=EvapgvnoZZf(x,y) is given.
  cp[0] = 12, cp[1] = 12, rp[0] = 2, rp[1] = 2
  pos[0] = 8, pos[1] = 9
α 11回目:col = 5, row = 0
α 12回目:col = 10, row = 1
β 6回目:str=EvapgvnoZZs(k,y) is given.
  cp[0] = 5, cp[1] = 10, rp[0] = 0, rp[1] = 1
  pos[0] = 10, pos[1] = 12
α 13回目:col = 10, row = 2
α 14回目:col = 11, row = 1
β 7回目:str=EvapgvnoZZs(kx.) is given.
  cp[0] = 10, cp[1] = 11, rp[0] = 2, rp[1] = 1
  pos[0] = 13, pos[1] = 14
α 15回目:col = 12, row = 2
α 16回目:col = 8, row = 0
β 8回目:str=EvapgvnoZZs(kx.)m8s given.
  cp[0] = 12, cp[1] = 8, rp[0] = 2, rp[1] = 0
  pos[0] = 16, pos[1] = 17
α 17回目:col = 5, row = 1
α 18回目:col = 12, row = 2
β 9回目:str=EvapgvnoZZs(kx.)m85zgiven.
  cp[0] = 5, cp[1] = 12, rp[0] = 1, rp[1] = 2
  pos[0] = 18, pos[1] = 19
α 19回目:col = 6, row = 0
α 20回目:col = 8, row = 0
β 10回目:str=EvapgvnoZZs(kx.)m85zigven.
  cp[0] = 6, cp[1] = 8, rp[0] = 0, rp[1] = 0
  pos[0] = 20, pos[1] = 21
α 21回目:col = 8, row = 1
α 22回目:col = 4, row = 0
β 11回目:str=EvapgvnoZZs(kx.)m85zigirn.
  cp[0] = 8, cp[1] = 4, rp[0] = 1, rp[1] = 0
  pos[0] = 22, pos[1] = 23
α 23回目:col = 0, row = 1
α 24回目:col = 11, row = 2
β 12回目:str=EvapgvnoZZs(kx.)m85zigir0y
  cp[0] = 0, cp[1] = 11, rp[0] = 1, rp[1] = 2
  pos[0] = 24, pos[1] = 25
暗号文:EvapgvnoZZs(kx.)m85zigir0y

動作確認用の変更箇所

main関数実行

main関数を追加し、その中で換字表(図2の表)の配列を作成し、enc_str関数を実行しています。

プログラム実行途中結果の表示を追加

設問1を解くために必要な値を表示するように変更しています。具体的には、ソースコードのα部分とβ部分(αとβがどこにあるかは問題参照してください)で何回目に実行されたかの情報と、各変数の値を表示するようにしています。

 

他の回のソースコード

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

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

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

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

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

コメントを残す

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