Hjälp ang C#uppgift, felmeddelanden

Permalänk

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

Permalänk
Medlem

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.

Permalänk

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

Permalänk
Medlem
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

Permalänk
Medlem

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.

Permalänk
Medlem

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}.

Visa signatur

Herman

Permalänk

@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?

Permalänk

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

Permalänk
Medlem

@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); }

Permalänk

@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?

Permalänk
Medlem

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

Permalänk
Medlem
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.

Permalänk

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);

Permalänk
Medlem

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

Permalänk
Medlem

@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.

Permalänk

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

Permalänk
Medlem
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(); }

Permalänk

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

Permalänk
Medlem
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

Permalänk

@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?

Permalänk
Medlem
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
Permalänk

@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

Permalänk

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?

Permalänk
Medlem

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...

Permalänk

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!

Permalänk

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

Permalänk
Medlem

@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

Permalänk

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

Permalänk

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

Permalänk

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