nixverstehen
Goto Top

Python - Anfängerfrage

Hallo zusammen,

mein fünfzehnjähriger Sohn hat auf dem Gymnasium Informatik und lernt gerade Python. Bei einigen Sachen kam er nicht weiter und ich hab mich breitschlagen lassen, mir es mal anzusehen, obwohl ich nicht die geringste Ahnung von Programmieren habe. Aktuell hänge ich bei Aufgabe 7 von 30. Die Aufgabe lautet:

Berechne mit Hilfe einer For-Schleife die Summe aller Zahlen von 1 bis n. Vom Nutzer soll n hierbei eingegeben werden. Sollte n <= 1 sein, so soll ein Hinweis erscheinen und das Ergebnis berechnet werden

s = 0
n = int(input("Gib eine Zahl ein: "))  
for counter in range(1, n+1):
    s += counter
if n <= 1:
    print("Zahl ist gleich oder kleiner 1")  
print ("Die Summe aller Zahlen zwischen 1 und", n, "ist: ", s)  


Bei positiven Zahlen klappt es, bei negativen Zahlen erhalte ich immer 0. Hier stehe ich gerade auf dem Schlauch.

Btw...ich habe alle Aufgaben selbst erledigt und nichts von meinem Sohn kopiert.

LG NixVerstehen

Content-Key: 4297547703

Url: https://administrator.de/contentid/4297547703

Printed on: February 25, 2024 at 04:02 o'clock

Member: maretz
Solution maretz Oct 15, 2022 at 19:06:20 (UTC)
Goto Top
wenn ich es richtig sehe machst du ja ne schleife von 1 bis (eingegebene zahl). Wie soll das denn auch klappen wenn die eingegebene Zahl -1 ist -> der Counter wird ja nie ausgeführt. Damit wird er dir s natürlich nie hochzählen -> und er wirft 0 korrekterweise aus.

Es wäre ja sowas wie
for (int i = 1; i <= -1; i++) -> da i aber bereits beim ersten durchlauf grösser als -1 ist wird das nie ausgeführt.
Member: tikayevent
Solution tikayevent Oct 15, 2022 updated at 19:32:56 (UTC)
Goto Top
Du hast ja schon die Verzweigung drin, die den Hinweis anzeigt, also nutze diese.

Bei Zahlen größergleich 1 zählst du in der Schleife hoch von 1 bis zur eingegebenen Zahl, bei Zahlen kleiner 1 von der eingegebenen Zahl hoch bis 1. Also zwei Schleifen.

Eine Implementierung in Python kann ich dir aber nicht geben, da ich C# nutze.
Member: HansDampf06
Solution HansDampf06 Oct 15, 2022 at 23:34:40 (UTC)
Goto Top
Für die Lösung der Aufgabe musst Du nach meiner Auffassung zuerst die beiden völlig unterschiedlichen Aufgabenebenen fein säuberlich voneinander trennen und Dir dann in logischer Reihenfolge die Lösung erarbeiten.

Hierbei ist ganz offensichtlich, dass mit dem Programm eine (einfache) mathematische Aufgabe gelöst werden soll. Deswegen muss sich das Programm nach der Mathematik und ihren Regeln richten.

1. (Schritt) In mathematischer Hinsicht:
Die Aufgabe lautet, die Summe aller (natürlichen) Zahlen von 1 bis n zu bilden. Das impliziert zwingend, dass n > 1 sein muss, weil nur mit mehr als einer Zahl eine Summe gebildet werden kann (Summand plus Summand ist gleich Summe) und weil mathematisch stringent n für den Bereich der natürlichen Zahlen steht. Ist n <= 1, kann das Ergebnis auch nicht 0 (Null) sein. Vielmehr gibt es gar kein Ergebnis, weil es mangels der Erfüllung der Startbedingungen (n =/=1 und n > 1) gar kein (definiertes) Ergebnis geben kann.
[Zur Vollständigkeit: Für den Fall n=1 gilt die Summe = 1 (Was aber ein Teil der mathematischen Definition dieser Rechenaufgabe ist. Der Aufgabentext ist an dieser Stelle nicht ganz klar, was er für den Fall n=1 möchte.)]
Etwas anderes würde nur gelten, wenn mit Deiner konkreten Aufgabenstellung auch ein "Rückwärtssummieren" für die Zahlen n <= 0 gewollt sein würde sowie wenn n nicht als das übliche Kürzel für die natürlichen, sondern - eigentlich regelwidrig - anstelle des üblichen g für den Bereich der ganzen Zahlen verstanden werden soll. Das ist aber dem von Dir mitgeteilten Aufgabentext nicht ansatzweise zu entnehmen, so dass als gegeben hinzunehmen ist, dass das n regelkonform als Kürzel für den Bereich der natürlichen Zahlen steht.

2. (Schritt) In programmatischer Hinsicht:
Ausgangspunkt ist immer die mittels eines Programms zu lösende - hier mathematische - Aufgabe und deren (mathematischen) Lösungsvarianten. Ist n >(=) 1, dann gibt es (irgend)ein von n abhängiges, aber definitionsgemäß zulässiges Ergebnis. Für alle anderen eingegebenen n gibt es überhaupt kein definiertes Ergebnis, auch nicht 0 (Null). Hier darf der Initialisierungszustand/-wert der programmatischen Variable nicht mit dem Programmierziel und dessen mathematischen Regeln verwechselt werden - hier kann ich nämlich programmatisch Schabernack betreiben und wundere mich (mathematisch) über die Ergebnisse, die mir das Programm auswirft. Das sind zwei völlig verschiedene Paar Schuhe. Deswegen muss im Falle der Eingabe von Werten für n, die mathematisch zu einem undefinierten Ergebnis führen, zwingend eine entsprechende Fehlermeldung ausgeworfen werden.

Aus alldem leitet sich der programmatische Entwurf ab:

1. Eingabeaufforderung für einen Wert für n
2. Aus-/Bewertung des für n eingegebenen Wertes (if/else-Konstruktion oder case-Klausel)
a) n<(=)1 und alle anderen Fälle der Fehleingabe (z.B. Buchstaben, Sonderzeichen, gar kein Wert ...)
-> Ausgabe einer entsprechenden Fehlermeldung
-> gegebenenfalls vom Fehler abhängige Handlungsoptionen, u.a. Rücksprung zur Eingabe (z.B. mittels while-Klausel) oder Programmende oder ...
b) n>(=)1
-> Verzweigung in die For-Schleife für die Summenbildung
Soll seitens des Programms der mathematischen Definition der Aufgabe folgend auch für n=1 das Ergebnis 1 ausgeworfen werden, dann wird zur Variable für die Summe (Initialisierungswert gleich Null) in einem einzigen Schleifendurchlauf nur die 1 hinzuaddiert.
3. im Falle von 2.b) die Ausgabe des Ergebnisses
-> Hier könnte beispielsweise für den Fall n=1 die Ausgabe des Ergebnisses (= 1) dahin kommentiert werden, dass für n=1 die Summe definitionsgemäß immer auf 1 lautet, obschon nur eine Zahl/Summand gegeben ist.

In etwa so würde nach meinem Verständnis das geforderte Programm der zu lösenden mathematischen Aufgabe und deren mathematischer Definition hinreichend gerecht werden und zu einem brauchbaren Programmergebnis führen. Programmieren ist letztlich nur die Abstraktion/Portierung unserer "analogen" Welt in die digitale Welt. Deswegen müssen die Ergebnisse für ein und dieselbe zu lösende Aufgabe analog wie digital immer identisch sein. Wird das Programm dem nicht gerecht, ist es nur teilweise oder gar nicht brauchbar, und zwar trotz aller schöner Mühe. Was das für die Benotung (zwingend) bedeutet, ist offensichtlich.

Ich selbst habe bisher nicht in Python programmiert und kenne dessen konkrete Syntax nicht. Die benannten Klauseln/Konstruktionen finden sich jedoch in jeder mit Python vergleichbaren Programmiersprache (z.B. tcl, bash-script, visual basic, ...) in ähnlicher Weise, so dass Du Dir zu meinen vorstehenden Hinweisen ganz leicht selbst den konkreten Code erarbeiten kannst. Das erhöht zudem die Lernkurve, wenn nicht nur Vorgekautes anstrengungslos nachgekaut wird ... face-smile

Viele Grüße
HansDampf06
Member: NixVerstehen
NixVerstehen Oct 16, 2022 updated at 12:13:47 (UTC)
Goto Top
Vielen Dank an @HansDampf06, @tikayevent und @maretz für die sehr detaillierte Hilfestellung und das "Schubsen" in die richtige Richtung. Ich habe es jetzt wie folgt gelöst und es funktioniert:

s = 0
n = int(input("Gib eine ganze Zahl ein, die auch negativ sein darf: "))  
if n > 1:
    for counter in range(1, n+1):
        s += counter
    print ("Die Summe aller Zahlen von 1 bis", n, "ist: ", s)      
else:
    print("Zahl ist gleich oder kleiner 1")  
    for counter in range(n, 1+1):
        s += counter
    print ("Die Summe aller Zahlen von", n, "bis 1 ist:", s)  


Der Gedankengang war, richtigerweise die Verzweigung "if/else" zu nutzen. Zudem muss man sich "range"
genauer betrachten. "Range" wird wohl von Startwert bis Stopwert betrachtet, wobei der Startwert einbezogen wird, nicht aber der Stopwert. Also muss ja n der Startwert sein und 1 der Stopwert. Der Stopwert muss aber künstlich auf 2 erhöht werden, damit 1 als Stopwert einbezogen wird.

LG NixVerstehen
Member: aqui
aqui Oct 16, 2022 at 13:28:12 (UTC)
Goto Top
Ab 67500 sogar mit "L" im Ergebnis! face-wink
Member: HansDampf06
HansDampf06 Oct 16, 2022 at 22:13:05 (UTC)
Goto Top
Zitat von @aqui:

Ab 67500 sogar mit "L" im Ergebnis! face-wink

Bezüglich n=67500 oder s=67500?

Das könnte dem Problem des Zahlen-Definitionsbereichs zuzuschreiben sein. Daher müsste die betreffende Variable einem größeren Definitionsbereich (long, single, double, float ...) zugeordnet werden. Wie der passende größere Definitionsbereich bei Python heißt, weiß ich nicht. Aber die benannten Bezeichnungen sollten eine Hilfestellung geben können. Mit Sicherheit kann Python auch sehr große Zahlen darstellen und verarbeiten.
Mitglied: 137960
137960 Oct 17, 2022 at 06:23:56 (UTC)
Goto Top
Wahrscheinlich hätte ich die Informatiklehrenden genervt. Denn die Anforderungen sind viel zu ungenau.
Mit 15 am Gumminasium hat man in Mathe mit Sicherheit schon sowas wie "ganze Zahlen", "reelle Zahlen", etc. durchgekaut.
Und in Informatik sollte auf dem Lehrplan sowas wie "Zahlenbereiche", "Integerarithmetik" oder "Registerbreite" vorgekommen sein. Die Lehrkräfte hätten zumindest Hinweise geben können, welche Zahlenbereiche Python an sich verarbeiten kann. Dann hätten die Schüler schon zumindest eine Idee, welche Eingabewerte vorkommen und was rauskommen kann. I.d.R. wird Informatik in der Sekundarstufe I von Mathelehrkräften gegeben - die sollten (in der Theorie face-wink) wissen, dass es unterschiedliche Zahlenmengen gibt.

Die Aufgabe sagt ja nur, "Zahlen von 1 bis n". n ist unendlich - aber da steht nichts von Ganzzahlen.
Wer den Streber raushängen lassen will, müsste aus der Aufgabe mindestens eine Grenzwertberechnung machen, wo 1 GEGEN n tendiert. Das Ergebnis findet sich dann in der Unendlichkeit und viel weiter.... face-wink

Wer jetzt motzen möchte, weil mein Hinweis zu off topic sein:
Ich mache schon seit Jahrzehnten in der Informatik rum und es gibt zwei große Übel bei der Entwicklung: miese Anforderungen und fehlende Tests. Wer Informatik lehrt, sollte die Anforderungen schon genauer definieren können. Da es keine genauen Anforderungen gibt, ist das Ergebnis auch nicht eindeutig testbar.
Wie die Schüler sowas lösenund auf "irgendwelche" Ergebnisse kommen, ist eine Sache - aber man sollte in der Informatik schon etwas genauer sein. Oder das Fach in "Scriptkiddies Work" umtaufen.
Member: tagol01
tagol01 Oct 17, 2022 at 07:35:34 (UTC)
Goto Top
Hallo Nixverstehen,

Frage ist ja schon geklärt.

Nur noch zu Info: Es gibt sehr viele Spielsachen auf dem Markt, wo Kinder und Jugendliche spielerisch Python lernen.

Z.b.: von Lego Mindstrom oder der Sphero Roboter
siehe: https://kinderprogrammieren.de/spielsachen/roboter/lego-mindstorms-robot ...

Evtl. Ist das was für dein Sohn.
Member: maretz
maretz Oct 17, 2022 at 16:11:32 (UTC)
Goto Top
Zitat von @137960:

Wahrscheinlich hätte ich die Informatiklehrenden genervt. Denn die Anforderungen sind viel zu ungenau.
Mit 15 am Gumminasium hat man in Mathe mit Sicherheit schon sowas wie "ganze Zahlen", "reelle Zahlen", etc. durchgekaut.
Und in Informatik sollte auf dem Lehrplan sowas wie "Zahlenbereiche", "Integerarithmetik" oder "Registerbreite" vorgekommen sein. Die Lehrkräfte hätten zumindest Hinweise geben können, welche Zahlenbereiche Python an sich verarbeiten kann. Dann hätten die Schüler schon zumindest eine Idee, welche Eingabewerte vorkommen und was rauskommen kann. I.d.R. wird Informatik in der Sekundarstufe I von Mathelehrkräften gegeben - die sollten (in der Theorie face-wink) wissen, dass es unterschiedliche Zahlenmengen gibt.

Die Aufgabe sagt ja nur, "Zahlen von 1 bis n". n ist unendlich - aber da steht nichts von Ganzzahlen.
Wer den Streber raushängen lassen will, müsste aus der Aufgabe mindestens eine Grenzwertberechnung machen, wo 1 GEGEN n tendiert. Das Ergebnis findet sich dann in der Unendlichkeit und viel weiter.... face-wink

Wer jetzt motzen möchte, weil mein Hinweis zu off topic sein:
Ich mache schon seit Jahrzehnten in der Informatik rum und es gibt zwei große Übel bei der Entwicklung: miese Anforderungen und fehlende Tests. Wer Informatik lehrt, sollte die Anforderungen schon genauer definieren können. Da es keine genauen Anforderungen gibt, ist das Ergebnis auch nicht eindeutig testbar.
Wie die Schüler sowas lösenund auf "irgendwelche" Ergebnisse kommen, ist eine Sache - aber man sollte in der Informatik schon etwas genauer sein. Oder das Fach in "Scriptkiddies Work" umtaufen.

Klasse - und du meinst man gibt nen Schüler dann mal eben nen Anforderungsheft über x Seiten mit? Für eine simple Hausaufgabe? Wenn DAS dein ernst ist würde ich sagen du bist zuviel in der Theorie unterwegs...
Ganz davon ab das du dann auch noch div. Fehler behandeln musst - zB. Eingabe von Buchstaben (damit das Prog nich einfach absemmelt), "null"-werte,...

Wenn du schon so lange in der SW-Entwicklung arbeitest sollte dir auch bekannt sein das eh kein (nicht-triviales) Programm fehlerfrei ist. Weiterhin müsste man dann ja - um es formal richtig zu machen - ne komplette Entwicklung machen, ink. Pflichtenheft usw.. Na klar macht man das für ne Hausaufgabe... Die schüler wirds freuen - weil die VORBEREITUNG für die Hausaufgabe die zur Erfüllung (wenn man die Sprache kennt) ggf. 15 min dauert is das halbe Jahr dann weg... DAS schafft bei den Kids sowohl Motivation als auch wirkliche Wissensvermittlung (da die ja mit sicherheit aus dem Kurs direkt als SW-Entwickler anfangen sollen - und nicht nur grob mal sehen sollen wie sowas grundlegend funktioniert).
Mitglied: 137960
137960 Oct 18, 2022 at 07:00:45 (UTC)
Goto Top
Die Anforderungen sollten schon genau formuliert sein. Es brauchen auch keine "x Seiten" sein. Ich würde nur etwas mehr Sorgfalt bei der Aufgabenerstellung erwarten. Perfektion ist nicht notwendig.

Vielleicht gehört's auch zum pädagogischen Konzept, dass man als Lehrer gucken will, WIE die Schüler sowas lösen (sprich: dass so ein Programm hinterher funktioniert, ist Nebensache). Alles Vermutungen.

Um "einfach mal so" etwas von den Schülern herstellen zu lassen, sollte vielleicht besser Scratch benutzt werden.
Member: HansDampf06
HansDampf06 Oct 21, 2022 at 16:08:53 (UTC)
Goto Top
In einer wesentlichen Hinsicht hat @137960 schon recht: Heutzutage sinkt das Niveau allerorten und stetig. Das kommt dann auch irgendwann bei einer halbgaren Aufgabenstellung an. Denn in jedem Fall kann vom Aufgabensteller - erst recht bei einer solchen Simple-Aufgabe - erwartet werden, dass er die Aufgabe hinreichend präzise formuliert.

Im vorliegenden Fall habe ich erhebliche Zweifel an dem "hinreichend", wie sich aus meinen vorstehenden Kommentaren wegen der offensichtlichen Unklarheiten in der Aufgabenstellung entnehmen lässt. Diese Unklarheiten nähren die Vermutung, dass sich der Aufgabensteller selbst nicht ganz über die programmatisch umzusetzende mathematische Standardaufgabe sowie über das Wechselverhältnis zwischen der zu lösenden mathematischen Aufgabe und deren programmatische Umsetzung im klaren ist. Denn wer den Buchstaben n kommentarlos verwendet, muss wissen, dass ein objektiver Dritter (= derjenige mit normalen mathematischen Grundkenntnissen) diesen Buchstaben als Stellvertreter für die Gesamtheit aller natürlichen Zahlen (1 bis unendlich; ausschließlich positive ganze Zahlen) verstehen wird (und muss), und zwar ausschließlich. Negative (ganze) Zahlen (erst recht rationale, reelle Zahlen etc.) sind damit per se außen vor und Diskussionen in solche Richtung obsolet; die Null ist eh ein Sonderfall.
Was ich damit sagen will: Wir sprechen hier von einer echten Simple-Aufgabe. Da kann ohne weiteres erwartet werden, dass so etwas keine relevanten Fragen offen lässt. Immerhin sollen die Schüler in Bezug auf Programmierung etwas Grundlegendes mit einer solchen Simple-Aufgabe lernen. Aber wenn es schon an der Aufgabenstellung hapert, wie soll dann bei den Schülern Motivation, Interesse, Begeisterung etc. geweckt werden? Vielmehr provozieren halbgare Aufgabenstellungen Frust. Ein pädagogischer Fachmann mag noch weitere negative Probleme adressieren können ...

Das alles gilt erst recht und noch viel mehr, wenn der Aufgabensteller ein Mathematiklehrer oder eine sonstige mathematisch überdurchschnittlich bewanderte Person sein sollte. Denn dann wären die Unklarheiten für diesen von der Tendenz her ein Armutszeugnis. Oder: eben ein Paradebeispiel für sinkendes Niveau.

Und wer schon bei der Formulierung einer solchen Simple-Aufgabe Defizite zeigt, wie sehen dann erst anspruchsvolle Aufgabenstellungen aus? In will es lieber nicht wissen wollen! Über etwaige Pflichten-/Lasten- oder sonstige Hefte will ich dann erst gar nicht nachdenken.

Viele Grüße
HansDampf06
Member: gulshan212
gulshan212 Sep 06, 2023 at 11:32:52 (UTC)
Goto Top
There is some minor problem with your code.
Lets try this code, hope it will fix your error.

s = 0
n = int(input("Gib eine Zahl ein: "))    

if n <= 1:
    print("Zahl ist gleich oder kleiner 1")  
else:
    for counter in range(1, n + 1):
        s += counter

print("Die Summe aller Zahlen zwischen 1 und", n, "ist:", s)  

Thanks
Member: HansDampf06
HansDampf06 Sep 06, 2023 at 19:33:58 (UTC)
Goto Top
@gulshan212:

Die zweite print-Anweisung muss so in die Programmfolge eingereiht werden, dass sie ausschließlich ein Teil der Befehlsfolgen der else-Fälle ist. Andernfalls wird sie auch für die if-Fälle angesprochen, was meiner Meinung nach (s.o.) mindestens in mathematischer Hinsicht falsch ist: Für alle n, die außerhalb des mathematischen Definitionsbereiches liegen, gibt es kein Summenergebnis und somit auch kein s=0! Ein Ergebnis ist dann schlicht nicht defniert! Wird dennoch s=0 ausgegeben, ist das mathematischer Unsinn. Ein Programm, das Unsinn als Ergebnis für eine zu lösende mathematische Aufgabe ausgibt, ist unbrauchbar!

Deswegen erscheint mir, dass die zweite print-Anweisung wie die for-Anweisung eingerückt sein müsste und dass zudem keine Leerzeile zum for-Konstrukt verhanden sein dürfte. Andernfalls spricht einiges dafür, dass die zweite print-Anweisung nicht im if-else-Konstrukt gebunden ist (vgl. if-Bedingung in Python). Ohne diese Bindung im if-else-Konstrukt führt die Ausgabe der zweiten print-Anweisung mit s=0 in den if-Fällen zwingend zu mathematischem Unsinn als Ergebnis. Die erste print-Anweidung kann daran sachlich / mathematisch nichts ändern.

Unter dieser Maßgabe scheint es, dass die gestellte Programmieraufgabe im Übrigen richtig gelöst wird. Je nach Python-Version - wohl ab 3 und aufwärts - soll wohl Python bei Ganzzahlen den richtigen Definitionsbereich für Variablen selbst wählen, so dass es keiner besonderen Definition bedarf. Sollte das zutreffend sein, sollten n > 67500 und/oder s > 67500 keine Bereichsüberschreitungen ausgeben.

Viele Grüße
HansDampf06

PS: Übrigens - wer außerhalb der Programmieraufgabe die Summe aller (natürlichen) Zahlen von 1 bis n berechnen will, greift auf die Standardsummenformel n(n+1)/2 zurück, um die mathematische Aufgabe adäquat zu lösen. Denn bei sehr großen n erfordert die iterative Summenberechnung per for-Schleife doch eine gewisse zeitliche Geduld und wäre so eigentlich unbrauchbar. Mit der Standardsummenformel ist der Zeitbedarf hingegen für alle n nahezu immer identisch.