Permalänk
Medlem

problem med loop-räknare c++

Tackar för hjälpen alla! löste det med ett konto där alla pengar sätts in!

Permalänk
Avstängd
Skrivet av sickbird:

Hallå alla!

Sitter och försöker få en "loop" räknare att fungera i c++, men kommer ingen vart!
Matten är garanterat fel.... och den vill inte avrunda till tex 55000, 50 kr

När jag skriver in

5000 kr/år
spara till 50000 kr
ränta: 10%

uppnås efter 10DA0ed48 år
saldot blir 105005DA0ED48

så räknaren har lite problem!

Tänkte om det finns någon som kan ge mig lite tips eller om det är något jag inte ser!

mvh
Koden:

#include <iostream>
#include <stdlib.h>

using namespace std;
int main()
{
double deposit;
cout << "Ange hur mycket du vill sätta in varje år: ";
cin >> deposit;

cout << "Ange ditt sparmål: ";
double target;
cin >> target;

cout << "Ange räntesatsen i procent: ";
double interest;
cin >> interest;
interest = (interest / 100 + 1);

int year ;
year = 0;

while ( deposit >= target);
{
target = (interest * deposit) + deposit;
year=1;
cout << "Ditt sparmål uppnås efter " << year << cout << " år" << endl;
cout << "Ditt saldo kommer att vara " << target << cout << " kr" << endl;

}

system ("pause");
}

year=1; kanske du skulle kika på

Visa signatur

///M4

Permalänk
Medlem
Skrivet av sickbird:

cout << "Ditt sparmål uppnås efter " << year << cout << " år" << endl; cout << "Ditt saldo kommer att vara " << target << cout << " kr" << endl;

Jag vet inte vad du förväntar dig att denna kod ska göra, men cout << cout kommer i alla fall att skriva ut addressen på cout vilket sannolikt inte är vad du vill. Detta är orsaken till att du får en så konstig utskrift, t.ex. 10DA0ed48 där 1 är värdet på year och 0DA0ed48 är addressen på cout.

Permalänk
Medlem

While (deposit >= target) är väl det som är felet? deposit kommer aldrig bli större än target så du får en evighetsloop? År ingen programmerare så jag tänker bara högt.

Visa signatur

Ryzen 5900x@3700 MHz | 64GB Kingston Fury 3600 CL18 | MSI MAG B550 Tomahawk | Powercolor Radeon RX 7800XT Hellhound 16GB | Noctua NH-D15 | FD Meshify 2 Compact | Seasonic Focus GX 750W | WD Black SN750 1TB

Permalänk
Medlem

har ändrat det med cout i loopen, så nu blir talen "vanliga". Får ursäkta om ni tycker detta är "standard" bara använt c++ i 4-5 dagar! Vet att ni här kan era grejer, så tar gärna hints och hjälp för att bli bättre!

Permalänk
Medlem
Skrivet av sickbird:

har ändrat det med cout i loopen, så nu blir talen "vanliga". Får ursäkta om ni tycker detta är "standard" bara använt c++ i 4-5 dagar! Vet att ni här kan era grejer, så tar gärna hints och hjälp för att bli bättre!

Här har du något att titta på.
(Ja, programmet fungerar, bara att kopiera och köra)

#include "stdafx.h" #include <math.h> #include <iostream> using namespace std; int deposit; // Här sätter vi några GLOBALA variabler. int target; // För att kunna komma åt dem vart vi än är i programmet. float intrest; float account; int monthCount; int yearCount=1; void count() { account+=deposit; // Först sätter vi in första årets insättningen på kontot. while(account < target) // Så länge SUMMAN på kontot är MINDRE ÄN SPARMÅLET, så låter vi månaderna gå. { float temp = intrest/100 + 1;// Sparar vår ränteprocent här (1.1). account=account*temp; // För varje månad som går, MULTIPLISERAS kontot med räntan 1.1, nya summan. monthCount++; // Och då har det gått en månad! if(monthCount==12) // När det har gått 1 ÅR, är det dags för en ny insättning. { account+=deposit; // Års SUMMAN PLUS den nya insättning. if(account>=target) // Kollar om kontot blir mer än vår SPARMÅL, klara med väntandet! {break;} // Bryter WHILE LOOPEN yearCount++; // Annars säger vi att det har gått 1år.. monthCount=0; // Och börjar räkna månaderna på nytt. } } cout << "Calculated Time Until Target" << endl << endl; cout << "Years: " << yearCount << endl << " Month: " << monthCount << endl << " Account: " << floor(account) << endl; // Tvångs avrundar NERÅT med floor här bara. } int _tmain(int argc, _TCHAR* argv[]) { cout << "Deposit per year?" << endl; // Insättning per år... cin >> deposit; cout << "Target for account?" << endl; // Sparmål... cin >> target; cout << "Intrest per month? %" << endl; // Ränta cin >> intrest; cout << endl; count(); // Här gör vi en funktion, så vi slipper ha allt på samma ställe.. cout << endl; system("PAUSE"); // Här säger vi bara att programet ska vänta med att stänga sig, tills vi vill det. return 0; // return 0, betyder "stäng programet" - "exit/shutdown" }

Dold text
Visa signatur

Dator: Ett metall chassi med varierande komponenter på insidan.

Permalänk

Jag lade allt i en egen funktion. In-variablerna till funktionen gjorde jag som const referenser, det innebär att dessa variabler inte går att att ändra inuti funktionen. Ut-variablerna skickas in som vanliga referenser (lite onödigt för basala typer såsom int, double, osv. Men är en bra princip att hålla sig till).

Jag slängde dessutom in lite felkontroll. Du kan ju inte alltid lita på att användaren av programmet skickar in vettig data. Om de t.ex. anger ett negativt sparande så kommer ju målet aldrig att nås. Om man anger felaktig indata så kommer funktionen att returnera 'false'. Samma sak om besparingarna inte når målet inom rimlig tid (jag satte 1 miljon år som gräns ).

#include <iostream> using namespace std; bool computeSavings(const double& deposit, const double& target, const double& interest, double& savings, int& years) { if (deposit <= 0) { cerr << "Fel! Du måste ange ett positivt sparande." << endl; return false; // Returnera 'false' vid felaktig indata } if (target < 0) { cerr << "Fel! Du har angett ett negativt sparmål. " << endl; return false; // Returnera 'false' vid felaktig indata } if (interest < 0) { cerr << "Fel! Du har angett en negativ ränta. " << endl; return false; // Returnera 'false' vid felaktig indata } // Kör loopen så länge besparingarna är mindre än målet while (savings < target) { savings += deposit; // Lägg till årets sparande savings *= interest; // Beräkna räntan på det totala beloppet vid årets slut ++years; // Öka års antalet // Om målet inte är nått efter 1 miljon år så avbryter vi if (years >= 1E6) { cerr << "Fel! Efter " << years << " år så har målet ännu inte nåtts. Avbryter beräkningen" << endl; return false; // Returnera 'false' vid felaktig indata } } return true; } int main() { double deposit; cout << "Ange hur mycket du vill sätta in varje år: "; cin >> deposit; double target; cout << "Ange ditt sparmål: "; cin >> target; double interest; cout << "Ange räntesatsen i procent: "; cin >> interest; // Räkna om räntan ifrån procent till flyttal interest = 1.0 + (interest/100.0); // Start variabler som skickas in i beräkningsfunktionen double savings = 0.0; // 0 kronor på kontot vid år 0 int years = 0; // // Beräkna antalet år som krävs för att nå målet if (computeSavings(deposit, target, interest, savings, years)) { cout << "Ditt sparmål uppnås efter " << years << " år" << endl; cout << "Ditt saldo kommer då att vara " << savings << " kr" << endl; } else { cerr << "Sparmålet kunde ej beräknas pga felaktig indata." << endl; } return 0; }

Permalänk
Medlem
Skrivet av PixelMiner:

Jag lade allt i en egen funktion. In-variablerna till funktionen gjorde jag som const referenser, det innebär att dessa variabler inte går att att ändra inuti funktionen. Ut-variablerna skickas in som vanliga referenser (lite onödigt för basala typer såsom int, double, osv. Men är en bra princip att hålla sig till).

Jag slängde dessutom in lite felkontroll. Du kan ju inte alltid lita på att användaren av programmet skickar in vettig data. Om de t.ex. anger ett negativt sparande så kommer ju målet aldrig att nås. Om man anger felaktig indata så kommer funktionen att returnera 'false'. Samma sak om besparingarna inte når målet inom rimlig tid (jag satte 1 miljon år som gräns ).

[CODE] ... ... ...

Kan man också göra, sitter själv inte mycket med c++, men en och annan bit kommer man väl ihåg från skoltiden.
På senare tid har man mest att göra med Ladder och FBD (PLC).

Visa signatur

Dator: Ett metall chassi med varierande komponenter på insidan.