C# C#-Schulaufgabe (Container)

Griffindor01

Cadet 3rd Year
Registriert
Feb. 2021
Beiträge
33
Hallo liebe Gemeinde,

Ich gehe zurzeit in die 11. Klasse eines Gymnasiums und lerne im fachrichtungsbezogenen Unterricht die Grundlagen von C#.

Ich komme nun bei einer Aufgabenstellung nicht weiter und würde mich sehr über eure Hilfe freuen.


Die eigentliche Frage fängt erst ab Aufgabe 4 an, das davor ist nur eine Erläuterung.

Kurze Vorabinfo:
Im Vorhinein haben wir zwei Klassen (Person und Adressen) erstellt.
In der Klasse Adresse ist eine Adresse in verschiedene Attribute (wie Hausnummer, Postleitzahl) etc gegliefert worden.
In der Klasse Person haben wir einen Vor-und Nachnamen, ein Geburtsdatum und ein Objekt der Klasse Adresse eingespeist.

Nun sollen wir mit Containern verschiedene Operationen an diesen Klassen vornehmen.

Aufgabe 1 war zum Beispiel:

1. Ergänzen Sie das Projekt zur Adressverwaltung um eine Liste personen.

Lösung:

List<Person> personen = new List<Person>();

2.
Erstellen Sie im Programm mindestens fünf Person-Objekte auf verschiedene Arten.
Nutzen Sie hierzu sowohl den Standardkonstruktur als auch den überladenen Konstruktor.
Nehmen Sie alle Person-Objekte in die Liste personen auf.

Lösung (exemplarisch für die 5 Personen):

Person Mustermann = new Person();
Person XY = new Person("Computerbase", "Forum", new DateTime(2002, 05, 09), new Adresse("Musterweg", "1", "74565", "Berlin"));

personen.Add(Mustermann);
personen.Add(XY);


3. Zeigen Sie die Daten aller Person-Objekte mit einer foreach-Schleife.

Lösung:

foreach (Person person in personen)

{


Console.WriteLine(
person.getVorname() + "\n" +
person.getNachname() + "\n" +
person.getGeburtstag().ToShortDateString() + "\n" +
person.getAdresse().getPlz() + "\n" +
person.getAdresse().getOrt();




Console.WriteLine("===============");



}




Soweit, sogut, nun ist Aufgabe 4.:


Bisher kann für ein Person-Objekt nur ein einziges Adresse-Objekt gespeichert werden.
Ändern Sie die Klasse Person so ab, dass mehrere Adressen für ein Person-Objekt gespeichert
werden können!
Entfernen Sie die setAdresse()-Methode und fügen Sie stattdessen die neue Methode
addNeueAdresse(_adr:Adresse):void hinzu.
Diese neue Methode bekommt ein Adresse-Objekt übergeben und fügt diese einer Liste
von Adresse-Objekten hinzu.
Ändern Sie die Methode getAdresse():Adresse so ab, dass die Liste mit den Adresse-
Objekten zurückgeliefert wird.
Bennen Sie die Methode entsprechend um; z.B. in getAdressliste().


und zu Aufgabe 5:

Fügen Sie in die foreach-Schleife aus Aufgabe 3 geschachtelt eine zweite foreach-
Schleife ein, die bei jedem Person-Objekt alle Adresse-Objekte ausgibt.




Hier komme ich nun nicht weiter, ich habe euch meine Versuche mal als Anhäng beigefügt.
Das mit der zweiten foreach-Schleife verwirrt mich, da weiß ich gar nicht, wie ich das umsetzen soll.
Habe jetzt mal probiert, die Liste an der Stelle 1 (sollte dann doch nach dem Index das 2. Element sein) auszugeben, aber sowohl wenn ich dort 0 als auch 1 eintrage, kommt eine Fehlermeldung, dass es diese Stelle nicht gäbe, obwohl doch nachweislich Elemente hinzugefügt wurden?!
Außerdem löst das das Problem ja auch nicht, weil automatisch alle Adressen ausgegeben werden sollen und nicht die Adresse(n) an einer bestimmten Stelle.


Ich hoffe sehr, jemand macht sich die Mühe und liest sich das ganze hier mal durch. Stehe echt auf dem Schlauch.


Ich bedanke mich im Voraus!
1.PNG
2.PNG
3.PNG
 
Also, deine Methode addNeueAdresse tut ja nicht das was laut Aufgabenbeschreibung und auch dem Namen der Methode nach gefordert ist.

So wie du eine Liste aus Personen hast, zu der du beliebig viele Personen-Objekte hinzufügen und in einer for each Schleife durchgehen und ausgeben kannst, ist dies analog dazu auch für die Adressen gedacht. Das heißt, dass die Klasse Person statt einer einzelnen Adresse eine Liste von Adressen enthalten sollte. Neue Adressen werden mit der besagten Methode zu dieser Liste hinzugefügt.

Der Abruf der Liste mit der zweiten for each Schleife soll dementsprechend verschachtelt erfolgen. For each über alle Personen und innerhalb einer Iteration wird eben die Adressliste der aktuellen Person - mit getAdressListe abgerufen - mit einer inneren for each Schleife ausgegeben.
Dazu muss getAdressListe natürlich auch das tun was der Name impliziert, eine Adressliste zurückgeben.
 
lasbo schrieb:
Hatte ich vergessen, mit anzuhängen. Sorry
Habe hier oben die Liste adressen erstellt und wollte dann im Code unten 2 Adressen hinzufügen.
Vielleicht meinst du aber auch etwas anderes, stehe echt voll auf dem Schlauch
 

Anhänge

  • 555.PNG
    555.PNG
    3,7 KB · Aufrufe: 261
Zuletzt bearbeitet von einem Moderator:
Warum fügst du denn in deiner Methode "AddNeueAdresse" zwei Adressen hinzu? Und warum der Umweg über adresse?
 
Ne, sorry. Das wäre nicht im Sinne des Erfinders bzw. Aufgabenstellers.


Dein Code für die Personen:

Code:
foreach (Person person in personen)
{
   Console.WriteLine(
      person.getVorname() + "\n" +
      person.getNachname() + "\n" +
      person.getGeburtstag().ToShortDateString() + "\n" +
      person.getAdresse().getPlz() + "\n" +
      person.getAdresse().getOrt();
   Console.WriteLine("===============");
}

Dies bezieht sich bei getAdresse() darauf, dass als Rückgabewert ein Objekt vom Typ Adresse zurückgegeben wird, dessen getPlz() und getOrt() du aufrufst, um die Adresse auszugeben. Genau an dieser Stelle sollst du eben nicht ein Adressen-Objekt zurückgeben, sondern eine Liste von Adressen - wie die Liste an Personen, die du ja bereits generiert und befüllt hast. Eben diese Liste gehst du dann mit foreach genau so durch wie du es mit den Personen gemacht hast, verschachtelt. Analog zu einer verschachtelten Scheife wie folgt:


Code:
for (int i = 0; i < 10; i++)
{
   for (int j = 0; j < 10; j++)
   {
      Console.WriteLine(i * 10 + j);
   }
}
Das ist natürlich ein unnötig komplizierter Weg, um von 0 bis 99 zu zählen, aber es verdeutlicht, dass wir eine äußere Schleife haben, die sozusagen die 10er Schritte zählt (Variable i) - deine Personen - und die innere zählt die 1er Schritte (Variable j) des jeweiligen aktuellen 10ers - die Adressen der aktuellen Person. Das ganze jetzt mit foreach über die Personen iteriert und dann innerhalb der Iteration über die Adressen der aktuellen Person iteriert und fertig.

Oder auch in Kurzform: Nimm deine foreach, ersetze Person, person und Personen mit Adresse, adresse und Adressen, füge bei letzterem noch das Mutterobjekt der Person hinzu und passe die Console.WriteLines an, dass sie die Adresse(n) ausgeben.
 
  • Gefällt mir
Reaktionen: Griffindor01 und lasbo
GroMag schrieb:
Raijin schrieb:
Hab mir das ganze jetzt über eine halbe Stunde lang angesehen und drehe fast durch. Aus irgendeinem Grund verstehe ich nicht, was Sache ist, habe wohl einen ganz dicken Denkfehler, mit den vorherigen gegebenen Arbeitsblättern hatte ich bisher nie so große Probleme gehabt und alles recht schnell verstanden. ...Konstruktoren.PNG
Das sind die Konstruktoren. Darunter auch für die Adressen. Die selber gewählte Adresse (durch den überladenen Konstruktor oder den Standard-Konstruktor) hat den Parameter _adr und wird dann dem Attribut adresse zugewiesen. Also muss ich doch folglich adresse einer Adressen-Liste addNeueAdresse übergeben? Bitte, schickt mir einer den korrekten Code, ich bin hier gerade nur am verzweifeln, denke nur so kann es klick machen.
 

Anhänge

  • AddAdresse.PNG
    AddAdresse.PNG
    5,7 KB · Aufrufe: 275
  • getAdressenListe.PNG
    getAdressenListe.PNG
    4,6 KB · Aufrufe: 278
Zuletzt bearbeitet von einem Moderator:
Fertigen Code solltest du hier eigentlich nicht bekommen, weil keiner deine Hausaufgaben lösen sollte. Man kann Hilfestellung geben, aber mehr verstößt einfach gegen die Forenregeln, wenn keine Eigenleistung erkennbar ist. Du schreibst immer nur, dass du die Hilfestellung nicht verstehst, erklärst aber nicht WAS du daran nicht verstehst - und offen gestanden verstehe ich auch nicht was du daran nicht verstehst. Wenn du den bisherigen Code selbst geschrieben und ihn auch verstanden hast, solltest du mit den Infos aus #8 kein Problem mit Aufgabe4 haben. Du hast bereits in #1 alles nötige beisammen - zB das durchlaufen einer Liste mit foreach und den Zugriff auf die Informationen aus dem Objekt aus der aktuellen Iteration - und mit #8 kombiniert kann es nicht so schwierig sein, das Adress-Objekt im Person-Objekt in eine Liste umzuwandeln und dann eine foreach-Schleife in einer foreach-Schleife zu fabrizieren, die für jede Person dann jede ihrer jeweiligen Adressen ausgibt. Und wenn du das wirklich nicht verstanden hast, möchte ich fast behaupten, dass du den Rest, den du bisher schon hast, ebenfalls nicht verstanden hast.


Schreib hier bitte einfach mal rein was du aus #1 mit den Infos aus #8 nun gebastelt hast und dann kann man konkret helfen. Das Forum ist aber nicht dazu da, deine Hausaufgaben abschreibfertig zu servieren.



Ein paar Hinweise zu deinen Code-Screenshots aus #9:

Konstruktor Person: Wenn dort _adr übergeben wird, zwingt dich niemand, dies 1:1 in eine Membervariable zu packen, sondern du kannst auch im Konstruktor AddAdresse aufrufen oder ggfs direkt adressen.Add aufrufen. Es soll ja kein einzelnes Adresse-Objekt mehr geben, sondern eine "Liste von Adressen", auf Englisch übersetzt eine "List of Adresses" was doch sehr ähnlich aussieht wie List<Adresse> oder nicht?

AddAdresse: Du kannst doch direkt adressen.Add(_adr) machen, wozu voher noch auf eine Zwischenvariable adresse setzen? Unnötig.






Übrigens: Verwende bitte Code-Tags, wenn du Quellcode posten willst. Einfach so:
[code]Hier dein Quellcode[/code]
 
In der Tat, aber dann müsste ich am Ende noch Screenshots davon machen, weil der Button nicht gefunden wird. Man kann die Sprache aber auch im Code-Tag angeben: [CODE=csharp]Ganz viel C#-Code[/CODE]
 
  • Gefällt mir
Reaktionen: Hayda Ministral
Raijin schrieb:
Okay, werde jetzt immer Code-Tags nutzen
Ergänzung ()

C#:
public void addNeueAdresse(Adresse _adr)
        {
            
            
            adressen.Add(_adr);
            


        }

        public List<Adresse> getAdresseListe()
        {

            return adressen;
            
            

        }


Ist dieser Bestandteil nun richtig bzw. nun besser geschrieben?
Habe das jetzt so verstanden, dass die eine Adresse (so wie vorher schon) vom Konstruktor übergeben wird und weitere Adressen händisch der Liste hinzugefügt werden müssen.
Jetzt stoße ich auf das Problem, dass ich die Liste adressen in meiner Klasse Person initialisiert habe und in der Main jetzt aber nicht darauf zugreifen kann, um beispielsweise die Liste durchzugehen
 
Zuletzt bearbeitet: (Vollzitate entfernt)
Ja, sieht jetzt besser aus. Zu deinem Problem mit dem Durchgehen der Liste, genau dafür hast du doch getAdresseListe(), damit du von einer Person die entsprechenden Adressen zurückbekommst.

In deiner ursprünglichen Schleife benutzt du ja auch schon die entsprechender Getter-Methoden auf ein Person-Objekt, um an die gewünschten Informationen zu kommen.

Dein "person.getVorname()" ist ja nichts anderes, als über die Getter-Methode "getVorname()" beim Objekt "person" den Vornamen zurückzugeben.

Wenn du jetzt also von einem Person-Objekt die Adressen haben willst, dann hast du ja auch dafür jetzt eine neue Get-Methode, deine "getAdresseListe()".

C#:
foreach (Person person in personen)
{
   Console.WriteLine(
      person.getVorname() + "\n" +
      person.getNachname() + "\n" +
      person.getGeburtstag().ToShortDateString() + "\n" +
      person.getAdresse().getPlz() + "\n" +
      person.getAdresse().getOrt();
   Console.WriteLine("===============");
}

Hast du denn diese ForEach richtig verstanden? Vielleicht hilft es dir bei deinem Problem, wenn du dir hier Schritt für Schritt diese ForEach durchgehst, Das beginnt dann direkt in der ersten Zeile. Gern kannst du deine Erklärung auch hier mit uns teilen.
 
C#:
foreach (Person person in personen)

            {
                Console.WriteLine(
                person.getVorname() + "\n" +
                person.getNachname() + "\n" +
                person.getGeburtstag().ToShortDateString() + "\n");
            
                

             foreach (Adresse adresse in adressen)
             {

                    person.getAdresseListe();



             }

Habe es mal so probiert, ist das vom Prinzip her richtig?
Wie gesagt, ein Problem ist aber noch, dass ich die in der Klasse Personen initialisierte Liste Adressen in der Main nicht nutzen kann für meine foreach-Schleife, wie kriege ich das hin?
Ergänzung ()

DrCox1911 schrieb:
Ja, sieht jetzt besser aus. Zu deinem Problem mit dem Durchgehen der Liste, genau dafür hast du doch getAdresseListe(), damit du von einer Person die entsprechenden Adressen zurückbekommst.

In deiner ursprünglichen Schleife benutzt du ja auch schon die entsprechender Getter-Methoden auf ein Person-Objekt, um an die gewünschten Informationen zu kommen.

Dein "person.getVorname()" ist ja nichts anderes, als über die Getter-Methode "getVorname()" beim Objekt "person" den Vornamen zurückzugeben.

Wenn du jetzt also von einem Person-Objekt die Adressen haben willst, dann hast du ja auch dafür jetzt eine neue Get-Methode, deine "getAdresseListe()".

C#:
foreach (Person person in personen)
{
   Console.WriteLine(
      person.getVorname() + "\n" +
      person.getNachname() + "\n" +
      person.getGeburtstag().ToShortDateString() + "\n" +
      person.getAdresse().getPlz() + "\n" +
      person.getAdresse().getOrt();
   Console.WriteLine("===============");
}

Hast du denn diese ForEach richtig verstanden? Vielleicht hilft es dir bei deinem Problem, wenn du dir hier Schritt für Schritt diese ForEach durchgehst, Das beginnt dann direkt in der ersten Zeile. Gern kannst du deine Erklärung auch hier mit uns teilen.

Die ForEach-Schleife sollte ich denke ich schon verstanden haben.

Hier meine Erläuterung:
Für jedes Element des Typs (der Klasse) Person, das exemplarisch die Variable person enthält, in der Liste personen:

Gib mir den Vornamen mit der Get-Methode aus (der Person, die gerade durchlaufen wird)
Gib mir den Nachnamen mit der Get-Methode aus (der Person, die gerade durchlaufen wird)
usw.
 
Zuletzt bearbeitet:
C#:
foreach (Person person in personen)

            {
                Console.WriteLine(
                person.getVorname() + "\n" +
                person.getNachname() + "\n" +
                person.getGeburtstag().ToShortDateString() + "\n");
                List<Adresse> adressen = person.getAdresseListe();

                foreach (Adresse adresse in adressen)

                {

                    Console.WriteLine(adresse);


                }

Hier nochmal ein Versuch. Dachte schon, ich hätte es jetzt, aber leider auch erfolglos..[/CODE]
 
Probier mal die Rückgabe von getAdresseListe() für Dein foreach zu verwenden:

C#:
             foreach (Adresse adresse in person.getAdresseListe())
             {
...
             }

Edit: Vorher holen geht auch .. aber Du musst ja noch je nachdem wie die Funktionen in Adresse heissen:
C#:
Console.WriteLine( adresse.getPlz() + "\n" + adresse.getOrt());
 

Ähnliche Themen

Zurück
Oben