Seite 1 von 1

10 Fehler im Code (Aufgabe)

Verfasst: Montag 11. Juli 2022, 23:37
von Lucas194lk
Hallo zusammen,
Ich hab eine Aufgabe zum Thema Fehlersuche, leider hab ich keine Lösungen dazu.
Könnte mir jemand dabei helfen insgesamt 10 Fehler zu finden (inkl. Verbesserung?)
Vielen Dank schonmal! ;)

Bild

Hier der Link zum Screenshot der Aufgabe

Re: 10 Fehler im Code (Aufgabe)

Verfasst: Dienstag 12. Juli 2022, 07:11
von __deets__
Profi-Tipp: Programm abtippen & den Python-Interpreter die Fehlersuche machen lassen. Und korrigieren.

Re: 10 Fehler im Code (Aufgabe)

Verfasst: Dienstag 12. Juli 2022, 07:19
von Sirius3
Wir machen hier keine Hausaufgabe.
Wenn Du irgendwo konkret Probleme hast, dann stelle dazu eine Frage.
Dann auch nicht Code als Bild hier reinstellen, sondern als Text in Code-Tags.
Beim ersten halben Duzend Fehlern hilft Dir der Compiler.

Neben den offensichtlichen Fehlern, gibt es etliche, die wohl nicht in der Aufgabe gemeint sind: beim öffnen einer Text-Datei sollte immer das Encoding mit angegeben werden, Dateien öffnet man innerhalb eines with-Statements. `lines` ist der falsche Name für die Anzahl Zeilen. `x` ist ein schlechter Name für eine Zeile. Wenn man angst hat, dass eine Datei zu groß sein könnte, dann sollte man auch nach 11 Zeilen abbrechen.
Selbst die Anzahl Zeilen zu zählen ist überflüssig, weil das ja schon die Liste selbst über ihre Länge tut.
Ein ordentliches Programm ist in Funktionen organisiert, hier also mindestens eine zum Anlegen der Datei und eine für das Lesen und Ausgeben.

Re: 10 Fehler im Code (Aufgabe)

Verfasst: Dienstag 12. Juli 2022, 07:27
von noisefloor
Hallo,
leider hab ich keine Lösungen dazu.
Heißt das, dass du keinen einzigen Fehler siehst? Einige sind schon sehr offensichtlich. Wenn du wirklich keine Fehler siehst -> Grundlagentutorial auf docs.python.org durcharbeiten.

Ansonsten hätte ich auch die gleiche Frage wir von Sirius3 auch gestellt: Fehler = Fehler, die die Ausführung des Programm verhindern? Oder heißt Fehler auch, dass man schlechten (aber lauffähigen) Code durch ordentliches Python ersetzt?

Gruß, noisefloor

Re: 10 Fehler im Code (Aufgabe)

Verfasst: Dienstag 12. Juli 2022, 09:14
von snafu
Da sind Syntaxfehler drin, nicht definierte Namen und die falschen Literale zum Erstellen einer Liste.

Re: 10 Fehler im Code (Aufgabe)

Verfasst: Dienstag 12. Juli 2022, 16:31
von karolus
Einfach herrlich… selbst der Link enthält einen Fehler: ……/bild/2cfa79008-phyton-fehlersuche

Re: 10 Fehler im Code (Aufgabe)

Verfasst: Mittwoch 13. Juli 2022, 10:41
von __blackjack__
Bilder mit Text sind nicht schön. Hier Aufgabe und Quelltext mal als *Text*:
Aufgabe 4

Es ist ein Python Programm gegeben, das eine Textdatei mit Inhalt füllt. Die Anzahl der Zeilen und der Text pro Zeile wird vom Benutzer eingegeben. Danach wird die Datei ausgelesen und die einzelnen Zeilen in eine Liste mit dem Namen „list“ geschrieben. Zum Schluss wird die Liste ausgegeben, falls die Datei höchstens 10 Zeilen hat.

Finden Sie die 10 Fehler im Quellcode. Markieren Sie die Stellen im Programm und schreiben Sie den korrigierten Quellcode.

Code: Alles auswählen

from sys import argv
script, filename == argv

file = open(filename)
lines = int(input("Wie viele Zeilen sollen in die Datei geschrieben werden?")
for i in range(0, lines):
    text = input(f"Bitte nächste Zeile für {filename} eingeben: ")
    file.write(text+"\n")

file.close()
file = open(file)

list = ()
i=0
for x in file:
  list.append(x)
  i +=1

if 0 <i<= 10:
    print("Die Datei hat {i} Zeilen.")
    print("Hier ist der Inhalt: ", l)
el if i > 10:
    print("Die Datei ist zu groß, um hier ausgegeben zu werden.")
else i == 0:
     print("Die Datei ist leider leer.")

Re: 10 Fehler im Code (Aufgabe)

Verfasst: Samstag 16. Juli 2022, 14:55
von __blackjack__
@Lucas194lk: Was auch noch in die Kategorie „Fehler oder nicht?“ fallen würde ist die inkonsistente Einrückungung, die zwar hier weder syntaktisch noch semantisch ein Problem ist, aber da dass eigentlich der Editor sauber erledigen sollte, und eine konsistente Einrückung für die Zusammenarbeit wichtig ist, würde ich alles ausser vier Leerzeichen pro Ebene tatsächlich als Fehler sehen.

Die inkonsistente Verwendendung von Leerzeichen um binäre Operatoren und Zuweisungen ist auch etwas das ich markieren/korrigieren würde.

Statt den Benutzer einfach so in einen `ValueError` laufen zu lassen wenn nicht exakt zwei Elemente in `sys.argv` stecken, würde man besser einen Hinweis darauf ausgeben, dass da ein Dateiname beim Aufruf übergeben werden soll.

Ebenso bei der Eingabe der Zeilenanzahl: Da wird weder behandelt, wenn der Benutzer gar keine Zahl eingibt, noch dass er ja auch negative Zahlen eingeben könnte.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from itertools import islice
from sys import argv

ENCODING = "utf-8"
MAX_OUPUT_LINES = 10


def ask_positive_integer(prompt):
    while True:
        try:
            result = int(input(prompt))
        except ValueError:
            print("Bitte eine Zahl eingeben!")
        else:
            if result >= 0:
                return result

            print("Die Zahl muss positiv sein!")


def create_file(filename):
    with open(filename, "w", encoding=ENCODING) as file:
        line_count = ask_positive_integer(
            "Wie viele Zeilen sollen in die Datei geschrieben werden? "
        )
        file.writelines(
            input(f"Bitte nächste Zeile für {filename} eingeben: ") + "\n"
            for _ in range(line_count)
        )


def process_file(filename):
    with open(filename, "r", encoding=ENCODING) as file:
        lines = list(islice(file, MAX_OUPUT_LINES + 1))

    if not lines:
        print("Die Datei ist leider leer.")
    elif len(lines) <= MAX_OUPUT_LINES:
        print(f"Die Datei hat {len(lines)} Zeilen.")
        print("Hier ist der Inhalt:", lines)
    else:
        print("Die Datei ist zu gross, um hier ausgegeben zu werden.")


def main():
    if len(argv) != 2:
        print(f"Verwendung: {argv[0]} <dateiname>")
        return

    create_file(argv[1])
    process_file(argv[1])


if __name__ == "__main__":
    main()