Permalänk
Medlem

Do while i C# bråkar med mig

Hej!

Är superdupernybörjare på programmering så be gentle...

Jag håller på med en kod där man användaren ska ange ett värde i Fahrenheit. Detta ska sen konverteras till Celsius. Användaren ska mata in värden fram till att den träffar följande:
75 grader = optimalt
73 grader är lägsta godtagbara temperatur
77 grader är högsta godtagbara temperatur.

Jag har skrivit nedan kod, men har försökt köra en do while på det. Första problemet var att VB sa ifrån vid while (celsius <73 && celsius >77) och föreslog att jag lägger: bool celsius uppe i public static int celsius { get; private set; }. Den ville sedan inte använda bool och jag gjorde bara om det till int.

Problemet är nu att allting verkar OK MEN när jag kör programmet och ska följa mina egna instruktioner (som användaren då får), så loopas inget utan programmet stängs av trots Console.ReadLine();

Alltså - jag har totalt hjärnsläpp. Känns som att jag har svaret på tungan men ser i kors just nu och lyckades inte läsa mellan (kod)raderna (haha...)

Kan ni finna ett eller fler fel här?

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AmerikaneniBastun { class Program { public static int celsius { get; private set; } public static int FahrToCels(int fahr) { int cel = (fahr - 32) * 5 / 9; return cel; } static void Main(string[] args) { Console.WriteLine("Välkommen till bastun! Skriv in Fahrenheit: "); do { int fahrenheit = int.Parse(Console.ReadLine()); int celsius = FahrToCels(fahrenheit); if (celsius < 73) { Console.WriteLine("Det är för kallt, du kommer inte gilla det! Skriv in ny temperatur. "); } else if (celsius > 77) { Console.WriteLine("Det är för varmt, oj oj oj... Skriv in ny temperatur. "); } else if (celsius == 75) { Console.WriteLine("Temperaturen är optimal för bastubadande! God bless America! "); } else { Console.WriteLine("Det går att basta! Enjoy!"); } } while (celsius < 73 && celsius > 77); Console.ReadLine(); } } }

Permalänk
Hedersmedlem

Ta bort raden där det står

public static int celsius { get; private set; }

Här har du lyckats skapa en klass-"property" som heter "celsius". Det är inget som ni har lärt er i kursen än. Visual Studio har helt enkelt gett dig ett dåligt lösningförslag. Ta bort detta helt.

Sen är problemet att du försöker kolla vad variabeln "celsius" är i själva do-while-villkoret, som räknas som "utanför" loopen (även om det är lite ologiskt). Prova att definiera "int celsius" precis ovanför do-while-loopen istället.

Permalänk
Medlem

@pv2b: Ahh! Såklart. Flyttade ner do under :

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

Problemet är fortfarande att programmet bara kör en rad och sen stänger av. Jag gissar en gång och sen får jag "press any key to continue" varpå programmet stängs av. Kan det ha att göra med att jag använder int istället för double? Enligt uppgiften borde den bara kapa ett decimalvärde utan att försöka avrunda om det är int när den omvandlar och programmet SKA funka även med INT men värdena kan bli lite off. Kör jag en double måste jag konvertera med nåt som heter explicit konvertering and god knows I already have issues with converting så jag avstår helst.

Övervägde om Console.ReadLine(); var problemet någonstans. Men om så vore problemet hade den ju bara stängt ner efter ATT faktiskt ha kör min loop?

Permalänk
Hedersmedlem
Skrivet av Uppgiven:

@pv2b: Ahh! Såklart. Flyttade ner do under :

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

Problemet är fortfarande att programmet bara kör en rad och sen stänger av. Jag gissar en gång och sen får jag "press any key to continue" varpå programmet stängs av. Kan det ha att göra med att jag använder int istället för double? Enligt uppgiften borde den bara kapa ett decimalvärde utan att försöka avrunda om det är int när den omvandlar och programmet SKA funka även med INT men värdena kan bli lite off. Kör jag en double måste jag konvertera med nåt som heter explicit konvertering and god knows I already have issues with converting så jag avstår helst.

Övervägde om Console.ReadLine(); var problemet någonstans. Men om så vore problemet hade den ju bara stängt ner efter ATT faktiskt ha kör min loop?

Nej, den ändringen då blir det bara "mer" fel... alltså... då läser den ju bara in värdena en gång... och sen loopar den bara.

Ändra tillbaka din kod till som den var innan du gjorde ändringen ovan, men ta bort "int" framför celsius, och skriv sedan "int celsius" innan do-while-loopen.

Just det, ditt slutvillkor är ju fel också. Du fortsätter alltså att köra loopen sålänge temperaturen är under 73 grader och den samtidigt är över 75 grader. Det är ju något som rent logiskt är omöjligt om du tänker efter.

Permalänk
Medlem
Skrivet av Uppgiven:

@pv2b: Ahh! Såklart. Flyttade ner do under :

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

Problemet är fortfarande att programmet bara kör en rad och sen stänger av. Jag gissar en gång och sen får jag "press any key to continue" varpå programmet stängs av. Kan det ha att göra med att jag använder int istället för double? Enligt uppgiften borde den bara kapa ett decimalvärde utan att försöka avrunda om det är int när den omvandlar och programmet SKA funka även med INT men värdena kan bli lite off. Kör jag en double måste jag konvertera med nåt som heter explicit konvertering and god knows I already have issues with converting så jag avstår helst.

Övervägde om Console.ReadLine(); var problemet någonstans. Men om så vore problemet hade den ju bara stängt ner efter ATT faktiskt ha kör min loop?

Bara kör en rad? Menar du att du bara får gissa en gång och sedan stängs programmet av?

I så fall beror det på att ditt villkor

while (celsius < 73 && celsius > 77)

alltid kommer vara falskt (celsius kan inte vara mindre än 73 och större än 77 samtidigt!).

Permalänk
Medlem

@Snigeln Bert: Hahaha, såklart det inte kan - ser det nu. Försökte få till en loop som ska loopa så länge användare gissar på allt under 73 och allt över 77. allt mellan 73 och 77 är alltså OK, men har snurrat in mig själv så mycket nu att jag knappt vet vad jag själv heter.

Permalänk
99:e percentilen
Skrivet av Uppgiven:

@Snigeln Bert: Hahaha, såklart det inte kan - ser det nu. Försökte få till en loop som ska loopa så länge användare gissar på allt under 73 och allt över 77. allt mellan 73 och 77 är alltså OK, men har snurrat in mig själv så mycket nu att jag knappt vet vad jag själv heter.

celsius < 73 && celsius > 77 är aldrig sant, men celsius < 73 || celsius > 77 är sant för vissa värden på celsius. Kanske kan det hjälpa dig. Jag hade för övrigt övervägt den mer visuellt symmetriska varianten celsius < 73 || 77 < celsius, som jag tycker är lättare att tolka.

Förvirringen kan för övrigt härstamma från en diskrepans mellan naturliga språk och formella språk. I de förstnämnda är vi vana vid att inte säga exakt det vi menar och förvänta oss att en korrekt tolkning ändå kan göras baserat på kontext, idiomatiska konventioner och andra faktorer. En formulering som "allt under 73 och allt över 77" är begriplig för en människa och kan vara frestande att översätta till x < 73 && x > 77. Egentligen är den dock ganska otydlig; du menar ju snarare "något under 73 eller något över 77".

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem
Skrivet av Alling:

celsius < 73 && celsius > 77 är aldrig sant, men celsius < 73 || celsius > 77 är sant för vissa värden på celsius. Kanske kan det hjälpa dig. Jag hade för övrigt övervägt den mer visuellt symmetriska varianten celsius < 73 || 77 < celsius, som jag tycker är lättare att tolka.

Förvirringen kan för övrigt härstamma från en diskrepans mellan naturliga språk och formella språk. I de förstnämnda är vi vana vid att inte säga exakt det vi menar och förvänta oss att en korrekt tolkning ändå kan göras baserat på kontext, idiomatiska konventioner och andra faktorer. En formulering som "allt under 73 och allt över 77" är begriplig för en människa och kan vara frestande att översätta till x < 73 && x > 77. Egentligen är den dock ganska otydlig; du menar ju snarare "något under 73 eller något över 77".

Right, right, nu förstår jag, it makes sense, haha. Jag ska tänka såhär nästa gång! Nu fick en kompis hjälpa mig hands on så det blev istället ett break och en while (true), så det var mycket snyggare och enklare än det jag hade i huvudet här, haha.

Skickades från m.sweclockers.com