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.
BarCode.java:
/**
* @author Tomasz Lubinski
* (c)2007 algorytm.org
*
* UPCE Bar Code
*/
public class BarCode {
private static final byte parityTable[][][] = {
{
{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}
}
};
private static final byte left[][][] = {
{
{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}
}
};
public byte[] convert(byte UPCE[]) {
/* inccorect length or check sum, return null */
if ((UPCE == null) ||
(UPCE.length != 8) ||
(checkSum(UPCE) == false)) {
return null;
}
byte bars[] = new byte[51];
for (int i=0; i<51; i++) {
bars[i] = 0;
}
bars[0] = 1;
bars[1] = 0;
bars[2] = 1;
for (int i=1; i<7; i++) {
for (int 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;
return bars;
}
/**
* calculates checksum of UPCE
*/
private boolean checkSum(byte upce[]) {
byte upca[] = new byte[12];
//check system number
if ((upce[0] != 0) && (upce[0] != 1))
{
return false;
}
//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 false;
}
//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])
{
System.out.println(sum);
System.out.println(upca[11]);
return false;
}
return true;
}
}


