Permalänk

@Blomman90: Ja jag förmodar att det inte är optimalt eller rekommenderas. Har inte riktigt fått koll på det här med try catch metoden som vi ska använda. Det var det sättet jag fick ihop det på. Jag vill att användar ska få börja om den skriver in en bokstav tex istället för en siffra. På detta sätt fick jag det o fungera.

Ska försöka plugga på mer kring try catch-metoden ikväll. Något tips på hur jag skulle få den delen o se ut istället?

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
Medlem
Skrivet av Pellefant:

@Blomman90: Ja jag förmodar att det inte är optimalt eller rekommenderas. Har inte riktigt fått koll på det här med try catch metoden som vi ska använda. Det var det sättet jag fick ihop det på. Jag vill att användar ska få börja om den skriver in en bokstav tex istället för en siffra. På detta sätt fick jag det o fungera.

Ska försöka plugga på mer kring try catch-metoden ikväll. Något tips på hur jag skulle få den delen o se ut istället?

Try-catch använder man för att hantera fel (exceptions) i sitt program. Precis som du säger så kan det användas när man försöker konvertera (casta) något till en annan datatyp. Din Parse() kommer ju generera ett exception om den inte lyckas konvertera till en double. Med en try-catch så kan du då fånga felet (catch) och avgöra hur felet ska hanteras. Utan en try-catch så hade felet istället kraschat hela programmet.

Så i min mening bör du snarare se över användandet av loopar. Hur många behöver du egentligen, vad är syftet med looparna, när ska de avbrytas, etc.

Permalänk

@Blomman90:

Jag får inte ihop det utan att använda loop i try catch metoden. Hur får jag den att börja om på "do" när den hamnar på exception, utan att använda en loop? Har som sagt inte riktigt fått in det där med return.

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
Medlem

@Pellefant: Använd continue för att direkt hoppa vidare till nästa iteration av loopen. Det fungerar så klart att göra som du gjort också, men koden blir lite enklare om du använder continue istället för en nästlad loop.

Permalänk
Medlem

Inte direkt för din uppgift, men om du precis börjar med programmering så skulle jag rekommendera dig att läsa: https://download-mirror.savannah.gnu.org/releases/pgubook/Pro...

Jag läste den tjugo år efter jag började, men oj vad jag hade önskat att jag hade den när jag började. Den går igenom hur saker faktiskt fungerar och bygger upp en förståelse för varför C/C++/C# osv ens finns. Hur otroligt lite magi som är inblandat när man laddar en DLL osv.

Visa signatur

Huvudriggen är en Gigabyte Aorus Xtreme | 128gb DDR5 6000 | Ryzen 7950X | 3080Ti
Utöver det är det för många datorer, boxar och servar för att lista :P

Permalänk
Skrivet av perost:

@dengudomlige: Använd continue för att direkt hoppa vidare till nästa iteration av loopen. Det fungerar så klart att göra som du gjort också, men koden blir lite enklare om du använder continue istället för en nästlad loop.

Jag har suttit i ett par timmar nu och försökt få ihop det, men lyckas ändå inte. Det är något jag missar. Hur kan det se ut istället om jag bifogar min kod här nedan? Testade nämligen också och få in att en siffra i fahrenheit ska slumpas om använder skriver in siffran 0. Får inte heller ihop det slumpmässiga talet och jag kanske ska låta bli det, eftersom jag inte riktigt har förståt mig på grunderna ännu.

namespace Amerikanaren { class Program { public static double FahrToCels(double fahrenheit) { return Math.Round((fahrenheit - 32) * 5 / 9,1); } public static void Main(string[] args) { double cstart = 0; double cmin = 73; double copt = 75; double cmax = 77; double c; double f; do { Console.Write("Please enter the desired temperature: "); while (true) { try { f = double.Parse(Console.ReadLine()); break; } catch (Exception) { Console.WriteLine("\nError, only enter digits"); Console.Write("Please enter the desired temperature: "); } } c = FahrToCels(f); if (c <= cstart) { Console.WriteLine("\nThe sauna is not active. Please enter a higher value."); } else if (c < cmin) { Console.WriteLine("\nThe sauna is not hot enough. Please enter a higher value {0}°C.", c); } else if (c > cmax) { Console.WriteLine("\nThe sauna is too hot. Please enter a lower value {0}°C.", c); } }while (c < cmin || c > cmax); if(c == copt) { Console.WriteLine("\nThe value that you have entered is the optimal temperature. The temperature is {0}°C. Enjoy the sauna!", c); } else { Console.WriteLine("\nThe value that you have entered is acceptable. The temperature is {0}°C. Enjoy the sauna!", c); } Console.WriteLine("Press any key to exit"); Console.ReadKey(); } } }

Skrivet av inquam:

Inte direkt för din uppgift, men om du precis börjar med programmering så skulle jag rekommendera dig att läsa: https://download-mirror.savannah.gnu.org/releases/pgubook/Pro...

Jag läste den tjugo år efter jag började, men oj vad jag hade önskat att jag hade den när jag började. Den går igenom hur saker faktiskt fungerar och bygger upp en förståelse för varför C/C++/C# osv ens finns. Hur otroligt lite magi som är inblandat när man laddar en DLL osv.

Tack för tipset! Ska kika på det. Måste först ta mig igenom denna uppgift bara.

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
Medlem
Skrivet av Pellefant:

@Blomman90:

Jag får inte ihop det utan att använda loop i try catch metoden. Hur får jag den att börja om på "do" när den hamnar på exception, utan att använda en loop? Har som sagt inte riktigt fått in det där med return.

Skrivet av Pellefant:

Jag har suttit i ett par timmar nu och försökt få ihop det, men lyckas ändå inte. Det är något jag missar. Hur kan det se ut istället om jag bifogar min kod här nedan? Testade nämligen också och få in att en siffra i fahrenheit ska slumpas om använder skriver in siffran 0. Får inte heller ihop det slumpmässiga talet och jag kanske ska låta bli det, eftersom jag inte riktigt har förståt mig på grunderna ännu.

namespace Amerikanaren { class Program { public static double FahrToCels(double fahrenheit) { return Math.Round((fahrenheit - 32) * 5 / 9,1); } public static void Main(string[] args) { double cstart = 0; double cmin = 73; double copt = 75; double cmax = 77; double c; double f; do { Console.Write("Please enter the desired temperature: "); while (true) { try { f = double.Parse(Console.ReadLine()); break; } catch (Exception) { Console.WriteLine("\nError, only enter digits"); Console.Write("Please enter the desired temperature: "); } } c = FahrToCels(f); if (c <= cstart) { Console.WriteLine("\nThe sauna is not active. Please enter a higher value."); } else if (c < cmin) { Console.WriteLine("\nThe sauna is not hot enough. Please enter a higher value {0}°C.", c); } else if (c > cmax) { Console.WriteLine("\nThe sauna is too hot. Please enter a lower value {0}°C.", c); } }while (c < cmin || c > cmax); if(c == copt) { Console.WriteLine("\nThe value that you have entered is the optimal temperature. The temperature is {0}°C. Enjoy the sauna!", c); } else { Console.WriteLine("\nThe value that you have entered is acceptable. The temperature is {0}°C. Enjoy the sauna!", c); } Console.WriteLine("Press any key to exit"); Console.ReadKey(); } } }

Tack för tipset! Ska kika på det. Måste först ta mig igenom denna uppgift bara.

Du behöver givetvis en loop för att kunna låta användaren försöka på nytt ifall denne gör fel. Men i dagsläget så använder du ju två loopar (en loop i en loop), varav den ena är en "while(true)". Du behöver egentligen inte en dedikerad loop för try-catchen i detta fall. Så du kanske kan försöka skriva om lite så att hela programmet kan använda en och samma loop. Du kommer då behöva ta hänsyn till vad programmet fortsättningsvis ska göra i det fall du får ett exception.

Permalänk
Medlem

Det @Blomman90 säger är alltså förenklat som:
1. Ta bort din inre while(true) loop. Men låt try, catch vara kvar i den större yttre loopen istället.
2. Byt ut din "break" mot "continue" .

Continue gör att loopen den är i börjar om på en helt ny iteration. Och om du då har inläsning och ett try catch i början av loopen så kommer den köra det tills inläsningen är lyckad.

Skickades från m.sweclockers.com

Permalänk

@Blomman90, @Jackbob:

OK. Jag tackar för tipsen. Ska kika på det efter jag kommit hem från jobbet(, pluggar på distans, då jag jobbar heltid).

Det har inte riktigt satt sig och har haft svårt o ta in texten i det här kapitlet i läroboken. Jag satt mest igår med att få in att om användaren skriver in 0, då ska användaren få Fahrenheit slumpat. Man skulle skickas till en metod då enligt uppgiften, men det här med metoder och try-catch vill sig inte riktigt ännu.

Finns det någon youtubeserie ni kan rekommendera? Har precis upptäckt att c#-skolan har en youtube serie som jag ska kika på.

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
Medlem
Skrivet av Pellefant:

@Blomman90, @Jackbob:

OK. Jag tackar för tipsen. Ska kika på det efter jag kommit hem från jobbet(, pluggar på distans, då jag jobbar heltid).

Det har inte riktigt satt sig och har haft svårt o ta in texten i det här kapitlet i läroboken. Jag satt mest igår med att få in att om användaren skriver in 0, då ska användaren få Fahrenheit slumpat. Man skulle skickas till en metod då enligt uppgiften, men det här med metoder och try-catch vill sig inte riktigt ännu.

Finns det någon youtubeserie ni kan rekommendera? Har precis upptäckt att c#-skolan har en youtube serie som jag ska kika på.

Brackeys, här är videon om metoder. Hela serien är dock bra att se, men du kan skimma igenom det du redan är bekväm med. Skadar dock aldrig med repetition.
https://youtu.be/QwygwfqOHsI

Skickades från m.sweclockers.com

Permalänk
Skrivet av Jackbob:

Det @Blomman90 säger är alltså förenklat som:
1. Ta bort din inre while(true) loop. Men låt try, catch vara kvar i den större yttre loopen istället.
2. Byt ut din "break" mot "continue" .

Continue gör att loopen den är i börjar om på en helt ny iteration. Och om du då har inläsning och ett try catch i början av loopen så kommer den köra det tills inläsningen är lyckad.

Skickades från m.sweclockers.com

Testat att skriva så här i början av loopen istället, men det går inte ihop med det. Då får jag use of unassigned local variable 'f' och 'c' på dessa rader:

c = FahrToCels(f);

// Use of unassigned local variable 'f'

}while (c < cmin || c > cmax);

//Use of unassigned local variable 'c'

Dessa har bråkat med mig och fick endast bort det med en while loop i do-while loop.

Visa signatur

AMD Ryzen 3600 - MSI B450 Tomahawk - Corsair 16GB (2x8GB) DDR4 3200Mhz CL16 - Palit GeForce RTX 2070 Dual 8GB - Samsung 860 Evo 1TB - Noctua NH-D15 - MPG A750GF - Fractal Design Define R5

Permalänk
Medlem
Skrivet av Pellefant:

Testat att skriva så här i början av loopen istället, men det går inte ihop med det. Då får jag use of unassigned local variable 'f' och 'c' på dessa rader:

c = FahrToCels(f);

// Use of unassigned local variable 'f'

}while (c < cmin || c > cmax);

//Use of unassigned local variable 'c'

Dessa har bråkat med mig och fick endast bort det med en while loop i do-while loop.

Svårt att dra nån korrekt slutsats utan att se mer.

Ditt felmeddelande indekerar att du försöker använda din variabel f innan du faktiskt gett den ett värde. Du kan inte använda ett icke existerande värde i en beräkning.

Hur ser din kod ut nu?

Skickades från m.sweclockers.com