Vill du vara del av diskussionerna i forumet, ställa frågor eller hjälpa andra? Registrera dig här!

Hjälp ang C#uppgift, felmeddelanden

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

Hjälp ang C#uppgift, felmeddelanden

Hej! Pluggar just nu programmering 1, har aldrig gjort något liknande innan så är rätt så förvirrad ang det hela. Håller just nu på med en uppgift där jag använder while, if och else satser. Men när jag gjort dessa, tex:

else if (fahr <= min_temp) { Console.WriteLine("Temperaturen du angav motsvarar" {0} "Celsius, ange en högre temperatur!"); }

Och har liknande rader, men får felmeddelanden då där saknas ";" tecken och parenteser, men där gör ju inte det?

Hjälp/förklaringar uppskattas!

Då jag gör en uppgift via hermods, läraren känns hopplös att förklara vänder jag mig hit.
Håller på med uppgiften så är inte klar, och kan förstå rader som denna är fel

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013

Du kan inte skriva en string konkatenering på det där viset, vad är {0} i detta fall?

// Interpolation Console.WriteLine($"Temperaturen du angav motsvarar {variabelnamn} Celsius, ange en högre temperatur!"); // Lägg ihop strängarna (undvik detta). Console.WriteLine("Temperaturen du angav motsvarar " + variabelnamn + " Celsius, ange en högre temperatur!");

Felmeddelandet är för att du stänger strängen med " sen skriver du {0}, sen öppnar du en ny sträng. Ska du konkatenera strängarna behöver du använda + mellan strängarna för att lägga ihop dem. Dock är det bästa att använda interpolation som ovan.

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@zaibuf: {0} ska motsvara celsius graderna, fått för mig man kan skriva så iaf. Haha är så förvirrad ang detta!

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

@zaibuf: {0} ska motsvara celsius graderna, fått för mig man kan skriva så iaf. Haha är så förvirrad ang detta!

Du kan skriva på följande vis, där 0 byts ut mot variabeln.

Console.WriteLine("Lite text {0} lite mer text.", minVariabel);

Rekommenderar dock fortfarande att använda första sättet.

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

Console.WriteLine(string.Format("Temperaturen du angav motsvarar {0} Celsius, ange en högre temperatur!", dinVariabelMedCelciusGrader));

Är en annan variant. Nu har du minst tre sätt att åstadkomma samma sak.

Trädvy Permalänk
Medlem
Registrerad
Apr 2004

Det går även att göra som du har gjort men du har lite fel i syntaxen.

Console.WriteLine("Temperaturen du angav motsvarar" {0} "Celsius, ange en högre temperatur!"); //Skall vara Console.WriteLine("Temperaturen du angav motsvarar {0} Celsius, ange en högre temperatur!", denVariabelDuVillAtt0SkallVara);

Du skall alltså innesluta även {0} i " " samt ange efter ett kommatecken vilken variabel du vill visa istället för {0}.

Herman

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@sworst: Så om jag vill då {0} ska vara celsius (för fahrenheit ska användaren skriva), så jag får skriva någon omvandling tidigare i programmet och sen då skriva den omvandligen längst bak i den raden?

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

Kanske borde skriva så långt som jag har kodat än så länge?

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013

@KaptenDubbe: Troligtvis någon av variablerna du använder för att jämföra i else if.

Exempel:

else if (fahr <= min_temp) { Console.WriteLine("Temperaturen du angav motsvarar {0} Celsius, ange en högre temperatur!", min_temp); }

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@zaibuf: Hmm, får nog inte ihop det på detta sättet, det sura är ju att jag halvt itne förstår vad jag gör haha.
Vill att {0} ska vara celsius (som är omvandlat från användarens fahrenheit), så måste ha någon kod som indikerar omvandligen längst bak i den raden?

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

Och hur gör du en sådan omvandling då?

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

@zaibuf: Hmm, får nog inte ihop det på detta sättet, det sura är ju att jag halvt itne förstår vad jag gör haha.
Vill att {0} ska vara celsius (som är omvandlat från användarens fahrenheit), så måste ha någon kod som indikerar omvandligen längst bak i den raden?

Du får posta hela koden.

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

Okej, har inte gjort hela koden, men så här långt har jag kommit innan jag gav upp halvt för dagen

double cel = 0; double fahr = 97; cel = (fahr - 32) * 5 / 9; double max_temp = 170.6; double min_temp = 163.4; Console.WriteLine("Hej! Välkommen till bastun!"); do { Console.Write("Vänligen ange en temperatur att basta i: "); fahr = double.Parse(Console.ReadLine()); if (fahr => max_temp) { Console.WriteLine("Graderna du angav motsvarar" {0} "Celsius, ange en lägre temperatur!"); } else if (fahr <= min_temp) { Console.WriteLine("Temperaturen du angav motsvarar" {0} "Celsius, ange en högre temperatur!"); } else if (fahr > min_temp && fahr < max_temp); { Console.Write("Nu är temperaturen" {0} "grader celsius och nu är det optimalt att basta!") } while (fahr > min_temp != fahr < max_temp);

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

Vad händer när du kör programmet? Och vad vill du ska hända?

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008

@KaptenDubbe: Du använder variabler. WriteLine är ju en metod som går att mata in fler än ett argument till:

string first = "Peter";
string last = "Piper";
string what = "pick";
Console.WriteLine("{0} {1}, {0} {1}, {2}.", first, last, what);

Studera ovan, så du fattar vad som händer.

"Console.WriteLine actually can take parameters after an initial string, but only when the string is in the form of a format string, with expression(s) in braces where substitutions are to be made, (like in fill-in-the-blanks).

The remaining parameters, after the initial string, give the values to be substituted. To know which further parameter to substitute, the parameters after the initial string are implicitly numbered, starting from 0. "

Argumentet/Parametrarna är ju separerade med komman. Första parametern, för att detta ska fungera måste vara en sträng. D.v.s. Börja och sluta med fnuttar/citattecken (").

I det här fallet vill du ha en variabel "temperatur" som en float. Sedan manipulerar du variabeln du skapade genom att konvertera mellan F och C (om det är nu det du vill göra). På så sätt styr du vad som visas på skärmen.

float temp = 0.0;
Console.WriteLine("Antal grader: {0}", temp);
temp += 1.0;
Console.WriteLine("Antal grader: {0}", temp);

Du är väldigt nära. Du behöver en variabel "celcius" som räknas ut med en formel som använder det inlästa värdet i F.
Därefter använder du ovan metod för att visa den.

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@MickeBoy: Inget just nu, då jag inte har gjort klart hela programmet, bara liten start!

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

@MickeBoy: Inget just nu, då jag inte har gjort klart hela programmet, bara liten start!

Det var mera menat som en fråga till dig så att du tänker efter vad det är du vill göra och sedan försöker att uttrycka det i ord.

Det finns flera andra trådar om detta problem om du letar och ges iland tipset att skriva pseudo-kod som en strategi för vad programmet ska göra.

Det finns också många tips om att bekanta sig med debuggern för att kunna följa med i vad som händer (och inte).

Ett annat generella tips är att alltid ha en körande version av programmet och därför göra tillägg i mycket små inkrement, men många gånger istället för att skriva ner hela lösningen i ett svep.

Ett sista tips skulle kunna vara att våga testa och det enklast sättet för mig brukar vara att skriva små testprogram vid sidan av lösningen. Nu är ju den här lösningen inte så stor, så det kanske faller utanför ramen.

Så om vi bortser från felhantering av inmatning så ser det ut som att du just nu har två problem:
1. Du vill kunna formatera output vid anrop till Console.WriteLine.
2. Du vill kunna omvandla en temperatur angiven i fahrenheit till celsius.

Testa nedanstående och se vad som händer:

static void Main(string[] args) { double fahr = 97; Console.WriteLine("Hej! Välkommen till bastun!"); Console.Write("Vänligen ange en temperatur att basta i: "); fahr = double.Parse(Console.ReadLine()); Console.WriteLine($"Du angav {fahr} som temperatur!"); Console.WriteLine("Du angav " + fahr + " som temperatur!"); Console.WriteLine("Du angav {0} som temperatur!", fahr); Console.WriteLine(string.Format("Du angav {0} som temperatur!", fahr)); Console.ReadLine(); }

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@Harddrive: Har jag inte gett celsius en variabel redan då, då den är double?

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

@Harddrive: Har jag inte gett celsius en variabel redan då, då den är double?

Problemetär att din celcius räknas ut i början av programmet med det värdet för fahr du angett då (97). Så då du ber användaren ange värde på fahr har det ingen påverkan på ditt celciusvärde.

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

Edit:
Det jag rekommenderar är att sätta en breakpoint i början av ditt program (klicka vid numret kodraden i editorn, detta ska ge dig en röd cirkel).

Starta med F5, projektet kommer att frysa och invänta kommando. Stega igenom koden steg för steg med F11 och med musen kan du hålla över variabler och se deras aktuella värden.
För detta måste ditt projekt kunna kompilera.

Är du osäker på detta så googla visual studio debugger och du bör få en enkel dokumentation som beskriver der grundläggande med antingen bilder eller video.

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@zaibuf: Så jag borde lägga in uträkningen efter DO men innan IF?
Sitter och pillar lite här samtidigt så ser om jag kommer fram till något haha.
Alltså det största jag stör mig på nu att jag får en hel del fel ang att jag borde ha ";" och paranteser där jag inte borde ha?

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

@zaibuf: Så jag borde lägga in uträkningen efter DO men innan IF?
Sitter och pillar lite här samtidigt så ser om jag kommer fram till något haha.
Alltså det största jag stör mig på nu att jag får en hel del fel ang att jag borde ha ";" och paranteser där jag inte borde ha?

Det är fortfarande dina Console.Writelines som är felformaterade. Visual studio bör tydligt visa felet med en röd linje under kodraden(raderna) som är fel.

Din while sats logik är också fel formaterad. Du vil använda OR || inte NOT (!=)

Sista else if saknar en måsvinge.

Skickades från m.sweclockers.com

Förtydligande
Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@zaibuf: Det visar röda streck under mina if satser och else satser, inte unde mina writelines
Förlåt om jag kanske låter arrogant men kan inte värst mycket om detta

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

Okej nu jävlar pillade ju lite och fattar lite mer tack vare er, nu har jag kommit så här långt

double cel = 0; double fahr = 97; cel = (fahr - 32) * 5 / 9; double max_temp = 170.6; double min_temp = 163.4; Console.WriteLine("Hej! Välkommen till bastun!"); do { Console.Write("Vänligen ange en temperatur i Fahrenheit att basta i: ", cel); fahr = double.Parse(Console.ReadLine()); if (fahr == max_temp) { Console.WriteLine("Graderna du angav motsvarar {0} Celsius, ange en lägre temperatur!", cel); } else if (fahr <= min_temp) { Console.WriteLine("Temperaturen du angav motsvarar {0} Celsius, ange en högre temperatur!", cel); } else if (fahr > min_temp && fahr < max_temp) { Console.Write("Nu är temperaturen {0} grader celsius och nu är det optimalt att basta!", cel); } } while (fahr < min_temp != fahr > max_temp); }

Antar jag ska lägga in formeln för att omvandla graderna i loopen?

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008

Din logik i programmet:

Skapa fahr med värdet 97
Skapa cehl som räknas ut med hjälp av fahr utifrån värdet 97
Definera max/min temps
Fråga efter temperatur att basta i (i fahr)
Fråga tills man angett något inom max/min temp
När ovan är gjort visa upp värdet i cel

Som zaibuf säger så vill du beräkna om cel efter man gett en input annars kommer den ju alltid visa 36 grader c.

Är syntaxerna fel föreslår jag att du kollar hur statements är byggda:
https://docs.microsoft.com/en-us/dotnet/csharp/tour-of-csharp...

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

Alltså fan vad fina ni är. Som faktiskt hjälper en vilsen själ som mig haha. Tror jag börjar reda ut det nu faktiskt!

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

Eller okej nu jävlar är uträkningen fel, attans

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008

@KaptenDubbe:

ungefär såhär vill du göra

//Definera upp alla variabler först som du ska använda
double cel = 0;
double fahr = 0;

// Sätt readonly för att det ska smälla om man försöker ändra (antar att gränserna förblir samma)
double readonly max_temp = 170.6;
double readonly min_temp = 163.4;

// Skit i uträkningen just nu
// cel = (fahr - 32) * 5 / 9;

Console.WriteLine("Hej! Välkommen till bastun!");

do
{

Console.Write("Vänligen ange en temperatur i Fahrenheit att basta i"); //Ta bort andra parametern, den gör inget
fahr = double.Parse(Console.ReadLine());

//Vi sätter inräkningen här istället
cel = (fahr - 32) * 5 / 9;

if (fahr >= max_temp) //Ändra till >=, annars ser man aldrig nedan om man skriver 10000 t.ex.
{
Console.WriteLine("Graderna du angav motsvarar {0} Celsius, ange en lägre temperatur!", cel);
}

else if (fahr <= min_temp)
{
Console.WriteLine("Temperaturen du angav motsvarar {0} Celsius, ange en högre temperatur!", cel);

}

else if (fahr > min_temp && fahr < max_temp)
{
Console.Write("Nu är temperaturen {0} grader celsius och nu är det optimalt att basta!", cel);
}

} while (true);

//Det här villkoret är konstigt eftersom det kan aldrig bli något annat än sant.. d.v.s (0!=1 är sant och 1!=0 är sant vilket är precis alltid 1 d.v.s. alltid true)

//(fahr < min_temp != fahr > max_temp);

Jag har inte testkört den här koden så det kan finnas lite syntaxfel

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

double cel = 0; double fahr = 97; double max_temp = 170.6; double min_temp = 163.4; Console.WriteLine("Hej! Välkommen till bastun!"); do { Console.Write("Vänligen ange en temperatur i Fahrenheit att basta i: "); fahr = double.Parse(Console.ReadLine()); cel = (fahr - 32) * 5 / 9; if (fahr == max_temp) { Console.WriteLine("Graderna du angav motsvarar {0} Celsius, ange en lägre temperatur!", Math.Round (cel, 1)); } else if (fahr <= min_temp) { Console.WriteLine("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);

Så här funkar det för mig just nu! Enda problemet jag vill fixa är, om jag skriver över maxvärdet, kommer det bara upp en ny rad "Vänligen ange en temperatur i Fahrenheit att basta i:", istället för komma upp raden som är i min IF sats

Trädvy Permalänk
Medlem
Registrerad
Aug 2018

@Harddrive: Amen tack! >= löste det hela!

Trädvy Permalänk
Medlem
Registrerad
Apr 2017

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.

2. Vad är syftet med Math.Round()? Det borde rimligtvis funka att ersätta det med bara "cel".

Console.WriteLine("Temperaturen du angav motsvarar {0} Celsius, ange en högre temperatur!", cel)

Alternativt:

Console.WriteLine($"Temperaturen du angav motsvarar {cel} Celsius, ange en högre temperatur!")

Håller själv på med samma kurs så någon får gärna rätta mig om jag har fel.

Skickades från m.sweclockers.com