C :: Aufgabe #52
2 Lösungen
ISBN-Nummern überprüfen
Anfänger - C
von bibir
- 03.09.2014 um 09:10 Uhr
Eine ISBN-Nummer setzt sich immer aus vier Teilen zusammen, der Gruppenzahl, Verlagsnummer, Titelnummer und einer Prüfziffer. Diese vier Teile werden durch Bindestriche (oder seltener Leerzeichen) abgetrennt. Eine ISBN-Nummer ist stets zehnstellig.
Die Prüfziffer erlaubt, die Gültigkeit einer ISBN-Nummer festzustellen. Sie wird so gewählt, dass die ganze Nummer folgende mathematische Eigenschaft erfüllt:
Man multipliziere die erste Stelle mit 10, die zweite Stelle mit 9, die dritte mit 8, und so weiter bis zur neunten Stelle (mal 2), und addiere alle erhaltenen Produkte. Wenn man zu dieser Zahl die Prüfziffer dazuaddiert, so muss ein Vielfaches von 11 entstehen. Als Besonderheit kann die Prüfziffer auch den Buchstaben X annehmen, der dann als Zahlenwert 10 interpretiert wird.
Beispiel:
Die ISBN-Nummer lautet 3-8931-9301-4, also rechnen wir
3 * 10 + 8 * 9 + 9 * 8 + 3 * 7 + 1 * 6 + 9 * 5 + 3 * 4 + 0 * 3 + 1 * 2 + Prüfziffer 4 = 264.
Diese Zahl ist 24 * 11, also ist es eine gültige ISBN-Nummer.
Die Prüfziffer erlaubt, die Gültigkeit einer ISBN-Nummer festzustellen. Sie wird so gewählt, dass die ganze Nummer folgende mathematische Eigenschaft erfüllt:
Man multipliziere die erste Stelle mit 10, die zweite Stelle mit 9, die dritte mit 8, und so weiter bis zur neunten Stelle (mal 2), und addiere alle erhaltenen Produkte. Wenn man zu dieser Zahl die Prüfziffer dazuaddiert, so muss ein Vielfaches von 11 entstehen. Als Besonderheit kann die Prüfziffer auch den Buchstaben X annehmen, der dann als Zahlenwert 10 interpretiert wird.
Beispiel:
Die ISBN-Nummer lautet 3-8931-9301-4, also rechnen wir
3 * 10 + 8 * 9 + 9 * 8 + 3 * 7 + 1 * 6 + 9 * 5 + 3 * 4 + 0 * 3 + 1 * 2 + Prüfziffer 4 = 264.
Diese Zahl ist 24 * 11, also ist es eine gültige ISBN-Nummer.
Lösungen:
/************************************
* chkisbn.c check ISBN number
************************************/
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define STRLEN 30
#define ISBNLEN 10
int isISBN(char *isbn) {
int cdigit, weight, sum;
char *pi;
weight = ISBNLEN;
cdigit = 0;
for (pi=isbn,sum=0; *pi!='\0'; pi++) {
if (*pi == '-' || *pi == ' ')
continue;
if (isdigit(*pi) || (cdigit==ISBNLEN-1 && *pi == 'X')) {
cdigit++;
if (cdigit > ISBNLEN)
return 0; // too many digits
else
sum += (*pi=='X') ? 10 : (*pi-'0')*weight--;
} else
return 0; // illegal character
}
return (sum%11 == 0);
}
int main(int argc, char **argv) {
char isbn[STRLEN+1];
if (argc > 1)
strncpy(isbn, argv[1], STRLEN);
else {
printf("Eingabe ISBN-%d: ", ISBNLEN);
scanf("%s", isbn);
}
printf("Die ISBN ist %skorrekt.\n", isISBN(isbn) ? "":"nicht ");
return 0;
}
// ISBN nummer pruefen.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "string.h"
#include "stdlib.h"
char *string_saubern(char ISBN_Nummer[])
{
char *ISBN = (char*)malloc(sizeof(char)*11);
*ISBN = NULL;
int j = 0;
for(int i = 0; i < strlen(ISBN_Nummer); i++)
{
if(ISBN_Nummer[i] != '-')
{
ISBN[j] = ISBN_Nummer[i];
j++;
}
}
ISBN[10] = '\0';
return ISBN;
}
int summe(char ISBN_Nummer[])
{
int j =10;
int p_Summe = 0;
for(int i = 0; i < 10; i++)
{
p_Summe = p_Summe + (string_saubern(ISBN_Nummer)[i]-48) * j;
j--;
}
return p_Summe;
}
void pruefung(char ISBN_Nummer[])
{
if( summe(ISBN_Nummer) % 11 == 0)
{
printf("Die ISBN ist OK\n");
}
else
{
printf("Die ISBN ist falsch!! \n");
}
}
int main()
{
char ISBN_Nummer[20] = "3-8931-9301-4";
pruefung(ISBN_Nummer);
getchar();
return 0;
}
