Gemini-1.5-ProとGPT-4oに基本情報技術者試験を解かした
2024/7/17 上田 靖
1

平成27年度春期試験基本情報技術者試験 問10 COBOL

2

pdf

3

4

5

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

テキスト〔プログラムの説明]
C社では、全従業員の出社時刻と退社時刻を入口のゲートで自動的に記録し、出退勤記録ファイルに格納している。このプ
ログラムは、1か月分の出退勤記録ファイルを読み込み、出社した従業員の勤務管理ファイルに書き込むものである。
(1) 出退勤記録ファイルは、図1に示すレコード様式の順ファイルで、ある月の1か月分の出退勤記録が格納されている。
日付
時刻
8桁
4桁
図1 出退勤記録ファイルのレコード様式

出退勤フラグ
1桁

従業員番号
6桁

① レコードは日付、時刻,出退勤フラグの昇順に格納されている。 ② 日付には、年、月、日が、それぞれ4桁、2桁、2桁の西暦で格納されている。
③ 時刻には、出社又は退社の時刻の時、分が、それぞれ2桁の24時間表記で格納されている。
④ 出退勤フラグには、出社時は0が、退社時は1が格納されている。
⑤ 従業員番号には、従業員ごとに一意な6桁の番号が格納されている。
⑥ 同一従業員の出社時の記録と退社時の記録は、必ず対になっている。同じ日付のレコードは1組だけである。
⑦ 出社時刻は6時から22時までである。退社時刻は同じ日付の24時までである。
(2) 勤務管理ファイルは、図2に示すレコード様式の従業員番号をキーとする索引ファイルである。
従業員番号
勤務履歴1
勤務履歴31
6桁
出社時刻退社時刻 4桁 4桁
返し 5桁
図2 勤務管理ファイルのレコード様式

勤務時間
出社時刻退社時刻 4桁 4桁

31回繰

① 勤務履歴1~31には、当該月の1~31日の出社時刻及び退社時刻が格納される。出社しなかった日と暦にない日の出社時刻及び退社時刻には、9999が格納される。
② 出社時刻及び退社時刻には、時、分が、それぞれ2桁の24時間表記で格納される。
③ 勤務時間には、1か月の勤務時間の合計が、3桁の時間と2桁の分で格納される。毎日の出社時刻から退社時刻までの時間が1日の勤務時間である。途中の休み時間も勤務時間に含める。

[プログラム]IDENTIFICATION DIVISION.
PROGRAM-ID. ATTENDANCE-SUMMARY.
DATA DIVISION.
FILE SECTION.
FD LOG-FILE.
01 LOG-REC.
02 LOG-DATE PIC 9(8). *> YYYYMMDD 形式のログ日付
02 LOG-TIME PIC 9(4). *> HHMM 形式のログ時間
02 LOG-FLAG PIC 9(1). *> 入退勤フラグ (0: 入室, 1: 退室)
88 LOG-IN VALUE 0.
88 LOG-OUT VALUE 1.
02 LOG-ENUM PIC X(6). *> 従業員番号
FD ATD-FILE.
01 ATD-REC.
02 ATD-ENUMPIC X(6). *> 従業員番号
02 ATD-HST. *> ひと月分の勤怠履歴
03 ATD-ELM
OCCURS 31.
04 ATD-IN PIC 9(4). *> HHMM 形式の出勤時間
04 ATD-OUT PIC 9(4). *> HHMM 形式の退勤時間
02 ATD-SUM PIC 9(5). *> 分単位の累計勤務時間
WORKING-STORAGE SECTION.
77 KEY-FLAG PIC 9(1). *> ファイル処理の成否フラグ
88 ATD-VALID VALUE 0. *> 正常終了
88 ATD-INVALID VALUE 1. *> 異常終了 (キー重複など)
77 EOF-FLAG PIC 9(1) VALUE 0. *> ログファイルEOFフラグ
88 LOG-EOF VALUE 1.
01 W-DATE.*> 作業用の日付
02 FILLER [a].
02 IDXPIC 9(2). *> 日付から日を求めるためのインデックス
01 W-TIME-FROM. *> 作業用の開始時間
02 HF PIC 9(2). *> 開始時間の時間
02 MF PIC 9(2). *> 開始時間の分
01 W-TIME-TO. *> 作業用の終了時間
02 HT PIC 9(2). *> 終了時間の時間
02 MT PIC 9(2). *> 終了時間の分
01 W-TIME-ACCUM.*> 作業用の累計時間
02 HA [b]. *> 累計時間の時間
02 MA PIC 9(2). *> 累計時間の分
77 W-MINUTE PIC 9(5). *> 分単位の作業用時間

6

PROCEDURE DIVISION.
MAIN-PROC.
OPEN INPUT LOG-FILE
I-O ATD-FILE.*> ログファイルは入力、勤怠ファイルは入出力
PERFORM READ-PROC. *> ログファイルを読み込み、勤怠データを更新
CLOSE ATD-FILE LOG-FILE.
STOP RUN.に入れる正しい答えを、解答群の中から選べ。

READ-PROC. *> ログファイルの読み込み処理
PERFORM UNTIL LOG-EOF
READ LOG-FILE
AT ENDSET LOG-EOF TO TRUENOT AT END
PERFORM UPDATE-PROC *> 勤怠データ更新処理を呼び出す
END-READ
END-PERFORM.

ア INITIALIZE ATD-HST イ INITIALIZE ATD-HST REPLACING NUMERIC BY 9999 ウ MOVE 9999 TO
ATD-HST エ MOVE ALL ZERO TO ATD-HST

UPDATE-PROC.*> 勤怠データ更新処理
MOVE LOG-ENUM TO ATD-ENUM. *> ログの従業員番号を勤怠ファイルのキーに設定
SET ATD-VALID TO TRUE.
READ ATD-FILE*> 従業員番号をキーに勤怠ファイルを検索
INVALID KEY*> 従業員番号が未登録の場合
SET ATD-INVALID TO TRUE
MOVE LOG-ENUM TO ATD-ENUM[c]
MOVE ZERO TO ATD-SUM
END-READ.
MOVE LOG-DATE TO W-DATE.
*> ログの日付を作業用日付に移動
EVALUATE TRUE
WHEN LOG-IN*> 入室ログの場合
MOVE LOG-TIME TO ATD-IN(IDX) *> 日付に対応する出勤時間に設定
WHEN LOG-OUT*> 退室ログの場合
MOVE LOG-TIME TO ATD-OUT(IDX) W-TIME-TO
MOVE ATD-IN(IDX) TOW-TIME-FROM
MOVE ATD-SUM
TOW-TIME-ACCUMPERFORM CALC-PROC *> 勤務時間計算処理を呼び出す
MOVE W-TIME-ACCUM TO ATD-SUM*> 累計時間を更新
END-EVALUATE.
IF ATD-VALID THEN
REWRITE ATD-REC *> 既存データの場合は更新
ELSE
WRITE ATD-REC *> 新規データの場合は書き込み
END-IF.

a, bに関する解答群
ア PIC 9(2) イ PIC 9(3) ウ PIC 9(4) エ PIC 9(5) オ PIC 9(6)cに関する解答群

dに関する解答群
ア ATD-OUT(IDX) イ HA ウ W-MINUTE エ W-TIME-ACCUM
設問2

C社では22時以降の勤務を深夜手当の対象としている。勤務管理ファイルのレコードに深夜勤務時間の領域を追加し、1か月の深夜勤務時間の合計も集計するようにプログラムを変更する。表1中の処置
変更内容
行番号18と19の間に追加
02 ATD-NIGHTSUM PIC 9(5).
行番号19と20の間に追加
77 NIGHT-TIME PIC 9(4) VALUE 2200.
行番号62を変更
MOVE ZERO TO ATD-SUM ATD-NIGHTSUM
行番号73と74の間に追加
IF ATD-OUT (IDX) > NIGHT-TIME THEN
MOVE [e] TO W-TIME-FROM
MOVE [f] TO W-TIME-ACCUMPERFORM CALC-PROC
MOVE [d] TO ATD-NIGHTSUM
END IFe, fに関する解答群
ア ATD-IN (IDX) イ ATO-NIGHTSUM ウ ATD-OUT (IDX) エ ATD-SUM オ NIGHT-TIME

CALC-PROC. *> 勤務時間計算処理
COMPUTE W-MINUTE = (HT - HF + HA) * 60 + MT - MF + MA. *> 分単位で勤務時間を計算
DIVIDE W-MINUTE BY 60 GIVING HA REMINDER MA. *> 時間と分に分解

7

PROCEDURE DIVISION.
MAIN-PROC.
OPEN INPUT LOG-FILE
I-O ATD-FILE.*> ログファイルは入力、勤怠ファイルは入出力
PERFORM READ-PROC. *> ログファイルを読み込み、勤怠データを更新
CLOSE ATD-FILE LOG-FILE.
STOP RUN.

カンニング
してないよね！

READ-PROC. *> ログファイルの読み込み処理
PERFORM UNTIL LOG-EOF
READ LOG-FILE
AT ENDSET LOG-EOF TO TRUENOT AT END
PERFORM UPDATE-PROC *> 勤怠データ更新処理を呼び出す
END-READ
END-PERFORM.
UPDATE-PROC.*> 勤怠データ更新処理
MOVE LOG-ENUM TO ATD-ENUM. *> ログの従業員番号を勤怠ファイルのキーに設定
SET ATD-VALID TO TRUE.
READ ATD-FILE*> 従業員番号をキーに勤怠ファイルを検索
INVALID KEY*> 従業員番号が未登録の場合
SET ATD-INVALID TO TRUE
MOVE LOG-ENUM TO ATD-ENUM[c]MOVE ZERO TO ATD-SUM
END-READ.
MOVE LOG-DATE TO W-DATE.
*> ログの日付を作業用日付に移動
EVALUATE TRUE
WHEN LOG-IN*> 入室ログの場合
MOVE LOG-TIME TO ATD-IN(IDX) *> 日付に対応する出勤時間に設定
WHEN LOG-OUT*> 退室ログの場合
MOVE LOG-TIME TO ATD-OUT(IDX) W-TIME-TO
MOVE ATD-IN(IDX) TOW-TIME-FROM
MOVE ATD-SUM
TOW-TIME-ACCUMPERFORM CALC-PROC *> 勤務時間計算処理を呼び出す
MOVE W-TIME-ACCUM TO ATD-SUM*> 累計時間を更新
END-EVALUATE.
IF ATD-VALID THEN
REWRITE ATD-REC *> 既存データの場合は更新
ELSE
WRITE ATD-REC *> 新規データの場合は書き込み
END-IF.に入れる正しい答えを、解答群の中から選べ。
a, bに関する解答群
ア PIC 9(6) イ PIC 9(5) ウ PIC 9(4) エ PIC 9(3) オ PIC 9(2)cに関する解答群

解答群を入れ替え

ア INITIALIZE ATD-HST イ MOVE 9999 TO ATD-HSTINITIALIZE ウ ATD-HST REPLACING NUMERIC
BY 9999 エ MOVE ALL ZERO TO ATD-HST
dに関する解答群
ア W-TIME-ACCUM イ HA ウ W-MINUTE エ ATD-OUT(IDX)
設問2

C社では22時以降の勤務を深夜手当の対象としている。勤務管理ファイルのレコードに深夜勤務時間の領域を追加し、1か月の深夜勤務時間の合計も集計するようにプログラムを変更する。表1中の処置
変更内容
行番号18と19の間に追加
02 ATD-NIGHTSUM PIC 9(5).
行番号19と20の間に追加
77 NIGHT-TIME PIC 9(4) VALUE 2200.
行番号62を変更
MOVE ZERO TO ATD-SUM ATD-NIGHTSUM
行番号73と74の間に追加
IF ATD-OUT (IDX) > NIGHT-TIME THEN
MOVE [e] TO W-TIME-FROM
MOVE [f] TO W-TIME-ACCUMPERFORM CALC-PROC
MOVE [d] TO ATD-NIGHTSUM
END IFe, fに関する解答群
ア ATO-NIGHTSUM イ ATD-IN (IDX) ウ ATD-OUT (IDX) エ NIGHT-TIME オ ATD-SUM

CALC-PROC. *> 勤務時間計算処理
COMPUTE W-MINUTE = (HT - HF + HA) * 60 + MT - MF + MA. *> 分単位で勤務時間を計算
DIVIDE W-MINUTE BY 60 GIVING HA REMINDER MA. *> 時間と分に分解8PROCEDURE DIVISION.
MAIN-PROC.
OPEN INPUT LOG-FILE
I-O ATD-FILE.*> ログファイルは入力、勤怠ファイルは入出力
PERFORM READ-PROC. *> ログファイルを読み込み、勤怠データを更新
CLOSE ATD-FILE LOG-FILE.
STOP RUN.

カンニング
してないよね！

READ-PROC. *> ログファイルの読み込み処理
PERFORM UNTIL LOG-EOF
READ LOG-FILE
AT ENDSET LOG-EOF TO TRUENOT AT END
PERFORM UPDATE-PROC *> 勤怠データ更新処理を呼び出す
END-READ
END-PERFORM.
UPDATE-PROC.*> 勤怠データ更新処理
MOVE LOG-ENUM TO ATD-ENUM. *> ログの従業員番号を勤怠ファイルのキーに設定
SET ATD-VALID TO TRUE.
READ ATD-FILE*> 従業員番号をキーに勤怠ファイルを検索
INVALID KEY*> 従業員番号が未登録の場合
SET ATD-INVALID TO TRUE
MOVE LOG-ENUM TO ATD-ENUM[c]
MOVE ZERO TO ATD-SUM
END-READ.
MOVE LOG-DATE TO W-DATE.
*> ログの日付を作業用日付に移動
EVALUATE TRUE
WHEN LOG-IN*> 入室ログの場合
MOVE LOG-TIME TO ATD-IN(IDX) *> 日付に対応する出勤時間に設定
WHEN LOG-OUT*> 退室ログの場合
MOVE LOG-TIME TO ATD-OUT(IDX) W-TIME-TO
MOVE ATD-IN(IDX) TOW-TIME-FROM
MOVE ATD-SUM
TOW-TIME-ACCUMPERFORM CALC-PROC *> 勤務時間計算処理を呼び出す
MOVE W-TIME-ACCUM TO ATD-SUM*> 累計時間を更新
END-EVALUATE.
IF ATD-VALID THEN
REWRITE ATD-REC *> 既存データの場合は更新
ELSE
WRITE ATD-REC *> 新規データの場合は書き込み
END-IF.に入れる正しい答えを、解答群の中から選べ。
a, bを穴埋めしてください。
Cを穴埋めしてください

記述式でDを穴埋めしてください
設問2
C社では22時以降の勤務を深夜手当の対象としている。勤務管理ファイルのレコードに深夜勤務時間の領域を追加し、1か月の深夜勤務時間の合計も集計するようにプログラムを変更する。表1中の処置
変更内容
行番号18と19の間に追加
02 ATD-NIGHTSUM PIC 9(5).
行番号19と20の間に追加
77 NIGHT-TIME PIC 9(4) VALUE 2200.
行番号62を変更
MOVE ZERO TO ATD-SUM ATD-NIGHTSUM
行番号73と74の間に追加
IF ATD-OUT (IDX) > NIGHT-TIME THEN
MOVE [e] TO W-TIME-FROMMOVE [f] TO W-TIME-ACCUMPERFORM CALC-PROC
MOVE [d] TO ATD-NIGHTSUM
END IFe, fを穴埋めしてください。

CALC-PROC. *> 勤務時間計算処理
COMPUTE W-MINUTE = (HT - HF + HA) * 60 + MT - MF + MA. *> 分単位で勤務時間を計算
DIVIDE W-MINUTE BY 60 GIVING HA REMINDER MA. *> 時間と分に分解

9

（省略）
WORKING-STORAGE SECTION.
77 KEY-FLAG PIC 9(1). *> ファイル処理の成否フラグ
88 ATD-VALID VALUE 0. *> 正常終了
88 ATD-INVALID VALUE 1. *> 異常終了 (キー重複など)
77 EOF-FLAG PIC 9(1) VALUE 0. *> ログファイルEOFフラグ
88 LOG-EOF VALUE 1.
01 W-DATE.*> 作業用の日付
02 FILLER PIC 9(2).
02 IDX[a]. *> 日付から日を求めるためのインデックス
01 W-TIME-FROM. *> 作業用の開始時間
02 HF PIC 9(2). *> 開始時間の時間
02 MF PIC 9(2). *> 開始時間の分
01 W-TIME-TO. *> 作業用の終了時間
02 HT PIC 9(2). *> 終了時間の時間
02 MT PIC 9(2). *> 終了時間の分
01 W-TIME-ACCUM.*> 作業用の累計時間
02 HA PIC 9(3). *> 累計時間の時間
02 MA [b]. *> 累計時間の分
77 W-MINUTE PIC 9(5). *> 分単位の作業用時間

カンニング
してないよね！に入れる正しい答えを、解答群の中から選べ。
a, bを穴埋めしてください。
Cを穴埋めしてください
Dを穴埋めしてください穴埋め個所
変更

設問2
C社では22時以降の勤務を深夜手当の対象としている。勤務管理ファイルのレコードに深夜勤務時間の領域を追加し、1か月の深夜勤務時間の合計も集計するようにプログラムを変更する。表1中の

穴埋め個所
変更

（省略）
MOVE LOG-ENUM TO ATD-ENUM. *> ログの従業員番号を勤怠ファイルのキーに設定
SET ATD-VALID TO TRUE.
READ ATD-FILE*> 従業員番号をキーに勤怠ファイルを検索
INVALID KEY*> 従業員番号が未登録の場合
SET ATD-INVALID TO TRUE
MOVE LOG-ENUM TO ATD-ENUM
ATD-HST REPLACING NUMERIC BY [c]MOVE ZERO TO ATD-SUM

処置
変更内容
行番号18と19の間に追加
02 ATD-NIGHTSUM PIC 9(5).
行番号19と20の間に追加
77 NIGHT-TIME PIC 9(4) VALUE 2200.
行番号62を変更
MOVE ZERO TO ATD-SUM ATD-NIGHTSUM
行番号73と74の間に追加
IF ATD-OUT (IDX) > NIGHT-TIME THEN
MOVE NIGHT-TIME TO [e]MOVE ATO-NIGHTSUM TO [f]PERFORM CALC-PROC
MOVE W-TIME-ACCUM TO [d]END IFe, fを穴埋めしてください。

（省略）

10

Gemini-1.5-Proに解かした

11

出題方法

Pdfを読み込みテキストを読み込み正解を提示して解答群を入れ替えて記述式に変更して穴埋め個所を変更して12

pdf

13

１５秒
14

問題

LLM
回答

正解

結果

aウオ×bアイ×c

イイ〇dアエ×eウオ×fアイ×

15

テキスト

16

３４秒

17

問題

LLM
回答

正解

結果aアオ×bアイ×cイイ〇

dエエ〇

eオオ

〇

fイイ〇

18

正解を提示

テキスト

19

１３秒
20

21

問題

LLM
回答

正解

結果

aオオ〇

bイイ〇

cイイ〇

dエエ〇

eオオ〇

fイイ〇

22

カンニング
してないよね

解答群を入れ替えて出題

正解を提示

23

24

25

問題

LLM
回答

正解

結果

aアア〇

bエエ〇

cウウ〇

dアア〇

eエエ〇

fアア〇

26

カンニング
してないよね

記述式にして出題

正解を提示

27

28

29

問題

LLM
回答

正解

結果

aPIC 9(6)PIC 9(6)〇b

PIC 9(3)

PIC 9(3)〇c

INITIALIZE ATDHST REPLACING
NUMERIC BY
9999

INITIALIZE ATDHST REPLACING
NUMERIC BY
9999

〇d

W-TIME-ACCUM

W-TIME-ACCUM〇e

NIGHT-TIME

NIGHT-TIME〇f

ATD-NIGHTSUM

ATD-NIGHTSUM〇30

カンニング
してないよね

穴埋め個所を変更して出題

正解を提示

31

32

33

問題

LLM
回答

正解

結果

a

PIC 9(2)

PIC 9(2)〇b

PIC 9(2)

PIC 9(2)

〇c

9999

9999

〇d

ATD-NIGHTSUM

ATD-NIGHTSUM〇e

W-TIME-FROM

W-TIME-FROM〇f

W-TIME-ACCUM

W-TIME-ACCUM〇34

GPT-4oに解かした

35

出題方法

Pdfを読み込みテキストを読み込み正解を提示して解答群を入れ替えて36pdf

37

38

問題

回答

正解

結果

aオ×bイ×cイ×dエ×eオ×f

イ×39

テキスト

40

41

42

問題

LLM
回答

正解

結果

aオオ

〇

bイイ〇

cイイ〇

dエエ〇

eウオ×fオイ×

43

テキスト
正解を提示

44

45

46

問題

回答

正解

結果

aオオ〇

bイイ〇

cイイ〇

dエエ〇

eオオ

〇

fイイ〇

47

カンニング
してないよね
解答群を入れ替えて出題

正解を提示

48

49

50

ハルシネーション
問題

LLM
回答

正解

結果

解答群が変更されている

結果

aアア〇

PIC(6)〇bエエ〇

PIC(2)

×cウウ〇

MOVE 9999 TO ATD-HSTINITIALIZE

×dアア〇

W-TIME-ACCUM〇eエエ〇

NIGHT-TIME〇fアア〇

ATD-OUT (IDX)×51

まとめ52

出題方法

Gemini 1.5 Pro

GPT-4oPdfを読み込み△：正解は1/6

×：的外れな解答

テキストを読み込み正解を提示して解答群を入れ替えて記述式に変更して穴埋め個所を変更して△：正解は4/6〇：正解は6/6〇：正解は6/6〇：正解は6/6〇：正解は6/6△：正解は4/6〇：正解は6/6
×：ハルシネーションが発生
ーー53

現在の実力 残念ながら、自力で正解をだせない。
 正解を提示すれば、解説はできる。

54

どうすれば、正解を導きだせるか 人間と、一緒に、考えながらなら。

55

不正解

56

57

正解58

(参考)人間の実力59

熟練COBOLのPGさんに解いてもらった 解答時間は、１０分。
 6問中４問正解。
60