objektorienterad programmering c#

Permalänk
Medlem

objektorienterad programmering c#

Hejsan!
Håller på med en uppgift där jag ska få indata från användaren, lagra detta i en list. Sedan hitta lägsta temperatur, högsta temperatur samt medeltemperatur och sedan anropa metoder i main. Där mitt problem ligger. Verkar relativt simpelt när jag googlar om det så det får mig att tro att jag har gjort något jäkligt fel, men håller tummarna att det inte är det.

Klassen Stad som lagrar städernas namn samt temperatur:

public class Stad { private float medelTemp; public Stad(int Temperatur) { aTemperatur = Temperatur; } public Stad(float medelTemp) { this.medelTemp = medelTemp; } public Stad(string StadNamn, int Antal) { aStadNamn = StadNamn; aAntal = Antal; } public int aAntal { get { return aAntal; } set { } } public string aStadNamn { get; set; } private int aTemperatur { get { return aTemperatur; } set { } } public void skrivUt(string StadNamn, int Temperatur) { Console.Write("Städernas namn: " + StadNamn + "samt dess temperatur: " + Temperatur); } public static implicit operator int(Stad v) { throw new NotImplementedException(); } }

Klassen som lagrar metoderna:

class Metoder { public int LägstTemp(List<Stad> städer, int lägstTemp, int Temperatur) { if (städer.Count == 0) { throw new InvalidOperationException("Listan är tom!"); } lägstTemp = int.MinValue; for (int i = 0; i < städer.Count; i++) { Temperatur = städer[i]; if (Temperatur > lägstTemp) { lägstTemp = Temperatur; } Metoder lägTemp = new Metoder(); } return lägstTemp; } public float MedelTemp(List<Stad> städer, int antal) { int sum = 0; for (int i = 0; i < städer.Count; i++) { sum += städer[i]; } float medelTemp = (float)sum / (float)städer.Count; Metoder medTemp = new Metoder(); return medelTemp; } public int HögstTemp(List<Stad> städer, int högstTemp, int Temperatur) { if (städer.Count == 0) { throw new InvalidOperationException("Listan är tom!"); } högstTemp = int.MinValue; for (int i = 0; i < städer.Count; i++) { Temperatur = städer[i]; if (Temperatur > högstTemp) { högstTemp = Temperatur; } Metoder högTemp = new Metoder(); } return högstTemp; } } }

Och till sist main:

static void Main(string[] args) { List<Stad> städer = new List<Stad>(); Console.Write("Ange hur många städer vill du lägga till: "); int Antal = int.Parse(Console.ReadLine()); for (int i = 0; i < Antal; i++) { Console.Write("\nAnge stadens namn: "); string StadNamn = Console.ReadLine(); Stad stadAntal = new Stad(StadNamn, Antal); städer.Add(stadAntal); } for (int i = 0; i < Antal; i++) { Console.Write("\nAnge städernas temperatur: "); int Temperatur = int.Parse(Console.ReadLine()); if (Temperatur <= -50 && Temperatur >= 60) { Console.WriteLine("Fel inmatning!"); } Stad stadTemp = new Stad(Temperatur); städer.Add(stadTemp); } Stad.skrivUt(); } } }

Permalänk

Och vad är ditt problem?

Gör programmet inte vad du förväntar dig? Kastar det fel när du kör det? Eller kompilerar det inte ens?

Jag kan inte hjälpa dig om jag inte vet vad du behöver hjälp med.

Permalänk
Medlem
Skrivet av ReellAnalys:

Och vad är ditt problem?

Gör programmet inte vad du förväntar dig? Kastar det fel när du kör det? Eller kompilerar det inte ens?

Jag kan inte hjälpa dig om jag inte vet vad du behöver hjälp med.

Trodde jag gjorde det tydligt nog sorry ^^ Anropa metoder i main! Alltså skriva ut högsta temp osv.

Permalänk
Skrivet av Isabeell:

Trodde jag gjorde det tydligt nog sorry ^^ Anropa metoder i main! Alltså skriva ut högsta temp osv.

Kanske en dum fråga, tvärskummade bara på telefonen, men skapar du ett objekt av den klassen?

Permalänk

Skriv ut vad den säger om du kompilerar/kör programmet så man ser vad som går fel.

Permalänk

Ah, då är jag med.
Metoderna du skapat i klassen Metoder är instansmetoder, så de behöver ett existerande objekt av typen Metoder för att köras.

ex:

var metodbehållare = new Metoder(); metodbehållare.MedelTemp(...)

Men en bättre lösning vore att göra metoderna statiska så att de inte behöver ett objekt att köra på.

public static float MedelTemp(List<Stad> städer, int antal) { ..... }

notera nyckelordet static

och sedan kan de anropas med
Metoder.MedelTemp(....)

Tillägg: klassen Metoder behöver (eventuellt) vara public också

Permalänk

Om objektsorientering är fokuset för övningen, försök flytta över all kod du har i main in i "metoder" klassen också, och döp om den till något mer i stil med "CityTemperatureCalculator", gör metoder för att lägga till en stad osv i den klassen istället för i main. Om du vill ha ännu bättre betyg, splitta den i två delar, en som håller reda på vilka städer som finns, och en annan som räknar ut medeltemperaturen på dem.

Permalänk
Medlem
Skrivet av ReellAnalys:

Ah, då är jag med.
Metoderna du skapat i klassen Metoder är instansmetoder, så de behöver ett existerande objekt av typen Metoder för att köras.

ex:

var metodbehållare = new Metoder(); metodbehållare.MedelTemp(...)

Men en bättre lösning vore att göra metoderna statiska så att de inte behöver ett objekt att köra på.

public static float MedelTemp(List<Stad> städer, int antal) { ..... }

notera nyckelordet static

och sedan kan de anropas med
Metoder.MedelTemp(....)

Tillägg: klassen Metoder behöver (eventuellt) vara public också

Vad är meningen att jag ska ha inom parenteserna?

Permalänk
Medlem
Skrivet av Loddgrimner:

Om objektsorientering är fokuset för övningen, försök flytta över all kod du har i main in i "metoder" klassen också, och döp om den till något mer i stil med "CityTemperatureCalculator", gör metoder för att lägga till en stad osv i den klassen istället för i main. Om du vill ha ännu bättre betyg, splitta den i två delar, en som håller reda på vilka städer som finns, och en annan som räknar ut medeltemperaturen på dem.

Ska man ha så lite som möjligt i main eller?

Permalänk

Det var väldigt många konstruktorer av Stad-klassen. Vissa städer har ett namn och ett heltal (Antal). Andra städer har en temperatur men inget namn. Andra städer har en medelteperatur men inget namn.

Klassen Metoder har ingen konstruktor. Hur ska man då anropa metoderna i och med att de inte är statiska?

Permalänk
Skrivet av Isabeell:

Vad är meningen att jag ska ha inom parenteserna?

De parametrar som metoden vill ha för att köra. för MedelTemp(...) är det en lista av städer följt av ett heltal i den kod du har.

Permalänk
Medlem
Skrivet av Kommenterande 2:

Det var väldigt många konstruktorer av Stad-klassen. Vissa städer har ett namn och ett heltal (Antal). Andra städer har en temperatur men inget namn. Andra städer har en medelteperatur men inget namn.

Klassen Metoder har ingen konstruktor. Hur ska man då anropa metoderna i och med att de inte är statiska?

Döm mig inte Trodde "Metoder medTemp = new Metoder();" var en konstruktor?

Permalänk
Hedersmedlem

Konstruktorn är metoderna som har samma namn som klassen, t ex de tre olika Stad(). Metoder() är också en konstruktor men en standard som ger alla medlemsvariabler standardvärden.

Utöver problemen ovan så har du tomma setters dvs set {} -- om jag inte missar något så gör detta att du aldrig lagrar någon data. Dina properties bör kunna vara t ex

public int aAntal { get; set; };

... istället.

Tror även som sagt ovan att du missat lite med klassinstanser och hur de används. Funktionen skrivUt() tar två argument på vad den ska skriva ut, men meningen är nog snarare att du ska lagra de två värdena i klassen och sedan skriva ut dem, i stil med (pseudokod)

class A { public int X { get; set; } public void skrivUt() { Console.WriteLine($"Värdet är: {X}"); } }

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Skrivet av Isabeell:

Ska man ha så lite som möjligt i main eller?

Ja, generellt se det som typ en sammanfattning av ditt program och var man hittar startpunkten, man vill få bort alla detaljer därifrån och in i klasser eller funktioner istället. Men det finns inga riktiga regler det är mer som guidelines, allt beror på sammanhanget.