Lägga till saker i en List, sen loopa igenom den med foreach?

Permalänk

Lägga till saker i en List, sen loopa igenom den med foreach?

Jag håller på med ett projekt för programmering 2 (största jag har jobbat på hittills) och jag sitter fast lite här, jag försöker lägga till "djur" i en lista och sen kunna loopa igenom listan med (vad jag tror är bäst) en foreach loop.
Men hittills får jag endast resultatet: ,0 ,0 ,0 ,0
Det är nere i Petowner.

Jag tar mer än gärna kritik & tankar om resten av koden!
(koden är långt ifrån klar dock)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace JoppesDjurfamiljV2 { class Program { public static void Main(string[] args) { Petowner petowner = new Petowner(); Cat cat = new Cat("Meelo", 11); Dog dog = new Dog("Sassa", 7); Puppy puppy = new Puppy("Majken", 6); petowner.Menu(); } } abstract class Animal { protected int age { get; set; } protected string name { get; set; } protected string fav_food { get; set; } protected string breed { get; set; } protected bool hungry { get; set; } public Animal() { } public virtual void Interact() // Play with animals { } public virtual void HungryAnimal() // Behaviour if animals is hungry (standard whining) { } public void Eat(string food) // Offers animals food, in string { } public override string ToString() { return base.ToString(); } } class Petowner : Animal { private int age { get; set; } private List<Animal> pets = new List<Animal>(); public Petowner() { pets.Add(new Cat("Meelo", 11)); pets.Add(new Dog("Sassa", 7)); pets.Add(new Puppy("Majken", 1)); pets.Add(new Cat("Ellie", 3)); } public void ListAnimals() { Console.Clear(); foreach (var animal in pets) { Console.WriteLine(animal); } Console.ReadKey(); } public void Play() // Sub-menu { Console.Clear(); Console.WriteLine("Vilket djur vill du leka med?\n---------------------"); } public void Feed() // Sub-menu { Console.Clear(); Console.WriteLine("Vilket djur vill du mata?\n---------------------"); } public void Menu() // Main menu { int x = 0; do { Console.Clear(); Console.WriteLine("Hej Joppe! Vad vill du göra?\n---------------------"); Console.WriteLine("1. Leka med djuren"); Console.WriteLine("2. Mata djuren"); Console.WriteLine("3. Se alla djur"); Console.WriteLine("4. Avsluta program\n---------------------"); Console.WriteLine("Skriv med siffror, tack!"); x = Int32.Parse(Console.ReadLine()); if (x == 1) { Play(); break; } else if (x == 2) { Feed(); break; } else if (x == 3) { ListAnimals(); break; } else { Console.Clear(); Console.WriteLine("Det va inte ett av valen.. Prova igen!"); Console.ReadKey(); break; } } while (x != 4); Console.Clear(); Console.WriteLine("Programmet avslutas...\n---------------------\nTryck på valfri tangent"); Console.ReadKey(); } public override string ToString() { return base.ToString(); } } class Cat : Animal { public Cat(string name, int age) { } public override void HungryAnimal() // (Without food) hunts his own food. 50/50 he finds anything { Console.Clear(); Console.WriteLine(""); } public override void Interact() { Console.Clear(); Console.WriteLine("Katten stryker sig mot dig, medans du klappar den"); Console.WriteLine("Tryck Enter för att gå tillbaka till menyn"); Console.ReadKey(); } public override string ToString() { return string.Format("{0}, {1}", name, age); } } class Dog : Animal { public Dog(string name, int age) { } public override void Interact() { Console.Clear(); Console.WriteLine(""); } public override string ToString() { return string.Format("{0}, {1}", name, age); } } class Puppy : Dog { public Puppy(string name, int age) : base("", 0) { } public override void Interact() { Console.Clear(); Console.WriteLine(""); } public override string ToString() { return string.Format("{0}, {1}", name, age); } } }

Permalänk
Medlem

Egentligen ingen aning då jag inte är bekant med vad som ser ut at vara C# (?).
Men en tanke som slog mig var: är namnet på listan skiftlägeskänslig? Du har definierat den som Animal men kallar på den med animal.

Edit: Eller så missförstår jag, animal kanske bara är en vanlig räknare...
Edit2: Förstår sig en Console.WriteLine på vad new Cat("Ellie", 3) är för något? Det är ju mer komplex än en string eller en int.

Permalänk
Medlem
Skrivet av PickleRick137:

Men hittills får jag endast resultatet: ,0 ,0 ,0 ,0

Var sätter du värdena på variablerna du skriver ut? Debuggern är din vän.

Petowner kan förvisso ärva från Animal, men det är antagligen inte så du vill ha det.

Fundera på vad du har för nytta av en implementation av ToString() som bara anropar basklassens ToString() i Animal-klassen. Tips: När du har samma kod i flera olika klasser i en arvshierarki så har du antagligen gjort något "fel".

Permalänk
Skrivet av KAD:

Var sätter du värdena på variablerna du skriver ut? Debuggern är din vän.

Petowner kan förvisso ärva från Animal, men det är antagligen inte så du vill ha det.

Fundera på vad du har för nytta av en implementation av ToString() som bara anropar basklassens ToString() i Animal-klassen. Tips: När du har samma kod i flera olika klasser i en arvshierarki så har du antagligen gjort något "fel".

Värdena sätts under listan, i public Petowner, men jag vet dock inte om det är korrekt ställe att göra det på hehe. (väldigt ny till programmering)
Uppgiften handlar om arv & polymorphism, 2 helt nya koncept för mig..
Jag ska ju använda mig av ToString() jag satte "return base.ToString();" på dom jag inte vet vad jag skriva där än x)

Permalänk
Skrivet av warp64:

Egentligen ingen aning då jag inte är bekant med vad som ser ut at vara C# (?).
Men en tanke som slog mig var: är namnet på listan skiftlägeskänslig? Du har definierat den som Animal men kallar på den med animal.

Edit: Eller så missförstår jag, animal kanske bara är en vanlig räknare...
Edit2: Förstår sig en Console.WriteLine på vad new Cat("Ellie", 3) är för något? Det är ju mer komplex än en string eller en int.

Det är c#
Om jag förstår det rätt så kan listan anropas med "pets" jag kan dock ha fel hehe
"foreach (var animal in pets) Console.WriteLine(animal)" borde skriva ut alla djur i listan

Permalänk
Medlem

Skulle du kunna ladda upp informationen angående hur ni ska göra uppgiften?
Blir nog lättare att hjälpa dig därifrån.

Permalänk
Medlem

Värdena du skickar in i djur klassernas constructor gör inget med dem, som du har skrivit nu så blir alla "" och 0

Permalänk
Medlem
Skrivet av PickleRick137:

Jag håller på med ett projekt för programmering 2 (största jag har jobbat på hittills) och jag sitter fast lite här, jag försöker lägga till "djur" i en lista och sen kunna loopa igenom listan med (vad jag tror är bäst) en foreach loop.
Men hittills får jag endast resultatet: ,0 ,0 ,0 ,0

Vilket den verkar göra, antagligen returnerar toString() för en abstrakt klass "0", ingen aning om det är så men är inte orimligt att den är definierad så.

Du vill nog lägga till t.ex. namn där istället, ev. konkatenerat med ålder. Dvs.

public override string ToString() { return name; }

Edit:

Skrivet av PickleRick137:

Det är c#
Om jag förstår det rätt så kan listan anropas med "pets" jag kan dock ha fel hehe
"foreach (var animal in pets) Console.WriteLine(animal)" borde skriva ut alla djur i listan

Console.WriteLine() behöver också göra ett toString för att "konvertera" objektet till text, så borde också bara bli nollor nu.

Edit 2:
https://xyproblem.info/
Försök minimera komplexiteten för saker när du felsöker. Dvs. om du tror det är en lista som strular kan det vara en idé att testa om det funkar med objekten utan att de är i en lista, så vet du om det är listan eller något annat

Visa signatur

Redbox: Asrock B650 Lightning ATX, 7800x3D -20CCO, XFX 6950XT, 2x32GB Corsair Vengence 6400 CL32, WD SN770 2TB, Corsair RMe 1000, Lian Li Lancool 216, Peerless Assassin 120 SE
Purpbox: Z87-Pro, I5 4670K@4.2, Sapphire 290 TRI-X, 2x8GB Crucial Tactical@stock, Deep Silence 1
Samsung Evo 250+500GB + QVO 1TB, 2x1TB 7200RPM backup/lagring
Det var bättre förr: E5300 2600MHz -> 3640MHz, Celeron 300A -> 450MHz

Permalänk
Skrivet av Zoth:

Skulle du kunna ladda upp informationen angående hur ni ska göra uppgiften?
Blir nog lättare att hjälpa dig därifrån.

Ganska lång beskrivning, därför jag inte la in den först, hehe

Här kommer en beskrivning av hur programmet ska fungera:
Petowner
Denna klass används för att skapa en husse, det villa säga ”Joppe”.
Joppe har en ålder (-age : int) samt äger en eller flera djur (pets: List<animal>) som då lagras
i en lista.
Med fördel får Joppe att antal djur när programmet startar.
Från listan av djur kan Joppe ”leka med” djuren genom att anropa metoden ”Interact()” i
animal-klassen. Exempelvis: pets[2].interact(); Detta görs i metoden Play()
I metoden menu() visas då en meny med olika valmöjligheter och som är kopplat till
metoder enligt följande:
1. Play fetch (metoden Play)
2. Feed Animal (metoden Feed)
3. List animals (metoden list_animals)

Här kommer en beskrivning av dessa metoder:
Play()
Denna metod frågar användaren vilket djur som Joppe ska leka med och därefter anropar
metoden Interact() i det djurobjektet.

Feed()
Denna metod frågar användaren vilket djur som Joppe ska mata och därefter anropa det
djurobjektets metod för detta (eat()). Denna metod hanterar också vilken mat som Joppe
ska mata hunden med och som ska skickas med som en inparameter till denna metod.

List_animals()
Denna metod listar helt enkelt djuren på ett lämpligt sätt genom att skriva ut var och en av
djur-objekten.

Animal
Klassen animal är en abstrakt klass. I denna klass finns flera fält definierade plus tre stycken
metoder.
Fälten är rätt självbeskrivande.
Age: Hur gammal djuret är
Name: Djurets namn
Fav_food: Djurets favoritmat som beskrivs med en vanlig sträng
Breed: Djurets ras
Hungry: Sant eller falskt för om djuret är hungrigt

Metoden Interact() innebär att djuret leker med djurägaren (Joppe). Detta förmedlas med
en lämplig utskrift.
Om djuret är hungrigt så vill inte djuret leka utan klagar istället.

Metoden eat() tar emot en sträng och jämför denna mot djurets favoritmat. Om djuret får
sin favoritmat så äter djuret upp maten och blir därefter mätt (#hungry : bool).

Får inte djuret sin favoritmat så finns en metod som styr vad djuret gör om djuret är hungrigt
(+hungry_animal()).
Som standard kommer djuret ”gny” och klaga på att djuret inte får någon mat.
Denna metod anropas om djuret inte får sin favoritmat ovan.
Favorit-mat sätts i respektive underklass och som är lämpligt för djuret.

Cat
Klassen cat ärver från animal.
Det som skiljer denna klass från den generiska animal-klassen är metoden hungry_animal()
som därmed ska ha en ”override”. Om katten inte får sin favoritmat så går han på egen hand
ut och jagar en mus. Lämplig text skrivs ut i konsollen som bekräftar detta.
Det är 50% chans att katten hittar en mus och blir mätt, annars är katten fortfarande
hungrigt.
Utöver detta kan texten för interact() ändras eftersom katten leker annorlunda än hundar.
Dog

Klassen dog ärver från animal
Denna klass skiljer inte från den abstrakta klassen Animal

Puppy
Klassen puppy ärver från dog
Puppy skiljer sig från klassen hund då den har ytterligare ett fält för hur många månader
gammal valpen är. Åldern i år ska sättas till noll (0).

Permalänk
Skrivet av e1m1:

Vilket den verkar göra, antagligen returnerar toString() för en abstrakt klass "0", ingen aning om det är så men är inte orimligt att den är definierad så.

Du vill nog lägga till t.ex. namn där istället, ev. konkatenerat med ålder. Dvs.

public override string ToString() { return name; }

Edit:
Console.WriteLine() behöver också göra ett toString för att "konvertera" objektet till text, så borde också bara bli nollor nu.

Edit 2:
https://xyproblem.info/
Försök minimera komplexiteten för saker när du felsöker. Dvs. om du tror det är en lista som strular kan det vara en idé att testa om det funkar med objekten utan att de är i en lista, så vet du om det är listan eller något annat

Juste, tackar! Ändrade till:

foreach (var pet in pets) { Console.WriteLine(pet.ToString()); }

och satte return name + age + favFood; på abstracta klassens ToString()
+ jag ändrade lite i Petowner, men resultatet är fortfarande 0, 0, 0, 0. Jag ska debugga en del och se om jag hittar något (debugging är dock också nytt för mig xD)

private List<Animal> pets = new List<Animal>(); public Petowner(int age) { Age = age; pets.Add(new Cat(name:"Ellie", age:3, favFood:"Kattmynta")); pets.Add(new Cat(name:"Meelo", age:11, favFood:"Fisk")); pets.Add(new Dog(name:"Sassa", age:6, favFood:"Korv")); pets.Add(new Puppy(name:"Majken", age:1, favFood:"Köttfärs")); Menu(); }

Permalänk
Skrivet av kinkyboo:

Värdena du skickar in i djur klassernas constructor gör inget med dem, som du har skrivit nu så blir alla "" och 0

Jo, jag ändrade lite: public Cat(string name, int age, string favFood) {} borde jag skriva in värdena också inuti måsvingarna? eller då kanske det blir fel eftersom t ex Cat ska det va två instanser av.. mycket som är oklart för mig haha

Permalänk
Medlem

Människor är förvisso djur, men tvivlar på att du vill att Petowner ärver från Animal.

Annars, du sätter aldrig variablerna nånstans. I Cat och Dogs constructor får du göra typ this.name=name. Just nu är det blankt. Name är en tom sträng och din int är 0. Så du printar blankt komma noll. Och fyra objekt i listan. Så blir ,0,0,0,0

Visa signatur

Processor: Motorola 68000 | Klockfrekvens: 7,09 Mhz (PAL) | Minne: 256 kB ROM / 512 kB RAM | Bussbredd: 24 bit | Joystick: Tac2 | Operativsystem: Amiga OS 1.3

Permalänk
Skrivet av talonmas:

Människor är förvisso djur, men tvivlar på att du vill att Petowner ärver från Animal.

Annars, du sätter aldrig variablerna nånstans. I Cat och Dogs constructor får du göra typ this.name=name. Just nu är det blankt. Name är en tom sträng och din int är 0. Så du printar blankt komma noll. Och fyra objekt i listan. Så blir ,0,0,0,0

Taaack så j*vla mycket! Där hade vi det hahah. Och ja, du har rätt, jag missuppfattade UML:et jag fick, Petowner skulle inte ärva.

Permalänk
Medlem
Skrivet av PickleRick137:

Taaack så j*vla mycket! Där hade vi det hahah. Och ja, du har rätt, jag missuppfattade UML:et jag fick, Petowner skulle inte ärva.

Inom objektorienterad programmering brukar man tala om Inheritance (Arv) vs. Composition (Aggregering).
Det förstnämnda är ett förhållande av typen IS-A (är-en) medan det sistnämnda är ett förhålllande av typen HAS-A (har-en).

Aggregering sker genom att objekt av en typ/klass ingår i objekt av en annan typ/klass. Exempelvis så kanske ett objekt av typen Motor, och flera (i form av en lista) objekt av typen Hjul, ingår (i form av instansvariabler) i ett objekt av typen Bil.

I din uppgift gäller:
Katt är ett Djur, alltså IS-A, d.v.s. du bör använda arv.
Hund är ett Djur, alltså IS-A, d.v.s. du bör använda arv.
Husse har ett (eller flera) Djur, alltså HAS-A, du bör använda aggregering.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Skrivet av PeCe:

Inom objektorienterad programmering brukar man tala om Inheritance (Arv) vs. Composition (Aggregering).
Det förstnämnda är ett förhållande av typen IS-A (är-en) medan det sistnämnda är ett förhålllande av typen HAS-A (har-en).

Aggregering sker genom att objekt av en typ/klass ingår i objekt av en annan typ/klass. Exempelvis så kanske ett objekt av typen Motor, och flera (i form av en lista) objekt av typen Hjul, ingår (i form av instansvariabler) i ett objekt av typen Bil.

I din uppgift gäller:
Katt är ett Djur, alltså IS-A, d.v.s. du bör använda arv.
Hund är ett Djur, alltså IS-A, d.v.s. du bör använda arv.
Husse har ett (eller flera) Djur, alltså HAS-A, du bör använda aggregering.

Det där konceptet är helt nytt för mig, men jag ska undersöka detta! Skrev ner allt du sa, kändes som bra information att ha i framtiden hehe, tack så mycket för input!

Permalänk

Såhär ser koden ut hittills, har fortfarande lite problem med sub-menyerna. ( och lite andra saker )
T ex, jag har inte så bra koll på konstruktorer än, just nu är Animals konstruktor tom som ni ser och jag har ingen aning vad som ska in där.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace JoppesDjurfamiljV2 { class Program { public static void Main(string[] args) { Petowner Joppe = new Petowner(27); Joppe.Menu(); } } public abstract class Animal { protected int age; protected string name; protected string favFood; protected string breed; protected bool hungry; public Animal() { // Not sure what to put here } public int Age { get { return age; } set { age = value; } } public string Name { get { return name; } set { name = value; } } public string FavFood { get { return favFood; } set { favFood = value; } } public string Breed { get { return breed; } set { breed = value; } } public bool Hungry { get { return hungry; } set { hungry = value; } } public virtual void Interact() // Play with animals { } public virtual void HungryAnimal() // Behaviour if animal is hungry (standard whining) { if (hungry == true) { Console.Clear(); Console.WriteLine(""); Console.ReadKey(); } else { } } public void Eat(string food) // Offer animal food, in string { Console.Clear(); Console.WriteLine("Vad vill du mata {0} med?", name); Console.WriteLine("1. Fisk"); Console.WriteLine("2. Köttfärs"); Console.WriteLine("3. Ost"); Console.WriteLine("4. Korv"); Console.ReadKey(); return; } public override string ToString() { return name + age + favFood + breed + hungry; } } public class Petowner { private int Age; private List<Animal> pets = new List<Animal>(); public void PrintAnimals() { foreach (var pet in pets) { Console.WriteLine(pet.ToString()); } } public Petowner(int age) { Age = age; pets.Add(new Cat(name:"1. Ellie", age: 3, "Fisk")); pets.Add(new Cat(name:"2. Meelo", age:11, "Ost")); pets.Add(new Dog(name:"3. Sassa", age:6, "Korv")); pets.Add(new Puppy(name:"4. Majken", age:0, "Köttfärs")); } public void ListAnimals() { Console.Clear(); Console.WriteLine("Här är alla dina djur!\n---------------------"); PrintAnimals(); Console.WriteLine("---------------------\nTryck på valfri tangent för att gå tillbaka..."); Console.ReadKey(); } public void Play() // Sub-menu { int x = 0; Console.Clear(); Console.WriteLine("Vilket djur vill du leka med?\n---------------------"); PrintAnimals(); switch (x) { case 1: Cat.Interact(); break; case 2: Cat.Interact(); break; // None of these work rn, not sure why case 3: Dog.Interact(); break; case 4: Puppy.Interact(); break; } } public void Feed() // Sub-menu { int x = 0; Console.Clear(); Console.WriteLine("Vilket djur vill du mata?\n---------------------"); PrintAnimals(); try { x = int.Parse(Console.ReadLine()); } catch (Exception) { Console.Clear(); Console.WriteLine("Nu blev det fel, prova igen!\n---------------------"); Console.WriteLine("Tryck på valfri tangent för att gå tillbaka till menyn..."); Console.ReadKey(); } switch (x) { case 1: Cat.Eat(); break; case 2: Cat.Eat(); // None of these work rn, not sure why break; case 3: Dog.Eat(); break; case 4: Puppy.Eat(); break; default: Console.Clear(); Console.WriteLine("Nu blev det fel, prova igen!\n---------------------"); Console.WriteLine("Tryck på valfri tangent för att gå tillbaka till menyn..."); Console.ReadKey(); break; } } public void Menu() { int x = 0; do { Console.Clear(); Console.WriteLine("Hej Joppe! Vad vill du göra? (välj med siffror)\n---------------------"); Console.WriteLine("1. Leka med djuren"); Console.WriteLine("2. Mata djuren"); Console.WriteLine("3. Se alla djur"); Console.WriteLine("4. Avsluta program\n---------------------"); try { x = int.Parse(Console.ReadLine()); } catch (Exception) { Console.Clear(); Console.WriteLine("Nu blev det fel, prova igen!\n---------------------"); Console.WriteLine("Tryck på valfri tangent för att gå tillbaka till menyn..."); Console.ReadKey(); } switch (x) { case 1: Play(); break; case 2: Feed(); break; case 3: ListAnimals(); break; case 4: break; } } while (x != 4); Console.Clear(); Console.WriteLine("Programmet avslutas...\n---------------------\nTryck på valfri tangent"); Console.ReadKey(); } public override string ToString() { return base.ToString(); // Not sure what to put here } } public class Cat : Animal { public Cat(string name, int age, string favFood) { this.name = name; this.age = age; this.favFood = favFood; } public override void HungryAnimal() // If not given favFood, tries to hunt his own. { Random random = new Random(); int hunting = random.Next(0,1); Console.Clear(); if (hunting == 0) { hungry = true; } else { hungry = false; } return; } public override void Interact() { if (hungry == true) { Console.Clear(); Console.WriteLine("{0} är för hungrig för att leka..\n---------------------", name); Console.WriteLine("Tryck Enter för att gå tillbaka till menyn"); Console.ReadKey(); } else { Console.Clear(); Console.WriteLine("Du lyser med en laserpekare och {0} springer ivrigt efter!\n---------------------", name); Console.WriteLine("Tryck Enter för att gå tillbaka till menyn"); Console.ReadKey(); } } public override string ToString() { return string.Format("{0}, {1} år, katt. Favorit mat: {2}", name, age, favFood); } } public class Dog : Animal { public Dog(string name, int age, string favFood) { this.name = name; this.age = age; this.favFood = favFood; } public override void Interact() { if (hungry == true) { Console.Clear(); Console.WriteLine("{0} är för hungrig för att leka..\n---------------------", name); Console.WriteLine("Tryck Enter för att gå tillbaka till menyn"); Console.ReadKey(); } else { Console.Clear(); Console.WriteLine("Du kastar en pinne, {0} kommer tillbaka med den!!\n---------------------", name); Console.WriteLine("Tryck Enter för att gå tillbaka till menyn"); Console.ReadKey(); } } public override string ToString() { return string.Format("{0}, {1} år, hund. Favorit mat: {2}", name, age, favFood); } } public class Puppy : Dog { public int months = 7; public Puppy(string name, int age, string favFood) : base(name, age, favFood) { this.name = name; this.age = months; this.favFood = favFood; } public override void Interact() { if (hungry == true) { Console.Clear(); Console.WriteLine("{0} är för hungrig för att leka..\n---------------------", name); Console.WriteLine("Tryck Enter för att gå tillbaka till menyn"); Console.ReadKey(); } else { Console.Clear(); Console.WriteLine("Du kastar en boll och {0} springer klumpigt efter och kommer sedan tillbaks med den!\n---------------------", name); Console.WriteLine("Tryck Enter för att gå tillbaka till menyn"); Console.ReadKey(); } } public override string ToString() { return string.Format("{0}, {1} månader, hundvalp. Favorit mat: {2}", name, age, favFood); } } }