| Autor |
Beitrag |
Inspecta
      
Beiträge: 25
|
Verfasst: So 07.12.03 04:41
wie schaffe ich es das die zahlen sortiert ausgegeben werden?
irgendwie muss es ganz einfach sein mit bubble oder quicksort aber ich rall es nich! irgendwie komm ich da nich weiter!
wäre nett wenn ihr mir helfen würdet! ob mit einer lösung oder mit ansätzen! vielleicht liegt es auch an der uhrzeit!?
danke
das is mein programm:
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:
| Tipp,Zahl : Array[1..6] of Integer; AnzRichtig:Integer;
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Edit1.text:='1'; Edit2.text:='2'; Edit3.text:='3'; Edit4.text:='4'; Edit5.text:='5'; Edit6.text:='6'; Edit7.text:='0'; label7.Caption:=''; label2.Caption:=''; label3.Caption:=''; label4.Caption:=''; label5.Caption:=''; label6.Caption:=''; end;
procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; doppelt:boolean;
begin randomize; Tipp[1]:=StrToInt(Edit1.text); Tipp[2]:=StrToInt(Edit2.text); Tipp[3]:=StrToInt(Edit3.text); Tipp[4]:=StrToInt(Edit4.text); Tipp[5]:=StrToInt(Edit5.text); Tipp[6]:=StrToInt(Edit6.text); Zahl[1]:=Random(49)+1; for i:=1 to 6 do begin repeat Zahl[i]:=Random(49)+1; doppelt:=false; for j:=1 to i-1 do begin if Zahl[i]=Zahl[j] then doppelt := true; end; Until not doppelt; end;
AnzRichtig:= 0; for i:=1 to 6 do begin for j:=1 to 6 do begin if Zahl[i]=Tipp[j] then AnzRichtig:=AnzRichtig + 1; edit7.text:=inttostr(AnzRichtig); end; label2.Caption:='Zahl 1 ='+floattostr(zahl[1]); label3.Caption:='Zahl 2 ='+floattostr(zahl[2]); label4.Caption:='Zahl 3 ='+floattostr(zahl[3]); label5.Caption:='Zahl 4 ='+floattostr(zahl[4]); label6.Caption:='Zahl 5 ='+floattostr(zahl[5]); label7.Caption:='Zahl 6 ='+floattostr(zahl[6]);
end; |
|
|
DeCodeGuru
      
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: So 07.12.03 11:17
Hi, sorry, aber ich habe mir deinen Code nicht genau angeschaut, weil der irgendwie unformatiert ist und ich zu so früher stunde keine Lust habe, den für mich zu ordnen. Was du brauchst ist BubbleSort, denn für 6 läpische Zahlen wäre Quicksort nen bisschen Overkill.
Ich habe dir im nachfolgenden mal ne Bubble-Sort-Algo gepostet. Schau ihn dir mal an.
P.S.: Der arbeitet auch mit nem Array of Integer, also müsstest du das nur anpassen bzw. den Algo so verwenden, ach was weiss ich
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.DoSort; var i, zw: Integer; ok: Boolean begin repeat ok := True; for i := 0 to 19 do begin if testsort[i] > testsort [i + 1] then begin zw := testsort[i]; testsort[i] := testsort[i + 1]; testsort[i + 1] := zw; ok := False; end; end; until ok = True; end; |
Wenn was nit klapp, frag. Ach ja, den Code da oben habe ich nur aus meinem Ordner rausgekramt, daher übernehme ich keinerlei Verantwortung für irgendwelche Fehler 
_________________ Viele Grüße
Jakob
|
|
Inspecta 
      
Beiträge: 25
|
Verfasst: So 07.12.03 13:35
krieg das nich gebacken!
nehm ich das am besten als procedure oder einfach nur einfügen?
könntet ihr mir das genauer zeigen bzw (be)schreiben?
|
|
catweasel
      
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: So 07.12.03 14:51
Hi,
nachdem ich in diesem Forum auch schon viele Hilfe bekommen habe, will ich jetzt mal weiterhelfen :
Hatte diese Geschichten mit Sortieralgorhytmen nämlich auch nie so ganz gerafft... (Rekursion bereiet mir immernoch Kopfschmerzen
Aber ich hab dir den Code vom CodeGuru mal durchkommentiert.......
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:
| procedure TForm1.DoSort;
var i, zw: Integer; ok: Boolean;
begin repeat
ok := True;
for i := 0 to 19 do
begin
if testsort[i] > testsort [i + 1] then
begin zw := testsort[i]; testsort[i] := testsort[i + 1]; testsort[i + 1] := zw;
ok := False;
end; end; until ok = True;
end; |
Ein kleiner Tipp von mir:
| Zitat: | krieg das nich gebacken!
nehm ich das am besten als procedure oder einfach nur einfügen?
könntet ihr mir das genauer zeigen bzw (be)schreiben? |
Das mit der Przedur ist garnicht so schlecht, aber noch wesentlich elegnater ist es das als Funktion zu deklarieren, der du ein array übergibst, und ein array zurückliefert (sortiert selbstverständlich
, etwa so:
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:
| function zahlensort(chaos : array of integer): order : array of integer;
function sortieren(chaos : array [1..6] of integer): order : array [1..6 ]of integer;
var i, zw: Integer; ok: Boolean begin repeat ok := True; for i := 0 to 6 do begin if chaos[i] > chaos [i + 1] then begin zw := chaos[i]; chaos[i] := chaos[i + 1]; chaos[i + 1] := zw; ok := False; end; end; until ok = True; end;
for i := 0 to 6 do Result[i] := chaos[i];
end; |
Du könntest aber auch eine eigene Klasse erstellen mit einem array und die Sortierprozedur als Methode implementieren......
Der Aufruf wäre dann etwa:
Delphi-Quelltext
Delphi lässt einem da vieeele Möglichkeiten..
Catweasel
Moderiert von Tino: Code- durch Delphi-Tags ersetzt.
_________________ Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
|
|
DeCodeGuru
      
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: So 07.12.03 15:01
jo, als Funktion ist das wesentlich schnicker. Was ich noch sagen wollte: Das fehlende Semikolon tut mir leid  und umd das "höchste" Element eines Arrays herauszubekommen kannste High, für das Niedrigste Low verwenden.
_________________ Viele Grüße
Jakob
|
|
Inspecta 
      
Beiträge: 25
|
Verfasst: So 07.12.03 15:29
wie füge ich das zu uses ein?
die procedure!
|
|
catweasel
      
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: So 07.12.03 15:43
High und low.. soso . So lernt sogar der Antworter was .
Hab ja erwähnt das mir das Thema Rekurion Kopfzerbrechen bereitet...
Vielleicht kannst du mir mal einen Sortieralgorhytmus erklären, der auf rekursion basiert ?? *bittebitte*
Mal bezüglich dazu ne allgemeine Frage:
Wenn ich herausbekommen möchte welcher Algo am performantesten ist gibts doch so eine Abhängigkeit von Elementen und Sortiervorgängen, wobei von einer maximalen Unordnung ausgegangen wird.
Beispiel Bubblesort:
Maximale Unordnung hier: ein absteigend Sortierets Array soll aufsteigend sortiert werden.
Um ein eine Menge mit n Elementen per Bubblesort zu sortieren, benötige ich n *n +1 "Züge", oder ?
Das array wird für jedes Element einmal komplett durchgegangen plus einmal am ende der "Leerdurchgang"......
Vielleicht verpwil ich da aber auch was
Aber wie bekomme ich das für kompliziertere Algos (Quicksort,Shellsort, Bucketsort,Fractsort) raus ?
Bitte bring mal jemand für mich List ins Dunkel
Catweasel
_________________ Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
|
|
catweasel
      
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: So 07.12.03 15:47
| Zitat: | wie füge ich das zu uses ein?
die procedure |
!
Datei -> neue unit erstellen
in der ersten Unit oben bei
Quelltext 1: 2:
| uses windows, system, graphics...., stdctrls; |
unit2 einfügen...
Quelltext 1: 2:
| uses windows, system, graphics...., stdctrls, unit2; |
Sieht komisch aus. Ist aber so
in der zweiten Unit übernimmst du den ganzen Uses Schmodder aus unit1 per copy&paste (du brauchst nich alle aber ich weiss im moment nich genau welche)
und im implementation teil der zweiten unit schreibst du die prozedur rein.........
Catweasel
_________________ Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
|
|
Inspecta 
      
Beiträge: 25
|
Verfasst: So 07.12.03 16:18
so weit so gut! hab die procedure jetzt fertig. wenn ich sie aber einsetzen will sagt er nicht genügend wirkliche parameter
wat soll das jetzt?
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: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;
type TForm1 = class(TForm) Panel1: TPanel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Button1: TButton; BitBtn1: TBitBtn; Label1: TLabel; Edit7: TEdit; Button2: TButton; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label2: TLabel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure DoSort(Sender: TObject); private public Tipp,Zahl : Array[1..6] of Integer; AnzRichtig:Integer;
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Edit1.text:='1'; Edit2.text:='2'; Edit3.text:='3'; Edit4.text:='4'; Edit5.text:='5'; Edit6.text:='6'; Edit7.text:='0'; label7.Caption:=''; label2.Caption:=''; label3.Caption:=''; label4.Caption:=''; label5.Caption:=''; label6.Caption:=''; end;
procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; doppelt:boolean;
begin randomize; Tipp[1]:=StrToInt(Edit1.text); Tipp[2]:=StrToInt(Edit2.text); Tipp[3]:=StrToInt(Edit3.text); Tipp[4]:=StrToInt(Edit4.text); Tipp[5]:=StrToInt(Edit5.text); Tipp[6]:=StrToInt(Edit6.text); Zahl[1]:=Random(49)+1; for i:=1 to 6 do begin repeat Zahl[i]:=Random(49)+1; doppelt:=false; for j:=1 to i-1 do begin if Zahl[i]=Zahl[j] then doppelt := true; end; Until not doppelt; end;
AnzRichtig:= 0; for i:=1 to 6 do begin for j:=1 to 6 do begin if Zahl[i]=Tipp[j] then AnzRichtig:=AnzRichtig + 1; edit7.text:=inttostr(AnzRichtig); end; dosort; label2.Caption:='Zahl 1 ='+floattostr(zahl[1]); label3.Caption:='Zahl 2 ='+floattostr(zahl[2]); label4.Caption:='Zahl 3 ='+floattostr(zahl[3]); label5.Caption:='Zahl 4 ='+floattostr(zahl[4]); label6.Caption:='Zahl 5 ='+floattostr(zahl[5]); label7.Caption:='Zahl 6 ='+floattostr(zahl[6]);
end;
end;
procedure TForm1.DoSort; var i, zw: Integer; ok: Boolean; begin repeat ok:=True; for i:=0 to 6 do begin if zahl[i]>zahl [i + 1] then begin zw:=Zahl[i]; Zahl[i]:=Zahl[i + 1]; Zahl[i + 1]:=zw; ok:=False; end; end; until ok=True; end;
procedure TForm1.Button2Click(Sender: TObject); begin formcreate(sender); end;
end. |
Moderiert von Tino: Delphi-Tags hinzugefügt.
|
|
Inspecta 
      
Beiträge: 25
|
Verfasst: So 07.12.03 23:33
kann mir denn da keiner weiterhelfen?
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Mo 08.12.03 10:46
| Inspecta hat folgendes geschrieben: | | wenn ich sie aber einsetzen will sagt er nicht genügend wirkliche parameter |
Und bei welcher Zeile im Sourcecode meldet das der Compiler?
Gruß
Tino
|
|
Inspecta 
      
Beiträge: 25
|
Verfasst: Mo 08.12.03 14:37
und zwar wenn ich die procedure starten will!
....
dosort;
....
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Mo 08.12.03 15:18
Hallo,
im Interface-Teil wird die Procedure wie folgt definiert:
Delphi-Quelltext 1:
| procedure DoSort(Sender: TObject); |
Die Implementiertung (Implementation-Teil) sieht allerdings etwas anders aus:
Delphi-Quelltext 1:
| procedure TForm1.DoSort; |
Entweder fügst du hier noch den Parameter hinzu oder, falls dieser nicht benötigt wird, entferst du den Parameter oben im Interface-Teil.
Gruß
Tino
|
|
Inspecta 
      
Beiträge: 25
|
Verfasst: Mo 08.12.03 15:41
das war es nich!
wie du ein paar felder weiter oben siehst(nich ganz oben), steht da mein code.
aber wenn ich die procedure nach dem filtern der zahlen starten will, damit sie sortiert werden,geht es nich!
ich rall das net mehr. 
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Di 09.12.03 10:09
Hallo!
| Inspecta hat folgendes geschrieben: | | das war es nich! |
Warum nicht? Was passiert?
| Inspecta hat folgendes geschrieben: | | wie du ein paar felder weiter oben siehst(nich ganz oben), steht da mein code. |
Da steht dein Code...  schön.
| Inspecta hat folgendes geschrieben: | | aber wenn ich die procedure nach dem filtern der zahlen starten will, damit sie sortiert werden,geht es nich! |
Was geht denn nicht? Das Compilieren, wird die Funktion nicht ausgeführt, wird die Funktion ausgeführt und es erscheint ein Fehler, ...
Wenn du das Programm starten kannst dann versuch es mal zu debuggen (F8 & F7, etc).
Gruß
Tino
|
|
Inspecta 
      
Beiträge: 25
|
Verfasst: Di 09.12.03 14:02
kA ob ich zu blöd bin das zu erklären,kann ich es eventuell jemandem schicken?
ich probiers noch mal:
wenn ich den letzten code den ich gepostet habe, starten will, verweist er sofort darauf "Nicht genügend wirkliche Parameter"!(er startet also nix!)
Liegt das daran das ne procedure anders aufgerufen wird oder kann das alles einfach so nich laufen?
Ich will ja einfach nur, dass die procedure dosort gestartet wird,nachdem die zahlen gezogen wurden,und diese procedure sie sortiert!
|
|
Inspecta 
      
Beiträge: 25
|
Verfasst: Di 09.12.03 23:16
wäre jemand so nett und würde sich bereit erklären mein program mal zu testen?
keine angst vor viren!
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 09.12.03 23:32
Hallo!
Um das mal mit den Worten des Orakels von Matrix (nicht von Delphi) zu sagen: Du kennst die Antwort schon! Tino hat Dir geschrieben, was falsch läuft: Du sagst im Interface-Teil Deines Programmes (genauer gesagt in dem Teil mit "type TForm1 ..." dort einige Zeilen weit unten), dass DoSort einen Paramter bekommt: Sender.
Wenn Du aber schließlich im implementation-Teil die Prozedur schreibst, also den Quelltext dafür, dann steht dort dieser Parameter nicht mehr im Kopf der Prozedur. Die beiden stimmen also nicht überein, was sie aber müssen.
Eines der beiden musst Du ändern, welches von beiden musst Du Dir selbst überlegen.
MfG
Peter
P.S.: Hoffe, das war verständlich.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Inspecta 
      
Beiträge: 25
|
Verfasst: Mi 10.12.03 16:26
nun gut, soweit läuft das Programm(danke  ).
Hatte die Woche volles Klausuren Programm, deshalb konnte ich mich erst wieda jetzt damit beschäftigen!
Programm läuft, aber es treten Fehler auf die da wären:
-Bei der Zahlen Ausgabe tauchen zwar immer alle Zahlen sortiert auf,
aber ab und zu sind zahlen doppelt(immer nur zahlen von 1-6,glaub ich)
-Die Anzeige der richtigen Zahlen zeigt nur noch Zahlen über 30 an
teste schon die ganze Zeit aber finde keine Lösung!
Habt ihr ne Idee
ps:Nochmal danke
|
|
Inspecta 
      
Beiträge: 25
|
Verfasst: Mi 10.12.03 19:26
wäre super wenn ihr mir auch da nochmal helfen könntet!
|
|