Hjälp med programmerings uppgift c++

Permalänk
Medlem

Hjälp med programmerings uppgift c++

Hej gott folk, Jag började läsa programmering 1 för 3 dagar sen och försöker nu lösa min första uppgift.

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 skrivit ett program som verkar fungera , men den räknar fel, jag förstår inte riktigt vart någonstans felet ligger.
är tacksam om jag kan få hjälp med detta. Har aldrig programmerat förut så ni får ha överseende med detta :). tack på förhand!

min kod:

#include <iostream> using namespace std; int main() { //sätter alla variabler i början så man kan använda de genom hela programmet float deposit; // insättningar float target; // Sparmål float interest; // Ränta float balance; // Saldo int yearCount; // Antal år cout << "Ange hur mycket du vill s\x84tta in varje \x86r:"; cin >> deposit; while (deposit<=0) { cout << "Ins\x84ttning per \x86r m\x86ste \x94verstiga 0 kr\n"; cout << "Ange hur mycket du vill s\x84tta in varje \x86r:"; cin >> deposit; } cout << "Ange ditt sparm\x86l:"; cin >> target; while (target<=0) { cout << "Sparm\x86l m\x86ste \x94verstiga 0 kr\n"; cout << "Ange ditt sparm\x86l:"; cin >> target; } cout << "Ange r\x84ntesats i procent:"; cin >> interest; while (interest<=0) { cout << "R\x84ntesatsen m\x86ste \x94verstiga 0 kr\n"; cout << "Ange r\x84ntesats i procent:"; cin >> interest; } interest = interest/100 + 1; //startvärden på variablarna balance = 0; yearCount = 0; while (balance < target) //Så länge saldot är mindre än sparmålet så: { balance += deposit; //lägger tll en årlig insättning balance *= interest; //multiplicerar totala saldot med räntesatsen yearCount++; // plussar på ett år } cout << balance << endl; cout << yearCount; }

Permalänk
Medlem

Jag misstänker att felet inte har med programmering att göra. Du har helt enkelt inte förstått uppgiften korrekt och har programmerat en lösning som räknar ut fel sak.
Om du inte ger oss uppgiftsbeskrivningen så blir det svårt att gissa sig fram till det rätta svaret.
Har du något exempel på input och vilken output det ska generera?
Har du testat byta plats på multiplikationen med räntesatsen och insättningen?

Visa signatur

I'm Winston Wolfe. I solve problems.

Permalänk

Har bara tagit en snabbtitt och kan inte rakt av se några felaktigheter. Kan ge dig några tips dock.

1. När du räknar med floats så se till att alla siffror du skriver är skrivna som decimaler:

interest = interest/100.0f + 1.0f; //startvärden på variablerna balance = 0.0f; yearCount = 0.0f;

Kan bli avrundningsfel vid vissa speciella tillfällen annars som man helst slipper. Tror dock inte detta är fallet här dock.

Annars är ett bra sätt att debuga kod att lägga in utskrifter överallt där värden ändras och se vad de nya värdena blir.

Och även skriva ut de parametrar du får in så att du är säker på att du får det du tror att du får.

#include <iostream> using namespace std; int main() { //sätter alla variabler i början så man kan använda de genom hela programmet float deposit; // insättningar float target; // Sparmål float interest; // Ränta float balance; // Saldo int yearCount; // Antal år cout << "Ange hur mycket du vill s\x84tta in varje \x86r:"; cin >> deposit; while (deposit<=0) { cout << "Ins\x84ttning per \x86r m\x86ste \x94verstiga 0 kr\n"; cout << "Ange hur mycket du vill s\x84tta in varje \x86r:"; cin >> deposit; } std::cout << "Deposit(from user) = " << deposit<< std::endl; cout << "Ange ditt sparm\x86l:"; cin >> target; while (target<=0) { cout << "Sparm\x86l m\x86ste \x94verstiga 0 kr\n"; cout << "Ange ditt sparm\x86l:"; cin >> target; } std::cout << "Target(from user) = " << target<< std::endl; cout << "Ange r\x84ntesats i procent:"; cin >> interest; while (interest<=0) { cout << "R\x84ntesatsen m\x86ste \x94verstiga 0 kr\n"; cout << "Ange r\x84ntesats i procent:"; cin >> interest; } std::cout << "Interest(from user) = " << interest << std::endl; interest = interest/100 + 1; //startvärden på variablarna std::cout << "Interest (decimal) = " << interest << std::endl; balance = 0; yearCount = 0; while (balance < target) //Så länge saldot är mindre än sparmålet så: { std::cout << yearCount << ": Balance before added deposit = " << balance << std::endl; balance += deposit; //lägger tll en årlig insättning std::cout << yearCount << ": Balance after added deposit = " << balance << std::endl; balance *= interest; //multiplicerar totala saldot med räntesatsen std::cout << yearCount << ": Balance after adding interest = " << balance << std::endl; yearCount++; // plussar på ett år } cout << balance << endl; cout << yearCount; }

Permalänk
Medlem
Skrivet av Superhepper:

Har bara tagit en snabbtitt och kan inte rakt av se några felaktigheter. Kan ge dig några tips dock.

1. När du räknar med floats så se till att alla siffror du skriver är skrivna som decimaler:

interest = interest/100.0f + 1.0f; //startvärden på variablerna balance = 0.0f; yearCount = 0.0f;

Kan bli avrundningsfel vid vissa speciella tillfällen annars som man helst slipper. Tror dock inte detta är fallet här dock.

Annars är ett bra sätt att debuga kod att lägga in utskrifter överallt där värden ändras och se vad de nya värdena blir.

Och även skriva ut de parametrar du får in så att du är säker på att du får det du tror att du får.

#include <iostream> using namespace std; int main() { //sätter alla variabler i början så man kan använda de genom hela programmet float deposit; // insättningar float target; // Sparmål float interest; // Ränta float balance; // Saldo int yearCount; // Antal år cout << "Ange hur mycket du vill s\x84tta in varje \x86r:"; cin >> deposit; while (deposit<=0) { cout << "Ins\x84ttning per \x86r m\x86ste \x94verstiga 0 kr\n"; cout << "Ange hur mycket du vill s\x84tta in varje \x86r:"; cin >> deposit; } std::cout << "Deposit(from user) = " << deposit<< std::endl; cout << "Ange ditt sparm\x86l:"; cin >> target; while (target<=0) { cout << "Sparm\x86l m\x86ste \x94verstiga 0 kr\n"; cout << "Ange ditt sparm\x86l:"; cin >> target; } std::cout << "Target(from user) = " << target<< std::endl; cout << "Ange r\x84ntesats i procent:"; cin >> interest; while (interest<=0) { cout << "R\x84ntesatsen m\x86ste \x94verstiga 0 kr\n"; cout << "Ange r\x84ntesats i procent:"; cin >> interest; } std::cout << "Interest(from user) = " << interest << std::endl; interest = interest/100 + 1; //startvärden på variablarna std::cout << "Interest (decimal) = " << interest << std::endl; balance = 0; yearCount = 0; while (balance < target) //Så länge saldot är mindre än sparmålet så: { std::cout << yearCount << ": Balance before added deposit = " << balance << std::endl; balance += deposit; //lägger tll en årlig insättning std::cout << yearCount << ": Balance after added deposit = " << balance << std::endl; balance *= interest; //multiplicerar totala saldot med räntesatsen std::cout << yearCount << ": Balance after adding interest = " << balance << std::endl; yearCount++; // plussar på ett år } cout << balance << endl; cout << yearCount; }

Tack! det hjälpte att hitta felet när man fick ut data på skärmen.

det är ett räkningsfel

det ligger i loopen, grejen är den att även om man uppnår sparmålet vid en insättning så räknar loopen ändå med en ränta på det , vilket ger fel räkning, så jag måste avbryta loopen kanske med en if sats direkt efter insättningen , men då får jag inte med det året då man gjorde insättningen.

Permalänk
Medlem

Löste det

Saker och ting låg llite i fel ordning, ändrade lite på startvärden och ordningen i loopen. Nu räknar den korrekt efter den matematiska formeln.
tack för hjälpen.

Så ska det se ut:

#include <iostream> using namespace std; int main() { //sätter alla variabler i början så man kan använda de genom hela programmet float deposit; // insättningar float target; // Sparmål float interest; // Ränta float balance; // Saldo int yearCount; // Antal år cout << "Ange hur mycket du vill s\x84tta in varje \x86r:"; cin >> deposit; while (deposit<=0) { cout << "Ins\x84ttning per \x86r m\x86ste \x94verstiga 0 kr\n"; cout << "Ange hur mycket du vill s\x84tta in varje \x86r:"; cin >> deposit; } cout << "Ange ditt sparm\x86l:"; cin >> target; while (target<=0) { cout << "Sparm\x86l m\x86ste \x94verstiga 0 kr\n"; cout << "Ange ditt sparm\x86l:"; cin >> target; } cout << "Ange r\x84ntesats i procent:"; cin >> interest; while (interest<=0) { cout << "R\x84ntesatsen m\x86ste \x94verstiga 0 kr\n"; cout << "Ange r\x84ntesats i procent:"; cin >> interest; } interest = interest/100 + 1; //startvärden på variablarna balance =+ deposit; yearCount = 1.0; while (balance < target) //Så länge saldot är mindre än sparmålet så: { balance *= interest; //multiplicerar totala saldot med räntesatsen yearCount++; // plussar på ett år balance += deposit; //lägger tll en årlig insättning } cout << balance << endl; cout << yearCount;

Permalänk
Medlem

Du hade ju bara kunnat byta plats på raden där du multiplicerar med räntan och den där du adderar insättningen som jag skrev tidigare.
Det blir snyggare kod och resultatet blir detsamma.

interest = interest/100 + 1; //startvärden på variablarna yearCount = 0; while (balance < target) //Så länge saldot är mindre än sparmålet så: { balance *= interest; //multiplicerar totala saldot med räntesatsen balance += deposit; //lägger tll en årlig insättning yearCount++; // plussar på ett år }

Annars så borde du byta 1.0 till 1yearCount är en int .

Visa signatur

I'm Winston Wolfe. I solve problems.

Permalänk
Hedersmedlem

Passar på att komma med lite petimeteranmärkningar. Det kan ofta vara bra att få detaljer lyfta och uppmärksammade tidigt. När man har sett kod ett tag så kommer man mycket snabbare kunna se liknande småsaker, men i början slinker de lätt förbi.

Skrivet av Greenz:

using namespace std;

Detta är egentligen inte nödvändigt, och är på sätt och viss en ovana, och potentiellt negativt rent pedagogiskt. Det gör att en massa variabler som "egentligen" ligger i namnrymden `std` inte behöver kvalificeras, vilket visserligen sparar några bokstäver, men speciellt för någon som är ny till språket gör det också att man inte får koll på vad som mappas till `std` och vad som är direkt inbyggt.

I detta fall så gäller det `cin`, `cout` och `endl`, som plockas in via `iostream`. Antingen kan man skriva namnrymden explicit som i `std::cin`, `std::cout`, `std::endl` varje gång de används i koden, eller så kan man åtminstone se till att explicit kalla in just de variabler och funktioner som man behöver genom att skriva exempelvis:

using std::cin; using std::cout; using std::endl;

varefter man kan använda dem som enbart `cin`, `cout`, `endl` igen, precis som det redan står i din kod. Då så slänger man inte in alla `std::`-medlemmar, utan man har kontroll på vad som händer, vilket är ett fall framåt. Att slänga in fulla namnrymder är något som förr eller senare ger problem.

Skrivet av Greenz:

cout << "Ange hur mycket du vill s\x84tta in varje \x86r:"; cin >> deposit; while (deposit<=0) { cout << "Ins\x84ttning per \x86r m\x86ste \x94verstiga 0 kr\n"; cout << "Ange hur mycket du vill s\x84tta in varje \x86r:"; cin >> deposit; }

(varför du inte använder "åäö" direkt vet jag inte, men jag gissar på att det är något Windowsrelaterat ). Notera att du upprepar dig själv ovan: det är sällan bra. Om du vill ändra något i exempelvis formuleringen så måste du nu ändra på två ställen för att det ska bli konsekvent. I mer komplicerade fall är det lätt fler saker som behöverupprepas om man inte tänker sig för. Att se till att bara behöva skriva saker en gång är den enklaste applikationen av ett koncept som brukar kallas DRY (Don't repeat yourself).

Hur kan man skriva i stället? Det finns flera sätt; en möjlighet vore:

while (true) { cout << "Ange hur mycket du vill s\x84tta in varje \x86r:"; cin >> deposit; if (deposit > 0) { break; } cout << "Ins\x84ttning per \x86r m\x86ste \x94verstiga 0 kr" << endl; }

där jag också bytte "\n" mot `endl`, likt du använder i resten av koden (och bör använda). `break` betyder "hoppa ur loopen". Loopen kommer alltså fråga efter `deposit`: om det är ett giltigt värde så kommer hoppa ur loopen och gå vidare, annars fråga igen.

Felhanteringen i koden är rätt obefintlig utöver att kontrollera att `deposit` är positiv, så om någon skriver exempelvis `apa` så går saker för närvarande åt skogen, men det kommer säkert hanteras i framtida lektioner.

Skrivet av Greenz:

balance =+ deposit;

Detta blir inte fel, men `=+` är inte en "korrekt" enskild operator. Du vill här bara ha ett `=`-tecken: `+` gör egentligen ingenting så som det står. Ifall det hade varit ett `-` så hade du tilldelat "(−1) ⋅ `deposit`" till `balance`, dvs det du skriver nu tolkas egentligen likt:

balance = (+1)*deposit;

I omvänd ordning, dvs `+=`, så händer det ju däremot andra saker, vilket du också utnyttjar senare.

Skrivet av Greenz:

cout << yearCount;

Du kan gott kosta på dig en `endl` här också .

Du saknar sedan den avslutande klammerparentesen `}` i `main`-funktionen, men det är nog bara copy-paste-problematik .

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk

Fick en väldig deja-vu känsla när jag läste tråden. Insåg sedan att det är exakt samma uppgift som i:
http://www.sweclockers.com/forum/10-programmering-och-digital...

Permalänk
Medlem

wow, tack så mycket för all info, verkligen bra hemsida det här, vart medlem idag och kommer nog behöva mer hjälp i framtiden då jag precis börjat kursen och ska läsa programmering 2 direkt efter. tack än en gång och hej så länge!

Skrivet av PixelMiner:

Fick en väldig deja-vu känsla när jag läste tråden. Insåg sedan att det är exakt samma uppgift som i:
http://www.sweclockers.com/forum/10-programmering-och-digital...

ja jag läste den innan , men koden där har samma problem som min hade innan, den räknar fel, dvs loopen stannar ej om man gör en deposit och uppnår målet utan fortsätter att gångra med räntan och sedan slutar loopen.

Permalänk
Hedersmedlem
Skrivet av phz:

Antingen kan man skriva namnrymden explicit som i `std::cin`, `std::cout`, `std::endl` varje gång de används i koden, eller så kan man åtminstone se till att explicit kalla in just de variabler och funktioner som man behöver genom att skriva exempelvis:

using std::cin; using std::cout; using std::endl;

varefter man kan använda dem som enbart `cin`, `cout`, `endl` igen, precis som det redan står i din kod. Då så slänger man inte in alla `std::`-medlemmar, utan man har kontroll på vad som händer, vilket är ett fall framåt. Att slänga in fulla namnrymder är något som förr eller senare ger problem.

Ett mellanslappt alternativ är att inkludera hela namnrymden, men låta bli att göra det globalt. Om man tycker att det blir många std på något särskilt ställe kan man lägga using-satsen där och bara påverka den närmaste omgivningen:

while (deposit<=0) { using namespace std; cout << "Ins\x84ttning per \x86r m\x86ste \x94verstiga 0 kr\n"; cout << "Ange hur mycket du vill s\x84tta in varje \x86r:"; cin >> deposit; }