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;
}
//---------------------------------------------------------------------------

