Permalänk

C# banksimulator

Hej på er!

Jag ber snällt om lite hjälp. Håller på med mitt program men kör fast när jag kommer till "U". Jag kan inmäta ett belopp för att sätta in, samt skriva in ett uttag. Dock vill jag att den säger åt användaren att beloppet man vill ta ut INTE får överstiga saldot. Var går det sned? Hoppas på att en av er kan hjälpa mig

Tack på förhand!

Mvh, Danique

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.Remoting.Metadata;
using System.Text;
using System.Threading.Tasks;

namespace Inlämning_2_danique
{
internal class Program
{
static void Main(string[] args)
{
decimal saldo = 0;
decimal insättningsbelopp = 0;
decimal räntesatsen = 0;
decimal år = 0;
decimal resultatet = 0;

bool running = true;
while (running)
{
Console.WriteLine("Välkommen till Bankens Självservice. Välj en av nedanstående kommando (I, U, S, R eller A: ");
Console.WriteLine("[I]nsättning");
Console.WriteLine("[U]ttag");
Console.WriteLine("[S]aldo");
Console.WriteLine("[R]äntebetalning");
Console.WriteLine("[A]vsluta");

String inmatning = Console.ReadLine();

switch (inmatning.ToLower())

{
case "i":
Console.Write("Sätt in ett belopp: ");
string belopp = Console.ReadLine();
decimal insättning = Convert.ToDecimal(belopp);
saldo += insättning;
if (insättning < 0)
{
Console.WriteLine("Du kan inte sätta in en negativ siffra, vänligen försök igen: ");
}
else
{
Console.WriteLine("Tack! Du gjorde en insättning på: " + insättning);
}
break;

case "u":
Console.Write("Ange hur mycket pengar du vill ta ut: ");
string pengar = Console.ReadLine();
decimal uttag = Convert.ToDecimal(pengar);
saldo -= uttag;
if (uttag < 0)
{
Console.WriteLine("Du kan inte ta ut mer pengar än det du har på kontot, vänligen försök igen: ");
}
else
{
Console.WriteLine("Tack! Du gjorde ett uttag på: " + uttag);
}
break;

case "s":
Console.WriteLine("Det här är ditt saldo: " + saldo);
break;

case "r":
Console.Write("Hur mycket vill du spara per år: ");
if (Decimal.TryParse(Console.ReadLine(), out insättningsbelopp)) ;
else
Console.Write("Registreringen misslyckades pga att du inte skrev en giltig siffra.");

Console.Write("Hur många år vill du spara: ");
if (Decimal.TryParse(Console.ReadLine(), out år)) ;
else
Console.Write("Registreringen misslyckades pga att du inte skrev en giltig siffra.");

Console.Write("Ange räntesatsen i procenten: ");
if (Decimal.TryParse(Console.ReadLine(), out räntesatsen)) ;
else
Console.Write("Registreringen misslyckades pga att du inte skrev en giltig siffra.");

Console.WriteLine(insättningsbelopp + " år med " + räntesatsen + "% avkastning");

for (int i = 1; i <= år; i++)
{
resultatet = resultatet + (resultatet * räntesatsen / 100) + insättningsbelopp + (insättningsbelopp * räntesatsen / 100);
Console.WriteLine("Efter " + i + " år är totalbeloppet av dina årliga insättningar samt avkastningarna: " + resultatet);
}
break;

//anslutning av programmet
case "a":
Console.Write("Tack för idag och välkomna åter!");
running = false;
break;

default: //om användaren matar in en fel kommando då får den upp dett här meddelandet:
Console.WriteLine("För in rätt kommando: ");
break;

}

}

}
}
}

Permalänk
Medlem

Du kollar på fel variabel. uttag är ju vad användaren skriver in och bör aldrig få vara mindre än 0, så uttag < 0 bör aldrig vara sant.

Men din logik är också lite fel, du bör kontrollera att det finns tillräckligt med pengar på kontot innan du drar bort pengarna från saldot. Just nu drar du bort pengar först och försöker sen kontrollera om det fanns tillräckligt med pengar i efterhand.

Permalänk
Medlem

Jag fokuserar på det här:

Citat:

saldo -= uttag;
if (uttag < 0)
{
Console.WriteLine("Du kan inte ta ut mer pengar än det du har på kontot, vänligen försök igen: ");
}

Jag tror att du vill kolla så uttagsbeloppet är rimligt innandu drar av beloppet från saldot. Du vill nog också titta på hur du gör denna koll, dvs hur kollar du att uttagsbeloppet är rimligt?

Permalänk
Medlem

Dessutom: Om du använder [code] [/ code] runt text som är kod så blir den lättare att läsa på forumet.

Edit: Sluttagen ska naturligtvis sitta ihop

Permalänk

Tack för svaret.

Jag har i alla fall fått till att uttaget inte kan vara större än insättningen:

{ case "i": Console.Write("Sätt in ett belopp: "); string belopp = Console.ReadLine(); decimal insättning = Convert.ToDecimal(belopp); saldo += insättning; if (insättning < 0) { Console.WriteLine("Du kan inte sätta in en negativ siffra, vänligen försök igen: "); } else { Console.WriteLine("Tack! Du gjorde en insättning på: " + insättning); } break; case "u": Console.Write("Ange hur mycket pengar du vill ta ut: "); string pengar = Console.ReadLine(); decimal uttag = Convert.ToDecimal(pengar); saldo -= uttag; if (saldo < 0) { Console.WriteLine("Du kan inte ta ut mer pengar än det du har på kontot, vänligen försök igen: "); } else { Console.WriteLine("Tack! Du gjorde ett uttag på: " + uttag); } break; case "s": Console.WriteLine("Det här är ditt saldo: " + saldo); break;

Men menar ni att jag ska göra en beräkning på case S? Istället för under insättningen och uttaget?

Tacksam för hjälpen (hyfsat ny här och med C#)
/Danique

Permalänk
Skrivet av perost:

Du kollar på fel variabel. uttag är ju vad användaren skriver in och bör aldrig få vara mindre än 0, så uttag < 0 bör aldrig vara sant.

Men din logik är också lite fel, du bör kontrollera att det finns tillräckligt med pengar på kontot innan du drar bort pengarna från saldot. Just nu drar du bort pengar först och försöker sen kontrollera om det fanns tillräckligt med pengar i efterhand.

menar du då att jag ska göra en beräkning på Saldot istället? (känner mig så fruktansvärt dum)

Permalänk
Medlem
Skrivet av DKarlsson:

menar du då att jag ska göra en beräkning på Saldot istället? (känner mig så fruktansvärt dum)

Hur skulle du själv göra för att klura ut hur mycket pengar du kan ta ut från ditt bankkonto?

Permalänk
Medlem
Skrivet av DKarlsson:

menar du då att jag ska göra en beräkning på Saldot istället? (känner mig så fruktansvärt dum)

Du behöver kolla att uttaget inte är större än saldot, att uttaget inte är mindre än noll samt dra av uttag från saldot först då du vet att dessa krav inte uppfylls.

Visa signatur

Samsung 77" S90C QD-OLED || LG OLED 42C2 || Sony 77" A80J OLED || 2x Asus PG32UCDM 32" || Lian Li A4-H2O, Asus ROG STRIX B850-I GAMING WIFI, Asus ROG Loki SFX-L 850W, AMD 9950x3D, 64GB DDR5 6000 CL30, 4TB SN850X, NVIDIA RTX 5090 FE ||  Macbook Pro 14" M4 Pro 1TB 48GB || Asus ROG Azoth med Black Ink V2s (205g0) + Asus ROG Harpe ACE

Permalänk
Skrivet av perost:

Hur skulle du själv göra för att klura ut hur mycket pengar du kan ta ut från ditt bankkonto?

Kolla hur mycket saldo jag har.. Men det vet man ju när man sätter i pengar i första raden?

Permalänk
Medlem
Skrivet av DKarlsson:

Kolla hur mycket saldo jag har.. Men det vet man ju när man sätter i pengar i första raden?

Poängen med variabeln saldo som deklareras utanför din while-loop är att den kan behålla sitt värde genom upprepade interaktioner från användaren.

Du kan ju fråga efter saldo som ett meny-alternativ, eller hur?

Använd det för att bygga en kontroll mot variabeln saldo innan du minskar värdet genom uttaget.

Permalänk
Skrivet av MickeBoy:

Poängen med variabeln saldo som deklareras utanför din while-loop är att den kan behålla sitt värde genom upprepade interaktioner från användaren.

Du kan ju fråga efter saldo som ett meny-alternativ, eller hur?

Använd det för att bygga en kontroll mot variabeln saldo innan du minskar värdet genom uttaget.

Tack... Här måste jag kluva på något fruktansvärt. För då tar jag bort valet Saldo ur While loopen och lägger den utanför?

Permalänk
Medlem
Skrivet av DKarlsson:

Tack... Här måste jag kluva på något fruktansvärt. För då tar jag bort valet Saldo ur While loopen och lägger den utanför?

Nej, poängen är att du nu har en variabel saldo som innehåller saldot och en variabel uttag som innehåller hur mycket användaren vill ta ut. Vilket förhållande måste uttag ha till saldo för att uttaget ska tillåtas?

Permalänk
Skrivet av perost:

Nej, poängen är att du nu har en variabel saldo som innehåller saldot och en variabel uttag som innehåller hur mycket användaren vill ta ut. Vilket förhållande måste uttag ha till saldo för att uttaget ska tillåtas?

Uttaget får inte vara mer än saldot tillåter?

Permalänk
Medlem
Skrivet av DKarlsson:

Uttaget får inte vara mer än saldot tillåter?

Precis!

Permalänk
Medlem
Skrivet av DKarlsson:

Uttaget får inte vara mer än saldot tillåter?

Stämmer, och hur skulle du skriva motsvarande i kod?

Visa signatur

Redbox: Asrock B650 Lightning ATX, 7800x3D -20CCO, XFX 6950XT, 2x32GB Corsair Vengence 6400 CL32, WD SN770 2TB, Corsair RMe 1000, Lian Li Lancool 216, Peerless Assassin 120 SE
Purpbox: Z87-Pro, I5 4670K@4.2, Sapphire 290 TRI-X, 2x8GB Crucial Tactical@stock, Deep Silence 1
Samsung Evo 250+500GB + QVO 1TB, 2x1TB 7200RPM backup/lagring
Det var bättre förr: E5300 2600MHz -> 3640MHz, Celeron 300A -> 450MHz

Permalänk
Skrivet av perost:

Och just det får jag inte till för att jag har deklarerat den variablen redan längst upp med saldo = 0. Börjar jag skriva och peta där då funkar programmet inte längre..

Permalänk
Medlem
Skrivet av DKarlsson:

Och just det får jag inte till för att jag har deklarerat den variablen redan längst upp med saldo = 0. Börjar jag skriva och peta där då funkar programmet inte längre..

Du vill bara veta vad värdet är på ditt saldo innan du försöker ta ut pengarna. Inte skriva eller peta alls.

Permalänk
Medlem
Skrivet av DKarlsson:

Och just det får jag inte till för att jag har deklarerat den variablen redan längst upp med saldo = 0. Börjar jag skriva och peta där då funkar programmet inte längre..

Det som står i toppen exekveras när du startar programmet, ditt problem ligger i hanteringen av uttaget, dvs i koden för "U"

Jämför med du löst "I". Vilka variabler används?

"I" har dock också ett problem. Testa att sätta in ett negativt belopp, du kommer få ett felmeddelande, men vad händer när du kollar saldot efteråt?

Visa signatur

Redbox: Asrock B650 Lightning ATX, 7800x3D -20CCO, XFX 6950XT, 2x32GB Corsair Vengence 6400 CL32, WD SN770 2TB, Corsair RMe 1000, Lian Li Lancool 216, Peerless Assassin 120 SE
Purpbox: Z87-Pro, I5 4670K@4.2, Sapphire 290 TRI-X, 2x8GB Crucial Tactical@stock, Deep Silence 1
Samsung Evo 250+500GB + QVO 1TB, 2x1TB 7200RPM backup/lagring
Det var bättre förr: E5300 2600MHz -> 3640MHz, Celeron 300A -> 450MHz

Permalänk
Medlem
Skrivet av DKarlsson:

Och just det får jag inte till för att jag har deklarerat den variablen redan längst upp med saldo = 0. Börjar jag skriva och peta där då funkar programmet inte längre..

När programmet startas så är ju värdet 0, det är korrekt.

Men efter en insättning på 500 så är värdet på variabeln 500, inte sant?

Om du efter en insättning på 500 begär att få veta saldot så kommer svaret att bli 500.

Om du efter denna insättning försöker ta ut 600 (100 mer än saldot) så ska det inte vara möjligt.

Permalänk
Skrivet av MickeBoy:

När programmet startas så är ju värdet 0, det är korrekt.

Men efter en insättning på 500 så är värdet på variabeln 500, inte sant?

Om du efter en insättning på 500 begär att få veta saldot så kommer svaret att bli 500.

Om du efter denna insättning försöker ta ut 600 (100 mer än saldot) så ska det inte vara möjligt.

Stämmer. Men så ska det ju vara? Att man INTE kan ta ut mer pengar än saldot tillåter? Dvs att man inte kan ta ut mer? Det är väl så mitt program fungerar nu?

Permalänk
Medlem
Skrivet av DKarlsson:

Stämmer. Men så ska det ju vara? Att man INTE kan ta ut mer pengar än saldot tillåter? Dvs att man inte kan ta ut mer? Det är väl så mitt program fungerar nu?

Nix, du har en funktion för att kolla saldot, så testa att kolla med den efteråt.

Visa signatur

Redbox: Asrock B650 Lightning ATX, 7800x3D -20CCO, XFX 6950XT, 2x32GB Corsair Vengence 6400 CL32, WD SN770 2TB, Corsair RMe 1000, Lian Li Lancool 216, Peerless Assassin 120 SE
Purpbox: Z87-Pro, I5 4670K@4.2, Sapphire 290 TRI-X, 2x8GB Crucial Tactical@stock, Deep Silence 1
Samsung Evo 250+500GB + QVO 1TB, 2x1TB 7200RPM backup/lagring
Det var bättre förr: E5300 2600MHz -> 3640MHz, Celeron 300A -> 450MHz

Permalänk
Medlem
Skrivet av DKarlsson:

Stämmer. Men så ska det ju vara? Att man INTE kan ta ut mer pengar än saldot tillåter? Dvs att man inte kan ta ut mer? Det är väl så mitt program fungerar nu?

Nej, ditt program tillåter att man tar ut hur mycket pengar som helst. Det skriver ut ett meddelande om att man tagit ut för mycket om man gör det, men saldot ändras oavsett. Du måste kontrollera om det finns tillräckligt med pengar innan du ändrar på saldot, inte efter som du gör nu.

Permalänk
Medlem

Om beloppet som ska tas ut är mindre än (eller lika med) nuvarande saldo så ska pengarna tas ut.
Men on beloppet som ska tas ut är större än nuvarande saldo så ska felmeddelande ges.

if(uttag ....

Permalänk

Tack alla för hjälpen.. Jag hoppas på det bästa nu

Permalänk
Medlem
Skrivet av DKarlsson:

Tack alla för hjälpen.. Jag hoppas på det bästa nu

Du får gärna visa din lösning så vi vet om du förstod, annars kan vi fortsätta hjälpa dig.

En regel för programmering är att man kontrollerar input innan man använder det. Du kontrollerar det just nu efter du har använt den.

Om jag brukar din kod nu och har 0 kr i saldo men vill ta ut 500. Då kommer jag få ta ut 500kr och saldot kommer vara -500 samt den kommer skriva ut att det inte går. Den checken om att det inte går bör du ha före du tar ut det.

Visa signatur

CPU: Ryzen 5600xGPU: 1080 TI ROG Strix RAM:2x16GB G.skill Trident @ 3600MHz MoBo: Asus B550FPSU: Corsair SF750
En resa till Nordkorea
2 dagar i Tjernobyl