Ich finde den Fehler nicht (SageMath)

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.
Benutzeravatar
__blackjack__
User
Beiträge: 3371
Registriert: Samstag 2. Juni 2018, 10:21

Montag 15. April 2019, 17:30

@Sarah1111: Sorry, so funktioniert programmieren nicht. Du kannst nicht einfach wild herum raten bis es das macht was Du willst. Man kann natürlich nicht alles wissen und muss dann auch mal raten, aber dabei sollte man wissen was man da macht, was man erwartet. Und dann schauen wie das vom erwarteten abweicht. Um dann zu verstehen warum das falsch war was man da gemacht hat.

Zudem ist es wirklich wichtig, dass der Code den Du zeigst auch tatsächlich zum Traceback passt. Es macht wenig Sinn uns Tracebacks zu Code zu zeigen den wir nicht kennen, denn dann können auch wir nur raten was Du da tatsächlich gemacht hast.

Du musst Zeile für Zeile, Ausdruck für Ausdruck, Teilausdruck für Teilausdruck wissen was da jeweils passiert. Und wenn nicht das passiert was Du erwartest, dann musst Du dir das bis zu den Teilausdrücken genau anschauen um die Stelle zu finden, an der Deine Erwartungen vom tatsächlichen Wert oder Verhalten abweicht. Dazu kannst Du dann konktet die Frage stellen was Du nicht verstanden hast.

Bei dem gezeigten Quelltext wirst Du bereits in der zweiten Zeile einen `TypeError` bekommen – es sei denn Du verwendest noch Python 2, dann solltest Du das als erstes mal ändern, denn Python 2 wird ab Ende des Jahres nicht mehr gewartet und Python 3 ist schon recht lange da.

Du solltest wirklich mal einen Schritt von Deinem aktuellen Problem zurück treten und ein Grundlagentutorial durcharbeiten. In der Python-Dokumentation befindet sich eines.

Schon die erste Zeile vom gezeigten Quelltext macht wenig bis keinen Sinn. Du bindest den Wert `int` an den Namen `n`. Nun ist der `int`-Datentyp auch unter diesem Namen erreichbar. Du willst da aber keinen Wert binden der einen Datentyp repräsentiert, sondern eine Zahl. ``n = 42`` beispielsweise. Wenn die folgende Rechnung nicht mit einem festen Wert durchgeführt werden soll, dann musst Du eine Funktion definieren. Und die dann danach aufrufen. Das wird alles in einem Grundlagentutorial erklärt.
“I am Dyslexic of Borg, Your Ass will be Laminated” -- unknown
Sarah1111
User
Beiträge: 22
Registriert: Sonntag 14. April 2019, 14:21

Montag 15. April 2019, 17:36

Schon die erste Zeile vom gezeigten Quelltext macht wenig bis keinen Sinn. Du bindest den Wert `int` an den Namen `n`. Nun ist der `int`-Datentyp auch unter diesem Namen erreichbar. Du willst da aber keinen Wert binden der einen Datentyp repräsentiert, sondern eine Zahl. ``n = 42`` beispielsweise. Wenn die folgende Rechnung nicht mit einem festen Wert durchgeführt werden soll, dann musst Du eine Funktion definieren. Und die dann danach aufrufen. Das wird alles in einem Grundlagentutorial erklärt.
Also nehme ich doch eine Funktion wie zuvor?

Ich schaue schon in den Unterlagen von mir nach. Aber ich blätter mal durch die grundlagentutorials hier. Danke für den Tipp.

Eure/deine Tipps helfen mir trotzdem sehr viel weiter. Daher wäre es lieb, wenn ihr parallel trotzdem helfen könntet.
Sarah1111
User
Beiträge: 22
Registriert: Sonntag 14. April 2019, 14:21

Montag 15. April 2019, 17:52

Ok, ich habe leider wirklich nicht viel Ahnung vom Programmieren und da ich auch nicht viel programmieren werde, da ich nur diesen einen Kurs besuche, kann ich leider auch nur Python 2. Ich probiere so gut es geht, alles zu verstehen und zu machen. Und meistens ist es mehr probieren als wissen. Aber ich lerne aus den Sachen. Sowohl die, die hier erklärt werden, als auch in meinem Kurs parallel. Mich verwirrt das alles aber noch ein wenig und ich versuche Licht ins Dunkle zu bringen.


Zurück zur Aufgabe: Ich nutze also für den generellen Teil eine Funktion f(k) = k + (n-k) (wie zu Beginn?) und lasse diese dann laufen über die range der Primzahlen bis n, korrekt? Dann sind doch aber die Abbruchsbedingungen die selben, oder?
Sarah1111
User
Beiträge: 22
Registriert: Sonntag 14. April 2019, 14:21

Montag 15. April 2019, 18:21

Wenn ich jetzt also den allgemeinen Fall wieder betrachte, wäre für mich erstmal folgendes logisch:

Code: Alles auswählen

n=var('n') 
k=0
def f(k):
    k + (n-k)
    
if f(k) % 2:
    while k<n: 
        for k in range(n):
            if ((n-k).is_prime() and (k).is_prime()):
                print(n-k)
                print(k)
        else: k += 1   
else: print("ERROR")


würde das soweit erstmal Sinn ergeben? Oder sind da schon Fehler drin?
Sirius3
User
Beiträge: 9902
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 15. April 2019, 18:44

Die Funktion hat keinen Rückgabewert, und hätte sie einen, könnte man sie zu `n` vereinfachen, eine Variable, die aber gar nicht der Funktion übergeben wird.

Ich verstehe auch nicht was Du mit „allgemeinem Fall“ meinst, Du brauchst immer einen konkreten Wert, mit dem Du rechnen kannst.
Die while-Schleife, der else-Block, die Klammerung, das sieht alles noch nicht ganz richtig aus.
Sarah1111
User
Beiträge: 22
Registriert: Sonntag 14. April 2019, 14:21

Montag 15. April 2019, 18:49

Mit allgemeinen meine ich eher für einen bel. Wert der natürlichen Zahlen, den ich dann einsetzen könnte.
Das mit dem Rückgabewert verstehe ich ehrlich gesagt nicht... :(
Und was ist mit while, else und klammern gemeint? Falsche Bedingungen?
Benutzeravatar
__blackjack__
User
Beiträge: 3371
Registriert: Samstag 2. Juni 2018, 10:21

Montag 15. April 2019, 19:18

@Sarah1111: Arbeite doch mal ein Grundlagentutorial durch. Und ich meine wirklich durcharbeiten, nicht nur blättern oder lesen, sondern auch ausprobieren was Du da lernst und auch ein wenig damit herumspielen, Sachen verändern, um zu überprüfen ob Du es verstanden hast.

Das was Du da geschrieben hast, macht immer noch keinen Sinn. `n` zum Beispiel mit einem Wert zu initialisieren der eine Variable repräsentiert macht keinen Sinn.

Schreib auch nicht so viel Code. Das sind lauter Fehler drin, zu denen der Programmablauf gar nicht kommt, weil der schon durch den ersten Fehler gestoppt wird. Programme entwickelt man. Stück für Stück. Schreib etwas kurzes was Dich auf dem Weg zu Deinem Problem weiter bringt, und probiere das dann erst einmal aus, ob das macht was Du willst, und mach erst weiter wenn das bis dahin funktioniert. Zum Beispiel die Funktion `f()`. Die macht schon nicht das was sie soll. Probier die erst einmal aus und schreibe die richtig, bevor Du anfängst die in weiterem Code aufzurufen, denn wenn die schon nicht funktioniert, wird auch Code der die verwendet nicht funktionieren.
“I am Dyslexic of Borg, Your Ass will be Laminated” -- unknown
Antworten