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?

ISBN (ISBN-13) - Implementacja w C/C++
Ocena użytkownikóww: *****  / 2
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 24 lipca 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.

isbn_c.c:
//
// author Tomasz Lubinski
// www.algorym.org
// (c) 2007
//
// numer ISBN (ISBN-13)
//
  
char ISBN[100], prefix[100], country[100], publisher[100], book[100], checkNumber[100], additional[100];
int valid;

int CountryNo[] = {
		0, 1, 2, 3, 4, 5, 7, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 950, 951,
		952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968,
		969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985,
		986, 987, 988, 989, 9946, 9947, 9948, 9949, 9951, 9952, 9953, 9954, 9955, 9956, 9957,
		9958, 9959, 9960, 9961, 9962, 9963, 9964, 9965, 9966, 9967, 9968, 9970, 9971,
		9972, 9973, 9974, 9975, 9976, 9977, 9978, 9979, 9980, 9981, 9982, 9983, 9984,
		9985, 9986, 9987, 9988, 9989, 99901, 99902, 99903, 99904, 99905, 99906, 99908,
		99909, 99910, 99911, 99912, 99913, 99914, 99915, 99916, 99917, 99918, 99919,
		99920, 99921, 99922, 99923, 99924, 99925, 99926, 99927, 99928, 99929, 99930,
		99931, 99932, 99933, 99934, 99935, 99936, 99937, 99938, 99939, 99940, 99941, 99942
   };

static char* CountryName[] = {
		"Obszar anglojęzyczny: Australia, Kanada, Gibraltar, Irlandia, (Namibia), Nowa Zelandia, Puerto Rico, Republika Południowej Afryki, Swaziland, UK, USA, Zimbabwe",
		"Obszar anglojęzyczny: Australia, Kanada, Gibraltar, Irlandia, (Namibia), Nowa Zelandia, Puerto Rico, Republika Południowej Afryki, Swaziland, UK, USA, Zimbabwe",
		"Obszar francuskojęzyczny: Francja, Belgia, Kanada, Luksemburg, Szwajcaria",
		"Obszar niemieckojęzyczny: Austria, Niemcy, Szwajcaria", "Japonia",
		"Federacja Rosyjska, Ukraina, Bialoruś, Estonia, Litwa, Kazahstan, Kirgistan, Mołdawia, Łotwa, Georgia, Armenia",
		"Chiny", "Czechy, Słowacja", "Indie", "Norwegia", "Polska", "Hiszpania", "Brazylia",
		"Bośnia i Hercegowina, Chorwacja, Macedonia, Słowenia", "Dania",
		"Obszar włoskojęzyczny: Włochy, Szwajcaria", "Korea", "Holandia", "Holandia, Belgia, Szwecja",
		"Wydawcy międzynarodowi (UNESCO, UE), Organizacje Wspólnoty Europejskiej", "Indie", "Argentyna",
		"Finlandia", "Finlandia", "Chorwacja", "Bułgaria", "Sri Lanka", "Chile", "Tajwan, Chiny", "Columbia",
		"Kuba", "Grecja", "Słowenia", "Hong Kong", "Węgry", "Iran", "Izrael", "Ukraina", "Malezja", "Meksyk",
		"Pakistan", "Meksyk", "Filipiny", "Portugalia", "Rumunia", "Tajlandia", "Turcja", "Karaiby", "Egipt",
		"Nigeria", "Indonezja", "Wenezuela", "Singapur", "Południowy Pacyfik", "Malezja", "Bangladesz",
		"Białoruś", "Tajwan, Chiny", "Argentyna", "Hongkonga", "Portugalia", "Korea", "Algieria", "Estonia",
		"Palestyna", "Kosowo", "Azerbejdżan", "Liban", "Maroko", "Litwa", "Kamerun", "Jordania",
		"Bośnia i Hercegowina", "Libia", "Arabia Saudyjska", "Algieria", "Panama", "Cypr", "Ghana",
		"Kazachstan ", "Kenia", "Kirgistan", "Kostaryka", "Uganda", "Singapur", "Peru", "Tunezja", "Urugwaj",
		"Mołdawia", "Tanzania", "Kostaryka", "Ekwador", "Islandia", "Papua Nowa Gwinea", "Maroko", "Zambia",
		"Gambia", "Łotwa", "Estonia", "Litwa", "Tanzania", "Ghana", "Macedonia", "Bahrain", "Gabon",
		"Mauritius", "Antyle Holenderskie", "Boliwia", "Kuwejt", "Malawi", "Malta", "Sierra Leone",
		"Lesoto", "Botswana", "Andora", "Suriname", "Malediwy", "Namibia", 	"Brunei Darussalam",
		"Wyspy Faroe", "Benin", "Andora", "Katar", "Gwatemala", "El Salvador", "Nikaragua", "Paragwaj",
		"Honduras", "Albania", "Georgia", "Mongolia", "Armenia", "Seszele", "Malta", "Nepal",
		"Republika Dominikany", "Haiti", "Butan", "Makao", "Serbia", "Gwatemala", "Georgia",
		"Armenia", "Sudan"
   };

static char* unknown = "unknown";

void Format_ISBN(char *dst, char *src){
        int i, j;
        j = 0;

        for (i=0; i<strlen(src); i++) {
                if (src[i] == ' ') {
                    continue;
                }
               dst[j] = src[i];
               j++;
        }
        dst[j] = 0;
}

int Get_Fields(char *ISBN)
{
   int i, field, pos;

   field = 0;
   pos = 0;
   for (i=0; i<100; i++)
   {
      country[i] = 0;
      publisher[i] = 0;
      book[i] = 0;
      checkNumber[i] = 0;
      additional[i] = 0;
   }
   for (i=0; i<strlen(ISBN); i++)
   {
      if (ISBN[i] == '-')
      {
         field++;
         pos = 0;
      }
      else
      {
         switch (field)
         {
            case 0 : prefix[pos] = ISBN[i]; break;         
            case 1 : country[pos] = ISBN[i]; break;
            case 2 : publisher[pos] = ISBN[i]; break;
            case 3 : book[pos] = ISBN[i]; break;
            case 4 : checkNumber[pos] = ISBN[i]; break;
         }
         pos++;
      }
   }
   return field;
}

int checkSum()
{
   int counter, sum, i;

   counter = 0;
   sum = 0;
   if (strlen(checkNumber) != 1)
   {
      return 0;
   }
   else
   {
      for (i=0; i<strlen(prefix); i++)
      {
         counter++;      
         if (counter % 2 == 0)
         {
            sum += (prefix[i] - 48) * 3;
         }
         else
         {
            sum += (prefix[i] - 48);         
         }
      }   
      for (i=0; i<strlen(country); i++)
      {
         counter++;            
         if (counter % 2 == 0)
         {
            sum += (country[i] - 48) * 3;
         }
         else
         {
            sum += (country[i] - 48);         
         }
      }
      for (i=0; i<strlen(publisher); i++)
      {
         counter++;            
         if (counter % 2 == 0)
         {
            sum += (publisher[i] - 48) * 3;
         }
         else
         {
            sum += (publisher[i] - 48);         
         }     
      }
      for (i=0; i<strlen(book); i++)
      {
         counter++;            
         if (counter % 2 == 0)
         {
            sum += (book[i] - 48) * 3;
         }
         else
         {
            sum += (book[i] - 48);         
         }
      }
      sum %= 10;
      sum = 10 - sum;
      sum %= 10;
      if (sum == atoi(checkNumber))
         return 1;
      else
         return 0;
   }
}

char* getCountry()
{
   int code, i, j;
   char* result;

   result = unknown;
   code = 0;

   for  (i=0; i<strlen(country); i++)
   {
         code *= 10;
         code += country[i] - 48;

 	 for (j=0; j<144; j++)
         {
	      if (CountryNo[j] == code)
              {
                 return CountryName[j];
              }
         }
   }
   return result;
}

int main(void)
{
   printf("Podaj numer ISBN\n");
   scanf("%s", &ISBN); ;
   Format_ISBN(ISBN, ISBN);  //remove all spaces

   if ((Get_Fields(ISBN) == 4) && ((strlen(ISBN) == 17) || (strlen(ISBN) == 22)) &&
       (strlen(prefix) == 3) && (strlen(country) > 0 && strlen(country) < 6))
   {
         if ((strlen(checkNumber) == 6) && (strlen(ISBN) == 22))
         {
               strncpy(additional, checkNumber+2, 6);
               checkNumber[0] = checkNumber[0];
               checkNumber[1] = 0;
         }
         valid = checkSum();
   }
   else
      valid = 0;

   if (valid == 1)
   {
         printf("Numer ISBN jest prawidłowy\n");
         printf("Prefiks: %s\n", prefix);         
         printf("Kraj/jezyk: %s\n", getCountry());
         printf("Kod kraju: %s\n", country);
         printf("Kod wydawcy: %s\n", publisher);
         printf("Kod ksiazki: %s\n", book);
         printf("Suma kontrolna: %s\n", checkNumber);
    }
    else
        printf("Numer ISBN jest nieprawidłowy\n");
        
    return 0;
}
Dodaj komentarz