Den ständige amerikanen i bastun

Permalänk

Den ständige amerikanen i bastun

Hej!

Jag läser som många andra programmering 1 på Hermods och håller på med den jäkla amerikanen i bastun som så många andra.
UPPGIFTEN FINNS HÄR:

https://www.docdroid.net/33sbaWy/amerikanen-i-bastun-pdf
OBS: Vissa antivirusprogram varnar för denna sida, klicka på egen risk /moderator

Dold text

Har googlat till förbannelse i flera dagar men finner föga lösning på mitt problem.
Jag hade skapat en fungerande kod, så läste jag instruktionen en gång extra för att finna att vi behövde lagra in det inmatade värdet som en int, och sedan omvandla densamme till ett flyttal.
Det jag har problem med är alltså det som behövs för betyg C. Felet i min kod blir nu att Visual Studio verkar tro att jag vill omvandla en double till en int, vilket är precis det jag verkligen inte vill!

Visual Studio säger att detta stycke är fel:

cel = FahrToCels(fahrTemp);

Och att felet är följande:
Argument 1: cannot convert from 'double' to 'int'

Sliter mitt hår, kan någon hjälpa mig med vad som är fel? Varför tror den att jag vill konvertera till en int när jag uppenbarligen skapat min FahrToCels-metod som en double?

Här kommer min kod:

using System; namespace ConsoleApp12 { class Program { static public double FahrToCels(int fahr) { double cel = (fahr - 32) * 5 / 9; return cel; } static void Main(string[] args) { double cel; Console.Write("How hot do you want the sauna? "); do { Console.WriteLine(" "); double fahrTemp = double.Parse(Console.ReadLine()); cel = FahrToCels(fahrTemp); if (cel > 77) { Console.WriteLine("It is too hot! You need to lower... Try again!"); } else if (cel < 73) { Console.WriteLine("It is to cool, you need more heat! Try again!"); } else if (cel == 75) { Console.WriteLine("This is perfect heat for this sauna! Step in!"); } else { Console.WriteLine("It's not perfect, but acceptable. OK to step in, but try again if you want even more perfe!"); } } while (cel > 73 || cel < 77); Console.ReadKey(); } } }

Tacksam för hjälp!

Lagt till spoiler /Kent, moderator
Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk

Hint kolla vad du skickar in för typ till FahrToCels och vad denna tar för typ!

Permalänk

@fizzyflaskan:
Menar du "int fahr" uppe i FahrToCels-metoden?
Det är tyvärr ett krav att ha det i metoden för inmatning och sen omvandla.

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem
Skrivet av fizzyflaskan:

Hint kolla vad du skickar in för typ till FahrToCels och vad denna tar för typ!

Upvote för acceptable answer.

Visa signatur

Louqe Ghost S1 MK3 | Asus ROG Strix B660-I Gaming WiFi | Intel Core i7 12700K | nVidia RTX 2070 Super FE | Corsair 64GB (2x32GB) DDR5 5600MHz CL40 Vengeance | Samsung 980 PRO M.2 NVMe SSD 2TB | Corsair SF750 750W 80+ Platinum | Noctua NH-L12 Ghost S1 edition | Kablar från pslate customs | 2 stk Dell Ultrasharp 3014 | Logitech MX Keys | Logitech MX Anywhere

Permalänk
Medlem
Skrivet av exaaivilo:

@fizzyflaskan:
Menar du "int fahr" uppe i FahrToCels-metoden?
Det är tyvärr ett krav att ha det i metoden för inmatning och sen omvandla.

Då får du låta bli att göra om din inmatning från tangentbordet till double och istället se till att det är int det som du skickar till din FahrToCels.

Permalänk
Medlem

Som fizzyflaskan nämnde, så kan du hitta svaret på din gåta på följande rad:

"static public double FahrToCels(int fahr)"

Visa signatur

"Det finns två företeelser som är oändliga, universum och den mänskliga dumheten. Jag är dock inte säker på den förstnämnda" -- Albert Einstein

Permalänk
Medlem

Visual studio har rätt men lösningen är inte nödvändigtvis på den raden.

Permalänk
Medlem

Skummade igenom uppgiften och det verkar som att när användaren matar in temperaturen ska man läsa den som en int och det talet skickar du till FahrToCels. Sen gör du själva omvandlingen från int till double samtidigt som du gör om fahrenheit till celsius.

Visa signatur

i7 4770k @4.3GHz | Asus z87-pro | Asus 1080 | 16GB RAM | Samsung 840 Pro 256GB | 3TB HDD| Corsair RM850
Thinkpad x60 tablet | 3GB RAM | Crucial M4 128GB
Amiga 500+, Commodore 64/128D

Permalänk
Skrivet av Mouless:

Som fizzyflaskan nämnde, så kan du hitta svaret på din gåta på följande rad:

"static public double FahrToCels(int fahr)"

Tack för svar!
Har också tyckt det ser underligt ut, dock så är just den raden dessvärre direkt från vår härliga uppgift...

"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

Men då ska jag istället testa att ändra om lite där kanske.

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem
Skrivet av exaaivilo:

Tack för svar!
Har också tyckt det ser underligt ut, dock så är just den raden dessvärre direkt från vår härliga uppgift...

"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

Men då ska jag istället testa att ändra om lite där kanske.

Du ska se till att det du skickar till metoden är int. Vilket typ är det som du skickar nu? Är det int? double? float?

Rättare sagt. Vad är det du gör här??? double fahrTemp = double.Parse(Console.ReadLine());

Permalänk
Medlem
Skrivet av exaaivilo:

Hej!

Jag läser som många andra programmering 1 på Hermods och håller på med den jäkla amerikanen i bastun som så många andra.
UPPGIFTEN FINNS HÄR: https://www.docdroid.net/33sbaWy/amerikanen-i-bastun-pdf

Tacksam för hjälp!

Klicka inte på länken. Den sidan rapporteras som skadlig enligt Norton:

Skadlig webbplats blockerad!Du har försökt att gå till:https://inabsolor.com/1?z=3479964Webbsidan är en känd skadlig webbsida. Du bör INTE besöka den här webbplatsen.

Permalänk

@ToddTheOdd:
Okej, har testat lite mer nu, dels:

static public double FahrToCels(int fahr) { double cel = (fahr - 32) * 5 / 9; return cel; } static void Main(string[] args) { double cel; Console.Write("How hot do you want the sauna? "); do { Console.WriteLine(" "); int fahrTemp = int.Parse(Console.ReadLine()); cel = FahrToCels(fahrTemp);

Vilket inte funkar eftersom det bara blir en int, och amerikanen vill kunna skriva kommatecken, gör jag det kraschar programmet.

Sen försökte jag konvertera till double såhär:

static public double FahrToCels(int fahr) { double cel = (fahr - 32) * 5 / 9; return cel; } static void Main(string[] args) { double cel; Console.Write("How hot do you want the sauna? "); do { Console.WriteLine(" "); int fahrTemp = int.Parse(Console.ReadLine()); double fahrD = Convert.ToDouble(fahrTemp); cel = FahrToCels(fahrD);

Men då blir det också fel eftersom jag inte får konvertera double till int... men jag försöker ju göra motsatsen?

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem

static public double FahrToCels(int fahr)

Som du ser förväntar sig din metod att parametern är en int, och metoden kommer sedan returnera tillbaka en double.

double fahrTemp = double.Parse(Console.ReadLine());

Som du ser skickar du en double till en metod som förväntar sig en int.

Visa signatur

AW3423DW QD-OLED - Ryzen 5800x - MSI Gaming Trio X 3090 - 64GB 3600@cl16 - Samsung 980 Pro 2TB/WD Black SN850 2TB

Permalänk
Skrivet av celoz:

static public double FahrToCels(int fahr)

Som du ser förväntar sig din metod att parametern är en int, och metoden kommer sedan returnera tillbaka en double.

double fahrTemp = double.Parse(Console.ReadLine());

Som du ser skickar du en double till en metod som förväntar sig en int.

Men om jag tar bort det, och kör programmet och försöker mata in ett decimaltal så kraschar det och detta meddelande kommer upp: "System.FormatException: 'Input string was not in a correct format.'"

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem
Skrivet av exaaivilo:

Men om jag tar bort det, och kör programmet och försöker mata in ett decimaltal så kraschar det och detta meddelande kommer upp: "System.FormatException: 'Input string was not in a correct format.'"

Skrivet av Uppgiftsbeskrivningen:

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.

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem
Skrivet av exaaivilo:

Men om jag tar bort det, och kör programmet och försöker mata in ett decimaltal så kraschar det och detta meddelande kommer upp: "System.FormatException: 'Input string was not in a correct format.'"

Det står i din uppgift hur du löser det. Läraren skriver att man ska förvänta sig att användaren skriver in ett heltal (vilket man inte borde göra, men det är irrelevant i sammanhanget). Spara som en int och skicka den till din metod som en int, sedan använder du casting som nämnt i uppgiften.

Visa signatur

AW3423DW QD-OLED - Ryzen 5800x - MSI Gaming Trio X 3090 - 64GB 3600@cl16 - Samsung 980 Pro 2TB/WD Black SN850 2TB

Permalänk

@LemonIllusion:
@celoz:
TACK, inser nu att jag tolkat uppgiften helt fel. Nu kanske det går lite enklare för mig när jag slutar stirra mig blind på fel sak!

Tack för hjälpen alla andra också.

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk

Hej igen!

Jag har nu fått koden att funka bra med decimaler och allt, tack igen för hjälpen.
Nu har jag dock stött på problem nr 2 och det är try catch.

Koden är körbar men problemet jag har är att när jag lägger in koden för try catch, dels funkar den inte som den ska då det kraschar ÄNDÅ och sen lägger den till en extra tom rad den vill att man skriver något på. Vill att den delen bara ska köras när användaren faktiskt skriver ett fel?
Har testat att flytta runt try catch, men det blir inte bra oavsett.

Här kommer min kod...

using System; namespace ConsoleApp12 { class Program { static public double FahrToCels(int fahr) { double fahrD; fahrD = (double)fahr; double cel = (fahrD - 32) * 5 / 9; return cel; } static void Main(string[] args) { double cel; Console.WriteLine("How hot do you want the sauna? "); do { int fahrTemp = int.Parse(Console.ReadLine()); cel = FahrToCels(fahrTemp); cel = Math.Round(cel, 2); try { fahrTemp = int.Parse(Console.ReadLine()); cel = FahrToCels(fahrTemp); } catch (Exception) { Console.WriteLine("Please enter a number!"); } if (cel > 77) { Console.WriteLine("You chose " + fahrTemp + " and that is " + cel + " degrees Celcius. It is too hot! You need to lower... Try again!"); } else if (cel < 73) { Console.WriteLine("You chose " + fahrTemp + " and that is " + cel + " degrees Celcius. It is to cool, you need more heat! Try again!"); } else if (cel == 75) { Console.WriteLine("You chose " + fahrTemp + " and that is " + cel + " degrees Celcius. This is perfect heat for this sauna! Step in!"); } else { Console.WriteLine("You chose " + fahrTemp + " and that is " + cel + " degrees Celcius. It's not perfect, but acceptable.\nOK to step in, but try again if you want even more perfect!"); } } while (cel != 167); Console.ReadKey(); } } }

Tacksam för hjälp.

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem

@exaaivilo:

Jag har inte hängt med i tråden från början så jag ber om ursäkt ifall mitt inlägg blir galet.

Jag tror att ditt program kraschar på grund av att du försöker göra en omvandling av "Console.ReadLine()" till int utanför try-blocket.

int fahrTemp = int.Parse(Console.ReadLine()); cel = FahrToCels(fahrTemp); cel = Math.Round(cel, 2); try { fahrTemp = int.Parse(Console.ReadLine()); cel = FahrToCels(fahrTemp); } catch (Exception) { Console.WriteLine("Please enter a number!"); }

Jag hade gjort såhär:
Uppmana användaren om att mata in en temperatur.
Ta in inmatningen i en string variabel.
I try-blocket parsa string variabeln till en double.

Edit:
ReadLine() returnerar alltid en string.

Visa signatur

There is always a price to pay for convenient

Permalänk

@smkr:
Tack för svar!
Detta är ett nytt problem orelaterat till det första, så det tidigare har ingen betydelse.

Jag fattar vad du menar och tycker det låter rimligt, problemet är bara att när jag försöker detta så blir det fel med resten av texten, dvs:

cel = FahrToCels(fahrTemp); cel = Math.Round(cel, 2);

Måste omvandla till en int redan direkt för annars kan inte resten läsas in korrekt.

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk

Har ändrat till följande nu:

double cel; Console.WriteLine("How hot do you want the sauna? "); do { string fahrString = Console.ReadLine(); int fahrTemp = int.Parse(fahrString); cel = FahrToCels(fahrTemp); cel = Math.Round(cel, 2); try { fahrTemp = int.Parse(fahrString); } catch (Exception) { Console.WriteLine("Please enter a number!"); }

Nu är det bättre och allt funkar förutom att den inte vill ta emot strings utan kraschar när jag försöker lägga skriva bokstäver.

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem

Personligen skulle jag inte använda int.Parse() utan int.TryParse() eftersom Exception är en "dyr" operation, framförallt i C#.

Permalänk

@ehsnils:
Tack för input, men är det något som direkt påverkar varför mitt try catch-block inte funkar?

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem

@exaaivilo:

Du skulle kunna prova detta.
fahrTemp skapas tidigare, utanför do-loopen. Anledningen är att du annars återkommer till deklarationen när variabeln redan finns, vilken kommer ställa till det.

Sedan kan du göra omvandlingen mellan F och C eftar att du gjort int.Parse(); i try-blocket
Detta kommer vara godkänt i ditt fall, men jag rekommenderar att man lägger så få anrop som möjligt i try-blocket.

Det skulle vara snyggare att lägga:
cel = FahrToCels(fahrTemp);
cel = Math.Round(cel, 2);
Utanför try-catch, men det kan du gör när du fått koden att fungera.

int fahrTemp = 0; double cel; Console.WriteLine("How hot do you want the sauna? "); do { string fahrString = Console.ReadLine(); int fahrTemp = int.Parse(fahrString); cel = FahrToCels(fahrTemp); cel = Math.Round(cel, 2); try { fahrTemp = int.Parse(fahrString); cel = FahrToCels(fahrTemp); cel = Math.Round(cel, 2); } catch (Exception) { Console.WriteLine("Please enter a number!"); }

Visa signatur

There is always a price to pay for convenient

Permalänk
Medlem
Skrivet av exaaivilo:

Har ändrat till följande nu:

double cel; Console.WriteLine("How hot do you want the sauna? "); do { string fahrString = Console.ReadLine(); int fahrTemp = int.Parse(fahrString); cel = FahrToCels(fahrTemp); cel = Math.Round(cel, 2); try { fahrTemp = int.Parse(fahrString); } catch (Exception) { Console.WriteLine("Please enter a number!"); }

Nu är det bättre och allt funkar förutom att den inte vill ta emot strings utan kraschar när jag försöker lägga skriva bokstäver.

Du kontrollerar att din inmatade sträng är ett heltal efter att du redan omvandlat temperaturen? Din try-catch gör således ingenting då programmet redan kommer krascha innan du når den raden. Debuggern har garanterat berättat detta för dig där det då framgick exakt vilken rad programmet hängde sig på.

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk

@Pamudas:
Ja, förstår inte hur ska jag göra annars, om jag flyttar try catch uppåt i koden så får jag fel pga: "Cannot use local variable 'fahrTemp' before it is declared"...

@smkr:
Om jag testar det du du sa uppstår detta:
https://imgur.com/jwVz0Vu

Problemet jag har med båda är att det inte går att flytta på blocket.

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem

@smkr:
Om jag testar det du du sa uppstår detta:
https://imgur.com/jwVz0Vu

Problemet jag har med båda är att det inte går att flytta på blocket.
[/quote]

Ta inte bort den helt, den måste finnas kvar i klassen men utanför loopen.

Visa signatur

There is always a price to pay for convenient

Permalänk

@smkr:
Ah, missade det helt! Nu verkar det funka, bara ett litet problem kvar som jag ska fundera på en stund.
Tack så mycket för hjälpen!

Visa signatur

AMD Ryzen 7 3700X | ASUS ROG Strix Radeon RX 590 8GB | ASUS PRIME B450-PLUS | Corsair Vengeance LPX Black 16GB | Seagate BarraCuda Desktop 2TB

Permalänk
Medlem

@exaaivilo:

Så bra!
Viktigt att läsa alla fel/buggar som uppstår och att förstå varför det blir fel, för datorn kommer aldrig vara förlåtande när den ska köra kod. Man får helt enkelt läsa rad för rad, inte så enkelt alltid men det är lika bra att vänja sig vid det.

Visa signatur

There is always a price to pay for convenient

Permalänk
Medlem
Skrivet av exaaivilo:

@ehsnils:
Tack för input, men är det något som direkt påverkar varför mitt try catch-block inte funkar?

Om du använder det så kanske du inte ens behöver ett try/catch.

Men jag såg andra inlägg också om vad som var specifikt fel i ditt fall.