Autor Beitrag
sennaheu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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 user profile iconTino: Titel geändert.
waldmeister
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 136

Win XP
D7 Enterp
BeitragVerfasst: 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:
ausblenden volle Höhe Delphi-Quelltext
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);
  {Get rest of ISBN, minus check digit and its hyphen}
  hNumber := Copy(aISBN, 1, Length(aISBN) - 2);
  {Length of ISBN remainder must be 11 and check digit
   between 9 and 9 or X}

  if (Length(hNumber)=11)and(Pos(hCheckDigit,
      '0123456789X') > 0then
  begin
    {Get numeric value for check digit}
    if (hCheckDigit = 'X'then
      hCheckSum := 10
    else 
      Val(hCheckDigit, hCheckSum, Err);
      {Iterate through ISBN remainder, applying decode
      algorithm}

    Cnt := 1;
    for i := 1 to 12 do
    begin
      {Act only if current character is between "0" and "9"
      to exclude hyphens}

      if (Pos(hNumber[i], '0123456789') > 0then
      begin
        Val(hNumber[i], hCheckValue, Err);
        {Algorithm for each character in ISBN remainder, Cnt
        is the nth character so processed}

        hCheckSum := hCheckSum + hCheckValue * (11 - Cnt);
        Inc(Cnt);
      end;
    end;
    {Verify final value is evenly divisible by 11}
    if (hCheckSum mod 11 = 0then 
      Result := true
    else 
      Result := false;
  end;
end;

Und so kann man die Funktion aufrufen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Visible:=ValidISBN(Edit1.Text);
end;


Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.

_________________
der wald....der meister....der meister des waldes....der waldmeister
sennaheu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 276



BeitragVerfasst: Do 03.07.03 16:42 
---


Zuletzt bearbeitet von Leathl am Sa 15.08.09 16:41, insgesamt 1-mal bearbeitet
derDoc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: 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!

ausblenden volle Höhe Delphi-Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 276



BeitragVerfasst: Do 03.07.03 21:38 
---


Zuletzt bearbeitet von Leathl am Sa 15.08.09 16:41, insgesamt 1-mal bearbeitet
derDoc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 276



BeitragVerfasst: Do 03.07.03 22:56 
---


Zuletzt bearbeitet von Leathl am Sa 15.08.09 16:42, insgesamt 1-mal bearbeitet
sennaheu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 276



BeitragVerfasst: Fr 04.07.03 16:12 
---


Zuletzt bearbeitet von Leathl am Sa 15.08.09 16:43, insgesamt 1-mal bearbeitet
sennaheu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 276



BeitragVerfasst: So 06.07.03 12:33 
---


Zuletzt bearbeitet von Leathl am Sa 15.08.09 16:43, insgesamt 1-mal bearbeitet
derDoc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-Quelltext
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.