前提
このプログラムでやろうとしていることは、入力された乗車駅と下車駅から、2駅間の距離と大阪環状線の運賃を求めて、表示するものです。
入力ファイルとして、KYORI-FILE
とUNCHIN-FILE
があります。
■KYORI-FILE.DAT
項目EKIMEI-K
は大阪環状線の各駅名、項目KYORI-K
は大阪駅を基準にそれぞれの駅に外回りで到達するまでの距離が入っている。KYORI-K
は小数第一位まで表示する
■UNCHIN-FILE.DAT
項目KYORI-U
は距離、UNCHIN-U
はKYORI-U
当たりにかかる運賃が入っている
【処理部の説明】
<補足説明>
・乗車駅にENDを入力するとプログラムを終了
・入力した駅が該当しない場合は、再度駅名を入力させる
<処理内容>
・内回りと外回りの短い方の距離と安い方の運賃を求める
<処理方法>
①距離ファイルを配列に格納
②乗車駅と下車駅の駅名を入力し、配列を駅名で検索
③2つの駅の大阪からの距離を求める
④外回り距離(2つの距離の差)と内回りを計算する
<内回り距離 計算式>
内回り距離 = 環状線1周の距離(21.7KM) - 外回り距離
<処理結果>
乗車駅から下車駅間の距離と運賃を画面に表示する
入力した駅が距離ファイルにない場合は、再度駅名を入力する
実現したいこと
COBOLで入力ファイルから受け取ってるレコード項目の値を作業用の配列に入れて使いたいのですが、値がデータ部で定義したとおりに入ってくれません。
準備処理セクション(関数)で、入力ファイルのレコード項目の値をループをかけ、作業用配列に入れてる箇所で、DISPLAY文で中身を確認すると、どうも上手く値が入っておりません。(値が抜け落ちてる箇所があったり、なぜかEKIMEI-K
とKYORI-K
で項目を分けているのに、両方の値がEKIMEI-K
に入っていたり)
その先の入力処理も、上手く機能していないのですが、まずは、上記に上げた箇所の修正を実現したいです。
配列に苦手意識があり、初歩的なミスをしてるかもしれませんが、どうか回答よろしくお願いします。
発生している問題
DISPLAY文によるEKIMEI-K
から配列に受け取った値の確認
テンマ 016 サラノミヤ 024 キウバシ 042 オオカジョコウエン モリノヤ 059マツク 068 ルハシ 077 モモ゙ニ 5 テラタチョウ 97 テンᄈジ 7 シンイミヤ イマミ 129 イショ 14735 シクシᆴウ 181ダ 193 フシマ オオサ
…正しく値が入っていない
試したこと
駅名に半角カナ文字を利用して データ部では英数字項目(x)で定義していましたが、これに問題があるのかと思い、KYORI-FILE.DAT
のEKIMEI-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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/06 07:13
2021/06/06 07:52
2021/06/06 11:40 編集
2021/06/06 14:11
2021/06/06 22:20 編集
2021/06/06 22:47 編集