Seite 1 von 1
Programm Erklärung
Verfasst: Freitag 10. März 2017, 00:49
von littleman
Was macht das Program?
Das Ergebnis ist 6-3-4-5-6
Aber ich komme nicht drauf. Kann es mir jemand schrittweise erklären?
wenn ich nach def f(y)
mit print y ausgebe, bekomme ich da eine 2. warum?
Danke
Code: Alles auswählen
x,y=8,4
def f(y):
global x
x=y
return x * 3
def g(y):
global x
if x >= 5:
return f(x // 3)
else:
y += 4
return x-y
foriinrange(5):
print(g(i), end=’->’)
Re: Programm Erklärung
Verfasst: Freitag 10. März 2017, 01:57
von BlackJack
@littleman: Das Programm macht gar nichts, weil es kein gültiges Python ist steigt der Compiler mit ``IndentationError: expected an indented block`` aus. Vielleicht mag ja jemand anders die Einrückung raten, aber es wäre einfacher wenn Du einen lauffähigen Quelltext zeigen würdest.
Re: Programm Erklärung
Verfasst: Freitag 10. März 2017, 08:34
von Sirius3
@littleman: Da das Programm "global" benutzt, ist es mühselig herauszufinden, was das Programm macht. Hier könnte man wahrscheinlich noch jeden einzelnen Schritt per Hand durchgehen. Bei etwas komplizierteren Programmen ist es aber quasi unmöglich, herauszufinden, was eine Funktion macht, wenn gleichzeitig irgendwo anders per "global" sich Werte ändern.
Re: Programm Erklärung
Verfasst: Freitag 10. März 2017, 09:19
von littleman
Habe es jetzt nochmal angepasst.
littleman hat geschrieben:
Code: Alles auswählen
x,y=8,4
def f(y):
global x
x=y
return x * 3
def g(y):
global x
if x >= 5:
return f(x // 3)
else:
y += 4
return x-y
for i inrange(5):
print(g(i), end="->")
Re: Programm Erklärung
Verfasst: Freitag 10. März 2017, 09:49
von Sirius3
@littleman: wenn Du das Programm mit Bleistift und Papier durchgehst, an welcher Stelle kommst Du dann nicht weiter? (PS: da fehlen immer noch Leerzeichen)
Re: Programm Erklärung
Verfasst: Freitag 10. März 2017, 11:04
von littleman
Wenn ich das so ausgebe:
x,y=8,4
retunr (x)
retunr (y)
def f(y):
retunr (x)
retunr (y)
bekomme ich diese Ausgabe
8
4
8
2
Warum bekomme ich eine 2?
Re: Programm Erklärung
Verfasst: Freitag 10. März 2017, 11:13
von Sirius3
@littleman: was meinst Du mit "so ausgebe"? Ich bekomme da gar nichts, weil ich nicht verstehe, was Du da versuchst. Wenn Du Dein Programm durchgehst, welche Funktion mit welchen Parametern wird als erstes aufgerufen?
Re: Programm Erklärung
Verfasst: Freitag 10. März 2017, 12:00
von BlackJack
@littleman: Vielleicht sollte man das Programm erst einmal vereinfachen bevor man versucht es nachzuvollziehen.
`y` auf Modulebene kann weg, das wird nirgends verwendet.
Das ``global`` aus `g()` kann weg, denn `x` wird in der Funktion nichts zugewiesen.
``y += 4`` ist als unnötiger Einzelschritt formuliert, das kann man direkt in den Ausdruck bei ``return`` integrieren. Dann lässt sich `g()` auch als Einzeiler schreiben.
Und wenn man schon unsauber mit globalen Variablen hantiert, sollte man für globale und lokale Namen besser nicht auch noch gleich Namen verwenden um das alles noch verwirrender zu machen, also würde ich die lokalen Namen nicht `y` nennen. (Obwohl es ja gar kein globales `y` gibt, wie ich ganz am Anfang schon angemerkt hatte.)
Bei der Ausgabe musste ich übrigens zweimal hinschauen um zu merken dass negative Zahlen ausgegeben werden, weil das '-' in den '-'-Zeichen von den Pfeilen ('->') ”untergeht”. Ich lande dann bei so etwas:
Code: Alles auswählen
x = 8
def f(a):
global x
x = a
return x * 3
def g(a):
return f(x // 3) if x >= 5 else x - a - 4
for i in range(5):
print(g(i), end=' ')
print()
Und weil Unübersichtlich so einen Heidenspass macht, hier das Programm in BASIC für den C64, wo alles global ist:
[codebox=locobasic file=Unbenannt.txt] 10 X=8:FOR I=0 TO 4:GY=I:GOSUB 100:PRINT GR;:NEXT:PRINT:END
100 IF X>=5 THEN FY=INT(X/3):GOSUB 200:GR=FR:RETURN
110 GR=X-GY-4:RETURN
200 X=FY:FR=X*3:RETURN[/code]
Edit: Wobei man das auf dem C64 natürlich versuchen würde kürzer zu schreiben, ohne die Unterprogrammaufrufe:
Code: Alles auswählen
10 X=8:FOR I=4 TO 8:IF X<5 THEN R=X-I:GOTO 30
20 X=INT(X/3):R=X*3
30 PRINT R;:NEXT:PRINT
Re: Programm Erklärung
Verfasst: Montag 13. März 2017, 15:16
von littleman
Das ist eine Klausur für die Uni.
Deswegen ändert sich da nicht, sondern die Aufgabenstellung heißt:
Welche Ausgabe liefert die print-Anweisung in Zeile 16?
Lösung ist= 1 6->-3->-4->-5->-6->
Ich habe den Code abgetippt und ausgeführt. Die Ausgabe stimmt auch, aber ich habe nach jedem Schritt mir die Variable X ausgegeben. Nach dem
x, y = 8, 4
def f(y):
global x
print x=2
_____
Warum ist Print x eine zwei, obwohl oben X= 4 definiert ist.
Re: Programm Erklärung
Verfasst: Montag 13. März 2017, 15:48
von BlackJack
@littleman: Deine Beschreibungen machen keinen Sinn, die kann hier keiner nachvollziehen. Was soll ``print x=2`` bedeuten? Das ist in Python ein Syntaxfehler. Zudem zeigst Du statischen Code und sagst was dynamisch ausgegeben wird, aber in keinem (für mich) nachvollziehbaren Zusammenhang.
Bei ``x, y = 8, 4`` wird `x` zumindest mal nicht mit 4 sondern mit 8 initialisiert. Die 4 spielt in dem Programm überhaupt keine Rolle weil die nirgends benutzt wird, weil das globale `y` überhaupt nicht verwendet wird. Und das globale `x` verändert sich im Laufe des Programms, das bleibt nicht die ganze Zeit auf dem gleichen Wert.