Nadesłany przez Tomasz Lubiński, 30 marca 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
*
* Interleaved 2 of 5 Bar Code
*/
public class BarCode {
private static final char codeI25sign[] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
private static final char codeI25bars[][] = {
{'N', 'N', 'W', 'W', 'N'},
{'W', 'N', 'N', 'N', 'W'},
{'N', 'W', 'N', 'N', 'W'},
{'W', 'W', 'N', 'N', 'N'},
{'N', 'N', 'W', 'N', 'W'},
{'W', 'N', 'W', 'N', 'N'},
{'N', 'W', 'W', 'N', 'N'},
{'N', 'N', 'N', 'W', 'W'},
{'W', 'N', 'N', 'W', 'N'},
{'N', 'W', 'N', 'W', 'N'}
};
private static final char start[] = {
1, 0, 1, 0
};
private static final char stop[] = {
1, 1, 0, 1
};
public boolean check(String txt) {
if (txt.length() % 2 == 0)
return false;
for (int i=0; i<txt.length(); i++) {
if (checkLetter(txt.charAt(i)) == false)
return false;
}
return true;
}
private boolean checkLetter(char ch) {
for (int i=0; i<codeI25sign.length; i++) {
if (codeI25sign[i] == ch)
return true;
}
return false;
}
public char[] getBars(char odd, char even) {
char result[] = new char[14];
int current = 0;
char bars[] = codeI25bars[getLetterValue(odd)];
char spaces[] = codeI25bars[getLetterValue(even)];
for (int i=0; i<bars.length; i++) {
if (bars[i] == 'W')
{
result[current] = 1;
result[current+1] = 1;
current += 2;
}
else
{
result[current] = 1;
current += 1;
}
if (spaces[i] == 'W')
{
current += 2;
}
else
{
current += 1;
}
}
return result;
}
//returns letter value for check digit
private int getLetterValue(char ch) {
for (int i=0; i<codeI25sign.length; i++)
if (codeI25sign[i] == ch)
return i;
return 0;
}
// return check digit
public char checkDigit(String txt) {
int sum = 0;
int w1 = 0;
int w2 = 0;
for (int i=0; i<txt.length(); i++)
{
if (i % 2 == 0)
{
w1 += getLetterValue(txt.charAt(i));
}
else
{
w2 += getLetterValue(txt.charAt(i));
}
}
if (txt.length() % 2 == 0)
{
w2 *= 3;
}
else
{
w1 *= 3;
}
sum = w1+ w2;
sum %= 10;
sum = 10 - sum;
sum %= 10;
return codeI25sign[sum];
}
public char[] getStartBars() {
return start;
}
public char[] getStopBars() {
return stop;
}
}

