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; }