Hjälp ang C#uppgift, felmeddelanden

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@Oh Geesus: Tänker med mathround att det blir lite snyggare, än så många decimaler!

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av Oh Geesus:

1. Din do while-sats förvirrar mig. Den borde nog istället vara:

while (fahr < min_temp || fahr > max_temp);

D.v.s om något av uttrycken på vardera sida om || är 'true' så fortsätter loopen.

Det fungerar faktiskt som KaptenDubbe skrivit med !=, eftersom operanderna är bool-uttryck. Villkoret kommer alltså bli sant när true != false eller false != true, d.v.s. när ett (och endast ett) av delvillkoren är sant.

Skillnaden mot att använda || är att || även kommer ge sant när båda delvillkoren är sanna, men det spelar ingen roll här eftersom fahr inte kan vara både mindre än min_temp och större än max_temp samtidigt.

En annan skillnad är att det är enkelt att säga vad koden betyder när man använder ||: "medan fahr är mindre än min_temp eller fahr är större än max_temp". Använder man != istället så får koden en helt annan betydelse som är mycket svårare att uttrycka i ord, och det blir allt annat än uppenbart vad koden faktiskt gör.

Att använda != är även sämre ur prestandasynpunkt, eftersom != måste evaluera båda operanderna för att kunna se om de är olika eller ej, medan || kan hoppa över att evaluera den högra operanden ifall den vänstra är sann.

Det går alltså att skriva som KaptenDubbe gjort i det här fallet, men det är nästan helt säkert ett misstag att göra det.

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@perost: Bra förklaring, ska nog ändra mitt till det då!

Trädvy Permalänk
Medlem
Registrerad
Apr 2017
Skrivet av KaptenDubbe:

@Oh Geesus: Tänker med mathround att det blir lite snyggare, än så många decimaler!

Ah, smart! Det såg absolut bättre ut.

Du skulle nog däremot kunna skriva in Math.Round() direkt i variabeln så att du inte behöver duplicera den efter varje Console.WriteLine.

cel = (fahr - 32) * 5 / 9; cel = Math.Round(cel, 1);

Alternativt bara:

cel = Math.Round((fahr - 32) * 5 / 9, 1);

Skrivet av perost:

Det fungerar faktiskt som KaptenDubbe skrivit med !=, eftersom operanderna är bool-uttryck. Villkoret kommer alltså bli sant när true != false eller false != true, d.v.s. när ett (och endast ett) av delvillkoren är sant.

Skillnaden mot att använda || är att || även kommer ge sant när båda delvillkoren är sanna, men det spelar ingen roll här eftersom fahr inte kan vara både mindre än min_temp och större än max_temp samtidigt.

En annan skillnad är att det är enkelt att säga vad koden betyder när man använder ||: "medan fahr är mindre än min_temp eller fahr är större än max_temp". Använder man != istället så får koden en helt annan betydelse som är mycket svårare att uttrycka i ord, och det blir allt annat än uppenbart vad koden faktiskt gör.

Att använda != är även sämre ur prestandasynpunkt, eftersom != måste evaluera båda operanderna för att kunna se om de är olika eller ej, medan || kan hoppa över att evaluera den högra operanden ifall den vänstra är sann.

Det går alltså att skriva som KaptenDubbe gjort i det här fallet, men det är nästan helt säkert ett misstag att göra det.

Okej, jag förstår! Jag håller med att != känns betydligt snurrigare att läsa i det här sammanhanget.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2002

Fundera också på varför det inte fungerar att mata in maxtemperaturen 170.6 grader.

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@MickeBoy: Du detta var jävligt bra sagt haha. Insåg också att ifall jag skriver bokstäver så kraschar det, vafalls gör jag nu haha?
Provade lite med Try och Catch, men får inte ihopa det riktigt

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2002
Skrivet av KaptenDubbe:

@MickeBoy: Du detta var jävligt bra sagt haha. Insåg också att ifall jag skriver bokstäver så kraschar det, vafalls gör jag nu haha?
Provade lite med Try och Catch, men får inte ihopa det riktigt

Här kan du läsa lite:

https://stackoverflow.com/questions/1354924/how-do-i-parse-a-...

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@MickeBoy: Fick ihop det med Try och catch nu, så nu kraschar det inte längre iaf. Det ända jag stör mig på just nu, ifall jag skriver några försök med siffror, och sedan bokstäver, kommer föregående resultat upp.

Vänligen ange en temperatur i Fahrenheit att basta i: 150
Temperaturen du angav motsvarar 65,6 Celsius, ange en högre temperatur!
Vänligen ange en temperatur i Fahrenheit att basta i: fsefes
Ange endast siffror tack!
Temperaturen du angav motsvarar 65,6 Celsius, ange en högre temperatur!
Vänligen ange en temperatur i Fahrenheit att basta i:

Kanske inte är hela världen, men det är kanske något man ska lägga in i mina IF satser?

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

Löste det nu också med en enkel continue;

Men nu ser jag att jag ska ha metoder med också, eller ha att göra med det, men antar jag inte behöver det, programmet är löst?

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013
Skrivet av KaptenDubbe:

Löste det nu också med en enkel continue;

Men nu ser jag att jag ska ha metoder med också, eller ha att göra med det, men antar jag inte behöver det, programmet är löst?

Står det att du ska använda metoder i kraven så ska du använda metoder.
Skoluppgifter går inte alltid ut på att man ska lösa en uppgift, utan att man ska göra det genom att påvisa att man förstår vissa koncept.

Jag skrev det för övrigt en bit ner på sida 1.

Citat:

Bästa här är att du gör en metod som anropas och returerar det konverterade värdet.

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@zaibuf:

static void Main(string[] args) { Program program = new Program(); program.amerikanare(); Console.ReadKey(); } public void amerikanare()

Jag gjorde såhär, bara något simpelt.
Alltså har löst programmet nu, bara såfall metoden som ska ändras till något vettigare. Sen samtidigt kom jag på att ifall jag skriver ex "100.2" så kommer blir det samma meddelande som när jag skriver med bokstäver. Haha tror lite att jag klyddar lite för mycket med mig själv också

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

Egentligen den ända jag stör mig på nu är det med "." punkten. Fast jag kanske inte borde bry mig om det särskilt

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Nov 2011
Skrivet av KaptenDubbe:

@zaibuf:

static void Main(string[] args) { Program program = new Program(); program.amerikanare(); Console.ReadKey(); } public void amerikanare()

Jag gjorde såhär, bara något simpelt.
Alltså har löst programmet nu, bara såfall metoden som ska ändras till något vettigare. Sen samtidigt kom jag på att ifall jag skriver ex "100.2" så kommer blir det samma meddelande som när jag skriver med bokstäver. Haha tror lite att jag klyddar lite för mycket med mig själv också

Tror snarare vad @zaibuf och din lärare menar är att du ska ha en metod som omvandlar farhenheit till celsius.

int fahr = 212; int cel = fahrToCel(fahr); Console.WriteLine(cel); // 100

| EVGA Z170 FTW | i7 6700k | EVGA GTX 1060 | 16GB DDR4 2400MHz | Cooler Master V850 | Samsung 840 Evo 250GB + 2x WD Black 500GB + Seagate 2TB SSHD |

Laptop: ThinkPad X1 Extreme

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av KaptenDubbe:

Egentligen den ända jag stör mig på nu är det med "." punkten. Fast jag kanske inte borde bry mig om det särskilt

Problemet är troligtvis att programmet använder systemets språkinställningar och därför använder svenska regler för hur tal anges, vilket betyder att komma används som decimaltecken istället för punkt. D.v.s. det fungerar troligtvis om du matar in 100,2 istället för 100.2.

Parse-funktionerna har i regel en överlagring som tar en "kultur" som argument, vilket talar om hur du vill att tal ska tolkas. Jag tror att du kan använda

double.Parse(Console.ReadLine(), System.Globalization.CultureInfo.InvariantCulture)

om du vill använda kulturoberoende regler istället, vilket bl.a. innebär att punkt används som decimaltecken.

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

Wellp, gjorde lite grann och lämnade in uppgiften, insåg direkt efter det här med metoder, att jag kanske skulle dela in uträkningen i en metod osv, som jag såklart inte gjorde. Aja vi får se vad dom säger! Stort tack till all hjälp

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013
Skrivet av KaptenDubbe:

Wellp, gjorde lite grann och lämnade in uppgiften, insåg direkt efter det här med metoder, att jag kanske skulle dela in uträkningen i en metod osv, som jag såklart inte gjorde. Aja vi får se vad dom säger! Stort tack till all hjälp

Generellt om du behöver kopiera kod nånstans, gör en metod av det. Du vill inte ha duplicerat kod i ditt projekt.
Anledningen är att om en bug uppstår så kanske du fixar den på ett ställe men glömmer att göra det på en annat, detta kan skapa väldigt märkliga buggar som kan vara svåra att felsöka.

Så varje gång du känner för att kopiera en kodsnutt, gör en metod (och helst en egen klass) av det

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@zaibuf: Problemet är just nu att jag bara itne förstår hela grejen, även om ni är till super hjälp att jag bara är trög förmodligen. Sitter och försöker göra samma uppgift här nu, vad jag förstår det som vill de att man ska kunna hämta från den metoden, till en annan metod?
Har gjort uträkningen av att omvandla fahrenheit till celsius i en metod, sen i "mainen" allt det jag har gjort här, förutom själva uträkningen, som jag då ska "hämta" från den metoden?

Haha blir så less på mig själv bara D:

EDIT: Just nu har jag bara problem att få in själva uträkningen, från första metoden, till main metoden, utan att faktiskt kopiera uträkningen

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@KaptenDubbe: Det skulle nog underlätta om du visade hur din kod ser ut, det är svårt att gissa exakt vilket fel du gjort.

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

class Program { static double FahrenheittoCelsius(double fahr, double cel) { cel = (fahr + 32) * 5 / 9; return cel; } static void Main(string[] args) { Console.WriteLine("Hej och välkommen till bastun! "); double cel = 0; double fahr = 97; double max_temp = 170.6; double min_temp = 163.4; do { Console.Write("Ange en temperatur i Fahrenheit, så omvandlar vi den till celsius åt dig: "); try { fahr = double.Parse(Console.ReadLine()); } catch { Console.Write("Ange endast i siffror tack!"); continue; } if (fahr >= max_temp) { Console.Write("Graderna du angav motsvarar {0} Celsius, ange en lägre temperatur!", Math.Round(cel, 1)); } else if (fahr <= min_temp) { Console.Write("Temperaturen du angav motsvarar {0} Celsius, ange en högre temperatur!", Math.Round(cel, 1)); } else if (fahr > min_temp && fahr < max_temp) { Console.Write("Nu är temperaturen {0} grader celsius och nu är det optimalt att basta!", Math.Round(cel, 1)); } } while (fahr > min_temp != fahr < max_temp); Console.ReadLine(); { } } } }

Ser att jag har lite extra måsvingar jag ej behöver

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@KaptenDubbe: Du anropar inte din metod någonstans. Men varför tar metoden cel som argument? Metoden ska ju ta in ett fahrenheit-värde och returnera det motsvarande celsius-värdet, varför vill du att användaren även ska skicka in ett celsius-värde?

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@perost: Det är ju det jag inte riktigt förstår, hur jag anropar det, och hur jag än tänker går det inte. Har ändrat nu så det blir fahr istället för cel (tror jag). Och jag vet nog inte riktigt hur jag ska/kan anropar det.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@KaptenDubbe: En metod tar ett antal värden som argument och kan (men behöver inte) returnera ett värde. Så t.ex.:

// Returnerar argumentet multiplicerat med 3. static int triple(int x) { x = x * 3; return x; } // Main är ett exempel på en metod som inte returnerar något, vilket är vad void betyder här. static void Main(string args[]) { int x = 3; int y = 4; x = triple(x); // x blir 9 y = triple(y); // y blir 12 }

Något att tänka på här är att metoder som sagt tar värden som argument. När man anropas metoden som t.ex. triple(x) så är det alltså samma sak som triple(3), d.v.s. det är värdet som x innehåller som skickas som argument och inte själva variabeln x.

Variabeln x i metoden triple är inte heller samma variabel som x i Main, som du ser kan man anropa metoden även på y utan problem. x i triple är i själva verket en lokal variabel som automatiskt tilldelas värdet på det motsvarande argumentet som metoden anropas med. Det finns alltså egentligen ingen mening med att tilldela x ett nytt värde i det här fallet, eftersom det ändå inte kommer påverka något utanför metoden. Så metoden kan istället ekvivalent skrivas som:

static int triple(int x) { return x * 3; }

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013
Skrivet av KaptenDubbe:

@perost: Det är ju det jag inte riktigt förstår, hur jag anropar det, och hur jag än tänker går det inte. Har ändrat nu så det blir fahr istället för cel (tror jag). Och jag vet nog inte riktigt hur jag ska/kan anropar det.

Har er lärare inte gått igenom hur metoder fungerar / hänvisat till kursmaterial där ni kan läsa om det?
Console.WriteLine(), WriteLine() är en metod på klassen Console som du använder hela tiden.

Så på samma sätt kan du anropa din metod du har skapat, parametrarna är det du skickar in.

Citat:

// Deklarera metoden
public int CalculateSum(int x, int y)
{
return x + y;
}

// Anropa metoden och spara den i en variabel som heter sum och en som heter otherSum

var sum = CalculateSum(5, 5); // sum = 10
var otherSum = CalculateSum(10, 10); // otherSum = 20

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@zaibuf: Alltså dom har ju hänvisat till sidor osv i boken man har fått, men inget som faktiskt liksom, visar eller dylikt hur man kombinerar allt ihopa. Det är det jag blir så less på, eller mer less på mig själv att jag inte förstår eller ser det haha

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

Okej nu jävlar har jag löst det. Att jag ska ha så svårt för att förstå haha

Trädvy Permalänk
Medlem
Plats
Täby
Registrerad
Dec 2011

Kul att du löste uppgiften! Här kommer mitt svar, jag tror du kan lära dig från mitt exempel

Stöder:
- Inmatning med punkt och komma. Exempel: 100.4 eller 100,4
- String interpolation med inbyggd formatering
- Felhantering

https://repl.it/@johanbx/sweclocker-bastu