平成7年秋期第二種情報処理技術者試験午後問7、C言語
- 2017/03/29
- 13:36
問題文、解答、解説の順で掲載しております。
無料から学べる講座
http://ai-light.com/itkeiei/
ニコニコチャンネル
http://ch.nicovideo.jp/ai-light
YouTubeチャンネル
https://www.youtube.com/user/ailightcom
Access・Excel倶楽部
http://ai-light.com/accessclub/
株式会社アイライト公式HP
http://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)
***********************************************************************************************************
次のCプログラムの説明及びプログラムを読んで、設問に答えよ。
[プログラムの説明]
キーボード入力の練習用プログラムである。
事前に用意してある文字列格納ファイル(moji.f)から1行の文字列を読み込む。画面に表示後、同一文字列をキーボードから入力させる。入力文字列が表示文字列に等しいか否かをチェックする。等しくない場合は再入力を促す。文字列格納ファイルの終端を検出した時点で、再入力した回数を画面に表示する。
図1に示した文字列格納ファイルをもとに、プログラムを実行した例を図2に示す。
#include <stdio.h>
#define LOOP 1
main()
{
}
図1 文字列格納ファイル(moji.f)の内容の例
*** キーボード入力練習プログラム ***
画面に表示された文字列をキーボードから入力してください。
#include<stdio.h>
>>#include<stdio.h>
#define LOOP 1
>>#defune LOOP 1
!!文字“i”を文字“u”と間違えています。
入力をやり直してください。
#define LOOP 1
>>#define LOOP 1
main()
>>main()
{
>>{
}
>>}
*** 再入力回数 = 1回
図2 プログラムの実行例
(1) 文字列格納ファイルに含まれる文字は、英数字、そのほかの図形文字、空白文字及び改行文字“\n”である。
(2) 文字列格納ファイルの行とは、行末が改行文字であり、長さが行末を含めないで1文字以上70文字以下の文字列である。改行文字の直前の文字は、空白以外の文字である。ファイル内には複数の行が存在する。
(3) 図2において先頭文字が“>>”の行は、練習者がキーボードから文字列を入力する行を示している。キーボードから入力された文字列の長さは、行末の改行文字を除いた部分が、70文字を超えないものとする。
(4) 表示文字列とキーボードからの入力文字列の比較チェックは、次の手順で行う。
1. 両者の文字列長を比較し、長さが異なる場合には、改行後にエラー
メッセージ“!!入力文字数が違っています。”を出力し、更に、
改行後にメッセージ“入力をやり直して下さい。”を出力して再
入力を促す。
2. 両者の長さが等しい場合には、対応する文字を1文字ずつ比較する。
3. 不一致の文字があった場合には、最初の不一致文字に対して、改
行後に入力文字誤りのメッセージ“!!文字“x”を文字“y”と間
違えています。”を出力する。“x”は文字列格納ファイルから読
み込んだ文字を表す。“y”はキーボードから間違って入力された
文字を表す。
更に、改行後にメッセージ“入力をやり直してください。”を出
力して再入力を促す。
4. 入力誤りがあった場合は、再入力した回数を記録する。
5. 対応するすべての文字が等しい場合は、文字列格納ファイルから
次の行を読み込んで、その文字列を画面に表示し、キーボード入
力チェックを繰り返す。
(5) プログラムを終了する直前に、再入力の回数を10進数形式で画面に表示する。
設問 プログラム中の[ ]に入れる正しい答えを、解答群の中から選べ。
[プログラム]
#include
#include
#define LOOP 1
#define LEXIT 0
#define RECLEN 72
main()
{
FILE *fp;
char fbuf[RECLEN], ibuf[RECLEN],*cf,*ci;
int mode,ercnt;
fp = fopen( "moji.f","r");
printf("\n*** キーボード入力練習プログラム ***\n");
printf("画面に表示された文字列をキーボードから入力してください。\n\n");
ercnt = 0;
while(fgets(fbuf, RCLEN, fp) [ a ] NULL){
for(cf = fbuf; *cf != '\n'; cf ++);
*cf = '\0';
mode = LOOP;
while(mode == LOOP){
printf(" %s\n >>",[ b ]);
[ c ];
if(strlen(fbuf) != strlen(ibuf)){
printf("\n!!入力文字数が違っています。");
}
else{
for(cf = fbuf, ci = ibuf; *cf != '\0'; cf++, ci++){
if(*cf != *ci){
printf("\n!!文字"%c"を文字"%c"と間違えています。",*cf,*ci);
break;
}
}
if(*cf == '\0')mode = LEXIT;
}
if(mode == LOOP){
[ d ];
printf("\n入力をやり直してください。\n");
}
}
}
fclose(fp);
printf("\n*** 再入力回数 = [ e ]回\n", ercnt);
}
aに関する解答群
ア = イ == ウ != エ +=
bに関する解答群
ア cf イ *cf ウ ci エ *ci オ fbuf カ ibuf
cに関する解答群
ア fgets(fbuf, RECLEN, fp) イ getc(fp)
ウ gets(ibuf) エ getchar()
dに関する解答群
ア cf = &fbuf イ cf++ ウ ercnt = 0 エ ercnt++
eに関する解答群
ア %c イ %d ウ %s エ %x
***********************************************************************************************************
無料から学べる講座
http://ai-light.com/itkeiei/
ニコニコチャンネル
http://ch.nicovideo.jp/ai-light
YouTubeチャンネル
https://www.youtube.com/user/ailightcom
Access・Excel倶楽部
http://ai-light.com/accessclub/
株式会社アイライト公式HP
http://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)
***********************************************************************************************************
*****************************************************************************
解答
a ウ 、b オ 、c ウ 、d エ 、e イ
*****************************************************************************
解説
#include
stdio.hは、入出力に関する関数が定義されている。本問では、fopen、printfなどの関数が該当する。
#include
string.hは、文字列操作に関する関数が定義されている。本問では、strlenなどの関数が該当する。
fp = fopen( "moji.f","r");
ファイル"moji.f"をモード"r"でファイルをオープンする。"r"モードは、読込み専用モードであることを表している。
その他のモードには以下のものがある。
モード | 動作 | ファイルがあるとき | ファイルがないとき |
R | 読み出し専用 | 正常 | エラー(NULL返却) |
W | 書き込み専用 | サイズを0にする | 新規作成 |
A | 追加書き込み専用 | 最後に追加する | 新規作成 |
r+ | 読み込みと書き込み | 正常 | エラー(NULL返却) |
w+ | 書き込みと読み込み | サイズを0にする | 新規作成 |
a+ | 読み込みと追加書き込み | 最後に追加する | 新規作成 |
fgets(fbuf, RCLEN, fp)
ファイルポインタfpから1行、またはRCLENバイト読み込んでその先頭アドレスをfbufに返す。全行を読み込んだ場合、又はエラー時にNULL(\0)を返す。
[ a ]
ここで、"moji.f"のデータを1行づつ読込んでいき処理を行うが、ファイルのデータをすべて読み込んだ時点でwhileを終了すればよい。上記より、関数fgetsは全行を読込んだら、NULLを返す。逆にいうとfgets(fbuf, RCLEN, fp)がNULLでない場合はwhile内をループすればよい。よって、aの解答は、ウとなる。
for(cf = fbuf; *cf != '\n'; cf++);
for文では、実行する処理が一つの場合は以下のように記述する。
for (初期化;条件式;変化式)
実行する処理;
また、複数行を処理するときは、以下のように記述する。
for (初期化;条件式;変化式){
...;
...;
...;
}
1行処理する際でも、for( ) { } としてもよいわけで、通常は、このように記載することが多い。
本問では、for( ) ; と記載しており;の前に実行する処理がないままで、for文が実行されることになる。for文では、まずはじめに
cf = fbuf
が実行される。fbufは配列で定義されているが配列の[]をつけない場合、配列の先頭文字のアドレスがcfにセットされる。
cf++
でcfの指すアドレスに+1していくので、この処理で次の文字を順に読んでいくことになる。
終了条件は
cf != '\n'
で'\n'は改行文字であることから、cfの最終文字までデータを読込むことになる。
*cf = '\0';
でcf の最終文字である'\n'を'\0'に置き換えている。
printf(" %s\n >>",[ b ]);
では、その前段階で
printf("画面に表示された文字列をキーボードから入力してください。\n\n");
を実行して、"画面に表示された文字列をキーボードから入力してください。”と表示している。図2のプログラム実行例から文字列格納ファイルの内容を表示さればよい。
文字列格納ファイルは、fbufに格納されているので、解答はオとなる。
[ c ]
前段階で文字列格納ファイルを表示していることから、ここでは1行の入力を行う必要がる。
getc(fp)は、ファイルから1文字ずつ読み込む関数であるので解答ではない。
gets(ibuf) は、標準入力から1行を読み込みibufにセットする。よって解答はウとなる。
getchar()は、キーボードから1文字を読み込み、その結果を返す関数であるので解答ではない。
if(strlen(fbuf) != strlen(ibuf))
strlenは文字列の長さを取得し返却する関数である。fbufには、文字列格納ファイルから読み込んだ1行が入っている。ibufには、前行より入力された文字が入っている。よって、
文字列格納ファイルと入力された文字の長さが等しいかをチェックしている。
for(cf = fbuf, ci = ibuf; *cf != '\0'; cf++, ci++)
for文の初期処理として、
cf = fbuf,で、文字列格納ファイルの先頭アドレスをcfにセットしている。
同様に、ci = ibufで、入力された文字列の先頭アドレスをciにセットしている。
終了条件は、*cf != '\0'で、cfの最終文字には'\0'が入っていることから文字の最終まで処理を行うことを示している。
繰返し条件は、cf++, ci++で、cf,ciにはポインタなのでアドレスがセットされているが、そのアドレスに+1することで次の文字を順にみていく。
if(*cf != *ci)
下のprinf文にもある通りcfとciの文字があっているかをチェックしている。
if(*cf == '\0')mode = LEXIT;
3行前のbreak文で、文字が異なっているとfor文を抜けることになっているから、
*cf == '\0'ということは、文字が同じであったことを示している。
この時にmode = LEXITにセットしている。
if(mode == LOOP)
全文より、文字列格納ファイルと入力文字が正しければmodeはLEXITとなり、異なっていればmodeはLOOPのままである。
[ d ]
最終文で再入力した回数を表示しているがその際の変数としてercntを使用している。また、
ercntはプログラマ中でどこにも出てきていない。さらに、この箇所はまさに再入力になった時のみに実行されることからここでercntをカウントアップすればよいことがわかる。
よって解答はエとなる。
[ e ]
ercntの変数はプログラムの前段よりint型であることがわかる。printfで整数型を表示するときは%dを使用する。よって、解答はイとなる。
ちなみに、printfの出力データの変換形式は以下の通りである。
変換指定文字 | 内容 | 使われるデータ型 |
%c | 1文字として出力する | 文字型 |
%d | 10進数で出力する | 整数型 |
%x | 16進数で出力する | 整数型 |
%o | 8進数で出力する | 整数型 |
%f | [-]dddd.ddddddの形式で出力する | 浮動小数点型 |
%e | 指数形式で出力する | 浮動小数点型 |
%s | 文字列として出力する | 文字列 |
***********************************************************************************************************
無料から学べる講座
http://ai-light.com/itkeiei/
ニコニコチャンネル
http://ch.nicovideo.jp/ai-light
YouTubeチャンネル
https://www.youtube.com/user/ailightcom
Access・Excel倶楽部
http://ai-light.com/accessclub/
株式会社アイライト公式HP
http://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)
***********************************************************************************************************
- 関連記事
-
- 平成7年秋期第二種情報処理技術者試験午後問7、C言語 (2017/03/29)
- 平成21年 秋期 基本情報技術者試験 午後 問9、C言語 (2016/11/07)
- 平成21年 春期 基本情報技術者試験 午後 問9、C言語 (2016/11/02)