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?
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
}
}
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.
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!");
} }
}
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