4 svar
147 visningar
Gokka behöver inte mer hjälp
Gokka 17
Postad: 27 dec 2021 21:51

Spara nytt värde efter felaktigt värde inmatat

Vill att nytt värde ska sparas om användare har angett ett värde inom fel intervall.

If-sats som kontrollerar värdet men när användare får skriva nytt värde så sparas inte det.
I utskriften anges det felaktiga värdet.

Har provat att skriva in 
Stad stad = new Stad("", int.Parse(Console.ReadLine())); 

public Stad(string stadNamn, int stadTemp)
        {
            this.stadNamn = stadNamn;
            this.stadTemp = stadTemp;
                                     
                
                    if (stadTemp >= -60 && stadTemp <= 60)
                    {
                        
                    }
                    else
                    {                
                        Console.WriteLine("Felaktig inmatning! Ange temperatur mellan -60 till +60!");
                        Console.Write("Ange ny temperatur för " + stadNamn + ": ");
                        Console.ReadLine();
            }
                        

        }   


********************************
         Väderstation
********************************
Ange temperatur för Örnskölsvik: 4
Ange temperatur för Kiruna: 5
Ange temperatur för Malmö: 99
Felaktig inmatning! Ange temperatur mellan -60 till +60!
Ange ny temperatur för Malmö: 4
Ange temperatur för Västerås: 4
********************************
I Örnsköldsvik är det 4 C°
I Västerås är det 4 C°
I Kiruna är det 5 C°
I Malmö är det 99 C°
********************************
Ange temperatur du vill söka efter?
Programmeraren 3390
Postad: 28 dec 2021 08:28

Console.ReadLine() returnerar en sträng som du inte gör något med.

I förra frågan visade du koden och den är känslig för felinmatningar, t ex om något annat än ett tal returneras. Du skapar Stad-objekten och läser temperatur i samma uttryck.

En separat metod för att lösa in temperatur som inte returnerar förrän du fått in ett godkänt värde blir enklare.
Nåt i stil med:

int readTemperature(String text) {
  while (true) {  // loop until valid temperature has been read
    // print text
    // read temperature
    // check temperature
    // if correct range, return temperature
    // print error message
  }
}

Gokka 17
Postad: 28 dec 2021 21:24
Programmeraren skrev:

Console.ReadLine() returnerar en sträng som du inte gör något med.

I förra frågan visade du koden och den är känslig för felinmatningar, t ex om något annat än ett tal returneras. Du skapar Stad-objekten och läser temperatur i samma uttryck.

En separat metod för att lösa in temperatur som inte returnerar förrän du fått in ett godkänt värde blir enklare.
Nåt i stil med:

int readTemperature(String text) {
  while (true) {  // loop until valid temperature has been read
    // print text
    // read temperature
    // check temperature
    // if correct range, return temperature
    // print error message
  }
}

Som jag skrev så har jag provat att skriva Stad stad = new Stad("", int.Parse(Console.ReadLine()));  där det står Console.ReadLine();
Hoppades att den skulle lägga in ny värdet från användaren och spara det. Men icke!
Så klirar mig ännu i huvudet om hur jag kan göra så att det nya värdet sparas i stad[] städer och printas ut.

Programmeraren 3390
Postad: 29 dec 2021 11:00

Du gör kontrollen i constructorn, där kan du läsa in värde tills det är korrekt enligt mönstret jag skrev i förra inlägget. I constructorn ska du inte göra "new Stad", den koden körs just när någon utanför gör "new Stad".

Det är inte riktigt snyggt att läsa inmatning i en constructor men det är nog inte det viktigaste just nu. Som koden är nu så läser du in temperatur på två ställen, både i koden som gör "new Stad" och inuti constructorn. Bäst vore att göra det innan du skapar Stad-objektet men för att fortsätta på din kod bör du göra en constructor som bara tar stadNamn och sen frågar efter temperatur i en while-loop som jag beskrev ovan. I constructorn blir det dock "break" istf return.

Spoiler, skippa om du vill prova själv. Ej kompilerat så kan ha fel:

public Stad(string stadNamn) {
  this.stadNamn = stadNamn;

  while (true) {
    Console.Write("Ange temperatur för " + stadNamn + ": ");
    this.stadTemp = int.Parse(Console.ReadLine());
    if (this.stadTemp >= -60 && this.stadTemp <= 60)  {
      break;
    } else {
      Console.WriteLine("Felaktig inmatning! Ange temperatur mellan -60 till +60!");
    }

  }
}

Gokka 17
Postad: 30 dec 2021 00:06
Programmeraren skrev:

Du gör kontrollen i constructorn, där kan du läsa in värde tills det är korrekt enligt mönstret jag skrev i förra inlägget. I constructorn ska du inte göra "new Stad", den koden körs just när någon utanför gör "new Stad".

Det är inte riktigt snyggt att läsa inmatning i en constructor men det är nog inte det viktigaste just nu. Som koden är nu så läser du in temperatur på två ställen, både i koden som gör "new Stad" och inuti constructorn. Bäst vore att göra det innan du skapar Stad-objektet men för att fortsätta på din kod bör du göra en constructor som bara tar stadNamn och sen frågar efter temperatur i en while-loop som jag beskrev ovan. I constructorn blir det dock "break" istf return.

Spoiler, skippa om du vill prova själv. Ej kompilerat så kan ha fel:

public Stad(string stadNamn) {
  this.stadNamn = stadNamn;

  while (true) {
    Console.Write("Ange temperatur för " + stadNamn + ": ");
    this.stadTemp = int.Parse(Console.ReadLine());
    if (this.stadTemp >= -60 && this.stadTemp <= 60)  {
      break;
    } else {
      Console.WriteLine("Felaktig inmatning! Ange temperatur mellan -60 till +60!");
    }

  }
}

this.stadTemp = int.Parse(Console.ReadLine()); löste problemet med att inte nya värdet lagrades.

Tack för feedback och hjälpande tankar! =) 

MvH

Oskar

Svara
Close