Programm Erklärung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
littleman
User
Beiträge: 5
Registriert: Freitag 10. März 2017, 00:46

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=’->’)
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.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
littleman
User
Beiträge: 5
Registriert: Freitag 10. März 2017, 00:46

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="->")
Zuletzt geändert von Anonymous am Freitag 10. März 2017, 10:58, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@littleman: wenn Du das Programm mit Bleistift und Papier durchgehst, an welcher Stelle kommst Du dann nicht weiter? (PS: da fehlen immer noch Leerzeichen)
littleman
User
Beiträge: 5
Registriert: Freitag 10. März 2017, 00:46

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?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
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
littleman
User
Beiträge: 5
Registriert: Freitag 10. März 2017, 00:46

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.
Zuletzt geändert von Anonymous am Montag 13. März 2017, 15:56, insgesamt 1-mal geändert.
Grund: Unnötigen Fullquote entfernt
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.
Antworten