Nadesłany przez Tomasz Lubiński, 24 lipca 2007 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
ISBN_d/ISBN_d.dpr:
//
// author Tomasz Lubinski
// www.algorym.org
// (c) 2007
//
// numer ISBN (ISBN-13)
//
program ISBN_d;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
ISBN : String;
prefix : String;
country : String;
publisher : String;
book : String;
checkNumber : String;
additional : String;
valid : Boolean;
CountryNo : array[0..143] of Integer = (
0, 1, 2, 3, 4, 5, 7, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 950, 951,
952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968,
969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985,
986, 987, 988, 989, 9946, 9947, 9948, 9949, 9951, 9952, 9953, 9954, 9955, 9956, 9957,
9958, 9959, 9960, 9961, 9962, 9963, 9964, 9965, 9966, 9967, 9968, 9970, 9971,
9972, 9973, 9974, 9975, 9976, 9977, 9978, 9979, 9980, 9981, 9982, 9983, 9984,
9985, 9986, 9987, 9988, 9989, 99901, 99902, 99903, 99904, 99905, 99906, 99908,
99909, 99910, 99911, 99912, 99913, 99914, 99915, 99916, 99917, 99918, 99919,
99920, 99921, 99922, 99923, 99924, 99925, 99926, 99927, 99928, 99929, 99930,
99931, 99932, 99933, 99934, 99935, 99936, 99937, 99938, 99939, 99940, 99941, 99942
);
CountryName : array [0..143] of String = (
'Obszar anglojęzyczny: Australia, Kanada, Gibraltar, Irlandia, (Namibia), Nowa Zelandia, Puerto Rico, Republika Południowej Afryki, Swaziland, UK, USA, Zimbabwe',
'Obszar anglojęzyczny: Australia, Kanada, Gibraltar, Irlandia, (Namibia), Nowa Zelandia, Puerto Rico, Republika Południowej Afryki, Swaziland, UK, USA, Zimbabwe',
'Obszar francuskojęzyczny: Francja, Belgia, Kanada, Luksemburg, Szwajcaria',
'Obszar niemieckojęzyczny: Austria, Niemcy, Szwajcaria', 'Japonia',
'Federacja Rosyjska, Ukraina, Bialoruś, Estonia, Litwa, Kazahstan, Kirgistan, Mołdawia, Łotwa, Georgia, Armenia',
'Chiny', 'Czechy, Słowacja', 'Indie', 'Norwegia', 'Polska', 'Hiszpania', 'Brazylia',
'Bośnia i Hercegowina, Chorwacja, Macedonia, Słowenia', 'Dania',
'Obszar włoskojęzyczny: Włochy, Szwajcaria', 'Korea', 'Holandia', 'Holandia, Belgia, Szwecja',
'Wydawcy międzynarodowi (UNESCO, UE), Organizacje Wspólnoty Europejskiej', 'Indie', 'Argentyna',
'Finlandia', 'Finlandia', 'Chorwacja', 'Bułgaria', 'Sri Lanka', 'Chile', 'Tajwan, Chiny', 'Columbia',
'Kuba', 'Grecja', 'Słowenia', 'Hong Kong', 'Węgry', 'Iran', 'Izrael', 'Ukraina', 'Malezja', 'Meksyk',
'Pakistan', 'Meksyk', 'Filipiny', 'Portugalia', 'Rumunia', 'Tajlandia', 'Turcja', 'Karaiby', 'Egipt',
'Nigeria', 'Indonezja', 'Wenezuela', 'Singapur', 'Południowy Pacyfik', 'Malezja', 'Bangladesz',
'Białoruś', 'Tajwan, Chiny', 'Argentyna', 'Hongkonga', 'Portugalia', 'Korea', 'Algieria', 'Estonia',
'Palestyna', 'Kosowo', 'Azerbejdżan', 'Liban', 'Maroko', 'Litwa', 'Kamerun', 'Jordania',
'Bośnia i Hercegowina', 'Libia', 'Arabia Saudyjska', 'Algieria', 'Panama', 'Cypr', 'Ghana',
'Kazachstan ', 'Kenia', 'Kirgistan', 'Kostaryka', 'Uganda', 'Singapur', 'Peru', 'Tunezja', 'Urugwaj',
'Mołdawia', 'Tanzania', 'Kostaryka', 'Ekwador', 'Islandia', 'Papua Nowa Gwinea', 'Maroko', 'Zambia',
'Gambia', 'Łotwa', 'Estonia', 'Litwa', 'Tanzania', 'Ghana', 'Macedonia', 'Bahrain', 'Gabon',
'Mauritius', 'Antyle Holenderskie', 'Boliwia', 'Kuwejt', 'Malawi', 'Malta', 'Sierra Leone',
'Lesoto', 'Botswana', 'Andora', 'Suriname', 'Malediwy', 'Namibia', 'Brunei Darussalam',
'Wyspy Faroe', 'Benin', 'Andora', 'Katar', 'Gwatemala', 'El Salvador', 'Nikaragua', 'Paragwaj',
'Honduras', 'Albania', 'Georgia', 'Mongolia', 'Armenia', 'Seszele', 'Malta', 'Nepal',
'Republika Dominikany', 'Haiti', 'Butan', 'Makao', 'Serbia', 'Gwatemala', 'Georgia',
'Armenia', 'Sudan'
);
function Format_ISBN(ISBN : String) : String;
var
outISBN : String;
i : Integer;
begin
outISBN := '';
for i:=1 to length(ISBN) do
if ISBN[i] <> ' ' then
outISBN := outISBN + ISBN[i];
Result := outISBN;
end;
function Get_Fields(ISBN : String) : Integer;
var
i : Integer;
field : Integer;
begin
field := 0;
prefix := '';
country := '';
publisher := '';
book := '';
checkNumber := '';
additional := '';
for i:=1 to length(ISBN) do
begin
if ISBN[i] = '-' then
field := field + 1
else
case field of
0 : prefix := prefix + ISBN[i];
1 : country := country + ISBN[i];
2 : publisher := publisher + ISBN[i];
3 : book := book + ISBN[i];
4 : checkNumber := checkNumber + ISBN[i];
end;
end;
Result := field;
end;
function checkSum(): Boolean;
var
counter, sum, i : Integer;
begin
counter := 0;
sum := 0;
if (length(checkNumber) <> 1) then
begin
result := false;
end
else
begin
for i:=1 to length(prefix) do
begin
counter := counter + 1;
if (counter mod 2) = 0 then
sum := sum + (StrToInt(prefix[i]) * 3)
else
sum := sum + StrToInt(prefix[i]);
end;
for i:=1 to length(country) do
begin
counter := counter + 1;
if (counter mod 2) = 0 then
sum := sum + (StrToInt(country[i]) * 3)
else
sum := sum + StrToInt(country[i]);
end;
for i:=1 to length(publisher) do
begin
counter := counter + 1;
if (counter mod 2) = 0 then
sum := sum + (StrToInt(publisher[i]) * 3)
else
sum := sum + StrToInt(publisher[i]);
end;
for i:=1 to length(book) do
begin
counter := counter + 1;
if (counter mod 2) = 0 then
sum := sum + (StrToInt(book[i]) * 3)
else
sum := sum + StrToInt(book[i]);
end;
sum := sum mod 10;
sum := 10 - sum;
sum := sum mod 10;
if sum = StrToInt(checkNumber) then
result := true
else
result := false;
end;
end;
function getCountry(): String;
var
code, i, j: Integer;
begin
result := 'unknown';
code := 0;
for i:=1 to length(country) do
begin
code := code * 10;
code := code + StrToInt(country[i]);
for j:=0 to 143 do
begin
if CountryNo[j] = code then
begin
result := CountryName[j];
exit;
end;
end;
end;
end;
begin
writeln('Podaj numer ISBN');
readln(ISBN);
ISBN := Format_ISBN(ISBN); //remove all spaces
if (Get_Fields(ISBN) = 4) and
((length(ISBN) = 17) or (length(ISBN) = 22) and
(length(prefix) = 3) and
(length(country) > 0) and
(length(country) < 6)) then
begin
if (length(checkNumber) = 6) and
(length(ISBN) = 18) then
begin
additional := Copy(checkNumber, 2, 6);
checkNumber := checkNumber[1];
end;
valid := checkSum();
end
else
valid := False;
if valid = True then
begin
writeln('Numer ISBN jest prawidłowy');
writeln('Prefiks: ' + prefix);
writeln('Kraj/język: ' + getCountry);
writeln('Kod kraju: ' + country);
writeln('Kod wydawcy: ' + publisher);
writeln('Kod książki: ' + book);
writeln('Suma kontrolna: ' + checkNumber);
end
else
writeln('Numer ISBN jest nieprawidłowy');
readln;
end.

