Inlämning amerikanen i Bastun C#

Permalänk

Inlämning amerikanen i Bastun C#

Hej!

Jag tar en preparandkurs just nu i gymnasiekursen programmering 1 för att sedan söka in till en mjukvarutestar utbildning.

Har en inlämning som ska göras till idag men har fastnat lite.
Instruktionerna lyder såhär: 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.

Koden som jag har skrivit in än så länge är :

namespace Uppdrag { class Program { public static int FahrToCels(int fahr) // metod för omvandling från Fahrenheit // till celcius { int cel = ((fahr-32) * 5 / 9); // metod beräknar Fahrenhet till Celcius. Konverterar return cel; // Returnerar värde } public static void Main(string[] args) { Console.WriteLine("Skriv in Fahrenheit : "); // Skriver in grader i fahrenheit int fahr=Convert.ToInt32(Console.ReadLine()); int fahrenheit=int.Parse(Console.ReadLine());// Användaren skriver in ett värde som lagras i fahrenheit int celcius = FahrToCels(fahrenheit); //Metodanrop, int celsius omvandlar automatiskt från fahrenheit till Celsius när användaren matar in fahrenheit. do { if (celcius < 73) { Console.WriteLine("Skruva upp värmen lite, temperaturen är för kall: "); Console.ReadLine(); } else if (celcius > 77) { Console.WriteLine("Skruva ner värmen lite, temperaturen är för hög: "); Console.ReadLine(); } else Console.WriteLine("Nu går det att basta!"); Console.ReadLine(); } while (celcius <= 73 || celcius >= 77); Console.Write("Press any key to continue..."); Console.ReadKey(true); } } }

När jag sedan debuggar i Visual studio så får jag fram att jag ska skriva in Fahrenheit värdet, men jag måste skriva två värden för att ens få upp någon av writeline texterna. Och när jag väl har fått upp någon av writeline texterna s kommer samma text upp hela tiden oavsett vilka nummer jag skriver in.

Som sagt; Är väldigt ny med programmering. Började för bara 2-3 veckor sen ungefär så förlåt om jag inte förstår eller är helt trög när det gäller sånt här.

Tack på förhand!

Permalänk
Medlem

Är ni klasskompisar eller? Flera med samma uppgift som gör typ samma fel. Har bara snabbt skummat igenom, men du lagrar aldrig värdet av Console.Readline() i loopen.

Skickades från m.sweclockers.com

Visa signatur

Core i7 7700K | Titan X (Pascal) | MSI 270I Gaming Pro Carbon | 32 GiB Corsair Vengeance LPX @3000MHz | Samsung 960 EVO 1TB

Permalänk

@Nioreh83: Nej, jag läser kursen online under loppet av ca 5-6 veckor ungefär. Jag läste inte teknik eller något som hade med programmering att göra i gymnasiet så jag är tvungen att ta kursen nu för att kunna läsa till det jag vill bli.

Hmm, Jag kan se om jag kan skicka en bild på "kodhjälpen" som jag fick i själva pdf:en till uppgiften.

https://gyazo.com/619e7139a1ce83507869efea458b7f0d

Vet inte riktigt vad jag borde göra med den och min kod, förutom att försöka att lägga till en try/catch

Permalänk

Denna uppgift verkar vara ganska vanlig då det finns flera trådar på detta forum kring detta.

Jag tycker att dun kod se i stort sett ganska bra ut men det finns egentligen två fel.
Till att börja med har du två olika variabler, fahr och fahrenheit. Kolla hur du använder dem och ta bort den ena.

När du väl har löst det första problemet kommer du nog att märka att du fastnar i en oändlig loop eftersom du aldrig uppdaterar variablerna för loop-vilkoret.

Permalänk

@FrazzorXx: Aa, jag vet. Kollade igenom dem trådarna och tog lite inspiration från dem, men lyckades inte lösa koden helt och hållet.
Kan även tillägga att jag nu lade till:

int maxTemp = 77; int minTemp = 73; int optTemp = 75;

I koden.

Sen är jag lite fast som sagt. Fortfarande väldigt nytt och mycket för mig att lära mig.

Permalänk
Skrivet av FrazzorXx:

Denna uppgift verkar vara ganska vanlig då det finns flera trådar på detta forum kring detta.

Jag tycker att dun kod se i stort sett ganska bra ut men det finns egentligen två fel.
Till att börja med har du två olika variabler, fahr och fahrenheit. Kolla hur du använder dem och ta bort den ena.

När du väl har löst det första problemet kommer du nog att märka att du fastnar i en oändlig loop eftersom du aldrig uppdaterar variablerna för loop-vilkoret.

Ok, så jag vet inte riktigt om jag fattade exakt vad du sade men jag ändrade om dem som hade fahrenheit till att bara vara fahr.

Sen märkte jag också att det inte finns något efter else satsen. Borde jag skriva till att om

else (celcius=75) Console.WriteLine("Nu går det att basta!"); Console.ReadLine();

Permalänk
Medlem

Console.readline

Du gör inget med resultatet av den

Skickades från m.sweclockers.com

Visa signatur

Core i7 7700K | Titan X (Pascal) | MSI 270I Gaming Pro Carbon | 32 GiB Corsair Vengeance LPX @3000MHz | Samsung 960 EVO 1TB

Permalänk

@Nioreh83: Okej. Jag förstår inte bara vad jag ska göra. Behöver jag lägga till något inuti dem eller vad behöver jag göra?

Permalänk

Det som kommer hända flera gånger behöver du ha i do-blocket. Just nu när du kör Console.ReadLine(); kommer du bara stoppa programmet och ingenting händer. celcius deklarerar du och tilldelar ett värde EN GÅNG. Sedan uppdaterar du aldrig det igen. Om du flyttar din kod och lägger i do-blocket kommer alltså celcius att hämtas ifrån användaren flera gånger och då kommer dina jämförelser att fungera.

När du kör programmet nu kommer den bara stå och snurra eftersom att din while tittar på celsius som aldrig uppdateras.

Permalänk
Medlem

@Nybörjareprogrammering:

Det du bör kika på är hur man tilldelar en variabel ett värde och framförallt hur man uppdaterar den variabel i ett senare skede. Se exempel nedan för hur det kan göras.

string nickname = "noyce"; // Deklarerar och tilldelar variabeln ett värde Console.WriteLine(nickname); // Printar ut värdet på variabeln nickname -> noyce nickname = "superman"; // tilldelar variabeln nickname ett nytt värde Console.WriteLine(nickname); // Printar ut värdet på variabeln nickname -> superman

Uppdaterar du variabeln celcius med något nytt värde som är villkoret genom hela din while-loop, eller tilldelar du den endast en gång i början och sen struntar i den? Sparas värdet någonstans när du endast skriver

Console.ReadLine();

eller försvinner det i tomma intet?

Permalänk
Medlem
Skrivet av Nybörjareprogrammering:

@Nioreh83: Okej. Jag förstår inte bara vad jag ska göra. Behöver jag lägga till något inuti dem eller vad behöver jag göra?

Console.ReadLine är ett metodkall, vilket kortfattat innebär att det körs en fnutt kod någon annanstans. När den koden är körd så kan det skickas tillbaks ett värde (i detta fallet en sträng, eller null) som du kan behandla.

Du kan helt enkelt göra något liknande;

string InputLine = Console.ReadLine(); //Läs raden från konsollen och spara i InputLine Console.WriteLine(InputLine + " matades in"); //Skriv ut raden med tillägget " matades in".

Permalänk
Medlem

Du ska använda readline när du vill läsa ett värde, detta borde bara ske en gång per loop dvs. när du hämtar nästa temperatur i fahrenheit att testa.

Visa signatur

Redbox: Asrock B650 Lightning ATX, 7800x3D -20CCO, XFX 6950XT, 2x32GB Corsair Vengence 6400 CL32, WD SN770 2TB, Corsair RMe 1000, Lian Li Lancool 216, Peerless Assassin 120 SE
Purpbox: Z87-Pro, I5 4670K@4.2, Sapphire 290 TRI-X, 2x8GB Crucial Tactical@stock, Deep Silence 1
Samsung Evo 250+500GB + QVO 1TB, 2x1TB 7200RPM backup/lagring
Det var bättre förr: E5300 2600MHz -> 3640MHz, Celeron 300A -> 450MHz

Permalänk

Okej, så jag hittade något och såhär ser min kod ut nu:

namespace ConsoleApplication8 { class Program { private static int fahrenheit; private static int celsius; public static int FahrToCels(int fahrenheit) {//Gör uträkning Fto C int celsius = ((fahrenheit - 32) * 5) / 9; // metod beräknar Fahrenhet till Celcius. Konverterar return celsius;//uträkning kommer till c, returnerar värde } public static void Main(string[] args) { { int correcttemperaturcelsius = 75; int mintemperaturecelsius = correcttemperaturcelsius - 2;//73 162 int maxtemperaturecelsius = correcttemperaturcelsius + 3; //75 170 do { Console.Write("Write down the temperature in fahrenheit : "); fahrenheit = Convert.ToInt32(Console.ReadLine()); celsius = FahrToCels(fahrenheit); // omvandlar if (celsius > maxtemperaturecelsius) { Console.WriteLine(" You wrote in Fahrenheit " + fahrenheit + " The temp is too high, turn down! It's " + FahrToCels(fahrenheit) + " degrees in celcius"); } if (celsius < mintemperaturecelsius) { Console.WriteLine(" You wrote in Fahrenheit " + fahrenheit + " Its too low, turn up! Its " + FahrToCels(fahrenheit) + " degrees in celsius "); } else if (celsius == correcttemperaturcelsius) { Console.WriteLine(" You wrote in Fahrenheit " + fahrenheit + " The temperature is perfect, in celsius " + FahrToCels(fahrenheit) + " degrees in celsius "); } else if (celsius >= 164 || celsius <= maxtemperaturecelsius) { Console.WriteLine(" You wrote in Fahrenheit " + fahrenheit + " The temperature is good but not perfect! It's " + FahrToCels(fahrenheit) + "degrees in celsius"); try { fahrenheit = int.Parse(Console.ReadLine()); celsius = int.Parse(Console.ReadLine()); } catch { Console.WriteLine(" Skriv nummer!"); } } } while (celsius < maxtemperaturecelsius || celsius > mintemperaturecelsius || celsius != 75); { Console.ReadLine(); } } } } }

Nu är min fråga bara: Hur ska jag ta mig ur loopen? Och finns det något sätt att få texten att komma i nya rader eller se snyggare ut än på den här bilden som jag länkar nedan?

https://gyazo.com/40c51acaf7ab3b4e993f85c00f663768

Permalänk
Medlem

@Nybörjareprogrammering: Du gör samma logiska fel som de flesta verkar göra med denna uppgift, d.v.s. du börjar med att läsa in ett värde från användaren och först därefter börjar du loopa. Att göra på det sättet krånglar bara till det, i själva verket behöver du enbart ha ett enda anrop till Console.ReadLine i koden. Och det anropet måste förstås ligga inne i loopen, eftersom hela syftet med loopen är att låta användaren gissa flera gånger.

Permalänk

@perost: I den senaste koden som jag länkade så kan användaren gissa flera gånger. Skriver in ett värde och sen så kommer texten upp som ger användaren en hint om hur nära man är.

Permalänk
Medlem
Skrivet av Nybörjareprogrammering:

@perost: I den senaste koden som jag länkade så kan användaren gissa flera gånger. Skriver in ett värde och sen så kommer texten upp som ger användaren en hint om hur nära man är.

Fast nu har du bara kopierat någon annans lösning, som är ungefär lika mycket fel som din ursprungliga lösning. Försök lösa problemet själv istället, annars kommer du få väldigt svårt i kursen framöver. Fundera på hur flödet i koden egentligen ska vara i stora drag utan att gräva ner dig i detaljerna. En korrekt lösning ska som sagt endast ha ett anrop till Console.ReadLine, inte fyra som din senaste kod har.

Permalänk

Du borde verkligen först och främst göra något enklare bara för att förstå hur en while loop funkar och hur du kan ta dig ur den.
T.ex bryt loopen när något över 10 skrivs.

Skickades från m.sweclockers.com

Permalänk

Tack för all hjälp. Särskilt @perost och @linus_nyren.

Jag gjorde klart koden nu och den verkar funka bra.
Såhär ser den ut:

class Program { private static int fahr; private static int celsius; public static int FahrToCels(int fahr) // metod för omvandling från Fahrenheit // till celcius { int celcius = ((fahr - 32) * 5) / 9; // metod beräknar Fahrenhet till Celcius. Konverterar return celcius; // Returnerar värde } public static void Main(string[] args) { { int optTemp = 75; int minTemp = optTemp -2;// 73 162 int maxTemp = optTemp +3; //75 170 do { Console.Write("Write down the temperature in Fahrenheit : "); // Skriver in grader i fahrenheit fahr = Convert.ToInt32(Console.ReadLine()); celsius = FahrToCels(fahr); //Metodanrop, int celsius omvandlar automatiskt från fahrenheit till Celsius när användaren matar in fahrenheit if (celsius > maxTemp) { Console.WriteLine(" You wrote in Fahrenheit " + fahr + " The temp is too high, turn down! It's " + FahrToCels(fahr) + " degrees in celcius"); } if (celsius < minTemp) { Console.WriteLine(" You wrote in Fahrenheit " + fahr + " Its too low, turn up! Its " + FahrToCels(fahr) + " degrees in celsius "); } else if (celsius == optTemp) { Console.WriteLine(" You wrote in Fahrenheit " + fahr + " The temperature is perfect, in celsius " + FahrToCels(fahr) + " degrees in celsius "); } else if (celsius >= 164 || celsius <= maxTemp) { Console.WriteLine(" You wrote in Fahrenheit " + fahr + " The temperature is good but not perfect! It's " + FahrToCels(fahr) + "degrees in celsius"); } try { fahr = int.Parse(Console.ReadLine()); celsius = int.Parse(Console.ReadLine()); } catch { Console.WriteLine(" write a number"); } break } while (celsius < maxTemp || celsius > minTemp || celsius != optTemp); { Console.ReadLine(); } } } } }

Nu är min sista fråga vart jag ska lägga breaken så att man kommer ut ur loopen EFTER att man har skrivit den optimala tempen, vilket är 167 grader Fahrenheit och 75 grader Celsius.

Permalänk
Medlem

Det märks att det är en Amerikan och inte en Finne i bastun om den optimala temperaturen är iskalla 75 grader.

Visa signatur

"Om man arbetar tillräckligt länge med att förbättra ett föremål går det sönder. "

Hjälp oss göra världen lite snällare! www.upphittat.nu

Permalänk

@ZecretW: Haha, håller med! Men det är vad uppgiften sade att temperaturen skulle vara!

Permalänk
Medlem
Skrivet av Nybörjareprogrammering:

Nu är min sista fråga vart jag ska lägga breaken så att man kommer ut ur loopen EFTER att man har skrivit den optimala tempen, vilket är 167 grader Fahrenheit och 75 grader Celsius.

Du behöver ingen break någonstans. Problemet du har är delvis att du har inläsning på flera ställen i koden som ställer till det. Jag upprepar: du behöver endast ha ett anrop till Console.ReadLine i koden, allt annat gör bara koden mer komplicerad än den behöver vara.

Och sen är villkoret i while-satsen helt fel också, det var rätt i ditt första försök men du kopierade som sagt någon annans felaktiga lösning.

Permalänk
Medlem

Du behöver ingen break. Din loop styrs av ett villkor. Villkoret skall vara uppfyllt för att loopen skall fortsätta. Uppfylls det inte så avbryts loopen.

do {
...
} while (villkor)

Om följande gäller: Programmet skall be om en inmatning när temperaturen är < 73C eller >77 C. Är temperaturen inom intervallet 73 <= temp <= 77 så skall programmet inte be om fler inmatningar (dvs avsluta loopen). Då skall villkoret vara följande:

while (temp < 73 || temp > 77)

EDIT: Skall den endast hoppa ur loopen om man anger exakt 75C så blir villkoret:

while (temp != 75)

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem

skriv /// ovanför metoden så får du en finare beskrivning istället för dina //-kommentarer strax under

Permalänk
Skrivet av perost:

Du behöver ingen break någonstans. Problemet du har är delvis att du har inläsning på flera ställen i koden som ställer till det. Jag upprepar: du behöver endast ha ett anrop till Console.ReadLine i koden, allt annat gör bara koden mer komplicerad än den behöver vara.

Och sen är villkoret i while-satsen helt fel också, det var rätt i ditt första försök men du kopierade som sagt någon annans felaktiga lösning.

Okej. Sorry, det blev en väldigt sen natt med denna koden idag. Jag tog bort den sista console.readline så att jag bara har en efter

far=convert.ToInt32

Var i koden har jag fel inläsning?

Permalänk

@PeCe: Tack, löste det med while-satsen nu. Insåg inte att min tidigare sats var korrekt när jag försökte att hitta vad som var fel i koden

Permalänk
Medlem
Skrivet av Nybörjareprogrammering:

Okej. Sorry, det blev en väldigt sen natt med denna koden idag. Jag tog bort den sista console.readline så att jag bara har en efter

far=convert.ToInt32

Var i koden har jag fel inläsning?

Lite oklart vad du tagit bort, men du ska alltså ta bort tre av de fyra Console.ReadLine-anropen du hade i din senaste kod.

Permalänk
Skrivet av perost:

Lite oklart vad du tagit bort, men du ska alltså ta bort tre av de fyra Console.ReadLine-anropen du hade i din senaste kod.

Yes, och såhär ser koden ut nu:

class Program { private static int fahr; private static int celsius; public static int FahrToCels(int fahr) // metod för omvandling från Fahrenheit // till celcius { int celcius = ((fahr - 32) * 5) / 9; // metod beräknar Fahrenhet till Celcius. Konverterar return celcius; // Returnerar värde } public static void Main(string[] args) { { int optTemp = 75; int minTemp = optTemp -2;// 73 162 int maxTemp = optTemp +3; //75 170 do { Console.Write("Write down the temperature in Fahrenheit : "); // Skriver in grader i fahrenheit fahr = Convert.ToInt32(Console.ReadLine()); celsius = FahrToCels(fahr); //Metodanrop, int celsius omvandlar automatiskt från fahrenheit till Celsius när användaren matar in fahrenheit if (celsius > maxTemp) { Console.WriteLine(" You wrote in Fahrenheit " + fahr + " The temp is too high, turn down! It's " + FahrToCels(fahr) + " degrees in celcius"); } if (celsius < minTemp) { Console.WriteLine(" You wrote in Fahrenheit " + fahr + " Its too low, turn up! Its " + FahrToCels(fahr) + " degrees in celsius "); } else if (celsius == optTemp) { Console.WriteLine(" You wrote in Fahrenheit " + fahr + " The temperature is perfect, in celsius " + FahrToCels(fahr) + " degrees in celsius "); } else if (celsius >= 164 || celsius <= maxTemp) { Console.WriteLine(" You wrote in Fahrenheit " + fahr + " The temperature is good but not perfect! It's " + FahrToCels(fahr) + "degrees in celsius"); } try { fahr = int.Parse(Console.ReadLine()); celsius = int.Parse(Console.ReadLine()); } catch { Console.WriteLine(" write a number"); } } while (celsius <= 73 || celsius >= 77); { } } } } }

Hade alltså en

console.readline

i slutet där efter while-satsen som jag sedan tog bort

Permalänk
Medlem
Skrivet av Nybörjareprogrammering:

Hade alltså en

console.readline

i slutet där efter while-satsen som jag sedan tog bort

Fortfarande två för många.

Permalänk
Keeper of Traditions

Ibland kan det vara värt att börja om från början, läsa igenom uppgiften en gång till och skriva pseudo-kod med papper och penna hur man tror uppgiften bör lösas.

Att utgå från någon annans kod och försöka laga/ändra den ger sällan lika mycket, om man nu faktiskt är intresserad av att lära sig.

Många frågor (som som hur readLine bör användas) hade även besvarats av en enkel Google-sökning. Då får man oftast bra exempel på hur funktioner ska användas.

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk

Jag känner verkligen igen mig med OP med att försöka cowboy koda uppgifterna, mitt tips är verkligen att börja småskaligt och succesivt lägga till "Hooks" för att se så att varje enskild komponent funkar som den skall.

Såhär hade det sett ut i Java

package testing;

import java.util.Scanner;

public class Bastun {

private static int fahrToCelsius(int fahr) {
return ((fahr - 32) * 5) / 9;
}

public static void main(String[] args) {
int optTemp = 75;
int minTemp = optTemp -2;// 73 162
int maxTemp = optTemp +3; //75 170

Scanner sc = new Scanner(System.in);
int input = 0;

System.out.println("Välkommen till bastun! \nskriv önskad temperatur:");
input = fahrToCelsius(sc.nextInt());

while(input < minTemp || input > maxTemp) {

input = fahrToCelsius(sc.nextInt());

if(input < minTemp) {
System.out.println("för kallt!");
}
else if (input > maxTemp) {
System.out.println("för varmt");
}

}
System.out.println("Det blir lagom gött!");
}

}