c# amerikanen i bastun
Hej!
Behöver hjälp med en uppgift i Programmering 1 som lyder:
Denna uppgift går ut på att en amerikanare ska skriva in en temperatur för ett bastuaggregat tills man skriver in
en temperatur som anses lagom. För att kontrollera detta ska vi ha en temperatur som anger den lägsta
godtagbara temperaturen och en som anger den högsta godtagbara temperaturen.
Tyvärr förstår vår kära bastubesökare enbart Fahrenheit medan
bastuaggregatet enbart förstår Celsius. Därför har du fått skriva ett program
som konverterar det som skrivs in från Fahrenheit till Celsius.
Den optimala temperaturen för bastun är 75 grader men den godtagbara
temperaturen är från 73 till 77 grader. Detta ska styras hela i villkorssatsen i
loopen.
Om talet är mindre än den minsta godtagbara temperaturen ska programmet
skriva att det är för kallt och man får skruva upp lite. Därefter får
bastubesökaren ställa in ett nytt värde på bastuaggregatet och loopen
upprepas.
I denna uppgift ska ni hantera följande:
1. Undantagshantering
2. Metoder
3. Villkor
Då amerikanaren kan skriva in i Fahrenheit så innebär det ett värde på 167 grader (=75 grader) men det vet ju
inte han eller hon då det är deras första bastubesök någonsin.
Läshänvisningar
Film 1,2 och 3 i min spellista på Youtube
Lämpliga sidor i läroboken
Csharpskolan och följande artiklar:
• Funktioner och metoder
• Felhantering och undantag
Vad sa älgen som bastade?
Planering
Ni ska skapa aktivitetsdiagram för denna uppgift. Då finns några saker att påpeka.
Undantagshantering behöver inte finns med i aktivitetsdiagrammet. Det är inget som behövs för att visualisera
flödet av kod.
Man gör ett aktivitetsdiagram per metod, eller varje metod ska tydligt
separeras i figuren. För att visualisera ett anrop finns olika lösning. En sådan
är en särskild figur med två linjer på sidorna.
Sedan när programmen blir större och flera metoder är involverade, så får man komma på en lämplig lösning för
att visualisera alla metoder och hur dessa är sammankopplade.
Betyg E
Be användaren skriva in en temperatur i Fahrenheit
Detta värde ska skickas till en metod som gör om
Fahrenheit till Celsius:
Kodhjälp i koden till höger.
Denna metod heter FahrToCels och returnerar ett heltal.
Metoden tar emot ett värde som användaren skrivit in.
Därefter ska du komplettera med koden som krävs för att
användaren ska få skriva in en ny temperatur i Fahrenheit
om det är för kallt eller för varmt. Det innebär att du ska
lösa det med loopar och villkor på ett lämpligt sätt.
Här kommer en förklaring till pilarna:
1. Vi skapar en heltalsvariabel (celsius) som vi ska
tilldela ett värde.
2. Vi anropar en metod FahrToCels där vi skickar med värdet fahrenheit (exempelvis 140) som metoden
behöver för att fungera.
3. Detta värde (140) sparas som fahr i metoden och används för uträkningen av värdet cel som returneras
och lagras i variabeln celcius.
Betyg C
Omvandla fahrenheit till
celcius
1 2
3
Omräkningen från Fahrenheit till Celsius ovan är inte
optimal då det uträknade värdet för Celsius troligtvis blir
ett decimaltal och detta ”kapas” rakt av då detta värde
ovan lagras som heltal (int). Det avrundas alltså inte.
Lös uppgiften och att värdet Celsius sparas som ett flyttal
med decimaler.
För att en beräkning ska fungera med decimaltal måste
alla tal i formeln vara av flyttalstyp.
Denna formel kommer inte att fungera då fahr är ett
heltal.
double temp = (fahr - 32) * 5
/ 9;
Här behöver man alltså omvandla fahr till samma double (eller float om ni jobbar med det). Ett sätt att göra detta
på är att ”typomvandla” fahr i formeln ovan så det behandlas som en double i formeln.
För att lösa detta kan man jobba med så kallad explicit typomvandling som beskrivs på MSDNs hemsida med ett
enkelt exempel på följande länk:
https://msdn.microsoft.com/en-us/library/ms173105.aspx#Anchor...
Jag vill fortfarande att det tal användaren skriver in lagras i en int först eftersom man med stor sannolikhet bara
skriver in heltal. Det innebär att metoden ska se ut så här:
public static double FahrToCels(int fahr)
{
//Typomvandla fahr till flyttal
//Gör uträkning med decimaler i svaret
return temp;
}
Utöver detta fungerar programmet på ett liknande sätt förutom att det är ett decimaltal som testas mot en
lämplig temperatur.
Se om du också kan lösa det med att avrunda talet om du väljer att skriva ut det.
Programmet ska också kunna hantera fel som uppstår med try & catch.
Ett vanligt fel man gör när man jobbar med try och catch är att man lägger för mycket kod i try-blocket. Egentligen
ska bara själva typ-omvandlingen ligga här. Se exemplet på sidan 87 i läroboken eller se filmen om
undantagshantering.
Min kod:
class Program
{
public static double FahrToCels(int fahr)
{
double temp;
temp = (double)fahr;
temp = (temp - 32) * 5 / 9;
return temp;
}
static void Main(string[] args)
{
int fahrenheit;
double celsius = 0;
Console.WriteLine("Skriv in fahrenheit: ");
do
{
try
{
fahrenheit = Convert.ToInt32(Console.ReadLine());
celsius = FahrToCels(fahrenheit);
}
catch (Exception)
{
Console.WriteLine("Skriv in ett heltal: ");
}
if (celsius > 77)
{
Console.WriteLine("Sänk temperaturen!");
}
else if (celsius < 73)
{
Console.WriteLine("Höj temperaturen!");
}
else if (celsius == 75)
{
Console.WriteLine("Nu är det perfekt, temperaturen är {0} grader celsius", celsius);
}
} while (celsius <= 73 || celsius >= 77);
Console.WriteLine("Nu är temperaturen {0} grader celsius, perfekt för att basta!", celsius);
Console.ReadKey();
}
}
Mitt problem är att när jag skriver in en bokstav istället för siffra så kommer det (som det ska) "skriv in ett heltal: " MEN det kommer även "höj temperaturen!". Jag fattar inte vad som är fel.. Har bara gjort loopar en gång innan och då gjorde det inte såhär. Säkert något enkelt som jag inte fattar :'). Kan någon snälla hjälpa mig?
Tack!