Hallo,
1980 habe ich in meinem Ingenieurstudium mit Pascal begonnen, da gab es
auch Goto, aber das war streng verboten und das ist richtig so.
Natürlich muss ich in Assembler Sprünge programmieren können, aber MMA
hat wohl andere Eigenheiten (@@ /@ etc.), die geeigneter sind hier
erwähnt zu werden. Ein Computer ist eine Maschine, mit der man alle
anderen Maschinen simulieren kann, also auch eine Basicmaschine. MMA ist
natürlich bestens geeignet, sich in diese Simulationsmaschinen
einzureihen, das hat Herr Mäder mit der Prologmaschine gezeigt. Aber
Goto und Label ist nach meiner Meinung doch ein sehr fragwürdiges
Konstrukt. Tatsächlich wurde Goto mit dem Beitrag von Herrn Sperber in
diesem Forum zum ersten mal erwähnt! Wahrscheinlich kommt man also sehr
gut ohne aus....
Zum Aufräumen eignet sich vielleicht Return[AufräumenTeil1;
AufräumenTeil2] besser.
Sonst hat Jens-Peer fast immer Recht.
Gruß
Peter
Jens-Peer Kuska wrote:
Hallo,
Peter hat
a) recht das es schon schön wäre t einen numerischen
Wert zuzuweisen.
z. B. sollte
Subdivide[lst_] := Drop[
Flatten[
Transpose[{lst, Append[0.5*Plus @@@ Partition[lst, 2, 1], 1]}]], -1]
Subdivide[lst_, n_] := Nest[Subdivide, lst, n]
y = {0, 1}; Label[begin]; y = Subdivide[y]; If[y[[2]] > 0.01,
Goto[begin], y]
recht gut funktionieren.
b) unrecht wenn er etwas gegen Goto[] hat. Goto[] kann eine Funktion
sogar übersichtlicher und weniger fehleranfällig machen. Das
klassische Beispiel dafür ist das Abbrechen einer Funktion, die erst
einmal allerhand Dinge initialisiert die beim Ende der Funktion wieder
aufgeräumt werden sollen also z. B
SomeFunction[x_]:=Module[{y},
y=x;
a=Table[y^2,{Length[y]}];
b=Sqrt[y];
If[y[[1]]>2,Goto[exit]];
If[a[[3]]>4,Goto[exit]];
If[b[[4]]>5,Goto[exit]];
Label[exit];
a={}; b={};
]
Natürlich kann man auch jedes mal
SomeFunction[x_]:=Module[{y},
y=x;
a=Table[y^2,{Length[y]}];
b=Sqrt[y];
If[y[[1]]>2,a={}; b={};Return[]];
If[a[[3]]>4,a={}; b={};Return[]];
If[b[[4]]>5,a={}; b={};Return[]];
a={}; b={};
]
schreiben aber das ist sicher nicht die beste Lösung. Ähnlich wäre es,
wenn man die eine Datei schreibt, die (egal was passiert) am Ende
geschlossen werden muß. Natürlich kann man auch hier auch eine lokale
Funktion machen, aber eigentlich ist an einem solchen Goto[] nichts
auszusetzen.
... und eigentlich erwarte ich, das Goto's noch an deutschen
Hochschulen gelehrt werden. Zum einen, weil die meisten
Maschinensprachen ein Goto brauchen -- und Assembler sollte ein
Informatiker schon können, wenigstens ein bischen. Zum anderen, weil
es Millionen von Zeilen FORTRAN Code gibt den keiner neu schreiben
will, der immer noch benutzt wird und den man auch lesen können
sollte. Kann es schöneres geben als ein Berechnetes GOTO ? eigentlich
nicht -- oder ?
... und ich nehme Mathematica auch gern um einen Algorithmus
auszuprobieren, den ich dann in einem C-Programm oder FORTRAN Programm
brauche. In so einem Fall werde ich keine Map[]s, Apply[]s oder sonst
was benutzen, sonder ordentliche For[], Do[] oder auch Goto[]s. Damit
beim Übertragen in C oder FROTRAN nicht so viel schief gehen kann.
Gruß
Jens
----- Original Message ----- From: "klamser" <klamser@XXXXXXX.de>
To: "Christian M. Sperber" <sperber.christian@XXXXXXX.de>
Cc: <demug@XXXXXXX.ch>
Sent: Sunday, April 24, 2005 11:58 PM
Subject: Re: iteration
Hallo Herr Sperber ,
au weia, eine wirklich vollständige Implementation einer
Programmiersprache kennt auch Label und Goto. Sogar seit der Version
1 (sagt zumindest das Hilfesystem).
Also: Das Problem hier ist, dass y3=t gesetzt werden soll, t aber
nicht bekannt ist. Also sollte man vorher t einen Wert zuweisen. Und
dazwischen erneut, sonst läuft das ewig..... Das geht übrigens in
Basic genau so.
Also zum Zweiten: Man kann sich natürlich in die Analen von
Mathematica.ch eintragen, indem wie vor 30 Jahren programmiert wird
und Label und Goto nutzt. Ich weiß nicht, wo einem so etwas heute
noch beigebracht wird, ich hoffe nur, dass so etwas nicht an einer
deutschen Hochschule passiert (wahrscheinlich ist das dann keine
Eliteuni). Da nicht zu erkennen ist, was der Algorithmus erreichen
soll, mach es wenig Sinn diesen hier zu verbessern, denn irgendwann
müsste ja t ein Wert zugewiesen werden. Ich kann nicht erraten
welcher, aber es geht garantiert ohne Goto und Label viel besser.
Wahrscheinlich sollte der Algorithmus besser in ein Modul eingebaut
werden. Näheres hierzu ist im Hilfesystem von MMA zu finden.
Schöner Gruß
Peter Klamser
Christian M. Sperber wrote:
ich versuche in einer Label[beginn];.......;If[test,Goto[begin]]
Schleife. einen Wert gegen den in der naechsten Runde berechneten zu
vergleichen. Ich bekomme es aber nicht hin diesen zu definieren.
Mathematica akzeptiert das nicht. Damit es klarer wird habe ich ein
notebook angehaengt.
In der ersten Berechnung laeuft die Anzahl der Durchgaenge ueber
eine Variable q. In der zweiten Berechung habe ich es einfach so
aufgeschrieben wie ich es gerne haette funktioniert aber nicht.