César Polcino Milies
IME-USP
 

     Parte I - Introdução

Hoje em dia, muitos produtos são identificados com um código numérico. O progresso da tecnologia, que tornou relativamente baratos e acessíveis aparelhos de leitura óptica e computadores, tornou também o uso desse tipo de códigos bastante freqüente. Por exemplo, os produtos que compramos num supermercado estão identificados por um código de barras, como o que mostramos na figura ao lado: não é mais do que um número, associado ao produto para sua identificação, escrito de forma a permitir uma leitura rápida no caixa. Note que, imediatamente abaixo das barras, aparece o mesmo número escrito em algarismos correntes, de forma que o leitor humano também possa ler o número.

Algumas vezes acontece que, ao passar um produto pela leitora ótica (por exemplo, quando a embalagem está úmida ou enrugada), esta não consegue realizar a leitura. O que vemos então é que a pessoa que está na caixa tenta passar o produto em sentido contrário, ou inverte o produto, de modo que o código de barras fique de cabeça para baixo, e tenta passá-lo mais uma vez. Se nem assim dá certo, então ela lê e digita o código.

Naturalmente, essas atitudes sugerem algumas perguntas. Em primeiro lugar, uma vez que o desenho das barras é totalmente simétrico para a máquina, que o lê usando um feixe de luz transversal, ao passá-lo “de ponta cabeça” ela não deveria ler o número na ordem contrária? E, o que é pior, o operador do caixa, ao digitar o número rapidamente, não poderia cometer um erro e nós acabarmos pagando por um produto muito mais caro que aquele que estamos comprando?

Na verdade, na prática, isso não ocorre. Tanto quando lido numa ordem, como na ordem contrária, o código sempre é interpretado de forma correta. Mais ainda, quando o operador comete algum erro de digitação − e todos nós já vimos isso acontecer alguma vez −, a máquina simplesmente emite um som, para avisar que houve um erro! (Embora exista uma remotíssima probabilidade de que o erro do operador possa não ser detectado, já que, como veremos, o sistema utilizado não é absolutamente infalível.)

O objetivo deste artigo é explicar como e por que isso acontece.

A primeira patente de um código de barras foi atribuída em 1952 a Joseph Woodland e Bernard Silver. Seu código consistia num padrão de circunferências concêntricas de espessura variável. Ao dar entrada ao pedido de patentes, eles descreviam seu invento como uma classificação de artigos através de identificação de padrões.

Em torno de 1970, uma firma de assessoria, a McKinsey & Co., junto com a Uniform Grocery Product Code Council1, definiu um formato numérico para identificar produtos e pediu a diversas companhias que elaborassem um código adequado. Dentre as firmas contactadas, a que acabou apresentando a proposta vencedora foi a IBM, e o código foi criado por George J. Laurer2 .

O código proposto, formalmente aceito em maio de 1973, passou a ser conhecido como código UPC (Universal Product Code) e foi adotado nos Estados Unidos e no Canadá. Ele consistia em uma seqüência de 12 dígitos, traduzidos para barras da forma que analisaremos detalhadamente na próxima seção. Existem várias versões sucessivas do UPC, com pequenas modificações. Posteriormente foi solicitado a Laurer que ampliasse o código, para permitir uma maior difusão do sistema, de modo a identificar também o país de origem de cada produto classificado. Baseado no UPC-A, ele acabou criando um novo código, com 13 dígitos, que foi adotado em dezembro de 1976 com o nome EAN (European Article Numbering system). Alguns países adotam esse mesmo sistema, dando-lhe outro nome. Por exemplo, no Japão o sistema é conhecido como JAN (Japanese Article Numbering system).

 

     Escrevendo com barras no código UPC

Vamos estudar inicialmente o código UPC, que é mais simples, e discutir duas questões:

• como se atribui um número a cada produto?

• como se escreve esse número utilizando barras?

Se observamos o código de barras da figura (código UPC), ao lado, vemos que o número correspondente é 0 75678 16412 5. Qualquer número do sistema UPC obedece a esse padrão, isto é, os 12 algarismos que o formam sempre são dispostos na forma x-xxxxx-xxxxx-x.

O primeiro algarismo do sistema UPC indica um “sistema numérico” que, de certa forma, especifica o tipo de produto classificado. Por exemplo, os começados por 0 são códigos atribuídos aos produtos de consumo usuais; o 1 está reservado para uso futuro, já os começados por 2 correspondem a artigos a serem pesados na loja e os começados por 3 são remédios e outros produtos relacionados com a saúde3 .

Os seguintes cinco algarismos do sistema são utilizados para identificar o fabricante e os outros cinco para identificar o produto em si. Finalmente,

O leitor pode ver a descrição completa deste “sistema numérico” e, em geral, de todo o código UPC na página http://www.barcodeilsta.com/upca.phtml o último algarismo, chamado o dígito de controle, é utilizado para detectar erros. A forma como isso é feito será discutida na Parte II deste artigo, que será publicada no próximo número 66 da RPM.

Por outro lado, se observamos a codificação de um número utilizando barras, notamos imediatamente que ela é formada por listras brancas e pretas alternadas, de espessura variável. Há, na verdade, quatro espessuras possíveis para essas listras, que podem ser classificadas como finas, médias, grossas ou muito grossas.

Vamos utilizar o símbolo 0 para indicar uma listra branca fina, o símbolo 00 para uma listra branca média, 000 para uma listra branca grossa e 0000 para uma muito grossa. Da mesma forma, vamos representar por 1, 11, 111 e 1111 uma listra preta fina, média, grossa ou muito grossa, respectivamente.

Assim, as primeiras quatro listras da figura (sem contar, é claro, as duas listras que servem de limite tanto no início quanto no fim do código), que são uma listra branca grossa, uma preta média, uma branca fina e uma preta fina respectivamente, podem ser representadas pela seqüência 0001101.

Como já dissemos, o código de barras representa uma série de números. Cada número é representado num espaço de espessura fixa, que corresponde sempre a uma seqüência de sete dígitos iguais a 1 ou 0. Por exemplo, a seqüência 0001101 que achamos acima representa o número 0, o primeiro do código da figura. O seguinte número do código, o 7, é representado pela seqüência 0111011.

Agora que começamos a compreender a forma de escrever com barras, já podemos responder à primeira das nossas perguntas: como a leitora distingue a direita da esquerda, quando o artigo pode ser passado em uma ou outra direção?

A resposta é muito engenhosa e, no caso do código UPC, ela é também bastante simples. Os dígitos são codificados de maneira diferente quando estão do lado direito ou esquerdo do código de barras. Isso é feito conforme a tabela da página a seguir.

Note que a codificação de um dado número, à direita, se obtém da sua codificação à esquerda, trocando cada 0 por 1 e reciprocamente. Agora, o mecanismo de reconhecimento fica claro se notarmos que cada seqüência do lado esquerdo tem um número ímpar de dígitos iguais a 1 e, conseqüentemente, cada uma das que estão à direita tem um número par. Assim, verificando a paridade de cada seqüência de sete dígitos, a máquina “sabe” imediatamente de que lado está lendo o código.

 

    O código EAN 13

A elaboração do código EAN, de uso mundial, se deparou com um problema bastante delicado. Era necessário adicionar um dígito a cada código, de modo a permitir a identificação do país de origem do produto, mas se desejava fazer isso de uma forma tal que a mesma máquina leitora pudesse ler indistintamente códigos UPC e EAN.

Note que, para manter a proximidade formal do EAN-13 com o código UPC, foi adicionado apenas mais um dígito ao código. Evidentemente, isso não quer dizer que só esse novo dígito seria empregado para distinguir países, já que existem bem mais de 10 países no mundo! Neste sistema, os primeiros dois ou três dígitos são utilizados para identificar o país onde o fabricante está registrado (que, nestes tempos globalizados, pode não ser, necessariamente, o país onde o artigo é produzido); os próximos quatro ou cinco dígitos (dependendo de quantos foram já utilizados para identificar o país) indicam o produtor e os cinco restantes identificam o próprio artigo produzido. Finalmente, o último dígito é um dígito de controle tal como no sistema UPC. Por exemplo, o código de barras de todos os produtos no Brasil começa com a seqüência 789, que é a que identifica o país4 .

Observando a figura a seguir, que representa o mesmo código numérico escrito em ambos os sistemas, vemos que os números, tal como escritos para o leitor humano, são de fato diferentes, já que, no código EAN-13, há um 0 a mais escrito no início da seqüência. Porém, se observamos os códigos de barras, vemos que a figura é exatamente a mesma em ambos os casos.

O dígito inicial 0, a mais no número que nós humanos podemos ler, se explica pelo fato de que os países que utilizavam o antigo código UPC, Estados Unidos e Canadá, foram identificados colocando-se precisamente um 0, na frente, e mantendo o resto da codificação como no sistema anterior.

Mas, por que o código, quando escrito com barras, parece não ter mudado? Como era necessário adicionar um dígito e, ao mesmo tempo, manter o mesmo padrão de tamanho do código de barras (para não ter que modificar todas as leitoras), a idéia utilizada foi fazer com que o novo dígito estivesse implícito na forma de escrita de todos os outros. Isso foi conseguido utilizando-se diversos padrões de paridade, na codificação do lado esquerdo, que variam, dependendo do dígito inicial. Por outro lado, não foi modificada a codificação do lado direito, em que todos os dígitos continuam codificados empregando-se um número par de posições iguais a 1 (permitindo assim que as leitoras continuassem a identificar o lado correspondente).

Se o dígito inicial é 0, para manter o padrão do sistema UPC, todos os dígitos do lado esquerdo são codificados utilizando-se sempre um número ímpar de posições iguais a 1, tal como antes. Se o dígito inicial for 1, então os seis dígitos do lado esquerdo serão codificados de acordo com o seguinte padrão: ímpar, ímpar, par, ímpar, par, par.

Para isso, foi elaborada uma nova simbologia, onde cada dígito do lado esquerdo pode ser codificado com um número par ou ímpar de posições iguais a 1, de acordo com a seguinte tabela:

dígito lado esquerdo ímpar lado esquerdo par lado direito
0 0001101 0100111 1110010
1 0011001 0110011 1100110
2 0010011 0011011 1101100
3 0111101 0100001 1000010
4 0100011 0011101 1011100
5 0110001 0111001 1001110
6 0101111 0000101 1010000
7 0111011 0010001 1000100
8 0110111 0001001 1001000
9 0001011 0010111 1110100

Finalmente, para cada dígito inicial escolheu-se uma alternância diferente de pares e ímpares de acordo com o seguinte critério:

dígito inicial 1 2 3 4 5 6
0 ímpar ímpar ímpar ímpar ímpar ímpar
1 ímpar ímpar par ímpar par par
2 ímpar ímpar par par ímpar par
3 ímpar ímpar par par par ímpar
4 ímpar par ímpar ímpar par par
5 ímpar par par ímpar ímpar par
6 ímpar par par par ímpar ímpar
7 ímpar par ímpar par ímpar par
8 ímpar par ímpar par par ímpar
9 ímpar par par ímpar par ímpar

Vejamos um exemplo. Uma barra de cereais produzida no Brasil tem o código 7895000266241. Começa com a seqüência 789, de modo que o primeiro dígito, que estará implícito na codificação dos demais, é sete. Conseqüentemente, deve-se usar, do lado esquerdo, a seguinte ordem de codificação (obtida na tabela acima): ímpar, par, ímpar, par, ímpar, par.

Consultando então a tabela de codificação do EAN-13, obtemos:

8 → 0110111          9 → 0010111          5 → 0111001

0 → 0100111          0 → 0001101          0 → 0100111

Para os dígitos do lado direito não temos que nos preocupar com paridade, e obtemos, diretamente da tabela, a seguinte codificação:

2 → 1101100          6 → 1010000          6 → 1010000

2 → 1101100          4 → 1011100          1 → 1100110

Portanto, o código de barras correspondente é:

Um último comentário a respeito desse código. Como já dissemos, os primeiros dois ou três dígitos do código (dependendo do caso) servem para identificar o país de origem. Os cinco ou quatro dígitos que restam, até as barras centrais, identificam o fabricante. Os primeiros cinco dígitos do lado direito identificam o produto específico do fabricante. O último dígito, chamado dígito de verificação, é adicionado no final do processo de elaboração do código, de acordo com um método que veremos na Parte II (RPM 66), quando formos responder a nossa segunda pergunta: como faz a máquina para detectar quando um operador apressado comete um erro de digitação?

Finalmente, vale a pena também observar que nos ocupamos aqui apenas dos códigos de barras mais conhecidos: aqueles que aparecem nos artigos que compramos regularmente, por exemplo, em supermercados. Porém, os códigos de barras têm um uso muito extenso e se utilizam também para simbolizar não somente números, mas também letras e símbolos ortográficos como, por exemplo, os que compõem o conjunto de caracteres ASCII (American Standard Code for Information Interchange) completo5

___________
1 A palavra Grocery, em inglês, equivale aproximadamente a nossa expressão secos e molhados.
2 Estes dados foram obtidos no site do próprio Laurer, que diz ter tido a colaboração de outras duas pessoas, mas não cita os nomes. O endereço do site é: http://www.bellsouthhpwp.net/1/a/laurergj/upc_work.html

3 O leitor pode ver a descrição completa deste “sistema numérico” e, em geral, de todo o código UPC na página http://www.barcodeilsta.com/upca.phtml
4 Uma tabela completa, com os números identificatórios de cada país, pode ser encontrada na página da Internet http://www.barcodeilsta.com/ean13.phtml
5 Ver http://en.wikipedia.org/wiki/Barcode, entre outros.

 

_______________________________________________________

Comentários sobre a RPM 64

Na p. 18, linha 9 − no lugar de n > n0, é mais preciso escrever n > n0.

Na p. 23, primeira linha do item 5 − a frase “se tirarmos de uma circunferência C um ponto qualquer, ela passará a ter a mesma cardinalidade que uma reta.” pode levar, erroneamente, à conclusão de que a circunferência toda não tem a cardinalidade da reta. Logo, seria melhor dizer “uma circunferência sem um de seus pontos tem a mesma cardinalidade de uma reta”.