algorytm.org

Implementacja w Delphi/Pascal

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

ISBN (ISBN-13) - Implementacja w Delphi/Pascal
Ocena użytkownikóww: *****  / 2
SłabyŚwietny
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.
Dodaj komentarz