Permalänk

Programmering 1 - Bastun

Hej, jag vet att den här frågan har varit uppe 100 gånger på ert forum, men jag får prova ändå. Jag skulle vilja ha feedback, mitt problem är att jag får samma resultat när jag vill prova en ny temp, vad jag än skriver.

Ursäkta mina stavfel i strängarna, det är mitt minsta problem just nu.

namespace Bastun { class Program { public static int FahrToCels(int fahr) { int cels = ((fahr - 32) * 5/9); return cels; } public static void Main(string[] args) { Console.WriteLine("Set sauna temperature: "); int fahrTemp=Convert.ToInt32(Console.ReadLine()); int celsTemp = FahrToCels (fahrTemp); do { Console.WriteLine("Set sauna temperature: "); if (fahrTemp > 77) { Console.WriteLine("Prefered temperature: " + (celsTemp) + (" degrees Celsius.")); Console.WriteLine("The temperature is too hot."); Console.ReadLine(); } else if (fahrTemp < 73) { Console.WriteLine("Prefered temperature: " + (celsTemp) + (" degrees Celsius.")); Console.WriteLine("The temperature is too cold."); Console.ReadLine(); } else if (celsTemp == 75) { Console.WriteLine("The temperature is now ideal, enjoy."); Console.ReadLine(); } else { Console.WriteLine("The sauna tempurature is now sootible."); Console.ReadLine(); } } while (celsTemp < 73 || celsTemp > 77); Console.Write("Press any keay to countinue."); Console.ReadLine(); } } }

Permalänk
Medlem

Före do while-loopen så läser du användarens input, konverterar till tal och sparar undan resultatet i en variabel:

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

Men i loopen så läser du bara användarens input och kastar bort det:

Console.ReadLine();

fahrTemp > 77 och fahrTemp < 77 borde ändras till att använda celsTemp också.

Permalänk

@lydell:
Jag såg att jag hade blandat ihop fahr och cels! Ordnat detta.

Men Det andra du skrev förstår jag inte riktigt, kan du förtydliga?
Ellerj ag förstår vad du skriver, men jag förstår inte riktigt hur jag ska åtgärda.

Permalänk
Medlem

@ArtNr 3641081: För tillfället så läser du in ett värde från användaren innan loopen, så det inlästa värdet kommer ju aldrig någonsin ändras när loopen väl snurrar. Det är därför som du alltid får samma resultat när du vill prova en ny temperatur, du läser bara in en enda temperatur under programmets gång.

Lösningen är att helt flytta inläsningen så att den ligger inne i loopen. Du måste dock fortfarande deklarera (men inte nödvändigtvis tilldela) celsTemp utanför loopen för att kunna använda den i loop-villkoret.

Permalänk

@perost: Tack, jättebra svar! Nu förstår jag mycket bättre. Men jag verkar ändå inte kunna placera inläsningen rätt ändå, för det fungerar ändå inte... Känner mig så dum.

Permalänk

namespace Bastun { class Program { public static int FahrToCels(int fahr) { int cels = ((fahr - 32) * 5/9); return cels; } public static void Main(string[] args) { Console.WriteLine("Set sauna temperature: "); int fahrTemp = Int32.Parse(Console.ReadLine()); do { int fahrTemp = Int32.Parse(Console.ReadLine()); int celsTemp = FahrToCels(fahrTemp); if (celsTemp > 77) //om temp över 77c { Console.WriteLine("Prefered temperature: " + (celsTemp) + (" degrees Celsius.")); Console.WriteLine("The temperature is too hot."); } if (celsTemp < 73) //om temp under 73c { Console.WriteLine("Prefered temperature: " + (celsTemp) + (" degrees Celsius.")); Console.WriteLine("The temperature is too cold."); } if (celsTemp == 75) //om temp exakt 75c { Console.WriteLine("Prefered temperature: " + (celsTemp) + (" degrees Celsius.")); Console.WriteLine("The temperature is now ideal."); } if (celsTemp == 73 || celsTemp == 74); //om temp exakt 73c eller 74c { Console.WriteLine("Prefered temperature: " + (celsTemp) + (" degrees Celsius.")); Console.WriteLine("The sauna temperature is now adequate."); } if (celsTemp == 76 || celsTemp == 77); //om temp exakt 76 eller 77c { Console.WriteLine("Prefered temperature: " + (celsTemp) + (" degrees Celsius.")); Console.WriteLine("The sauna temperature is now adequate."); } } while (celsTemp < 73 || celsTemp > 77); //så länge temp är under 73 eller över 77 Console.Write("Enjoy your sauna bath."); Console.ReadLine(); } } }

Permalänk
Medlem

@ArtNr 3641081: Nu har du deklarerat fahrTemp istället för celsTemp utanför loopen, det ska vara tvärtom. Loop-villkoret ligger utanför do-while-blocket, så du kan inte använda variabler deklarerade inne i do-while-blocket i villkoret. D.v.s:

int i; do { // Början på block. int j; } // Slut på block, här försvinner j. while (...); // i kan användas i villkoret här, men inte j eftersom j inte längre existerar.

Du måste också skilja på deklaration och tilldelning:

int i; // Deklaration i = 17; // Tilldelning int j = 42; // Både deklaration och tilldelning samtidigt.

Vad du har gjort med fahrTemp nu är att deklarera två olika variabler som båda heter fahrTemp, men i olika block:

int fahrTemp = Int32.Parse(Console.ReadLine()); // Deklaration av en variabel som heter fahrTemp. do { int fahrTemp = Int32.Parse(Console.ReadLine()); // Deklaration av en annan variable som också heter fahrTemp. ... } while (...);

Detta skulle i de flesta programmeringsspråk vara tillåtet, och man säger då att variabeln inne i blocket skuggar den utanför eftersom det inte längre går att referera till den yttre variabeln inne i blocket. I C# har man däremot valt att förbjuda skuggning av lokala variabler. Men det spelar ju ingen större roll, eftersom det ändå inte är något som du vill göra i det här fallet.

Permalänk

@perost: Tack så jättemycket för att du tar dig tid att hjälpa mig, det är så vänligt utav dig!