Amerikanen i bastun
Har kommit såhär långt med uppgiften men märker att C inte existerar, vad är det som jag har gjort fel med metoden? För jag antar att det har o göra med metoden, måste veta hur metoderna funkar så att detta blir rätt..
using System;
namespace Amerikanenibastun
{
class Program
{
public static double FahrToCels(int fahr) //metod för att omvandla fahrenheit till celsius
{
double Cels = ((fahr - 32) * 5 / 9);
return Cels;
}
public static void Main(string[] args)
{
Console.Write("Enter a temprature ");
do
{
bool loop = true;
do
{
try
{
int FH = int.Parse(Console.ReadLine());
double C = FahrToCels(FH);
loop = false;
}
catch (Exception felblevdet)
{
Console.Write("Please enter in whole numbers ");
}
} while (loop);
if (C > 77)
{
Console.Write("It's way to hot in here, please lower the temp ");
}
else if (C < 73)
{
Console.Write("It's way to cold in here, please up the temp ");
}
else if (C == 75)
{
Console.Write("This is the perfect temp!! ");
}
else
{
Console.WriteLine("Not great not terrible");
}
} while (C != 75);
Console.WriteLine();
Console.WriteLine("Let's enjoy shall we!");
C är deklarerad inuti try-blocket, och då finns den bara där. Deklarera den med
double C;
på samma ställe som loop, och ta bort "double" inuti try-blocket.
Deklarationen av C görs inne i kodblocket för try
och är inte inom scope i det yttre kodblocket. Kan lösas så här:
public static void Main(string[] args)
{
double C = 0; // deklarera och initiera C här
Console.Write("Enter a temprature ");
do
{
bool loop = true;
do
{
try
{
int FH = int.Parse(Console.ReadLine());
C = FahrToCels(FH);
Laguna skrev:C är deklarerad inuti try-blocket, och då finns den bara där. Deklarera den med
double C;
på samma ställe som loop, och ta bort "double" inuti try-blocket.
Okej så när den är i en try catch så blir den liksom lokal och inget utanför den kan se den deklareringen, lite som en klass? Försöker lista ut hur jag då skulle göra om jag vill göra en talslumpare om personen skriver in 0 fahrenheit.
Det är inte try-catch som är speciell, utan det gäller alla block (alltså kod omringad med fiskmåsar). En variabel deklarerad inuti ett block syns inte utanför. Om den har samma namn som en variabel utanför, så blir den yttre variabeln skuggad, så att man inte ser den inuti blocket.
Lindehaven skrev:Deklarationen av C görs inne i kodblocket för
try
och är inte inom scope i det yttre kodblocket. Kan lösas så här:public static void Main(string[] args) { double C = 0; // deklarera och initiera C här Console.Write("Enter a temprature "); do { bool loop = true; do { try { int FH = int.Parse(Console.ReadLine()); C = FahrToCels(FH);
Okeeej då förstår jag, då är det ju bättre att göra det utanför eller att skapa en metod för sånt för då kan man ju kalla metoden i flera block!?
Generellt är det bättre att skapa flera korta funktioner som gör varsin avgränsade "grej" än att skapa en lång funktion som gör "alla grejer". Korta funktioner med få argument och få returvärden är enklare att testa och återanvända. Ännu enklare blir det om man samlar inmatning och utmatning i så få funktioner som möjligt så att man får mindre jobb med att mocka dem för sina automat-tester.
Du kan exempelvis skapa en funktion som hanterar inmatning av hela grader Fahrenheit. Du har redan en funktion som omvandlar Fahrenheit till Celsius. Du kan slutligen skapa en funktion som bedömer om temperaturen är lagom (med temperaturer för minimum, lagom och maximum som argument). Sedan kan du anropa dem efter varandra i main- funktionen.