Damm algorithm: Difference between revisions
Content added Content deleted
(→{{header|Ruby}}: made Ruby example more like other examples (test return boolean) and more idiomatic to Ruby (function name, brackets, single statement trailing if)) |
Not a robot (talk | contribs) (Add PL/M) |
||
Line 1,709: | Line 1,709: | ||
NIL |
NIL |
||
</pre> |
</pre> |
||
=={{header|PL/M}}== |
|||
<lang plm>100H: |
|||
/* DAMM CHECKSUM FOR DECIMAL NUMBER IN GIVEN STRING */ |
|||
CHECK$DAMM: PROCEDURE (PTR) BYTE; |
|||
DECLARE PTR ADDRESS, CH BASED PTR BYTE; |
|||
DECLARE DAMM DATA |
|||
( 0,3,1,7,5,9,8,6,4,2, |
|||
7,0,9,2,1,5,4,8,6,3, |
|||
4,2,0,6,8,7,1,3,5,9, |
|||
1,7,5,0,9,8,3,4,2,6, |
|||
6,1,2,3,0,4,5,9,7,8, |
|||
3,6,7,4,2,0,9,5,8,1, |
|||
5,8,6,9,7,2,0,1,3,4, |
|||
8,9,4,5,3,6,2,0,1,7, |
|||
9,4,3,8,6,1,7,2,0,5, |
|||
2,5,8,1,4,3,6,7,9,0 ); |
|||
DECLARE I BYTE; |
|||
I = 0; |
|||
DO WHILE CH <> '$'; |
|||
I = DAMM((I*10) + (CH-'0')); |
|||
PTR = PTR + 1; |
|||
END; |
|||
RETURN I = 0; |
|||
END CHECK$DAMM; |
|||
/* CP/M BDOS CALLS */ |
|||
BDOS: PROCEDURE (FN, ARG); |
|||
DECLARE FN BYTE, ARG ADDRESS; |
|||
GO TO 5; |
|||
END BDOS; |
|||
PRINT: PROCEDURE (STR); |
|||
DECLARE STR ADDRESS; |
|||
CALL BDOS(9, STR); |
|||
END PRINT; |
|||
/* TESTS */ |
|||
DECLARE TEST (4) ADDRESS; |
|||
TEST(0) = .'5724$'; |
|||
TEST(1) = .'5727$'; |
|||
TEST(2) = .'112946$'; |
|||
TEST(3) = .'112949$'; |
|||
DECLARE N BYTE; |
|||
DO N = 0 TO LAST(TEST); |
|||
CALL PRINT(TEST(N)); |
|||
CALL PRINT(.': $'); |
|||
IF CHECK$DAMM(TEST(N)) THEN |
|||
CALL PRINT(.'PASS$'); |
|||
ELSE |
|||
CALL PRINT(.'FAIL$'); |
|||
CALL PRINT(.(13,10,'$')); |
|||
END; |
|||
CALL BDOS(0,0); |
|||
EOF</lang> |
|||
{{out}} |
|||
<pre>5724: PASS |
|||
5727: FAIL |
|||
112946: PASS |
|||
112949: FAIL</pre> |
|||
=={{header|PureBasic}}== |
=={{header|PureBasic}}== |