Nadesłany przez Tomasz Lubiński, 01 września 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.
ean14.c:
//Konwersja pomiedzy EAN13 <=> EAN14
//www.algorytm.org
//(c) 2007 by Tomasz Lubinski
#include "stdio.h"
//returns 0 if all characeters are digits, -1 otherwise
int checkDigits(char* upc, int len)
{
int i;
for (i=0; i<len; i++)
{
if ((upc[i] < 48) || (upc[i] > 57))
{
return -1;
}
}
return 0;
}
//calculates EAN-13 checksum
int checkSum13(char* EAN)
{
int sum = 1 * EAN[0] +
3 * EAN[1] +
1 * EAN[2] +
3 * EAN[3] +
1 * EAN[4] +
3 * EAN[5] +
1 * EAN[6] +
3 * EAN[7] +
1 * EAN[8] +
3 * EAN[9] +
1 * EAN[10] +
3 * EAN[11];
sum %= 10;
sum = 10 - sum;
sum %= 10;
return sum;
}
//calculates EAN-14 checksum
int checkSum14(char* EAN)
{
int sum = 3 * EAN[0] +
1 * EAN[1] +
3 * EAN[2] +
1 * EAN[3] +
3 * EAN[4] +
1 * EAN[5] +
3 * EAN[6] +
1 * EAN[7] +
3 * EAN[8] +
1 * EAN[9] +
3 * EAN[10] +
1 * EAN[11] +
3 * EAN[12];
sum %= 10;
sum = 10 - sum;
sum %= 10;
return sum;
}
//EAN-13 => EAN-14
int convertToEAN14(char* ean13, char* ean14, int variant)
{
int i;
//check length of code
if (strlen(ean13) != 13)
{
strcpy(ean14, "Nieprawidlowa dlugosc kodu EAN-13 (powinno byc 13 znakow)");
return -1;
}
//check if all characters are digits
if (checkDigits(ean13, 13) != 0)
{
strcpy(ean14, "Nieprawidlowa znaki w kodzie EAN-13 (powinny byc tylko cyfry)");
return -1;
}
//check variant
if ((variant < 0) || (variant > 9))
{
strcpy(ean14, "Nieprawidlowa wartosc wariantu (powinno byc 0-9)");
return -1;
}
//convert chars to digits
for (i=0; i<13; i++)
{
ean13[i] -= 48;
}
//check control digit
if (checkSum13(ean13) != ean13[12])
{
strcpy(ean14, "Nieprawidlowa cyfra kontrolna w kodzie EAN-13");
return -1;
}
//convert EAN-13 to EAN-14
for (i=11; i>=0; i--)
{
ean14[i+1] = ean13[i];
}
ean14[0] = variant;
ean14[13] = checkSum14(ean14);
//convert digits to chars
for (i=0; i<13; i++)
{
ean13[i] += 48;
}
for (i=0; i<14; i++)
{
ean14[i] += 48;
}
ean14[14] = 0; //null end string terminator
return 0;
}
//EAN-14 => EAN-13
int convertToEAN13(char* ean13, char* ean14)
{
int i;
//check code length
if (strlen(ean14) != 14)
{
strcpy(ean13, "Nieprawidlowa dlugosc kodu EAN-14 (powinno byc 14 znakow)");
return -1;
}
//check if all characters are digits
if (checkDigits(ean14, 14) != 0)
{
strcpy(ean13, "Nieprawidlowa znaki w kodzie EAN-14 (powinno byc tylko cyfry)");
return -1;
}
//convert chars to digits
for (i=0; i<14; i++)
{
ean14[i] -= 48;
}
//control check digit
if (checkSum14(ean14) != ean14[13])
{
strcpy(ean13, "Nieprawidlowa cyfra kontrolna w kodzie EAN-14");
return -1;
}
//convert EAN-14 to EAN-13
for (i=0; i<12; i++)
{
ean13[i] = ean14[i+1];
}
ean13[12] = checkSum13(ean13);
//convert digits to chars
for (i=0; i<14; i++)
{
ean14[i] += 48;
}
for (i=0; i<13; i++)
{
ean13[i] += 48;
}
ean13[13] = 0; //null end string terminator
return 0;
}
int main()
{
char ean13[100];
char ean14[100];
int variant, i;
printf("1. EAN-13 => EAN-14\n");
printf("2. EAN-14 => EAN-13\n");
scanf("%d", &i);
if (i==1)
{
printf("Podaj kod EAN-13\n");
scanf("%s", ean13);
printf("Podaj wariant\n");
scanf("%d", &variant);
if (convertToEAN14(ean13, ean14, variant) == 0)
{
printf("Kod EAN-14 to %s\n", ean14);
}
else
{
printf("Podany kod nie może zostac przekonwertowany\n");
printf("%s\n", ean14);
}
}
else
{
printf("Podaj kod EAN-14\n");
scanf("%s", ean14);
if (convertToEAN13(ean13, ean14) == 0)
{
printf("Kod EAN-13 to %s\n", ean13);
}
else
{
printf("Podany kod nie może zostac przekonwertowany\n");
printf("%s\n", ean13);
}
}
return 0;
}

