algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

UPC-E - Implementacja w C/C++
Ocena użytkownikóww: *****  / 1
SłabyŚwietny
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;
}
Dodaj komentarz