Entwickler-Ecke

Sonstiges (Delphi) - Zahl nach Ziffergröße ordnen, dann Differenz bilden


boxer123 - Do 20.10.11 13:40

Moderiert von user profile iconNarses: 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..4of 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!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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


Delete - Do 20.10.11 14:10

Warum ein dritter Thread?
http://www.delphi-forum.de/viewtopic.php?t=107427
http://www.delphipraxis.net/163840-programm-hilfe.html


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!

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
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:


user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
so gut oder?
Ja, schon besser, aber noch nicht "brauchbar". ;)

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
1.Schritt: Zahlen zerlegen mit copy
Das hast du ja schon im Code oben drin.

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconNarses: 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!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
Das war nicht Copy & Paste ehrlich.
:suspect: Hm, möglicherweise (sind ja ein paar Ungereimtheiten drin). :nixweiss:

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
Variablen.
user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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!

user profile iconHorschdware hat folgendes geschrieben Zum zitierten Posting springen:
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..4of 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; // wieso fehler
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..4of 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!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
Der ist mit zu komplitziert ich will einen den ich verstehe
user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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:


user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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
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?
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:

Quelltext
1:
2:
8 9 4 6
- -
Unterstreiche mal die Ziffern, die in einem Schritt verglichen werden, dann schreibst du darunter die neue Anordnung:

Quelltext
1:
2:
3:
8 9 4 6
- -
9 8 4 6
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:

Quelltext
1:
2:
8 1 9 4 6
- -
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!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
Wie jetzt quelltext anpassen?
Nein, ich meine diese Beschreibung hier: :idea:
user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconNarses: 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?^^


Narses - Do 20.10.11 18:25

Moin!

OK, also im Detail... :roll:
user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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.


Quelltext
1:
- -                    

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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.


Quelltext
1:
2:
-   -
-     -

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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.


Quelltext
1:
  - -                    

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
7.Schritt: Jetzt vergleicht man die 2.Zahl mit der 4.Zahl und wenn die 4.Zahl Größer ist, ändert man nix.


Quelltext
1:
  -   -                    

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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!


Quelltext
1:
    - -                    

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
So muss es doch sein?^^
Und nochmal die Zusammenfassung:

Quelltext
1:
2:
3:
4:
5:
6:
- -
-   -
-     -
  - -
  -   -
    - -
Sieht das so aus wie eins meiner Muster?

cu
Narses


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!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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: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!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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:
user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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 // wenn zahl[i] größer als zahl[j] ist dann soll er tauschen.


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+2then begin
if a[i+2] > a[i+3then begin
if a[i+3] > a[i+4then 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!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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. ;)

user profile iconTeekeks hat folgendes geschrieben Zum zitierten Posting springen:
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+2then begin
if a[i+2] > a[i+3then begin
if a[i+3] > a[i+4then 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:
user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconNarses: 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 + 1then 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... :?

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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:
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
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..4of string;

implementation

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);
begin
zahltext:=edit1.text;
for i:=1 to 4 do
begin
//zerlegung
a[i]:=copy(zahltext,i,1);
b[i]:=copy(zahltext,i,1);
end;
// absteigend sortieren
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;// was in zahltexteins steht in zahltext speichern
// aufsteigend sortieren
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);// differenz der beiden zahlen
edit2.text:=(differenz);// ausgabe
end;


Narses - So 23.10.11 12:24

Moin!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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?

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconChristian 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..4of 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!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
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)?
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  zahl: array[1..4of 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..4of 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:
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
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!

user profile iconboxer123 hat folgendes geschrieben Zum zitierten Posting springen:
welche frage soll ich beantworten?
Diese hier:
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
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..4of 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..4of 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

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
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..4of 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!

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
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:
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
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..4of 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)