Hjälp med c#, ränta, insats och år till sparmål

Permalänk
Medlem

Hjälp med c#, ränta, insats och år till sparmål

Hejj!
Behöver hjälp med en uppgift, ska göra ett program som frågar efter ett årligt insättningsbelopp, en räntesats och ett sparmål.
Sedan ska programmet räkna ut hur många år det tar innan sparmålet har uppnåtts. Hon sa att jag skulle använda mig av en loop dessutom.
Största problemet är väl att jag inte fattar hur jag ska göra loopen, sen så får jag fram "System.FormatException: 'Input string was not in a correct format.'" när jag ska skriva in räntan?
Aja här nedan kommer min kod, hoppas någon kan va snäll nog å hjälpa till!^^

static void Main(string[] args) { int antalÅr = 0; Console.WriteLine("Ange hur mycket du vill sätta in varje år: "); double saldo = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Ange ditt sparmål: "); double sparmål = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Ange räntesatsen i procent: "); double ränta = Convert.ToDouble(Console.ReadLine()); if (saldo >= 0) { } else { Console.WriteLine("Vänligen skriv in en summa större än 0: "); } if (sparmål >= 0) { } else { Console.WriteLine("Vänligen skriv in en summa större än 0: "); } if (ränta >= 0) { } else { Console.WriteLine("Vänligen skriv in en summa större än 0: "); }

Permalänk
Medlem
Skrivet av Isabeell:

Hejj!
Behöver hjälp med en uppgift, ska göra ett program som frågar efter ett årligt insättningsbelopp, en räntesats och ett sparmål.
Sedan ska programmet räkna ut hur många år det tar innan sparmålet har uppnåtts. Hon sa att jag skulle använda mig av en loop dessutom.
Största problemet är väl att jag inte fattar hur jag ska göra loopen, sen så får jag fram "System.FormatException: 'Input string was not in a correct format.'" när jag ska skriva in räntan?
Aja här nedan kommer min kod, hoppas någon kan va snäll nog å hjälpa till!^^

static void Main(string[] args) { int antalÅr = 0; Console.WriteLine("Ange hur mycket du vill sätta in varje år: "); double saldo = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Ange ditt sparmål: "); double sparmål = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Ange räntesatsen i procent: "); double ränta = Convert.ToDouble(Console.ReadLine()); if (saldo >= 0) { } else { Console.WriteLine("Vänligen skriv in en summa större än 0: "); } if (sparmål >= 0) { } else { Console.WriteLine("Vänligen skriv in en summa större än 0: "); } if (ränta >= 0) { } else { Console.WriteLine("Vänligen skriv in en summa större än 0: "); }

Nu kan jag inte C# direkt, men loopen borde vara något i stil med:

double kontosaldo while(kontosaldo< sparmål){ kontosaldo= kontosaldo* (1+ränta) + insättning; antalÅr++;

det blir lite jobbigt för att du kallar insättningen för saldo

Permalänk
Medlem

Convert.ToDouble() förväntar sig en sträng som innehåller ett nummer med eller utan decimaler. T ex 5000, 5000.003 eller 5000,003. Försöker du skriva in t ex räntesatsen som 5% kommer det smälla för att det inte går att konvertera strängen "5%" till ett nummer. Det är troligtvis därför du får "System.FormatException: 'Input string was not in a correct format.'"

Permalänk
Medlem

@Isabeell: Vid den här typen av problem när man inte vet hur koden ska struktureras (vilken ordning saker ska ske, eller vilka funktioner man behöver) tycker jag att det är enklast att börja om på nytt med ett nytt tankesätt.

För mig fungerar det då bra att skriva enbart kommentarer. En rad med en utförlig kommentar per sak du tänker att du behöver utföra för att programmet ska nå sin slutliga funktionalitet.

// Läs in insättningsbelopp // Konvertera inlästa värdet till rätt datatyp // Läs in räntesats // Konvertera inlästa värdet till rätt datatyp // Läs in sparmål // Konvertera inlästa värdet till rätt datatyp // Beräkna resultat: // 1. Vilket är första steget i beräkningen? // 2. Vilket är andra steget i beräkningen? // 3. Fortsätt beskriv beräkningsstegen // 4. ...

Prova ett liknande upplägg där du rad för rad beskriver exakt vad som behöver göras, fast på ren svenska som din otekniska farmor kan förstå. När du sen har en liten berättelse som du tycker hänger ihop kan du ge dig på att försöka implementera det med kod.
Då kommer du förhoppningsvis redan ha upptäckt var du har behov av din loop till exempel. Jag kan tänka mig att du kanske behöver en loop för att gå igenom varje år som ska beräknas. Så gissningsvis gäller beräkningen för ett år men att din loop upprepar beräkningen för så många år som behövs.

Om det är svårt att skriva koden trots att du skrivit alla kommentarer kan det kanske vara en idé att provköra din berättelse på papper. Skriv in lite siffror som exempel och utför beräkningarna skriftligen på papper och se om din matematik överensstämmer med vad du skrivit på datorn.

Det här är också ett bra sätt för att på ett naturlig sätt lära sig skriva läsbar kod. En fara med hur du skrivit nu är till exempel att du rakt upp och ner konverterar användarens inmatning till din förväntade datatyp direkt. Då kan man till exempel få Exceptions om felaktigt format om användaren inte skriver en double exakt så som den måste vara skriven.

Permalänk
Medlem

Kan tipsa om att förenkla if-satserna

if (saldo >= 0) {do nothing} else {do something}

Kan förenklas till:

if (saldo < 0) {do something}

Permalänk
Medlem
Skrivet av Jaxc:

Nu kan jag inte C# direkt, men loopen borde vara något i stil med:

double kontosaldo while(kontosaldo< sparmål){ kontosaldo= kontosaldo* (1+ränta) + insättning; antalÅr++;

det blir lite jobbigt för att du kallar insättningen för saldo

åh tack! ska testa

Permalänk
Medlem
Skrivet av Svertel:

Convert.ToDouble() förväntar sig en sträng som innehåller ett nummer med eller utan decimaler. T ex 5000, 5000.003 eller 5000,003. Försöker du skriva in t ex räntesatsen som 5% kommer det smälla för att det inte går att konvertera strängen "5%" till ett nummer. Det är troligtvis därför du får "System.FormatException: 'Input string was not in a correct format.'"

I see, vad borde jag använda istället eller är det de jag ska lista ut själv?;)

Permalänk
Medlem
Skrivet av Sebbepojken:

@Isabeell: Vid den här typen av problem när man inte vet hur koden ska struktureras (vilken ordning saker ska ske, eller vilka funktioner man behöver) tycker jag att det är enklast att börja om på nytt med ett nytt tankesätt.

För mig fungerar det då bra att skriva enbart kommentarer. En rad med en utförlig kommentar per sak du tänker att du behöver utföra för att programmet ska nå sin slutliga funktionalitet.

// Läs in insättningsbelopp // Konvertera inlästa värdet till rätt datatyp // Läs in räntesats // Konvertera inlästa värdet till rätt datatyp // Läs in sparmål // Konvertera inlästa värdet till rätt datatyp // Beräkna resultat: // 1. Vilket är första steget i beräkningen? // 2. Vilket är andra steget i beräkningen? // 3. Fortsätt beskriv beräkningsstegen // 4. ...

Prova ett liknande upplägg där du rad för rad beskriver exakt vad som behöver göras, fast på ren svenska som din otekniska farmor kan förstå. När du sen har en liten berättelse som du tycker hänger ihop kan du ge dig på att försöka implementera det med kod.
Då kommer du förhoppningsvis redan ha upptäckt var du har behov av din loop till exempel. Jag kan tänka mig att du kanske behöver en loop för att gå igenom varje år som ska beräknas. Så gissningsvis gäller beräkningen för ett år men att din loop upprepar beräkningen för så många år som behövs.

Om det är svårt att skriva koden trots att du skrivit alla kommentarer kan det kanske vara en idé att provköra din berättelse på papper. Skriv in lite siffror som exempel och utför beräkningarna skriftligen på papper och se om din matematik överensstämmer med vad du skrivit på datorn.

Det här är också ett bra sätt för att på ett naturlig sätt lära sig skriva läsbar kod. En fara med hur du skrivit nu är till exempel att du rakt upp och ner konverterar användarens inmatning till din förväntade datatyp direkt. Då kan man till exempel få Exceptions om felaktigt format om användaren inte skriver en double exakt så som den måste vara skriven.

Synd att jag inte har fått det här tipset tidigare, hade nog gjort allting enklare haha. Men tack! Ska göra så i framtiden

Permalänk
Medlem
Skrivet av Isabeell:

I see, vad borde jag använda istället eller är det de jag ska lista ut själv?;)

Det kan vara lite överkurs om det ska vara en grundläggande uppgift. Om du ändå vill säkerställa att användaren skriver rätt input kan du använda dig av try... catch...

I ditt fall hade jag skrivit något liknande

while (true) { try { Console.WriteLine("Ange hur mycket du vill sätta in varje år: "); double insättning = Convert.ToDouble(Console.ReadLine()); break; } catch { Console.WriteLine("Vänligen skriv in en summa med endast siffror."); } }

Då kommer programmet att "prova" koden inom try{}-blocket. Om det går igenom utan felmeddelanden kommer den att utföra break-kommandot och hoppa ur hela while-loopen och fortsätta programmet. Får vi däremot något felmeddelande kommer programmet automatiskt att gå till catch{}-blocket, skriva meddelandet som står där och sedan köra om loopen (try igen), tills användaren har givit en korrekt input.

Permalänk
Medlem
Skrivet av Isabeell:

I see, vad borde jag använda istället eller är det de jag ska lista ut själv?;)

Precis. Mycket lättare att lära sig genom att försöka få ordning på det själv än att få svaren serverade(Egen erfarenhet). Men ta en titt på double.TryParse() så får du nog ordning på problemet med konverteringen.

https://docs.microsoft.com/en-us/dotnet/api/system.double.try...

Permalänk
Medlem
Skrivet av Isabeell:

Synd att jag inte har fått det här tipset tidigare, hade nog gjort allting enklare haha. Men tack! Ska göra så i framtiden

Mina lärare brukade ofta uppmana oss att skriva pseudo-kod innan vi implementerar den riktiga koden. Men det alla tyckte att lät så tråkigt och långsamt; "varför ska jag skriva låtsas-kod när jag kan skriva den riktiga koden direkt?" tänkte man och sprang med huvudet först rakt in i väggen.

Jag tycker att pseudo-kod fungerar rätt dåligt som lärande koncept och att det är enklare att bara skriva på svenska. Det blir då en övning i att först översätta instruktionen till tydliga del-moment och sen implementera dem. Då blir det mycket tydligare vilka delar man inte har förstått.

Permalänk
Medlem
Skrivet av Jaxc:

Nu kan jag inte C# direkt, men loopen borde vara något i stil med:

double kontosaldo while(kontosaldo< sparmål){ kontosaldo= kontosaldo* (1+ränta) + insättning; antalÅr++;

det blir lite jobbigt för att du kallar insättningen för saldo

Varför lägger du till kontosaldo förresten?

Permalänk
Medlem
Skrivet av Tengle:

Det kan vara lite överkurs om det ska vara en grundläggande uppgift. Om du ändå vill säkerställa att användaren skriver rätt input kan du använda dig av try... catch...

I ditt fall hade jag skrivit något liknande

while (true) { try { Console.WriteLine("Ange hur mycket du vill sätta in varje år: "); double insättning = Convert.ToDouble(Console.ReadLine()); break; } catch { Console.WriteLine("Vänligen skriv in en summa med endast siffror."); } }

Då kommer programmet att "prova" koden inom try{}-blocket. Om det går igenom utan felmeddelanden kommer den att utföra break-kommandot och hoppa ur hela while-loopen och fortsätta programmet. Får vi däremot något felmeddelande kommer programmet automatiskt att gå till catch{}-blocket, skriva meddelandet som står där och sedan köra om loopen (try igen), tills användaren har givit en korrekt input.

Varför har du en vinge efter (true)? Har den någon betydelse

Permalänk
Medlem
Skrivet av Isabeell:

Varför har du en vinge efter (true)? Har den någon betydelse

While säger åt programmet att loopa innehållet inom efterföljande { ... }-block så länge villkoret inom () är sant. Villkoret jag satte inom parentesen är i det här fallet true, det vill säga alltid sant. Innebörden av det är att while-loopen kommer att utföras i oändlighet, tills vi stöter på ett "break" som kommer att bryta while-loopen och hoppa ut till raden efter det sista "}"

Permalänk
Medlem
Skrivet av Isabeell:

Varför har du en vinge efter (true)? Har den någon betydelse

C# bryr sig i regel inte om whitespace, d.v.s. mellanslag, rader, etc. Det finns därför olika stilar för bl.a. var man placerar { och }. De två mest populära stilarna är:

// { } på egna rader while (...) { ... } if (...) { ... } else { ... } // { på samma rad som satsen den hör till while (...) { ... } if (...) { ... } else { ... }

Vilken stil du använder för din egen kod är inte så noga så länge som du är konsekvent och inte blandar olika stilar. Kompilatorn bryr sig inte, men kod som är dåligt formaterad blir svårare för dig att läsa och förstå.

Permalänk
Medlem
Skrivet av perost:

C# bryr sig i regel inte om whitespace, d.v.s. mellanslag, rader, etc. Det finns därför olika stilar för bl.a. var man placerar { och }. De två mest populära stilarna är:

// { } på egna rader while (...) { ... } if (...) { ... } else { ... } // { på samma rad som satsen den hör till while (...) { ... } if (...) { ... } else { ... }

Vilken stil du använder för din egen kod är inte så noga så länge som du är konsekvent och inte blandar olika stilar. Kompilatorn bryr sig inte, men kod som är dåligt formaterad blir svårare för dig att läsa och förstå.

Jahaaa då förstår jag ^^ aldrig sett det innan

Permalänk
Medlem
Skrivet av Isabeell:

Varför lägger du till kontosaldo förresten?

För att du i din nuvarande kod använder "saldo" till att hålla reda på hur mycket som sätts in varje månad. Du gör aldrig någon variabel för att hålla koll på hur mycket pengar som ligger på kontot

Permalänk
Medlem
Skrivet av Isabeell:

Jahaaa då förstår jag ^^ aldrig sett det innan

Däremot så är det bra att följa en kodstandard typ https://docs.microsoft.com/en-us/dotnet/csharp/programming-gu...

och för c# så är det att du ska ha { på en ny rad
ex
if(true)
{

}

i Java är standarden som ovan
if(true){
}

Sen bryr sig inte kompilatorn egentligen men kommer bli bättre för andra som ska läsa koden sen

Visa signatur

Fractal Design Node 304 -> ASUS ROG STRIX Z370-I GAMING ->i5 8600K -> be quiet! Pure Rock -> MSI GeForce RTX 4070 VENTUS 2X E 12G OC -> Corsair Vengeance LPX 3200 32GB -> Seasonic FOCUS Plus 650W Gold -> Samsung 960 EVO 500GB -> 2 * Western Digital Black 2 TB -> Samsung 850 EVO Basic SSD 500GB