Trädvy Permalänk
Medlem
Registrerad
Aug 2017

Amerikanen i Bastun c#

Hej! Jag är ny inom programmering 1 och skulle bli jätte glad om jag kunde få lite hjälp av någon lite mer erfaren än mig!

Min uppgift:

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

Jag är som sagt väldigt ny, här är min kod hittills:

namespace Uppdrag_2_Bastu_andraforsok { class Program { static int FahrenheitToCelsius(int fahr) { int cel = ((fahr - 32) * 5) / 9; //metod beräknar Fahrenheit till Celsius. Konverterar. return cel; } static void Main(string[] args) { Console.WriteLine("Ange grader för bastuaggregat i Fahrenheit: "); //skriver ut sträng. int fahrenheit = int.Parse(Console.ReadLine()); //omvandlar till celsius. int celsius = FahrenheitToCelsius(fahrenheit); do { if (celsius < 73) { Console.WriteLine("Skruva upp värmen lite, temperaturen är för kall: "); Console.ReadKey(); } else if (celsius > 77) { Console.WriteLine("Skruva ner värmen lite, temperaturen är för hög: "); Console.ReadKey(); } else Console.WriteLine("Nu går det att basta!"); Console.ReadKey(); } while (celsius <= 73 || celsius >= 77); Console.WriteLine(fahrenheit); Console.ReadKey(true); } } }

la till code-taggar //Mod
Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2008

Ahh jag ser direkt ett stort problem, och det är att alla strängar innehåller svenska, amrisar förstår oftast bara engelska.

Dessutom har de en ful ovana att mata in lite vad som helst vid en prompt så du bör kolla att du får in ett lagom stort heltal.

|[●▪▪●]| #Lekburk#: i5-6600k@4,4GHz >-< GB-Z170X-GM3 >-< 16GB DDR4 >-< MSI GTX 1070 >-< BX100 250GB SSD>--
--< Be Quiet! Pure Rock >-< FD Define R4 >-< Seasonic F.+ 650W >-< Acer XF270HUA >-< AOC Q2778VQE >--
#Servering#: Ryzen 1700@3,6GHz >-< Prime X470 Pro >-< 16GB DDR4 >-< AMD HD 5770 >-< 970 EVO 500GB SSD >--
--< Stockkylare >-< Antec P182 >-< Silver Power 600W >-< Samsung 245T |[●▪▪●]|

Trädvy Permalänk
Medlem
Registrerad
Maj 2012

Du får förklara lite mer vad du sitter fast på. Skoluppgifter löser vi inte åt dig men kan hjälpa till att förklara saker du fastnar på.

Trädvy Permalänk
Moderator
Registrerad
Jul 2017

En grej till, när du postar kod, skriv [ code ] (utan mellanslag) före, och skriv sedan [ /code ] efter (utan mellanslag). På det sättet blir det mycket lättare att läsa koden eftersom indrag i koden då kommer fram.

om (du skriver så) { så blir det så här; }

Annars enligt ovan, vi saknar en fråga.

En bild säger mer än tusen ord. Så här gör du för att lägga upp bilder till ditt foruminlägg.

Synpunkter på moderering eller andra frågor om siten? Välkommen att kontakta oss via Sweclockers kontaktformulär eller i feedback-forumet.

Trädvy Permalänk
Medlem
Registrerad
Aug 2013

@Bananeripyamas: Med undantagshantering menas förmodling exception handling, alltså hantering av fel som uppstår. Jag antar att ni har något avsnitt i kurslitteraturen om detta?

Du kommer till exempel förmodligen få lite roliga exceptions kastade på dig om du matar in en tom sträng eller något icke-numeriskt. Det beror på att metoden Int.Parse() har vissa krav på sin input. Du kan läsa mer om det här: https://msdn.microsoft.com/en-us/library/b3h1hf19(v=vs.110).aspx.

Under avstnittet Exceptions kan du läsa om vilka typer av input som kommer kasta exceptions. Om du matar in något av dessa (till exempel "abc", vilket bör vara av fel format) kommer hela ditt program att krascha. Med undantagshantering är man ute efter att hantera att den här typen av fel uppstår.

Du skulle kunna kolla vilken input användaren matar in innan du anropar Int.Parse. Om strängen är tom skulle du kunna svara i konsolen och be användaren att ange ett värde. Du skulle kunna göra ett try-catch-block runt ditt anrop till Int.Parse - och om ett fel uppstår kan du meddela användaren om att värdet inte kunde läsas in samt be denne försöka igen. Du ska helt enkelt kunna hantera alla typer av input utan att ditt program går sönder.

En enklare väg förbi try-catch-block för parsning av strängar är att använda syskonfunktionen TryParse: https://msdn.microsoft.com/en-us/library/f02979c7(v=vs.110).aspx. Den kastar inga exceptions, utan returnerar en bool som berättar hur operationen gick. Värdet får du istället ut genom en out-parameter (out är ett C#-nyckelord du kan googla och läsa mer om i så fall).

Det här är bara första bästa grejen jag såg, det finns säkert mer än detta

Trädvy Permalänk
Moderator
Registrerad
Jul 2017

Undantagshantering kan också t.ex. handla om att programmet ska kunna hantera om användaren matar in något som inte är ett tal, t.ex. skriver ordet "mangosmoothie" istället för en temperatur.

Skickades från m.sweclockers.com

En bild säger mer än tusen ord. Så här gör du för att lägga upp bilder till ditt foruminlägg.

Synpunkter på moderering eller andra frågor om siten? Välkommen att kontakta oss via Sweclockers kontaktformulär eller i feedback-forumet.

Trädvy Permalänk
Medlem
Registrerad
Aug 2017

Loopen stannar för tidigt!

pv2b, jag förstog inte riktigt var du menar att jag ska lägga in code, i kodnings programmet eller här, och var det ska placeras.
Jag har gjort om lite smått i koden och det som är problemet är att när jag får upp konsollen skrivs: Ange grader för bastuaggregat i Fahrenheit: ut.
När jag sedan skriver in ett nummer skrivs if satsen som stämmer ut, sedan när jag skriver in nästa nummer skrivs: programmet slut, ut.

Jag vill alltså att programmet ska fortsätta köras till man knappat in rätt temperatur.

namespace Uppdrag_2_Bastu_andraforsok { class Program { static int FahrenheitToCelsius(int fahr) { int cel = ((fahr - 32) * 5) / 9; //metod beräknar Fahrenheit till Celsius. Konverterar. return cel; //returnerar värde. } static void Main(string[] args) { Console.WriteLine("Ange grader för bastuaggregat i Fahrenheit: "); //skriver ut sträng. int fahrenheitInmatat = Convert.ToInt32(Console.ReadLine()); //omvandlar till celsius. int celsiusOmvandlat = FahrenheitToCelsius(fahrenheitInmatat); //Metodanrop, int celsius omvandlar automatiskt från fahrenheit till Celsius när användaren matar in fahrenheit. do { if (celsiusOmvandlat < 73) { Console.WriteLine("Temperaturen är nu {0}, det är för kallt, skruva upp värmen lite!: ", fahrenheitInmatat); Console.ReadLine(); } else if (celsiusOmvandlat > 77) { Console.WriteLine("Temperaturen är nu {0}, det är för varmt, skruva ner värmen lite!: ", fahrenheitInmatat); Console.ReadLine(); } else if (celsiusOmvandlat == 75) { Console.WriteLine("Nu är temperaturen {0}, perfekt!", fahrenheitInmatat); Console.ReadLine(); } else { Console.WriteLine("Nu går det att basta! "); Console.ReadLine(); } }while (celsiusOmvandlat <= 73 || celsiusOmvandlat >= 77); Console.Write("Programmet slut"); Console.ReadKey(); } } }

I uppgiften ingår även undantags hantering, jag antar att jag borde använda try och catch som skriver ut något, om något går fel. Om man tex matar in en bokstav istället för en siffra.

Tack till er som tar er tid att svara!

Fixade code-taggarna //Mod
Trädvy Permalänk
Moderator
Registrerad
Jul 2017

Hej! Du har fattat nästan rätt vad du ska göra, för att koden ska kunna gå att läsa på forumet. Det du missat är att när du skriver [ code ] och [ /code ] så måste du ta bort mellanslagen som jag skrivit in. Anledningen att jag skrivit med mellanslag är att forumet annars tror att jag faktiskt ska skriva kod och då blir mitt inlägg helt kajko.

Editera alltså ditt inlägg och ta bort mellanslagen som är inom hakparanteserna så kommer det hela bli jätteläsbart!

Eller så kollar du i bilden nedan hur du ska göra så fattar du nog.

Nog om forumet, till din kod.

...

Problemet du har i din kod är att du inte riktigt tänkt efter vad det är som ska upprepas varje gång.

Du ska ju göra föjande:

- Fråga om och läs in nuvarande temperatur
- Konvertera inläst temperatur till celsius
- Beroende på vad temperaturen är gör olika saker

Sen ska du upprepa så länge temperaturen är "fel".

Det du gör i din kod är ju istället att bara läsa in temperaturen en gång och sedan loopa runt och kolla om celsiusOmvandlad ändrats... vilket det aldrig gör... då kommer du ju aldrig ur...

En bild säger mer än tusen ord. Så här gör du för att lägga upp bilder till ditt foruminlägg.

Synpunkter på moderering eller andra frågor om siten? Välkommen att kontakta oss via Sweclockers kontaktformulär eller i feedback-forumet.

Trädvy Permalänk
Medlem
Registrerad
Aug 2017

Tack!

@pv2b: Tack för hjälpen! Jag fick det att fungera!

Trädvy Permalänk
Proffsmobbare
fd. JaZid
Plats
Karlskrona
Registrerad
Dec 2007
Skrivet av Bananeripyamas:

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.

Ser problemet direkt! Den optimala temperaturen i en bastu är 100 grader.

Trädvy Permalänk
Medlem
Registrerad
Nov 2013

100 gradier celsius, jepp

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av pv2b:

Anledningen att jag skrivit med mellanslag är att forumet annars tror att jag faktiskt ska skriva kod och då blir mitt inlägg helt kajko.

Man kan använda noparse-taggar om man vill undvika det (tryck på Citera på mitt inlägg för att se BB-koden):
[code]
Kod här
[/code]

Eller magi:
[​code]
Kod här
[​/code]

Trädvy Permalänk
Moderator
Registrerad
Jul 2017
Skrivet av perost:

Man kan använda noparse-taggar om man vill undvika det (tryck på Citera på mitt inlägg för att se BB-koden):
[code]
Kod här
[/code]

Eller magi:
[​code]
Kod här
[​/code]

Fantastiskt! Tack!

En bild säger mer än tusen ord. Så här gör du för att lägga upp bilder till ditt foruminlägg.

Synpunkter på moderering eller andra frågor om siten? Välkommen att kontakta oss via Sweclockers kontaktformulär eller i feedback-forumet.

Trädvy Permalänk
Medlem
Registrerad
Mar 2018

Amerikanen Bastu

@Bananeripyamas:
Hej,
Kan du snälla skicka Amerikanen bastus kod som fungerade med dig?
Tack på förhand

Trädvy Permalänk
Medlem
Registrerad
Jan 2005

@MahirDJ:

Reggad i mars 2018. Uppenbar skoluppgift. Vill kopiera. Tragiskt.

Trädvy Permalänk
Medlem
Registrerad
Apr 2018
Skrivet av l4nky:

@MahirDJ:

Reggad i mars 2018. Uppenbar skoluppgift. Vill kopiera. Tragiskt.

Har också denna uppgiften men har redan gjort koden så kollar inlägg från andra för att få input till förbättringar i min egen kod

Den du svarade på var dock lite väl sorglig ^^

Trädvy Permalänk
Medlem
Registrerad
Feb 2019

Förstår inte try catch

Hej
jag sitter med samma uppgift och förstår inte hur jag ska koda try catch delen. Egentligen förstår jag inte mycket alls av den här kursen och tycker det är skit vilken "lärarhjälp" man får iom att man inte får någon. Svaret man får när man behöver hjälp är "googla. hitta svar online".
Känns sådär när man är helt ny på programmering och vill börja förbereda inför plugg längre fram.

Så kontentan är, om du ska döma ut en och dumförklara en så behöver du inte skriva något alls. Vill du däremot hjälpa och förklara på en pedagogisk nivå är du välkommen att svara så mycket du vill.

Jag har fått till all kod men får inte in try catch delen så koden fungerar. Så här har jag kodat.

/*
* Created by SharpDevelop.
* User: Ida
* Date: 2019-02-19
* Time: 15:00
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;

namespace Uppgift2_Amerikanaren
{
class Program
{
public static int FarenheitToCelsius(int farenheit)
{
int celsius = ((farenheit - 32) * 5/9); //metod för att beräkna farenheit till celsius
return celsius;
}
static void Main(string[] args)

{
int celsius;

do{

Console.WriteLine("Insert desired temperature for the sauna: ");
int farenheit = Convert.ToInt32(Console.ReadLine());
celsius = FarenheitToCelsius(farenheit);

Console.WriteLine("The temperature is " + celsius + " degrees celsius.");

if (celsius < 73){
Console.WriteLine("It's too cold for a sauna");
Console.ReadLine();
}
else if (celsius > 77)
{
Console.WriteLine("It's too hot for a sauna!");
Console.ReadLine();
}
else if (celsius == 75)
{
Console.WriteLine("It's the ultimate temperature for a sauna!");
Console.ReadLine();
}
else
{
Console.WriteLine("It's a good temp for a sauna!");
Console.ReadLine();
}
}

while(celsius <73 || 77< celsius);

}
}
}

Och denna kod fungerar jättebra så jag behöver inte bli "mer förvirrad" men att skriva om och ändra saker.
Min fråga är vart try och catch ska skrivas. Har tänkt att try ska skrivas in efter:

{
int celsius;

do{

Try
{
Kod jag inte vet
}

Console.WriteLine("Insert desired temperature for the sauna: ");
int farenheit = Convert.ToInt32(Console.ReadLine());
celsius = FarenheitToCelsius(farenheit);

Console.WriteLine("The temperature is " + celsius + " degrees celsius.");

catch
{
console.writeline("Please enter a number");
}

if (celsius < 73){
Console.WriteLine("It's too cold for a sauna");
Console.ReadLine();
}

etc

eller tänker jag fel??

Trädvy Permalänk
Medlem
Plats
Stenungsund
Registrerad
Okt 2007
Skrivet av IdaS:

Hej
jag sitter med samma uppgift och förstår inte hur jag ska koda try catch delen. Egentligen förstår jag inte mycket alls av den här kursen och tycker det är skit vilken "lärarhjälp" man får iom att man inte får någon. Svaret man får när man behöver hjälp är "googla. hitta svar online".
Känns sådär när man är helt ny på programmering och vill börja förbereda inför plugg längre fram.

Så kontentan är, om du ska döma ut en och dumförklara en så behöver du inte skriva något alls. Vill du däremot hjälpa och förklara på en pedagogisk nivå är du välkommen att svara så mycket du vill.

Jag har fått till all kod men får inte in try catch delen så koden fungerar. Så här har jag kodat.

/*
* Created by SharpDevelop.
* User: Ida
* Date: 2019-02-19
* Time: 15:00
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;

namespace Uppgift2_Amerikanaren
{
class Program
{
public static int FarenheitToCelsius(int farenheit)
{
int celsius = ((farenheit - 32) * 5/9); //metod för att beräkna farenheit till celsius
return celsius;
}
static void Main(string[] args)

{
int celsius;

do{

Console.WriteLine("Insert desired temperature for the sauna: ");
int farenheit = Convert.ToInt32(Console.ReadLine());
celsius = FarenheitToCelsius(farenheit);

Console.WriteLine("The temperature is " + celsius + " degrees celsius.");

if (celsius < 73){
Console.WriteLine("It's too cold for a sauna");
Console.ReadLine();
}
else if (celsius > 77)
{
Console.WriteLine("It's too hot for a sauna!");
Console.ReadLine();
}
else if (celsius == 75)
{
Console.WriteLine("It's the ultimate temperature for a sauna!");
Console.ReadLine();
}
else
{
Console.WriteLine("It's a good temp for a sauna!");
Console.ReadLine();
}
}

while(celsius <73 || 77< celsius);

}
}
}

Och denna kod fungerar jättebra så jag behöver inte bli "mer förvirrad" men att skriva om och ändra saker.
Min fråga är vart try och catch ska skrivas. Har tänkt att try ska skrivas in efter:

{
int celsius;

do{

Try
{
Kod jag inte vet
}

Console.WriteLine("Insert desired temperature for the sauna: ");
int farenheit = Convert.ToInt32(Console.ReadLine());
celsius = FarenheitToCelsius(farenheit);

Console.WriteLine("The temperature is " + celsius + " degrees celsius.");

catch
{
console.writeline("Please enter a number");
}

if (celsius < 73){
Console.WriteLine("It's too cold for a sauna");
Console.ReadLine();
}

etc

eller tänker jag fel??

Längre upp in tråden ombads man att skriva sin kod inom code taggarna.
Ditt exempel är knappt läsbart i detta format.

Exakt vad är det du inte får att fungera med catch-try?

Tips: Du använder catch-try för att fånga upp felaktiga inmatningar av olika slag från användaren, inuti en loop
som körs tills dess att användaren knappat rätt. En bool används enklast för att kontrollera denna loop.

- none -

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2010

@IdaS: Try catch funkar men I det här fallet passar int.tryparse bättre. Så fråga om temp och ta in svaret till en string, sen typ while(!int.tryparse(input) out grader) {fråga igen, ta in input till samma variabel } sen logiken för om det är för varmt osv.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013

Är det just try catch ni ska använda? I situationer där du förväntar dig fel är det enklare att göra som ovan nämnde, bool-värden eller null-checks och hantera det på det sättet.

T.ex. vid inmatning får man göra en TryParse istället för ConvertTo.

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Registrerad
Feb 2019

@zaibuf: Vi ska använda try catch, det är en del av uppgiften.

Trädvy Permalänk
Medlem
Registrerad
Feb 2019

@aztekk: hej, jag vet vad try catch används för och i de simpla exemplen vi har i boken förstår jag hur de är uppbyggda och hur de används. Problemet är att våra uppgifter inte direkt korrelerar med kursboken vi har eller hur vi ens ska förstå samband i uppgiften för att kunna lösa den.

Vi får ingen lärarhjälp utan svaren man får är "googla fram svar" så man får ingen ärlig chans att kunna förstå allt steg för steg.

Det jag inte förstod i denna uppgift var
1) VART i koden skriver jag in Try respektive catch
2) Vad ska det egentligen vara för kod under Try?

Nu löste jag koden med hjälp av en kompis som pluggar på Chalmers som förklarade hur det skulle göras utan att lägga till Bool eller några andra ändringar utan simpelt sätta int celsius = 0

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2010
Skrivet av IdaS:

@aztekk: hej, jag vet vad try catch används för och i de simpla exemplen vi har i boken förstår jag hur de är uppbyggda och hur de används. Problemet är att våra uppgifter inte direkt korrelerar med kursboken vi har eller hur vi ens ska förstå samband i uppgiften för att kunna lösa den.

Vi får ingen lärarhjälp utan svaren man får är "googla fram svar" så man får ingen ärlig chans att kunna förstå allt steg för steg.

Det jag inte förstod i denna uppgift var
1) VART i koden skriver jag in Try respektive catch
2) Vad ska det egentligen vara för kod under Try?

Nu löste jag koden med hjälp av en kompis som pluggar på Chalmers som förklarade hur det skulle göras utan att lägga till Bool eller några andra ändringar utan simpelt sätta int celsius = 0

Try/Catch används ju för att man vet att vissa saker kanske inte fungerar som tänkt, som i ditt fall att en användare skriver in något, vad som helst, och du behöver ha en siffra. Så i try behöver du ha omvandlingen från string till int (eller, du borde nog köra med en float eller decimal och inte int, men det är en annan diskussion), sen i catch har du det som hanterar felet som uppstår, alltså be användaren att mata in ett nytt värde, sen gör du kollen i try igen osv.

decimal degrees; string input; ... while(true) { try { degrees = decimal.Parse(input); } catch(Exception e) { //Skriv ut något om felaktig inmatning och be användaren mata in nytt. input = //vad användaren skriver in, console.readline eller så continue; //går vidare till nästa loop i while } break;//avbryter while då man inte hamnar här om man får ett exception från try }

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013
Skrivet av IdaS:

Det jag inte förstod i denna uppgift var
1) VART i koden skriver jag in Try respektive catch
2) Vad ska det egentligen vara för kod under Try?

1 & 2) Du sätter try blocket runt koden som kan throwa ett exception, t.ex. i detta fall

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

Skriver användaren in "fkewkfwekf" så kommer programmet smälla då du inte kan konvertera den strängen till ett heltal.
Då kan du hämta det exceptionen i ett catch block

Generellt sätt att skriva är

catch(Exception e) { // Hantera felet här, t.ex. logga till en fil eller printa ut ett meddelade till användaren. // Exception kommer att hantera ALLA fel som kan uppstå. }

Notera dock att detta är bad practise, då du inte vill fånga upp ALLA fel som kan ske, det kan göra så att programmet blir korrupt eller hämtar felaktig data och ändå fortsätter att köra.
Tänk om det blir fel i inläsningen och programmet hämtar och visar 0 kr i saldo på ditt konto, fast du har egentligen 200 tusen.
Bra att släppa igenom detta fel?
catch(Exception e) är dock bra att använda vid tillfällen då du vill fånga upp alla fel under utvecklingsmiljö för att få mer information om felen och på så vis kunna hantera dem annorlunda.

I detta fall bör du istället skriva

catch (FormatException e) { /* För du vet att felet som förväntas är ett formateringsfel * då programmet måste få ett heltal av användaren * för att konvertera till int. */ }

Detta är också bra för att felhanteringen kan ske på olika sätt (t.ex. vad som visas för användaren/loggas) beroende på felet som fångas.

Notera dock att det är också bad practise att skriva try-block runt kod som förväntas kunna ge fel, du vet redan att användaren kanske skriver något dumt och då är det enklare att använda:

int.TryParse(Console.ReadLine(), out int farenheit);

Detta ger då istället ett bool värde, som du kan kontrollera med en if-sats och en loop. Try-catch block segar ner programmen och används bara vid specifika tillfällen.

Trädvy Permalänk
Medlem
Registrerad
Maj 2019

Hej
Jag hoppas kunna få hjälp här. Jag är HELT ny på att programmera i C# och Jag har också fått bastu uppgiften. Jag förstår inte hur jag ska lägga in Try Catch i min loop och vad jag ska skriva i mellan.
Jag får dessutom inte mina 73 &&77 att fungera, varför skriver den inte ut texten jag har under? Om jag skulle skriva in rätt grader i första försöket funkar inte loopen, vag har jag gjort för fel? Jag har bett om hjälp av läraren men får absolut ingen hjälp. Snälla kan ni hjälpa mig utan att skriva massa konstiga meningar och dumförklara mig.

{ public static int FahrenheitToCelsius(int fahrenheit) // namnger metoden { int celsius = (fahrenheit - 32) * 5 / 9; //Konventerar från fahrenheit till celsius return celsius; //returnerar värdet } public static void Main(string[] args) { Console.WriteLine("Ange grader i Fahrenheit"); // användaren ombes ange grader i fahrenheit int fahrenheit = int.Parse(Console.ReadLine()); // användaren skriver in ett värde i fahrenheit int celsius = FahrenheitToCelsius(fahrenheit);// användarens tal i fahrenheit omvandlas till celsius do { if (celsius < 73) // om graderna är under minivärdet, 73 ombes användaren höja { Console.WriteLine("Det är {0} grader Celsius, höj värmen:", celsius); } else if (celsius > 77) // om graderan är över maxvärdet, 77 obes användaren sänka { Console.WriteLine("Det är {0} grader Celsius, sänk värmen:", celsius); } else if (celsius == 75 )// om graderana är optimala 75 { Console.WriteLine("Det är {0} Celsius. Perfekt värme. Njut! ", celsius); } else if (celsius > 73 && celsius < 77 ) // om temperaturen mellan 73 & 77 { Console.WriteLine("Du har {0} Celsius, bra värme.", celsius); } fahrenheit = int.Parse(Console.ReadLine()); celsius = FahrenheitToCelsius(fahrenheit); } while (celsius < 73 || celsius > 77); // loopen fortsätter så länge ovanstående if och else if inte stämmer Console.WriteLine("Ha en skön bastustund"); Console.WriteLine("Press any key to continue..."); Console.ReadKey(); }

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@JennieL: Logiken i din kod ser just nu ut ungefär så här:

celsius = läs in värde gör skriv ut meddelande baserat på värdet av celsius celsius = läs in värde medan celsius är mindre än 73 eller större än 77

Den första gissningen kommer alltså aldrig användas för att kontrollera om loopen ska fortsätta eller ej, eftersom du alltid läser in ett nytt värde i slutet av loopen.

I det här fallet så behöver du inte ha inläsning på flera ställen i koden, utan det räcker med att läsa in värdet i början av loopen. D.v.s. du bör inte ha "första gissningen" som ett specialfall utanför loopen, utan hantera alla gissningar på samma sätt inne i loopen istället.

Du måste dock fortfarande deklarera celsius före loopen för att kunna använda variabeln i while-villkoret, men du behöver inte ge den något värde före loopen.

Något jag starkt rekommenderar dig att göra är sen att gå igenom denna guide som visar hur debuggern fungerar, vilket obegripligt nog inte brukar ingå i kurserna. Om du lägger några minuter på att lära dig använda den så kommer du spara väldigt mycket tid på felsökning, eftersom du då kan stega igenom din kod rad för rad och se exakt vad som händer.

Trädvy Permalänk
Medlem
Plats
Eskilstuna
Registrerad
Aug 2008
Skrivet av JennieL:

Hej
Jag hoppas kunna få hjälp här. Jag är HELT ny på att programmera i C# och Jag har också fått bastu uppgiften. Jag förstår inte hur jag ska lägga in Try Catch i min loop och vad jag ska skriva i mellan.
Jag får dessutom inte mina 73 &&77 att fungera, varför skriver den inte ut texten jag har under? Om jag skulle skriva in rätt grader i första försöket funkar inte loopen, vag har jag gjort för fel? Jag har bett om hjälp av läraren men får absolut ingen hjälp. Snälla kan ni hjälpa mig utan att skriva massa konstiga meningar och dumförklara mig.

} while (celsius < 73 || celsius > 77); // loopen fortsätter så länge ovanstående if och else if inte stämmer Console.WriteLine("Ha en skön bastustund"); Console.WriteLine("Press any key to continue..."); Console.ReadKey(); }

Här skriver du bara ut ”Ha en skön bastustund” om temperaturen är mindre än 73 eller högre än 77. 🤔

Skickades från m.sweclockers.com

MSI B450 TOMAHAWK,Amd Ryzen 7 2700x,Evga geforce 980ti

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av patrik033:

Här skriver du bara ut ”Ha en skön bastustund” om temperaturen är mindre än 73 eller högre än 77. 🤔

Nej, det skrivs ju ut efter loopen, och loopen kommer fortsätta så länge som villkoret är sant (d.v.s. temperaturen är mindre än 73 eller större än 77). Däremot så skrivs inget ut inne i loopen om temperaturen är exakt 73 eller 77 grrader ser jag nu.

Trädvy Permalänk
Medlem
Registrerad
Maj 2019

@perost Hur gör jag så att något skriv ut i? Fattas = tecknet? Tycker jag testar allt.

else if (celsius > 73 && celsius < 77 ) // om temperaturen mellan 73 & 77
{
Console.WriteLine("Du har {0} Celsius, bra värme.", celsius);

}

Min andra fråga: Var och hur sätter jag ut try och catch, jag förstår varför man sätter ut dem men jag förstå inte var. Jag har testat olika ställen men det känns bara som jag gör fel.

Dessutom säger den att jag har: Indatasträngen har felaktigt format.

fahrenheit = int.Parse(Console.ReadLine());

Vad har jag skrivit fel?

Tacksam för all hjälp./ Jennie

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av JennieL:

@perost Hur gör jag så att något skriv ut i? Fattas = tecknet? Tycker jag testar allt.

Din if-sats inne i loopen har just nu fall för när temperaturen är mindre än 73, större än 77, exakt 75, eller större än 73 och mindre än 77. Inget av de fallen kommer vara sant när temperaturen är exakt 73 eller 77. Loopen kommer dock avslutas när temperaturen är 73 eller 77, så du bör ändra det sista fallet i if-satsen till att även acceptera 73 och 77 (d.v.s. ändra till >= och <=) så att utskriften matchar beteendet.

Skrivet av JennieL:

Min andra fråga: Var och hur sätter jag ut try och catch, jag förstår varför man sätter ut dem men jag förstå inte var. Jag har testat olika ställen men det känns bara som jag gör fel.

Du sätter try-catch runt int.Parse eftersom int.Parse kommer att kasta ett exception om strängen inte kan tolkas som ett tal, vilket du vill fånga med catch. Om du gjort som jag skrev i mitt förra inlägg så bör du endast ha ett enda anrop till int.Parse i koden, i början av loopen. I så fall kan du använda continue; i catch-satsen för att hoppa tillbaka till början av loopen när något som inte är ett tal skrivs in av användaren. T.ex.:

int i = 0; while (i < 3) { // Loopa medan i är mindre än 3 i++; // Öka i med 1 if (i == 2) { // Om i är 2... continue; // Hoppa över resten av loopen. } Console.WriteLine(i.ToString()); }

Denna loop kommer att skriva ut 1 och 3, men inte 2. Man kan även använda break; för att direkt avbryta en loop, och både break och continue fungerar även med for-loopar.

Skrivet av JennieL:

Dessutom säger den att jag har: Indatasträngen har felaktigt format.

Det beror på att int.Parse fått en sträng som inte kan tolkas som ett tal, vilket är vad du vill hantera med try-catch.