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