4 svar
907 visningar
cky182 34 – Fd. Medlem
Postad: 13 apr 2021 10:55

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

datav 34
Postad: 13 apr 2021 19:16 Redigerad: 13 apr 2021 19:16

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.

41EX 116
Postad: 23 jan 2022 12:01

Man måste skriva

using namespace std;

...

cout << "Hello world!" << endl;

För att det ska fungera med endl. Notera sista << 

Peter_ 470 – Avstängd
Postad: 23 jan 2022 15:16

Kan du formeln för ränta-på-ränta?

anders_k 237
Postad: 24 apr 2022 05:55 Redigerad: 24 apr 2022 05:57
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.

Svara
Close