Metodanrop för random number med decimal
Hej
Jag försöker få mitt slumpade tal till decimaltal.
Min metod för den har varit i int först, för den anropas ifrån celciusvärdet i föregående metod. Men då får jag bara upp heltal. (När man väljer 0 för att få en slumpad temperatur)
Så jag har gjort om den till double och anropat den från random-metoden istället men då när man väljer 0 så får jag upp min if med att det är för kallt..
Hur får jag ett slumpat tal till ett decimaltal?
using System;
class Program{
//Metod för att omvandla fahrenheit till celcius med decimaltal
public static double Fahr_To_Cel(int fahrenheit){
double temp = (double)fahrenheit;
temp = (temp - 32.0)*5.0/9.0;
return temp;
}
//Metod för att välja en lagom temp åt användaren
public static double Fahr_To_Cel(double fahrenheit){
Random randomNumber = new Random();
double randnumber = randomNumber.Next(83,88);
return randnumber;
}
//Huvudmetod
public static void Main (string[] args) {
double celcius = 0;
int fahrenheit = 0;
double randnumber = 0;
Console.Clear();
//Instruktioner till användaren
Console.WriteLine ("Welcome to The Sauna.\nSelect a temperature in Fahrenheit.");
Console.WriteLine("If you want to choose a good temperature randomly, select 0 (zero)");
Console.WriteLine();
//Loop tills lagom temperatur
do{
Console.Write("\nChoose your temperature: ");
//Undantagshantering om användaren skriver in annat än heltal
try{
fahrenheit = Convert.ToInt32(Console.ReadLine());
celcius = Fahr_To_Cel(fahrenheit);
}
catch (Exception){
Console.Write("Whole digits please. Enter your temperature again.");
continue;
}
//Metodanrop
celcius = Fahr_To_Cel(fahrenheit);
celcius = Math.Round(celcius,1);
randnumber = Fahr_To_Cel(fahrenheit);
randnumber = Math.Round(randnumber,1);
//Slumpat tal väljer temperaturen mellan 83.0 och 88.0
if (fahrenheit == 0)
randnumber = Fahr_To_Cel(fahrenheit);
if (celcius < 82){
Console.WriteLine("A bit too cold with "+celcius+"C...Crank it up a bit.");
}
else if (celcius > 87){
Console.WriteLine(+celcius+ "C. Flaming hot! Lower your temperature.");
}
}while (celcius < 82 || celcius > 87);
Console.WriteLine("It´s now "+celcius + "C.\nEnjoy the sauna! Temperature is good.");
Console.ReadKey();
}
}
Varför har du en variant av Fahr_To_Cel som slumpar, för att argumentet är ett flyttal som inte används? Det är mycket förvirrande. Låt slump-metoden ha ett eget namn.
Fixa också till din indentering. Om du har en IDE så kan man fuska och låta den fixa allting åt dig men du ska inte skapa en vana att skriva din kod så här.
Sant, har ändrat till annat namn nu.
Hur kan jag få argumentet att användas?
är indenteringen fel? Använder mig av en IDE. Hur kan koden då köras?
Om du hade kodat i Python så hade din kod inte fungerat.
Eftersom man i C - relaterade språk använder måsvingar så måste man inte indentera sin kod, man kan strunta i det. Problemet är att du kommer inte ha en aning själv vad som sker när du börjar introducera nestlade loopar men olika logiska satser. Ingen annan kommer heller fatta vad det är du skrivit utan att anstränga sig enormt mycket bara för att veta vilket block som tillhör vilken måsvinge.
Jag tycker indenteringen är ganska läslig.
Om du ska slumpa fram ett resultat behöver du inte skicka in nåt argument, eller hur?
Nej det behöver jag inte.
Gjorde såhär för att testa om jag kan få slumptalet som decimaltal, som med de andra talen/temperaturerna..men det verkat ju inte fungera.
Har du provat metoden random.NextDouble() istället?
Den ger ett slumptal mellam 0.0 och 1.0
var randomNumber = new Random();
double r = randomNumber.NextDouble() * (88-83) + 83;
Normalt skall du bara gör en random generator som använder i hela programmet, inte göra en vid varje anrop till Fahr_To_Cel.
Gör den till en medlem i Program klassen istället sedan ropar du bara randomNumber.NextDouble vid varje anrop till Fahr_To_Cel.
Tack, den ska jag använda.
Men du säger först att jag inte ska anropa vid varje Far_To_Cel och sen ska jag det. Bara för att den ligger under Mainmetoden nu istället?
Har försökt att få /förstå det här med anrop, speciellt på slumptalet nu här efter jag testat din NextDouble men jag förstår det nog inte riktigt..för det funkar inte som jag vill.
Den skriver fortfarande ut som om jag hade valt 0 grader Fahrenheit, vilket då blir minusgrader i Celsius. Tanken är att den ska välja något av mina slumptal..jag ropar på fel sak tydligen och jag kan inte se lösningen.
Hur ser koden ut nu?
using System;
class Program{
//Metod för att omvandla fahrenheit till celcius med decimaltal
public static double Fahr_To_Cel(int fahrenheit){
double temp = (double)fahrenheit;
temp = (temp - 32.0)*5.0/9.0;
return temp;
}
//Huvudmetod
public static void Main (string[] args) {
var randomNumber = new Random();
double r = randomNumber.NextDouble() * (88-83) + 83;
double celcius = 0;
int fahrenheit = 0;
Console.Clear();
//Instruktioner till användaren
Console.WriteLine ("Welcome to The Sauna.\nSelect a temperature in Fahrenheit.");
Console.WriteLine("If you want to choose a good temperature randomly, select 0 (zero)");
Console.WriteLine();
//Loop tills lagom temperatur
do{
Console.Write("\nChoose your temperature: ");
//Undantagshantering om användaren skriver in annat än heltal
try{
fahrenheit = Convert.ToInt32(Console.ReadLine());
celcius = Fahr_To_Cel(fahrenheit);
}
catch (Exception){
Console.Write("Whole digits please. Enter your temperature again.");
continue;
}
//Metodanrop
celcius = Fahr_To_Cel(fahrenheit);
celcius = Math.Round(celcius,1);
//Slumpat tal väljer temperaturen mellan 83.0 och 88.0
if (fahrenheit == 0)
r = randomNumber.NextDouble();
r = Math.Round(r,1);
if (celcius < 82){
Console.WriteLine("A bit too cold with "+celcius+"C...Crank it up a bit.");
}
else if (celcius > 87){
Console.WriteLine(+celcius+ "C. Flaming hot! Lower your temperature.");
}
}while (celcius < 82 || celcius > 87);
Console.WriteLine("It´s now "+celcius + "C.\nEnjoy the sauna! Temperature is good.");
Console.ReadKey();
}
}
Du sätter r till ett slumptal men sen gör du ingenting med r. Ska det vara celcius som blir slumpat?
(Det stavas Celsius.)
Slumptalen är i Celsius.
Skriver man in en 0 (nolla) så är det menat i Fahrenheit.
Hur menar du att jag inte gör något med r? Under min första if så ropar jag på r, slumpat tal.
Du gör
r = Math.Round(r,1);
och efter det använder du inte r.
Måste jag använda mig av celcius-vaiabeln tillsammans med r?
Eller en parameter för r?
Om du vill att 'celcius' ska innehålla slumptalet får du sätta 'celcius' till slumptalet. Kanske
celcius = r;
Detta är inte rätt
if (fahrenheit == 0)
r = randomNumber.NextDouble();
r = Math.Round(r,1);
r blir [0,1] sedan avrundar du?
Nu funkar denna men bara när jag skriver in 0 (noll) första gången. Jag kan inte skriva in 0 andra gången, då verkar det som att celcius = r inte gäller längre. Får upp 0,1 - 0,9 slumpat.
if (fahrenheit == 0)
celcius = r;
r = randomNumber.NextDouble();
celcius = Math.Round(celcius,1);
De där gränserna 83 och 88 använder du ju bara första gången du sätter r, i början av Main. Sedan blir det nåt mellan 0 och 1.
är det så bara eller menar du att jag behöver ange 83 - 88 senare i koden för att det inte ska hoppa över till 0,1-0,9?
Programmet gör ju vad du säger. Säger du inte " * (88-83) + 83" så gör det inte det. Hur skulle det kunna veta att det är det du vill?