Inlämningsuppgift
Hej!
Jag är total nybörjare i programmering och har nu min första inlämningsuppgift.
Uppgiften lyder:
Skriv ett program i C++ som frågar efter ett årligt insättningsbelopp och en räntesats och ett sparmål. Programmet ska sedan med hjälp av en iteration (loop) räkna ut hur många år det tar innan sparmålet uppnåtts
Jag har börjat lite smått såhär:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int amount;
int sgoal;
int interest;
cout << "Please fill in the amount to deposit each year:";
cin >> amount;
cout << "Amount to deposit each year:" << amount;
cout << "\n Enter savingsgoal:";
cin >> sgoal;
cout << "Total savingsgoal:" << sgoal;
cout << "\n Interest rate in percentage: " << interest;
cin >> interest;
return 0;
Fråga 1:
Varför läggs texten på en ny rad ibland och ibland inte?
Har lagt till \n i vissa rader för att försöka lösa problemet, men känns inte korrekt.
Testade att lägga till endl efter << amount; för att bryta där men det funkade inte så därför la jag \n efteråt.
Fråga 2:
När jag kör programmet så funkar allting bra fram till Interest. Där fylls siffrorna i själv av programmet, varför?
När det i föregående rader går att fylla i siffrorna själv vilket är det jag vill kunna göra.
Tacksam för svar,
Alexandra
I både C och C++ får man markera newline med hjälp av \n på egen hand.
Dvs får du skriva cout << "Please fill in the amount to deposit each year:\n"; och upprepa detta för alla strängar.
Sedan gällande interest så skriver du ut det innan du faktiskt fått in något värde, så det som skrivs ut är "skräp" som ligger lagrat där.
cout << "\n Interest rate in percentage: " << interest;
cin >> interest;
Tar du bort << interest så kommer du inte märka av det. Dock låter du det vara kvar och kör en cout << interest efter cin >> interest så kommer skräpet bli överskrivet med det "riktiga" värdet.
Man måste skriva
using namespace std;
...
cout << "Hello world!" << endl;
För att det ska fungera med endl. Notera sista <<
Kan du formeln för ränta-på-ränta?
Fråga 1:
Varför läggs texten på en ny rad ibland och ibland inte?Har lagt till \n i vissa rader för att försöka lösa problemet, men känns inte korrekt.
Testade att lägga till endl efter << amount; för att bryta där men det funkade inte så därför la jag \n efteråt.
Fråga 2:
När jag kör programmet så funkar allting bra fram till Interest. Där fylls siffrorna i själv av programmet, varför?
När det i föregående rader går att fylla i siffrorna själv vilket är det jag vill kunna göra.
Fråga 1
I C++ när du skriver till cout och streamar i allmänhet buffras tecknen innan de skrivs ut, det har att göra med att på den "gamla goda tiden" så hade man terminaler som var långsamma och som bara skrev en rad i taget, man kunde inte backa en rad - typ som en matrix printer som skrev rad efter rad.
För att optimera detta så buffrade man all output tills man fick "ny rad" som antingen kunde vara \n eller std::endl. Du kan trigga en tömning av bufferten utan att gå till en ny rad genom att ange std::flush
std::cout << "Please fill in the amount to deposit each year :" << std::flush;
Fråga 2
Såsom cout, så är cin också buffrad och beroende på implementation så kan det vara så att din kompilator(version) gör så att den inte ignorerar "whitespace", när du då skriver t.ex. "12[ENTER]" ligger tecknen '1' '2' '\n' i bufferten när du sedan gör
std::cin >> sgoal;
så tas '1' '2' ut och läggs i sgoal som 12, men '\n' ligger kvar i bufferten. När du igen skriver "24[ENTER]" ser bufferten ut som '\n' '2' '4' \n och det kan ställa till det när du sen gör std::cin >> interest.
Du kan tala om för cin att explicit ignorera whitespace genom att först ropa cin.ignore(...) innan du läser in:
#include <limits>
...
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cin >> interest;
Anm. du behöver inte använda limits, bara ta ett tal som du tror räcker för att svälja alla tecken som kan komma framför.
Alternativt använd std::getline och sedan konvertera till integer - std::stoi()
Övrigt
Du bör alltid initialisera dina variabler innan du använder dem, det är en bra vana. Många kompilatorer ger varningar om det men inte äldre kompilatorer.
Det är också en bra vana att använda namespace framför, speciellt när programmen blir större och mer komplexa med multipla och ibland nestade namespaces. Det kan tyckas jobbigt och oläsligt men är bra i större sammanhang.