44 lines
1 KiB
Text
44 lines
1 KiB
Text
MODULE ISBN;
|
|
FROM InOut IMPORT WriteString, WriteLn;
|
|
FROM Strings IMPORT Length;
|
|
|
|
PROCEDURE validISBN(s: ARRAY OF CHAR): BOOLEAN;
|
|
VAR total, i, length: CARDINAL;
|
|
BEGIN
|
|
total := 0;
|
|
length := Length(s);
|
|
IF (length # 14) OR (s[3] # '-') THEN
|
|
RETURN FALSE;
|
|
END;
|
|
FOR i := 0 TO length-1 DO
|
|
IF i # 3 THEN
|
|
IF (s[i] < '0') OR (s[i] > '9') THEN
|
|
RETURN FALSE;
|
|
ELSIF (i < 3) AND (i MOD 2 = 1) OR (i > 3) AND (i MOD 2 = 0) THEN
|
|
total := total + 3 * (ORD(s[i]) - ORD('0'));
|
|
ELSE
|
|
total := total + ORD(s[i]) - ORD('0');
|
|
END;
|
|
END;
|
|
END;
|
|
RETURN total MOD 10 = 0;
|
|
END validISBN;
|
|
|
|
PROCEDURE check(s: ARRAY OF CHAR);
|
|
BEGIN
|
|
WriteString(s);
|
|
WriteString(': ');
|
|
IF validISBN(s) THEN
|
|
WriteString('good');
|
|
ELSE
|
|
WriteString('bad');
|
|
END;
|
|
WriteLn;
|
|
END check;
|
|
|
|
BEGIN
|
|
check('978-0596528126');
|
|
check('978-0596528120');
|
|
check('978-1788399081');
|
|
check('978-1788399083');
|
|
END ISBN.
|