Permalänk

C# Väderstation Klass Stad

Hej! Jag har en uppgift där jag ska använda klassen Stad som innehåller string namn; och int temp;. Man kan skapa en lista med städer och deras temperatur, sedan ska man kunna leta i listan efter en viss temperatur. Detta fungerar nu men jag ska även använda mig av bubblesort som en funktion att sortera städerna efter temperatur (kallast först) och jag får det inte att fungera.

Är detta rätt: static void Bubblesort( string[] namn, int[] temp) ? För jag får bara en massa felmeddelanden när jag försöker anropa funktionen.

Här kommer min kod så ni kan hjälpa (roasta) mig

using System; using System.Collections.Generic; class Stad { public string name { get; set; } public int temp { get; set; } public Stad(string name, int temp) { this.name = name; this.temp = temp; } public string Name { get { return this.name; } set { name = value; } } public int temperatur { get { return temp; } set { temp = value; } } public override string ToString() { return name + " " + temp; } } class Program { static int Linsok(List<Stad> list, int key) { for (int i = 0; i < list.Count; i++) { if (list[i].temperatur == key) return i; } return -1; } static void Bubblesort( string[] namn, int[] temp) { int max = temp.Length - 1; for (int i = 0; i < max; i++) { int nrLeft = max - i; for (int j = 0; j < nrLeft; j++) { if (temp[j] > temp[j + 1]) { int tmp = temp[j]; temp[j] = temp[j + 1]; temp[j + 1] = tmp; } } } } static void Main(string[] args) { List<Stad> myList = new List<Stad>(); bool avsluta = false; while (! avsluta) { Console.Write("[A]ange temp i ny stad\n"); Console.Write("[B]Sök specifik temp\n"); Console.Write("[C]avsluta\n"); Console.Write("[D]sortera och skriv ut\n"); char menyVal; menyVal = Console.ReadLine()[0]; switch (menyVal) { case 'a': case 'A': System.Console.Write("Stadens namn: "); string namn = System.Console.ReadLine(); System.Console.Write("Ange temperatur: "); int temp = System.Convert.ToInt32(System.Console.ReadLine()); Stad stad = new Stad(namn, temp); if (temp >= 60 || temp <= -60) Console.WriteLine("felaktig temp"); else myList.Add(stad); break; case 'b': case 'B': Console.Write("Ange temperatur att söka: "); string str = Console.ReadLine(); int key = Convert.ToInt32(str); int index = Linsok(myList, key); if (index == -1) Console.WriteLine("stad med en temperaturen finns inte"); else Console.WriteLine("temp: " + key +" finns i stad: "+ myList[index].Name); break; case 'c': case 'C': Console.WriteLine("hejdå"); avsluta = true; break; case 'd': case 'D': //anropa bubblesort? break; default: Console.WriteLine("Någonting gick fel. Hejdå"); avsluta = true; break; } } } }

Permalänk
Medlem

Hur har du tänkt att sorteringen ska fungera om du har en lista med namn och en annan med temperaturer? Vore det inte mer logiskt att ta en lista med städer som argument istället?

Permalänk
Medlem

Jag hade tänkt så här:

namespace MyApp { class Stad { public string? Namn { get; set; } public int Temp { get; set; } public Stad(string? name, int temp) { Namn = name; Temp = temp; } } internal class Program { static void Main(string[] args) { List<Stad> Städer = new(); Städer.Add(new Stad("Paris", 11)); Städer.Add(new Stad("London", 5)); Städer.Add(new Stad("Stockholm", -8)); List<Stad> SortedList = Städer.OrderBy(t => t.Temp).ToList(); foreach(Stad s in SortedList) Console.WriteLine($"{s.Namn} : {s.Temp}"); Console.ReadKey(); } } }

Permalänk
Skrivet av Tea42BBS:

Jag hade tänkt så här:

namespace MyApp { class Stad { public string? Namn { get; set; } public int Temp { get; set; } public Stad(string? name, int temp) { Namn = name; Temp = temp; } } internal class Program { static void Main(string[] args) { List<Stad> Städer = new(); Städer.Add(new Stad("Paris", 11)); Städer.Add(new Stad("London", 5)); Städer.Add(new Stad("Stockholm", -8)); List<Stad> SortedList = Städer.OrderBy(t => t.Temp).ToList(); foreach(Stad s in SortedList) Console.WriteLine($"{s.Namn} : {s.Temp}"); Console.ReadKey(); } } }

Snyggt men jag tror inte min lärare hade tänkt att jag ska använda OrderBy.

Permalänk
Skrivet av perost:

Hur har du tänkt att sorteringen ska fungera om du har en lista med namn och en annan med temperaturer? Vore det inte mer logiskt att ta en lista med städer som argument istället?

Jo det vore ju bra men jag har inte lyckats med det. Jag ska se vad jag får för felmeddelanden för argumenten sen när jag sitter vid datorn.

Permalänk
Medlem
Skrivet av Hultapajk:

Jo det vore ju bra men jag har inte lyckats med det. Jag ska se vad jag får för felmeddelanden för argumenten sen när jag sitter vid datorn.

Din Bubblesort bör anropas med listan av städer som ovan nämnde.

static void Bubblesort(List<Stad> cities) { // Loopa cities med en bubble sort algoritm och jämför egenskapen .Temperature } // Anrop från Main BubbleSort(minLista);

Permalänk
Skrivet av zaibuf:

Din Bubblesort bör anropas med listan av städer som ovan nämnde.

static void Bubblesort(List<Stad> cities) { // Loopa cities med en bubble sort algoritm och jämför egenskapen .Temperature } // Anrop från Main BubbleSort(minLista);

Jag tror anropet fungerar men jag får inte bubblesort att fungera med min lista. Om jag försöker använda temp får jag medelandet "does not exist in context". Använder jag Stad.temp får jag "an object reference required for non-static Stad.temp.

bifogar PrtSc som det ser ut nu:
https://imgur.com/a/ZTJtjsz

bifogar kod som den ser ut nu:

using System; using System.Collections.Generic; using System.Linq; class Stad { public string name { get; set; } public int temp { get; set; } public Stad(string name, int temp) { this.name = name; this.temp = temp; } public string Name { get { return this.name; } set { name = value; } } public int temperatur { get { return temp; } set { temp = value; } } public override string ToString() { return name + " " + temp; } } class Program { static int Linsok(List<Stad> list, int key) { for (int i = 0; i < list.Count; i++) { if (list[i].temperatur == key) return i; } return -1; } static void Bubblesort(List<Stad> cities) { int max = cities.Length - 1; for (int i = 0; i < max; i++) { int nrLeft = max - i; for (int j = 0; j < nrLeft; j++) { if (cities[j] > cities[j + 1]) { int tmp = cities[j]; cities[j] = cities[j + 1]; cities[j + 1] = tmp; } } } } static void Main(string[] args) { List<Stad> myList = new List<Stad>(); bool avsluta = false; while (! avsluta) { Console.Write("[A]ange temp i ny stad\n"); Console.Write("[B]Sök specifik temp\n"); Console.Write("[C]avsluta\n"); Console.Write("[D]sortera och skriv ut\n"); char menyVal; menyVal = Console.ReadLine()[0]; switch (menyVal) { case 'a': case 'A': System.Console.Write("Stadens namn: "); string name = Console.ReadLine(); System.Console.Write("Ange temperatur: "); int temp = Convert.ToInt32(Console.ReadLine()); Stad stad = new Stad(name, temp); if (temp >= 60 || temp <= -60) Console.WriteLine("felaktig temp"); else myList.Add(stad); break; case 'b': case 'B': Console.Write("Ange temperatur att söka: "); string str = Console.ReadLine(); int key = Convert.ToInt32(str); int index = Linsok(myList, key); if (index == -1) Console.WriteLine("stad med en temperaturen finns inte"); else Console.WriteLine("temp: " + key +" finns i stad: "+ myList[index].Name); break; case 'c': case 'C': Console.WriteLine("hejdå"); avsluta = true; break; case 'd': case 'D': Bubblesort(myList); break; default: Console.WriteLine("Någonting gick fel. Hejdå"); avsluta = true; break; } } } }

Permalänk
Medlem
Skrivet av Hultapajk:

Jag tror anropet fungerar men jag får inte bubblesort att fungera med min lista. Om jag försöker använda temp får jag medelandet "does not exist in context". Använder jag Stad.temp får jag "an object reference required for non-static Stad.temp.

bifogar PrtSc som det ser ut nu:
https://imgur.com/a/ZTJtjsz

static void Bubblesort(List<Stad> cities) { int max = cities.Length - 1; for (int i = 0; i < max; i++) { int nrLeft = max - i; for (int j = 0; j < nrLeft; j++) { if (cities[j] > cities[j + 1]) { int tmp = cities[j]; cities[j] = cities[j + 1]; cities[j + 1] = tmp; } } } }

För List<T> ska du använda Count och inte Length, detta ser du i första felmeddelandet.
Andra felmeddelanet är att du inte kan jämföra om en instans av Stad är större än en annan instans av Stad, för hur ska kompilatorn veta vilken Stad som är störst?

Sista felet är att du försöker skapa en variabel av typen int från din lista av typen Stad.
Det ska alltså inte vara int tmp = cities[j]; utan Stad tmp = cities[j]; alternativt var tmp = cities[j];

Sedan i din inre loop är det temperaturerna du vill jämföra, inte städerna.
Du ska jämföra om cities[j].temp > cities[j + 1].temp

Permalänk
Skrivet av zaibuf:

För List<T> ska du använda Count och inte Length, detta ser du i första felmeddelandet.
Andra felmeddelanet är att du inte kan jämföra om en instans av Stad är större än en annan instans av Stad, för hur ska kompilatorn veta vilken Stad som är störst?

Sista felet är att du försöker skapa en variabel av typen int från din lista av typen Stad.
Det ska alltså inte vara int tmp = cities[j]; utan Stad tmp = cities[j]; alternativt var tmp = cities[j];

Sedan i din inre loop är det temperaturerna du vill jämföra, inte städerna.
Du ska jämföra om cities[j].temp > cities[j + 1].temp

Jag vill tacka personen ansvarig för att avlöna zaibuf när han sitter på eftermiddagarna och hjälper noobs! Detta hade jag aldrig kommit på själv. Tack så mycket! Buss och kran!

Permalänk
Medlem
Skrivet av Hultapajk:

Snyggt men jag tror inte min lärare hade tänkt att jag ska använda OrderBy.

Om man nu måste uppfinna hjulet igen, så kan man ändå utgå från en List<>

Typ:

Stad[] aStäder = Städer.ToArray(); Stad tempstad; // OBS yttre loop för att gå igenom alla siffror behövs... for (int x = aStäder.Length - 1; x >= 1; x--) { if (aStäder[x].Temp < aStäder[x - 1].Temp) { tempstad = new Stad(aStäder[x - 1]); aStäder[x - 1] = aStäder[x]; aStäder[x] = tempstad; } }

Du får lägga in en copy-konstruktor i Stad

public Stad(Stad s) { Namn = s.Namn; Temp = s.Temp; }

Permalänk
Medlem
Skrivet av Tea42BBS:

Om man nu måste uppfinna hjulet igen, så kan man ändå utgå från en List<>

Typ:

Stad[] aStäder = Städer.ToArray(); Stad tempstad; for (int x = aStäder.Length - 1; x >= 1; x--) { if (aStäder[x].Temp < aStäder[x - 1].Temp) { tempstad = new Stad(aStäder[x - 1]); aStäder[x - 1] = aStäder[x]; aStäder[x] = tempstad; } }

Du får lägga in en copy-konstruktor i Stad

public Stad(Stad s) { Namn = s.Namn; Temp = s.Temp; }

Uppgifter som denna brukar vara gymnasienivå för att få en introduktion till hur index i listor fungerar och hur man kan iterera samtidigt som man arbetar med positioner i index. Givetvis skulle man aldrig skriva en bubblesort i "verkligheten". Men man bör ha en grundläggande förståelse för vad som ramverket abstraherar bort åt dig.

Skrivet av Hultapajk:

Jag vill tacka personen ansvarig för att avlöna zaibuf när han sitter på eftermiddagarna och hjälper noobs! Detta hade jag aldrig kommit på själv. Tack så mycket! Buss och kran!

Ingen fara, själv suttit med liknande problem då jag själv började lära mig. Kul att kunna vara till hjälp och ge tillbaka