Denkerblockade

Status
Nicht offen für weitere Antworten.

minzel

Aktives Mitglied
Also habe mal eine glaube ich zu einfache Frage :S

Hier mal die Aufgabe die gegeben wurde:

Entwerfen Sie eine Klasse Student, zur Erfassung der Noten von Studenten in einem Semester. Die Klasse soll als Attribute den Namen, die MATR.-Nr. und eine Zusammenstellung der Noten in einem Semester (max. 10 Einträge) enthalten. Für die Speicherung der einzelnen Noten ist die folgenede Klasse vorgegeben:

Code:
class Note {

private string Fach;
private float Zensur;

}

Ergänzen Sie die Klasse Note zum Lesen und Schreiben der Attribute.
Programmieren Sie folgende Konstruktor für die Klasse Student: "copy"-Konstruktor und einen Konstruktor, der alle Attribute als Parameter übergibt. Ergänzen Sie eine Instanz der Klasse Student (In der main-Methode). Geben sie Namen und den Notendurchschnitt aus.

So erstmal *bahnhof*, aber habe das bisher gemacht:

Ich werd aus dieser Aufgabe nicht schlau wie sie funktionieren soll. Bzw was ein copy Konstruktor sein soll und wie man diesen anwendet. Vieleicht kann mir ja hier jemand helfen, Thx im vorraus !

Code:
Student.java

public class Student {

	int[] Noten = new int[10];
	String Name;
	int Matrikel;
	
	public static void main(String[] args) {
		Student s = new Student();
		s.start();
	}
	
	void start () {
	
	}
}

Code:
Note.java

public class Note {

	private String Fach;
	private float Zensur;

	public String getFach() {
		return Fach;
	}

	public void setFach(String fach) {
		Fach = fach;
	}

	public float getZensur() {
		return Zensur;
	}

	public void setZensur(float zensur) {
		Zensur = zensur;
	}
}
 

foobar

Top Contributor
Das ist eine copy-Konstruktor:
Code:
public class Note {

   private String Fach;
   private float Zensur;
   
    public Note(Note n)
    {
       this.fach = n.getFach();
        this.zensur = n.getZensur();
    }

   public String getFach() {
      return Fach;
   }

   public void setFach(String fach) {
      Fach = fach;
   }

   public float getZensur() {
      return Zensur;
   }

   public void setZensur(float zensur) {
      Zensur = zensur;
   }
}
P.S. Such mal hier im Forum nach deep copy.
 

minzel

Aktives Mitglied
ja, das mit dem attributen hab ich jetzt auch klein geschrieben, war mein fehler,
aber wie kann ich das jetzt verwenden ? Also ich versage meißt bei solchen aufgaben weil ich nicht nachvollziehen kann was das programm nun tun soll. ist immer so kompliziert gestellt.

der copy - Konstruktor Gibt also einfach nur den Wert des Attrbuts aus, oder seh ich das falsch ?

Könnte mir jemand einen tipp geben wie ich da weiter rangehen müßte ?
wäre echt nett.
 

foobar

Top Contributor
Den Notendurchschnitt zu berechnen, ist doch nicht so kompliziert:
Code:
public class Student 
{

   ...
   public double computeGrades()
   {
      double allGrades;
      for (int i=0; i < grades.length; i++)
      {
         allGrades += grades[i].getValue();
         
      }
       return (allGrades / grades.length);
    }
}

P.S. Ich hab die Member etwas anders bennant, weil deutsche Bezeichner sind Pfui bah ;-)
 

minzel

Aktives Mitglied
ja thx, ich mein sowas bekomm ich ja hin, habs nur noch nicht reingemacht weil ich es noch nicht gebraucht hatte, aber wie verbind ich das was soll ich da machen ? soll eine eingabe kommen und wenn ... wie ... auf welches attribut soll ich das speichern ?!
 
M

Michael2

Gast
Hey du, hab hier nochmal ein Beispiel, vielleicht kommt dir ja dann
der erlösende Gedanke ;-}

Code:
public class Note { 

   private String fach; 
   private float zensur; 
 
    public Note(Note n) 
    { 
       this.fach = n.getFach(); 
        this.zensur = n.getZensur(); 
    } 
    
    public Note(String fach, float zensur) 
    { 
       this.fach = fach; 
       this.zensur = zensur; 
    } 

   public String getFach() { 
      return fach; 
   } 

   public void setFach(String fach) { 
      this.fach = fach; 
   } 

   public float getZensur() { 
      return zensur; 
   } 

   public void setZensur(float zensur) { 
      this.zensur = zensur; 
   } 
}



Code:
public class Student { 

   Note[] Noten = new Note[10];
   String Name; 
   int Matrikel; 
    
   public Student(String Name, int Matrikel)
   { 
     this.Name=Name;
     this.Matrikel=Matrikel;
   }
   
   public static void main(String[] args) { 
      Student s = new Student("Dieter",100821); 
      s.Noten[0] = new Note("Deutsch",2);
      s.Noten[1] = new Note("Mathe",3);
      s.Noten[2] = new Note("Franz",4);
      s.Noten[3] = new Note("Eng",5);
      s.Noten[4] = new Note("Chemie",6);
      s.Noten[5] = new Note("Chinesisch",1);
      s.Noten[6] = new Note("Japanisch",2);
      s.Noten[7] = new Note("Physik",3);
      s.Noten[8] = new Note("Musik",2);
      s.Noten[9] = new Note("Afro",2);
      System.out.println("Der Name ist: " + s.Name);
      System.out.println("Der Notendurchnitt ist: " + s.berechneNotendurchschnitt());
   } 
    
   public double berechneNotendurchschnitt() 
   { 
      double allGrades=0; 
      for (int i=0; i < Noten.length; i++) 
      { 
         allGrades += Noten[i].getZensur(); 
          
      } 
       return (allGrades / Noten.length); 
    } 
 
   
}
 

Student

Top Contributor
ähem .. ich verstehe es nicht.
wozu ist denn dieser teil hier überhaupt da?

der wird doch gar nicht verwendet.
Code:
public Note(Note n) 
    { 
       this.fach = n.getFach(); 
        this.zensur = n.getZensur(); 
    }
oder geschieht das implizit, oder was? :roll:
 
G

Guest

Gast
minzel hat gesagt.:
ja thx, ich mein sowas bekomm ich ja hin, habs nur noch nicht reingemacht weil ich es noch nicht gebraucht hatte, aber wie verbind ich das was soll ich da machen ? soll eine eingabe kommen und wenn ... wie ... auf welches attribut soll ich das speichern ?!

Ich denke du sollst eine Klasse schreiben, die einen Studenten repräsentiert. Diese Klasse soll dann, zum Beispiel, in einer datenbank gespeichert werden, um sämtliche Studenten einer Universität zu erfassen. Weil man sowas im Normalfall nicht alleine proggt, sollst du nur die Studenten machen und dir vorstellen, die sonstigen sachen macht wer anders. Die Frage "Wie verbinde ich dass?" erübrigt sich, das *macht wer anders* :D

Bei solchen aufgaben zählt: Nicht denken. proggen
 
M

Michael2

Gast
Du hast recht, der Programmcode wird überhaupt nicht benötigt.
Ich bin auch nur ein Copy-and Paste Programmierer;-}

Ich denke gib das einfach so ab, Testat kriegst du allemal.
 
M

Michael2

Gast
Ok: Du erstellt ein Objekt der Klasse Student, diese hat drei Attribute.
Name, Matrikelnummer, und ein Array.
Das Array darf maximal 10 elemente haben und jedes Element muss vom Typ
Note, also den Datentyp Klasse Note haben OK?
Jedes Element im Array ist ein Objekt der Klasse Note und muss auch erst erstellt werden.

Student s = new Student("Dieter",100821); // erstelle Objekt von Klasse Student und sage Attr. Name=Dieter...

s.Noten[0] = new Note("Deutsch",2); // Das Attribut Noten von dem gerade erstellten Objekt s soll nun an
der nullten Stelle des Array belegt werden, also müssen wir mit new Note() ein Objekt erstellen und dieses
zuweisen.Die Klasse Note selbst hat nun wieder separat Attribute und Methoden; es ist eigentlich immer
das gleiche.

Hoffe alle Klarheiten beseitigt zu haben :autsch:
 

clemensk

Mitglied
noch kleine anmerkungen meinerseits:

1)
s.Noten[0] <- nicht gut! man sollte instanzvariablen über setter setzen und soweit wie möglich private halten!

2)
stichwort kopierkonstruktor:
ein kopierkonstruktor stellt sicher, dass bei einer objektkopie eine tiefe kopie durchgeführt wird ...
objekte zählen in java (wie auch in c++) genauso wie arrays zu den sogenannten referenzdatentypen ...

beispiel:
Code:
array2[0] = 1;
array1 = array2;
array1[0] = 4;
System.out.println (array2[0]); // wird 4 ausgeben, weil array1 auf denselben speicher 
// wie array2 zeigt und folglich array1[0] und array2[0] den gleichen speicherbereich bezeichnen!
die zuweisung array1 = array2 bewirkt lediglich, dass beide variablen auf dieselbe speicherstelle zeigen, was man flache kopie nennt ...
um eine tiefe kopie zu machen, musst du das ganze mit einer for-schleife durchlaufen und jeden wert von array2 in array1 setzen ...

dasselbe gilt bei objekten
Code:
objekt1 = objekt2;
hier besteht im speicher nur ein objekt, das 2 mal referenziert ist!
und hier kommt der kopierkonstruktor ins spiel ... der kopierkonstruktor hat als parameter eine instanz seiner eigenen klasse
Code:
class Note
{
  public Note (Note n)
  {
  // ...
  }
}
in der implementierung des konstruktors musst du dann einfach vorgehen, wie dus in der for-schleife bei arrays machen würdest ... jeden einzelnen wert der übergebenen instanz der aktuellen instanz zuweisen ...
und genau das geschieht bei dem code, den meine vorredner schon gepostet haben!

alles verstanden?

ps: hier sieht man den nachteil von java - wer einmal mit c++ gearbeitet hat und weiß, wie wichtig die unterscheidung von referenzen, zeigern, etc. ist, dem ist auch der sinn eines kopierkonstruktors vollkommen klar ...[/code]
 

Student

Top Contributor
Michael2 hat gesagt.:
Hoffe alle Klarheiten beseitigt zu haben :autsch:
du hast gar nicht auf meine frage geantwortet:
Ben hat gesagt.:
wozu ist denn dieser teil hier überhaupt da?

der wird doch gar nicht verwendet.
Code:
public Note(Note n) 
    { 
       this.fach = n.getFach(); 
        this.zensur = n.getZensur(); 
    }

@clemensk:
danke. die anmerkungen zum copy-konstruktor werde ich mir mal näher anschauen.
 
M

Michael2

Gast
Hab ich doch schon mal geschrieben weiter oben,

der Programmteil wird nicht verwendet, da ich ihn nur von anderen rauskopiert hab und
gschwind editiert hab, lösche ihn einfach.

gruß
 
Status
Nicht offen für weitere Antworten.

Oben