Entwickler-Ecke
Sonstiges (Delphi) - Zahl nach Ziffergröße ordnen, dann Differenz bilden
boxer123 - Do 20.10.11 13:40
Moderiert von
Narses: Abgetrennt von [url=http://www.delphi-forum.de/viewtopic.php?t=107427]hier[/url]
So Programmumschreibung, Das programm muss nur eine Zahl nach der größe und nach der kleinsten ordnen und dann die diffenrenz bilden mehr nicht von einer vier stelligen zahl. Das ist mein Quelltext. Aber jetzt habe ich da ein problem wie soll ich gleichzeitig das er 2mal ordnet.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| var Form1: TForm1; i, j, zahl1, zahl2, differenz:integer; park, zahltext, zahltexteins, zahltextzwei:string; a,b:array[1..4] of string;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin zahltext:=edit1.text; for i:=1 to 4 do begin a[i]:=copy(zahltext,i,1); b[i]:=copy(zahltext,i,1); end; for j:=i+1 to 4 do if a[i]>=b[i] then begin park:=a[i];a[i]:=b[i];b[i]:=park; |
Narses - Do 20.10.11 14:04
Moin!
boxer123 hat folgendes geschrieben : |
| Aber jetzt habe ich da ein problem wie soll ich gleichzeitig das er 2mal ordnet. |
Was genau möchtest du uns fragen? :gruebel: :nixweiss:
cu
Narses
boxer123 - Do 20.10.11 14:06
Also ich möchte eine 4 Stellige zahl also die Ziffern ordnen nach der größe und nach der kleinsten.
Aber ich weiß nicht wie ich das schreiben soll
Narses - Do 20.10.11 14:09
Moin!
boxer123 hat folgendes geschrieben : |
Also ich möchte eine 4 Stellige zahl also die Ziffern ordnen nach der größe und nach der kleinsten.
Aber ich weiß nicht wie ich das schreiben soll |
Wenn du es nicht direkt in Delphi schreiben kannst, dann probier´s doch erstmal in normaler Sprache, dann sehen wir mal, ob man das Übersetzen kann. :idea:
Also: was genau muss man in welcher Reihenfolge tun? :lupe:
cu
Narses
boxer123 - Do 20.10.11 14:17
Also ich habe schon geschafft das er die vierstellige zahl zerlegt.
Jetzt muss ich machen,dass er die ziffern nach der größe sortiert und diese zahl lege ich dann in einer variable:zahl1 und einaml das er die 4 ziffern nach der kleinsten sortiert und diese zahl lege ich in der variable:zahl2
Ich habe ja die 4 Zahlen zerlegt, also muss ich sie wieder zusammen machen.
und dann die differenz bilden also:differenz:=zahl1-zahl2;
So glaube ich
Narses - Do 20.10.11 14:20
Moin!
Luckie hat folgendes geschrieben : |
| Warum ein dritter Thread? |
Was ist an deinem Link anders als an meinem Hinweis oben im ersten Post? :roll: Manchmal hilft ein "Neustart" in einem neuen Topic, vielleicht auch nicht, wir werden sehen. :idea:
boxer123 hat folgendes geschrieben : |
Jetzt muss ich machen,dass er die ziffern nach der größe sortiert und diese zahl lege ich dann in einer variable:zahl1 und einaml das er die 4 ziffern nach der kleinsten sortiert und diese zahl lege ich in der variable:zahl2
Ich habe ja die 4 Zahlen zerlegt, also muss ich sie wieder zusammen machen.
und dann die differenz bilden also:differenz:=zahl1-zahl2; |
Du hast lediglich beschrieben, was dein Programm tun soll, aber nicht, wie genau dabei vorzugehen ist. Versuch doch mal zu beschreiben, was im Detail mit den Ziffern passieren muss, ganz kleine Schrittchen.
cu
Narses
boxer123 - Do 20.10.11 14:34
1.Schritt: Zahlen zerlegen mit copy
2.Schritt: Zahlen ordnen einmal nach der größe und nach der kleinsten
3.Schritt: Die größte Zahl in eine Variable speichern.
4.Schritt: Das gleiche auch mit der kleinsten.
5.Schritt: Zahlen wieder zusammen machen
6.Schritt: Diffenrenz von den beiden zahlen bilden.
7.Schritt: Ausgebung im edit2.text
so gut oder?
Narses - Do 20.10.11 14:39
Moin!
boxer123 hat folgendes geschrieben : |
| so gut oder? |
Ja, schon besser, aber noch nicht "brauchbar". ;)
boxer123 hat folgendes geschrieben : |
| 1.Schritt: Zahlen zerlegen mit copy |
Das hast du ja schon im Code oben drin.
boxer123 hat folgendes geschrieben : |
| 2.Schritt: Zahlen ordnen einmal nach der größe und nach der kleinsten |
Das hier sind schon zwei Schritte auf einmal. Immer langsam. :) Nehmen wir erstmal nur eins der Sortierungen, welches kannst du dir aussuchen. Wie genau soll das ablaufen? Kannst du das nochmal besser beschreiben?
cu
Narses
boxer123 - Do 20.10.11 14:43
Also,
Die 4Stellige Zahl nach der größe sortieren mit Bubblesort, das kenne ich nur.
Narses - Do 20.10.11 14:44
Moin!
boxer123 hat folgendes geschrieben : |
| Die 4Stellige Zahl nach der größe sortieren mit Bubblesort, das kenne ich nur. |
Sehr schön :zustimm: genau das hätte ich auch vorgeschlagen. Dann Butter bei die Fische, denk dir eine 4stellige Zahl aus und mach mal ein Beispiel, wie das funktioniert, aber mit ganz kleinen Schritten! :idea:
cu
Narses
boxer123 - Do 20.10.11 14:57
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| 8 9 4 6- i j 9 8 4 6- 1 2 4 8 9 6- 1 3 4 8 9 6- 1 4 4 8 9 6- 1 4 - 4 9 8 6- 2 3 4 6 9 8- 2 4 4 6 9 8- 2 6 4 6 9 8- 2 7 - 4 6 8 9- 3 4 |
Moderiert von
Narses: Code-Tags hinzugefügt
Narses - Do 20.10.11 14:59
Moin!
OK, das war Copy&Paste, das ist nicht schwer. :roll: Und jetzt nochmal genau beschreiben, was da passiert. :idea:
cu
Narses
boxer123 - Do 20.10.11 15:03
Das war nicht Copy & Paste ehrlich.
1.Schritt: Die erste Zahl wird mit jeder nach der Reihe mit jeder Zahl verglichen
2.Schritt: Wenn eine Zahl größer ist als die Zahl, dann wird die Zahl mit der ersten vertauscht
3.Schritt: Wenn man alle Zahlen durch hat, macht man folgendes jetzt das gleiche mit der zweiten Zahl.
4.Schritt: Und so weiter.
Narses - Do 20.10.11 15:16
Moin!
boxer123 hat folgendes geschrieben : |
| Das war nicht Copy & Paste ehrlich. |
:suspect: Hm, möglicherweise (sind ja ein paar Ungereimtheiten drin). :nixweiss:
boxer123 hat folgendes geschrieben : |
1.Schritt: Die erste Zahl wird mit jeder nach der Reihe mit jeder Zahl verglichen
2.Schritt: Wenn eine Zahl größer ist als die Zahl, dann wird die Zahl mit der ersten vertauscht |
Quelltext
1: 2: 3: 4: 5:
| 8 9 4 6- i j 9 8 4 6- 1 2 4 8 9 6- 1 3 4 8 9 6- 1 4 4 8 9 6- 1 4 |
Deine Ablaufbeschreibung ist zwar nicht der Bubble-Sort-Algorithmus, aber er wird funktionieren. :idea: Allerdings stimmt dein Beispiel nicht mit deiner Ablaufbeschreibung überein. Kannst du das nochmal überarbeiten? Weiterhin: was soll das "i" und das "j" in dem Beispiel, kannst du das auch nochmal erläutern?
cu
Narses
boxer123 - Do 20.10.11 15:22
Variablen. ich habe eine Idee zu dem alghorithmus
Wird das funktionieren.
Delphi-Quelltext
1: 2:
| if a[i]>max then max:=a[i]; if b[i]>min then min:=a[i]; |
edit: Wozu i da ist. Also damit man nicht schreiben soll a[1] a[2] .....
Macht man eine for schleife für i
Und schreibt einfach dann a[i]
Narses - Do 20.10.11 15:32
Moin!
boxer123 hat folgendes geschrieben : |
| Variablen. |
boxer123 hat folgendes geschrieben : |
Wozu i da ist. Also damit man nicht schreiben soll a[1] a[2] .....
Macht man eine for schleife für i
Und schreibt einfach dann a[i] |
OK, und warum stehen da noch irgendwelche Zahlen hinten an deinem Beispiel dran? :lupe: Wie sieht´s mit einer Korrektur von dem ersten Abschnitt aus? Der ist nicht richtig, gemessen an deiner Beschreibung.
boxer123 hat folgendes geschrieben : |
ich habe eine Idee zu dem alghorithmus
Wird das funktionieren.
Delphi-Quelltext 1: 2:
| if a[i]>max then max:=a[i]; if b[i]>min then min:=a[i]; | |
Wenn ich die Antwort auf ein Ja/Nein reduzieren soll: Nein, wird es nicht. :?
cu
Narses
Horschdware - Do 20.10.11 15:34
Ich möchte nochmals darauf hinweisen, dass Boxer in der DP bereits einen fertigen Quellcode inkl. Sortierung erhalten hat.
boxer123 - Do 20.10.11 15:41
Der ist mit zu komplitziert ich will einen den ich verstehe
Narses - Do 20.10.11 15:41
Moin!
Horschdware hat folgendes geschrieben : |
| Ich möchte nochmals darauf hinweisen, dass Boxer in der DP bereits einen fertigen Quellcode inkl. Sortierung erhalten hat. |
Ja, das weiß ich. ;) Offensichtlich hat er ihn aber nicht verstanden. :P Ich habe auch nicht vor Quelltext zu liefern, aber solange er beim Nacharbeiten des Verständnisses kooperativ ist, macht es Sinn, weiter zu helfen. :nixweiss:
cu
Narses
boxer123 - Do 20.10.11 16:04
Habe überlegt und versucht
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:
| var Form1: TForm1; i, j, zahl1, zahl2, differenz:integer; park, zahltext, zahltexteins, zahltextzwei, max, min,s:string; a,b:array[1..4] of string;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin zahltext:=edit1.text; for i:=1 to 4 do begin a[i]:=copy(zahltext,i,1); b[i]:=copy(zahltext,i,1); end; for i:=1 to 4 do if a[i]>=a[j] then begin park:=a[i];a[i]:=a[j];a[j]:=park; end; park:=zahltexteins; if b[i]<=b[j] then begin min:=b[i];b[i]:=b[j];b[j]:=min; min:=zahltextzwei; differenz:=zahltexteins-zahltextzwei; edit2.text:=string(a[i]); |
Teekeks - Do 20.10.11 16:14
Weil du keine Strings voneinander abziehen kannst.
Warum nutzt du keinen Integer?
boxer123 - Do 20.10.11 16:16
ich weiß nicht wie ich es wieder zu einem integer verbinden kann
Teekeks - Do 20.10.11 16:20
Suche mal nach inttostr und strtoint.
boxer123 - Do 20.10.11 16:25
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:
| var Form1: TForm1; i, j, zahl1, zahl2, differenz:integer; park, zahltext, zahltexteins, zahltextzwei, max, min,s:string; a,b:array[1..4] of string;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin zahltext:=edit1.text; for i:=1 to 4 do begin a[i]:=copy(zahltext,i,1); b[i]:=copy(zahltext,i,1); end; zahl1:=strtoint(edit1.Text); zahl2:=strtoint(edit2.text); zahl1:=0;zahl2:=0; for i:=1 to 4 do for j:=i+1 to 4 do if a[i]>=a[j] then begin park:=a[i];a[i]:=a[j];a[j]:=park; end; zahltext:=zahltexteins; if b[i]<=b[j] then begin min:=b[i];b[i]:=b[j];b[j]:=min; end; zahltexteins:=zahltextzwei; differenz:=zahl1-zahl2; edit2.text:=inttostr(); |
Edit: bin ich dran ich hoffe es
Narses - Do 20.10.11 16:56
Moin!
boxer123 hat folgendes geschrieben : |
| Der ist mit zu komplitziert ich will einen den ich verstehe |
boxer123 hat folgendes geschrieben : |
| Habe überlegt und versucht |
Immer langsam mit die jungen Pferde... ;) Dein Einsatz ist sicher lobenswert, aber du versuchst (schon die ganze Zeit) drei Schritte auf einmal zu machen, weißt aber gar nicht, wohin - um es mal zu umschreiben. :nixweiss: In deinem Quelltext sind mehrere "Probleme" durcheinander, das wird so nix.
Ich hatte dich gebeten das Beispiel nochmal aufzuarbeiten, so dass es deiner Beschreibung des Algorithmus entspricht. Wie sieht´s aus, macht keinen Spaß, ja mag sein, aber du hast konkrete Probleme, genau das umzusetzen. Deshalb halte ich es für notwendig, dass wir da nochmal ansetzen. Wenn du wirklich verstanden hast, was da wann wie passiert, dann kannst du daraus sicher auch den Delphi-Code machen. ;)
cu
Narses
boxer123 - Do 20.10.11 17:00
ja, ich weiß wie es sein soll.
7.Schritt: Ich muss es in einer variable speichern also die Zahl aber es funktioniert nicht. z.b. park:=zahl1;
Narses - Do 20.10.11 17:06
Moin!
boxer123 hat folgendes geschrieben : |
| ja, ich weiß wie es sein soll. |
Das habe ich auch gar nicht bezweifelt, aber du drückst dich schon die ganze Zeit darum, dieses Beispiel mal im Detail durchzugehen. Warum weiß ich nicht. Wenn du es weißt, wie es richtig geht, warum machst du es dann nicht mal eben und gut ist. :nixweiss:
Hier geht´s weiter: beschreibe bitte ganz detailiert, wie man nach deiner Vorgehensweise den ersten Block korrekt bildet.
cu
Narses
boxer123 - Do 20.10.11 17:12
1.Schritt: Man vergleicht die erste Zahl mit der Zweiten.
2.Schritt: Wenn sie größer ist vertauscht man beide.
3.Schritt: Dann vergleicht man die vertauschte zahl mit der dritten Zahl
4.Schritt: Wenn sie kleiner ist passiert nix
5.Schritt: Dann vergleicht man die 1.zahl mit der letzten, wenn sie größer vertauscht man beide und wenn sie kleiner ist passiert nix.
1.Schritt: Jetzt fängt man mit der 2ten an und vergleicht sie mit der dritten.
immer weiter so
1.Schritt: jetzt die dritte mit der 4ten
immer weiter so
Narses - Do 20.10.11 17:19
Moin!
OK, ich hätte zwar im 4. Schritt geschrieben: "Wenn sie größer ist vertauscht man beide.", damit das gleich zum 2. Schritt ist, aber gut, geht auch so. :?
Allerdings ist dein Beispiel nicht passend zu dieser Beschreibung. :idea: Deshalb mach bitte mal folgendes:
Unterstreiche mal die Ziffern, die in einem Schritt verglichen werden, dann schreibst du darunter die neue Anordnung:
Damit man sehen kann, wie die Sortierung zustande kommt. :idea:
cu
Narses
boxer123 - Do 20.10.11 17:26
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| 8 9 4 6 - - 9 8 4 6 - 8 - 6 4 8 9 6 4 - 9 - 4 6 9 8 4 6 - - 4689 |
Narses - Do 20.10.11 17:33
Moin!
OK, danke. ;)
Du hast allerdings noch einen dicken Bock in deinem Ablauf, mal sehen, ob wir den noch "sichbar" machen können. ;) Bitte mach doch noch mal einen Durchlauf mit dieser Folge:
Achte bitte darauf in den Zeilen mit den Unterstreichungen keine Ziffern anzugeben, damit der Vergleich deutlicher wird. :idea:
cu
Narses
boxer123 - Do 20.10.11 17:38
8 1 9 4 6
- -
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| 8 1 9 4 6 - - 1 8 9 4 6 - - 1 9 8 4 6 - - 1 4 8 9 6 - - 1 4 6 9 8 - - 1 4 6 8 9 |
Narses - Do 20.10.11 17:46
Moin!
Super. Allerdings: findest du es nicht etwas "seltsam", dass da so ein Muster raus kommt?
Quelltext
1: 2: 3: 4: 5:
| - - - - - - - - - - |
Ich geb dir mal einen Tipp, normalerweise macht man solche Muster, wenn man sortiert: (Bubble-Sort)
Quelltext
1: 2: 3: 4: 5:
| - - - - - - - - - - |
oder aber solche: (Min-Sort)
Quelltext
1: 2: 3: 4: 5:
| - - - - - - - - - - |
Probier mal deine Beschreibung so anzupassen, dass eins der "Standard-Muster" dabei rauskommt. :idea:
cu
Narses
boxer123 - Do 20.10.11 17:48
Wie jetzt quelltext anpassen?
Narses - Do 20.10.11 17:52
Moin!
boxer123 hat folgendes geschrieben : |
| Wie jetzt quelltext anpassen? |
Nein, ich meine diese Beschreibung hier: :idea:
boxer123 hat folgendes geschrieben : |
1.Schritt: Man vergleicht die erste Zahl mit der Zweiten.
2.Schritt: Wenn sie größer ist vertauscht man beide.
3.Schritt: Dann vergleicht man die vertauschte zahl mit der dritten Zahl
4.Schritt: Wenn sie kleiner ist passiert nix
5.Schritt: Dann vergleicht man die 1.zahl mit der letzten, wenn sie größer vertauscht man beide und wenn sie kleiner ist passiert nix. |
cu
Narses
boxer123 - Do 20.10.11 18:02
1.Schritt: Man vergleicht die 1.Zahl mit der 2ten Zahl.
2.Schritt: Wenn die Zweite Zahl größer ist als die erste vertauscht man beide.
3.Schritt: Die erste Zahl vergleicht man auch mit der 3ten und 4ten Zahl.
4.Schritt: Wenn die 1te Zahl größer als beide ist ändert sich garnix.
5.Schritt: Jetzt vergleicht man die 2te mit der dritten wenn die dritte größer ist.
6.Schritt: Vertauscht man beide also die 2te und die dritte.
7.Schritt: Jetzt vergleicht man die 2te mit der 4ten und wenn die 4te Zahl größer ist ändert man nix.
8.Schritt: Jetzt vergleicht man die 3te mit der 4ten wenn die 3te zahl größter ist als die 4te ist. Vertauscht man die beiden zahlen.
Moderiert von
Narses: Code-Tags entfernt.
Narses - Do 20.10.11 18:07
Moin!
Sorry, aber deine Vorschrift produziert weder das Bubble- noch das Min-Sort Muster. :nixweiss:
Also nochmal: Willst du das Bubble- oder das Min-Sort Muster nehmen? Tipp: versuche dich bei der Beschreibung auf so wenige Zeilen wie möglich zu beschränken, das könnte z.B. ganz gut gehen, wenn du statt der "1. Zahl, 2. Zahl" sagst, die i-te Zahl und dann dazu sagst, wo i startet und wann es stoppt. Wenn dich das verwirrt, dann lass es weg und machs mit direkten Positionsangaben. :nixweiss:
cu
Narses
boxer123 - Do 20.10.11 18:14
1.Schritt: Man vergleicht die 1.Zahl mit der 2ten Zahl.
2.Schritt: Wenn die 2.Zahl größer ist als die 1.Zahl; Vertauscht man beide.
3.Schritt: Die 1.Zahl vergleicht man auch mit der 3.Zahl und 4.Zahl.
4.Schritt: Wenn die 1.Zahl größer ist, als beide Zahlen also die 3.Zahl und die 4.Zahl ist,dann ändert sich nix.
5.Schritt: Jetzt vergleicht man die 2.Zahl mit der 3.Zahl wenn die 3.Zahl größer ist als die 2.Zahl
6.Schritt: Vertauscht man beide also die 2.Zahl und die 3.Zahl.
7.Schritt: Jetzt vergleicht man die 2.Zahl mit der 4.Zahl und wenn die 4.Zahl Größer ist, ändert man nix.
8.Schritt: Jetzt vergleicht man die 3.Zahl mit der 4.Zahl wenn die 3.Zahl Größter ist als die 4.Zahl. Vertauscht man die beiden zahlen!
So muss es doch sein?^^
boxer123 - Do 20.10.11 18:27
Ich meinte es anders, aber aufjedenfall habe ich es verstanden
Narses - Do 20.10.11 18:35
Moin!
boxer123 hat folgendes geschrieben : |
| Ich meinte es anders, aber aufjedenfall habe ich es verstanden |
Wenn du es verstanden hast, kannst du auch eine Beschreibung in Umgangssprache anfertigen. Kannst du das nicht, hast du es nicht verstanden. :nixweiss:
Also nochmal:
- Gib bitte an, ob du Bubble- oder Min-Sort verwenden willst.
- Wenn du einen Schritt beschreibst, dann gehört das Vergleichen und ggfs. Tauschen in einen Schritt. Beispiel: "1. Schritt: Man vergleicht die 1. Zahl mit der 2. Zahl. Wenn die 2. Zahl größer ist als die 1. Zahl, vertauscht man beide.". etc.pp.
- Geh in deiner Beschreibung von, sagen wir mal, 10 Zahlen aus. Es wird also vermutlich schwer, wenn du dann immer "1. Zahl, 2. Zahl" usw. sagst. Wie kann man das besser machen?
- Der Vollständigkeit halber: Wir betrachten zunächst mal noch kein vollständiges Sortieren der Menge, sondern nur den ersten großen Block (um es mit deinem allerersten Beispiel in Verbindung zu bringen: der erste Block, wo i=1 ist)
cu
Narses
//EDIT: Diskussion per PN auf morgen vertagt. ;)
boxer123 - Sa 22.10.11 11:18
ok, es kann weiter gehen
Narses - Sa 22.10.11 14:29
Moin!
boxer123 hat folgendes geschrieben : |
| ok, es kann weiter gehen |
Ja, von mir aus gerne. Ich warte noch auf die angepasste Beschreibung, wie man die von mir genannten Muster beim Sortieren erzielen kann.
cu
Narses
boxer123 - Sa 22.10.11 15:18
Also,
1.Schritt: Man vergleicht die 1.Zahl mit der 2.Zahl.
2.Schritt: Man vergleicht die 2.Zahl mit der 3.Zahl.
3.Schritt: Man vergleicht die 3.Zahl mit der 4.Zahl.
Narses - Sa 22.10.11 15:23
Moin!
Ja, schon besser! :) Und für welche Sortierung hast du dich damit entschieden? Weiterhin: nur zu Vergleichen wird ja nicht helfen, es muss ja auch mal irgendwann eine Ziffer getauscht werden. Und noch dazu: du hast nur 3 Elemente berücksichtigt, nicht 10 oder von mir aus auch gleich beliebig viele.
Also bitte nochmal etwas detailierter beschreiben, was da ganz genau passiert. Grund: sonst kann man es ja später auch nicht dem Computer als Programm erklären. :idea:
cu
Narses
boxer123 - Sa 22.10.11 15:26
Bubblesort, ämm ja man vertauscht wenn die zahl kleiner ist, als die andere
Narses - Sa 22.10.11 15:30
Moin!
Ja, das ist der erste Durchlauf bei Bubblesort, das ist richtig. ;)
Aber:
boxer123 hat folgendes geschrieben : |
| man vertauscht wenn die zahl kleiner ist, als die andere |
Wann vertauscht man da was und womit? Deine Beschreibung ist weit davon entfernt, detailiert zu sein - und so sehen auch aktuell deine Programme aus. :zwinker:
Also: bitte endlich mal eine komplette, detailierte Beschreibung liefern! :|
cu
Narses
boxer123 - Sa 22.10.11 15:37
Also,
Nehmen wir an;wir haben die Zahl: 4956.
1.Schritt: Man vergleicht die 4 mit der 9, die 9 ist größer also passiert nix.
2.Schritt: Jetzt vergleicht man die 4 mit der 5, die 5 ist größer also passiert nix.
3.Schritt: Jetzt vergleicht man die 4 mit der 6, die 6 ist größer also passiert nix.
4.Schritt: Jetzt vergleicht man die 9 mit der 5, die 9 ist größer also vertauscht man beide, dann sieht sie so aus: 4596.
5.Schritt: Jetzt vergleicht man die 5 mit der 6, die 6 ist größer also passiert nix.
6.Schritt: Jetzt vergleicht man die 9 mit der 6, die 9 ist größer also vertauscht man beide, dann sieht sie so aus: 4569.
Und die Zahl geordnet: Von 4956 = 4569
Narses - Sa 22.10.11 15:44
Sag mal, willst du mich auf den Arm nehmen? :suspect: Gerade erzählst du was von Bubblesort, lieferst eine einigermaßen brauchbare Beschreibung ab und jetzt kommt wieder der Blödsinn vom Anfang... :nut:
Hast du ernsthaft Interesse das zu verstehen? Dann wäre jetzt der Zeitpunkt das Gehirn einzuschalten und sich an den Hilfestellungen und Vorgaben zu orientieren, die ich die ganze Zeit gebe.
boxer123 - Sa 22.10.11 15:48
Also,
Nehmen wir an;wir haben die Zahl: 4956.
1.Schritt: Man vergleicht die 4 mit der 9, die 9 ist größer also passiert nix.
2.Schritt: Jetzt vergleicht man die 9 mit der 5, die 9 ist größer also vertauscht man beide, dann sieht sie so aus: 4596.
3.Schritt: Jetzt vergleicht man die 9 mit der 6, die 9 ist größer also vertauscht man beide
Narses - Sa 22.10.11 16:17
Moin!
Na, geht doch. ;)
Jetzt der nächste Schritt, nehmen wir mal an, du hast ganz viele Ziffern (oder auch Zahlen), also sowas:
Quelltext
1: 2: 3:
| ... 4 9 5 6 ... ^ i |
Die aktuell betrachtete Position wird mit "i" bezeichnet, die Ziffer (oder Zahl) an dieser Stelle mit zahlen[i].
Stelle bitte deine Beschreibung so um, dass nicht mehr "1. Ziffer, 2. Ziffer, etc." benutzt wird, sondern i und zahlen[]. :idea:
Ich muss mal gerade offline gehen, ich schaue mir den Thread aber gleich wenn ich wieder da bin weiter an.
cu
Narses
boxer123 - Sa 22.10.11 16:22
Nehmen wir an;wir haben die Zahl: 4956.
1.Schritt: Man vergleicht die zahlen[i] mit der zahlen[2], die zahlen[2] ist größer also passiert nix.
2.Schritt: Jetzt vergleicht man die zahlen[2] mit der zahlen[3], die zahlen[3] ist größer also vertauscht man beide, dann sieht sie so aus: 4596.
3.Schritt: Jetzt vergleicht man die zahlen[3] mit der zahlen[4], die zahlen[3] ist größer also vertauscht man beide.
Teekeks - Sa 22.10.11 17:08
Ich übernehme mal kurz:
Schon mal gut, jetzt noch soweit umschreiben dass du anstatt fester werte (so etwas wie zahlen[2]) nur noch den Wert i nimmst und diesen entsprechend von Schritt zu Schritt veränderst (erhöhst).
boxer123 - Sa 22.10.11 17:16
wie, also denke ich mir eine variable aus z.b park.
Delphi-Quelltext
1: 2: 3:
| for i:=1 to 4 do for j:=1 to 4 do if a[i]>a[j] then begin |
ah nein das ist falsch
Teekeks - Sa 22.10.11 18:15
Und was ist deiner Meinung nach falsch? (was es wirklich ist)
Und wie würdest du es sonst lösen?
Ein Tipp: wenn man den Nachfolger von a[i] haben möchte, reicht ein a[i+1]
boxer123 - Sa 22.10.11 18:37
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| for i:=1 to 4 do for j:=1 to 4 do repeat if a[i+1] > a[i+2] then begin if a[i+2] > a[i+3] then begin if a[i+3] > a[i+4] then begin until a[i] < a[j]; |
glaube das es falsch ist.
Teekeks - Sa 22.10.11 18:45
Ja ist es.
Warum schreibst du es dann wenn du denkst das es falsch ist?
Du benötigst nur eine For-Schleife
Narses - Sa 22.10.11 18:46
Moin!
boxer123 hat folgendes geschrieben : |
| glaube das es falsch ist. |
Jup, das ist es. :? Das liegt daran, dass du wieder anfängst, drei Schritte auf einmal zu machen. :nixweiss: Langsam. ;)
Teekeks hat folgendes geschrieben : |
| Du benötigst nur eine For-Schleife |
Das ist der richtige Tipp, versuch es mal damit. :idea:
cu
Narses
boxer123 - Sa 22.10.11 19:00
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| for j:=i+1 to 4 do if a[i+1] > a[i+2] then begin if a[i+2] > a[i+3] then begin if a[i+3] > a[i+4] then begin park:=a[i]; a[i]:=a[j]; a[j]:=park; |
edit
Narses - So 23.10.11 00:19
Moin!
Ich gebe zu, du bist ein echt harter Fall... :? Ich grüble jetzt schon den halben Tag drüber nach, was hier für ein Film läuft. :lupe: Gibt eigentlich nur zwei Möglichkeiten:
A) Du bist ein Troll und lachst dich gerade auf dem Fussboden halb tot über unsere Klimmzüge... :autsch:
B) Du bist Schüler (geschätzte Klasse 10, Info-Wahlfach oder AG oder sowas) und hast nicht die blasseste Ahnung, was da im Unterricht läuft. Dein Lehrer hat die Nase voll und dir eine 5-6 angedroht, wenn du nicht diese Aufgabe ablieferst, blöderweise findet sich nix oder niemand im Web, was sich mit wenig Aufwand als eigene Leistung verkaufen lässt... 8) Die Komplettlösung aus der DP kannst/willst du nicht verwenden, weil der Lehrer sofort merken würde, dass das niemals von dir sein kann. :suspect: Tja, Lehrer sind auch nur alte Schüler... :P
Ich tippe vorerst noch auf die Schüler-Story.
ein Troll würde sich nicht die Mühe machen immer um 20 Uhr (mit einer Ausnahme von 21:30) offline zu gehen, auch die Kritikfähigkeit und Reaktionen darauf, sowie die Ungeduld, sind mehr die eines Schülers als eines Trolls
back-to-topic:
Jung, bei dir klemmt eine Synapse, aber sowas von... ;) Wenn ich mir deinen Code ansehe und den letzten umgangssprachlichen Versuch, den Vorgang zu verallgemeinern, dann kann das nur eines heißen: du hast nicht verstanden, wie eine for-Schleife überhaupt funktioniert, und Variablen sind für dich auch mehr was Esotherisches, als was Verstandenes. :nixweiss: Kann das sein? :| Ich rate mal ja, und deshalb setzen wir da wieder an, diesmal noch langsamer. :les:
boxer123 hat folgendes geschrieben : |
1.Schritt: Man vergleicht die zahlen[i] mit der zahlen[2]
2.Schritt: Jetzt vergleicht man die zahlen[2] mit der zahlen[3]
3.Schritt: Jetzt vergleicht man die zahlen[3] mit der zahlen[4] |
Das ist ja schon fast richtig, nur nicht zuende gedacht. Hast du wirklich immer noch nicht gesehen, dass in jedem Schritt eine bestimmte Ziffer/Zahl mit ihrem rechten Nachbarn verglichen wird, weshalb die Schritte alle gleich aussehen (ich habe jetzt mal das Tauschen im Zitat weggelassen, damit man das besser sieht)? Die Beschreibung reduziert sich also auf:
x. Schritt: Man vergleicht zahlen[i] mit zahlen[i+1] und tauscht, wenn die Größenverhältnisse nicht wie gewünscht sind
Für i=1 erhält man deinen 1. Schritt, für i=2 deinen 2. Schritt, usw.usf. :think:
So, jetzt die Preisfrage:
mit welchem Wert muss i loslaufen und bei welchem Wert muss i wieder stoppen? Nochmal im Detail, um was es geht: welche Zahlen sollen
für i zum Vergleichen und ggfs. Tauschen verwendet werden, und zwar ganz konkret auf dein Beispiel mit den 4 Ziffern bezogen?
Wenn du diese Frage richtig beantworten kannst, machen wir mit dem nächsten Schritt weiter. Solltest du diese Frage nicht korrekt beantworten können, erwarte ich eine ausführliche Erklärung, warum oder was genau du nicht verstanden hast. Und zwar detailiert, nicht nur einen müden Satz.
Wenn dir das zu blöde erscheint, um hier so weiter zu machen, kein Problem für mich. Ich kann das Programmieren/Erklären und mir sitzt auch kein Lehrer im Nacken. :mrgreen: Es liegt ganz bei dir.
cu
Narses
boxer123 - So 23.10.11 08:48
was schreib ich da
es muss anfangen bei i und bei i+1 enden
Moderiert von
Narses: Beiträge zusammengefasst
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var i:integer;park:string;doppelt:boolean; begin park:=0; repeat for i:=1 to 4 do if a[i] > a[i + 1] then begin park:= a[i]; a[i]:= a[i+1]; a[i + 1]:= park; doppelt:=false; until doppelt; |
ist es so besser
Narses - So 23.10.11 12:06
Moin!
Ich hatte ja schon mit Bangen auf die Antwort gewartet und überlegt, auf welche Weise man das falsch verstehen könnte, aber die Realität ist doch immer wieder überraschend... :?
boxer123 hat folgendes geschrieben : |
| es muss anfangen bei i und bei i+1 enden |
Wie kann in der Antwort ein "i" vorkommen, wo ich doch ausdrücklich daraufhingewiesen habe, dass:
Narses hat folgendes geschrieben : |
| mit welchem Wert muss i loslaufen und bei welchem Wert muss i wieder stoppen? Nochmal im Detail, um was es geht: welche Zahlen sollen für i zum Vergleichen und ggfs. Tauschen verwendet werden, und zwar ganz konkret auf dein Beispiel mit den 4 Ziffern bezogen? |
die Werte, die man für i einsetzt, gefragt sind?! :nixweiss:
Bitte versuche mal zu erklären, an welcher Stelle genau dein Verständnisproblem steckt. Ich kann dir sonst nicht mehr helfen, sorry.
Auf den Code gehe ich mal besser nicht ein, das bringt im Augenblick nix, das ist Kraut und Rüben, mit Senf. :shock:
cu
Narses
boxer123 - So 23.10.11 12:11
mein hauptsächliches problem ist, ich weiß nicht was daran falsch ist.
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:
| var Form1: TForm1; i,j,zahl1,zahl2,differenz:integer; park,spielplatz,zahltext,zahltexteins,zahltextzwei:string; doppelt:boolean; a,b:array[1..4] of string;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin zahltext:=edit1.text; for i:=1 to 4 do begin a[i]:=copy(zahltext,i,1); b[i]:=copy(zahltext,i,1); end; for i:=1 to 3 do for j:=i+1 to 4 do if a[i]>=a[j] then begin park:=a[i];a[i]:=a[j];a[j]:=park; end; zahltexteins:=zahltext;for i:= 1 to 3 do for j:=i+1 to 4 do if b[i]<=b[j] then begin park:=b[i];b[i]:=b[j];b[j]:=park; end; zahltextzwei:=zahltext; differenz:=Strtoint(zahltexteins)-Strtoint(zahltextzwei);edit2.text:=(differenz);end; |
Narses - So 23.10.11 12:24
Moin!
boxer123 hat folgendes geschrieben : |
| mein hauptsächliches problem ist, ich weiß nicht was daran falsch ist. |
Nein, dein hauptsächliches Problem ist, dass du glaubst, du könntest ohne verstanden zu haben, was da passiert, Programmieren (lernen). :idea:
Wenn ich auf den letzten Code schon nicht eingegangen bin, weil sonnenklar ist, dass du nicht verstehst, was da passiert, was glaubst du, wird es bringen, noch mehr Code zu posten? Nichts, richtig geraten. :|
Dein "Problem" liegt viel tiefer, nicht im Code. Du musst es irgendwie schaffen, dich damit zu beschäftigen, was genau da passiert. Programmieren besteht nicht aus der Kunst, ein paar Wörter in irgendeiner künstlichen Sprache aneinander zu reihen, sondern daraus, Aufgaben oder besser komplexe Vorgänge in ganz kleine Schritte aufzudröseln. Daraus dann ein Programm zu formulieren, ist nicht viel schwerer, als einen deutschen Text in die englische Sprache zu übersetzen. :idea:
Wie sieht´s aus, hast du noch Lust oder Zeit, dich mit den Grundlagen der Programmierung zu beschäftigen, oder dauert dir das hier alles zu lange? Wenn du dich fragst, warum der blöde Kerl nicht einfach mal kurz den Fehler in meinem Programm beheben kann und die drei magischen Worte spricht, mit denen alles klar wird, dann fürchte ich, kann ich dir nicht mehr helfen.
Helfen kann ich dir nur, wenn du dich auf meine (oder irgend eines anderen Erklärenden) Beispiele/Aufgaben einlässt und endlich versuchst, die winzig kleinen Schritte nachzuvollziehen und Erkenntnisse zu sammeln und zu verbinden. Oder mir erklärst, was genau du nicht verstehst - ohne Code, der bringt an dieser Stelle nix.
cu
Narses
boxer123 - So 23.10.11 12:27
ich versuche doch schon alles, ich weiß wie das geht aber mein problem ist, dass in einem code zu wandeln. Das ist mein problem
Narses - So 23.10.11 12:36
Moin!
boxer123 hat folgendes geschrieben : |
| ich versuche doch schon alles, ich weiß wie das geht |
Ja, du bemühst dich, das will ich gar nicht bestreiten. :zustimm:
Aber du weißt leider nicht, wie es geht. Ist dir das wirklich immer noch nicht klar? Warum glaubst du, kannst du meine (Verständnis-)Fragen nicht beantworten?
boxer123 hat folgendes geschrieben : |
| aber mein problem ist, dass in einem code zu wandeln. Das ist mein problem |
Nein, leider nein. Glaub mir, ich habe da etwas Erfahrung, sowas zu beurteilen, das ist sicher nicht dein Problem. Programmieren ist wie gerade schon ausführlicher beschrieben, nicht das "Übersetzen in Programmcode", sondern das Verstehen und Aufdröseln von Problemen. Und du zeigst leider sehr deutlich, dass es genau da hakt.
Gut, machen wir es kurz: Es macht nur noch Sinn hier weiter zu machen, wenn du mir erklärst, was genau du an meiner letzten Frage (die Werte für i) nicht verstanden hast, damit wir zu der richtigen Antwort kommen. Dann sehen wir weiter.
cu
Narses
boxer123 - So 23.10.11 12:41
Hoffentlich ist es richtig,also wenn man
for i:=1 to 4 do
i ist = 1,2,3,4
nehmen wir an die Zahl
7 8 9 6
i 2 3 4
Narses - So 23.10.11 12:44
Moin!
Ich bin jetzt für 1-2 Stunden off und denke mal darüber nach, wie man dir erklären kann, was eine Schleife ist, dann sehen wir weiter... :gruebel: :les:
cu
Narses
Narses - So 23.10.11 16:17
OK, vielleicht hilft ja der Weg in umgekehrter Richtung. :gruebel: Schau´n wir mal. ;)
Betrachten wir den folgenden Programmcode:
Delphi-Quelltext
1: 2:
| for i := 1 to 3 do ShowMessage(IntToStr(i)); |
Was passiert, wenn man dieses "Programm" ausführt? Es wird drei mal hintereinander eine Dialogbox angezeigt, in der "1", "2" und "3" ausgegeben wird (kannst du ruhig mal am PC testen).
Wie müsste man das Programm schreiben, wenn der Computer ohne die for-Schleife auskommen soll, oder anders gesagt: was macht der Computer wirklich, wenn das Programm läuft?
Delphi-Quelltext
1: 2: 3:
| ShowMessage('1'); ShowMessage('2'); ShowMessage('3'); |
Das ist das gleiche Programm, aber ohne die for-Schleife. :les: :idea: Der Computer macht beim Ausführen des Programmes also drei mal das Gleiche, aber immer mit einem anderen Wert an der Stelle, an der im Code das "i" steht. Welche Werte für "i" genommen werden sollen, gibt man in der Zeile bei dem for mit an.
Zurück zu unserem Problem:
Delphi-Quelltext
1: 2:
| for i := 1 to 4 do if (zahl[i] > zahl[i+1]) then ShowMessage('tauschen'); |
Bitte mach mal das Gleiche wie ich oben im Beispiel und "entferne" die for-Schleife, also schreib das Programm so um, dass keine for-Schleife (oder eine andere Schleife) benutzt wird!
boxer123 - Di 25.10.11 19:06
Delphi-Quelltext
1: 2: 3: 4:
| if (zahl[1] > zahl[1+1]) then ShowMessage('tauschen'); if (zahl[2] > zahl[2+1]) then ShowMessage('tauschen'); if (zahl[3] > zahl[3+1]) then ShowMessage('tauschen'); if (zahl[4] > zahl[4+1]) then ShowMessage('tauschen'); |
Moderiert von
Christian S.: Doppelte Delphi-Tags entfernt
Narses - Di 25.10.11 21:43
Moin!
Sehr gut, genau so macht es der Computer auch! :zustimm: Jetzt besser verstanden, wie eine Schleife funktioniert?
Nächster Schritt, betrachten wir folgenden Programmcode:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var zahl: array[1..4] of Integer; i: Integer; begin zahl[1] := 4; zahl[2] := 9; zahl[3] := 5; zahl[4] := 6; for i := 1 to 4 do if (zahl[i] > zahl[i+1]) then ShowMessage('tauschen'); |
Ja, dieses Programm sortiert nix, das ist klar. :nixweiss: Aber es ist trotzdem noch ein echter Fehler drin. Allerdings ist das Programm selbst korrekt formuliert, der Compiler kann es ohne Fehler übersetzen und auch starten, trotzdem ist ein (logischer) Fehler drin, den der Computer so ohne weiteres nicht finden kann. Welcher? ;)
cu
Narses
boxer123 - Mi 26.10.11 19:31
ich glaube dem arrays wurden schon 1..4 zugewiesen, deshalbt kann man ejtzt nicht einfach sagen ich packe mal eine zahl rein
Narses - Mi 26.10.11 19:39
Moin!
boxer123 hat folgendes geschrieben : |
| ich glaube dem arrays wurden schon 1..4 zugewiesen, deshalbt kann man ejtzt nicht einfach sagen ich packe mal eine zahl rein |
Nein, das ist kein Problem, man kann die Array-Speicherplätze beliebig oft mit neuen/anderen Werten überschreiben (wie sollte man sonst Nachbarn vertauschen?).
OK, dann müssen wir wohl wieder die for-Schleife auflösen und einzelne Anweisungen daraus machen. Diesmal bitte direkt die Zahlen in den eckigen Klammern zusammenrechnen. :idea:
cu
Narses
boxer123 - Mi 26.10.11 19:44
Delphi-Quelltext
1: 2: 3: 4:
| if (zahl[1] > zahl[2]) then ShowMessage('tauschen'); if (zahl[2] > zahl[3]) then ShowMessage('tauschen'); if (zahl[3] > zahl[4]) then ShowMessage('tauschen'); if (zahl[4] > zahl[5]) then ShowMessage('tauschen'); |
so
Narses - Mi 26.10.11 19:50
Moin!
OK, danke, das ist korrekt aufgelöst. ;)
Jetzt schau dir mal genau die Befehle an, einer davon kann nicht ausgeführt werden, weil es da ein Problem gibt. In welcher Zeile ist das Problem und was genau wird nicht funktionieren bzw. warum?
cu
Narses
boxer123 - Mi 26.10.11 19:54
Delphi-Quelltext
1:
| if (zahl[4] > zahl[5]) then ShowMessage('tauschen'); |
hoffe es ist richtig
Martok - Mi 26.10.11 20:52
boxer123 hat folgendes geschrieben : |
| hoffe es ist richtig |
Falsche Einstellung: Wenn du es logisch begründen kannst, gibts nichts zu hoffen: dann ists nämlich richtig und du weißt das. Hoffen muss man nur, wenn man keine Ahnung hat und einfach rät :zwinker:
______ zurück zum Thema ________
Gut geraten :P
Und warum ist das so? Was passiert, wenn diese Zeile ausgeführt werden soll?
Darauf aufbauend: was muss man am ursprünglichen Code ändern, damit das nicht passiert (hier gibts im Prinzip 2 Antworten, die aber unterschiedliche Dinge tun)?
Narses hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var zahl: array[1..4] of Integer; i: Integer; begin zahl[1] := 4; zahl[2] := 9; zahl[3] := 5; zahl[4] := 6; for i := 1 to 4 do if (zahl[i] > zahl[i+1]) then ShowMessage('tauschen'); | |
boxer123 - Mi 26.10.11 20:56
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var zahl: array[1..4] of Integer; i: Integer; begin zahl[1] := 4; zahl[2] := 9; zahl[3] := 5; zahl[4] := 6; for i := 1 to 3 do if (zahl[i] > zahl[i+1]) then ShowMessage('tauschen') |
dieses mal hoffe ich es nicht, dieses mal weiß ich es
Martok - Mi 26.10.11 21:04
Ganz genau.
Wir dürfen nicht hinter dem letzten Element zugreifen. Das bedeutet, wenn wir irgendwo auf "das nächste Element" (also das "i+1"-te) zugreifen, müssen wir ein Element vorher anhalten.
Damit also kannst du auch die Sortierfrage beantworten:
Narses hat folgendes geschrieben : |
| So, jetzt die Preisfrage: mit welchem Wert muss i loslaufen und bei welchem Wert muss i wieder stoppen? Nochmal im Detail, um was es geht: welche Zahlen sollen für i zum Vergleichen und ggfs. Tauschen verwendet werden, und zwar ganz konkret auf dein Beispiel mit den 4 Ziffern bezogen? |
Da wir den Teil geklärt haben, die allgemeine Frage: wie müssen die Grenzen (also erstes und letztes Element) aussehen, wenn du eine allgemeine Liste hast?
Delphi-Quelltext
1:
| var Ziffer: array of Integer |
Hinweis: ein solches "Dynamisches Array" fängt bei 0 an, nicht bei 1 wie Narses oben. Seine Länge kann man mit der Funktion Length() erfahren.
boxer123 - Do 27.10.11 15:22
welche frage soll ich beantworten?
Teekeks - Do 27.10.11 17:44
Eventuell die wo ein Fragezeichen dahinter steht?
Tipp: Damit meine ich jetzt nicht die in diesem Beitrag!
Suche in dem Beitrag vor deinem.
Suche nach einem Zeichen welches so aussieht: ?
Folge dann den Zeichen so lange nach Links bis du auf eine hellere Box stößt.
Die Zeichen zwischen den beiden Stellen ergeben einen Satz in der Deutschen Sprache welche durch das bereits erwähnte ? zu einer Frage werden.
Ich hoffe dir geholfen zu haben.
Narses - Do 27.10.11 17:51
Moin!
boxer123 hat folgendes geschrieben : |
| welche frage soll ich beantworten? |
Diese hier:
Martok hat folgendes geschrieben : |
die allgemeine Frage: wie müssen die Grenzen (also erstes und letztes Element) aussehen, wenn du eine allgemeine Liste hast?
Delphi-Quelltext 1:
| var Ziffer: array of Integer |
Hinweis: ein solches "Dynamisches Array" fängt bei 0 an, nicht bei 1 wie Narses oben. Seine Länge kann man mit der Funktion Length() erfahren. |
Allerdings fürchte ich, werden dich die dynamischen Arrays evtl. gerade nicht weiter bringen. :?
Ich schlage deshalb vor, wir machen beim Tauschen weiter. :idea:
Wir haben diesen Quelltext:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var zahl: array[1..4] of Integer; i: Integer; begin zahl[1] := 4; zahl[2] := 9; zahl[3] := 5; zahl[4] := 6; for i := 1 to 3 do if (zahl[i] > zahl[i+1]) then ShowMessage('tauschen') |
Hier wird nur angedeutet, dass da ein Tausch passiert, aber die Elemente im Array werden nicht getauscht. Kannst du mal versuchen den Quelltext anzupassen, so dass statt der Hinweisausgabe wirklich vertauscht wird?
cu
Narses
boxer123 - Fr 28.10.11 19:20
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var zahl: array[1..4] of Integer; i: Integer; begin zahl[1] := 4; zahl[2] := 9; zahl[3] := 5; zahl[4] := 6; for i := 1 to 3 do if (zahl[i] > zahl[i+1]) then begin |
Narses - Fr 28.10.11 20:49
Moin!
Irgendwie ist mit deinem Posting was nicht in Ordnung, da scheint was verloren gegangen zu sein... ? :|
cu
Narses
bummi - Fr 28.10.11 21:32
@Narses
Hut ab vor soviel Geduld ...
Narses - Fr 28.10.11 22:01
bummi hat folgendes geschrieben : |
| Hut ab vor soviel Geduld ... |
Ich gebe zu, von den 2 Kilo bei Threadstart sind nur noch ein paar Gramm über... :?
glotzer - Fr 28.10.11 22:09
offtopic:
ich finds echt toll wie du dich hier abmühst
:D Hut ab!
boxer123 - Sa 29.10.11 08:20
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| var zahl: array[1..4] of Integer; i,park: Integer;
begin zahl[1] := 4; zahl[2] := 9; zahl[3] := 5; zahl[4] := 6; for i := 1 to 3 do if (zahl[i] > zahl[i+1]) then begin park := zahl[i]; zahl[i] := zahl[i + 1]; zahl[i + 1] := park;
end;
end. |
so?
bitte ist das richtig
bummi - Sa 29.10.11 08:59
Es fehlen zwei end's ansonsten ist es richtig...
Narses - Sa 29.10.11 09:25
Moin!
bummi hat folgendes geschrieben : |
| Es fehlen zwei end's ansonsten ist es richtig... |
Gemessen daran, was wir hier die ganze Zeit planen, "funktioniert" der Code zwar, aber es ist nicht "richtig" - denn es ist kein Bubble-Sort mehr. :idea: Und an die Einrückung hast du dich auch nicht gehalten (das ist kein überflüssiger Schnickschnack!). :nixweiss:
Ich hatte dich gebeten, erstmal nur das Tauschen umzusetzen:
Narses hat folgendes geschrieben : |
| Hier wird nur angedeutet, dass da ein Tausch passiert, aber die Elemente im Array werden nicht getauscht. Kannst du mal versuchen den Quelltext anzupassen, so dass statt der Hinweisausgabe wirklich vertauscht wird? |
Was hat da jetzt die zweite Schleife zu suchen?
Da du mal kurz und kommentarlos Bubble- gegen Min-Sort ausgetauscht hast, behaupte ich mal, dass du immer noch nicht verstanden hast, was da passiert. :|
Also was nun, so weiter machen oder versuchen zu verstehen? Wenn du beim Verstehen weiter machen willst, dann entferne bitte erstmal noch die j-Schleife wieder und korrigiere die Einrückung (nur ein Befehl pro Zeile).
cu
Narses
Martok - Sa 29.10.11 18:33
(Hint: er hat den Beitrag editiert. Hab das auch eben erst gemerkt :oops:)
Ja, genau, so passiert was! :zustimm:
Ordentlich formatiert würde das so aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var zahl: array[1..4] of Integer; i, park: Integer; begin zahl[1]:= 4; zahl[2]:= 9; zahl[3]:= 5; zahl[4]:= 6; for i:= 1 to 3 do if (zahl[i] > zahl[i + 1]) then begin park:= zahl[i]; zahl[i]:= zahl[i + 1]; zahl[i + 1]:= park; end; end; |
Da sieht man viel besser, welche Befehle auf einer "Ebene" liegen, und was z.B. der Block ist, der von der Schleife wiederholt ausgeführt wird.
Damit sind wir schon fast am Ziel. Für den Test-Datensatz passt das sogar, da kommt (4, 5, 6, 9) raus.
Was aber, wenn du das mit diesen Daten versuchst?
Delphi-Quelltext
1: 2: 3: 4:
| zahl[1]:= 5; zahl[2]:= 3; zahl[3]:= 9; zahl[4]:= 1; |
Was würde dann raus kommen, und was macht man dann bei Bubblesort, um dieses Problem zu beheben?
boxer123 - Sa 29.10.11 18:51
1359 die 2te frage habe ich nicht verstanden
Martok - Sa 29.10.11 19:14
1359
soll rauskommen, ja. Tuts aber nicht. Sonst wären wir ja auch schon fertig :zwinker:
Geh doch das einfach mal durch, was das Programm für jeden Wert von i tun wird:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| (der * ist zwischen den beiden Ziffern die verglichen werden)
Wert |1|2|3|4| << zahl[...] von +-+-+-+-+ i: | | | | | i=1 5*3 9 1 5>3, tauschen i=2 3 5*9 1 5<9, lassen i=3 3 5 9*1 9<1, tauschen Ergebnis: 3 5 1 9 |
Genau das ist die zweite Frage: warum kommt da nicht 1359 raus (okay, die hab ich grade selbst beantwortet...),
und was muss man machen, damit das richtige rauskommt?
boxer123 - Sa 29.10.11 19:35
vielleicht mit einer repeat schleife
Martok - Sa 29.10.11 19:57
Und was wird die dann tun?
Einfach nur irgendwelche Begriffe reinwerfen ist wenig hilfreich, ich würde schon gern sehen dass du ein Ziel vor Augen hast. Darum gehts ja beim Programmireren: die große Aufgabenstellung ("Ziffern sortieren") in kleine Stücke zerlegen und erst dann diese in Code übersetzen.
boxer123 - So 30.10.11 10:57
ich will ehrlich sein ich weiß es nicht
mandras - So 30.10.11 11:27
Ich geb mal einen kleinen Hinweis:
Das Ziel der Sortierung ist doch: Zahl [x] >= Zahl [x-1] für alle x im Bereich 2..4
Nach Durchlauf der "I"-Schleife befindet sich die größte Zahl am Ende der Liste, das heißt obige Anforderung gilt immerhin schon mal für Zahl[4], aber noch nicht für die Zahlen 1 bis 3.
Also sollte man die Sortierung nochmal anwenden auf die Zahlen 1 bis 3, danach gilt dann Zahl[3] >= Zahl2 und Zahl[3] >= Zahl 1. Also stimmt die Zahlen 3 und 4, 1 und 2 aber noch nicht.
Dann müssen also noch die Zahlen [1] und [2] sortiert werden
Daher kommt auch der Name "Bubble Sort": Die großen Zahlen "steigen auf wie Blasen" (was bei der hier gewählten Arbeitsweise aber nicht so anschaulich ist)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!