Autor Beitrag
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
boxer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68
Erhaltene Danke: 2



BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
boxer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68
Erhaltene Danke: 2



BeitragVerfasst: So 23.10.11 12:11 
mein hauptsächliches problem ist, ich weiß nicht was daran falsch ist.

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.

Für diesen Beitrag haben gedankt: Boldar, Christian S., Horschdware
boxer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68
Erhaltene Danke: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
boxer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68
Erhaltene Danke: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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:
ausblenden 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?
ausblenden 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:
ausblenden 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!

_________________
There are 10 types of people - those who understand binary and those who don´t.
boxer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68
Erhaltene Danke: 2



BeitragVerfasst: Di 25.10.11 19:06 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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:
ausblenden 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
boxer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68
Erhaltene Danke: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
boxer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68
Erhaltene Danke: 2



BeitragVerfasst: Mi 26.10.11 19:44 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
boxer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68
Erhaltene Danke: 2



BeitragVerfasst: Mi 26.10.11 19:54 
ausblenden Delphi-Quelltext
1:
if (zahl[4] > zahl[5]) then ShowMessage('tauschen');					


hoffe es ist richtig
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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:
ausblenden 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');

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
boxer123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 68
Erhaltene Danke: 2



BeitragVerfasst: Mi 26.10.11 20:56 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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?

ausblenden 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.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."