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?

UPC-E - Implementacja w Delphi/Pascal
Ocena użytkownikóww: *****  / 1
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 29 sierpnia 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.

upc-e - delphi/upc_e.dpr:
//www.algorytm.org
//Konwersja pomiedzy UPC-A i UPC-E
//(c)2007 by Tomasz Lubinski

program upc_e;
{$APPTYPE CONSOLE}
uses
  SysUtils;

var
   upca: String;
   upce: String;
   i: Integer;

//return true if check digit is correct, false otherwise
function checkControlDigit(upca: String): boolean;
var
   sum : Integer;
begin
      sum := 3 * StrToInt(upca[1]) +
             1 * StrToInt(upca[2]) +
             3 * StrToInt(upca[3]) +
             1 * StrToInt(upca[4]) +
             3 * StrToInt(upca[5]) +
             1 * StrToInt(upca[6]) +
             3 * StrToInt(upca[7]) +
             1 * StrToInt(upca[8]) +
             3 * StrToInt(upca[9]) +
             1 * StrToInt(upca[10]) +
             3 * StrToInt(upca[11]);
   sum := sum mod 10;
   sum := 10 - sum;
   sum := sum mod 10;
   if (sum <> StrToInt(upca[12])) then
      Result := false
   else
      Result := true;
end;


//UPC-E => UPC-A
function convertToUPCA(upce: String): String;
var
   i: Integer;
   upce_ : array[1..8] of Integer;
begin
   Result := '000000000000';

   //check length of code
   if (length(upce) <> 8) then
   begin
      Result := 'Nieprawidlowa dlugosc kodu UPC-E (powinno byc 8 znakow)';
      exit;
   end;
   
   //convert chars to digits
   for i:=1 to 8 do
      upce_[i] := StrToInt(upce[i]);

   //check system number
   if ((upce_[1] <> 0) and (upce_[1] <> 1)) then
   begin
      Result := 'Numer systemu UPC-E musi wynosic 0 badz 1';
      exit;
   end;

   //convert UPC-E to UPC-A
   if ((upce_[7] >= 0) and (upce_[7] <= 2)) then
   begin
      Result[4] := upce[7];
      Result[5] := '0';
      Result[6] := '0';
      Result[7] := '0';
      Result[8] := '0';
      Result[9] := upce[4];
      Result[10] := upce[5];
      Result[11] := upce[6];
   end
   else if ((upce_[7] = 3) and (upce_[4] >= 3) and (upce_[4] <= 9)) then
   begin
      Result[4] := upce[4];
      Result[5] := '0';
      Result[6] := '0';
      Result[7] := '0';
      Result[8] := '0';
      Result[9] := '0';
      Result[10] := upce[5];
      Result[11] := upce[6];
   end
   else if (upce_[7] = 4) then
   begin
      Result[4] := upce[4];
      Result[5] := upce[5];
      Result[6] := '0';
      Result[7] := '0';
      Result[8] := '0';
      Result[9] := '0';
      Result[10] := '0';
      Result[11] := upce[6];
   end
   else if ((upce_[7] >= 5) and (upce_[7] <= 9)) then
   begin
      Result[4] := upce[4];
      Result[5] := upce[5];
      Result[6] := upce[6];
      Result[7] := '0';
      Result[8] := '0';
      Result[9] := '0';
      Result[10] := '0';
      Result[11] := upce[7];
   end
   else
   begin
      Result := 'Nieprawidlowy kod UPC-E';
      exit;
   end;

   //copy two first digits of producer code
   Result[2] := upce[2];
   Result[3] := upce[3];

   //copy system numer and chec digit
   Result[1] := upce[1];
   Result[12] := upce[8];
   
   //control check digit
   if (checkControlDigit(Result) <> true) then
   begin
      Result := 'Nieprawidlowa suma kontrolna';
      exit;
   end;
end;

//UPC-A => UPC-E
function convertToUPCE(upca: String): String;
var
   i: Integer;
   upca_ : array[1..12] of Integer;
begin
   Result := '00000000';

   //check code length
   if (length(upca) <> 12) then
   begin
      Result := 'Nieprawidlowa dlugosc kodu UPC-A (powinno byc 12 znakow)';
      exit;
   end;


   //convert chars to digits
   for i:=1 to 12 do
      upca_[i] := StrToInt(upca[i]);

   //control check digit
   if (checkControlDigit(upca) <> true) then
   begin
      Result := 'Nieprawidlowa suma kontrolna';
      exit;
   end;
   
   //check system number
   if ((upca_[1] <> 0) and (upca_[1] <> 1)) then
   begin
      Result := 'Numer systemu UPC-A musi wynosic 0 badz 1';
      exit;
   end;
   
   //convert UPC-A to UPC-E
   if ((upca_[4] >= 0) and (upca_[4] <= 2) and
       (upca_[5] = 0) and (upca_[6] = 0) and (upca_[7] = 0) and (upca_[8] = 0)) then
   begin
      Result[4] := upca[9];
      Result[5] := upca[10];
      Result[6] := upca[11];
      Result[7] := upca[4];
   end
   else if ((upca_[4] >= 3) and (upca_[4] <= 9) and
       (upca_[5] = 0) and (upca_[6] = 0) and (upca_[7] = 0) and (upca_[8] = 0)  and (upca_[9] = 0)) then
   begin
      Result[4] := upca[4];
      Result[5] := upca[10];
      Result[6] := upca[11];
      Result[7] := '3';
   end
   else if ((upca_[6] = 0) and (upca_[7] = 0) and (upca_[8] = 0) and (upca_[9] = 0) and (upca_[10] = 0)) then
   begin
      Result[4] := upca[4];
      Result[5] := upca[5];
      Result[6] := upca[11];
      Result[7] := '4';
   end
   else if ((upca_[11] >= 5) and (upca_[11] <= 9) and
       (upca_[7] = 0) and (upca_[8] = 0) and (upca_[9] = 0) and (upca_[10] = 0)) then
   begin
      Result[4] := upca[4];
      Result[5] := upca[5];
      Result[6] := upca[6];
      Result[7] := upca[7];
   end
   else
   begin
      Result := 'Tego kodu UPC-A nie można przekonwertować do UPC-E';
      exit;
   end;
   
   //copy two first digits of producer code
   Result[2] := upca[2];
   Result[2] := upca[3];

   //copy system numer and check digit
   Result[1] := upca[1];
   Result[8] := upca[12];
end;


begin

   writeln('1. UPC-A => UPCE-E');
   writeln('2. UPC-E => UPC-A');
   readln(i);
   
   if (i=1) then
   begin
      writeln('Podaj kod UPC-A');
      readln(upca);
      upce := convertToUPCE(upca);
      writeln('Rownowazny kod UPC-E to: ');
      writeln(upce);
   end
   else
   begin
      writeln('Podaj kod UPC-E');
      readln(upce);
      upca := convertToUPCA(upce);
      writeln('Rownowazny kod UPC-A to: ');
      writeln(upca);
   end;

end.
Dodaj komentarz