OOP Notenverwaltung

bligher

Mitglied
Hallo zusammen

Ich habe in der Schule als Aufgabe bekommen, eine Notenverwaltungs Programm zu entwickeln.

· Die Noten sollen pro Klasse angezeigt werden können
· Die Noten sollen pro Student angezeigt werden können
· Der Notendurchschnitt soll pro Klasse und Student angezeigt werden können
· Die Notenverteilung einer Klasse soll grafisch angezeigt werden können
· Eine Note soll jeweils einem Fach und einem Studenten zugeordnet sein
· Sämtliche oben erwähnten Objekte sollen erfasst werden können.

Folgenden Ablauf habe ich mir gedacht -> Klasse erstellen-Klassenname(mKlassename)- Anzahl Studenten(mAnzahlStudenten)- Name Student(mName)- Vorname (mVorname)

Nun komme ich schon nicht mehr weiter, wie ich die Studenten speichern und mit den Noten verknüpfen kann. Ich wäre für jeden Hinweis dankbar.

Mfg bligher
 

Bitfehler

Bekanntes Mitglied
Sollen die Daten dauerhaft gespeichert werden? Dann würde sich bspw eine Datenbank anbieten oder müssen sie nur zur Laufzeit vorhanden sein (=neuer Programmstart=Daten weg)?

Beispiel:
Ein Student hat u.a. das Attribut Veranstaltung (Liste von Veranstaltungen o.ä.). Eine Veranstaltung kann dann die Attribute Kursname und Note abbilden. Mit Klasse als Objekt kann ich nichts anfangen, da Studenten üblicherweise nicht in Klassen zusammengefasst sind.
 

Cromewell

Top Contributor
Ich würde eine Klasse "Student" anlegen, sowie "Fach". In Student kannst Variablen, wie Name, Alter, usw. verstauen. Jeder Student hätte eine Liste mit Fächern. In den Fächern sind Daten, wie Kursleiter und Note des Schülers notiert. Eine Klasse "Klasse" wäre nicht schlecht, die eine Liste von Studenten hat und verschiedene Methoden anbietet, um Durchschnitt etc., zu berechnen.
 
X

Xyz1

Gast
Studenten habn Fächer, Fächer habn Studenten, Studenten habn Noten, Fächer habn Noten, Studenten habn keine Klasse (nicht falsch verstehen), das kann nicht modelliert werden. Oder Österreich und SCHÜLER? Dann muss das ganz anders modelliert werden.

Mal ne Vorschlag:

studentFach.png
 

JStein52

Top Contributor
Mal ne Vorschlag:
Da scheint noch etwas der Wurm drinnen zu sein. Z.B. brauchst du um einen Studenten anzulegen (Konstruktor) eine Liste von Fächern, aber um ein Fach anzulegen bruachst du wieder eine Liste der Studenten ? Ich denke eher man sollte in den Konstruktoren die ganzen Listen weglassen und die entsprechenden Elemente mit settern hinzufügen. Ausserdem ist das ganze Modell ja eine Momentaufnahme denn es ist nirgends hinterlegt in welchem Semester welcher Student welches Fach belegt hatte. Ich weiss aber nicht ob das verlangt ist.
 
X

Xyz1

Gast
da habt ihr recht, das Henne-Ei-Problem. Aber ist bis auf die Konstruktoren und fehlenden Setter alles in Ordnung?
 

JStein52

Top Contributor
Na ja, evtl. muss man noch modellieren in welcher Klasse/Semester welches Fach mit welcher Note belegt wurde, diese Historie eben. Aber das kann man wahrscheinlich über ein paar zusätzliche Attribute erledigen.
 
X

Xyz1

Gast
Ja, Klasse hatte ich auch als eine Art Semester verstanden...

Dann bekommt die Noten eben noch ein Datum, einen Prüfer und einen reservierten Platz im Tresor. :D (Oder wtf ich weiß nicht, wo die aufbewahrt werden.)

Hättet ihr nicht mal ein paar Beispieldaten? Dann wird vieles klarer...

Hans hat Note 1 in Fach "Neuzeitliche Kunst" (gibt es nicht, zu viele Kunststile, aber egal) in Semester 3 und Klasse dcac1 und belegt die Fächer z, y und x, welche folgende Studenten auch belegen: Aaron, Adam und Ahmet....

Oder so ähnlich. So eine Hochschulverwaltung stelle ich mir gar nicht so leicht vor. Irgendwie "wird klar" das es mehrere Databases geben muss...

Ich bin schon auf eure Antworten gespannt.
 
X

Xyz1

Gast
So ein mist, mein Ansatz ist wegen den zirkulieren Abhängigkeiten unbrauchbar, wie hier zu sehen:
Java:
public class Temp {
    public static void main(String[] args) {
        Klasse k1 = new Klasse(1);
        Klasse k2 = new Klasse(2);
        Klasse k3 = new Klasse(3);
        Student s1 = new Student(k2, "de
 Jong");
        Student s2 = new Student(k3, "Jansen
");
        Student s3 = new Student(k1, "de
 Vries");
        Student s4 = new Student(k2, "van
de
/
den
/
der
 Berg
");
        Fach f1 = new Fach("Anglistik");
        Fach f2 = new Fach("Rechtswissenschaften");
        Fach f3 = new Fach("Wirtschaftsinformatik");

        // putting them togehter
        k1.studenten.addAll(Arrays.asList(s3));
        k2.studenten.addAll(Arrays.asList(s1, s4));
        k3.studenten.addAll(Arrays.asList(s2));
        f1.studenten.addAll(Arrays.asList(s1, s2));
        f2.studenten.addAll(Arrays.asList(s2, s3));
        f3.studenten.addAll(Arrays.asList(s3, s4));

        // generate notes ....
        Random r = new Random();
        List<Note> noten = new LinkedList<Note>();
        noten.addAll(Arrays.asList(
                new Note(f1, s1, r.nextInt(6) + 1),
                new Note(f1, s2, r.nextInt(6) + 1),
                new Note(f2, s2, r.nextInt(6) + 1),
                new Note(f2, s3, r.nextInt(6) + 1),
                new Note(f3, s3, r.nextInt(6) + 1),
                new Note(f3, s4, r.nextInt(6) + 1)));

        // print them all ....
        Gson gson = new Gson();
        System.out.println(gson.toJson(noten)); // nun krachts aber, wegen zirkulaeren Abhaengigkeiten
    }
}

class Student {
    Klasse klasse;
    List<Fach> faecher = new LinkedList<Fach>();
    String name;

    public Student(Klasse klasse, String name) {
        this.klasse = klasse;
        this.name = name;
    }
}

class Fach {
    List<Student> studenten = new LinkedList<Student>();
    String name;

    public Fach(String name) {
        this.name = name;
    }
}

class Klasse {
    List<Student> studenten = new LinkedList<Student>();
    int stufe;

    public Klasse(int stufe) {
        this.stufe = stufe;
    }
}

class Note {
    Fach fach;
    Student student;
    int note;

    public Note(Fach fach, Student student, int note) {
        this.fach = fach;
        this.student = student;
        this.note = note;
    }
}

[studiere in Holland, deswegen sind da holländische Namen ;) ]
 

Cromewell

Top Contributor
Hat niemand nen bessere Idee? :(
Vielleicht so:

Java:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;

public class Main{
    public static void main(String[] args){
        //Ein Paar Tests
        English english = new English("Dr. Lümmel", "English");
        Math math = new Math("Prof. Dr. Eduard Panatze", "Math");

        Class englishClass = new Class(english);

        Student albert = new Student("Albert", 21);
        albert.addSubject(englishClass, new Integer(1));

        Student eduard = new Student("Eduard", 21);
        eduard.addSubject(englishClass, new Integer(2));

        System.out.println(englishClass.getNumberOfStudent());
        for(Subject sub: albert.getSubjects()){
            System.out.println(sub.getName());
        }

        for(Student s: englishClass.getStudents()){
            System.out.println(s.getMark(english));
        }
    }
}

class Student{

    private String name;
    private int age;
    private HashMap<Subject, Integer> subjects = new HashMap<>();

    Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    void addSubject(Class c, Integer mark){
        c.addStudent(this);
        subjects.put(c.getSubject(), mark);
    }

    //utils for calc//
    //..............//

    /////////////////
    //GETTERS BELOW//
    /////////////////

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    Set<Subject> getSubjects() {
        return subjects.keySet();
    }

    Integer getMark(Subject subject){
        return subjects.get(subject);
    }
}

class Class{

    private Subject subject;
    private ArrayList<Student> students = new ArrayList<>();
    private int numberOfStudent;

    public Class(Subject subject) {
        this.subject = subject;
        numberOfStudent = 0;
    }

    void addStudent(Student s){
        students.add(s);
        numberOfStudent++;
    }

    //utils for calc//
    //..............//

    /////////////////
    //GETTERS BELOW//
    /////////////////

    public ArrayList<Student> getStudents() {
        return students;
    }

    public int getNumberOfStudent() {
        return numberOfStudent;
    }

    public Subject getSubject() {
        return subject;
    }
}

abstract class Subject{

    private String prof;
    private String name;

    Subject(String prof, String name) {
        this.prof = prof;
        this.name = name;
    }

    /////////////////
    //GETTERS BELOW//
    /////////////////

    public String getProf() {
        return prof;
    }

    public String getName() {
        return name;
    }
}

class English extends Subject{

    English(String prof, String name) {
        super(prof, name);
    }
}

class Math extends Subject{

    Math(String prof, String name) {
        super(prof, name);
    }
}
 

AndiE

Top Contributor
Und wenn das gute alte Klassenbuch modelliert wird? Jede Klasse hat mehrere Studenten. Jede Klasse hat mehrere Fächer. Eine Note bekommt immer ein Student für ein Fach. Ein Student kann mehrere Noten für ein Fach erhalten.
 

AndiE

Top Contributor
Code:
package src;

import java.util.Arrays;
import java.util.List;

public class Tabelle {

    @SuppressWarnings("rawtypes")
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List<Integer> Noten1Ma=Arrays.asList(1,2,3);
        List<Integer> Noten2Ma=Arrays.asList(2,2,3);
        List<Integer> Noten1De=Arrays.asList(3,3,3);
        List<Integer> Noten2De=Arrays.asList(1,1,3);
        List<List> NotenMa=Arrays.asList(Noten1Ma,Noten2Ma);
        List<List> NotenDe=Arrays.asList(Noten1De,Noten2De);
        List<List> Klasse1=Arrays.asList(NotenMa,NotenDe);
        System.out.println(Klasse1.toString());
       
       
       
    }

}

Ich habe noch eine andere Idee. ich habe mal ein dreidimensionales List-Objekt gebaut. Dabei bin ich davon ausgegangen, dass der Lehrer eine GUI anwendet. Er sucht mit Listboxes zuerst das Fach und dann die Klasse aus. Dann trägt er für jeden Studenten die Note ein. Die Noten werden dort in eine Liste eingefügt. ( Noten1Ma bedeutet die Noten von Schüler 1 in Mathe).
 

bligher

Mitglied
Diese Aufgabe wird komplizierter, als ich dachte. Ich habe keine Ahnung wie ich das verknüpfen kann. Gibt es diesbezüglich Tutorials oder etwas ähnliches, damit ich überhaupt auf solche Ideen wie von euch komme?
 
X

Xyz1

Gast
Ich meins so:
Java:
package application;

import com.google.gson.*;
import java.util.*;

/**
* @author DerWissende on 06/06/2016
*/
public class Temp {
    public static void main(String[] args) {
        Klasse k1 = new Klasse(1);
        Klasse k2 = new Klasse(2);
        Klasse k3 = new Klasse(3);
        Fach f1 = new Fach("Anglistik");
        Fach f2 = new Fach("Rechtswissenschaften");
        Fach f3 = new Fach("Wirtschaftsinformatik");
        Random r = new Random();
        Note n1 = new Note(f1, r.nextInt(6) + 1);
        Note n2 = new Note(f1, r.nextInt(6) + 1);
        Note n3 = new Note(f2, r.nextInt(6) + 1);
        Note n4 = new Note(f2, r.nextInt(6) + 1);
        Note n5 = new Note(f3, r.nextInt(6) + 1);
        Note n6 = new Note(f3, r.nextInt(6) + 1);
        List<Student> studenten = Arrays.asList(
                new Student("de
 Jong",             k2, Arrays.asList(f1),     Arrays.asList(n1)      ),
                new Student("Jansen",              k3, Arrays.asList(f1, f2), Arrays.asList(n2, n3)  ),
                new Student("de
 Vries",            k1, Arrays.asList(f2, f3), Arrays.asList(n4, n5)  ),
                new Student("van
de
/
den
/
der
 Berg
",  k2, Arrays.asList(f3),     Arrays.asList(n6)      ));

        // print them all ....
        Gson gson = new Gson();
        System.out.println(gson.toJson(studenten)); // keine zirkulaeren Abhaengigkeiten
    }
}

class Student {
    String name;
    Klasse klasse;
    List<Fach> faecher;
    List<Note> noten;

    Student(String name, Klasse klasse, List<Fach> faecher, List<Note> noten) {
        this.name = name;
        this.klasse = klasse;
        this.faecher = faecher;
        this.noten = noten;
    }

}

class Fach {
    String name;

    Fach(String name) {
        this.name = name;
    }
}

class Klasse {
    int stufe;

    Klasse(int stufe) {
        this.stufe = stufe;
    }
}

class Note {
    Fach fach;
    int note;

    Note(Fach fach, int note) {
        this.fach = fach;
        this.note = note;
    }
}

Code:
[
  {
    "name": "de\u2029 Jong",
    "klasse": {
      "stufe": 2
    },
    "faecher": [
      {
        "name": "Anglistik"
      }
    ],
    "noten": [
      {
        "fach": {
          "name": "Anglistik"
        },
        "note": 6
      }
    ]
  },
  {
    "name": "Jansen",
    "klasse": {
      "stufe": 3
    },
    "faecher": [
      {
        "name": "Anglistik"
      },
      {
        "name": "Rechtswissenschaften"
      }
    ],
    "noten": [
      {
        "fach": {
          "name": "Anglistik"
        },
        "note": 5
      },
      {
        "fach": {
          "name": "Rechtswissenschaften"
        },
        "note": 6
      }
    ]
  },
  {
    "name": "de\u2029 Vries",
    "klasse": {
      "stufe": 1
    },
    "faecher": [
      {
        "name": "Rechtswissenschaften"
      },
      {
        "name": "Wirtschaftsinformatik"
      }
    ],
    "noten": [
      {
        "fach": {
          "name": "Rechtswissenschaften"
        },
        "note": 4
      },
      {
        "fach": {
          "name": "Wirtschaftsinformatik"
        },
        "note": 1
      }
    ]
  },
  {
    "name": "van\u2029de\u2029\/\u2029den\u2029\/\u2029der\u2029 Berg\u2029",
    "klasse": {
      "stufe": 2
    },
    "faecher": [
      {
        "name": "Wirtschaftsinformatik"
      }
    ],
    "noten": [
      {
        "fach": {
          "name": "Wirtschaftsinformatik"
        },
        "note": 3
      }
    ]
  }
]

(Die Noten geben sogar fast die Realität wieder.)

Alles sind nun Objekte und halb OO.

Verbesserungsvorschläge?
 
X

Xyz1

Gast
Habt ihr nicht mal Beispieldaten für mich? Noten Studierender, die ihr nicht mögt, oder entfernte Kommilitonen von euch, deren Noten ich hier ins Internet stellen darf? :D
 

AndiE

Top Contributor
Ich denke, wir sollten die Use-Stroy nicht aus den Augen verlieren. Ich stelle mir mal eine Einrichtung vor, in der 4 Klassen(A-D) in 4 Semestern(S1..S4) a' 20 Schüler ausgebildet werden. Dann würde ich doch die 320 (Aa,Ab,Ac,Ad ...)Namen eingeben und sie den 16 Klassen(AS1,AS2...DS3,DS4) zuordnen. Dann gibt es ja Stundenpläne, also kann ich den Klassen auch eine Anzahl der 10 Fächer(1-10) zuordnen, die an der Einrichtung ausgebildet werden. Bis hierher erfolgt die Arbeit in der schulfreien Zeit. Während der Schulzeit werden nun Noten vergeben, die eingetragen werden("Aa aus der Klasse AS3 hat in 5 eine Note 4 geschrieben"). Nun ist es dabei sinnvoll, den Verlauf der Einzelnoten in den Fächern und der Gesamtnote zu verfolgen, um frühzeitig eine Versetzungsgefährdung zu erkennen und darauf zu reagieren. Das soll das Programm abbilden, stelle ich mir vor.
 
X

Xyz1

Gast
Rotes Pop-Up bei Versetzungsgefährdung :D :D . Egal, meine Noten sind alle 1.

Geht es hier um Schüler oder Studenten/Studierende? Das sollten wir vielleicht vorab klären --- und, ob wir ihm die komplette Aufgabe schreiben sollten.
 

bligher

Mitglied
Rotes Pop-Up bei Versetzungsgefährdung :D :D . Egal, meine Noten sind alle 1.

Geht es hier um Schüler oder Studenten/Studierende? Das sollten wir vielleicht vorab klären --- und, ob wir ihm die komplette Aufgabe schreiben sollten.

Die komplette Aufgabe zu posten, wäre für nicht von Vorteil, aber den Weg dorthin oder was ich dafür benötige. Ich habe mühe alles zu verknüpfen.
 

bligher

Mitglied
Nun habe ich gute Tipps von DerWissende bekommen bezüglich: erweitere Klassen um Attribute, Getter- und Setter-, toString- und Methoden zum Hinzufügen von Objekten, damit ich über ein GUI die Verwaltung der Noten machen kann, jedoch komme ich nicht auf die Idee dies ins Projekt zu integrieren.

Wie kann ich über das GUI z.b JButton die Klasse erstellen und Studenten hinzufügen? Am Schluss will ich Buttons mit Klasse hinzufügen, Klasse anzeigen, Noten hinzufügen haben.
 

Cromewell

Top Contributor
Wie kann ich über das GUI z.b JButton die Klasse erstellen und Studenten hinzufügen? Am Schluss will ich Buttons mit Klasse hinzufügen, Klasse anzeigen, Noten hinzufügen haben.

Die Funktion für den Button auf etwa sowas setzen: "Neuer Student" -> Pop-Up-Fenster zum Eingeben von Daten (Name, Alter,....) -> Ok-Button im Fenster -> Daten auslesen -> Student student = new Student("Name", 21, usw...); -> zu deiner Datenbank/Liste hinzufügen.
 

AndiE

Top Contributor
Wie groß sind deine Kenntnisse im Bereich GUI? Kannst du das programmieren: Wert in Editfeld1 eingeben, nach Druck des Button diesen wert in Editfeld2 ausgeben? Ganz vereinfacht wird beim Druck auf den Button eine Funktion aufgerufen, die das Editfeld liest und den Wert abspeichert. Diese Funktion ruft danach in diesem Fall danach ein Neuzeichnen auf. Das mit der GUI sieht ja schick aus, aber ich würde zuerst auf die gute, alte switch- Konstruktion zurückgreifen. Auch hier werden parameterlose Funktionen aufgerufen, so dass man hinterher die Konsoleneingabe gegen eine GUI austauschen kann. Aber am wichtigsten erscheint mir, dass du schrittweise vorgehst. Du willst einen Elefanten essen, und das geht nur Bissen für Bissen. =)
 

bligher

Mitglied
Meine Kenntnisse im GUI sind sehr klein. Ob ich das Programmieren kann, denke ich nicht, aber irgendwie müsste es schon gehen. Um den Elefanten zu essen, habe ich die Zeit falsch eingeschätzt.:p
 

Cromewell

Top Contributor
@bligher
Muss es denn eine Gui sein ? Ich meine, an sich ist es eine gute Übung - gerade, wenn du noch nicht so gut beim Gui proggen bist. Andererseits: wenn du nur noch wenig Zeit hast und Gui nur ein "Extra" war, dann mach es doch in der Konsole :)
 

bligher

Mitglied
Ja so werde ich es wohl machen, auch wenn ich dann Abzüge bekomme. Es wird folgendermassen bewertet :
  • Funktion des Programmes
  • Richtigkeit
  • Umfang
  • Fehlerbehandlung
  • Bedienerfreundlichkeit
  • Wartbarkeit des Codes
  • OO-Ansatz
  • Namensvergabe von Bezeichnern
  • Einhalten von Namenskonventionen
  • Einrücken der Blöcke
  • Methodenwahl
  • Kommentare
 

AndiE

Top Contributor
Was hast du schon geschrieben? Um sich bei so einem Projekt nicht zu verrennen, bieten sich Dummys an. Das meint, du erzeugst mit Arrays.asList aus einer Liste wie {"Meier,"Schulze","Lehmann",...} eine Schulklasse und auf ähnliche Art eine List der Fächer. Dann kannst du dich dem Teil widmen, wo du Zensuren vergibst, ausgibst, Durchschnitt berechnest usw. Dazu rufst du natürlich die Objekte der Klassen auf.Wenn das soweit steht, kannst du dich aufmachen, die Verwaltung der Schüler und Fächer zu schreiben. Die Serializierung, also das Abspeichern und Laden würde ich ganz als letztes implementieren.
 

bligher

Mitglied
Wenn ich die investierte Stunden mit dem Code vergleiche, fast nichts. Momentan die Klasse Class.

Java:
import java.util.ArrayList;

public class Class {

        private ArrayList<Student> mStudents;

        public Class() {
            mStudents = new ArrayList<Student>();
        } // end constructor

        // Beziehung setzen
        public void addStudent(Student pStudent) {
            mStudents.add(pStudent);
        } // end method


    String mClassname;

    // Konstruktor
    public Class(String pClassname) {
        mClassname = pClassname;

    } // end constructor

    // Methode liefert Klassenname zurück
    public String getClassname() {
        return mClassname;
    } // end methode
}

Java:
import java.util.List;

public class Student {

    String mPrename;               // Vorname vom Student
    String mName;                  // Name vom Student
    Class mClass;                  // Klasse vom Student
    List<Subject> mSubject;
    List<Mark> mMarks;


    // Konstruktor
    public Student(String pPrename, String pName) {
        mPrename = pPrename;
        mName = pName;
    } // end constructor

    // Methode liefert Vorname zurück
    public String getPrename() {
        return mPrename;
    } // end methode

    // Methode liefert Name zurück
    public String getName() {
        return mName;
    } // end methode

}
 

Neue Themen


Oben