algorytm.org

Implementacja w C/C++



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 C/C++
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.

Kody Kreskowe - C++/Unit1.cpp:
//---------------------------------------------------------------------------
// Generowanie kodow kreskowych UPC-E
// www.algorytm.org
// (c)2007 Tomasz Lubinski

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}

byte UPCE[8];
byte bars[51];


byte parityTable[2][10][6] = {
        {
                {1, 1, 1, 0, 0, 0},
                {1, 1, 0, 1, 0, 0},
                {1, 1, 0, 0, 1, 0},
                {1, 1, 0, 0, 0, 1},
                {1, 0, 1, 1, 0, 0},
                {1, 0, 0, 1, 1, 0},
                {1, 0, 0, 0, 1, 1},
                {1, 0, 1, 0, 1, 0},
                {1, 0, 1, 0, 0, 1},
                {1, 0, 0, 1, 0, 1}
        },
        {
                {0, 0, 0, 1, 1, 1},
                {0, 0, 1, 0, 1, 1},
                {0, 0, 1, 1, 0, 1},
                {0, 0, 1, 1, 1, 0},
                {0, 1, 0, 0, 1, 1},
                {0, 1, 1, 0, 0, 1},
                {0, 1, 1, 1, 0, 0},
                {0, 1, 0, 1, 0, 1},
                {0, 1, 0, 1, 1, 0},
                {0, 1, 1, 0, 1, 0}
        }
};

byte left[2][10][7] = {
                {
                        {0, 0, 0, 1, 1, 0, 1},
                        {0, 0, 1, 1, 0, 0, 1},
                        {0, 0, 1, 0, 0, 1, 1},
                        {0, 1, 1, 1, 1, 0, 1},
                        {0, 1, 0, 0, 0, 1, 1},
                        {0, 1, 1, 0, 0, 0, 1},
                        {0, 1, 0, 1, 1, 1, 1},
                        {0, 1, 1, 1, 0, 1, 1},
                        {0, 1, 1, 0, 1, 1, 1},
                        {0, 0, 0, 1, 0, 1, 1}
                },
                {
                        {0, 1, 0, 0, 1, 1, 1},
                        {0, 1, 1, 0, 0, 1, 1},
                        {0, 0, 1, 1, 0, 1, 1},
                        {0, 1, 0, 0, 0, 0, 1},
                        {0, 0, 1, 1, 1, 0, 1},
                        {0, 1, 1, 1, 0, 0 ,1},
                        {0, 0, 0, 0, 1, 0, 1},
                        {0, 0, 1, 0, 0, 0 ,1},
                        {0, 0, 0, 1, 0, 0, 1},
                        {0, 0, 1, 0, 1, 1, 1}
                }
        };


//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        int i, j;

        if (Kod->Text.Length() != 8) {
                ShowMessage("Incorrect UPC-E number");
                return;
        }
        for (i=0; i<8; i++) {
                UPCE[i] = Kod->Text[i+1] - 48;
        }

        if (Check() != 0) {
                ShowMessage("Incorrect UPC-E number");
                return;
        }

        for (i=0; i<51; i++) {
                bars[i] = 0;
        }

        bars[0] = 1;
        bars[1] = 0;
        bars[2] = 1;

        for (i=1; i<7; i++) {
                for (j=0; j<7; j++) {
                        bars[(i-1)*7 + 3 + j] = left[parityTable[UPCE[0]][UPCE[7]][i-1]][UPCE[i]][j];
                }
        }

        bars[45] = 0;
        bars[46] = 1;
        bars[47] = 0;
        bars[48] = 1;
        bars[49] = 0;
        bars[50] = 1;

        DrawBars();

}
//---------------------------------------------------------------------------

void TForm1::DrawBars()
{
        int i, length;

        Image1->Canvas->Brush->Color = clWhite;
        Image1->Canvas->Rectangle(0, 0, 225, 121);
        Image1->Canvas->Brush->Color = clBlack;
        for (i=0; i<51; i++) {
                if ((i >= 0 && i<= 2) ||
                    (i >= 45 && i<= 50)) {
                    length = 110;
                } else {
                    length = 100;
                }
                if (bars[i] == 1) {
                        Image1->Canvas->Rectangle(i*2 + 20, 10, i*2 + 22, length);
                }
        }

        Image1->Canvas->Font->Size = 10;
        Image1->Canvas->Brush->Color = clWhite;
        Image1->Canvas->Font->Color = clBlack;
        for (i=1; i<7; i++) {

                Image1->Canvas->TextOutA(i*14 + 16, 100, IntToStr(UPCE[i]));
        }

        Image1->Canvas->TextOutA(7, 90, IntToStr(UPCE[0]));
        Image1->Canvas->TextOutA(125, 90, IntToStr(UPCE[7]));

}

//---------------------------------------------------------------------------


int TForm1::Check()
{
   byte upca[12];

   //check system number
   if ((UPCE[0] != 0) && (UPCE[0] != 1))
   {
      return -1;
   }

   //convert UPC-E to UPC-A
   if ((UPCE[6] >= 0) && (UPCE[6] <= 2))
   {
      upca[3] = UPCE[6];
      upca[4] = 0;
      upca[5] = 0;
      upca[6] = 0;
      upca[7] = 0;
      upca[8] = UPCE[3];
      upca[9] = UPCE[4];
      upca[10] = UPCE[5];
   }
   else if ((UPCE[6] == 3) && (UPCE[3] >= 3) && (UPCE[3] <= 9))
   {
      upca[3] = UPCE[3];
      upca[4] = 0;
      upca[5] = 0;
      upca[6] = 0;
      upca[7] = 0;
      upca[8] = 0;
      upca[9] = UPCE[4];
      upca[10] = UPCE[5];
   }
   else if (UPCE[6] == 4)
   {
      upca[3] = UPCE[3];
      upca[4] = UPCE[4];
      upca[5] = 0;
      upca[6] = 0;
      upca[7] = 0;                  
      upca[8] = 0;
      upca[9] = 0;
      upca[10] = UPCE[5];
   }
   else if ((UPCE[6] >= 5) && (UPCE[6] <= 9))
   {
      upca[3] = UPCE[3];
      upca[4] = UPCE[4];
      upca[5] = UPCE[5];
      upca[6] = 0;
      upca[7] = 0;                  
      upca[8] = 0;
      upca[9] = 0;
      upca[10] = UPCE[6];
   }
   else
   {
      return -1;
   }
   
   //copy two first digits of producer code
   upca[1] = UPCE[1];
   upca[2] = UPCE[2];
   
   //copy system numer and chec digit
   upca[0] = UPCE[0];
   upca[11] = UPCE[7];
   
   //control check digit
   int sum = 3 * upca[0] +
             1 * upca[1] +
             3 * upca[2] +
             1 * upca[3] +
             3 * upca[4] +
             1 * upca[5] +
             3 * upca[6] +
             1 * upca[7] +
             3 * upca[8] +
             1 * upca[9] +
             3 * upca[10];
   sum %= 10;
   sum = 10 - sum;
   sum %= 10;
   if (sum != upca[11])
   {
      return -1;
   }

   return 0;
}


//---------------------------------------------------------------------------
Dodaj komentarz