Programmering 1 flödesschema c#

Permalänk
Medlem

Programmering 1 flödesschema c#

Hej,

Jag har precis börjat med programmering 1 c#.

Jag har gjort en kod som handlar om Amerikanen i Bastun. Det jag egentligen undrar över, är om jag tänkt rätt när jag gjort mitt första flödesschema? Det ska vara ett flödesschema per metod. Och nu har jag endast gjort main metoden.
Dom två sista Else if och else gör så att loopen avslutas. Borde jag ändra dessa två i mitt flödesschema då..? eller kan dom ligga där ändå med tanke på texten i min "medans".

Hoppas ni förstår vad jag menar. Bifogar både min kod samt mitt flödesschema i en bildlänk.

Stort tack på förhand!

Flödesschema: https://imgur.com/a/zTEhJeG

using System; namespace testest { class Program { //METOD: FahrenheitToCelsius, konverterar Fahrenheit till celsius public static double FahrToCels(int fahr) { double temp = (double)fahr; // Typomvandlig till flyttal, casting i högerled, meddelar kompilatorn om att jag tänker göra konverteringen oavsett temp = ((fahr - 32.0) * 5.0) / 9.0; //Konvertering fahr till celsius return temp; // returnerar värdet } //METOD: Main, start på programmet public static void Main(string[] args) { //Har valt att deklarera alla mina variabler högst upp double enDecimal = 1; int fahr = 0; double temp = 0; Console.WriteLine("Hej och välkommen till Bastun!"); do // Denna loop körs så länge användarens svar konverterat till celsius är mindre än 73 eller högre än 77 { Console.Write("\nVänligen ange en temperatur i Fahrenheit för bastun: "); try { fahr = int.Parse(Console.ReadLine()); // läser in string och konverterar till int } catch { Console.WriteLine("Fel! Försök igen, du kan bara skriva in nummer."); continue; // kör om loopen } temp = FahrToCels(fahr); //konverterar användarens svar från fahr till celsius enDecimal = Math.Round(temp, 1); // avrundar användarens svar till en decimal Console.WriteLine($"{fahr} grader fahrenheit blir {enDecimal} grader celsius."); if (temp < 73.0) // Detta villkor körs om celsius är lägre än 73 Console.WriteLine("Det är för kallt, du får skruva upp lite. "); else if (temp > 77.0) // Annars om celsius är högre än 77 körs denna Console.WriteLine("Det är för varmt, du får skruva ner lite. "); else if (temp == 75) //Annars körs detta villkor (om celsius är prick 75) Console.WriteLine("Du har valt den ultimata temperaturen för bastandet."); else // Om inget villkor ovan stämmer körs denna Console.WriteLine("Du har valt en bra temperatur"); } while (temp < 73.0 || temp > 77.0); Console.WriteLine("\nNjut av bastubesöket och välkommen åter!"); Console.ReadKey(); } } }

Permalänk
Medlem
Skrivet av KodarPolle:

Dom två sista Else if och else gör så att loopen avslutas. Borde jag ändra dessa två i mitt flödesschema då..? eller kan dom ligga där ändå med tanke på texten i min "medans".

If-satsen har ingen som helst påverkan på om loopen fortsätter eller avslutas, den skriver bara ut ett meddelande. Det som faktiskt styr loopen är loop-villkoret, d.v.s. din "medans"-ruta. Så ditt flödesschema ser ut att stämma.

Skrivet av KodarPolle:

//Har valt att deklarera alla mina variabler högst upp

Varför? Vanligtvis är det en bra idé att deklarera variabler så nära där de används som möjligt, gärna så att man kan deklarera och initiera variabeln samtidigt. Det gör koden både lättare att läsa och gör det mindre sannolikt att man introducerar buggar för att man använder variabler i fel scope.

Permalänk
Medlem
Skrivet av perost:

If-satsen har ingen som helst påverkan på om loopen fortsätter eller avslutas, den skriver bara ut ett meddelande. Det som faktiskt styr loopen är loop-villkoret, d.v.s. din "medans"-ruta. Så ditt flödesschema ser ut att stämma.

Varför? Vanligtvis är det en bra idé att deklarera variabler så nära där de används som möjligt, gärna så att man kan deklarera och initiera variabeln samtidigt. Det gör koden både lättare att läsa och gör det mindre sannolikt att man introducerar buggar för att man använder variabler i fel scope.

Tack så mycket det har jag inte tänkt på innan.. dock får jag inte ner variabeln temp eller fahr längre ner i koden för då säger den ifrån. Variabeln enDecimal kan jag dock flytta ner. Bifogar ny kod nedan. Antar att den ligger lämpligare nu?

using System; namespace testest { class Program { //METOD: FahrenheitToCelsius, konverterar Fahrenheit till celsius public static double FahrToCels(int fahr) { double temp = (double)fahr; // Typomvandlig till flyttal, casting i högerled, meddelar kompilatorn om att jag tänker göra konverteringen oavsett temp = ((fahr - 32.0) * 5.0) / 9.0; //Konvertering fahr till celsius return temp; // returnerar värdet } //METOD: Main, start på programmet public static void Main(string[] args) { int fahr = 0; double temp = 0; Console.WriteLine("Hej och välkommen till Bastun!"); do // Denna loop körs så länge användarens svar konverterat till celsius är mindre än 73 eller högre än 77 { Console.Write("\nVänligen ange en temperatur i Fahrenheit för bastun: "); try { fahr = int.Parse(Console.ReadLine()); // läser in string och konverterar till int } catch { Console.WriteLine("Fel! Försök igen, du kan bara skriva in nummer."); continue; // kör om loopen } temp = FahrToCels(fahr); //konverterar användarens svar från fahr till celsius double enDecimal = 1; enDecimal = Math.Round(temp, 1); // avrundar användarens svar till en decimal Console.WriteLine($"{fahr} grader fahrenheit blir {enDecimal} grader celsius."); if (temp < 73.0) // Detta villkor körs om celsius är lägre än 73 Console.WriteLine("Det är för kallt, du får skruva upp lite. "); else if (temp > 77.0) // Annars om celsius är högre än 77 körs denna Console.WriteLine("Det är för varmt, du får skruva ner lite. "); else if (temp == 75) //Annars körs detta villkor (om celsius är prick 75) Console.WriteLine("Du har valt den ultimata temperaturen för bastandet."); else // Om inget villkor ovan stämmer körs denna Console.WriteLine("Du har valt en bra temperatur"); } while (temp < 73.0 || temp > 77.0); Console.WriteLine("\nNjut av bastubesöket och välkommen åter!"); Console.ReadKey(); } } }

Permalänk
Medlem
Skrivet av KodarPolle:

Tack så mycket det har jag inte tänkt på innan.. dock får jag inte ner variabeln temp eller fahr längre ner i koden för då säger den ifrån. Variabeln enDecimal kan jag dock flytta ner. Bifogar ny kod nedan. Antar att den ligger lämpligare nu?

Istället för detta:

double enDecimal = 1; enDecimal = Math.Round(temp, 1); // avrundar användarens svar till en decimal

så är det bättre att deklarera och initiera variabeln på samma rad:

double enDecimal = Math.Round(temp, 1);

När det är möjligt så är det oftast bäst att initiera variabler med värdet de ska ha direkt när man deklarerar dem. Men t.ex. temp måste deklareras utanför loopen eftersom den används i loop-villkoret, men måste tilldelas inne i loopen eftersom det är där inmatningen sker. Så där blir man tvungen att separera deklarationen från tilldelningen.

fahr kan du däremot flytta in i loopen, men inte ändå in i try-catch-satsen eftersom den används utanför den satsen. Det gör ingen större skillnad i just det här fallet, men att deklarera variabler i det scope de används i är en bra vana att ha.

Tillägg: Just det, jag skulle även rekommendera att alltid använda { } i t.ex. if-satser, det är annars lätt att man lägger till en rad någonstans och orsakar en bugg utan att tänka på det. D.v.s.:

if (...) Console.WriteLine("..."); something(); // Oops, denna rad hör inte till if-satsen även om det ser ut så.

I det här fallet har du ju ändå lagt in tomma rader mellan kod-raderna, så du sparar inte ens plats genom att hoppa över { }.

Permalänk
Medlem
Skrivet av perost:

Istället för detta:

double enDecimal = 1; enDecimal = Math.Round(temp, 1); // avrundar användarens svar till en decimal

så är det bättre att deklarera och initiera variabeln på samma rad:

double enDecimal = Math.Round(temp, 1);

När det är möjligt så är det oftast bäst att initiera variabler med värdet de ska ha direkt när man deklarerar dem. Men t.ex. temp måste deklareras utanför loopen eftersom den används i loop-villkoret, men måste tilldelas inne i loopen eftersom det är där inmatningen sker. Så där blir man tvungen att separera deklarationen från tilldelningen.

fahr kan du däremot flytta in i loopen, men inte ändå in i try-catch-satsen eftersom den används utanför den satsen. Det gör ingen större skillnad i just det här fallet, men att deklarera variabler i det scope de används i är en bra vana att ha.

Tillägg: Just det, jag skulle även rekommendera att alltid använda { } i t.ex. if-satser, det är annars lätt att man lägger till en rad någonstans och orsakar en bugg utan att tänka på det. D.v.s.:

if (...) Console.WriteLine("..."); something(); // Oops, denna rad hör inte till if-satsen även om det ser ut så.

I det här fallet har du ju ändå lagt in tomma rader mellan kod-raderna, så du sparar inte ens plats genom att hoppa över { }.

Du har helt rätt i det du säger.. tyckte det såg så konstigt ut utan mellanrum i loopen men då kan jag ju lika gärna ha { } som du säger! Ska ha det som en vana att alltid lägga dom där oavsett om jag bara har en rad i loopen.

Ändrade även till en rad, tänkte inte alls på det, tack!

double enDecimal = Math.Round(temp, 1);

Sen har jag en till fråga, kan jag ändra alla mina "temp" till celsius istället? Eller är det dumt.. jag läste nånstans att det finns en "celsius" redan i programmet? Eller är jag helt ute och cyklar nu?..

Permalänk
Medlem
Skrivet av KodarPolle:

Sen har jag en till fråga, kan jag ändra alla mina "temp" till celsius istället? Eller är det dumt.. jag läste nånstans att det finns en "celsius" redan i programmet? Eller är jag helt ute och cyklar nu?..

Du får döpa dina variabler till (nästan) vad som helst, så vill du ändra namnet på temp till celsius så är det bara att göra det. Du använder i alla fall inte celsius som namn på något annat, och det är inte ett reserverat ord i C#.

Kolla för övrigt in denna tråd om samma uppgift, den innehåller lite tips som gäller din kod också.

Permalänk
Medlem
Skrivet av perost:

Du får döpa dina variabler till (nästan) vad som helst, så vill du ändra namnet på temp till celsius så är det bara att göra det. Du använder i alla fall inte celsius som namn på något annat, och det är inte ett reserverat ord i C#.

Kolla för övrigt in denna tråd om samma uppgift, den innehåller lite tips som gäller din kod också.

Tack så hemskt mycket!