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?

Code 93 - Implementacja w C/C++
Ocena użytkownikóww: *****  / 1
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 20 września 2006 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 CODE 93
// www.algorytm.org
// (c)20, 06 Tomasz Lubinski
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

char special_1 = 127 + 1; // ($)
char special_2 = 127 + 2; // (%)
char special_3 = 127 + 3; // (/)
char special_4 = 127 + 4; // (+)

char code93sign[47] = {
      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
      'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
      'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
      'U', 'V', 'W', 'X', 'Y', 'Z', '-', '.', ' ', '$',
      '/', '+', '%', special_1, special_2, special_3, special_4};
      
char code93bars[47][9] = {
        {1, 0, 0, 0, 1, 0, 1, 0, 0},
        {1, 0, 1, 0, 0, 1, 0, 0, 0},
        {1, 0, 1, 0, 0, 0, 1, 0, 0},
        {1, 0, 1, 0, 0, 0, 0, 1, 0},
        {1, 0, 0, 1, 0, 1, 0, 0, 0},
        {1, 0, 0, 1, 0, 0, 1, 0, 0},
        {1, 0, 0, 1, 0, 0, 0, 1, 0},
        {1, 0, 1, 0, 1, 0, 0, 0, 0},
        {1, 0, 0, 0, 1, 0, 0, 1, 0},
        {1, 0, 0, 0, 0, 1, 0, 1, 0},
        {1, 1, 0, 1, 0, 1, 0, 0, 0},
        {1, 1, 0, 1, 0, 0, 1, 0, 0},
        {1, 1, 0, 1, 0, 0, 0, 1, 0},
        {1, 1, 0, 0, 1, 0, 1, 0, 0},
        {1, 1, 0, 0, 1, 0, 0, 1, 0},
        {1, 1, 0, 0, 0, 1, 0, 1, 0},
        {1, 0, 1, 1, 0, 1, 0, 0, 0},
        {1, 0, 1, 1, 0, 0, 1, 0, 0},
        {1, 0, 1, 1, 0, 0, 0, 1, 0},
        {1, 0, 0, 1, 1, 0, 1, 0, 0},
        {1, 0, 0, 0, 1, 1, 0, 1, 0},
        {1, 0, 1, 0, 1, 1, 0, 0, 0},
        {1, 0, 1, 0, 0, 1, 1, 0, 0},
        {1, 0, 1, 0, 0, 0, 1, 1, 0},
        {1, 0, 0, 1, 0, 1, 1, 0, 0},
        {1, 0, 0, 0, 1, 0, 1, 1, 0},
        {1, 1, 0, 1, 1, 0, 1, 0, 0},
        {1, 1, 0, 1, 1, 0, 0, 1, 0},
        {1, 1, 0, 1, 0, 1, 1, 0, 0},
        {1, 1, 0, 1, 0, 0, 1, 1, 0},
        {1, 1, 0, 0, 1, 0, 1, 1, 0},
        {1, 1, 0, 0, 1, 1, 0, 1, 0},
        {1, 0, 1, 1, 0, 1, 1, 0, 0},
        {1, 0, 1, 1, 0, 0, 1, 1, 0},
        {1, 0, 0, 1, 1, 0, 1, 1, 0},
        {1, 0, 0, 1, 1, 1, 0, 1, 0},
        {1, 0, 0, 1, 0, 1, 1, 1, 0},
        {1, 1, 1, 0, 1, 0, 1, 0, 0},
        {1, 1, 1, 0, 1, 0, 0, 1, 0},
        {1, 1, 1, 0, 0, 1, 0, 1, 0},
        {1, 0, 1, 1, 0, 1, 1, 1, 0},
        {1, 0, 1, 1, 1, 0, 1, 1, 0},
        {1, 1, 0, 1, 0, 1, 1, 1, 0},
        {1, 0, 0, 1, 0, 0, 1, 1, 0},
        {1, 1, 1, 0, 1, 1, 0, 1, 0},
        {1, 1, 1, 0, 1, 0, 1, 1, 0},
        {1, 0, 0, 1, 1, 0, 0, 1, 0}
        };

char start_stop[9] = { 
        1, 0, 1, 0, 1, 1, 1, 1, 0
        };

TForm1 *Form1;
int curentPos;


// returns 1 if letter is correct, 0 otherwise
int checkLetter(char ch)
{
        for (int i=0; i<43; i++)
                if (code93sign[i] == ch)
                        return 1;

        return 0;
}

// reurns 1 if txt is correct, 0 otherwise
int check(char *txt)
{
        for (unsigned int i=0; i<strlen(txt); i++)
                if (checkLetter(txt[i]) == 0)
                        return 0;

        return 1;
}

// returns letter value for check digit
int getLetterValue(char ch)
{
        for (int i=0; i<47; i++)
                if (code93sign[i] == ch)
                        return i;

        return 0;
}

// return check digit C
int checkDigitC(char *txt)
{
        int sum = 0;
        int w = 0;

        for (int i=strlen(txt)-1; i>=0; i--)
        {
                sum += (getLetterValue(txt[i]) * ((w % 20) + 1));
                w++;
        }

        return (sum % 47);

}

// return check digit K
int checkDigitK(char *txt, char checkDigitC)
{
        int sum = checkDigitC;
        int w = 1;

        for (int i=strlen(txt)-1; i>=0; i--)
        {
                sum += (getLetterValue(txt[i]) * ((w % 15) + 1));
                w++;
        }

        return (sum % 47);

}


void drawSignBars(char bars[])
{
        Form1->Image1->Canvas->Brush->Color = clBlack;

        //print bars
        for (int i=0; i<9; i++)
        {
                if (bars[i] == 1)
                        Form1->Image1->Canvas->Rectangle(curentPos + 20, 10, curentPos + 22, 100);

                curentPos += 2;
        }   
}

void drawTerminationBar()
{
        Form1->Image1->Canvas->Brush->Color = clBlack;

        Form1->Image1->Canvas->Rectangle(curentPos + 20, 10, curentPos + 22, 100);

        curentPos += 2;
}

void drawBars(char *txt)
{
        char c, k;
        
        c = checkDigitC(txt);
        k = checkDigitK(txt, c);
        
        curentPos = 0;
        Form1->Image1->Canvas->Brush->Color = clWhite;
        Form1->Image1->Canvas->Rectangle(0, 0, 441, 121);

        //print start character
        drawSignBars(start_stop);
        
        //print characters
        for (unsigned int i=0; i<strlen(txt); i++)
                for (int j=0; j<43; j++)
                        if (code93sign[j] == txt[i])
                        {
                                drawSignBars(code93bars[j]);
                                break;
                        }        

        //print check digit C
        drawSignBars(code93bars[c]);
        
        //print check digit K
        drawSignBars(code93bars[k]);        

        //print stop character
        drawSignBars(start_stop);

        //print termination bar
        drawTerminationBar();
        
        //Draw text
        Form1->Image1->Canvas->Font->Size = 10;
        Form1->Image1->Canvas->Brush->Color = clWhite;
        Form1->Image1->Canvas->Font->Color = clBlack;
        Form1->Image1->Canvas->TextOut(curentPos/2 + 20 - strlen(txt)*3, 100, txt);        
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
        if (check(Kod->Text.c_str()) == 0)
        {
                ShowMessage("Incorrect text");
                return;
        }

        drawBars(Kod->Text.c_str());
}
//---------------------------------------------------------------------------
Dodaj komentarz