Autor |
Beitrag |
nixchecker
Hält's aus hier
Beiträge: 6
|
Verfasst: So 19.01.03 11:38
Hallo, ich habe ein kleines Problem: ich muss in Informatik das Sortierverfahren "shakersort" vorstellen. Im Internet habe ich dazu nichts gescheites gefunden (oder ich kapiere es nicht, bin nämlich eine Null in Informatik).
Kann mir jemand von euch dieses Verfahren bitte erklären? Oder habt ihr schon ein Programm mit Shakersort geschrieben, das ihr mir geben könnt?
Tausend dank!
|
|
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: So 19.01.03 11:57
Hi,
also, ich weiß nicht was Du hast, wenn ich unter Google suche gibt es genügend Seiten worauf es ausführlich erklärt ist. Man muß sich halt die Sachen zusammenschreiben.
Mal so eine andere Frage, seit wann weißt Du das, dass Du es brauchst ? Denn ich glaube es eher nicht, das jemand anderes für Dich die Arbeit macht. Es wird Dir hier jeder helfen, wenn Du sagst, ich habe hier ein Problem mit dem Code.
Aber ich bin heute nicht so, hier sind ein paar ganz verwehrtbare Links :
www.gymmelk.ac.at/~n...phi11.htm#shakersort
asg.region-kaisersla...ndex_inf_shaker.html
|
|
nixchecker 
Hält's aus hier
Beiträge: 6
|
Verfasst: So 19.01.03 12:05
Da hast du ewas falsch verstanden. Ich will nicht, dass es jemand anderes für mich macht !!!
Ich habe wohl schon mit google gesucht, aber nichts brauchbares gefunden. Entweder irgendwelche Quelltexte, die ich nicht verstehe, oder etwas allegemeines.
Bis jetzt weiß ich nur, dass Shakersort ähnlich wie bubblesort funktioniert.
Zu meinem konkretten Anliegen:
Ich muss 5 Zahlen aus editfenstern auslesen (das kann sogar ich  ),
und diese dann sortieren und in ein neues Editfenster einfügen (das ist das Problem).
Ich weiß nur, dass ich irgendwie etwas mit einer Schleife machen muss, mehr checke ich nicht.
Daher habe ich ja auch gefragt, ob jemand ein fertiges Programm hat, dann könnte ich mir das entsprechende rauskopieren, ansehen, und meine Fragen dazu stellen.
Das Referat (nur eine Kurzvorstellung) muss bis Mittwoch fertig sein (habe diesen Mittwoch bescheid gekriegt)
|
|
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: So 19.01.03 12:07
Hi,
die beiden Links die ich Dir gepostet habe, habe ich mit Google gefunden. Unter diesen Links befinden sich auch Quelltexte. Einfach durch rauskopieren lernt man nichts. Den größten Lerneffekt erziehlst Du wenn Du es selber ausprobierst. Das nur als kleiner Tipp nebenher.
Poste doch einfach mal Deinen Versuch, dann kann man Dir sagen, wo Du einen Fehler gemacht hast.
|
|
nixchecker 
Hält's aus hier
Beiträge: 6
|
Verfasst: So 19.01.03 12:15
Gut dann stelle ich mal meine Frage zu diesem Quelltext:
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 TForm1.ShakerSort(Sender:TObject); var h:array[1..100] of byte; j,k,l,r:byte; begin ... l:=2; r:=100; k:=100; repeat for j:=r downto l do begin if h[j-1]>h[j] then begin tauschen(h[j-1],h[j]); k:=j; end; end; l:=k+1; for j:=l to r do begin if h[j-1]>h[j] then begin tauschen(h[j-1],h[j]); k:=j; end; end; r:=k-1; until l>r; end; |
1.) muss ich byte nehmen (hatten wir noch nie)
2.) sind j,k,l,r meine Variablen? Dann müsste ich doch statt ...
l:=2;
r:=100;
k:=100; meine Editfenster auslesen?
3.) wie sieht es dann mit dieser Zeile aus?
for j:=r downto l do begin
ich weiß ja gar nicht, welches die größte und welches die kleinste Zahl ist?
4.) was soll das:
if h[j-1]>h[j]
5.) gibt es diesen Befehl wirklich:; tauschen(h[j-1],h[j]); oder muss ich den erst erfinden? (wenn ja wie)
6.) warum ist k:=j;?
7.) und die Fragen gehen weiter, aber vielleicht erledigen sich die nächsten fragen, wenn ich die obigen kapier
Moderiert von Tino: Code-Tags hinzugefügt.
|
|
grayfox
      
Beiträge: 800
win98, winXP
D4 Standard; D6 Personal
|
Verfasst: So 19.01.03 12:40
hallo nixchecker!
1) kommt drauf an, wie gross die zahlen sind, die du sortieren willst.
sind sie kleiner als 255, dann reicht byte. ich würde LongInt nehmen, sicher ist sicher
2) bitte sprechende variblen machen. der quelltext wird dadurch leichter verständlich und du verstehst auch nach ein paar monaten noch, was in den variablen drinnensteht
was sind 'editfenster'? das hatte ich noch nie
3) die schleife wird vom letzten eintrag bis zum 2. rückwärts durchlaufen
4)
ist der vergleich der vorigen mit der nächsten zahl
ins h gehört deine zahl, j ist ein zähler
5) tauschen ist der name einer prozedur...
dort wird der nachfolger mit dem vorgänger vertauscht. sie gehört programmiert und nicht erfunden *gg*
6) ich vermute, dass k anzeigt, wie weit er schon sortiert hat...
mfg, stefan
|
|
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: So 19.01.03 12:46
Hi,
diese Procedure sortiert Dir die Zahlen in einem Array.
Um Dir mal ganz kurz zu erklären, wie das Shakersort funktioniert :
Shakersort ist eine Abschlag von Bubble-Sort. Bei Shakersort wird der Array von der ersten bis zur letzten Zahl durchgegangen und ermittelt welche die größte und welches die kleinste ist. Beim ersten Durchlauf wird von oben nach unten angefangen und beim zweiten Durchlauf von unten nach oben. Dadurch entstand der Namen.
Zitat: |
was soll das:
if h[j-1]>h[j]
|
Da wird nur überprüft ob in dem Array H die Position J-1 größer ist als die Position J.
Zitat: |
wie sieht es dann mit dieser Zeile aus?
for j:=r downto l do begin
ich weiß ja gar nicht, welches die größte und welches die kleinste Zahl ist?
|
Diese FOR-Schleife durchgeht das Array H von der letzten Position durch bis zu der zweiten Position.
Tauschen ist eine eigene Funktion, worin das Array in der entgegengesetzen Richtung durchlaufen wird.
Ich hoffe das hilft dir erstmal weiter. Jetzt probiere die Funktion erstmal aus. Denn wenn ich Dir jetzt die ganze Funktion Zeile für Zeile erklären würde, lernst Du nicht viel dabei. Einen kleinen Tipp noch am Schluß, gehe mal das Programm im einzelschritt durch und lasse Dir dabei den Status der einzelnen Variablen anzeigen, damit Du die Zahlen besser nachvollziehen kannst.
|
|
nixchecker 
Hält's aus hier
Beiträge: 6
|
Verfasst: So 19.01.03 12:56
Danke für eure Hilfe, so weit bin ich jetzt gekommen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| begin a:=StrToInt(edit1.text); b:=StrToInt(edit2.text); c:=StrToInt(edit3.text); d:=StrToInt(edit4.text); e:=StrToInt(edit5.text);
repeat for a:=hilfsvari downto e do begin if h[a-1]>h[a] then begin tauschen(h[a-1],h[a]); |
Stimmt das so weit? Bisher bekomme ich nur den Fehler, dass Tauschen ein undefinierter Bezeichner ist. Wie definiere ich tauschen?
Stimmt meine for-schleife?
Moderiert von Tino: Code-Tags hinzugefügt.
|
|
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: So 19.01.03 13:30
Hi,
du schreibst Deine einzelnen Werte in einzelne Variablen, das geht nicht. Du mußt die Werte in ein Array schreiben.
Tauschen ist eine Funktion, die Du noch selber schreiben mußt.
|
|
nixchecker 
Hält's aus hier
Beiträge: 6
|
Verfasst: So 19.01.03 13:39
Und wie mache ich das? Heißt das, dass a,b,c,d,e Arrays werden müssen?
Tut mir leid ich checke das gerade auf keinem Auge, und bin total am Verzweifeln.
|
|
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: So 19.01.03 13:47
Arrays sind Bereiche, wo mehrere Werte oder Zeichenketten dirnstehen können. Beispiel :
Quelltext 1:
| zahlen : array[1..100] of integer; |
In der Variable Zahlen können nun 100 verschiedene Werte gespeichert werden. Die Du nun so wieder abrufen kannst :
Quelltext 1:
| Label1.Caption := IntToStr(zahlen[5]); |
Soviel zu dem kurzen Crash-Kurs. Ich empfehle Dir noch folgende Einsteigertutorials von dieser Seite unter Tutorials und von der Seite www.delphi-source.de
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: So 19.01.03 13:53
Hallo,
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure Tauschen(var Tausch1, Tausch2:Integer); var merk:Integer; begin merk:=Tausch1; Tausch1:=Tausch2; Tausch2:=merk; end; // Tauschen
type MySortArray:array[1..5] of Integer;
procedure TForm1.Sortiere; var i,j:Integer; sort:MySortArray; begin FillChar(sort, SizeOf(MySortArr), 0); for i:=1 to 5 do sort[i]:=StrToInt(TEdit(FindComponent('Edit'+IntToStr(i))).Text); for i:=5 downto 2 do for j:=4 downto 1 do if (sort[i]>sort[j]) then Tauschen(sort[i], sort[j]); end; // TForm1.Sortiere |
Alle Angaben ohne Gewehr;-)
Ob das obigen Sortierverfahren ShakerShort ist, weiss ich nicht, da ich das Sortierverfahren nicht kenne. Aber vom Prinzip her, müsste es stimmen.
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
nixchecker 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 29.01.03 20:36
So, dasss Thema hat sich erledigt. Ich habe das Referat nicht gehalten
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Do 30.01.03 10:28
Trotzdem Danke an die die geholfen haben
Gruß
TINO
|
|