質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
COBOL

COBOL(COmmon Business Oriented Langage)は、実務処理用に開発されたプログラミング言語です。

Q&A

解決済

2回答

2002閲覧

COBOLで入力レコードの値が定義した配列に上手く入らない

COBOL_TURAI

総合スコア2

COBOL

COBOL(COmmon Business Oriented Langage)は、実務処理用に開発されたプログラミング言語です。

0グッド

0クリップ

投稿2021/06/05 23:27

編集2021/06/07 05:20

前提

このプログラムでやろうとしていることは、入力された乗車駅と下車駅から、2駅間の距離と大阪環状線の運賃を求めて、表示するものです。

入力ファイルとして、KYORI-FILEUNCHIN-FILEがあります。

KYORI-FILE.DAT
項目EKIMEI-Kは大阪環状線の各駅名、項目KYORI-Kは大阪駅を基準にそれぞれの駅に外回りで到達するまでの距離が入っている。KYORI-Kは小数第一位まで表示する

UNCHIN-FILE.DAT
項目KYORI-Uは距離、UNCHIN-UKYORI-U当たりにかかる運賃が入っている

【処理部の説明】
<補足説明>
・乗車駅にENDを入力するとプログラムを終了
・入力した駅が該当しない場合は、再度駅名を入力させる

<処理内容>
・内回りと外回りの短い方の距離と安い方の運賃を求める

<処理方法>
①距離ファイルを配列に格納
②乗車駅と下車駅の駅名を入力し、配列を駅名で検索
③2つの駅の大阪からの距離を求める
④外回り距離(2つの距離の差)と内回りを計算する

<内回り距離 計算式>
内回り距離 = 環状線1周の距離(21.7KM) - 外回り距離

<処理結果>
乗車駅から下車駅間の距離と運賃を画面に表示する
入力した駅が距離ファイルにない場合は、再度駅名を入力する

実現したいこと

COBOLで入力ファイルから受け取ってるレコード項目の値を作業用の配列に入れて使いたいのですが、値がデータ部で定義したとおりに入ってくれません。

準備処理セクション(関数)で、入力ファイルのレコード項目の値をループをかけ、作業用配列に入れてる箇所で、DISPLAY文で中身を確認すると、どうも上手く値が入っておりません。(値が抜け落ちてる箇所があったり、なぜかEKIMEI-KKYORI-Kで項目を分けているのに、両方の値がEKIMEI-Kに入っていたり)

その先の入力処理も、上手く機能していないのですが、まずは、上記に上げた箇所の修正を実現したいです。

配列に苦手意識があり、初歩的なミスをしてるかもしれませんが、どうか回答よろしくお願いします。

発生している問題

DISPLAY文によるEKIMEI-Kから配列に受け取った値の確認

テンマ 016 サラノミヤ 024 キウバシ 042 オオカジョコウエン モリノヤ 059マツク 068 ルハシ 077 モモ゙ニ 5 テラタチョウ 97 テンᄈジ 7 シンイミヤ イマミ 129 イショ 14735 シクシᆴウ 181ダ 193 フシマ オオサ

…正しく値が入っていない

試したこと

駅名に半角カナ文字を利用して データ部では英数字項目(x)で定義していましたが、これに問題があるのかと思い、KYORI-FILE.DATEKIMEI-Kを全角カナで書き直して、データ定義部で「PIC N(12)」を指定したのですが、これでも上手くいきませんでした。

ご指摘いただいて、試したこと

・2つの入力ファイルの改行コードを考慮して、データ定義部で改行コード分の領域を取る
➤解決

次の問題点

ACCEPT文記述の箇所でも、変数に値を上手く受け取れない問題が発生。受け取る変数の定義にも改行コード分の領域を定義したりしてみても改善されず
➤ACCEPTは行指向なので、改行いらない

【問題分析】
①ACCEPTで受け取った変数の冒頭の値が、空白で置き換えられている
②ACCEPT後に書いたDISPLAY文での固定文字列表示の冒頭も空白で置き換えられている
③②の後で、変数の値を表示するとしっかり値が受け取られている

現状原因不明

該当のソースコード

ARRAN5.COB

COBOL

1 IDENTIFICATION DIVISION. 2 PROGRAM-ID. ARRAN5. 3 4 5 ENVIRONMENT DIVISION. 6 INPUT-OUTPUT SECTION. 7 FILE-CONTROL. 8 SELECT KYORI-FILE ASSIGN TO "KYORIFILE.DAT". 9 SELECT UNCHIN-FILE ASSIGN TO "UNCHINFILE.DAT". 10 11 12 DATA DIVISION. 13 FILE SECTION. 14 FD KYORI-FILE. 15 01 KYORI-RECORD. 16 02 EKIMEI-K PIC X(12). 17 02 KYORI-K PIC 99V9. 18 02 FILLER PIC X(2). 19 20 FD UNCHIN-FILE. 21 01 UNCHIN-RECORD. 22 02 KYORI-U PIC 9(2). 23 02 UNCHIN-U PIC 9(4). 24 02 FILLER PIC X(2). 25 26 WORKING-STORAGE SECTION. 27 01 END-FLAG PIC X(3). 28 01 I PIC 9(2). 29 01 EKIMEI-JOUSHA PIC X(12). 30 01 EKIMEI-GESHA PIC X(12). 31 01 KYORI-JOUSHA PIC 99V9. 32 01 KYORI-GESHA PIC 99V9. 33 01 ICCHI-FLAG PIC 9(1). 34 01 SOTO-KYORI PIC 99V9. 35 01 UTI-KYORI PIC 99V9. 36 01 SAIYO-KYORI PIC Z9.9. 37 01 KYORI-O PIC 9(2). 38 01 UNCHIN-O PIC Z999. 39 40 01 KYORI-HAIRETU. 41 02 KOUMOKU OCCURS 20 TIMES. 42 03 EKIMEI-WK PIC X(12). 43 03 KYORI-WK PIC 99V9. 44 45 46 PROCEDURE DIVISION. 47 *<主処理>-------------------------------------- 48 MAIN SECTION. 49 PERFORM JUNBI-SYORI 50 PERFORM RECORD-SYORI 51 PERFORM ATOSHIMATSU-SYORI 52 STOP RUN. 53 54 *<準備処理>------------------------------------ 55 JUNBI-SYORI SECTION. 56 OPEN INPUT KYORI-FILE. 57 OPEN INPUT UNCHIN-FILE. 58 59 MOVE SPACE TO END-FLAG 60 MOVE 1 TO I 61 62 PERFORM 63 UNTIL END-FLAG = "EOF" 64 READ KYORI-FILE 65 AT END 66 MOVE "EOF" TO END-FLAG 67 NOT AT END 68 MOVE EKIMEI-K TO EKIMEI-WK(I) 69 MOVE KYORI-K TO KYORI-WK(I) 70 ADD 1 TO I 71 END-READ 72 END-PERFORM 73 MOVE SPACE TO END-FLAG. 74 75 *<レコードごとの処理>----------------------------------- 76 RECORD-SYORI SECTION. 77 78 *//入力処理---------------------- 79 MOVE 0 TO ICCHI-FLAG 80 PERFORM 81 UNTIL ICCHI-FLAG = 1 OR EKIMEI-JOUSHA = "END" 82 DISPLAY "乗車駅==>" WITH NO ADVANCING 83 ACCEPT EKIMEI-JOUSHA FROM CONSOLE 84 85 *EKIMI-JOUSHAの変数の冒頭部分がなぜか消えている 86 DISPLAY EKIMEI-JOUSHA 87 88 PERFORM JOUSHA-KENSAKU-SYORI 89 END-PERFORM 90 91 IF EKIMEI-JOUSHA = "END" 92 THEN 93 STOP RUN 94 END-IF 95 96 MOVE 0 TO ICCHI-FLAG 97 PERFORM 98 UNTIL ICCHI-FLAG = 1 99 DISPLAY "下車駅==>" WITH NO ADVANCING 100 ACCEPT EKIMEI-GESHA FROM CONSOLE 101 PERFORM GESHA-KENSAKU-SYORI 102 END-PERFORM 103 104 *//最短距離の運賃計算処理----------- 105 IF KYORI-GESHA - KYORI-JOUSHA > 0 106 THEN 107 COMPUTE SOTO-KYORI = KYORI-GESHA - KYORI-JOUSHA 108 ELSE 109 COMPUTE SOTO-KYORI = KYORI-JOUSHA - KYORI-GESHA 110 END-IF 111 112 COMPUTE UTI-KYORI = 21.7 - SOTO-KYORI 113 114 IF SOTO-KYORI <= UTI-KYORI 115 THEN 116 MOVE SOTO-KYORI TO SAIYO-KYORI 117 ELSE 118 MOVE UTI-KYORI TO SAIYO-KYORI 119 END-IF 120 MOVE SAIYO-KYORI TO KYORI-O 121 PERFORM UNCHIN-KENSAKU-SYORI 122 123 *//画面表示------------------------ 124 125 *確認用******************************************** 126 DISPLAY "乗車駅名 = " WITH NO ADVANCING 127 DISPLAY EKIMEI-JOUSHA 128 DISPLAY "乗車駅距離= " WITH NO ADVANCING 129 DISPLAY KYORI-JOUSHA 130 DISPLAY "下車駅名 = " WITH NO ADVANCING 131 DISPLAY EKIMEI-GESHA 132 DISPLAY "下車駅距離= " WITH NO ADVANCING 133 DISPLAY KYORI-GESHA 134 DISPLAY " " 135 DISPLAY "外回り距離= " WITH NO ADVANCING 136 DISPLAY SOTO-KYORI 137 DISPLAY "内回り距離= " WITH NO ADVANCING 138 DISPLAY UTI-KYORI 139 DISPLAY " " 140 ************************************************** 141 142 DISPLAY "距離 = " WITH NO ADVANCING 143 DISPLAY SAIYO-KYORI WITH NO ADVANCING 144 DISPLAY " km" 145 146 DISPLAY "運賃 = " WITH NO ADVANCING 147 DISPLAY UNCHIN-O WITH NO ADVANCING 148 DISPLAY " 円". 149 150 * <乗車駅検索処理>--------------------------------------- 151 JOUSHA-KENSAKU-SYORI SECTION. 152 MOVE 1 TO I 153 154 PERFORM 155 UNTIL EKIMEI-WK(I) = EKIMEI-JOUSHA OR I = 20 156 ADD 1 TO I 157 END-PERFORM 158 159 IF EKIMEI-WK(I) = EKIMEI-JOUSHA 160 THEN 161 MOVE 1 TO ICCHI-FLAG 162 MOVE KYORI-WK(I) TO KYORI-JOUSHA 163 END-IF. 164 165 * <下車駅検索処理>-------------------------------------- 166 GESHA-KENSAKU-SYORI SECTION. 167 MOVE 1 TO I 168 169 PERFORM 170 UNTIL EKIMEI-WK(I) = EKIMEI-GESHA OR I = 20 171 ADD 1 TO I 172 END-PERFORM 173 174 IF EKIMEI-WK(I) = EKIMEI-GESHA 175 THEN 176 MOVE 1 TO ICCHI-FLAG 177 MOVE KYORI-WK(I) TO KYORI-GESHA 178 END-IF. 179 180 * <運賃検索処理>---------------------------------------- 181 UNCHIN-KENSAKU-SYORI SECTION. 182 MOVE SPACE TO END-FLAG 183 184 READ UNCHIN-FILE 185 AT END 186 MOVE "EOF" TO END-FLAG 187 NOT AT END 188 MOVE UNCHIN-U TO UNCHIN-O 189 END-READ 190 191 PERFORM 192 UNTIL KYORI-O <= KYORI-U OR END-FLAG = "EOF" 193 OR END-FLAG = "EOF" 194 READ UNCHIN-FILE 195 AT END 196 MOVE "EOF" TO END-FLAG 197 NOT AT END 198 MOVE UNCHIN-U TO UNCHIN-O 199 END-READ 200 END-PERFORM. 201 202 *<後始末処理>------------------------------------------- 203 ATOSHIMATSU-SYORI SECTION. 204 CLOSE KYORI-FILE 205 CLOSE UNCHIN-FILE. 206

ACCEPTで入力値を受け取った変数EKIMEI-JOUSHAの確認

乗車駅==>サクラノミヤ ヤ 乗車駅==>

➤変数に上手く入力値が入らない
➤配列に一致する入力値が見つからず、常に駅名の再入力処理に戻される
➤ENDを入力して終了する処理も同様に、値が上手く入らないため再入力処理に戻される

他、実行に利用しているファイル

KYORI-FILE.DAT

DAT

1テンマ 016 2サクラノミヤ 024 3キョウバシ 042 4オオサカジョウコウエン050 5モリノミヤ 059 6タマツクリ 068 7ツルハシ 077 8モモダニ 085 9テラダチョウ 097 10テンノウジ 107 11シンイマミヤ 117 12イマミヤ 129 13アシハラバシ 135 14タイショウ 147 15ベンテンチョウ 165 16ニシクジョウ 181 17ノダ 193 18フクシマ 207 19オオサカ 217

UNCHIN-FILE.DAT

DAT

1030120 2060160 3100170 4150210 5200290 6250380 7300450 8350540 9400620 10450690 11500780 12600890 13701050 14801210

補足情報(FW/ツールのバージョンなど)

【OS】Windows10
【コンパイラ】MinGW

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

COBOLのREADは行を意識しないでレコード長の単位で読みます。
改行コードがCRLFなら下記のように改行コード分を追加してください。

COBOL

1 FILE SECTION. 2 FD KYORI-FILE. 3 01 KYORI-RECORD. 4 02 EKIMEI-K PIC X(12). 5 02 KYORI-K PIC 99V9. 6 02 FILLER PIC X(2). 7 8 FD UNCHIN-FILE. 9 01 UNCHIN-RECORD. 10 02 KYORI-U PIC 9(2). 11 02 UNCHIN-U PIC 9(4). 12 02 FILLER PIC X(2).

改行コードがLFのみならX(1)で。

投稿2021/06/06 01:24

otn

総合スコア84708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

COBOL_TURAI

2021/06/06 07:13

回答いただきありがとうございます。早速修正させていただいたのですが、以下のようになりました。 ###ご指摘を受けて、修正後の実行結果 PIC X (2)の場合 ``` ***ソースコード************************************* DATA DIVISION. FILE SECTION. FD KYORI-FILE. 01 KYORI-RECORD. 02 EKIMEI-K PIC X(12). 02 KYORI-K PIC 99V9. *ご指摘いただいた追記部分 02 FILLER PIC X(2). FD UNCHIN-FILE. 01 UNCHIN-RECORD. 02 KYORI-U PIC 9(2). 02 UNCHIN-U PIC 9(4). *ご指摘いただいた追記部分 02 FILLER PIC X(2). ***********************************ソースコード***** ***実行結果************************************* JUNBI-MAE テンマ 016 サクミヤ サカシウコウエ0 042 ツクリ 068 059 ツル 077モダニ 085 テᄒチョウ 97 テンᄑ゙ 1ンイマ 117 ミヤ アシバシ 1イショ 147 ヘテンチ 165 ニジョウ181 ノタ 193 シマ オオサJUNBI-ATO ***********************************実行結果***** ``` PIC X (1)の場合 ``` ***ソースコード************************************* DATA DIVISION. FILE SECTION. FD KYORI-FILE. 01 KYORI-RECORD. 02 EKIMEI-K PIC X(12). 02 KYORI-K PIC 99V9. *ご指摘いただいた追記部分 02 FILLER PIC X(1). FD UNCHIN-FILE. 01 UNCHIN-RECORD. 02 KYORI-U PIC 9(2). 02 UNCHIN-U PIC 9(4). *ご指摘いただいた追記部分 02 FILLER PIC X(1). ***********************************ソースコード***** ***実行結果************************************* JUNBI-MAE テンマ 016 サノミヤ 24 キョ゙シ オオザョウコン050 ノミヤ 059 タマリ 0ツルハシ 077 モ゙ニ 85 テラチョウ 7 マミヤ 1291シンイマ 117 アシバシ 135 タイウ 1ベンテョウ ニシクョウ 1ノダ 193 フマ 2オオサカJUNBI-ATO ***********************************実行結果***** ```
otn

2021/06/06 07:52

データファイルの文字コードはShift_JISになっていますか? なぜX(2)とX(1)と両方試した?? データファイルの書式を理解しないままでやっている?? それは無理でしょう。
COBOL_TURAI

2021/06/06 11:40 編集

ご指摘ありがとうございます。 おかげさまで、当初の問題はクリアできました。 ACCCEPT文を使っているところでも上手く値を受け取れない問題が起きているのですが、こちらも作業用で受け取る変数に改行分の領域を余分に定義してみたりもしましたが、解決には至りませんでした。 計算処理の方は固定値を入れて試すと上手くいきました。 あとはこの問題だけなので、なんとか解決したいです。
otn

2021/06/06 14:11

> おかげさまで、当初の問題はクリアできました。 16:13のコメントの時には何が悪かったのでしょうか? ACCEPTは行指向なので、改行コードは入らないと思いますよ。
COBOL_TURAI

2021/06/06 22:20 編集

当初の問題はご指摘いただいた改行コード分の領域未定義が原因でした。 あと入力ファイル自体の文字コードがUTF8に設定されていたので、SHIFT-JISに変更したら文字化けが改善されました。 ただ、実行結果を表示しているコマンドプロンプトでは逆にUTF8でないと文字化けするのがよく分からなかったりします。 ACCEPTの問題は、変数の定義が問題ではなさそうです。 *//入力処理---------------------- MOVE 0 TO ICCHI-FLAG PERFORM UNTIL ICCHI-FLAG = 1 OR EKIMEI-JOUSHA = "END" DISPLAY "乗車駅==>" WITH NO ADVANCING ACCEPT EKIMEI-JOUSHA FROM CONSOLE *冒頭に文字列を入れて表示してみる************************************* DISPLAY "EKIMEI-JOUSHA = " WITH NO ADVANCING **********************************冒頭に文字列を入れて表示してみる**** DISPLAY EKIMEI-JOUSHA PERFORM JOUSHA-KENSAKU-SYORI END-PERFORM このように冒頭で文字列を表示させたうえで、変数の中身を表示してみると以下のようになりました I-JOUSHA = サクラノミヤ DISPLAY文の固定文字列で冒頭の表示が消えていて、あとの変数の値は問題なく表示されています。 このことから、変数に値が受け取れていないというより、ACCEPTの後で、画面に文字を表示すると冒頭の領域部分が消えてしまうという問題である気がします。 ですが、変数に値が受け取れているなら、正しい入力を行った際には再入力処理に戻らないはずなので、処理の方にも問題があるかもしれません。確認後進展ありましたら、またご報告します
COBOL_TURAI

2021/06/06 22:47 編集

乗車駅検索処理の方でも、変数の値を表示させてみましたが、やはり変数の冒頭の値が抜け落ちてしまってます。 以下は乗車駅にサクラノミヤを入力した際なので、本来であれば、テンマの後で、次のサクラノミヤの配列の文字列が一致してループには入らず、表示もテンマのみで終わるはずです。 しかし冒頭部分が抜け落ちているので一致しない感じです。 ■コード * <乗車駅検索処理>--------------------------------------- JOUSHA-KENSAKU-SYORI SECTION. MOVE 1 TO I PERFORM UNTIL EKIMEI-WK(I) = EKIMEI-JOUSHA OR I = 20 DISPLAY EKIMEI-WK(I) *EKIMI-JOUSHAの変数の冒頭部分がなぜか消えている********************* DISPLAY EKIMEI-JOUSHA ********************EKIMI-JOUSHAの変数の冒頭部分がなぜか消えている** ADD 1 TO I END-PERFORM IF EKIMEI-WK(I) = EKIMEI-JOUSHA THEN MOVE 1 TO ICCHI-FLAG MOVE KYORI-WK(I) TO KYORI-JOUSHA END-IF. ■実行結果 ※EKIMEI-SHOUSHAの表示が冒頭にヤで始まってますが、正確には"サクラノミ"部分が空白に置き換わってヤだけ表示されている状況です。→△△△△△ヤ テンマ ヤ サクラノミヤ ヤ キョウバシ ヤ オオサカジョウコウエン ヤ モリノミヤ ヤ タマツクリ ヤ ツルハシ ヤ モモダニ ヤ テラダチョウ ヤ テンノウジ ヤ シンイマミヤ ヤ イマミヤ ヤ アシハラバシ ヤ タイショウ ヤ ベンテンチョウ ヤ ニシクジョウ ヤ ノダ ヤ フクシマ ヤ ヤ
guest

0

自己解決

###解決方法
ACCEPTで文字型で受け取ろうとすると、データ部で定義した文字数未満が入力された際、空白で埋められるらしいので、可変長で受け取れない時点で、何やっても駄目だと思い、受け取る値を数字型に変更しました。以下が仕様ごと変更したコードです。
ARRAN5_KUNIKU.COB

COBOL

1 IDENTIFICATION DIVISION. 2 PROGRAM-ID. ARRAN5. 3 4 5 ENVIRONMENT DIVISION. 6 INPUT-OUTPUT SECTION. 7 FILE-CONTROL. 8 SELECT KYORI-FILE ASSIGN TO "KYORIFILE.DAT" 9 ORGANIZATION IS LINE SEQUENTIAL. 10 SELECT UNCHIN-FILE ASSIGN TO "UNCHINFILE.DAT" 11 ORGANIZATION IS LINE SEQUENTIAL. 12 13 14 DATA DIVISION. 15 FILE SECTION. 16 * //距離ファイルのレコード項目 17 FD KYORI-FILE. 18 01 KYORI-RECORD. 19 02 EKIMEI-K PIC X(12). 20 02 KYORI-K PIC 99V9. 21 22 * //運賃ファイルのレコード項目 23 FD UNCHIN-FILE. 24 01 UNCHIN-RECORD. 25 02 KYORI-U PIC 9(2). 26 02 UNCHIN-U PIC 9(4). 27 28 WORKING-STORAGE SECTION. 29 *//データ終了フラグ 30 01 END-FLAG-K PIC X(3). 31 01 END-FLAG-U PIC X(3). 32 *//距離配列の添え字で利用 33 01 I PIC 9(2). 34 01 J PIC Z9. 35 *//乗車駅名・下車駅名を保持 36 01 EKIMEI-JOUSHA PIC X(12). 37 01 EKIMEI-GESHA PIC X(12). 38 *//乗車駅・下車駅の距離を保持 39 01 KYORI-JOUSHA PIC 99V9. 40 01 KYORI-GESHA PIC 99V9. 41 *//駅名一致フラグ 42 01 ICCHI-FLAG PIC 9(1). 43 *//駅間の外回り距離・内回り距離を保持 44 01 SOTO-KYORI PIC 99V9. 45 01 UTI-KYORI PIC 99V9. 46 *//2駅間の最短距離を保持 47 01 SAIYO-KYORI PIC 99V9. 48 *//画面表示用 49 01 KYORI-O PIC Z9.9. 50 01 UNCHIN-O PIC Z999. 51 52 *//距離ファイルの項目値を配列で保持 53 01 KYORI-HAIRETU. 54 02 KOUMOKU OCCURS 20 TIMES. 55 03 EKIMEI-WK PIC X(12). 56 03 KYORI-WK PIC 99V9. 57 58 59 PROCEDURE DIVISION. 60 *<主処理>-------------------------------------- 61 MAIN SECTION. 62 PERFORM JUNBI-SYORI 63 PERFORM RECORD-SYORI 64 UNTIL END-FLAG-K = "EOF" OR END-FLAG-U = "EOF" 65 PERFORM ATOSHIMATSU-SYORI 66 STOP RUN. 67 68 *<準備処理>------------------------------------ 69 JUNBI-SYORI SECTION. 70 OPEN INPUT KYORI-FILE. 71 OPEN INPUT UNCHIN-FILE. 72 MOVE SPACE TO END-FLAG-U 73 MOVE 1 TO I 74 75 PERFORM 76 UNTIL END-FLAG-K = "EOF" 77 READ KYORI-FILE 78 AT END 79 MOVE "EOF" TO END-FLAG-K 80 NOT AT END 81 MOVE EKIMEI-K TO EKIMEI-WK(I) 82 MOVE KYORI-K TO KYORI-WK(I) 83 ADD 1 TO I 84 END-READ 85 END-PERFORM 86 MOVE SPACE TO END-FLAG-K 87 88 * //レコード0件の場合の処理 89 IF I = 1 90 THEN 91 MOVE "EOF" TO END-FLAG-K 92 END-IF 93 94 READ UNCHIN-FILE 95 AT END 96 MOVE "EOF" TO END-FLAG-U 97 END-READ. 98 99 *<後始末処理>------------------------------------------- 100 ATOSHIMATSU-SYORI SECTION. 101 CLOSE KYORI-FILE 102 CLOSE UNCHIN-FILE. 103 104 *<レコードごとの処理>----------------------------------- 105 RECORD-SYORI SECTION. 106 PERFORM 107 UNTIL END-FLAG-K = "EOF" OR END-FLAG-U = "EOF" 108 * //駅名表示 109 MOVE 1 TO I 110 PERFORM 111 UNTIL I = 20 112 MOVE I TO J 113 DISPLAY J WITH NO ADVANCING 114 DISPLAY " = " WITH NO ADVANCING 115 DISPLAY EKIMEI-WK(I) 116 ADD 1 TO I 117 END-PERFORM 118 DISPLAY " " 119 120 DISPLAY "上記より数字番号で指定してください" 121 DISPLAY " " 122 123 * //乗車駅入力処理------------------------ 124 MOVE 0 TO ICCHI-FLAG 125 PERFORM 126 UNTIL ICCHI-FLAG = 1 127 128 DISPLAY "乗車駅==>" WITH NO ADVANCING 129 ACCEPT I FROM CONSOLE 130 131 IF I >=1 AND I <= 19 132 THEN 133 DISPLAY EKIMEI-WK(I) 134 MOVE EKIMEI-WK(I) TO EKIMEI-JOUSHA 135 DISPLAY " " 136 PERFORM JOUSHA-KENSAKU-SYORI 137 END-IF 138 139 * //乗車駅に99が入力されたら処理終了 140 IF I = 99 141 THEN 142 PERFORM ATOSHIMATSU-SYORI 143 STOP RUN 144 END-IF 145 146 END-PERFORM 147 148 * //下車駅入力処理--------------------------- 149 MOVE 0 TO ICCHI-FLAG 150 PERFORM 151 UNTIL ICCHI-FLAG = 1 152 153 DISPLAY "下車駅==>" WITH NO ADVANCING 154 ACCEPT I FROM CONSOLE 155 DISPLAY EKIMEI-WK(I) 156 MOVE EKIMEI-WK(I) TO EKIMEI-GESHA 157 DISPLAY " " 158 PERFORM GESHA-KENSAKU-SYORI 159 END-PERFORM 160 161 * //外回り距離計算----------- 162 IF KYORI-GESHA - KYORI-JOUSHA > 0 163 THEN 164 COMPUTE SOTO-KYORI = KYORI-GESHA - KYORI-JOUSHA 165 ELSE 166 COMPUTE SOTO-KYORI = KYORI-JOUSHA - KYORI-GESHA 167 END-IF 168 169 * //内回り距離計算----------- 170 COMPUTE UTI-KYORI = 21.7 - SOTO-KYORI 171 172 * //最短距離を保持----------- 173 IF SOTO-KYORI <= UTI-KYORI 174 THEN 175 MOVE SOTO-KYORI TO SAIYO-KYORI 176 ELSE 177 MOVE UTI-KYORI TO SAIYO-KYORI 178 END-IF 179 PERFORM UNCHIN-KENSAKU-SYORI 180 181 * //画面表示 182 MOVE SAIYO-KYORI TO KYORI-O 183 DISPLAY "距離 = " WITH NO ADVANCING 184 DISPLAY KYORI-O WITH NO ADVANCING 185 DISPLAY " km" 186 187 MOVE UNCHIN-U TO UNCHIN-O 188 DISPLAY "運賃 = " WITH NO ADVANCING 189 DISPLAY UNCHIN-O WITH NO ADVANCING 190 DISPLAY " 円" 191 DISPLAY " " 192 END-PERFORM. 193 194 * <乗車駅検索処理>--------------------------------------- 195 JOUSHA-KENSAKU-SYORI SECTION. 196 IF EKIMEI-WK(I) = EKIMEI-JOUSHA 197 THEN 198 MOVE 1 TO ICCHI-FLAG 199 MOVE KYORI-WK(I) TO KYORI-JOUSHA 200 END-IF. 201 202 * <下車駅検索処理>-------------------------------------- 203 GESHA-KENSAKU-SYORI SECTION. 204 IF EKIMEI-WK(I) = EKIMEI-GESHA 205 THEN 206 MOVE 1 TO ICCHI-FLAG 207 MOVE KYORI-WK(I) TO KYORI-GESHA 208 END-IF. 209 210 * <運賃検索処理>---------------------------------------- 211 UNCHIN-KENSAKU-SYORI SECTION. 212 PERFORM 213 UNTIL SAIYO-KYORI <= KYORI-U OR END-FLAG-U = "EOF" 214 READ UNCHIN-FILE 215 AT END 216 MOVE "EOF" TO END-FLAG-U 217 END-READ 218 END-PERFORM. 219 220

回答者の方、回答いただきありがとうございました_(..)

投稿2021/06/09 22:01

編集2021/06/09 22:03
COBOL_TURAI

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問