Nadesłany przez Tomasz Lubiński, 08 grudnia 2005 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.
ean8_c.c:
/**
* @author Tomasz Lubinski
* www.algorym.org
* (c) 2005
*
* EAN8
*/
#include <stdio.h>
#include <stdlib.h>
short EAN8[8];
int valid = 0;
int Numbers[] = { 0, 10, 11, 12, 13, 2, 30, 31, 32, 33, 34, 35, 36, 37, 380, 383, 385, 387, 40,
41, 42, 43, 44, 45, 46, 470, 471, 474, 475, 476, 477, 478, 479, 480, 481,
482, 484, 485, 486, 487, 489, 49, 50, 520, 528, 529, 531, 535, 539, 54, 560,
569, 57, 590, 594, 599, 600, 601, 608, 609, 611, 613, 619, 621, 622, 624,
625, 626, 627, 628, 629, 64, 690, 691, 692, 70, 729, 73, 740, 741, 742, 743,
744, 745, 746, 750, 759, 760, 770, 773, 775, 777, 779, 780, 784, 786, 789,
790, 80, 81, 82, 83, 84, 850, 858, 859, 860, 867, 869, 87, 880, 885, 888, 890,
893, 899, 90, 91, 93, 94, 950, 955, 977, 978, 979, 98, 99, };
static char* Countries[] = {
"USA i Kanada",
"USA i Kanada", "USA i Kanada", "USA i Kanada", "USA i Kanada",
"Do użytku wewnętrznego", "Francja", "Francja", "Francja", "Francja",
"Francja", "Francja", "Francja", "Francja", "Bułgaria", "Słowenia",
"Chorwacja", "Bośnia-Hercegowina", "Niemcy", "Niemcy", "Niemcy", "Niemcy",
"Niemcy", "Japonia", "Rosja", "Kirgistan", "Tajwan", "Estonia", "Łotwa",
"Azerbejdżan", "Litwa", "Uzbekistan", "Sri Lanka", "Filipiny", "Białoruś",
"Ukraina", "Mołdawia", "Armenia", "Gruzja", "Kazachstan", "Hong Kong",
"Japonia", "Wielka Brytania", "Grecja", "Liban", "Cypr", "Macedonia", "Malta",
"Irlandia", "540-Belgia i Luksemburg", "Portugalia", "Islandia", "Dania",
"Polska", "Rumunia", "Węgry", "RPA", "RPA", "Bahrain", "Mauritius", "Maroko",
"Algeria", "Tunezja", "Syria", "Egipt", "Libia", "Jordania", "Iran", "Kuwejt",
"Arabia Saudyjska", "Emiraty Arabskie", "Finlandia", "Chiny", "Chiny",
"Chiny", "Norwegia", "Izrael", "730-Szwecja", "Gwatemala", "Salwador",
"Honduras", "Nikaragua", "Kostaryka", "Panama", "Dominikana", "Meksyk",
"Wenezuela", "Szwajcaria", "Kolumbia", "Urugwaj", "Peru", "Boliwia",
"Argentyna", "Chile", "Paragwaj", "Ekwador", "Brazylia", "Brazylia", "Włochy",
"Włochy", "Włochy", "Włochy", "Hiszpania", "Kuba", "Słowacja", "Czechy",
"Jugosławia", "Korea Północna", "Turcja", "870-Holandia", "Korea Południowa",
"Tajlandia", "Singapur", "Indie", "Wietnam", "Indonezja", "Austria",
"Austria", "Australia", "Nowa Zelandia", "EAN - IDA", "Malezja", "ISSN",
"ISBN", "ISMN", "Kupony", "Kupony"
};
int checkSum() {
int sum = 3 * EAN8[0] +
1 * EAN8[1] +
3 * EAN8[2] +
1 * EAN8[3] +
3 * EAN8[4] +
1 * EAN8[5] +
3 * EAN8[6];
sum %= 10;
sum = 10 - sum;
sum %= 10;
if (sum == EAN8[7]) {
return 1;
}
else {
return 0;
}
}
char* getCountry() {
char* result = "unknown";
int code = 0;
int i, j;
for (i=0; i<3; i++){
code *= 10;
code += EAN8[i];
for (j=0; j<127; j++) {
if (Numbers[j] == code) {
result = Countries[j];
break;
}
}
if (strcmp(result, "unknown") != 0) {
break;
}
}
return result;
}
void EAN8Validator(char* EAN8Number) {
int i;
if (strlen(EAN8Number) != 8) {
valid = 0;
}
else {
for (i = 0; i < 8; i++){
EAN8[i] = EAN8Number[i] - 48;
}
if (checkSum()) {
valid = 1;
}
else {
valid = 0;
}
}
}
void main(void)
{
char EAN8[200];
printf("Podaj numer EAN8 (bez spacji i myslinikow)\n");
scanf("%s", EAN8);
EAN8Validator(EAN8);
if (valid) {
printf("Numer EAN8 jest prawidłowy\n");
printf("Kraj pochodzenia %s\n", getCountry());
}
else {
printf("Numer EAN8 jest nieprawidłowy\n");
}
return;
}

