# Klasse Student - Methode immatrikullieren, exmatrikullieren, altersdurchschnitt



## javaStudent (7. Jun 2011)

Hallo,

ich versuche mich gerade in einer Aufgabe und komme das irgendwie nicht weiter.

Klasse Student:
[JAVA=42]
public class Student {

	public String vorname, nachname;
	public int alter;
	public boolean kennzeichen;

	// Konstruktor
	public Student (String vorname, String nachname, int alter){
		this.vorname = vorname;
		this.nachname = nachname;
		this.alter = alter;
	}

	public void immatrikullieren(){
		System.out.println("Student: "+vorname+" "+nachname+" "+alter+" Jahre wurde Immatrikulliert.");
		System.out.println("");
		kennzeichen = true;
	}

	public void exmatrikullieren(){
		System.out.println("Student: "+vorname+" "+nachname+" "+alter+" Jahre wurde Exmatrikulliert.");
		System.out.println("");
		kennzeichen = false;
	}

	//Methodendeklaration
	public static void altersdurchschnitt(){

	}

}
[/code]

Klasse StudentTest
[JAVA=42]
public class StudentTest {

	public static void main(String[] args) {

		Student s0 = new Student("Hans", "Meier", 21);
		Student s1 = new Student("Fritz", "Kunze", 22);
		Student s2 = new Student("Klaus", "Schulze", 24);

		s0.immatrikullieren();
		s1.immatrikullieren();
		s2.immatrikullieren();

		Student.altersdurchschnitt();

		s2.exmatrikullieren();
	}

}
[/code]


Aufgabenstellung ist folgendermaßen:

Implementieren Sie eine Klasse Student. Ein Student hat einen Vornamen, einen Nachnamen und ein Alter sowie ein Kennzeichen, das er immatrikuliert ist. Die Klasse soll eine Methode immatrikulieren haben, der das Alter eines Studenten als Parameter übergeben wird, sowie eine Methode exmatrikulieren, sowie eine dritte Methode altersdurchschnitt, die bei ihrem Aufruf den Altersdurchschnitt aller gerade immatrikulierten Studenten liefert.
In einer Klasse StudentTest sollen die drei Studenten Hans Meier (21 Jahre), Fritz Kunze (22) und Klaus Schulze (24) immatrikuliert werden und ihr Altersdurchschnitt soll ausgegeben werden.
Dann wird Fritz Kunze wieder exmatrikuliert und der Altersdurchschnitt wird weirder ausgegeben.


----------



## eRaaaa (7. Jun 2011)

javaStudent hat gesagt.:


> Die Klasse soll eine Methode immatrikulieren haben, der das Alter eines Studenten als Parameter übergeben wird



Das hast du ja schon mal nicht beachtet!



> sowie eine dritte Methode altersdurchschnitt, die bei ihrem Aufruf den Altersdurchschnitt aller gerade immatrikulierten Studenten liefer



da kommst du mit void auch nicht weit  Und irgendwie/wo musst du dir ja jetzt das Alter aller immatrikulierten Studenten merken, hast du da gar keine Idee? Ist ja nicht vorgegeben wie du das machen sollst, gebe ja daher verschiedene Ansätze!


----------



## javaStudent (7. Jun 2011)

ok habe die Methode immatrikulieren folgendermaßen umgeändert:

```
public void immatrikullieren(int alter){
	System.out.println("Student: "+vorname+" "+nachname+" "+alter+" Jahre wurde Immatrikulliert.");
	System.out.println("");
	kennzeichen = true;
}
```
der aufruf in der main sieht dann so aus:

```
s0.immatrikullieren(21);
s1.immatrikullieren(22);
s2.immatrikullieren(24);
```

bei der altersdurchschnitt Methode habe ich überhaupt keine idee wie ich das machen soll. Wäre für jeden Vorschlag dankbar.


----------



## Guardi (7. Jun 2011)

Ich finde die Aufgabenstellung etwas schlecht formuliert.
Für gewöhnlich implementiert man eine Methode wie getAltersDurchschnitt in einer Container-Klasse, die sogenannte "Business-Objekte" wie Studen enthält.
Also eine Klasse die eine Liste von Studenten enthält.
Ich würde auch die Methode immatrikulieren auch dort implementieren.

Mal eine grobe unvollständige Vorgabe, um zu verstehen was gemeint ist:


```
public class StudentenVerwaltung{

private Collection<Student> studenten;

public double getAltersDurschnitt(){

  // über Liste iterieren und Durschnitt berechnen

  }

public void immatrikulieren(String name, int alter){
      
      studenten.add(new Student(name ,alter));

   }

}
```

Exmatrikulieren entfernt den Studenten aus der Liste usw.
Du kannst z.B. auch eine zweite Liste für alle exmatrikulierten Studenten halten.

edit: Hattet ihr überhaupt schon Collections? 
Wenn nein, schaus dir an (besser) oder nimm Arrays (geht auch wenns sein muss)


----------



## javaStudent (7. Jun 2011)

Ich dachte schon ich bin der einzige der die Formulierung der Aufgabe schlecht findet...

ich jetzt mal die Methode so geschrieben, allerdings weis ich nicht wie ich die alterswerte aus den Objekten lesen soll:


```
public static int altersdurchschnitt(){
	int altersDurchschnitt;
		
	altersDurchschnitt = alter;
		
	return altersDurchschnitt;
}
```


----------



## javaStudent (7. Jun 2011)

Danke für den Vorschlag, aber gibt es auch eine Lösung ohne Listen? Oder komme ich hier an Listen nicht vorbei.?


----------



## Guardi (7. Jun 2011)

Getter und Setter
In Java kapselt man Instanz-Variablen für gewöhnlich.
Das bedeutet diese werden private gesetzt und über getter und setter aufgerufen/modifiziert.

Beispiel:


```
public class Student {
   
    private int alter;

    public int getAlter(){
    return this.alter;
    }

    public void setAlter(int alter){
    this.alter = alter;
    }

}
```

edit:
Ich sag mal so:
Mit extrem schlampiger und schlechter Programmierung kommt man auch dran vorbei.
Aber DatenStrukturen sind in so einem Fall ein Muss.


----------



## eRaaaa (7. Jun 2011)

javaStudent hat gesagt.:


> Danke für den Vorschlag, aber gibt es auch eine Lösung ohne Listen? Oder komme ich hier an Listen nicht vorbei.?



Tja ein einfacher Integer/Double machts wohl auch. Musst dann eben den Durchschnitt bei jedem Immatrikulieren oder Exmatrikulieren neu berechnen z.B. 
Wie gesagt, gibt viele Möglichkeiten (einige schöne, einige nicht so schöne  )


----------



## javaStudent (7. Jun 2011)

komme da nicht drauf... das mit den getter und setter hab ich auch nicht verstanden, muss ich mir noch mal anschauen wie das mit dem getter und setter funktioniert.


----------



## Dekker (7. Jun 2011)

Benutz statische Variablen [c]static int myvariable[/c]. Die gelten für alle Instanzen der selben Klasse.


----------



## OldBoy (7. Jun 2011)

Liebe Leute,
schreibt man denn immatrikulieren oder exmatrikulieren neuerdings mit doppel-L ?
Ganz ab davon..  ich bin Java-Anfänger und meine gelesen zu haben, dass es statische Variable (Klassenvariablen) und Methoden gäbe,
womit es möglich sein sollte, z.B. bei jedem Aufruf der Methode "immatrikulieren" die Zahl der Immatrikulierten hochzuzählen, oder das Durchschnittsalter der Immatrikulierten zu aktualiseren.
Da braucht es also vermutlich keine großen Verrenkungen, aber vielleicht Kenntnisse in Mathematik und Java.


----------



## Dekker (7. Jun 2011)

OldBoy hat gesagt.:


> Liebe Leute,
> schreibt man denn immatrikulieren oder exmatrikulieren neuerdings mit doppel-L ?
> Ganz ab davon..  ich bin Java-Anfänger und meine gelesen zu haben, dass es statische Variable (Klassenvariablen) und Methoden gäbe,
> womit es möglich sein sollte, z.B. bei jedem Aufruf der Methode "immatrikulieren" die Zahl der Immatrikulierten hochzuzählen, oder das Durchschnittsalter der Immatrikulierten zu aktualiseren.
> Da braucht es also vermutlich keine großen Verrenkungen, aber vielleicht Kenntnisse in Mathematik und Java.



Du klingst wie der neunmalkluge mit dem ich mich schon mal angelegt habe. Spar dir dein geflame doch einfach wenn du nichts neues Beitragen kannst


----------



## OldBoy (7. Jun 2011)

Lieber Dekker,
du legst dich vielleicht gerne mit irgendwelchen Leuten an. Ich hingegen versuche nur etwas zur Lösung beizutragen.
Alles was ich in diesem Forum bisher beigetragen habe, lief unter OldBoy und ich kann mich nicht erinnern mich mit einem Dekker angelegt zu haben.
Du magst jetzt gehen und dich schämen...oder was auch immer.

Dennoch gibt es sog. Klassenvariablen, die mit "static" zu deklarieren sind. 
Im Fallbeispiel wären davon vermutlich 2 notwendig, eine integer für die Summierung der immatrikulierten und eine double für  den Altersdurchschnitt der Immatrikulierten.

Sei N die Zahl der Immatrikulierten und D der Altersdurchschnitt der Immatrikulierten, dann bedeutet
Immatrikulation eines Studenten mit dem Alter X:
N = N + 1 : D = D + (X - D) / N
Exmatrikulation eines Studenten mit dem Alter X:
N = N - 1 : D = D + (D - X ) / N
wenn ich mich nicht irre.

Selbstredend muss bei Ausführung der Methoden ex- und immatrikulieren jeweils geprüft werden,
inwieweit der jeweilige Member nicht bereits  ex- oder immatrikuliert ist, bzw. ex- oder immatrikuliert werden kann.
Nur nach dieser Prüfung darf ggf. eine Aktualisierung erfolgen.

Ich sagte wohl, dass ich ein Java Neuling bin, ein programmier-Neuling bin ich jedoch nicht.


----------



## Crian (7. Jun 2011)

Oder man hält die Summe der Alter und die Anzahl vor und berechnet den Durchschnitt, wenn er abgefragt wird.


----------



## OldBoy (7. Jun 2011)

Richtig Crian, 
der Wertebereich der Integer sollte für die Summierung der Alter von immatrikulierten Studenten üblicher Hochschulen hinreichend groß sein.
Die Methode altersdurchschnitt sollte vielleicht auch mit einem Rückgabewert vom Typ double (nicht void) ausgestattet werden, es sei denn, die Methode soll direkt zur Anzeige des Wertes dienen.


----------



## muckelzwerg (7. Jun 2011)

Für gewöhnlich würde man wohl eher das Geburtsdatum oder wenigstens das Geburtsjahr speichern und nicht das Alter. 
So wie die Aufgabe gestellt ist, könnte man sie ja eigentlich auch mit

```
System.out.println("Durchschnitt 67/3");
...
System.out.println("Durschschnitt 27.5");
```
lösen. ^_^


----------

