応用課題:基本情報技術者試験問題に挑戦(1)

 次の課題として、国家資格の「基本情報技術者」資格試験のC言語の問題を解いてみましょう。といっても、難しい問題は出しません。ある程度、改変して簡単にしたものを扱います。今回は、平成19年秋季試験の午後 問06(改題)の問題を扱います。

 …… 

【平成19年秋季 午後 問06(改)】

次の C プログラムの説明及びプログラムを読んで,設問に答えよ。

〔プログラムの説明〕

引数の配列 in に格納された縦8文字×横6文字の文字パターンを,引数 invtype の値 (1~4)に従って,回転又は反転して標準出力に出力する関数 invert である。

(1) 引数 invtype の値と文字パターンの回転又は反転種別の関係は,表のとおりである。

表 引数 invtype の値と文字パターンの回転・反転種別


 invtype   回転・反転種別  
 1   90 度右回転  
 2   90 度左回転  
 3   上下反転  
 4   左右反転  

(2) 関数 main の実行結果をまとめた文字パターンの印字例を図に示す。

   図 文字パターンの印字例

(3) 回転及び反転操作の手順を,8行6列の配列 dat[8][6] を例として説明する。

 90 度回転では,回転後は行と列の数が入れ替わることになる。

 90 度右回転の場合には,次に示すように先頭の行データ群は,右端の列データ 群に移る。次の行データ群が右から二つ目の列に移り,同様の手順で移動が進み, 最後に最下段の行データ群が左端の列データ群に移る。

  先頭行: dat[0][0], dat[0][1], … , dat[0][4], dat[0][5]
      ↓      ↓     ↓    ↓
  右端列: dat[0][7], dat[1][7], … , dat[4][7], dat[5][7]

 90 度左回転の場合には,先頭の行データ群は,左端の列データ群 dat[5][0], dat[4][0], …, dat[1][0], dat[0][0] に移る。次の行データ群が左から二つ目の 列に移り,同様の手順で移動が進み,最後に最下段の行データ群が右端の列データ群に移る。

 上下反転では,先頭の行データ群は,最下段の行データ群 dat[7][0], dat[7][1], …, dat[7][41, dat[7][5] に移る。次の行データ群が下から二つ目の行に移り, 同様の手順で移動が進み,最後に最下段の行データ群が先頭の行データ群に移る。

 左右反転では,行内で入れ替わるので,先頭の行データ群は,dat[0][5], dat[0][4], …, dat[0][1], dat[0][0] に移る。以降の行データ群も同様の 手順で行内で順序が入れ替わる。

〔プログラム〕

#include <stdio.h>
#define RSZ 6
#define CSZ 8

void invert(int invtype, char in[CSZ][RSZ]){
    int row = RSZ, col = CSZ;
    int i, j;
    
    if( 【 a 】 ){  /* 行数と列数の入替え */
        row = CSZ;
        col = RSZ;
    }
    for(i = 0; i < col; i++){
        for(j = 0; j < row; j++){
            switch(invtype){
                case 1:     /* 90度右回転 */
                    printf("%c", in[CSZ - j - 1][i]);
                    break;
                case 2:     /* 90度左回転 */
                    printf("%c", 【 b 】 );
                    break;
                case 3:     /* 上下反転 */
                    printf("%c", in[CSZ - i - 1][j]);
                    break;
                case 4:     /* 左右反転 */
                    printf("%c", 【 c 】 );
                    break;
                default:
                    break;
            }
        }
        printf("\n");
    }
}

int main(int argc, const char * argv[])
{
    
    // insert code here...
    char src[CSZ][RSZ] = {{'#','#','#','#','#','#'},
        {'#',' ',' ',' ',' ',' '},
        {'#',' ',' ',' ',' ',' '},
        {'#',' ',' ',' ',' ',' '},
        {'#','#','#',' ',' ',' '},
        {'#',' ',' ',' ',' ',' '},
        {'#',' ',' ',' ',' ',' '},
        {'#',' ',' ',' ',' ',' '}};
    invert(1, src);
    invert(2, src);
    invert(3, src);
    invert(4, src);
    
    return 0;
}

設問 プログラム中の 【 a 】, 【 b 】, 【 c 】 に入れる正しい答えを, 解答群の中から選べ。

【 a 】 に関する解答群

ア invtype == 1
イ invtype == 2
ウ invtype == 3
エ invtype == 4
オ (invtype == 1) || (invtype == 2)
力 (invtype == 3) || (invtype == 4)

【 b 】,【 c 】 に関する解答群

ア in[RSZ - i - 1][j]
イ in[RSZ - j - 1][i]
ウ in[i][CSZ - j - 1]
エ in[i][RSZ - j - 1]
オ in[j][CSZ - i - 1]
力 in[j][RSZ - i - 1]

 …… 

 どうでしょうか。a,b,cに入るものがどれか、おわかりでしょうか。焦らず、ゆっくり、aから見ていきましょう。

 まずはa。もしif文の条件が満たすものであれば、「row = RSZ, col = CSZ」としていたものを「row = CSZ, col = RSZ」に変えています。RSZは6、CSZは8とdefineされていますが、これは、縦と横の最大文字数です。それを入れ替えるということは、縦8×横6であったものを縦6×横8に変えるということです。switch(invtype)のところでcaseが1(90度右回転)か2(90度左回転)の処理をする際に必要になる処理です。よって、aの答えは、オの「(invtype == 1) || (invtype == 2)」になります。

 続いて、bとc。まずはb。90度左回転の際に何がしたいか、です。パターンを書き出して法則性を見つけてしまえばOKです。90度左に回転したいとしたら、

縦一列の例
回転前 回転後
in[0][0] in[5][0]
in[1][0] in[5][1]
...
in[6][0] in[5][6]
in[7][0] in[5][7]

横一列の例
回転前 回転後
in[0][0] in[5][0]
in[0][1] in[4][0]
...
in[0][4] in[1][0]
in[0][5] in[0][0]

 このようになります。for文のiとjは、回転後の位置を表しています。回転後の位置がin[i][j]となる場合、上の例から考えると、回転前の位置をiとjで表すと「in[j][5 - i]」、つまり、選択肢の中ではカの「in[j][RSZ - i - 1]」になります。

 同じように、左右反転の場合を考えてみましょう。

縦一列の例
回転前 回転後
in[0][0] in[0][5]
in[1][0] in[1][5]
...
in[6][0] in[6][5]
in[7][0] in[7][5]

横一列の例
回転前 回転後
in[0][0] in[0][5]
in[0][1] in[0][4]
...
in[0][4] in[0][1]
in[0][5] in[0][0]

 このようになります。回転後の位置がin[i][j]となる場合、上の例から考えると、回転前の位置をiとjで表すと「in[i][5 - j]」、つまり、選択肢の中ではエの「in[i][RSZ - j - 1]」になります。

 a,b,cを埋めたソースコードを入力して、実行すると、下記の結果が表示されることを確認して下さい。

########
   #   #
   #   #
       #
       #
       #
#       
#       
#       
#   #   
#   #   
########
#     
#     
#     
###   
#     
#     
#     
######
######
     #
     #
     #
   ###
     #
     #
     #

■スポンサーリンク

このページの先頭へ