Programm zum ISBN Nummern prüfen

Hi!

Da ich in zwei Wochen einen Programmentwurf abliefern muß und ich mich in
C nicht sonderlich gut auskenne (nur so die Basics), wollte ich mal
fragen, ob sich jemand mein momentanes Ergebnis mal antun kann. Wenn sich
da jemand findet, der mir ein par Tips geben könnte wie man das ganze
noch effizienter machen könnte wäre ich überaus dankbar.

Gruß

Emanuel

----------------------Ab hier der Quellcode------------------------------

#include
#include
int checkstring(char[11]);
int calccheck(char[11]);

int main()
{
char ISBN[9];
int check;
printf("\nDieses Programm ueberprueft ISBN Nummern anhand ihrer
Pruefziffer\n\n");
printf(„ISBN Nummer ohne Bindestriche: „);
scanf(“%10s“,&ISBN);

if (checkstring(ISBN)==1)
{
check=calccheck(ISBN);
}
else
{
printf(„ISBN Nummer ungueltig!\n“);
return 0;
}

if (calccheck(ISBN)==1)
{
printf(„Ist ISBN Nummer!\n“);
}
else
{
printf(„Ist keine ISBN Nummer!\n“);
}

//printf("%d\n",checkstring(ISBN));
return 0;
}

// Ueberpruefung der ISBN Nummer auf gueltige Laenge
int checkstring(char x[11])
{
if (strlen(x)==10) {return (1);} else {return (0);}
}

// Ueberpruefung der ISBN Nummer auf Gueltigkeit
int calccheck(char x[11])
{
int array[9],index,summe=0,check,gcheck;
char hilfs[2];

// 1. Die ersten 9 Ziffern werden in ein Array als Integer geschrieben
// 2. Die Summe der Produkte wird berechnet
for (index=0;index

Hallo Emanuel,

Da ich in zwei Wochen einen Programmentwurf abliefern muß und
ich mich in
C nicht sonderlich gut auskenne (nur so die Basics), wollte
ich mal
fragen, ob sich jemand mein momentanes Ergebnis mal antun
kann. Wenn sich
da jemand findet, der mir ein par Tips geben könnte wie man
das ganze
noch effizienter machen könnte wäre ich überaus dankbar.

MfG Peter(TOO)

Hier etwas zum nachdenken:

#include 
#include 
#include 

int calccheck(char \*x); 

#define ERR\_OK 0 // Alles O.K.
#define ERR\_LEN 1 // Nicht 10 Zeichen lang
#define ERR\_CHAR 2 // Keine Ziffer
#define ERR\_SUM 3 // Prüffsumme falsch

int main() 
{ 
 char ISBN[11]; // 10 Zeichen + '\0'

 printf("\nDieses Programm ueberprueft ISBN Nummern anhand ihrer Pruefziffer\n\n"); 
 printf("ISBN Nummer ohne Bindestriche: "); 
 scanf("%10s",&ISBN); 


 switch (calccheck(ISBN)) 
 {
 case ERR\_OK:
 printf("Ist ISBN Nummer!\n"); 
 break;
 case ERR\_LEN:
 printf("Fehler: Nummer ist nicht 10 Zeichen lang!\n"); 
 break;
 case ERR\_CHAR:
 printf("Fehler: Nummer enthält ungültiges Zeichen!\n"); 
 break;
 case ERR\_SUM:
 printf("Fehler: Prüfsumme stimmt nicht!\n"); 
 break;
 default:
 printf("Fehler: Fehler im Programm!\n"); 

 }

 return 0; 
} 



// Ueberpruefung der ISBN Nummer auf Gueltigkeit 
int calccheck(char \*x) 
{ 
 int index,summe=0,gcheck; 
 char \*ptr;

 if (strlen(x)!=10) return ERR\_LEN;

 // Die Summe der Produkte wird berechnet 
 ptr = x;
 for (index=0;index

Hi Peter!

Erst mal herzlichen Dank dafür das du dir meinen
Programmierversuch überhaupt angetan hast! Deine
Lösung sieht echt sehr elegant aus und auf jeden
Fall mal weit aus strukturierter wie meine! Halt
kein gebastel wie mein Zeuch! Mehr hab ich aber
leider am letzten Wochenende mit nem C Buch für
Anfänger nicht zusammengebracht.

Das Kapitel Pointer hab ich wohl auch überlesen obwohl
man damit ja ganz tolle Dinge machen kann.

Auf alle Fälle mal Danke, jetzt hab ich mal gesehen wie
man sowas richtig machen kann.

Gruß

Emanuel

Hallo Emanuel

Erst mal herzlichen Dank dafür das du dir meinen
Programmierversuch überhaupt angetan hast! Deine
Lösung sieht echt sehr elegant aus und auf jeden
Fall mal weit aus strukturierter wie meine! Halt
kein gebastel wie mein Zeuch! Mehr hab ich aber
leider am letzten Wochenende mit nem C Buch für
Anfänger nicht zusammengebracht.

Noch ein paar Anmerkungen:

  1. char ISBN[9]; War FALSCH, Du liest ja mit
    scanf("%10s",&ISBN); 10 Zeichen und das ‚\0‘ ein, also total 11 Zeichen. Irgenwie hast du Glück gehabt, dass das Ganze überhaupt fehlerfrei funktioniert hat.

  2. Ich habe mir angewöhnt die Rehenfolge der Funktionen im Quelltext nach ihrer Hyrachie aufsteigend zu schreiben, also die einfachen am Anfang und dann main() am Ende. Damit kannst du die Forwärts-Deklarationen vermeiden.

  3. Ich declariere alle Funktionen, welche nicht ausserhalb eines Moduls verwendet werden als static. Einerseits sieht man dann in einem grösseren Projekt ob die Funktion von irgendwoher Aufgerufen wird oder nicht, andererseits kann es dann nicht passieren, dass durch einen Tippfehler versehentlich eine falsche Funktion in einem anderen Modul aufgerufen wird (spätestens der Linker meldet dann das Problem).

MfG Peter(TOO)

1 Like