Switch satsen i Csharp (Observera att jag är helt ny inom ämnet)

Permalänk

Switch satsen i Csharp (Observera att jag är helt ny inom ämnet)

Hej! jag kan börja med att berätta att jag studerar gymnasiekursen programmering 1 på egen hand, dvs att jag inte är antagen i någon klass och därför inte har någon lärare att rådfråga. jag kommer att göra ett prov när jag är redo för att få ett betyg.

Därför vänder jag mig till er!
Det är så att jag försöker göra en "banksimulator" som det heter i arbetsboken, med hjälp utav en switch sats.

Det skall bestå av en meny som ser ut såhär:

Console.WriteLine("[I]nsättning"); Console.WriteLine("[U]ttag"); Console.WriteLine("[S]aldo"); Console.WriteLine("[A]vsluta");

Switch satsen fungerar fint, dock har jag problemet att jag inte kan få saldot att fungera eftersom jag inte förstår hur jag använder kod som "sparas" mellan mina cases, t.ex. så startar jag med att deklarera att float nr3 = 0; //detta skall vara saldot, men jag lyckas inte få insättning och uttag att läggas till/tas bort då det står att de saknar "context" och en del andra fel.

Jag nämner återigen att jag precis börjat, så detta är säkert väldigt basic.
Min kod ser i dagsläget ut såhär:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Övning_7._4._2___Banksimulator { class Program { static void Main(string[] args) { while (true) { Console.WriteLine("Banken"); Console.WriteLine("[I]nsättning"); Console.WriteLine("[U]ttag"); Console.WriteLine("[S]aldo"); Console.WriteLine("[A]vsluta"); string Inmatning = Console.ReadLine(); float nr3 = 0; switch (Inmatning) { case "I": case "i": Console.Write("Mata in belopped du vill sätta in:"); string strNr2 = Console.ReadLine(); float nr1 = Convert.ToSingle(strNr2); float nr3 + nr1; break; case "U": case "u": Console.Write("Mata in belopped du vill ta ut:"); string strNr3 = Console.ReadLine(); float nr2 = Convert.ToSingle(strNr3); float nr3 - nr2; break; case "S": case "s": Console.WriteLine("Ditt saldo är: " + nr3); break; case "A": case "a": break; default: Console.WriteLine("Ogiltigt kommando"); break; } } } } }

Tacksam för svar!
Struts

Permalänk
Medlem

Nu var det ett tag sen jag satt i C#, men du deklarerar variablen nr3 flera gånger verkar det som.

T.ex.
float nr3 = 0; //Här deklarerar du och initierar variablen till 0.
float nr3 - nr2; //Här deklarerar du variabeln nr3 igen?

Borde vara typ:
float nr3 = 0; //Deklarera variabel
nr3 = nr3 - nr2;

Sen borde du lägga som vana att skriva dina variabler i början och inte deklarera dem mitt i koden.

Nu sitter jag mest i C, så nån som är mer van med C# får rätta mig om jag är helt ute och cyklar.

Permalänk
Medlem

1. Namnge variabler korrekt. Du säger "t.ex. så startar jag med att deklarera att float nr3 = 0; //detta skall vara saldot"
Gör float saldo = 0; så vet du direkt vad det är för något.

2. Du gör en banksimulator, dvs att vi kommer jobba med "pengar". Använd alltid decimal istället för float eller double när det är pengar som vi jobbar med.

3. Istället för att kolla case i, case I etc (alltså både stora och små bokstäver) kan vi bara skriva switch (Inmatning.ToLower()) så kommer vi automatiskt göra om stora bokstäver till små.

Precis som Poptart säger så deklarerar du variabeln för ditt saldo (nr3, döp om den till saldo) igen i din case. Detta innebär att den skrivs över varje gång du försöker göra en insättning. Dock finns ett annat problem också och det är att du har deklarerat nr3 (saldo) inuti din while (true) loop, och det innebär att den kommer skrivas över varje iteration.

Din kod bör således bli något såhär. Du får fylla i det som saknas själv.

class Program { static void Main(string[] args) { decimal saldo = 0; while (true) { Console.WriteLine("Banken"); Console.WriteLine("[I]nsättning"); Console.WriteLine("[U]ttag"); Console.WriteLine("[S]aldo"); Console.WriteLine("[A]vsluta"); string inmatning = Console.ReadLine(); switch (inmatning.ToLower()) { case "i": decimal insättning; Console.Write("Mata in belopped du vill sätta in: "); if (Decimal.TryParse(Console.ReadLine(), out insättning)) saldo += insättning; else Console.WriteLine("Insättning kunde ej göras pga att du inte skrev ett giltigt nummer."); break; case "s": Console.WriteLine($"Ditt saldo är {saldo:C}"); break; default: Console.WriteLine("Du skrev inte ett giltigt kommando."); break; } } } }

Visa signatur

AW3423DW QD-OLED - Ryzen 5800x - MSI Gaming Trio X 3090 - 64GB 3600@cl16 - Samsung 980 Pro 2TB/WD Black SN850 2TB

Permalänk

Ett par saker att nämna:
När det kommer till vekligheten så använd "decimal" istället för "float". Det skapar visa problem att använda "float" för att tolka decimaltal.

FÖRKLARING:

För att en variabel ska vara tillgängligt för allt inom en klass så måste den skaffas utanför en metod. Du har skrivit float "nr3 = 0;" utanför en funktion så den kan allt tillgå (i klassen).

När du skriver

Citat:

float nr3 + nr1;

så säger du till programmet att lägga ihop nr3 och nr1 men du säger inte till programmet vad du ska göra med svaret.

Du kan skriva

Citat:

float nrX = nr3 + nr1;

så kommer programmet lägga ihop nr3 och nr1 och spara svaret i nrX. nrX kommer då bara finnas tillgängligt inom det "CASE" så ska du ha det till annat så får du deklarera nrX utanför ditt "SWITCH" system.

Sen kan jag säga det att det är lättare att använda IF för det hanterar ett par fel som kan uppstå samt att syntaxen är lite lättare att få till som man vill.

Visa signatur

Cooler Master HAF 922 / Asus P7P55 WS Supercomputer/ AMD FX8320@4GHz / 4x Kingston PC3-10700 2GB DDR3 1333MHz (8GB)/ Sapphire Tri-X R9 290 4GB / 2x 1TB HDD + Intel 320 120GB SSD
1x ASUS PB278Q 27" 1440p PLS / 2x BenQ G2222HDL 21,5" 1080p TN

Permalänk
Keeper of Traditions

Lägg CODE-taggar runt din kod i forumet, eller klistra in i pastebin istället. Det är väldigt jobbigt att läsa lång, oformaterad kod.

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk

Tack för alla svar! jag skall göra ett nytt försök imorgon!

Permalänk
Skrivet av Poptart:

Nu var det ett tag sen jag satt i C#, men du deklarerar variablen nr3 flera gånger verkar det som.

T.ex.
float nr3 = 0; //Här deklarerar du och initierar variablen till 0.
float nr3 - nr2; //Här deklarerar du variabeln nr3 igen?

Borde vara typ:
float nr3 = 0; //Deklarera variabel
nr3 = nr3 - nr2;

Sen borde du lägga som vana att skriva dina variabler i början och inte deklarera dem mitt i koden.

Nu sitter jag mest i C, så nån som är mer van med C# får rätta mig om jag är helt ute och cyklar.

Skrivet av celoz:

1. Namnge variabler korrekt. Du säger "t.ex. så startar jag med att deklarera att float nr3 = 0; //detta skall vara saldot"
Gör float saldo = 0; så vet du direkt vad det är för något.

2. Du gör en banksimulator, dvs att vi kommer jobba med "pengar". Använd alltid decimal istället för float eller double när det är pengar som vi jobbar med.

3. Istället för att kolla case i, case I etc (alltså både stora och små bokstäver) kan vi bara skriva switch (Inmatning.ToLower()) så kommer vi automatiskt göra om stora bokstäver till små.

Precis som Poptart säger så deklarerar du variabeln för ditt saldo (nr3, döp om den till saldo) igen i din case. Detta innebär att den skrivs över varje gång du försöker göra en insättning. Dock finns ett annat problem också och det är att du har deklarerat nr3 (saldo) inuti din while (true) loop, och det innebär att den kommer skrivas över varje iteration.

Din kod bör således bli något såhär. Du får fylla i det som saknas själv.

class Program { static void Main(string[] args) { decimal saldo = 0; while (true) { Console.WriteLine("Banken"); Console.WriteLine("[I]nsättning"); Console.WriteLine("[U]ttag"); Console.WriteLine("[S]aldo"); Console.WriteLine("[A]vsluta"); string inmatning = Console.ReadLine(); switch (inmatning.ToLower()) { case "i": decimal insättning; Console.Write("Mata in belopped du vill sätta in: "); if (Decimal.TryParse(Console.ReadLine(), out insättning)) saldo += insättning; else Console.WriteLine("Insättning kunde ej göras pga att du inte skrev ett giltigt nummer."); break; case "s": Console.WriteLine($"Ditt saldo är {saldo:C}"); break; default: Console.WriteLine("Du skrev inte ett giltigt kommando."); break; } } } }

Skrivet av gustav901:

Ett par saker att nämna:
När det kommer till vekligheten så använd "decimal" istället för "float". Det skapar visa problem att använda "float" för att tolka decimaltal.

FÖRKLARING: https://www.youtube.com/watch?v=PZRI1IfStY0&ab_channel=Comput...

För att en variabel ska vara tillgängligt för allt inom en klass så måste den skaffas utanför en metod. Du har skrivit float "nr3 = 0;" utanför en funktion så den kan allt tillgå (i klassen).

När du skriver
så säger du till programmet att lägga ihop nr3 och nr1 men du säger inte till programmet vad du ska göra med svaret.

Du kan skriva
så kommer programmet lägga ihop nr3 och nr1 och spara svaret i nrX. nrX kommer då bara finnas tillgängligt inom det "CASE" så ska du ha det till annat så får du deklarera nrX utanför ditt "SWITCH" system.

Sen kan jag säga det att det är lättare att använda IF för det hanterar ett par fel som kan uppstå samt att syntaxen är lite lättare att få till som man vill.

Tack så mycket! mycket bra förklaringar, tack vare er så klarade jag uppgiften idag!

Skrivet av Dunder:

Lägg CODE-taggar runt din kod i forumet, eller klistra in i pastebin istället. Det är väldigt jobbigt att läsa lång, oformaterad kod.

Jag uppskattar ditt tips även om jag inte riktigt förstår vad du menar, men jag antar att det är någonting jag kommer att lära mig så småningom!

Edit: En annan fråga, när jag testade programmet så fungerar det bra sålänge jag inte har minus tal, funktionen är iofs som den skall, men man kan inte se något minus tecken framför, har jag gjort något fel?

Permalänk
Keeper of Traditions
Skrivet av strutsen1:

Jag uppskattar ditt tips även om jag inte riktigt förstår vad du menar, men jag antar att det är någonting jag kommer att lära mig så småningom!

Om du lägger CODE-taggar, [Code], runt koden så blir din kod i forumet lättare att läsa. All indentering försvinner om du bara klipper och klistrar. Annars kan du klistra in det i pastebin istället och ge oss länken dit.

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem
Skrivet av strutsen1:

Edit: En annan fråga, när jag testade programmet så fungerar det bra sålänge jag inte har minus tal, funktionen är iofs som den skall, men man kan inte se något minus tecken framför, har jag gjort något fel?

Förstår inte vad du menar, visa din kod och vad som händer när du kör programmet. Negativa tal ska fungera utan problem.

Visa signatur

AW3423DW QD-OLED - Ryzen 5800x - MSI Gaming Trio X 3090 - 64GB 3600@cl16 - Samsung 980 Pro 2TB/WD Black SN850 2TB

Permalänk
Skrivet av celoz:

Förstår inte vad du menar, visa din kod och vad som händer när du kör programmet. Negativa tal ska fungera utan problem.

Det jag menar är att, säg att salot är 0 och jag gör ett "uttag" på fem kronor så står det 5 men inget minus tecken, jag märker att det fungerar eftersom om jag t.ex. har 65 på saldot och sedan gör ett uttag på 70 så kommer det att stå 5, inte -5.

En annan sak jag har upptäckt är att man inte kan stänga av programmet med mitt break; kommando, enligt läroboken skall break; avsluta den innersta while loopen, men när jag skriver a (som är ett switch case) så händer ingenting alls.

Min nuvarande kod:
http://pastebin.com/FZaUwXp3

Permalänk
Skrivet av Dunder:

Om du lägger CODE-taggar, [Code], runt koden så blir din kod i forumet lättare att läsa. All indentering försvinner om du bara klipper och klistrar. Annars kan du klistra in det i pastebin istället och ge oss länken dit.

Sådär, pastebin lyckades jag med, Code taggarna fick jag inte att fungera, exakt hur skall jag skriva dem?

Permalänk
Medlem
Skrivet av strutsen1:

Det jag menar är att, säg att salot är 0 och jag gör ett "uttag" på fem kronor så står det 5 men inget minus tecken, jag märker att det fungerar eftersom om jag t.ex. har 65 på saldot och sedan gör ett uttag på 70 så kommer det att stå 5, inte -5.

En annan sak jag har upptäckt är att man inte kan stänga av programmet med mitt break; kommando, enligt läroboken skall break; avsluta den innersta while loopen, men när jag skriver a (som är ett switch case) så händer ingenting alls.

Min nuvarande kod:
http://pastebin.com/FZaUwXp3

Jag testade lite snabbt med din kod (http://i.imgur.com/YnuXx3K.png) och det fungerar för mig. När du skrivit "u" för att göra ett uttag skriver du då t.ex. -5, -70? Talet kommer bli positivt eftersom om man subtraherar ett negativt tal blir det positivt.

För din andra fråga, break inuti en switch bryter sig ut från switchsatsen. Din while loop kommer fortsätta rulla. Använd

Enviroment.Exit(0); // 0 talar om för OS:et att programmet avslutades korrekt.

för att avsluta ett program.

Skrivet av strutsen1:

Sådär, pastebin lyckades jag med, Code taggarna fick jag inte att fungera, exakt hur skall jag skriva dem?

Skriv [code]<Din kod>[ /code] (utan mellanslaget)

Visa signatur

AW3423DW QD-OLED - Ryzen 5800x - MSI Gaming Trio X 3090 - 64GB 3600@cl16 - Samsung 980 Pro 2TB/WD Black SN850 2TB

Permalänk
Hedersmedlem
Skrivet av celoz:

Jag testade lite snabbt med din kod (http://i.imgur.com/YnuXx3K.png) och det fungerar för mig. När du skrivit "u" för att göra ett uttag skriver du då t.ex. -5, -70? Talet kommer bli positivt eftersom om man subtraherar ett negativt tal blir det positivt.

För din andra fråga, break inuti en switch bryter sig ut från switchsatsen. Din while loop kommer fortsätta rulla. Använd

Enviroment.Exit(0); // 0 talar om för OS:et att programmet avslutades korrekt.

för att avsluta ett program.

Skriv [code]<Din kod>[ /code] (utan mellanslaget)

[code] hello_world(); [/code]

Genom att använda

[noparse][/noparse]

behöver man inte fuska med att lägga in mellanrum i taggen heller.

Permalänk
Skrivet av celoz:

Jag testade lite snabbt med din kod (http://i.imgur.com/YnuXx3K.png) och det fungerar för mig. När du skrivit "u" för att göra ett uttag skriver du då t.ex. -5, -70? Talet kommer bli positivt eftersom om man subtraherar ett negativt tal blir det positivt.

För din andra fråga, break inuti en switch bryter sig ut från switchsatsen. Din while loop kommer fortsätta rulla. Använd

Enviroment.Exit(0); // 0 talar om för OS:et att programmet avslutades korrekt.

för att avsluta ett program.

Skriv [code]<Din kod>[ /code] (utan mellanslaget)

Tack så mycket!
dock så ser det ut såhär för mig när jag kör mitt program, kan det ha någonting med vilken program, alt version av program man använder? jag kör visual studio 2015. Tycker annars att det verkar konstigt eftersom jag inte ändrat någonting i koden jag länkade och den som jag kör själv.
http://imgur.com/yqE3mAw

Enviroment.Exit fungerade fint! Tack återigen!

Permalänk
Skrivet av Shimonu:

[code] hello_world(); [/code]

Genom att använda

[noparse][/noparse]

behöver man inte fuska med att lägga in mellanrum i taggen heller.

tack så mycket!

Permalänk
Medlem

Eftersom din dator verkar vara inställd på att visa siffrorna enligt amerikans standard, så stämmer din utskrift. Man sätter nämligen negativa siffror inom parentes. (iaf inom bokföring.)

Skrivet av strutsen1:

Tack så mycket!
dock så ser det ut såhär för mig när jag kör mitt program, kan det ha någonting med vilken program, alt version av program man använder? jag kör visual studio 2015. Tycker annars att det verkar konstigt eftersom jag inte ändrat någonting i koden jag länkade och den som jag kör själv.
http://imgur.com/yqE3mAw

Enviroment.Exit fungerade fint! Tack återigen!

Skickades från m.sweclockers.com

Visa signatur

as far as we can tell, the massacre went well...