Klasse und Funktionen, ausgabe von Listen

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
Maxinyo
User
Beiträge: 5
Registriert: Montag 17. Juli 2017, 16:15

Guten Tag Leute,

ich habe folgende Aufgabenstellung:

Code: Alles auswählen

Die Klasse Pruefung hat die Attribute Fach (ein String) sowie Noten (eine Liste). Die leere
Notenliste wird in der init () Methode erzeugt. Fur beide Attribute gibt es sogenannte
"getter" Methoden. Einzelne Noten werden mit der Methode addNote() in die Notenliste
eingetragen. Die Methode printStatistik() gibt den Namen des Faches, die Anzahl der
Noten, die beste, die schlechteste und die Durchschnittsnote aus.
Schreiben Sie eine Funktion (keine Methode, also unabhangig von einer Klasse) addNoten().
Diese erhalt ein Objekt der Klasse Pruefung sowie eine Liste von Noten und ruft die Methode
addNote() fur alle Noten in der Liste auf.
Verwenden Sie Ihre Klasse und Ihre Funktion an einem Beispiel:
Erzeugen Sie eine Prufung und eine Liste mit Noten. Rufen Sie Ihre Funktion auf und fugen
Sie alle Noten der Liste zur Prufung hinzu. Geben Sie die Statistik fur Ihre Prufung aus.

Mein Code bisher:

Code: Alles auswählen

class Pruefung:
   
    def __init__(self, Fach):
        self.Fach = list()
        
    def getFach (self):
        return self.Fach
    
    def addNote (self, liste):
        self.liste = liste
        liste = []
        
    def getNote (self):
        return self.liste
    
    def zugnis(self):
        desc_str = ("%s mit %d") % (self.Fach, self.liste)
        return desc_str

    def printStatistik(self):
        desc_sta = ("folgender durchschnitt:"),  float((6 + 3 + 1) / 3)
        return desc_sta


Fach1 = Pruefung(list)
Fach1.addNote(6)
Fach1.Fach = "Englisch"

Fach2 = Pruefung(list)
Fach2.addNote(3)
Fach2.Fach = "Mathe"

Fach3 = Pruefung(list)
Fach3.addNote(1)
Fach3.Fach = "Mechanik"

statistik = Pruefung (list)


print (Fach1.zugnis())
print (Fach2.zugnis())
print (Fach3.zugnis())

print (statistik.printStatistik())
Also ich habe es soweit, das ich einzelne Fächer und Noten hinzufügen konnte, allerdings weiß ich nicht wie man das richtig in die Liste einfügt und wie ich mir dann die beiden kompletten Listen ausgeben lassen kann, so wie verlangt. Und wie ich dann die einzelnen Noten den einzelnen Fächern zuweisen muss.


1. Ja ich weiß dies ist sehr Java belastet und Setter + Getter methoden soll man nicht in Python verwenden. Allerdings würde ich das gerne so machen wie es die Aufgabenstellung verlangt.

2. Nein dies sind keine Hausaufgaben, dies ist für mich zur Wiederholung für mein Modul ;)

Jemand eine Idee?

Vielen Danke schonmal!
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Maxinyo: Also der erste Satz der Aufgabe ist ja schon mal nicht umgesetzt. `Fach` ist laut Aufgabe eine Zeichenkette, in Deinem Code aber eine Liste. Stattdessen solltest Du da vielleicht das Argument Fach dran binden.

Dann wird in der `__init__()` nicht wie in der Aufgabe verlangt eine leere Notenliste erzeugt. Das passiert in `addNote()`, allerdings jedes mal und es wird dort auch keine Note hinzugefügt. Die Notenliste heist `liste`, was kein so besonders guter Name ist.

`getNote()` und `zugnis()` (Häh?) werden in der Aufgabe gar nicht erwähnt, und machen komische Sachen.

Dann schreibst Du wir sollen uns nicht über die unpythonisch Getter und Setter beschweren, Du hast dann aber für `Fach` gar keinen Getter, sondern weist das einfach so von aussen zu. Dann würde ich mich an der Stelle mal beschweren, dass Du das nach eigener Aussage ja ”javaesque” lösen möchtest, aber dann gar keine Settermethode verwendest. ;-)

Die Aufgabe verlangt auch eine Funktion, die ich nicht im Quelltext sehe‽

Also irgendwie hält sich Dein Code ganz offensichtlich so ziemlich gar nicht an das was in der Aufgabe gefordert ist. Das möchtest Du vielleicht erst einmal überarbeiten, bevor man zum Code was sagt. Es steht da auch nirgends das man mehr als ein `Pruefung`-Exemplar erstellen soll. Und wenn man ein `Pruefung`-Objekt hat, das ein `Fach`-Attribut besitzt, sollte man das `Pruefung`-Objekt vielleicht nicht an den Namen `Fach1` binden. Und auch nicht an `statistik`, denn eine Prüfung ist ja weder ein Fach noch eine Statistik.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Maxinyo
User
Beiträge: 5
Registriert: Montag 17. Juli 2017, 16:15

Code: Alles auswählen

class Pruefung:
   
    def __init__(self, Notenliste):
        self.Notenliste = Notenliste
        Notenliste = []
    
    def str (self, Fach):
        self.Fach = Fach
        Fach = ""
        
    def addNote(self, Note):
        self.Note = Note
        Note.append()
        
    def getFach(self):
        return self.Fach
    
    def printStatistik(self):
        desc_str = ("")
        return desc_str

def addNoten(self):
    Notenliste2 = Pruefung()
    Notenliste2.Noten = [2, 4, 1 ,3]
    return addNoten()
    
Soweit erstmal die überarbeitung. Aber genau das war ja mein Problem, ich weiß nicht wie ich Fächer oder Noten über die Getter Methode in die Liste bekomme und wie ich mir dann die Liste ausgeben lassen kann. Das von außen hinzuzufügen war erstmal testweise.
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Maxinyo: Irgendwie scheinst Du mehr zu raten als gezielt etwas zu schreiben. So funktioniert programmieren nicht. Das funktioniert ja hinten und vorne nicht und sieht nicht so aus als wenn Du irgendwas verstanden hättest. Und weicht auch immer noch von der Beschreibung im Aufgabentext ab. Zum Beispiel steht dort was die `addNoten()`-Funktion als Argumente erwartet. Und auch was die machen soll. Das macht die gezeigte Funktion aber offensichtlich auch nicht.

Solange das *offensichtlich* nicht funktioniert, macht es wenig Sinn das Du es zeigst. Es sei denn Du willst hier ”erbetteln” das es jemand für Dich schreibt. Wenn Du das selbst lösen möchtest, dann musst Du das Schritt für Schritt entwickeln, und jeden Schritt testen, und wenn es nicht funktioniert, nicht einfach mit was anderem weiter machen.  Was dann am Ende auch nicht funktioniert. Und dann zu fragen was daran falsch ist, hilft nicht viel, denn da ist so ziemlich alles Falsch. Das einzige was da richtig ist, ist die `getFach()`-Methode. Alles andere ist Murks.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

@__blackjack__ ich hatte mal 2 min Zeit und konnte das Elend :shock: nicht mit ansehen (und schau in meine sig)

@Maxinyo ich hoffe du kannst mit diesem Code der deine Aufgabenstellung erfüllt etwas lernen. Ach ja, da ist mein Urheberrecht drauf, gibst du das für dein Werk aus, kriege ich dich dran :lol:

Code: Alles auswählen

class Pruefung(object):

    def __init__(self, name=''):
        self.fach = name
        self.noten = []

    def setFach(self, fach):
        self.fach = fach

    def getFach(self):
        return self.fach

    def addNote(self, note):
        self.noten.append(note)

    def getNoten(self):
        return self.noten

    def printStatistik(self):
        anz_noten = len(self.noten)
        print(f'Fach: {self.fach}')
        print(f'{anz_noten} Noten')
        print(f'Beste Note: {min(self.noten)}')
        print(f'Schlechteste Note: {max(self.noten)}')
        print(f'Schnitt: {sum(self.noten)/anz_noten}')


def addNoten(cls, noten):
    for note in noten:
        cls.addNote(note)


deutsch = Pruefung()
deutsch.setFach('Deutsch')
# oder deutsch = Pruefung('Deutsch')
noten = [1, 2, 3, 4, 5, 6]
addNoten(deutsch, noten)
deutsch.printStatistik()
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hm, wenn man keine Noten hinzufügt funktioniert das Ausgeben der Statistik nicht. Und der Name `cls` ist falsch, denn da wird keine Klasse übergeben. Und `anz_noten` würde ich `notenanzahl` nennen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mal eine Lösung in Ruby bei der der Fall geprüft wird das keine Noten existieren:

Code: Alles auswählen

#!/usr/bin/env ruby

class Exam
  attr_reader :subject, :marks
  
  def initialize(subject)
    @subject = subject
    @marks = []
  end
  
  def add_mark(mark)
    @marks.push mark
    self
  end
  
  def print_statistics
    puts "Fach #{@subject} hat #{@marks.length} Noten."
    unless @marks.empty?
      puts "Beste Note: #{@marks.min}"
      puts "Schlechteste Note: #{@marks.max}"
      puts "Schnitt: #{@marks.reduce(:+) / @marks.length.to_f}"
    end
    self
  end
end

def add_marks(exam, marks)
  marks.each(&exam.method(:add_mark))
end

def main
  german_exam = Exam.new 'Deutsch'
  marks = [1, 2, 3, 4, 5, 6]
  add_marks german_exam, marks
  german_exam.print_statistics
end

main if __FILE__ == $PROGRAM_NAME
Bei Ruby machen die Getter wenigstens halbwegs Sinn, weil Objekte dort nach aussen nur Methoden haben und keine Datenattribute. Allerdings finde ich es aus „javaesquer“ Sicht problematisch die Noten raus zu geben, denn damit gibt man internen Zustand raus, den draussen dann jemand verändern könnte. Gaaanz böse wenn man nicht davon ausgeht das die Programmierer „consenting adults“ sind. ;-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten