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