Autor |
Beitrag |
sennaheu
      
Beiträge: 22
|
Verfasst: Mi 02.07.03 14:34
Hallo,
ich versuche seit ungefähr einem viertel Jahr Delphi an der Schule zu lernen.
Leider verstehe ich zu einem Grossteil nur Bahnhof. Besonders in letzter Zeit ist unser Lehrer immer schneller geworden und hat Bestimmte Themen nur angerissen.
Ich bin leider nicht der einzige, der im Moment nichts versteht, weswegen mir kaum jemand helfen kann.
Das letzte mal hat er, nachdem er bahauptet hat, wir müssten das mittlerweile können, uns die Aufgabe gestellt, ein Programm zu schreiben, dass die Prüfziffer der ISBN-Nummer ermittelt und so eine ISBN-Nummer überprüft.
Nachdem ich erstmal 2 Stunde recherchiert habe, wie so eine Nummer überhaupt aufgebaut ist, bin ich nur noch verwirrter, da im Falle einer 10 ein X geschrieben wird und ich absolut keine Ahnung habe, wie ich da überhaupt vorzugehen habe.
Das einzige was ich mittlerweile weiss, ist, dass die einzelnen Ziffern nach einem so genannten Modulo-11-Verfahren addiert und durch 11 dividiert werden.
Das müsste dann so aussehen:
Die erste Ziffer wird mit 10, die zweite mit 9, etc. bis zur 9. Ziffer mit 2 multipliziert und die Ergebnisse addiert und das ganze danach durch 11 dividiert. Der Rest wird dann wiederum von 11 subdrahiert und das Ergebnis müsster dann die 10. Ziffer im ISBN-Code sein.
Sollte dies nicht der Fall sein, so ist der Code falsch.
Wie oben schon erwähnt wird die 10 durch ein X dargestellt.
Ich habe aber im Moment absolut keine Ahnung, was ich machen muss.
Ich kann mir höchstens vorstellen, dass man mit einem if das X abfängt und durch 10 ersetzt. Mehr aber auch nicht.
Ich hoffe ihr könnt mir helfen.
Gruss und danke,
sennaheu
Moderiert von Tino: Titel geändert.
|
|
waldmeister
      
Beiträge: 136
Win XP
D7 Enterp
|
Verfasst: Mi 02.07.03 14:57
ich hab hier was im easy delphi helper gefunden, weiß aber net ob dir das hilft weil ich steig da selber net so ganz durch:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| function ValidISBN(const aISBN: string): boolean; var hNumber, hCheckDigit: string; hCheckValue, hCheckSum, Err: integer; i,Cnt: Word; begin Result := false; hCheckDigit := Copy(aISBN, Length(aISBN), 1); hNumber := Copy(aISBN, 1, Length(aISBN) - 2); if (Length(hNumber)=11)and(Pos(hCheckDigit, '0123456789X') > 0) then begin if (hCheckDigit = 'X') then hCheckSum := 10 else Val(hCheckDigit, hCheckSum, Err); Cnt := 1; for i := 1 to 12 do begin if (Pos(hNumber[i], '0123456789') > 0) then begin Val(hNumber[i], hCheckValue, Err); hCheckSum := hCheckSum + hCheckValue * (11 - Cnt); Inc(Cnt); end; end; if (hCheckSum mod 11 = 0) then Result := true else Result := false; end; end; |
Und so kann man die Funktion aufrufen:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin Label1.Visible:=ValidISBN(Edit1.Text); end; |
Moderiert von Tino: Delphi-Tags hinzugefügt.
_________________ der wald....der meister....der meister des waldes....der waldmeister
|
|
sennaheu 
      
Beiträge: 22
|
Verfasst: Do 03.07.03 13:45
Vielen Dank.
Ich habe es ausprobiert, aber aus irgendeinem Grund scheint es bei mir nicht zu funktionieren.
Leider verstehe ich auch nicht so genau wie das Programm funktioniert (funktionieren soll), da erstens einige Befehle darin vorkommen, die wir meines Wissens in der Schule noch nicht durchgenommen haben und ich die englischsprachige Erklärung mit ihren Fachbegriffen noch weniger verstehe. 
|
|
Leathl
      
Beiträge: 276
|
Verfasst: Do 03.07.03 16:42
Zuletzt bearbeitet von Leathl am Sa 15.08.09 16:41, insgesamt 1-mal bearbeitet
|
|
derDoc
      
Beiträge: 623
Win Vista Prof
D2007 Prof
|
Verfasst: Do 03.07.03 19:29
Ich habe mal eine andere Möglichkeit benutzt.
Achtung: Es wird nicht auf korrekte Eingabe von Zahlen geprüft!
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| procedure TForm1.Btn_PruefenClick(Sender: TObject); var ISBN: String; ISBNwert, ISBNindex, Pruefsumme, Faktor: Integer; begin ISBN := Edit1.Text; try Faktor := 10; ISBNindex := 1; Pruefsumme := 0;
repeat ISBNwert := StrToInt(copy(ISBN, ISBNindex, 1)); Pruefsumme := Pruefsumme + ISBNwert * Faktor; Dec(Faktor); Inc(ISBNindex); until Faktor = 1;
if (copy(ISBN, ISBNindex, 1) = 'X') or (copy(ISBN, ISBNindex, 1) = 'x') then begin Pruefsumme := Pruefsumme + 10; end else begin Pruefsumme := Pruefsumme + StrToInt(copy(ISBN, ISBNindex, 1)); end;
if Pruefsumme mod 11 = 0 then begin Label2.Caption := 'ISBN stimmt'; end else begin Label2.Caption := 'ISBN ist falsch'; end; except MessageDlg('Fehler!', mtError, [mbOk], 0); end; end; |
Ich habe ein Edit, zwei Label und einen Button verwendet.
Es wird auch nicht auf Bindestriche geachtet. Dies und das Überprüfen auf Zahlen im Editfeld müßten noch gemacht werden.
_________________ MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
|
|
Leathl
      
Beiträge: 276
|
Verfasst: Do 03.07.03 21:38
Zuletzt bearbeitet von Leathl am Sa 15.08.09 16:41, insgesamt 1-mal bearbeitet
|
|
derDoc
      
Beiträge: 623
Win Vista Prof
D2007 Prof
|
Verfasst: Do 03.07.03 22:40
Wegen dem Label1: Da stehet ISBN: in der Caption. Das hat also mit dem eigentlichen Programm nichts zu tun, nur mit Aussehen.
_________________ MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
|
|
Leathl
      
Beiträge: 276
|
Verfasst: Do 03.07.03 22:56
Zuletzt bearbeitet von Leathl am Sa 15.08.09 16:42, insgesamt 1-mal bearbeitet
|
|
sennaheu 
      
Beiträge: 22
|
Verfasst: Fr 04.07.03 15:29
Vielen Dank euch allen.
Ich habe mir das jetzt genau angeschaut und das Prinzip des Programmes einigermassen verstanden.
Ich bin gerade dabei noch ein bischen dran rumzubasteln, aber zumindest scheint die grobe Struktur zu stimmen.
Ich versuche noch bei dem Programm die Striche zu integrieren und es so abzustimmen, dass es jeder DAU (also ich *gg*) auch benutzen könnte.
Danke und Gruss,
sennaheu
|
|
Leathl
      
Beiträge: 276
|
Verfasst: Fr 04.07.03 16:12
Zuletzt bearbeitet von Leathl am Sa 15.08.09 16:43, insgesamt 1-mal bearbeitet
|
|
sennaheu 
      
Beiträge: 22
|
Verfasst: Fr 04.07.03 20:20
ich hab jetzt auch den 1. code zum laufen gebracht.
was mich daran stört, ist, dass es nur codes zulässt, die striche enthalten und nur das grosse x zulässt.
habe versucht daran rumzubasteln, habe es allerdings nicht geschafft.
dafür sieht der 2. schon ganz gut aus.
ein freund will mir am montag oder mittwoch bei der dau-funktion noch ein bischen helfen, dann müsste es eigentlich perfekt funktionieren, da es seiner aussage nach sogar striche akzeptieren wird, da andere zeichen vorher rausgefiltert werden.
auch habe ich es geschafft den quelltext ein bischen zu kürzen (was durch die sicherheitsprotokolle wieder verlängert wird).
|
|
Leathl
      
Beiträge: 276
|
Verfasst: So 06.07.03 12:33
Zuletzt bearbeitet von Leathl am Sa 15.08.09 16:43, insgesamt 1-mal bearbeitet
|
|
derDoc
      
Beiträge: 623
Win Vista Prof
D2007 Prof
|
Verfasst: So 06.07.03 12:53
Also die Sache mit den Zahlen und Strichen die eingegeben werden dürfen kannst du ganz schnell mit OnKeyPress lösen, indem du nichts anderes zulässt.
Wenn nun Striche in der ISBN sind wäre es am einfachsten diese Striche vom Programm entfernen zu lassen.
_________________ MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
|
|
derDoc
      
Beiträge: 623
Win Vista Prof
D2007 Prof
|
Verfasst: So 06.07.03 19:06
Ich war mal so frei und habe das Programm fertig gemacht. Hier ist jetzt der gesammte Quellcode den du brauchst:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86:
| function ValidateISBN(ISBN: String): String; var Index: Integer; begin try Index := 1;
repeat if (ISBN[Index] = '-') or (ISBN[Index] = ' ') then begin Inc(Index); end else begin Result := Result + ISBN[Index]; Inc(Index); end; until Index > Length(ISBN);
except MessageDlg('Konvertierungsfehler!', mtError, [mbOk], 0); end; end;
function ISBNPruefen(ISBN: String): String; var ValidISBN: String; ISBNwert, ISBNindex, Pruefsumme, Faktor: Integer; begin try ValidISBN := ValidateISBN(ISBN); if Length(ValidISBN) = 10 then begin Faktor := 10; ISBNindex := 1; Pruefsumme := 0;
repeat ISBNwert := StrToInt(copy(ValidISBN, ISBNindex, 1)); Pruefsumme := Pruefsumme + ISBNwert * Faktor; Dec(Faktor); Inc(ISBNindex); until Faktor = 1;
if (copy(ValidISBN, ISBNindex, 1) = 'X') or (copy(ValidISBN, ISBNindex, 1) = 'x') then begin Pruefsumme := Pruefsumme + 10; end else begin Pruefsumme := Pruefsumme + StrToInt(copy(ValidISBN, ISBNindex, 1)); end;
if Pruefsumme mod 11 = 0 then begin Result := 'ISBN stimmt'; end else begin Result := 'ISBN ist falsch'; end; end else begin Result := 'ISBN hat falsche Größe'; end; except MessageDlg('Prueffehler!', mtError, [mbOk], 0); end; end;
procedure TForm1.Btn_PruefenClick(Sender: TObject); begin Label2.Caption := ISBNPruefen(Edt_ISBN.Text); end;
procedure TForm1.Edt_ISBNKeyPress(Sender: TObject; var Key: Char); begin case Key of '0'..'9', #8, #32, #45: ; else Key := #0; end; end; |
Wenn du noch Fragen hast stelle sie ruhig.
_________________ MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
|
|
|