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.