Hjälp med programmering C++, systemet kraschar

Permalänk
Medlem

Hjälp med programmering C++, systemet kraschar

Jag försöker lära mig programmera i C++. Jag håller just nu på med ett program där användaren ska fylla i sparmål, insättning och ränta och sedan räknar systemet ut efter hur många år användaren kommer att nå sitt sparmål. Jag kan köra programmet men jag kommer så långt att användaren får fylla i sparmål, insättning samt ränta och sen stängs bara programmet ner? Vad gör jag för fel? Se kod nedan.

Jag använder mig av Visual 2010 Express. Jag får upp en varning angående saldot: Run-Time Check Failure #3 - The variable 'saldo' is being used without being initialized. Men jag är osäker på vad jag ska ändra på saldot för att det ska funka.
En annan varning är: 'test.exe': Loaded 'C:\Program Files (x86)\Norton Security\NortonData\22.5.4.24\Definitions\BASHDefs\20170412.003\UMEngx86.dll', Cannot find or open the PDB file
Vad betyder det här? Har jag någon inställning på min dator som inte tillåter mig att köra programmet?

#include <iostream> using namespace std; int main() { setlocale (LC_ALL,"swedish"); float insattning; float ranta; float sparmal; float saldo; int antal_ar= 0.0; cout <<" Ange arlig insattning "; cin >> insattning; cout <<" Ange ditt sparmal "; cin >> sparmal; cout << " Ange den arliga rentesatsen "; cin >> ranta; { ranta = ranta/100.0 + 1.0; saldo += insattning*ranta; } { saldo = insattning; saldo *= ranta; antal_ar++; } cout << " Ditt sparmal uppnas efter " << antal_ar << " Din summa er da " << saldo ; return 0; }

La till code-taggar
Permalänk
Medlem

Jag löste det med alla varningar. Googlade på vad allt betydde. Men även om allt är grönt och alla varningar/errors är borta så kraschar ändå programmet efter att användaren valt räntan.. Förstår inte var det felar

Permalänk
Medlem

@BellaB:

Prova att lägga till saldo = 0; på raden före cout <<" Ange arlig insattning "

Edit: Du använder { ... } utan att det egentligen är en funktion. Vad händer om du tar bort alla utom första { och sista } ?

Visa signatur

Star Citizen referral: STAR-5K66-JDZB

CM NR200P, ASUS ROG STRIX B660-I GAMING WIFI, Fury Beast DDR5 4800MHz 2x16GB, i5-12600K + Scythe Fuma 2, ASUS GeForce RTX 4070 12GB DUAL OC, WD Black SN850 PCIe 4.0 NVMe M.2 - 2TB+1TB

Permalänk
Hedersmedlem

La till code-taggar, brukar kännas mer naturligt att läsa koden så.

// Mod

Permalänk
Vila i frid

Kompilatorn ger dig nästan all info du behöver för att få det att fungera.

Warning C4244 '=': conversion from 'double' to 'float', possible loss of data
Warning C4244 'initializing': conversion from 'double' to 'int', possible loss of data
Error C4700 uninitialized local variable 'saldo' used

Använd den inbyggda debuggern så att du ser variablerna i realtid medans du stegar debug-exekveringen med F10.

För att slippa "warnings" på typecast double/float, se till att skriva t.ex: float (100.0+1.0) så berättar du för dig själv och andra att du var medveten om det när koden skrevs.

Ett program skall alltid returnera ett värde, t.ex: return 0;

Permalänk
Medlem

@thirdace: Jag testade att ändra Saldo=0; och tog bort paranteserna men fortfarande samma fel. Självaste felet är att kontrollrutan stängs ner när användaren skriver en ränta och trycker på enter??

Permalänk
Medlem

@BellaB:
Om du kör programmet från visual studio så försvinner kommandofönstret när programmet avslutas. Dvs. direkt efter att resultatet skrivs ut så försvinner fönstret och du ser aldrig resultatet.

Testa att lägga till t.ex system("pause"); efter sista cout raden så väntar programmet på enter.

Permalänk
Medlem

@hasenfrasen: Jag förstår inte riktigt vad du menar. Jag började med programmering för typ 3 dagar sedan. Jag tröck på F10 men jag hänger inte riktigt med hur det kan hjälpa mig och hur jag använder mig av det.

Jag har skrivit ranta = ranta/100.0 + 1.0; ska jag skriva float här någonstrans menar du? Räcker det inte med att jag skriver det nästan högst upp?

Return 0; har jag skrivit i slutet av koden innan "}" kommer. Menar du att ´jag kan använda mig av denna flera gånger i samma kod?

Permalänk
Medlem
Skrivet av BellaB:

@thirdace: Jag testade att ändra Saldo=0; och tog bort paranteserna men fortfarande samma fel. Självaste felet är att kontrollrutan stängs ner när användaren skriver en ränta och trycker på enter??

Programmet kommer ju stängas av när det når "return 0;" vilket i princip säger att du ska avsluta processen.
Du behöver något som "håller kvar" dig i main-metoden, antingen genom att använda en sorts spärr, t.ex. vänta tills användaren trycker på Enter för att stänga av programmet.

cin.ignore();

gör just detta åt dig. Anledningen till att funktionen "Ignore" används istället för t.ex. "get" är av den enkla anledningen; Varför läsa något när du bara vill kolla om du trycker enter?

Använd alltså "cin.ignore();" i slutet ovanför "return 0;".

cin.ignore(); return 0;

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem

@zabsv: Bra tips!

Jag testade att skriva pause och fick då ut detta "Ditt sparmal uppnas efter 1 Din summa er da 3120Press any key to continue . . ."

Det funkar i alla fall men resultatet blir ju fel.. Frågan är vart det felar i min kod? Det måste vara:

ranta = ranta/100.0 + 1.0;

saldo = insattning*ranta;
antal_ar++;

men på vilket annat sätt kan jag skriva det annars?

Permalänk
Medlem

@Pamudas: Testade att skriva cin.ignore(); innan return0; men inget hände. Rutan stängdes ner som vanligt

Permalänk
Medlem

@BellaB:
antal_ar++; körs bara en gång så den blir alltid 1. Du vill förmodligen använda en while loop för att räkna fram hur många år man måste spara innan man uppnår sparmålet.

http://www.learncpp.com/cpp-tutorial/55-while-statements/

Permalänk
Vila i frid
Skrivet av BellaB:

Frågan är vart det felar i min kod?

Det finns ingen genväg, att förstå vad varje rad och operation gör i detalj är enda sättet att lära sig programmera. Att köra igång debuggern med F10 och stega sig igenom koden är ett sätt att verifiera att variablerna ändrar sig på det sätt du vill/tror/hoppas på.

Att i första programmet skriva "saldo+=ranta*whatever" gör det nog svårare för din hjärna att greppa allt det här nya, skriv hellre "saldo = saldo + (ranta * whatever) då vet du att "ranta * whatever" multiplicers innan det adderas till variabeln "saldo" för att slutligen tilldela "saldo" till vänster om likhetstecknet med rubbet till höger om det.

Permalänk
Medlem
Skrivet av BellaB:

Det funkar i alla fall men resultatet blir ju fel.. Frågan är vart det felar i min kod?

Många av dina problem verkar ha att göra med att du inte tänkt igenom vad du vill att koden faktiskt ska göra. Första steget innan du ens börjar skriva en massa kod är att fundera ut hur du skulle lösa uppgiften själv, utan C++. Det kan kanske vara hjälpsamt att hitta på några inmatade värden och räkna ut lösningen med penna och papper, och sen fundera på hur du kan implementera samma algoritm i C++.

Skrivet av hasenfrasen:

Ett program skall alltid returnera ett värde, t.ex: return 0;

I C++ så returneras dock 0 automatiskt om man inte explicit returnerar något annat från main, så 'return 0' i slutet av main är överflödigt.

Permalänk
Vila i frid
Skrivet av perost:

'return 0' i slutet av main är överflödigt.

Det är väl snarare programmeringssed. Frågorna jag ställer mig i "fådd" kod, glömde han det, visste han inte om det eller var han bara lat?

Just nu sitter jag med 230,000 rader icke-kommenterad c# kod som man från början skrev som ersättning för ett bauta vb6-projekt. Jag är femte personen som råddar i det på fem år så jag svär mest hela dagarna.

Permalänk
Medlem

Känns som att du har en väg kvar då programmet som du skrivit inte gör som du vill. Som nämnts ovan behöver du en loop som ökar på antal_ar annars stannar den vid 1.
En idé att spinna vidare på kan ju vara att typ skriva:

#include <iostream> using namespace std; int main() { setlocale (LC_ALL,"swedish"); float insattning; float ranta; float sparmal; float saldo = 0.0; int antal_ar= 0; cout <<" Ange arlig insattning "; cin >> insattning; cout <<" Ange ditt sparmal "; cin >> sparmal; cout << " Ange den arliga rentesatsen "; cin >> ranta; ranta = ranta/100.0 + 1.0; //Loop som snurrar tills saldot är större än sparmålet while (saldo < sparmal) { saldo = (saldo+insattning)*ranta; antal_ar++; } cout << " Ditt sparmal uppnas efter " << antal_ar << " Din summa er da " << saldo ; return 0; }

Typ något sådant

Visa signatur

Bara gammalt skräp...