2014-10-15 2 views
-2
  IDENTIFICATION DIVISION.        
     PROGRAM-ID. TEMP1 .          
     ENVIRONMENT DIVISION.         
     DATA DIVISION.           
     WORKING-STORAGE SECTION.        
     01 WS-A PIC 9(2).          
     01 WS-B PIC 9(2).          
     PROCEDURE DIVISION.          
      ACCEPT WS-A.          
      COMPUTE WS-B ROUNDED = ((9/5) * WS-A) + 32. 
      DISPLAY WS-B.          
      STOP RUN.   

Это моя программа для принятия температуры в Celcius и преобразования ее в Фаренгейт. Я создал LOADLIB и COPYLIB. Также один JCL для компиляции и RUNJCL. Ошибка не возникает, но когда я даю какой-либо вход (например, 98) в RUNJCL, он всегда отображает 32 в качестве вывода. В чем проблема?Преобразователь температуры не возвращает правильное значение

+1

Кажется, что ваш вопрос был в COBOL , Я исправил его для вас. (http://caseconverter.com/ на помощь!). –

+0

При вставке просто выделите код, который вы хотите скопировать, затем вставьте. Номера строк затрудняют попытку вашего кода. Следите за своими тегами. Придерживайтесь COBOL и мэйнфреймов и JCL, в которых участвует JCL. –

ответ

3

Если результат вы получаете всегда 32, а затем WS-A равен нулю, потому что что-то умножают на ноль и добавление 32 всегда будет 32.

Я подозреваю, что у вас есть в вашем JCL что-то вроде этого:

//SYSIN DD * 
00212 

Когда вы делаете ACCEPT, вы получите только 00 от этого.

При использовании ACCEPT для небольших программ тестирования рекомендуется отображать то, что вы получаете, чтобы вы могли видеть.

Либо сделайте WS-A больше, либо значение на карте, следующее за вашим SYSIN, меньше.

Если у вас есть другие проблемы, вызывающие обращение к значению WS-A как нулю. Итак, вы можете вставить JCL из файла 2 на катушку для своей задачи. С номерами строк, которые он сгенерировал :-)

И данные карты SYSIN (ваш 98). Обратите внимание, в частности, на любые «SYSIN сгенерированные» операторы в вашем JCL-выходе.

Вот ваша программа. Я избавился от ненужных вещей и изменил имена WS-A и WS-B. Теперь, когда WS-B имеет собственное имя, вы можете видеть, что при его создании он имеет неправильную длину, он должен быть не менее трех цифр.

ID DIVISION. 
    PROGRAM-ID. TEMP1. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 INPUT-CENTIGRADE     PIC 9(2). 
    01 OUTPUT-FARENHEIT     PIC 9(3). 
    PROCEDURE DIVISION. 
     ACCEPT      INPUT-CENTIGRADE 
     DISPLAY 
       "CELSIUS COMING IN " 
       ">" 
            INPUT-CENTIGRADE 
       "<" 

     COMPUTE OUTPUT-FARENHEIT ROUNDED 
            = ((9/5) 
             * INPUT-CENTIGRADE) 
             + 32 

     DISPLAY 
       "FARENHEIT GOING OUT " 
       ">" 
            OUTPUT-FARENHEIT 
       "<" 
     GOBACK 
     . 

Выход запуска программы является:

CELSIUS COMING IN >98< 
FARENHEIT GOING OUT >208< 

Запуск этой версии вашей программы с «0098» для ввода дает это:

CELSIUS COMING IN >00< 
FARENHEIT GOING OUT >032< 
+1

Я подозреваю, что вы правы. Это может быть исправлено с ошибкой, приняв полную строку, обрезая пробелы из строки и используя функцию num-val() для остальных, чтобы преобразовать в INPUT-CENTIGRADE. –

+1

@JoeZitzelberger хорошо мысль. Далее я расскажу, почему значение получает измельчение (не все COBOLs делают это именно так) и делают несколько примеров для более безопасных способов получения данных из 'ACCEPT'. Благодарю. –

Смежные вопросы