Överlagrad metod - Amerikanen i bastu

Permalänk
Medlem

Överlagrad metod - Amerikanen i bastu

Hej,

Jag har fått en till uppgift att lösa i Programmering 1, en Amerikan i en bastu som bara kan Fahrenheit.

Jag har, enligt mig själv då, löst koden, och den ser ut såhär:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.NetworkInformation; using System.Net.WebSockets; using bastu_metod; namespace bastu { class program { public static void Main(string[] args) { Console.WriteLine("Välkommen, ange Fahrenheit"); // Välkomnar användaren till Bastun int fahrenheit = 0; // Deklarerar ut Fahrenheit innan loopen double celsius = 0; // Deklarerar ut Celsius innan loopen do { try { fahrenheit = int.Parse(Console.ReadLine()); //Tar emot värde i Fahrenheit och heltal via metod i class1. celsius = metod.FahrenheitToCelsius(fahrenheit); // Omvandlas till Celsius och decimaler via metod i class1. } catch (Exception) { Console.WriteLine("Du kan endast slå in siffror, var snäll att testa mata in ett Fahrenheit i bastun"); } if (celsius < 82 && celsius > 1) // Ifall graderna understiger 82 men är över 1 för att inte få svar på "try/catch". { Console.WriteLine("Det är " + celsius + " grader Celsius, du får öka graderna: "); } else if (celsius > 87) // om graderna är över maxvärdet, 87a { Console.WriteLine("Det är " + celsius + " grader Celsius, du får sänka graderna: "); } else if (celsius == 84)// ifall perfekt grad { Console.WriteLine("Det är " + celsius + " Celsius. Det är perfekta graderna att basta i "); } else if (celsius >= 82 && celsius <= 87) // om graderna är mellan 82 & 87 { Console.WriteLine("Du har " + celsius + " Celsius, det går men det går att få perfekt."); } } while (celsius < 82 || celsius > 87); // Grader för att kunna gå vidare ur loopen. Console.WriteLine("Hoppas du gillar att basta!"); Console.WriteLine("Tryck på valfri knapp för att avsluta programmet"); Console.ReadKey(); } } }

Dilemmat jag vill ha hjälp med är detta, det ska ske en överlagrad metod. Den första av mina metoder tar emot Fahrenheit i heltal men ger tillbaka med decimaler. Det funkar! Problemet är min överlagrade metod. Ifall användaren skulle slå in noll så ska det komma tillbaka en slumpmässig celsius. Dem fungerar var för sig om man kan säga så, men de fungerar inte tillsammans. Om jag har min överlagrade metod så försvinner liksom min första metod. Jag vet inte riktigt hur jag ska skriva ut den på bästa sätt utan att den tar över alla möjliga inslag. Denna metod ska inte heller ha några argument och det vet jag inte heller hur jag kan lösa.

namespace bastu_metod { public static class metod { public static double FahrenheitToCelsius(double fahrenheit) // Metodens namn { double celsius = (fahrenheit - 32) * 5 / 9; //Gör om Fahrenheit till Celsius return celsius; //Returnerar Celsius } public static double FahrenheitToCelsius(int fahrenheit = 0) // Metod ifall användare anger 0. { Random slumptal = new Random(); // Skapar slumptal double celsius = slumptal.Next(1, 300); // Ger slumptal till Celsius return celsius; //Returnerar Celsius } } }

Tillägg:
Jag har googlat vidare och letat så mycket jag kan och det verkar inte riktigt gå att skapa en overloaded method på det här sättet?

Så jag har skapat en if-sats ifall fahrenheit == 0 skickas den till en metod som slumpar celsius, i andra fall till den riktiga metoden. Dock står det i uppdraget att det ska vara en överlagrad metod.

Permalänk
Skrivet av MrHejgen:

Hej,

Jag har fått en till uppgift att lösa i Programmering 1, en Amerikan i en bastu som bara kan Fahrenheit.

Jag har, enligt mig själv då, löst koden, och den ser ut såhär:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.NetworkInformation; using System.Net.WebSockets; using bastu_metod; namespace bastu { class program { public static void Main(string[] args) { Console.WriteLine("Välkommen, ange Fahrenheit"); // Välkomnar användaren till Bastun int fahrenheit = 0; // Deklarerar ut Fahrenheit innan loopen double celsius = 0; // Deklarerar ut Celsius innan loopen do { try { fahrenheit = int.Parse(Console.ReadLine()); //Tar emot värde i Fahrenheit och heltal via metod i class1. celsius = metod.FahrenheitToCelsius(fahrenheit); // Omvandlas till Celsius och decimaler via metod i class1. } catch (Exception) { Console.WriteLine("Du kan endast slå in siffror, var snäll att testa mata in ett Fahrenheit i bastun"); } if (celsius < 82 && celsius > 1) // Ifall graderna understiger 82 men är över 1 för att inte få svar på "try/catch". { Console.WriteLine("Det är " + celsius + " grader Celsius, du får öka graderna: "); } else if (celsius > 87) // om graderna är över maxvärdet, 87a { Console.WriteLine("Det är " + celsius + " grader Celsius, du får sänka graderna: "); } else if (celsius == 84)// ifall perfekt grad { Console.WriteLine("Det är " + celsius + " Celsius. Det är perfekta graderna att basta i "); } else if (celsius >= 82 && celsius <= 87) // om graderna är mellan 82 & 87 { Console.WriteLine("Du har " + celsius + " Celsius, det går men det går att få perfekt."); } } while (celsius < 82 || celsius > 87); // Grader för att kunna gå vidare ur loopen. Console.WriteLine("Hoppas du gillar att basta!"); Console.WriteLine("Tryck på valfri knapp för att avsluta programmet"); Console.ReadKey(); } } }

Dilemmat jag vill ha hjälp med är detta, det ska ske en överlagrad metod. Den första av mina metoder tar emot Fahrenheit i heltal men ger tillbaka med decimaler. Det funkar! Problemet är min överlagrade metod. Ifall användaren skulle slå in noll så ska det komma tillbaka en slumpmässig celsius. Dem fungerar var för sig om man kan säga så, men de fungerar inte tillsammans. Om jag har min överlagrade metod så försvinner liksom min första metod. Jag vet inte riktigt hur jag ska skriva ut den på bästa sätt utan att den tar över alla möjliga inslag. Denna metod ska inte heller ha några argument och det vet jag inte heller hur jag kan lösa.

namespace bastu_metod { public static class metod { public static double FahrenheitToCelsius(double fahrenheit) // Metodens namn { double celsius = (fahrenheit - 32) * 5 / 9; //Gör om Fahrenheit till Celsius return celsius; //Returnerar Celsius } public static double FahrenheitToCelsius(int fahrenheit = 0) // Metod ifall användare anger 0. { Random slumptal = new Random(); // Skapar slumptal double celsius = slumptal.Next(1, 300); // Ger slumptal till Celsius return celsius; //Returnerar Celsius } } }

Tillägg:
Jag har googlat vidare och letat så mycket jag kan och det verkar inte riktigt gå att skapa en overloaded method på det här sättet?

Så jag har skapat en if-sats ifall fahrenheit == 0 skickas den till en metod som slumpar celsius, i andra fall till den riktiga metoden. Dock står det i uppdraget att det ska vara en överlagrad metod.

Kan det vara som så att du har två metoder med samma namn (FahrenheitToCelsius) OCH returvärde (double) och att ena metoden bör ha annat returvärde för andra metoden för att uppfylla överladdningskravet? Titta exempelvis här: https://www.w3schools.com/cs/cs_method_overloading.php

Jag undrar om det är något med int.Parse() som gör att den alltid bara lagrar ett heltal och då finns det bara en metod som kan ta emot ett heltal som argument och då blir det alltid den metoden?

Mvh,
WKL.

Visa signatur

<WKL:"En kodrad i taget!";/>

Permalänk
Medlem
Skrivet av WebbkodsLärlingen:

Kan det vara som så att du har två metoder med samma namn (FahrenheitToCelsius) OCH returvärde (double) och att ena metoden bör ha annat returvärde för andra metoden för att uppfylla överladdningskravet? Titta exempelvis här: https://www.w3schools.com/cs/cs_method_overloading.php

Jag undrar om det är något med int.Parse() som gör att den alltid bara lagrar ett heltal och då finns det bara en metod som kan ta emot ett heltal som argument och då blir det alltid den metoden?

Mvh,
WKL.

Tack för input. Känns ju logiskt, nu bara till min kunskap att överföra det till min kod. Jag förstår vad du menar men inte hur ifall jag kan säga så. Just att den ska känna av att det är en "0" jag skriver in som ska få till min överlagrade metod. Och enligt uppdrag ska det inte finnas något argument i den "nya" metoden. Knepigt, förhoppningsvis vill hjärnan förstå hela lösningen.

Ja men säkert. Jag har glömt att nämna att den "nya metoden" inte ska ha något argument.

Permalänk
Skrivet av MrHejgen:

Tack för input. Känns ju logiskt, nu bara till min kunskap att överföra det till min kod. Jag förstår vad du menar men inte hur ifall jag kan säga så. Just att den ska känna av att det är en "0" jag skriver in som ska få till min överlagrade metod. Och enligt uppdrag ska det inte finnas något argument i den "nya" metoden. Knepigt, förhoppningsvis vill hjärnan förstå hela lösningen.

Ja men säkert. Jag har glömt att nämna att den "nya metoden" inte ska ha något argument.

Om du har två överladdade metoder men ena får inte ha någon parameter ("argument" är vad du skickar med när du anropar metoder/funktioner), hur ska kompilatorn veta vilken metod som ska anropas beroende på datatyp du lagrat som du vill anropa metoderna med? Hur ser instruktionerna ut egentligen för uppgiften?

Börja med att bara lagra inmatningen i "var" eftersom du inte vet om det är double eller int. Efter inmatning i "var" kan du först kontrollera om inmatningstypen är "double" eller "int" annars slänger du throw så throw-blocket körs. Sen efter det kontrollerar du om det var "0.0" eller "0" som matades in och var det det så kör du int.Parse() och sen anropar metod.FahrenheitToCelsius.

Annars konverterar du till double.Parse() och anropar metod.FahrenheitToCelsius(doubleKonverteradVariabel). Du vet ju att 0.0 eller 0 alltid ska anropa heltalsmetoden (int) medan decimalmetoden (double) annars ska anropas så därför vill du tvinga till double vare sig användaren skrev 95 eller 95.0 om de inte skrev 0.0 eller 0.

Nu med denna körlogik bör du veta om det är double eller int när metod.FahrenheitToCelsius anropas och då bör den veta rätt metod (baserat på om det är double eller int i argument som skickas till mottagande parameter). Då behöver du inget standardvärde i "int Fahrenheit = 0" eftersom den metoden endast kommer anropas när du har heltalet 0 som skickas.

EDIT: Om den nya metoden absolut inte får ha en parameter så tänker jag att du då vill kontrollera ändå om det är 0.0 eller 0 som matades in och då anropar du bara metod.FahrenheitToCelsius() utan argument. Annars konverterar du till double och anropar metod.FahrenheitToCelsius(doubleKonverteradVariabel). Kom ihåg att den nya metoden då måste rensas på parametrar, dvs., ta bort "int Fahrenheit = 0".

Mvh,
WKL.

Visa signatur

<WKL:"En kodrad i taget!";/>

Permalänk
Medlem
Skrivet av WebbkodsLärlingen:

Om du har två överladdade metoder men ena får inte ha något argument, hur ska kompilatorn veta vilken metod som ska anropas beroende på datatyp du lagrat som du vill anropa metoderna med? Hur ser instruktionerna ut egentligen för uppgiften?

Börja med att bara lagra inmatningen i "var" eftersom du inte vet om det är double eller int. Efter inmatning i "var" kan du först kontrollera om inmatningstypen är "double" eller "int" annars slänger du throw så throw-blocket körs. Sen efter det kontrollerar du om det var "0.0" eller "0" som matades in och var det det så kör du int.Parse() och sen anropar metod.FahrenheitToCelsius.

Annars konverterar du till double.Parse() och anropar metod.FahrenheitToCelsius. Du vet ju att 0.0 eller 0 alltid ska anropa heltalsmetoden (int) medan decimalmetoden (double) annars ska anropas så därför vill du tvinga till double vare sig användaren skrev 95 eller 95.0 om de inte skrev 0.0 eller 0.

Nu med denna körlogik bör du veta om det är double eller int när metod.FahrenheitToCelsius anropas och då bör den veta rätt metod (baserat på om det är double eller int i argument som skickas till mottagande parameter). Då behöver du inget standardvärde i "int Fahrenheit = 0" eftersom den metoden endast kommer anropas när du har heltalet 0 som skickas.

Mvh,
WKL.

Kommer testa att lägga in värdet i en var först. Uppdraget säger dock att man ska ta emot det i ett heltal/"int" som sedan ska omvandlas till ett värde med decimaler i metoden. Jag vet inte riktigt hur mkt jag kan kopiera in från uppdraget men kanske kan kopiera över litegrann.
För c-nivå. Heltal som omvandlas till decimal i metoden.
"Vidare ska metoden som omvandlar Fahrenheit till Celsius ska ta emot ett heltal, men däremot returnera ett decimaltal (Celsius). Detta kallas typomvandling"

För a-nivå:
ni ska arbeta med ytterligare en metod och som ska fungera som en överlagrad metod (eng: "overloaded methods")Om användaren skriver in 0(noll) istället för ett värde så ska den nya metoden användas istället och på ett lämpligt sätt. Den nya metoden (som ej har något argument) ska slumpa fram ett tal och därefter i sin tur returnera värdet till den ursprungliga metoden (med argument) för omvandling mellan Fahrenheit och Celsius.

Permalänk
Medlem
Skrivet av MrHejgen:

Kommer testa att lägga in värdet i en var först. Uppdraget säger dock att man ska ta emot det i ett heltal/"int" som sedan ska omvandlas till ett värde med decimaler i metoden. Jag vet inte riktigt hur mkt jag kan kopiera in från uppdraget men kanske kan kopiera över litegrann.
För c-nivå. Heltal som omvandlas till decimal i metoden.
"Vidare ska metoden som omvandlar Fahrenheit till Celsius ska ta emot ett heltal, men däremot returnera ett decimaltal (Celsius). Detta kallas typomvandling"

För a-nivå:
ni ska arbeta med ytterligare en metod och som ska fungera som en överlagrad metod (eng: "overloaded methods")Om användaren skriver in 0(noll) istället för ett värde så ska den nya metoden användas istället och på ett lämpligt sätt. Den nya metoden (som ej har något argument) ska slumpa fram ett tal och därefter i sin tur returnera värdet till den ursprungliga metoden (med argument) för omvandling mellan Fahrenheit och Celsius.

public static double FahrenheitToCelsius(int fahrenheit = 0) // Metod ifall användare anger 0.

Detta är fel, ta bort argumentet och kalla funktionen från den andra om 0 matas in.
(Helt idiotisk logik men om det är vad som efterfrågas...)

Permalänk
Skrivet av MrHejgen:

Kommer testa att lägga in värdet i en var först. Uppdraget säger dock att man ska ta emot det i ett heltal/"int" som sedan ska omvandlas till ett värde med decimaler i metoden. Jag vet inte riktigt hur mkt jag kan kopiera in från uppdraget men kanske kan kopiera över litegrann.
För c-nivå. Heltal som omvandlas till decimal i metoden.
"Vidare ska metoden som omvandlar Fahrenheit till Celsius ska ta emot ett heltal, men däremot returnera ett decimaltal (Celsius). Detta kallas typomvandling"

För a-nivå:
ni ska arbeta med ytterligare en metod och som ska fungera som en överlagrad metod (eng: "overloaded methods")Om användaren skriver in 0(noll) istället för ett värde så ska den nya metoden användas istället och på ett lämpligt sätt. Den nya metoden (som ej har något argument) ska slumpa fram ett tal och därefter i sin tur returnera värdet till den ursprungliga metoden (med argument) för omvandling mellan Fahrenheit och Celsius.

Alright! Då kan du kontrollera efter inmatning att "var" är av typen int annars returnera en throw så throw-blocket körs. Sedan kontrollerar du om det är 0. Förberedd en double att lagra i. Om (if) 0 så anropa metod.FahrenheitToCelsius() som sedan i sin tur anropar FahrenheitToCelsius(framSlumpatHeltalsArgument), annars (else) anropa metod.FahrenheitToCelsius(inmatatHeltalsArgument). Lagra oavsett i den nya double-variabeln.

När jag läser svar på "internet" som är cirka 15 år gamla så påstås det att överladdningsmetoder inte ska kunna anropa varandra inom samma klass i C#? Men det är bara att prova. Notera därför ovan att eftersom vi är inuti samma klass så bör vi kunna bara anropa FahrenheitToCelsius(framSlumpatHeltalsArgument) direkt. Om du bara anropar den direkt så kan du ha returtypen void för metoden som slumpar fram heltal eftersom dess "retur" egentligen bara är ett metodanrop.

EDIT: Du skulle kunna ha double som returvärde i FahrenheitToCelsius() vars returvärde är anropet till FahrenheitToCelsius(framSlumpatHeltalsArgument) då dess returvärde sedan blir double vilket då blir det du vill skriva ut lagrat i den nya double-variabeln sen tidigare. Det är mer eller mindre omöjligt att gissa hur det exakt är tänkt att det ska göras utan alla instruktioner.

Jag sitter ej vid koddator så kan ej prova själv nu utan jag gissar utifrån vad jag tror jag kan om jobbiga C#!

Mvh,
WKL.

Visa signatur

<WKL:"En kodrad i taget!";/>

Permalänk
Medlem

För extrapoäng, begränsa så att temperaturen inte kan gå under absoluta nollpunkten (ca -273,15 C)