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?

EAN-13 - Implementacja w C/C++
Ocena użytkownikóww: *****  / 5
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 27 października 2005 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 EAN13
// www.algorytm.org
// (c)2005 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 EAN13[13];
byte bars[95];

byte parityTable[10][6] = {
        {0, 0, 0, 0, 0, 0},
        {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 right[10][7] = {
        {1, 1, 1, 0, 0, 1, 0},
        {1, 1, 0, 0, 1, 1, 0},
        {1, 1, 0, 1, 1, 0, 0},
        {1, 0, 0, 0, 0, 1, 0},
        {1, 0, 1, 1, 1, 0, 0},
        {1, 0, 0, 1, 1, 1, 0},
        {1, 0, 1, 0, 0, 0, 0},
        {1, 0, 0, 0, 1, 0, 0},
        {1, 0, 0, 1, 0, 0, 0},
        {1, 1, 1, 0, 1, 0, 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() != 13) {
                ShowMessage("Incorrect EAN13 number");
                return;
        }

        for (i=0; i<13; i++) {
                EAN13[i] = Kod->Text[i+1] - 48;
        }
        for (i=0; i<95; i++) {
                bars[i] = 0;
        }

        if (Check() == 0) {
                ShowMessage("Incorrect EAN13 number");
                return;
        }

        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[EAN13[0]][i-1]][EAN13[i]][j];
                }
        }

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

         for (i=7; i<13; i++) {
                for (j=0; j<7; j++) {
                        bars[(i-7)*7 + 50 + j] = right[EAN13[i]][j];
                }
        }

        bars[92] = 1;
        bars[93] = 0;
        bars[94] = 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<95; i++) {
                if ((i >= 0 && i<= 2) ||
                    (i >= 45 && i<= 49) ||
                    (i >= 92 && i<= 94)) {
                    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 + 17, 100, IntToStr(EAN13[i]));
        }

        for (i=7; i<13; i++) {

                Image1->Canvas->TextOutA(i*14 + 27, 100, IntToStr(EAN13[i]));
        }
        Image1->Canvas->TextOutA(7, 90, IntToStr(EAN13[0]));

}

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


int TForm1::Check()
{
        int sum = 0;
        int sum_even = 0;
        int sum_uneven = 0;
        int i;

        for (i=1; i<12; i+=2) {
                sum_uneven += EAN13[i];
        }
        for (i=0; i<12; i+=2) {
                sum_even += EAN13[i];
        }
        sum = sum_uneven*3 + sum_even;
        sum %= 10;
        sum = 10 - sum;
        sum %= 10;

        if (EAN13[12] == sum) {
                return 1;
        }
        else {
                return 0;
        }
}
//---------------------------------------------------------------------------
Komentarze
photo
0 # Paweł Paweł 2015-02-18 19:52
Szybko pięknie i co najważniejsze implementacja to ctrl+V praktycznie, dzięki!
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz