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-10 - Implementacja w Delphi/Pascal
Ocena użytkownikóww: *****  / 1
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 28 lutego 2006 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) 2006
//
// numer ISBN
//
  
program ISBN_d;
{$APPTYPE CONSOLE}
uses
  SysUtils;



var
   ISBN : 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;
   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 : country := country + ISBN[i];
               1 : publisher := publisher + ISBN[i];
               2 : book := book + ISBN[i];
               3 : 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(country) do
            begin
               sum := sum + ((10 - counter) * StrToInt(country[i]));
    	       counter := counter + 1;
            end;
         for i:=1 to length(publisher) do
            begin
               sum := sum + ((10 - counter) * StrToInt(publisher[i]));
    	       counter := counter + 1;
            end;
         for i:=1 to length(book) do
            begin
               sum := sum + ((10 - counter) * StrToInt(book[i]));
    	       counter := counter + 1;
            end;
         sum := sum mod 11;
	 sum := 11 - sum;
	 sum := sum mod 11;
         if (UpperCase(checkNumber) = 'X') then
            if sum = 10 then
               result := true
            else
               result := false
         else
            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) = 3) and
      ((length(ISBN) = 13) or (length(ISBN) = 18))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('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