76 svar
245 visningar
LlLinnea 51
Postad: 23 maj 19:48 Redigerad: 23 maj 19:58

svårt med klasser

Sitter helt fast med uppgiften väderstationen.  Har verkligen försökt att förstå, har läst och läst och provat men det är som att försöka skruva i hop en möbel utan att veta hur jag tillfullo använder verktygen.

Jag förstår att koden är fel, jag har försökt lappa ihop det jag förstår att uppgiften ska innhålla men jag förstår inte hur variablarna länkar till varandra, därför blir det svårt att sätta ihop. 

Jag hoppas någon kan hjälpa mig på vägen, på egen hand kommer jag inte längre...

Så här ser uppgiftsbeskrivningen ut:

Gör ett huvudprogram för att testa din klass och dina funktioner/metoder. Deklarera ett fält städer med fyra städer som ska innehålla temperaturmätningar från fyra olika städer. Värdena matas in av användaren när programmet körs.

Programmet ska sedan sortera fältet städer och skriva ut städernas namn och temperatur i temperatursordning med den kallaste staden först. Till sist ska funktionen/metoden linsok anropas och söka efter om någon stad har en viss temperatur. Du får själv välja om denna temperaturen är bestämd i koden eller matas in av användaren.

  • Deklaration av klassens attribut, dess datatyp och medlemsfunktionen/metoden ToString()
  • Implementation av linsok och bubblesortering funktioner/metoder
  • Få indata från användaren städernas namn och temperatur
  • Kontrollera att de inmatade temperaturvärden befinner sig inom intervallet
    temperatur >= -60 && temperatur <= 60
  • Sök i fältet vilken stad har en viss temperatur. För detta anropa linsök funktionen/metoden
  • Anropa funktionen/metoden för sortering av element i fältet
  • Anropa funktionen/metoden för ToString och gör en utskrift av objekt i fältet

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

Min skämskod, med fel och allt :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace sistauppgift
{
    class Stad             //definition av klass
           
        {
        public string name;    //attribut
        public int temp;      //attribut

            public string Name
            {
                get { return name; }
                set { name = value; }

            }
            public int Temp
            {
                get { return temp; }
                set { temp = value; }

            }
            public override string ToString()
            {
                return Name + " " + temp;
            }
        }
    }
-----------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace sistauppgift
{
    internal class Program

    {

        public static void Bubblesort(Stad[] stadTemp)
        {

            for (int i = 0; i < stadTemp.Length - 1; i++)
            {
                for (int j = 0; j < stadTemp.Length - (1 + i); j++)
                {
                    Stad sortStad = new Stad("", 0);
                    if (stadTemp[j].stadTemp > stadTemp[j + 1].stadTemp)
                    {
                        sortStad = stadTemp[j + 1];
                        stadTemp[j + 1] = stadTemp[j];
                        stadTemp[j] = sortStad;

                    }
                }
            }
        }
        static int linsok(Stad[] städer, int temp)
        {
            for (int i = 0; i < städer.Length; i++)
            {
                if (städer[i].temp == temp)
                {
                    return i;
                }
            }
            return -1;
        }
        static void Main(string[] args)
        {
            Stad stad = new Stad();
            List<Stad> myList = new List<Stad>();

            Console.WriteLine("VÄLKOMMEN TILL VÄDERSTATIONEN");
            for (int i = 0; i <= 3; i++)
            {
                Console.WriteLine("Ange stad: ");
                stad.Name = Console.ReadLine();

                Console.WriteLine(" Ange temperatur: ");
                stad.Temp = Convert.ToInt32(Console.ReadLine());

            }
            {
                if (stad.Temp >= 60 || stad.Temp <= -60)
                    Console.WriteLine("Felaktig inmatning av temperatur");
                else
                    myList.Add(stad.Temp);
            }
            {

                Console.Write("Stadens namn: ");
                string städer = Console.ReadLine();
                Console.Write("Ange temperatur: ");
                int söktemp = Convert.ToInt32(Console.ReadLine());
            }
        }
    }
}

Laguna 19922
Postad: 24 maj 10:42

Jag tror du ska skriva pseudokod för programmet först, för man behöver rätta på ett halvdussin ställen och det är inte helt tydligt vad koden borde göra. Alltså, beskriv i ord vad som ska hända, tillräckligt detaljerat så man kan göra ett program sedan. Dvs. ta beskrivningen i uppgiften och bryt isär den i steg och inför de variabler du behöver för att beskriva vad som händer.

LlLinnea 51
Postad: 24 maj 14:01 Redigerad: 24 maj 14:06

Skapa en klass stad som innehåller två attribut.

Klassen stad innehåller två medlemsvariabler/attribut:

            string namn;
            int temp;

Dessa lagrar stadens namn och temperatur, samt funktionen/metoden ToString

            public string ToString()

De returnerar en string som innehåller värden i attributen namn och temp.
Observera att medlemsfunktion/metoden ToString() genererar ingen utskrift till konsolen. 

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

Försök till psuedokod 

Programmet:

-Hälsa användaren välkommen.

-Be användaren att skriva in 4 städer samt temperatur mätningar från dessa genom loop.

-Kontrollera att de inmatade värdet finner sig inom intervallet: => -60 && temperatur <=60. 

-OM inte skriv ut "felaktig temp" skicka användaren till börjarn av programmet.

-OM korrekt inmatad temperatur spara i...(Ja var ska det sparas? i Lista eller cities.StadTemp??!)

- Anropa bubble sort och sortera fältet städer. SKRIVUT städernas namn och temperatur i temperatursordning, kallaste staden först.  

-Be användaren söka en viss temperatur, Spara inmatat värde i variabeln soktemp. Sök igenom de inmatade värdena genom att anropa metoden Linsok.

- SKRIV UT vilken stad som har den inmatade temperaturen, OM inmatat värde ej finns SKRIV UT -1.

- Avsluta programmet. 

[Förstå ej är om jag ska använda mig av metoden ToString för att skriva ut resultatet av mina metoder Linsok och bubble sort? det står ju "Anropa funktionen/metoden för ToString och gör en utskrift av objekt i fältet"]



Laguna 19922
Postad: 24 maj 14:13

Att kontrollera de inmatade värdena, är det något man gör för varje stad medan man matar in dem, eller görs det efter att alla är inmatade?

Var man sparar temperaturen, ja, när man kommer dit ska det finnas en stad som man just läste in namnet på, och den har attributet Temp. ("cities" eller "Lista" ser jag inget som heter.)

LlLinnea 51
Postad: 24 maj 14:36

Min tanke är att det ska kontrolleras efter varje inmatat värde, så skriver användaren fel blir användaren skickad tillbörjan. ( Tror jag måste lägga in ett try catch-block för detta, men inte kommt så långt)

Har nu skrivit och gjort om hela koden. Just nu ser den ut såhär:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace sistauppgift
{
   public class Stad             //definition av klass

    {
         string stadNamn;
         int stadTemp;



        public Stad(string stadNamn, int stadTemp)
        {
            this.stadNamn = stadNamn;
            this.stadTemp = stadTemp;


            if (stadTemp >= -60 && stadTemp <= 60)
            {

            }
            else
            {
                Console.WriteLine("Felaktigt temperatur!");
            }
        }
        public Stad ()
        { }
            public string StadNamn
        {
            get {return stadNamn; }
            set { stadNamn = value; }
        }
        public int StadTemp
        { get {return stadTemp; }
            set {stadTemp = value; }
           
        }

        public override string ToString()
        {
            return stadNamn + ":" + stadTemp;
        }

        public void SkrivUt()
        {
        Console.WriteLine("I " + stadNamn + " är det " + stadTemp + " C°");
        Console.ReadLine();
        }
    }
}
--------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace sistauppgift
{
    internal class Program
    {

        public static int Linsok(Stad[] städer, int soktemp)
        {
            for (int i = 0; i < städer.Length; i++)
            {
                if (städer[i].StadTemp == soktemp)
                {
                    return i;
                }
            }
            return -1;
        }
        public static void Bubblesort(Stad[] stadTemp)
        {

            for (int i = 0; i < stadTemp.Length - 1; i++)
            {
                for (int j = 0; j < stadTemp.Length - (1 + i); j++)
                {
                    Stad sortStad = new Stad("", 0);
                    if (stadTemp[j].StadTemp[j + 1].stadTemp)       // här blir det fel pg av jag förmodeligen anger fel variabler, men vilka ska anges?
                    {
                        sortStad = stadTemp[j + 1];
                        stadTemp[j + 1] = stadTemp[j];
                        stadTemp[j] = sortStad;

                    }
                }
            }
        }
------
        static void Main(string[] args)
       {

  	Stad cities = new Stad();
 	 List<Stad> myList = new List<Stad>();
 	
	 Console.WriteLine("VÄLKOMMEN TILL VÄDERSTATIONEN");

	for (int i = 0; i <= 3; i++)
            {
                Console.WriteLine("Ange stad: ");
                string städer = Console.ReadLine();
                cities.StadNamn = städer;

                Console.WriteLine(" Ange temperatur: ");
                int temp = Convert.ToInt32(Console.ReadLine());
                cities.StadTemp = temp;
            
   {
    { 
  Bubblesort();  // önskar här anropa bubbelsort, fungerar ej, förmodligen ska jag ange var den ska söka men förstår ej hur! :(
        {
         // här vill jag skriva ut resultatet av bubbelsort, oklart om jag gör det med metoden ToString()?
        }
        Console.WriteLine("Vilken temperatur vill du söka?");
         int soktemp = Convert.ToInt32(Console.ReadLine());
        {
        Linsok()// här vill jag anropa metoden linsok, fungerar ej förmodligen ska jag ange var den ska söka men förstår ej hur! :(
        { 
           //Här vill jag skriv ut resultatet av linsok,oklart om jag gör det med metoden ToString()?
        }
                        }
                    }
                }
            }
        }
    }
}



        
        
                 
                 
       










        
Laguna 19922
Postad: 24 maj 14:46

Nu tilldelar du 'cities' ett värde gång på gång, men sparar inte städerna någon annanstans. 'myList' kunde vara bra för det, men du använder inte den.

(Det spelar ingen roll för datorn, men det är förvirrande att ha ett variabelnamn i pluralform ("cities") när man ska spara bara en sak i den.)

LlLinnea 51
Postad: 24 maj 15:07 Redigerad: 24 maj 15:09
Laguna skrev:

Nu tilldelar du 'cities' ett värde gång på gång, men sparar inte städerna någon annanstans. 'myList' kunde vara bra för det, men du använder inte den.

-Om jag skriver såhär istället:

Console.WriteLine("Ange stad: ");string städer = Console.ReadLine();myList.Add(city);

Är det rätt? Visst Sparar jag i listan nu? frågan är nu: behövs string städer egentligen?

(Det spelar ingen roll för datorn, men det är förvirrande att ha ett variabelnamn i pluralform ("cities") när man ska spara bara en sak i den.)

-Ok, Ändrar till city i programmet. 

Laguna 19922
Postad: 24 maj 15:25

Du ska fortfarande sätta stadens stadNamn till den strängen. (Som också har ett förvirrande namn 'städer'.)

LlLinnea 51
Postad: 24 maj 15:32 Redigerad: 24 maj 15:32
 Console.WriteLine("Ange stad: ");
 string stad = Console.ReadLine();
 stad = city.StadNamn;
 myList.Add(city);
                
                

 Console.WriteLine(" Ange temperatur: ");
 int temp = Convert.ToInt32(Console.ReadLine());
 temp = city.StadTemp;
 myList.Add(city);
            

- Så här?

Laguna 19922
Postad: 24 maj 15:49

Tvärtom. city.stadNamn = temp

Du gjorde rätt i din första version.

LlLinnea 51
Postad: 24 maj 15:54

OK! gjort.

Men nu, hur får jag mina metoder att "prata" med resten. Hur går jag vidare?

Laguna 19922
Postad: 24 maj 16:15

Nu bör det gå bra att anropa BubbelSort med myList som argument.

LlLinnea 51
Postad: 24 maj 17:11 Redigerad: 24 maj 17:12

Förlåt. Jag är trög men jag förstår verkligen inte. Försöker men jag kommer inte vidare. När jag försökt anropa, fungerar det aldrig. Antingen blir metodnamnet rödmarkerat eller så blir innehåller innanför parantesen rödmarkerat:

 

Laguna 19922
Postad: 24 maj 17:28

Ditt anrop ska se ut så här:

Bubblesort(myList)

med versaler och gemener precis som i definitionen (inte bubblesort eller BubbleSort).

Men det är ett problem här: myList är en List<Stad> men Bubblesort vill ha en Stad[]. Det kanske går bra om du bara ändrar i definitionen av Bubblesort, men jag är inte säker.

LlLinnea 51
Postad: 24 maj 17:40

Så , menar du att jag har arrayer i mina metoder när jag deklarerar dem, alltså: static int linsok(Stad[] city, int soktemp) och public static void Bubblesort(Stad[] StadTemp) och måste antingen göra om dessa i metoderna till listor, alternativt ändra min lista till array i Main?

Laguna 19922
Postad: 24 maj 18:09

Ja.

LlLinnea 51
Postad: 24 maj 19:04

Jag har försökt att ändra nu så att båda metoderna ska ha list istället för [].

Min bubblesort hakar upp sig på samma ställe som tidigare:

internal class Program
    {

  static int linSok(List<Stad> myList, int soktemp)
        {
            for (int i = 0; i < myList.Count; i++)
            {
                if (myList [i].StadTemp == soktemp)
                {
                    return i;
                }
            }
            return -1;
        }
        public static void Bubblesort(List<Stad> myList, int sortstad)
        {
           
            for (int i = 0; i < myList.Count - 1; i++)
            {
                for (int j = 0; j < myList.Count - (1 + i); j++)
                {
                    Stad sortStad = new Stad("", 0);
                    if (myList[j] myList [j+ 1] myList)  // Varför blir det fel här?
                    {
                { 
                    sortstad = myList[j + 1];
                    myList [j + 1] = myList[j];
                    myList [j] = sortstad;
                  
                     }
                 }
             }
Laguna 19922
Postad: 24 maj 19:21

Det du menar är väl om den ena temperaturen är mindre än den andra. Eller kanske om namnen kommer i ordning, det står inte i uppgiften. Man verkar inte behöva sortera alls i själva verket, men det ska ju i alla fall bli rätt.

LlLinnea 51
Postad: 24 maj 19:25

Jag får hela stycket felmarkerat. Men nu börjar jag tvivla. Har jag alls gjort lista i metoden? och går det alls att köra listor eller måste man använda sig i av array/fält?!

Laguna 19922
Postad: 24 maj 19:33

Du har haft sönder den där raden. Titta på din första version.

LlLinnea 51
Postad: 24 maj 19:54

Jag tror mig ha lagt in en if för mycket och missat punkten. 

Men det blir fel ändå, även med punkt.

Laguna 19922
Postad: 24 maj 20:10

Du behövde inte byta namn på argumentet. Det som har hänt är att du har bytt ut .stadTemp mot .myList, det är inte rätt.

LlLinnea 51
Postad: 24 maj 20:19

gäller det för hela deklarationen av metoden? eller endast i kroppen av metoden?

Laguna 19922
Postad: 24 maj 20:30

Förutom det felet ser det bra ut, utom att du har fått in ett extra > på ett ställe.

LlLinnea 51
Postad: 24 maj 20:32

Förlåt, förstår inte. Är det bara där i mitten av if-satsen på bubble, eller i hela metoden? Det är fel att byta ut alltså.

Laguna 19922
Postad: 24 maj 21:10

Det är bara if-satsen som har blivit fel.

LlLinnea 51
Postad: 24 maj 21:18 Redigerad: 24 maj 23:03

Tack för all hjälp. Jag har ändrat och programmet går att provköra iaf.

Men det fungerar ju långt ifrån vad det ska.

Var går det fel, och hur jag måste anropa metoderna?

Är blind. Känns som att det aldrig går, ett stegframmåt, tio bakåt...


using System.Collections.Generic;

namespace sistauppgift
{
    internal class Program
    {

        static int linSok(List<Stad> myList, int soktemp)
        {
            for (int i = 0; i < myList.Count; i++)
            {
                if (myList[i].StadTemp == soktemp)
                {
                    return i;
                }
            }
            return -1;
        }
        public static void Bubblesort(List<Stad> myList)
        {
            for (int i = 0; i < myList.Count - 1; i++)

            {
                for (int j = 0; j < myList.Count - (1 + i); j++)
                {
                    Stad sortStad = new Stad("", 0);

                    if (myList[j].StadTemp > myList[j + 1].StadTemp)
                    {
                        sortStad = myList[j + 1];
                        myList[j + 1] = myList[j];
                        myList[j] = sortStad;
                    }
                }
            }

        }
        static void Main(string[] args)
        {
            


            Stad city = new Stad();
            List<Stad> myList = new List<Stad>();
            Console.WriteLine("VÄLKOMMEN TILL VÄDERSTATIONEN");

            for (int i = 0; i <= 3; i++)
            {
                Console.WriteLine("Ange stad: ");
                string stad = Console.ReadLine();
                city.StadNamn = stad;
                

                Console.WriteLine(" Ange temperatur: ");
                int temp = Convert.ToInt32(Console.ReadLine());
                city.StadTemp = temp;


                if (temp >= -60 && temp <= 60)
                {
                    myList.Add(city);
                }
                else
                {
                    Console.WriteLine("Felaktigt temperatur!");
                }

                {
                     Bubblesort(myList); 
                }


                Console.WriteLine("Vilken temperatur vill du söka?");
                int soktemp = Convert.ToInt32(Console.ReadLine());
                int index = linSok(myList, soktemp);
                city.StadTemp = index;

                if (index == -1)
                    Console.WriteLine("Finns ingen stad med den temperaturen");
                else
                    Console.WriteLine(index);
                Console.ReadLine();


            }
        }
    }
}















Laguna 19922
Postad: 26 maj 08:27

Du ska först läsa in alla städer och temperaturer och kontrollera dem. Sedan ska du sortera osv.

Nu gör du alla sakerna medan du läser in städerna.

Du ska bara flytta en fiskmås }

LlLinnea 51
Postad: 1 jun 14:29 Redigerad: 1 jun 16:04

using System.Collections.Generic;

namespace sistauppgift
{
    internal class Program
    {

        static int linSok(List<Stad> myList, int soktemp)
        {
            for (int i = 0; i < myList.Count; i++)
            {
                if (myList[i].StadTemp == soktemp)
                {
                    return i;
                }
            }
            return -1;
        }
        public static void Bubblesort(List<Stad> myList)   // lägga in i switchsats?
        {

            for (int i = 0; i < myList.Count - 1; i++)

            {
                for (int j = 0; j < myList.Count - (1 + i); j++)
                {
                    Stad sortStad = new Stad("", 0);

                    if (myList[j].StadTemp > myList[j + 1].StadTemp)
                    {
                        sortStad = myList[j + 1];
                        myList[j + 1] = myList[j];
                        myList[j] = sortStad;
                    }
                }
            }

        }
        static void Main(string[] args)
        {
       


            Stad city = new Stad();
            List<Stad> myList = new List<Stad>();
            Console.WriteLine("VÄLKOMMEN TILL VÄDERSTATIONEN");

            for (int i = 0; i <= 3; i++)
            {
                Console.WriteLine("Ange stad: ");
                string stad = Console.ReadLine();
                city.StadNamn = stad;
                //  myList.Add(city);

                Console.WriteLine(" Ange temperatur: ");
                int temp = Convert.ToInt32(Console.ReadLine());
                city.StadTemp = temp;


                if (temp >= -60 && temp <= 60)
                {
                    myList.Add(city);
                    continue;

                }
                else
                {
                    Console.WriteLine("Felaktigt temperatur!");
                    break;

                }
            }
            {

                Bubblesort(myList);

            }



            Console.WriteLine();

            Console.WriteLine("Vilken temperatur vill du söka?");
            int soktemp = Convert.ToInt32(Console.ReadLine());
           
            int index = linSok(myList, soktemp);
            

        

            if
                
                (soktemp == -1)
                Console.WriteLine("Finns ingen stad med den temperaturen");
            

            else

         
                Console.WriteLine(soktemp + "finns i: " + index);


                Console.ReadLine();

            }

        }
    }





Vet inte om jag förstår. Bubblesort gör ju ingenting nu när den ligger där. Varför returnerar den endast -1?

Laguna 19922
Postad: 1 jun 14:34

Vad returnerar -1?

LlLinnea 51
Postad: 1 jun 14:35

min linSok

Laguna 19922
Postad: 1 jun 17:22

Precis vad matar du in?

LlLinnea 51
Postad: 1 jun 18:17 Redigerad: 1 jun 18:17

När jag kör programmet så ska det läsa in de städer och temperaturer jag anger och spara de i listan av städer och temp. 

Här vill jag sen skriva ut min bubblesort sortering av städer och temperaturer, kallaste först. 

Sen frågar programmet användaren om vilken temperatur som ska sökas,

då vill jag att svaret blir den temp användaren matar in. Men just nu lyckas jag bara retunera -1 och jag förstår inte varför.

LlLinnea 51
Postad: 1 jun 18:54

Vad jag förstår så kommer mitt program bara ihåg den senaste sökningen, alltså måste det vara fel med sparandet av inmatade värden. Stämmer det?

Laguna 19922
Postad: 1 jun 19:09

Jag undrar vad du matar in exakt. Visa hela körningen.

LlLinnea 51
Postad: 1 jun 19:21

Laguna 19922
Postad: 1 jun 19:31

Jag ser inte vad som är fel. Skriv en metod som skriver ut hela myList, med namn och temperatur, och anropa den när du har matat in alla städer.

Eller stoppa in några utskrifter i linSok som visar vad man jämför med i varje steg.

LlLinnea 51
Postad: 1 jun 19:42

Jag ska försöka.

Dock tror jag problemet ligger någonstans här:




            Console.WriteLine("LINJÄRSÖKNING");

            Console.WriteLine("Vilken temperatur vill du söka?");
            int soktemp = Convert.ToInt32(Console.ReadLine());

            int index = linSok(myList, soktemp);


            if

                (soktemp == -1)
                Console.WriteLine("Finns ingen stad med den temperaturen");


            else


                Console.WriteLine(soktemp + "finns i: " + index);
            Console.Read();

        }

    }
}

Det är som att jag länkar eller tilldelar fel men ser inte var. .

Laguna 19922
Postad: 1 jun 19:59

Ja, du ska testa index och inte soktemp, men att index blir -1 är just nu det viktiga problemet.

LlLinnea 51
Postad: 1 jun 20:55

static void SkrivUT (List<Stad>myList)
{
Console.WriteLine(myList.Count);
Console.ReadLine();
}

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

 

typ  så?

LlLinnea 51
Postad: 1 jun 21:00

När jag ändrat till index ==-1  hoppar den direkt till "det finns ingen stad med den temperaturen" utan att skriva ut -1.

Laguna 19922
Postad: 2 jun 08:07

Ja, det är det den ska göra om temperaturen faktiskt inte finns.

Du kan skriva ut allt som ligger i myList också, i SkrivUT. Den behöver inte läsa in något från användaren.

LlLinnea 51
Postad: 2 jun 08:42

Skriver jag inte ut index och temperatur med den här koden:

  static void SkrivUT(List<Stad> myList)
        {
            
            for (int i = 0; i <myList.Count; i++)
            {
                Console.WriteLine("Index: {0} " + "Stad: " + myList[i].StadTemp);
            }
            Console.ReadLine();

Den retunerar endast det sista värdet så jag antar att jag sparar fel i listan, eller att den inte sparas alls, så det enda som finns är den senast inmatade temperaturen?

Kan jag använda mig av StadTemp som jag har gjort här?

Laguna 19922
Postad: 2 jun 08:53

Nu ser jag: du gör en new Stad, men sen använder du den för varje stad i loopen, så det är samma data som lagras på varje plats i myList (och det som du skrev in sist är det som ligger där). Du får göra Stad city = new Stad() inuti for-loopen.

LlLinnea 51
Postad: 2 jun 08:57
Laguna skrev:

Nu ser jag: du gör en new Stad, men sen använder du den för varje stad i loopen, så det är samma data som lagras på varje plats i myList (och det som du skrev in sist är det som ligger där). Du får göra Stad city = new Stad() inuti for-loopen.

Hänger inte med. I vilken loop?

//

Känner mig högst förvirrad, börjat tänka att jag inte sparar värdet från temp utan bara uppgift om stad, för jag kan väl inte spara de på samma ställe, eller är det vet jag gör..?

Laguna 19922
Postad: 2 jun 09:08

Loopen där det står "Ange stad".

LlLinnea 51
Postad: 2 jun 09:56

Tror jag gjort rätt nu.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace sistauppgift
{
   public class Stad             //definition av klass

    {
         string stadNamn;
         int stadTemp;



        public Stad(string stadNamn, int stadTemp)
        {
            this.stadNamn = stadNamn;
            this.stadTemp = stadTemp;


        }
        public Stad ()
        { }
            public string StadNamn
        {
            get {return stadNamn; }
            set { stadNamn = value; }
        }
        public int StadTemp
        { get {return stadTemp; }
            set {stadTemp = value; }
           
        }

        public override string ToString()
        {
            return stadNamn + ":" + stadTemp;
        }

        public void SkrivUt()
        {
            Console.WriteLine("I " + stadNamn + " är det " + stadTemp + " C°");
            Console.ReadLine();
        }
    }
}






using System;
using System.Collections.Generic;

namespace sistauppgift
{
    internal class Program
    {

        static int linSok(List<Stad> myList, int sokTemp)
        {
            for (int i = 0; i < myList.Count; i++)
            {
                if (myList[i].StadTemp == sokTemp)
                {
                    return i;
                }
            }
            return -1;
        }
        static void SkrivUT(List<Stad> myList)
        {

            for (int i = 0; i < myList.Count; i++)
            {
                Console.WriteLine(myList[i]);



            }
        }

        public static void Bubblesort(List<Stad> myList)   // lägga in i switchsats?
        {

            for (int i = 0; i < myList.Count - 1; i++)

            {
                for (int j = 0; j < myList.Count - (1 + i); j++)
                {
                    Stad sortStad = new Stad("", 0);

                    if (myList[j].StadTemp > myList[j + 1].StadTemp)
                    {
                        sortStad = myList[j + 1];
                        myList[j + 1] = myList[j];
                        myList[j] = sortStad;
                    }
                }
            }

        }
        static void Main(string[] args)
        {



            List<Stad> myList = new List<Stad>();
            Console.WriteLine("VÄLKOMMEN TILL VÄDERSTATIONEN");

            for (int i = 0; i <= 3; i++)
            {
                Stad city = new Stad();
                Console.WriteLine("Ange stad: ");
                string stad = Console.ReadLine();
                city.StadNamn = stad;
                // myList.Add(city);

                Console.WriteLine(" Ange temperatur: ");
                int temp = Convert.ToInt32(Console.ReadLine());
                city.StadTemp = temp;


                if (temp >= -60 && temp <= 60)
                {
                    myList.Add(city);
                    continue;

                }
                else
                {
                    Console.WriteLine("Felaktigt temperatur!");
                    break;
                }
            }
            SkrivUT(myList);

            { }

            {
                {
                    Console.WriteLine("SORTERING MED BUBBLE SORT");
                    Bubblesort(myList);


                }


                Console.WriteLine("LINJÄRSÖKNING");

                Console.WriteLine("Vilken temperatur vill du söka?");
                int sokTemp = Convert.ToInt32(Console.ReadLine());

                int index = linSok(myList, sokTemp);


                if

                    (index == -1)
                    Console.WriteLine("Finns ingen stad med den temperaturen");


                else


                    Console.WriteLine(sokTemp + "finns i indexposition: " + index);
                Console.Read();

            }

        }
    }
}

















 

Programmet ska sedan sortera fältet städer och skriva ut städernas namn och temperatur i temperatursordning med den kallaste staden först.(Bubblesort)- hur anropar jag? mitt anrop ger ingen utskrift i konsollen!

Till sist ska funktionen/metoden linsok anropas och söka efter om någon stad har en viss temperatur. (linSok)

LlLinnea 51
Postad: 2 jun 10:00

Tror jag löste det genom att lägga skrivUt efter bubble sort!

Nu blev det bara andra problem på vägen.

- vad jag ska ha ToString till i klassen Stad?

Laguna 19922
Postad: 2 jun 10:33

ToString används nog automatiskt om du någonstans skriver ut en instans av Stad, och det gör du ju i SkrivUT.

LlLinnea 51
Postad: 2 jun 15:08

Om jag istället för att bara skriva ut indexpositionen av sökt temperatur vill skriva ut staden, vilken blir referensen? 

Laguna 19922
Postad: 2 jun 17:03

Vad menar du med referensen?

LlLinnea 51
Postad: 2 jun 17:28

Jag menar vad jag ska länka till, när jag länkar till index visas ju positionen staden har (index). Om jag vill att den skriver ut stadens namn alltså.

Laguna 19922
Postad: 2 jun 19:21

Jag vet inte vad du menar med länka till heller, men om du har index 'i' för en stad i myList så är myList[i] den staden och myList[i].stadNamn namnet på den. 

LlLinnea 51
Postad: 2 jun 20:30

Det löste sig ändå. Angav myList[index] och sen metoden ToString() för att skriva ut staden i resultatet av linjärsökning.

TUSENTACK Laguna för all hjälp med denna uppgift, ser äntligen ett slut!

Laguna 19922
Postad: 2 jun 20:38

Så bra!

LlLinnea 51
Postad: 2 jun 21:19 Redigerad: 2 jun 21:21

Så en sista fråga..

Jag har lagt ett try catch block på hela koden i main för att ta upp felet om användaren matar in bokstäver istället för siffror. Programmet skriver då ut felmeddelande och avslutas.

Jag skulle önska att den  skickar användaren till början av programmet. Har försökt göra detta genom att lägga in try -catch-blocket i koden, men då sätter { } stopp, och det skapar en serie av fel med ogilltiga variabler.

Finns det något sätt jag kan lägga in en do while loop som fångar in felet och lopar programmet igen, eller måste jag skriva om all kod då?

Tänker om det går att göra det här i slutet, så det inte påverkar min kod så mycket.

Laguna 19922
Postad: 3 jun 08:43

Jag själv skulle vilja få möjlighet att mata in data för den staden på nytt, och inte behöva börja från början. Den felkontroll du redan har, att temperaturen är rimlig, hoppar ur inmatningen om en temperatur är fel. Det är nog inte heller riktigt vad man vill.

Du kan använda en while-loop, ja, med try-catch i, utan att skriva om särskilt mycket. Bestäm exakt vad som ska hända så kan vi placera den på rätt ställe.

LlLinnea 51
Postad: 3 jun 09:17 Redigerad: 3 jun 09:19

Efter programmet frågat efter stad ber den användaren "ange temperatur" om användaren då matar in annat än sifftor/heltal kommer ett felmeddelande upp. När man sen trycker enter avslutas programmet. Istället för att avslutas skulle jag vilja att den frågar igen, tills användaren anger siffror.

Vad jag förstår måste då try-catch ligga som loop över just den delen där det blir fel, alltså i:   temp = Convert.ToInt32(Console.ReadLine()); . När jag lägger den där blir det dåligt och jag förlorar variabler som är lönkade (antar att måsvingarna avgränsar kodblocket). Så hur går jag tillväga för att det inte ska hända?

Laguna 19922
Postad: 3 jun 09:19

Jag kan egentligen inte C# så jag kan inte föreslå kod, men hur ser din kod ut?

LlLinnea 51
Postad: 3 jun 09:26
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace sistauppgift
{
   public class Stad             //definition av klass

    {
         string stadNamn;
         int stadTemp;



        public Stad(string stadNamn, int stadTemp)
        {
            this.stadNamn = stadNamn;
            this.stadTemp = stadTemp;


        }
        public Stad ()
        { }
            public string StadNamn
        {
            get {return stadNamn; }
            set { stadNamn = value; }
        }
        public int StadTemp
        { get {return stadTemp; }
            set {stadTemp = value; }
           
        }
         
        public override string ToString()
        {
            return stadNamn + ":" + stadTemp;
        }
        
        public void SkrivUt()
        {
            Console.WriteLine("I " + stadNamn + " är det " + stadTemp + " °C");
            Console.ReadLine();
        }
    }
}
using System;
using System.Collections.Generic;

namespace sistauppgift
{
    internal class Program
    {

        static int linSok(List<Stad> myList, int sokTemp)       //
        {

            for (int i = 0; i < myList.Count; i++)
            {
                if (myList[i].StadTemp == sokTemp)
                {
                    return i;
                }
            }
            return -1;
        }
        static void SkrivUT(List<Stad> myList)
        {

            for (int i = 0; i < myList.Count; i++)
            {
                Console.WriteLine(myList[i]);



            }
        }

        public static void Bubblesort(List<Stad> myList)   // lägga in i switchsats?
        {

            for (int i = 0; i < myList.Count - 1; i++)

            {
                for (int j = 0; j < myList.Count - (1 + i); j++)
                {
                    Stad sortStad = new Stad("", 0);

                    if (myList[j].StadTemp > myList[j + 1].StadTemp)
                    {
                        sortStad = myList[j + 1];
                        myList[j + 1] = myList[j];
                        myList[j] = sortStad;
                    }
                }
            }

        }
        static void Main(string[] args)
        {

            try
            {

                {

                    List<Stad> myList = new List<Stad>();
                    Console.WriteLine("VÄLKOMMEN TILL VÄDERSTATIONEN");


                    for (int i = 0; i <= 3; i++)
                    {
                        Stad city = new Stad();
                        int temp;

                        Console.WriteLine("Ange stad: ");

                        string stad = Console.ReadLine();
                        city.StadNamn = stad;


                        Console.WriteLine(" Ange temperatur: ");


                        temp = Convert.ToInt32(Console.ReadLine());



                        city.StadTemp = temp;



                        if (temp >= -60 && temp <= 60)
                        {
                            myList.Add(city);
                            continue;

                        }
                        else
                        {
                            Console.WriteLine("Felaktigt temperatur!");
                            break;
                        }
                    }


                    {
                        Console.WriteLine("SORTERING MED BUBBLE SORT");
                        Bubblesort(myList);
                        SkrivUT(myList);

                    }


                    Console.WriteLine("\n\tLINJÄRSÖKNING\n");
                    for (int i = 0; i < myList.Count; i++)
                    {
                        Console.WriteLine("Vilken temperatur vill du söka?");

                        int sokTemp = Convert.ToInt32(Console.ReadLine());

                        int index = linSok(myList, sokTemp);


                        if (index == -1)
                        {
                            Console.WriteLine("Finns ingen stad med den temperaturen");
                            continue;
                        }


                        else
                        {

                            Console.WriteLine
                            ($"{sokTemp} finns i indexposition: {index} och ligger i" + 
                            myList[index].ToString());
                            Console.ReadLine();
                            break;
                        }
                    }

                }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();

            }



        }


    }
}


























LlLinnea 51
Postad: 3 jun 09:57

Det är som om man skulle behöva lägga in en "If console.ReadLine!= heltal, gör det..." men det blr ju svårt när inmatat värde bygger på string som måste konverteras till int.

Laguna 19922
Postad: 3 jun 10:04

Går den koden inte att köra? Det ser ut som om den borde ge upp hela programmet när det blir fel, men får du kompileringsfel?

LlLinnea 51
Postad: 3 jun 10:20

Den går att köra och felmeddelande skrivs ut, men det avslutas efter det.

LlLinnea 51
Postad: 3 jun 10:21 Redigerad: 3 jun 10:38

utan try-catch kraschar det, och felet indikeras till stängen jag skrev tidigare.

Laguna 19922
Postad: 3 jun 10:41

Du får lägga try-catch runt

   Console.WriteLine(" Ange temperatur: ");

   temp = Convert.ToInt32(Console.ReadLine());

 

och en while-loop runt det, som avslutas när man lyckas sätta temp.

LlLinnea 51
Postad: 3 jun 10:59

alltså runt: 

try
{
Console.WriteLine(" Ange temperatur: ");
temp = Convert.ToInt32(Console.ReadLine());
}
catch (Exception e)
{
Console.WriteLine("mata endast in heltal " + e.Message);
}

eller menar du runt hela for-satsen med inmatningar?


Tillägg: 3 jun 2022 11:04

Har svårt att förstå vilket villkor jag måste ge while loopen

Laguna 19922
Postad: 3 jun 11:07

Ett sätt är att sätta temp till något otillåtet först, t.ex. -100. Då kan loopen kolla om temp har blivit något annat än -100 och då är den nöjd.

LlLinnea 51
Postad: 3 jun 12:52 Redigerad: 3 jun 12:53
static void Main(string[] args)
        {
            List<Stad> myList = new List<Stad>();
            Console.WriteLine("VÄLKOMMEN TILL VÄDERSTATIONEN");
            Stad city = new Stad();



                    
                    {
                        for (int i = 0; i <= 3; i++)
                        {
                            //      Stad city = new Stad();


                            Console.WriteLine("Ange stad: ");

                            string stad = Console.ReadLine();
                            city.StadNamn = stad;
                            int temp;
                    
                               
                    while (temp > - 100);
                    {
                        try
                        {
                            Console.WriteLine(" Ange temperatur: ");
                            temp = Convert.ToInt32(Console.ReadLine());

                        }
                        catch (Exception e)
                        {
                            Console.WriteLine("mata endast in heltal " + e.Message);
                    }
                        }
                            city.StadTemp = temp;
                            if (temp >= -60 && temp <= 60)
                            {
                                myList.Add(city);
                                continue;
                            }
                            else
                            {
                                Console.WriteLine("Felaktigt temperatur!");
                                break;
                            }
                        }
                    
                    
                }

jag är ledsen men jag får verkligen inte till det. Det är den där variablem temp som ställer till det...

Laguna 19922
Postad: 3 jun 13:14

Indenteringen är svårläst nu.

Du ska i alla fall inte ha semikolon efter while (temp > -100)

Sätt temp till -100 när den deklareras också.

LlLinnea 51
Postad: 3 jun 13:57

Såhär fungerar, den upprepar men nu upprepar den temperatur i oändlighet:

 {
                        for (int i = 0; i <= 3; i++)
                        {
                            //      Stad city = new Stad();


                            Console.WriteLine("Ange stad: ");

                            string stad = Console.ReadLine();
                            city.StadNamn = stad;


                    int temp = -100;
                    while (temp != 0)
                    {
                        try
                        {
                            Console.WriteLine(" Ange temperatur: ");
                
                         temp = Convert.ToInt32(Console.ReadLine());

                        }
                        catch (Exception e)
                        {
                            Console.WriteLine("mata endast in heltal " + e.Message);
                    }
                        }
                            city.StadTemp = temp;
                            if (temp >= -60 && temp <= 60)
                            {
                                myList.Add(city);
                                continue;
                            }
                            else
                            {
                                Console.WriteLine("Felaktigt temperatur!");
                                break;
                            }
                        }
                    
                    
                }
Laguna 19922
Postad: 3 jun 14:21

Testet ska hoppa ur loopen när man har satt temp till något, förmodligen annat än -100, så det ska stå

    while (temp == -100)

 

Du kan läsa koden rad för rad och föreställa dig vad som händer, så är det inte ett stort mysterium vad som händer när programmet körs.

LlLinnea 51
Postad: 3 jun 14:54

Så då behöver jag en if efter ange temp? 

Jag har inte läst igenom allt men är inte denna raden fel i din bubbelsort?

 Stad sortStad = new Stad("", 0);

Denna constructorn existerar väl inte? Vad jag ser använder du standard constructorn vilket inte tar emot argument.

LlLinnea 51
Postad: 4 jun 13:49

Mycket möjligt. Gjorde vad jag tordde var rätt men det räcker inte så långt. Hur bör det se ut då? 

LlLinnea 51
Postad: 4 jun 13:53

Det verkar bli rätt utskrift iaf (sortering kallaste först).

 

Däremot får jag inte till det med felhanteringen, try-catch och wileloop.

Dracaena Online 4943 – Moderator
Postad: 4 jun 13:56 Redigerad: 4 jun 13:57

Jag såg nu att du korrigerade det felet i #60.  Laguna nämner något om while-loopen i 71, har du kikat på de?

LlLinnea 51
Postad: 4 jun 14:13 Redigerad: 4 jun 15:33

Ja, jag fick inte till det:( när jag ändrade så balla hela for loopen ur, antingen blir temp inte giltig, eller så loopar den stad helatiden eller visar fel värden sen i metoderna. Så något gör jag ju galet..

Läste någonstans att de går att slänga in undantag, men det kanske inte hjälper i det här fallet?

Plus att få till try-catch på ett vettigt sätt verkar nog svårt för mig.. 

Svara Avbryt
Close