Autor |
Beitrag |
depigoid
      
Beiträge: 24
Win XP
|
Verfasst: Mi 23.05.07 19:44
Hallo!
Ich sollte mit Verbunden und Arrays eine Art "Datenbank"erstellen. Die Einträge sollen dann per extra Button auch sortiert oder ein Begriff gesucht werden. Das Sortieren und Suchen geht aber nicht - warum? Wäre total super wenn mir jemand sagen könnte, warum das nicht geht und wie ich das Problem beheben kann!
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:
| tvirus = record latein:string[40]; trivial:string[20]; art:string[10]; laenge:extended; form:string[20]; krankheit_eins:string[20]; krankheit_zwei:string[20]; symptom1:string[20]; letal_eins:integer; letal_zwei:integer; folgen:string[30]; end; tfeld=array[0..200]of tvirus; tfile=file of tfeld;
var Hauptfenster: THauptfenster; datei:tfile; datensatz:tvirus; virus:tfeld; seitennummer:integer;
procedure THauptfenster.einlesenClick(Sender: TObject); var i:integer; begin i:=strtoint(Label4.Caption); virus[i].latein:=Hauptfenster.lateinEdit.text; virus[i].trivial:=Hauptfenster.trivialEdit.text; virus[i].art:=Hauptfenster.virobaktEdit.text; virus[i].laenge:=strtofloat(Hauptfenster.laengeEdit.text); virus[i].form:=Hauptfenster.formEdit.text; end; procedure THauptfenster.SuchenClick(Sender: TObject); var wort:string; begin wort:=suchEdit.text; if nameBox.checked=true then in_namen_suchen(wort, seitennummer, virus) else if krankheitBox.checked=true then in_krankheiten_suchen(wort, seitennummer, virus) else if symptomeBox.checked=true then in_symptomen_suchen(wort, seitennummer, virus); ausgeben(seitennummer, virus); end;
procedure in_krankheiten_suchen(suche:string; var seite:integer; var bazillus:tfeld); var pos, i:integer; begin pos:=0; for i:=0 to high(bazillus) do begin if (suche=bazillus[i].krankheit_eins) or (suche=bazillus[i].krankheit_zwei) then begin seite:=i; pos:=pos+1; end; if pos=0 then Showmessage('Die Krankheit wurde noch nicht eingetragen.'); end; end;
procedure THauptfenster.sortierenClick(Sender: TObject); begin if lateinBox.checked=true then ordnen_latein(virus) else if dtBox.checked=true then ordnen_name(virus) else if krankBox.checked=true then ordnen_krankheit(virus) else if langBox.checked=true then ordnen_laenge(virus); ausgeben(seitennummer, virus); end;
procedure ordnen_latein(var bazillus:tfeld); var i,j:integer; hilfe:tfeld; begin for i:=0 to (high(bazillus)-1) do for j:=1 to high(bazillus) do if bazillus[j-1].latein>bazillus[j].latein then begin hilfe[j].latein:=bazillus[j-1].latein; hilfe[j].trivial:=bazillus[j-1].trivial; end; |
Ich habe den Quelltext jetzt mal chronolisch geordnet (die Prozeduren stehen im Original alle ganz oben, darunter dann die Buttonaufrufe). Würde mich über Hilfe sehr freuen.
MfG depigoid
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 23.05.07 23:30
Moin!
depigoid hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure ordnen_latein(var bazillus:tfeld); var i,j:integer; hilfe:tfeld; begin for i:=0 to (high(bazillus)-1) do for j:=1 to high(bazillus) do if bazillus[j-1].latein>bazillus[j].latein then begin hilfe[j].latein:=bazillus[j-1].latein; hilfe[j].trivial:=bazillus[j-1].trivial; end; | |
a) Du sortierst immer das ganze Feld 0..High(bazillus), statt nur die Einträge, die auch wirklich benutzt sind!  Führt dann vermutlich dazu, dass du erstmal eine ganze Menge leere Einträge hast, und dann die Daten...
b) Deine Schleifengrenzen sind nicht soo ganz BubbleSort-mäßig.  Wie wär´s damit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| for i := High(bazillus)-1 downto 0 do for j := 0 to i do if (bazillus[j].latein > bazillus[j+1].latein) then begin tmp := bazillus[j].latein; bazillus[j].latein := bazillus[j+1].latein; bazillus[j+1].latein := tmp; |
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
Zuletzt bearbeitet von Narses am Do 24.05.07 09:07, insgesamt 1-mal bearbeitet
|
|
ub60
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: Do 24.05.07 00:31
Besser so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| if (bazillus[j].latein > bazillus[j+1].latein) then begin tmp := bazillus[j]; bazillus[j] := bazillus[j+1]; bazillus[j+1] := tmp; end; |
Sonst sortierst Du nämlich nur die Latein-Einträge und die restlichen Daten bleiben so stehen.
Bye!
ub60
|
|
depigoid 
      
Beiträge: 24
Win XP
|
Verfasst: Do 24.05.07 14:05
Vielen Dank!!!
Habe aber leider immer noch Probleme.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| for i:=(high(bazillus)-1) downto 0 do for j:=0 to i do if (bazillus[j].latein > bazillus[j+1].latein) then begin hilfe[j].latein:=bazillus[j-1].latein; hilfe[j].trivial:=bazillus[j-1].trivial; end; |
Der sortiert die Einträge, außer den letzten - der ist nach dem Sortieren immer weg. Dazu kommt noch eine Fehlermeldung "Exception EAccessViolant Zugriffsverletzung" - die kommt dann gleich immer 6 bis 7 mal hintereinander. Kann das irgendwie mit dem LAden und SPeichern der Datei zusammenhängen (ich hab versucht bei der Delphi-Hilfe die Nachricht zu entschlüsseln, aber das wollte mir irgendwie nicht gelingen.).
Was ist an der Suche falsch?
MfG depigoid
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 24.05.07 14:23
Moin!
Schau noch mal genau hier hin, was du da stehen hast, und was in meinem Beitrag da steht:
depigoid hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| for i:=(high(bazillus)-1) downto 0 do for j:=0 to i do if (bazillus[j].latein > bazillus[j+1].latein) then begin hilfe[j].latein:=bazillus[j-1].latein; hilfe[j].trivial:=bazillus[j-1].trivial; end; | |
depigoid hat folgendes geschrieben: | Was ist an der Suche falsch? |
Hä?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
depigoid 
      
Beiträge: 24
Win XP
|
Verfasst: Mo 28.05.07 16:38
Vielen Dank! (Wer lesen kann, ist klar im Vorteil)
Äh ... der packt jetzt aber die Einträge (sind sortiert) auf die letzten Plätze. Das Feld umfasst 200 Seiten, eingetragen sind Krankheiten:=Ebola, Syphilis, Marburg - ursprünglich auf 1,2,3, nach dem Sortieren auf 198, 199, 200. Kann man das irgendwie ändern?
Wie ist das mit dem "hä?" gemeint?
MfG depigoid
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 29.05.07 00:06
Moin!
depigoid hat folgendes geschrieben: | Vielen Dank! (Wer lesen kann, ist klar im Vorteil)
Äh ... der packt jetzt aber die Einträge (sind sortiert) auf die letzten Plätze. Das Feld umfasst 200 Seiten, eingetragen sind Krankheiten:=Ebola, Syphilis, Marburg - ursprünglich auf 1,2,3, nach dem Sortieren auf 198, 199, 200. Kann man das irgendwie ändern? |
Narses hat folgendes geschrieben: | a) Du sortierst immer das ganze Feld 0..High(bazillus), statt nur die Einträge, die auch wirklich benutzt sind! Führt dann vermutlich dazu, dass du erstmal eine ganze Menge leere Einträge hast, und dann die Daten...  |
Du brauchst einen Zähler für die Anzahl der definierten Einträge und diesen verwendest du in der Sortierschleife statt High(Feldname).
depigoid hat folgendes geschrieben: | Wie ist das mit dem "hä?" gemeint? |
"Hä?" := "Ich verstehe deine Frage nicht!"
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
depigoid 
      
Beiträge: 24
Win XP
|
Verfasst: Di 29.05.07 12:22
Ich krieg das nicht hin!
Problem erfasst (also, dass ich das ganze Feld sortiere) aber ich kann das nicht ändern. Wie mach ich den Zähler (ich habe folgendes ausprobiert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| for i:=0 to high(seitennummer)-1) for i:=high(Bazillus) downto 0 for seitennummer:=0 to high(seitennummer) for a:=0 to high(Bazillus) do for b:=1 to high(bazillus) do begin hilf[a]:=bazillus[b]; bazillus[b]:=bazillus[a]; bazillus[a]:=bazillus[b]; end; |
- die gehen bei mir nicht.)?
Die Suche: Ziel Wort in Edit eingeben, CheckBox anklicken zu welcher Rubrik das Wort gehört und dann soll das Wort unter der Rubrik in den Daten gesucht werden und der Virus ausgegeben.
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:
| procedure THauptfenster.SuchenClick(Sender: TObject); var wort:string; begin wort:=suchEdit.text; if nameBox.checked=true then in_namen_suchen(wort, seitennummer, virus) else if krankheitBox.checked=true then in_krankheiten_suchen(wort, seitennummer, virus) else if symptomeBox.checked=true then in_symptomen_suchen(wort, seitennummer, virus); ausgeben(seitennummer, virus); end;
procedure in_namen_suchen(suche:string; var seite:integer; var bazillus:tfeld); var pos, i:integer; begin pos:=0; for i:=0 to high(bazillus) do begin if (suche=bazillus[i].latein) or (suche=bazillus[i].trivial) then begin seite:=i; pos:=pos+1; end; if pos=0 then Showmessage('Der Name, lateinisch oder deutsch, ist noch nicht gespeichert. Bitte überprüfen Sie die Rechtschreibung!'); end; end; |
Problem: ich gebe im Edit was ein (weiß auch, dass das eingetragen ist) und erhalte als Antwort nur die Showmessage 'noch nicht vorhanden'. Woran liegt das?
|
|
azubi_20
      
Beiträge: 593
WinXP SP2, Ubuntu 8.4
D7 Enterp., D2005 Prof., Java (Eclipse 3.4.0)
|
Verfasst: Di 29.05.07 13:31
depigoid hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure in_namen_suchen(suche:string; var seite:integer; var bazillus:tfeld); var pos, i:integer; begin pos:=0; for i:=0 to high(bazillus) do begin if (suche=bazillus[i].latein) or (suche=bazillus[i].trivial) then begin seite:=i; pos:=pos+1; end; if pos=0 then Showmessage('Der Name, lateinisch oder deutsch, ist noch nicht gespeichert. Bitte überprüfen Sie die Rechtschreibung!'); end; end; |
Problem: ich gebe im Edit was ein (weiß auch, dass das eingetragen ist) und erhalte als Antwort nur die Showmessage 'noch nicht vorhanden'. Woran liegt das? |
Na guck doch mal hin, was da geschieht :
erster Schleifen-Aufruf --> Keine Übereinstimmung --> pos=0 --> showmessage;
So sollte es klappen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| for i:=0 to high(bazillus) do begin if (suche=bazillus[i].latein) or (suche=bazillus[i].trivial) then begin seite:=i; pos:=pos+1;
end; end; if pos=0 then Showmessage('Der Name, lateinisch oder deutsch, ist noch nicht gespeichert. Bitte überprüfen Sie die Rechtschreibung!'); |
btw : so liefert pos bei einem Treffer immer 1
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 29.05.07 13:44
Moin!
depigoid hat folgendes geschrieben: | Problem erfasst (also, dass ich das ganze Feld sortiere) aber ich kann das nicht ändern. Wie mach ich den Zähler |
Der Zähler ist ja auch nicht "automatisch" vorhanden, du musst eine entsprechende Integer-Variable dafür anlegen, bei Programmstart auf 0 setzen und um 1 erhöhen, wenn ein neuer Eintrag angelegt wurde bzw. wenn du einen Eintrag aus einer Datei geladen hast.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
depigoid 
      
Beiträge: 24
Win XP
|
Verfasst: Di 29.05.07 16:57
Die Suche geht - DANKE!!!!!!!
Den "zaehler" habe ich beim "Einlese-Button" mit reingesetzt (muss der Benutzer halt noch mal auf einlesen gehen!)
VIELEN DANK FÜR DIE HILFE beim Sortieren!!!!!
MfG depigoid
|
|