#openedge #progress-4gl #4gl
Вопрос:
Вы можете мне помочь? если преобразовать двоичный код в восьмеричный, кто-нибудь может мне помочь…???
этот код преобразует восьмеричный в двоичный. помогите мне изменить этот код.
function oct2bin returns character ( input octalString as character ):
define variable i as integer no-undo.
define variable n as integer no-undo.
define variable c as character no-undo.
define variable result as character no-undo.
n = length( octalString ).
if n < 2 or substring( octalString, 1, 1 ) <> "~" then /* a valid octalString begins with "" */
do:
message "valid octal strings must begin with ~".
result = ?.
end.
else
do i = 2 to n:
c = substring( octalString, i, 1 ).
if asc( c ) < 48 or asc( c ) > 55 then /* a valid octalString only contains the digits 0 thru 7 */
do:
message c "is not a valid numeric character".
result = ?.
leave.
end.
Ответ №1:
Группы из трех битов могут быть преобразованы в восьмеричную цифру. Разделите двоичное число на трехразрядные группы, преобразуйте группу в восьмеричную цифру, затем постройте цифры в восьмеричное число.
PROCEDURE BinToOct:
DEFINE INPUT PARAMETER pcBinStr AS CHARACTER NO-UNDO.
DEFINE OUTPUT PARAMETER pcOctStr AS CHARACTER NO-UNDO.
DEFINE VARIABLE cPadding AS CHARACTER NO-UNDO.
DEFINE VARIABLE iLoop AS INTEGER NO-UNDO.
DEFINE VARIABLE cBinDigit AS CHARACTER NO-UNDO.
DEFINE VARIABLE cOctDigit AS CHARACTER NO-UNDO.
/* Pad input with zeroes to make it divisible by 3. */
IF LENGTH(pcBinStr) MOD 3 <> 0 THEN
ASSIGN
cPadding = FILL("0", (3 - LENGTH(pcBinStr) MOD 3))
pcBinStr = cPadding pcBinStr.
/* Divide up bits into groups of 3. */
DO iLoop = 1 TO LENGTH(pcBinStr) BY 3:
cBinDigit = SUBSTRING(pcBinStr, iLoop, 3).
/* Convert bits to octal digit. */
CASE cBinDigit:
WHEN "000" THEN cOctDigit = "0".
WHEN "001" THEN cOctDigit = "1".
WHEN "010" THEN cOctDigit = "2".
WHEN "011" THEN cOctDigit = "3".
WHEN "100" THEN cOctDigit = "4".
WHEN "101" THEN cOctDigit = "5".
WHEN "110" THEN cOctDigit = "6".
WHEN "111" THEN cOctDigit = "7".
OTHERWISE MESSAGE "Bad input" VIEW-AS ALERT-BOX ERROR.
END CASE.
/* Add digit to result string. */
pcOctStr = pcOctStr cOctDigit.
END.
END PROCEDURE.
DEFINE VARIABLE cResult AS CHARACTER NO-UNDO.
RUN BinToOct (INPUT "1010011100101", OUTPUT cResult).
MESSAGE cResult VIEW-AS ALERT-BOX INFORMATION.
Комментарии:
1. Поэтому я хочу вывести результат, используя введенные мной данные, например, если я введу 100 двоичных чисел, то восьмеричный результат будет равен 4 и так далее. Вот что мне нужно, сэр.
2. Именно это он и делает. Вход «100», а выход равен 4. Вы хотите сказать, что вам нужен параметр ввода-вывода, в котором двоичный ввод перезаписывается восьмеричным выводом? Или вы хотите, чтобы это была функция, а не процедура?