# Assoziation programmieren



## Xpisto (31. Jan 2011)

Hi, ich hab folgende Aufgabe (siehe Anhang) und hab bisher das dazu programmiert, ich komme aber nicht weiter, und weiss auch nicht ob es bisher so richtig ist:


```
public abstract class Teilnehmer
	{
		private String Bezeichnung;
		
		Teilnehmer(String Bezeichnung)
		{
			this.Bezeichnung = Bezeichnung;
		}
		
		public String getBezeichnung()
		{
			return this.Bezeichnung;
		}
		
public class Sender extends Teilnehmer
{
	private Empfaenger dieEmpfaenger;
	
	Sender(String Bezeichnung)
	{
		super(Bezeichnung);
	}
	
public senden (String nachricht)
{
	return nachricht;
}

public boolean registrieren(Empfaenger dieEmpfaenger)
{
	this.dieEmpfaenger = dieEmpfaenger;
}


Public class Empfaenger extends Teilnehmer
{
	Empfaenger(String Bezeichnung)
	{
		super(Bezeichnung)
	}
	
	public void empfangen(String nachricht, Sender senden)
	{
		this.nachricht = nachricht;
		
		ab hier komme ich nicht weiter.......
```





Uploaded with ImageShack.us


----------



## Gonzo17 (31. Jan 2011)

Sieht schon recht gut aus.

dieEmpfänger ist allerdings ein Array bzw eine Liste. Da du aber laut Aufgabe keine Liste benutzen sollst, nimmst du eben ein Array mit 20 Stellen.

Beim Senden musst du dann natürlich für jeden Empfänger die Methode 
	
	
	
	





```
empfangen(String nachricht, Sender sender)
```
 aufrufen, wobei 
	
	
	
	





```
nachricht
```
 ja schon in der senden-Methode enthalten ist, und 
	
	
	
	





```
sender
```
 in diesem Fall einfach nur 
	
	
	
	





```
this
```
 ist (wird ja vom Sender aus ausgelöst).

Deine Methode zum Registrieren musst du dann natürlich auch anpassen. Würde einfach mit einer for-Schleife durch das Array laufen lassen und den ersten "freien Platz" nehmen (also zB auf null prüfen, dann musst du aber auch eben beim Löschen aus der Liste immer null an den frei werdenden Platz setzen). Sollte kein Platz frei sein, gibst du eben false zurück, wenns geklappt hat true (da kannste dann einfach aus der for-Schleife springen).

Letztendlich musst du dann natürlich noch die Methode zum Empfangen der Nachrichten vervollständigen. Hier musst du lediglich die Nachricht auf der Konsole aufgeben, also im einfachsten Fall 
	
	
	
	





```
System.out.println(nachricht)
```
, aber dazu findest auch sehr, sehr viele Beispiele im Forum oder per Google. Musst dir eben noch überlegen, wie du Sender und Nachricht am schönsten ausgeben kannst.


----------



## Andi_CH (31. Jan 2011)

Gonzo17 hat gesagt.:


> der Empfänger *ist* allerdings ein Array bzw eine Liste. Da du aber laut Aufgabe keine Liste benutzen sollst, nimmst du eben ein Array mit 20 Stellen.



Wieso "ist"? Es ist ja keine Vererbung. die Assoziation stellt nicht dar ob es "using" oder "has" ist, aber das spielt nicht so eine Rolle.

Ich würde das eher so formulieren, dass der Sender eine Liste von 20 Empfängern hat.
Er hat also einen Array der Grösse 20 von Empfängern.


----------



## Xpisto (31. Jan 2011)

Danke schonmal  Ist zwar jetzt eine blöde frage, aber könntest du mir den rest irgendwie programmtechnisch aufschrieben, ohne dass ich jetzt zuviel von dir verlange, wenn du keine zeit oder lust hast ist das natürlich verständlich, nur ich bin in diesem gebiet nicht so gut und da wäre es tol wenn ich eine musterlösung dazu hätte um mich intensiv damit zu befassen, da solche aufgaben generell in den klausuren drankommen.... 

Wäre wirklich sehr nett und toll! Dake schonmal für deine tipps!!!


----------



## Andi_CH (31. Jan 2011)

Es ist deine Hausaufgabe! Versuch mal ein einen Array der Grösse 20 zu deklarieren der Empfänger enthält - (Boah jetzt hab ich aber wirklich alles verraten!)

Es wäre auch langsam an der Zeit dass du wieder mal etwas Code von dir zeigst! Was hast du in der Zwischenzeit gemacht? Und bitte den ganzen Code. Mit Fragmenten kann man nicht sehr viel Anfangen.


----------



## Xpisto (31. Jan 2011)

Hi, ich habe in der Zwischenzeit andere Aufgaben gemacht, da ich an einer Aufgabe nicht zuviel Zeit verlieren wollte, da die Klausur in 2 wochen ist. Ich habe mich eigentlich auch gut vorberetet, aber sowas bricht mir leider immer und immer wieder das genick, ich weiss auch nicht warum, aber sobald etwas komplexeres kommt, was ich so noch nicht gemacht habe, kriege ichj eine blockade 

Wenn ich dann einmal Quelltexte habe und diese verstanden habe, kann ich diese probleme auch immer gut bewältigen, auch bei aufgaben die vollkommen anders sind, aber dasselbe prizip haben. Es ist wirklich schlimm, dieses problem verfolgt mich leider schon lange.

Ich habe jetzt versucht mich an die sache ranzuwagen, aber es ist für mich irgendwie aussichtslos


----------



## Gonzo17 (31. Jan 2011)

Andi_CH hat gesagt.:


> Wieso "ist"? Es ist ja keine Vererbung. die Assoziation stellt nicht dar ob es "using" oder "has" ist, aber das spielt nicht so eine Rolle.
> 
> Ich würde das eher so formulieren, dass der Sender eine Liste von 20 Empfängern hat.
> Er hat also einen Array der Grösse 20 von Empfängern.



Hey, nicht zitieren und dabei das Zitat ändern. 

Ich meinte es schon so, wie es da stand. dieEmpfaenger ist in dem Beispiel eine Variable, wie du schon sagst eben ein Array von Empfängern, die der Sender verwaltet.

@Xpisto

Also zuerst einmal, wenn du eine IDE wie Eclipse nutzt, werden dir schon ganz viele Dinge angezeigt. Zum Beispiel wenn eine Methode einen Rückgabewert wie boolean definiert, aber kein return da ist (das ist bei deinem Beispiel der Fall). Bei solchen Warnungen, die dir die IDE anzeigt, einfach mal schauen woran es liegt und dann sinnvoll lösen. Ansonsten habe ich dir ja schon ganz schön viel gesagt. Denn wie gesagt, der Code ist so wie er ist nicht arg falsch, die paar Ergänzungen müssen nur noch gemacht werden und dann sollte es doch eigentlich schon passen. Einfach mal Schritt für Schritt die Aufgabe abarbeiten.


----------



## Andi_CH (1. Feb 2011)

Xpisto hat gesagt.:


> ... aber sobald etwas komplexeres kommt, was ich so noch nicht gemacht habe, kriege ich eine blockade
> 
> Wenn ich dann einmal Quelltexte habe und diese verstanden habe, kann ich diese probleme auch immer gut bewältigen, auch bei aufgaben die vollkommen anders sind, aber dasselbe prizip haben. Es ist wirklich schlimm, dieses problem verfolgt mich leider schon lange.



Komplex??? Na ja, no comment.

Ganz laut NEIN. Begriffen hast du es wenn du aufgrund unserer schon mehr als genügenden Hinweise den Sourcode selber schreibst. Mach es sonst wird dich das Problem auf ewige Zeiten verfolgen.


Da fällt mir gerade etwas auf. Wenn du vom Problem verfolgt wirst heisst das, dass du vor dem Problem flüchtest. Dreht den Spiess um, verfolge das Problem mit einer gewissen Hartnäckigkeit uns es wird sich in Luft auflösen.


----------



## Xpisto (1. Feb 2011)

Ja ihr habt ale beide vollkommen recht! ich werde versuchen heute noch einen code zu posten in denen die anforderungen umgesetztt wurden, ich gebe mein bestes.


----------



## Xpisto (1. Feb 2011)

Hallo Leute, da bin ich wieder, auch mit neuem COde, vllt könnt ihr mal drüber schauen, bin noch nicht fertig, hänge an der senden und empfangen methode, die registrieren methode msse nun so funktionieren ...hoffe ich

[Java]
public abstract class Teilnehmer {

	private String Bezeichnung;

	public Teilnehmer (String Bezeichnung)
	{
		this.Bezeichnung = Bezeichnung;
	}

	public String getBezeichnung()
	{
		return this.Bezeichnung;
	}

}


------------------



public class Sender extends Teilnehmer{

	private String nachricht;
	private final int MAXempf = 20;
	private Empfaenger[] dieEmpfaenger = new Empfaenger [MAXempf];
	private int anzEmpf;

	public Sender(String Bezeichnung)
	{
		super(Bezeichnung);
		anzEmpf = 0;
	}

	public void senden(String nachricht)
	{

		this.nachricht = nachricht;
	}

	public boolean registrieren(Empfaenger einEmpfaenger)
	{
		boolean registriert;

			if (anzEmpf < dieEmpfaenger.length)
			{
				dieEmpfaenger[anzEmpf] = einEmpfaenger;
				anzEmpf++;
				registriert = true;
			}

			else
				registriert = false;
				return registriert;
	}


}


-------------------


public class Empfaenger extends Teilnehmer {

	private String nachricht;


	public void empfangen (String nachricht, Sender sender)
	{


	}


}

[/code]


----------



## Andi_CH (2. Feb 2011)

Das sieht schon mal gut aus - nun noch in der Routine "senden" den String nicht nur speichern (was eigentlich gar nicht nötig ist) sondern diesen in einer geeigneten Schleife gleich an die Empfänger senden.


----------



## Gonzo17 (2. Feb 2011)

Jup und dann in der empfangen-Methode der Empfänger eben die Ausgabe auf der Konsole. Als Anregung, du kannst vielleicht versuchen das so auszugeben:

"Sender" an "Empfaenger": "Nachricht"

Wobei du dann eben die Worte in Hochkomme ersetzt mit den entsprechenden Werten der Parameter, die du ja alle zur Verfügung hast.


----------



## Xpisto (4. Feb 2011)

Boah ich bin echt zu blöd, ich komme einfach nicht weiter, das ist mein letzter Stand:


```
public abstract class Teilnehmer {
	
	private String Bezeichnung;
	
	public Teilnehmer (String Bezeichnung)
	{
		this.Bezeichnung = Bezeichnung;
	}
	
	public String getBezeichnung()
	{
		return this.Bezeichnung;
	}

}



public class Sender extends Teilnehmer{
	
	private String nachricht;
	private final int MAXempf = 20;
	private Empfaenger[] dieEmpfaenger = new Empfaenger [MAXempf];
	private int anzEmpf;
	
	public Sender(String Bezeichnung)
	{
		super(Bezeichnung);
		anzEmpf = 0;
	}
		
	public void senden(String nachricht)
	{
		int tmp = 0;

        for(int i = 0; i <= dieEmpfaenger.length; i++)
        {
           
            
        }
		
	}
	
	public boolean registrieren(Empfaenger einEmpfaenger)
	{
		boolean registriert;
	
			if (anzEmpf < dieEmpfaenger.length)
			{
				dieEmpfaenger[anzEmpf] = einEmpfaenger;
				anzEmpf++;
				registriert = true;
			}
			
			else
				registriert = false;
				return registriert;
	}
	

}



public class Empfaenger extends Teilnehmer {
	
	Empfaenger(String Bezeichnung)
	{
		super(Bezeichnung);
	}
	
	 public void empfangen(String nachricht, Sender sender)
	    {
	        
		 	System.out.println(nachricht);
	        System.out.println(sender);
	    }

}
```

Ich verzweifle wirklich, am 15. ist die Klausur und ich muss vorher wenigstens einmal ein korrektes programm dieser art vor mir liegen haben, da man in die Klausur ein dina 4 blatt mitnehmen darf als hilfsmittel.


----------



## JohannisderKaeufer (4. Feb 2011)

Xpisto hat gesagt.:


> Boah ich bin echt zu blöd, ich komme einfach nicht weiter, das ist mein letzter Stand:
> 
> [JAVA=36]
> for(int i = 0; i < anzEmpf; i++) //Es soll ja nur an die gesendet werden die eingetragen sind, der Rest des Arrays ist ja leer, daher nur bis zu anzEmpf
> ...


_

dieEmpfaenger liefert den iten Empfaenger.
Damit dieser was empfängt rufst du auf diesem Empfänger empfangen auf.
Dazu reichst du ihm die Nachricht weiter, und den Sender selbst durch das this._


----------



## Xpisto (4. Feb 2011)

SUPER vielen DANK  Ich glaube allerdings es stimmt was mit meiner empfangen methode nicht kann dass sein?


----------



## JohannisderKaeufer (5. Feb 2011)

Prinzipiell sieht die empfangenmethode ok aus.

```
System.out.println(sender);
```
ruft auf dem sender Objekt die toString() methode auf. Diese ist sofern sie nicht überschrieben ist
die der Klasse Objekt. => hash@KlassenName oder so ähnlich.

Entweder du Überschreibst die toString() Methode in Teilnehmer

```
public String toString(){
return this.bezeichnung;
}
```

oder in Sender z.B.

```
public String toString(){
return "Sender: "+this.getBezeichnung();
}
```

oder du änderst die Ausgabe in deiner empfangen-Methode


```
System.out.println("Sender: "+sender.getBezeichnung());
```


----------



## Xpisto (6. Feb 2011)

Hmm ok klappt, nur hab ich das gefühl in der empfänger methode is ein knick in der logik. Denn wenn ich in der main das objekt sender erzeuge und mit diesem sende und daraufhin mit dem objekt empfänger1 die methode empfangen aufrufe, muss ich nach der aufgabe in der empfangen methode nochmal eine nachricht eingeben. Somit wird natürlich nur die nachricht übergeben die ich in der empfangen methode reingeschrieben habe, aber nicht die nachricht die ich mit der senden methode rüberschicken wollte... also dass sieht so aus in der main:


```
public static void main (String args[])
	{
		Empfaenger e1 = new Empfaenger("Ich bin empfänger");
		Sender s1 = new Sender("Ich bin sender");
		
		s1.senden("ich schicke dir eine nachricht");
		e1.empfangen( <<<Hier wird ein String erwartet!??>>>>, s1);
	}
```

Hoffe ich habs gt beschrieben wie ich es meinte  Danke schonmal für die nette hilfe von allen!


----------



## Gonzo17 (7. Feb 2011)

Da hast du wohl etwas falsch verstanden. So wie ich das verstehe musst du da anders vorgehen. Sobald du Empfaenger e1 und Sender s1 erstellt hast (das passt so) musst du den Empfaenger beim Sender registrieren. Danach sendet der Sender s1 eine Nachricht und jetzt sollte (ohne dass du noch irgendwas tun musst) für jeden registrierten Empfaenger (also hier nur e1) die Methode 
	
	
	
	





```
empfangen(...)
```
 aufgerufen werden - aber eben wie gesagt nicht von dir, sondern "automatisch". Hast du ja in der 
	
	
	
	





```
senden(...)
```
-Methode, wie JohannisderKaeufer sie beschrieben hat, dann auch drin.


----------



## Andi_CH (7. Feb 2011)

Die Methode 
	
	
	
	





```
senden("Meldung")
```
  muss beim Empfänger 
	
	
	
	





```
emfangen(nachricht)
```
 aufrufend - sicher nicht das Main!

Himmel nochmals: Programmieren beginnt auf dem Papier! Zeichne dir doch einfach auf wer wann was machen sollte - es ist doch so klar um nicht zu sagen banal.

Nur der Sender weiss (hoffentlich!) welche Empfänger sich bei ihm registriert haben und kann denen die Meldung schicken - das Main weiss rein gar nichts.

Ach ja, Erpressungsversuche "ich hab die Klausur am 15." - hm warum sollen die uns beeindrucken? Ist ja nicht unsere Klausur.

EDIT:
Du hast eine gegenseitig Abhängigkeit zwischen Sender und Empfänger - das ist schon mal schlecht
Der Empfänger muss/darf den Sender nicht kennen, da schon der Sender den Empfänger kennt- entweder er kennt Teilnehmer und holt sich so den Namen oder er bekommt einen String mit dem Namen des Senders. Aber ich hab ja noch eine Woche Zeit bis ich dir meine Lösung gebe.

Du hast jetzt noch eine Woche zeit die letzte Zeile Code selbst zu schreiben oder einen Dummen zu findenden sie für dich schreibt.


```
public class Test {
	public static void main(String[] args) { 
		Sender sender1 = new Sender("Sender 1");
		Sender sender2 = new Sender("Sender 2");
		Empfaenger empf1 = new Empfaenger("Empfänger 1");
		Empfaenger empf2 = new Empfaenger("Empfänger 2");
		Empfaenger empf3 = new Empfaenger("Empfänger 3");
		sender1.registrieren(empf1);
		sender1.registrieren(empf2);
		sender2.registrieren(empf2);
		sender2.registrieren(empf3);
		sender1.senden("Nachricht 1");
		sender2.senden("Nachricht 2");
	}
}
```

output:

```
Empfänger 1 empfängt die Meldung Nachricht 1 von Sender 1
Empfänger 2 empfängt die Meldung Nachricht 1 von Sender 1
Empfänger 2 empfängt die Meldung Nachricht 2 von Sender 2
Empfänger 3 empfängt die Meldung Nachricht 2 von Sender 2
```


```
public class Sender extends Teilnehmer {
	private final int MAXempf = 20;
	private Empfaenger[] dieEmpfaenger;

	public Sender(String bezeichnung) {
		super(bezeichnung);
		dieEmpfaenger = new Empfaenger [MAXempf];
	}

	public boolean registrieren(Empfaenger einEmpfaenger) {
		boolean registriert =  false;
		for (int i=0; i<MAXempf && !registriert; i++)
			if(dieEmpfaenger[i] == null) {
				dieEmpfaenger[i] = einEmpfaenger;
				registriert = true;
			}
		return registriert;
	}

	public void senden(String nachricht) {
		for(int i = 0; i < MAXempf; i++) {
			if (dieEmpfaenger[i] != null)
				// do it yourself ...
		}
	}
}
```


```
public class Empfaenger extends Teilnehmer {
	Empfaenger(String Bezeichnung) {
		super(Bezeichnung);
	}
	public void empfangen(String nachricht, String sender) {
		// das schenke ich dir
		System.out.println(getBezeichnung() + " empfängt die Meldung " + nachricht + " von " + sender);
	}
}
```


```
public abstract class Teilnehmer {

	private String mBezeichnung;

	public Teilnehmer (String bezeichnung) {
		mBezeichnung = bezeichnung;
	}

	public String getBezeichnung() {
		return mBezeichnung;
	}
}
```


----------



## Gonzo17 (7. Feb 2011)

Andi_CH hat gesagt.:


> Himmel nochmals: Programmieren beginnt auf dem Papier! Zeichne dir doch einfach auf wer wann was machen sollte - es ist doch so klar um nicht zu sagen banal.



Ich will dir ja nicht zu nahe treten, aber vielleicht solltest du dich da einfach mal ein bisschen zurücknehmen. Dass manche Menschen bestimmte Sachverhalte langsamer erkennen als andere ist völlig natürlich. Nicht jeder Mensch ist als Meister vom Himmel gefallen, die meisten Menschen müssen sich mit einem Thema erst intensiv auseinandersetzen, bevor sie "drin sind". Und da muss man als "Profi" auch einfach mal akzeptieren, dass jemand grundlegende Dinge nicht sieht, auch wenn es "so klar" ist. Und es zwingt dich ja auch keiner, dich hier um diese Leute zu kümmern. 



Andi_CH hat gesagt.:


> Ach ja, Erpressungsversuche "ich hab die Klausur am 15." - hm warum sollen die uns beeindrucken?



Diese Aussage ist aber auch mal völlig unnötig... Wie gesagt, es zwingt dich keiner ihm zu helfen.


----------



## Andi_CH (7. Feb 2011)

Sachverhalte??? 

1 + 1 = 2
1 + 2 = 3

oder ist das schon zu hoch?

Es wurde ja sämtliche Fragen schon beantwortet 

--
Montag morgen - ich darf das ...


----------



## Xpisto (8. Feb 2011)

Danke an alle, und Gonzo hat es auf den Punkt gebracht, ich betrachte das ganze hier in keinem Fall als eine Selbstverständlichkeit das mir jemand hilft, ich bin nun mal nicht der Meister im Programmieren und versuche wirklich alles nachzuvollziehen und zu programmieren auch wenn es mir nicht leicht fällt. Natürlich sind die meisten User die sich in diesem Forum bewegen besser in der Sache was Sie tun und haben wohlmöglich auch mehr Erfahrung. Ich möchte mich auch nicht nur auf eure Hilfe berufen, sondern ich frage soviel weil ich es verstehen möchte....

Das mit den 15. war keinesfalls ein Erpressungsversuch, es sollte lediglich nur darstellen dass ich hier keine Hausaufgaben reinstelle um Sie dann meinen Dozenten zu präsentieren, sondern es sich um Aufgaben handeln, die aus alten Klausuren stammen und ich mich damit für die Klausur am 15. intensiv befassen wollte.

Ich bedanke mich für jeden Tipp, für jeden Quellcode und für die Hilfsbereitschaft, und möchte nochmals betonen dass ich das Forum nicht nur ausnutze. Wenn ich einen Thread sehe wo ich helfen kann, auch wenn meine Kenntnisse bezüglich Javacoden nicht die besten sind, so versuche ich dennoch zu helfen. Mich hat das Forum sehr weit gebracht, ich habe mich durch den Ansporn von euch dazu gebrahct mich an AUfgaben zu trauen die für mich auf den ersten Blick unmachbar erscheinen, und dafür Danke.


----------

