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