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.
upce.c:
//www.algorytm.org
//Konwersja pomiedzy UPC-A i UPC-E
//(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;
}
//return 0 if check digit is correct, -1 otherwise
int checkControlDigit(char* upca)
{
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])
{
return -1;
}
return 0;
}
//UPC-E => UPC-A
int convertToUPCA(char* upca, char* upce)
{
int i;
upca[0] = 0;
//check length of code
if (strlen(upce) != 8)
{
strcpy(upca, "Nieprawidlowa dlugosc kodu UPC-E (powinno byc 8 znakow)");
return -1;
}
//check if all characters are digits
if (checkDigits(upce, 8) != 0)
{
strcpy(upca, "Nieprawidlowa znaki w kodzie UPC-E (powinno byc tylko cyfry)");
return -1;
}
//convert chars to digits
for (i=0; i<8; i++)
{
upce[i] -= 48;
}
//check system number
if ((upce[0] != 0) && (upce[0] != 1))
{
strcpy(upca, "Numer systemu UPC-A musi wynosic 0 badz 1");
return -1;
}
//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
{
strcpy(upca, "Nieprawidlowy kod UPC-E");
return -1;
}
//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
if (checkControlDigit(upca) != 0)
{
strcpy(upca, "Nieprawidlowa suma kontrolna");
return -1;
}
//convert digits to chars
for (i=0; i<12; i++)
{
upca[i] += 48;
}
for (i=0; i<8; i++)
{
upce[i] += 48;
}
upca[12] = 0; //null end string terminator
return 0;
}
//UPC-A => UPC-E
int convertToUPCE(char* upca, char* upce)
{
int i;
upce[0] = 0;
//check code length
if (strlen(upca) != 12)
{
strcpy(upce, "Nieprawidlowa dlugosc kodu UPC-A (powinno byc 12 znakow)");
return -1;
}
//check if all characters are digits
if (checkDigits(upca, 12) != 0)
{
strcpy(upce, "Nieprawidlowa znaki w kodzie UPC-A (powinno byc tylko cyfry)");
return -1;
}
//convert chars to digits
for (i=0; i<12; i++)
{
upca[i] -= 48;
}
//control check digit
if (checkControlDigit(upca) != 0)
{
strcpy(upce, "Nieprawidlowa suma kontrolna");
return -1;
}
//check system number
if ((upca[0] != 0) && (upca[0] != 1))
{
strcpy(upce, "Numer systemu UPC-A musi wynosic 0 badz 1");
return -1;
}
//convert UPC-A to UPC-E
if ((upca[3] >= 0) && (upca[3] <= 2) &&
(upca[4] == 0) && (upca[5] == 0) && (upca[6] == 0) && (upca[7] == 0))
{
upce[3] = upca[8];
upce[4] = upca[9];
upce[5] = upca[10];
upce[6] = upca[3];
}
else if ((upca[3] >= 3) && (upca[3] <= 9) &&
(upca[4] == 0) && (upca[5] == 0) && (upca[6] == 0) && (upca[7] == 0) && (upca[8] == 0))
{
upce[3] = upca[3];
upce[4] = upca[9];
upce[5] = upca[10];
upce[6] = 3;
}
else if ((upca[5] == 0) && (upca[6] == 0) && (upca[7] == 0) && (upca[8] == 0) && (upca[9] == 0))
{
upce[3] = upca[3];
upce[4] = upca[4];
upce[5] = upca[10];
upce[6] = 4;
}
else if ((upca[10] >= 5) && (upca[10] <= 9) &&
(upca[6] == 0) && (upca[7] == 0) && (upca[8] == 0) && (upca[9] == 0))
{
upce[3] = upca[3];
upce[4] = upca[4];
upce[5] = upca[5];
upce[6] = upca[10];
}
else
{
strcpy(upca, "Tego kodu UPC-A nie można przekonwertować do UPC-E");
return -1;
}
//copy two first digits of producer code
upce[1] = upca[1];
upce[2] = upca[2];
//copy system numer and check digit
upce[0] = upca[0];
upce[7] = upca[11];
//convert digits to chars
for (i=0; i<8; i++)
{
upce[i] += 48;
}
for (i=0; i<12; i++)
{
upca[i] += 48;
}
upca[8] = 0; //null end string terminator
return 0;
}
int main()
{
char upca[100];
char upce[100];
int i;
printf("1. UPC-A => UPCE-E\n");
printf("2. UPC-E => UPC-A\n");
scanf("%d", &i);
if (i==1)
{
printf("Podaj kod UPC-A\n");
scanf("%s", upca);
if (convertToUPCE(upca, upce) == 0)
{
printf("Rownowazny kod UPC-E to %s\n", upce);
}
else
{
printf("Podany kod nie może zostac przekonwertowany\n");
printf("%s\n", upce);
}
}
else
{
printf("Podaj kod UPC-E\n");
scanf("%s", upce);
if (convertToUPCA(upca, upce) == 0)
{
printf("Rownowazny kod UPC-A to %s\n", upca);
}
else
{
printf("Podany kod nie może zostac przekonwertowany\n");
printf("%s\n", upca);
}
}
return 0;
}

