Permalänk
Medlem

C++, for-satsen

Hej, jag är total nybörjare när det gäller C++. (Kan för övrigt inga andra språk heller.)

Jag har stött på ett litet problem som inte ens är tänkbart svårt för er, skulle behöva lite hjälp på traven bara:)

Uppgiften består av att programmet ska räkna ut det sannolika antalet vid en stad ett visst år. Som ni ser har år 2001 29000 medborgare.
När jag kör mitt program så får jag endast ut hur många som bor där året efter.

Hur ska jag få den att skriva ut antalet medborgare vid ett visst årtal?

Här kommer koden. Och nej den är inte vacker, jag vet.:)

#include <iostream>
using namespace std;

int main()
{
int ar, fodda=1.09, doda=0.93, nybyggare=310, utvandrare=225, summa=29000;

cout<< "Skriv in ett artal efter 2001"<<endl;
cin>> ar;

ar=ar-2001
for (int i=1;i<=ar;i=i+1);
{

fodda=summa*0.009;
doda=summa*0.007;

summa=summa-utvandrare+nybyggare+fodda-doda;

}
cout<< "Det totala antalet invanare ar: "<<summa<<endl;
return 0;
}

Tack på förhand!

Visa signatur

Aspire D250, YES!

Permalänk
Hedersmedlem

Radera semikolonet efter
for (int i=1;i<=ar;i=i+1)

Permalänk

#include <iostream> using namespace std; int main() { int ar, nybyggare = 310, utvandrare = 225; double fodda = 1.09, doda = 0.93; double summa = 29000; cout << "Skriv in ett artal efter 2001" << endl; cin >> ar; ar = ar - 2001; for ( int i = 1; i <= ar; i++ ) { fodda = summa * 0.009; doda = summa * 0.007; summa = summa - utvandrare + nybyggare + fodda - doda; } cout<< "Det totala antalet invanare ar: " << summa << endl; cin >> ws; return 0; }

Du hade lite småfel, till att börja med kan du inte lagra decimaltal i typen int. Här behöver vi en float eller double.
Jag ändrade summan till en double också eftersom den innehåller både heltal och decimaltal; kompilatorn kommer att hugga av decimaldelen om du försöker lagra decimaltal i en int - summan blir sådeles fel.

Du hade en ; efter for-satsen vilket inte är bra då den kommer att ignorera allt imon {} och bara köra det som finns mellan for-satsen och ; dvs. ingenting

Lycka till!

EDIT: Andra små tips är att inte använda svenska namn på variabler och var inte rädd för att använda lite fler space i koden - blir så mycket lättare att läsa.

Visa signatur

Min dator är bättre än din.

Permalänk
Medlem

Haha:) kungligt, det funkade ju såklart, och det där har jag suttit o pillat med i timmar:(
Tack för hjälpen!

Egentligen ska det vara double, fast jag tänkte att en människa inte kunde delas upp i decimaltal:)

Visa signatur

Aspire D250, YES!

Permalänk
Inaktiv

Du kan använda typen "long" också, om du skulle ha mycket långa tal. Sedan om du vill ha antalet från decimaltal till integer så skriver du bara decimaltalsvariabel = (int)(decimaltalsvariabel + 0.5).

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Tobben2
Haha:) kungligt, det funkade ju såklart, och det där har jag suttit o pillat med i timmar:(
Tack för hjälpen!

Egentligen ska det vara double, fast jag tänkte att en människa inte kunde delas upp i decimaltal:)

En tumregel är att alltid använda flyttal för om du inte har koll på hur alla uträkningar går. Avrunda kan man alltid göra där det behövs.

Visa signatur

Religion och vidskepelse är smittsamma psykiska sjukdomar, den biologiska motsvarigheten till datorvirus.
"-Pappa, pappa, idag firade vi födelsedag och hela dagis fick gå på McDonalds. - Vems födelsedag då? - En farbror som hette Lenin."

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Nuukeer
Du kan använda typen "long" också, om du skulle ha mycket långa tal. Sedan om du vill ha antalet från decimaltal till integer så skriver du bara decimaltalsvariabel = (int)(decimaltalsvariabel + 0.5).

Nej, han ska inte använda long. Long är ett prefix, ingen typ. Det är en relik från dinosauriernas tid, då det var populärt med implicita standardtyper. I gammal äckligt C (riktigt gammal) är standardtypen "int", och long har då samma betydelse som long int. På samma sätt kan man tyvärr fortfarande deklarera "unsigned" istället för "unsigned int". En ospecificerad int är normalt signed int (på alla system utom de där hårdvaran inte har någon signed-typ), så att utelämna den specifikationen är relativt ofarligt. long int är alltid 32 bitar lång, short int är alltid 16 bitar. Ospecificerad int är antingen eller, beroende på plattform. Under DOS var int typiskt en short int, trots att processoerna var 32-bitars, pga operativsystemets begränsningar. Poängen är att man INTE ska lite på standardbeteenden utan alltid specificera. Man vet aldrig när man kommer att kompilera om en modul på en udda plattform eller i ett verktyg som tolkar "standardbeteende" lite annorlunda. I ett 32-bitars Windows-system är dock "int" nästan alltid implementerat som signed long int.

Är det för jobbigt att skriva ut hela typnamnen, så kan man förkorta dem med typedef.

Flyttalstyperna är float, double och long double. Long double skall dock undvikas eftersom beteendet är odefinierat eftersom bara 64 av bitarna sparas på stacken. Det gör program som är beroende av de sista 16 bitarna i mantissan oerhört enerverande att debugga.

Använd double så länge det inte tar för mycket tid eller minne, float är fort kort oftare än man tror, och behärskar man inte sin matematik kan avrundningsfelen spöka till det en hel del.

Visa signatur

Religion och vidskepelse är smittsamma psykiska sjukdomar, den biologiska motsvarigheten till datorvirus.
"-Pappa, pappa, idag firade vi födelsedag och hela dagis fick gå på McDonalds. - Vems födelsedag då? - En farbror som hette Lenin."

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Ulvenstein
Använd double så länge det inte tar för mycket tid eller minne, float är fort kort oftare än man tror, och behärskar man inte sin matematik kan avrundningsfelen spöka till det en hel del.

e^π-π
F.ö. kan trådskaparens problem enkelt lösas men linjär algebra vilket lämpligen görs i MATLAB, men det är irrelevant antar jag.

Permalänk
Medlem

Linjär algebra? Varför inte bara algebra? Och varför föreslå en dyr och tung slägga då det räcker med betydligt mycket mindre?

Om jag inte missuppfattat problemställningen så lyder den:
En stad har S0 = 29000 invånare vid tiden t0 = 2001
Populationen förändras genom att S*0.009 personer föds samt S*0.007 personer dör varje år samt att 310 personer flyttar in och 225 personer flyttar ut.

Således har vi att S_{n+1} = 1.002*S_n + 85
vilket är ett rekursivt problem som löses relativt enkelt och man finner att
S_n = 1312.19*1.002^x - 42500*1.002^x * e^(-0.001998 x)
testning visar att S_2001 = 29000 som väntat och t.ex. S_2010 = 30297.3 ~ 30297

Visa signatur

weeeee

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av mounte
Linjär algebra? Varför inte bara algebra? Och varför föreslå en dyr och tung slägga då det räcker med betydligt mycket mindre?

För att matrismultiplikation är vackert, och analys är jobbigt.

Permalänk
Medlem

Oj, här kommer ånga snillen in, det hade jag inte räknat med. Matlab har jag bara sett en gång när min bror skrev i det, jag håller mig till C++. I alla fall har mitt problem lösts men ni får gärna fortsätta diskutera. Får tacka för uppmärksamheten:)

MVH Tobben

Visa signatur

Aspire D250, YES!