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?

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