Hjälp med programmering C# grunder

Permalänk

Hjälp med programmering C# grunder

Tjabba tjena hallå gott folk!
Jag läser för närvarande en programmeringskurs på komvux, då jag vill sätta mig in i det litet medans jag ändå läser upp högskolebehörigheten. Jag arbetar i C# och Visual Studio.

Jag ska göra ett halvsimpelt program där man ska omvandla Fahrenheit till Celsius.

Användaren ska ange vad optimal temperatur för ett bastuaggregat är i Fahrenheit.
Varav koden ska omvandla via en metod till celsius,
Samt ge ett meddelande om man angivit en för låg eller för hög temperatur, beroende på vissa villkor.

Den optimala temperaturen ska vara 73-77 celsius dvs cirka 165 fahrenheit.
Jag har kommit ganska långt tror jag på uppgiften men börjar få bråttom att bli klar.
Men då jag haft det otroligt svårt privat på sistone med svårt sjuk närstående har jag hamnat efter. Så nu sitter jag här mitt i natten och försöker förstå hur jag ska omvandla ett flyttal till heltal? Då jag deklarerade Fahrenheit och Celsius som double-variabler får jag förstås decimaler i svaret, vilket jag vill undvika. Då antar jag att jag borde använda mig av antingen Math.Round (vilket jag är halvsäker på hur jag ska göra i detta sammanhanget) eller helst konvertera variabeln på något vis till ett heltal, föreslagsvis en int? Men jag vet inte riktigt var i koden jag bör lägga till den konverteringen

Jag har ingen tidigare programmeringserfarenhet, utan är ny och har nyss börjat.

Jag är inte ute efter att fuska eller be er göra något åt mig. Det finns redan multum med trådar dels här på sweclockers och övriga nätet om detta. Jag har läst igenom samtliga men ännu inte förstått hur jag ska göra. Jag vore ytterst tacksam om någon ville förklara enkelt elr lägga till den kod de tror löser problemet så att jag förstår hur den ska användas

Tack på förhand

Vänligen,
Q.S

Här bifogar jag min nuvarande kod
[namespace ConsoleApp7
{
class Program
{
private static float fahrenheit; //Deklarerar variabeln fahrenheit av typen float
private static float celsius; //Deklarerar variabeln celsius av typen float
static float FahrenheitToCelsius(float fahrenheit)
{
float celsius = (fahrenheit - 32) * 5 / 9; //Metodanrop, konverterar automatiskt från fahrenheit till Celsius när användaren matar in fahrenheit.
return celsius; //returnerar värdet
}
static void Main(string[] args)
{
double max_temp = 170.6; // 77 celsius
double min_temp = 163.4; // 73 celsius

do
{
Console.WriteLine("Var god och ange ett bastuaggregats optimala temperatur i Fahrenheit: ");//Användaren ombeds ange optimal värme i ett bastuaggregat i Fahrenheit.
fahrenheit = Convert.ToSingle(Console.ReadLine());
celsius = FahrenheitToCelsius(fahrenheit);

if (fahrenheit >= max_temp)
{
Console.WriteLine("Du angav en temperatur motsvarande {0} Celsius, Vänligen ange en lägre", celsius); //Användaren instrukteras att ange en lägre temperatur.
}
else if (fahrenheit <= min_temp)
{
Console.WriteLine("Du angav en temperatur motsvarande {0} Celsius, Vänligen ange en högre", celsius);//Användaren instrukteras att ange en högre temperatur.
}
else if (celsius >= 73 || celsius <= 75)
{
Console.WriteLine("Nu är temperaturen {0} Celsius, perfekt!", celsius);
Console.ReadLine();

}
} while (fahrenheit >= max_temp || fahrenheit <= min_temp);

Console.WriteLine("Det går nu bra att basta, det är " + celsius + " grader celsius");//Användaren meddelas det slutgiltiga resultatet.
Console.ReadLine();

Console.Write("Programmet slut! Tryck på valfri tangent för att fortsätta . . . ");//Användaren meddelas att programmet är över och därmed avslutas.

Console.ReadKey();
}
}
}]

Permalänk
Medlem

Denna "eller" är fel, måste vara "och".

else if (celsius >= 73 || celsius <= 75)

Vid presentation av dina temperaturer kan du använd Math.Round-metoden.

Ex. Math.Round(67.89999, 1) bör bli 67.9.

(svarat från mobilen, kan blivit något fel)

EDIT; Omsluter du din kod med code-taggar så går den att läsa:
[code]...[/code]

Permalänk

Tjabba tjena hallå gott folk!
Jag läser för närvarande en programmeringskurs på komvux, då jag vill sätta mig in i det litet medans jag ändå läser upp högskolebehörigheten. Jag arbetar i C# och Visual Studio.

Jag ska göra ett halvsimpelt program där man ska omvandla Fahrenheit till Celsius.

Användaren ska ange vad optimal temperatur för ett bastuaggregat är i Fahrenheit.
Varav koden ska omvandla via en metod till celsius,
Samt ge ett meddelande om man angivit en för låg eller för hög temperatur, beroende på vissa villkor.

Den optimala temperaturen ska vara 73-77 celsius dvs cirka 165 fahrenheit.
Jag har kommit ganska långt tror jag på uppgiften men börjar få bråttom att bli klar.
Men då jag haft det otroligt svårt privat på sistone med svårt sjuk närstående har jag hamnat efter. Så nu sitter jag här mitt i natten och försöker förstå hur jag ska omvandla ett flyttal till heltal? Då jag deklarerade Fahrenheit och Celsius som double-variabler får jag förstås decimaler i svaret, vilket jag vill undvika. Då antar jag att jag borde använda mig av antingen Math.Round (vilket jag är halvsäker på hur jag ska göra i detta sammanhanget) eller helst konvertera variabeln på något vis till ett heltal, föreslagsvis en int? Men jag vet inte riktigt var i koden jag bör lägga till den konverteringen

Jag har ingen tidigare programmeringserfarenhet, utan är ny och har nyss börjat.

Jag är inte ute efter att fuska eller be er göra något åt mig. Det finns redan multum med trådar dels här på sweclockers och övriga nätet om detta. Jag har läst igenom samtliga men ännu inte förstått hur jag ska göra. Jag vore ytterst tacksam om någon ville förklara enkelt elr lägga till den kod de tror löser problemet så att jag förstår hur den ska användas

Tack på förhand

Vänligen,
Q.S

Här bifogar jag min nuvarande kod

[namespace ConsoleApp7 { class Program { private static float fahrenheit; //Deklarerar variabeln fahrenheit av typen float private static float celsius; //Deklarerar variabeln celsius av typen float static float FahrenheitToCelsius(float fahrenheit) { float celsius = (fahrenheit - 32) * 5 / 9; //Metodanrop, konverterar automatiskt från fahrenheit till Celsius när användaren matar in fahrenheit. return celsius; //returnerar värdet } static void Main(string[] args) { double max_temp = 170.6; // 77 celsius double min_temp = 163.4; // 73 celsius do { Console.WriteLine("Var god och ange ett bastuaggregats optimala temperatur i Fahrenheit: ");//Användaren ombeds ange optimal värme i ett bastuaggregat i Fahrenheit. fahrenheit = Convert.ToSingle(Console.ReadLine()); celsius = FahrenheitToCelsius(fahrenheit); if (fahrenheit >= max_temp) { Console.WriteLine("Du angav en temperatur motsvarande {0} Celsius, Vänligen ange en lägre", celsius); //Användaren instrukteras att ange en lägre temperatur. } else if (fahrenheit <= min_temp) { Console.WriteLine("Du angav en temperatur motsvarande {0} Celsius, Vänligen ange en högre", celsius);//Användaren instrukteras att ange en högre temperatur. } else if (celsius >= 73 || celsius <= 75) { Console.WriteLine("Nu är temperaturen {0} Celsius, perfekt!", celsius); Console.ReadLine(); } } while (fahrenheit >= max_temp || fahrenheit <= min_temp); Console.WriteLine("Det går nu bra att basta, det är " + celsius + " grader celsius");//Användaren meddelas det slutgiltiga resultatet. Console.ReadLine(); Console.Write("Programmet slut! Tryck på valfri tangent för att fortsätta . . . ");//Användaren meddelas att programmet är över och därmed avslutas. Console.ReadKey(); } } }]

Permalänk
99:e percentilen

Använd [code] när du klistrar in kod, så att det går att läsa den. Exempel:

[code]
int x = 42;
[/code]

En hint: Din lösning bör innehålla en funktion static float fahrenheitToCelsius(float fahrenheit). Denna uppgift är nämligen ett praktexempel på ett problem där det är viktigt att lägga de faktiska uträkningarna i egna funktioner. En (äkta) funktion är, precis som i matematiken, något som tar in någon input och ger ut någon output och inget annat. Inga sidoeffekter som att till exempel modifiera någon variabel utanför funktionen. Bara input och output.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk

@Alling:
Men är inte detta just det?
Jag tänker på uträkningen av Fahrenheit - Celsius.
Annars förstår jag inte riktigt hur du menar att jag bör göra
Tack för hjälpen iaf. Nu bör väl koden vara läslig i det citerade inlägget. Hittade ej hur jag kunde redigera trådens huvudinlägg.
När jag använder mig av Math.Round i detta fallet, vill jag att resultatet, det vill säga den av användaren angivna temperaturen konverterat till Celsius fast i heltal, dvs utan decimaler.
Men det jag inte riktigt förstår mig på att göra, är hur jag ska konvertera till en variabel av heltalstyp som t,ex int men eftersom 163,4 Fahrenheit motsvarar 73 Celsius (73-77 Celsius är uppgiftens optimala resultat) dvs grovt räknat 163,4-170 Fahrenheit. Om det är av en heltalstyp som int, blir det väl fel i uträkningen i och med den inte hanterar decimaler?
Eller är jag helt ute och cyklar?
Tack på förhand.

{ private static float fahrenheit; //Deklarerar variabeln fahrenheit av typen float private static float celsius; //Deklarerar variabeln celsius av typen float static float FahrenheitToCelsius(float fahrenheit) { float celsius = (fahrenheit - 32) * 5 / 9; //Metodanrop, konverterar automatiskt från fahrenheit till Celsius när användaren matar in fahrenheit. return celsius; //returnerar värdet }

Permalänk
Medlem

Ett tips: Om du inte vill ha resultatet som ett decimaltal så tjänar du inget på att räkna ut det som ett decimal tal. I din kod ovan så räknar du ut det som om du bara använde heltal men använder ändå decimaltal.

Om du ändå vill använda double så har du biblioteket Convert som har funktioner att konvertera mellan double och int.

Permalänk
99:e percentilen
Skrivet av quantumsatis:

@Alling:
Men är inte detta just det?
Jag tänker på uträkningen av Fahrenheit - Celsius.
Annars förstår jag inte riktigt hur du menar att jag bör göra

{ private static float fahrenheit; //Deklarerar variabeln fahrenheit av typen float private static float celsius; //Deklarerar variabeln celsius av typen float static float FahrenheitToCelsius(float fahrenheit) { float celsius = (fahrenheit - 32) * 5 / 9; //Metodanrop, konverterar automatiskt från fahrenheit till Celsius när användaren matar in fahrenheit. return celsius; //returnerar värdet }

Jo, det stämmer! Den kod jag har markerat orange är precis vad jag menar, men jag orkade inte läsa så långt eftersom formatering saknades. (Jag är aldrig den som "inte orkar" läsa vanligtvis.) Snyggt kodad funktion! Den går till och med att göra ännu lite bättre genom att helt enkelt returnera (fahrenheit - 32) * 5 / 9 direkt, istället för att först lägga det i en variabel som du omedelbart returnerar.

Dock är din kommentar missvisande:

float celsius = (fahrenheit - 32) * 5 / 9; //Metodanrop, konverterar automatiskt från fahrenheit till Celsius när användaren matar in fahrenheit.

Dels finns det inget metodanrop där och dels har inte den koden något att göra med "när användaren matar in fahrenheit" (vilket är bra; det är bara kommentaren som är dålig). Med detta menar jag alltså att din FahrenheitToCelsius returnerar något när den kallas på, vilket inte behöver vara när användaren gör något. Det kan vara av vilken anledning som helst, och det är helt irrelevant inuti funktionen (där kommentaren är).

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem

Varför har du deklarerat dessa två?

private static float fahrenheit; //Deklarerar variabeln fahrenheit av typen float
private static float celsius; //Deklarerar variabeln celsius av typen float

Och för ännu mer förvirring återanvänder du fältens namn i din metod "FahrenheitToCelsius".

Och... läste du min kommentar ovan om din "else if"?

Permalänk

@hultron:
Jag antog att jag behövde deklarera dom först för att kunna använda dom i metoden jag konverterar Fahrenheit - Celsius?
Det är så jag förstått det iallafall men jag är som sagt väldigt nybörjare så möjligheten är ju stor att jag har fel. Men annars så finns ju inte variabeln fahrenheit, och då blir det error i konverteringen.
Jag har förstås googlat en hel del på detta och sett andra folks "versioner" av samma uppgift, men försökt skriva min egen helt så jag förstår hur det fungerar ordentligt.

Jag ska alltså försöka få samtliga delar konverterade till flyttal, sedan avrunda resultatet. Samt använda mig av undantagshantering / try n catch under programmets gång.

Förslag på hur jag ska göra någon :D?
Jag ber er absolut inte göra det åt mig, men jag har suttit i flera dagar och skrivit om det från grunden flera ggr men blir inte nöjd.
Men jag tar gärna emot tips, elr delar av kod jag kan använda elr exempel på metoder. Eller bara som nu, när ni tacksamt påpekar de fel jag gjort i koden så att jag lär mig.

Jag såg din rättelse med && ist för || vid Else if.

Enligt C betyget skall man alltså
Betyg C
Omräkningen från Fahrenheit till Celsius ovan är inte optimal då det uträknade värdet för Celsius troligtvis blir ett decimaltal och detta ”kapas” rakt av då detta värde ovan lagras som heltal (int). Det avrundas alltså inte.Lös uppgiften och att värdet Celsius sparas som ett flyttal med decimaler.För att en beräkning ska fungera med decimaltal måste alla tal i formeln vara av flyttalstyp.Denna formel kommer inte att fungera då fahr är ett heltal. doubletemp = (fahr -32) * 5 / 9;Här behöver man alltså omvandla fahr till samma double (eller float om ni jobbar med det). Ett sätt att göra detta på är att ”typomvandla” fahr i formeln ovan så det behandlas som en double i formeln.För att lösa detta kan man jobba med så kallad explicit typomvandling som beskrivs på MSDNs hemsida med ett enkelt exempel på följande länk :https://msdn.microsoft.com/en-us/library/ms173105.aspx#Anchor_1123

Jag vill fortfarande att det tal användaren skriver in lagras i en int först eftersom man med stor sannolikhet bara skriver in heltal. Det innebär att metoden ska se ut så här:publicstatic doubleFahrToCels(intfahr){//Typomvandla fahr till flyttal//Gör uträkning med decimaler i svaretreturn temp;}Utöver detta fungerar programmet på ett liknande sätt förutom att det är ett decimaltal som testas mot en lämplig temperatur.Se om du också kanlösa det med att avrunda talet om du väljer att skriva ut det.Programmet ska också kunna hantera fel som uppstår med try & catch.Ett vanligt fel man gör när man jobbar med try och catchär att man lägger för mycket kod i try-blocket. Egentligen ska bara själva typ-omvandlingen ligga här. Se exemplet på sidan 87 i läroboken eller se filmen om undantagshantering.

Permalänk

@hultron:
Tack för hjälpen!
Jag får kolla igenom det noga, läsa ordentligt på om Try and Catch och försöka få detta att funka..
Känner mig helt bränd efter att försökt i evigheter.
Jag må vara världens newb som inte får till det, men jag har så svårt att nöja mig med lägsta betyget och bara skicka in det. Jag vill försöka lära mig och verkligen förstå, så de inte blir copy paste över det hela.

Kan någon, om möjligt, vara så vänlig och förklara för mig vad Parse metoden gör exakt?
Varför bör den användas och till vadå. ^^
Den konverterar variabler om jag förstått rätt?

Blir galen på Hermods, då dem inte har någon form av kommunikation mellan lärare och elev alls, om man fastnar och är i behov av hjälp. Det finns bra videos, men jag har fastnat likväl..

Permalänk
Medlem
Permalänk
99:e percentilen
Skrivet av quantumsatis:

@sickhouse:
Jag antog att jag behövde deklarera dom först för att kunna använda dom i metoden jag konverterar Fahrenheit - Celsius?
Det är så jag förstått det iallafall men jag är som sagt väldigt nybörjare så möjligheten är ju stor att jag har fel. Men annars så finns ju inte variabeln fahrenheit, och då blir det error i konverteringen.

Det fungerar kanske inte riktigt som du tänker.

Din klass Program har i dagsläget två klassvariabler fahrenheit och celsius. (De är klassvariabler pga static, annars hade de varit instansvariabler.)

Du använder dessa i och endast i Main. Du använder dem inte i FahrenheitToCelsius, ty den funktionen har sitt eget scope, och i det scopet finns två lokala variabler fahrenheit och celsius, som inte har något att göra med sina eponyma klassvariabler. Istället för

private static float fahrenheit; private static float celsius; static float FahrenheitToCelsius(float fahrenheit) { float celsius = (fahrenheit - 32) * 5 / 9; return celsius; }

hade du lika gärna kunnat skriva

private static float fahrenheit; private static float celsius; static float FahrenheitToCelsius(float fah) { float cel = (fah - 32) * 5 / 9; return cel; }

och det hade varit helt ekvivalent. fahrenheit och celsius inuti FahrenheitToCelsius överskuggar nämligen sina eponyma klassvariabler, så fahrenheit inuti FahrenheitToCelsius betyder den lokala variabeln/argumentet, inte den globala klassvariabeln.

Att du inte använder någon klassvariabel inuti FahrenheitToCelsius är jättebra och jätteviktigt, för det innebär att du kan ta den funktionen, exakt som den är, och använda den i ett annat program, och den kommer fungera precis likadant. Vi säger att din funktion är pure: Den modifierar ingenting utanför sig själv och den bryr sig inte om någonting utanför sig själv. Det enda den gör är att returnera output som är ett resultat av och endast av dess input. Fortsätt skriva funktioner på det sättet!

Du bör vidare inte ha några klassvariabler alls, för sådana är tänkta att hålla information om klassen. Till exempel skulle en klass Person kunna ha klasskonstanter const int MAX_NAME_LENGTH och const string DEFAULT_NAME. I ditt fall kan det vara rimligt att istället skapa lokala variabler celsius och fahrenheit inuti Main.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem

Nu är jag dålig på just C#, men i Java hade jag skrivit fahrenheitToCelsius såhär i en hjälpklass (eller metod i samma klass då det är ett litet program)

public double fahrToCel(double fahr){ return (fahr - 32) * 5 / 9; }

Använder den sedan genom

celsius = fahrToCel(input.nextDouble); // byt input mot C#'s variant

Dvs helt skippa en extra variabel, kan man göra på något liknande vis i C#?

Skickades från m.sweclockers.com

Visa signatur

Stationär: Core i9 13900k | Asus X790 ROG Strix Gaming-F | 32GB DDR5 | GeForce RTX 5090 | Lian Li PC-O11 dynamic evo
Laptop: Macbook Pro 16" | Apple M1 Max

Permalänk
Medlem

Fredag och klockan är 17:30 så inte särskilt motiverad till att jobba, städade upp din kod lite istället:

using System; namespace ctof { class Program { const Decimal maxTemp = 77M; // 77 celsius const Decimal minTemp = 73M; // 73 celsius static Decimal FahrenheitToCelsius(Decimal fahrenheit) { return (fahrenheit - 32) * 5 / 9; } static void Main(string[] args) { while (true) { //Användaren ombeds ange optimal värme i ett bastuaggregat i Fahrenheit. Console.WriteLine("Var god och ange ett bastuaggregats optimala temperatur i Fahrenheit:"); Decimal fahrenheit; while (!Decimal.TryParse(Console.ReadLine(), out fahrenheit)) { Console.WriteLine("Ogiltigt värde, ange igen:"); } var celsius = FahrenheitToCelsius(fahrenheit); if (celsius >= maxTemp) { Console.WriteLine("Du angav en temperatur motsvarande {0:N1} Celsius, Vänligen ange en lägre", celsius); //Användaren instrukteras att ange en lägre temperatur. } else if (celsius <= minTemp) { Console.WriteLine("Du angav en temperatur motsvarande {0:N1} Celsius, Vänligen ange en högre", celsius);//Användaren instrukteras att ange en högre temperatur. } else { Console.WriteLine("Nu är temperaturen {0:N1} Celsius, perfekt!", celsius); Console.WriteLine("Det går nu bra att basta, det är {0:N1} grader celsius", celsius); break; } } Console.Write("Programmet slut! Tryck på valfri tangent för att fortsätta . . . ");//Användaren meddelas att programmet är över och därmed avslutas. Console.ReadKey(); } } }

Hoppas det kan vara till hjälp.

Permalänk

@Lazze2k5: Tack så hemskt mycket!
Det klarnade till väldigt mycket för mig i och med hur jag borde bygga dylika satser.

Någon som kan enkelt förklara hur man skriver ett aktivitetsdiagram till koden du städade upp ?

Jag gör det via powerpoint och kollat instruktionsvideos på Youtube osv.
Men ingenstans har jag fått förklarat när jag bör använda vilken geometrisk form osv.
Eller om Aktivitetsdiagram och flödesschema är samma sak, och annars vad skillnaden är osv.
Sista gången jag läser programmering på distans innan man kommit in i det litet mer. hehe