[ eSsss @ 23.04.2009. 10:37 ] @
Poz svima.Pokusavam da uradim jedan zadatak, nije mi problem napisati kod kada bih znao kako tacno to funkcionise.Na ulazu programa imam da unesem broj stanovnika neke drzave. Zatim u procentima[%] koliko svakog dana umire stanovnika i u brojkama koliko se radja. I treba da izracunam za koliko dana ce ta drzava ostati bez stanovnika.E ja nailazim na problem da broj stanovnika nikako nece otici ispod nule.

Code:
#include <iostream>
using namespace std;

int main()
{

    unsigned long n;
    unsigned p,m,d=0,s;;


    cout << "Unesite koliko trenutno drzava ima stanovnika: ";
    cin >> n;

    cout << "Koliko svakog dana umire stanovnika [%]: ";
    cin >> p;

    cout << "Koliko se dnevno rodi beba: ";
    cin >> m;

    for(int i = 0; n > 0; i++)
    {
        s = (p*n)/100;      //koliko dnevno umire stanovnika
        n -= s;                //umanjujemo broj stanovnika za broj mrtvih
        n += m;              //uvecavamo broj stanovnika za broj novorodjenih
        d++;                  //dani
    }    

    cout << "\nStanovnika:" << n;
    cout << "\tDana:" << d;

    system("PAUSE");
    return 0;
}


E sad ja npr. unesem da 10% umire svaki dan a 5 se radja.I u jednom trenutku ce doci da je broj novorodjeni i umrlih isti (jer se broj stanovnika smanjuje pa ce mi 10% od ukupnog iznositi 5) i dobijam beskonacnu petlju.Da li bi neko mogao da mi pomogne na koji nacin da ovo odradim?

Hvala i poz.

[Ovu poruku je menjao X Files dana 23.04.2009. u 11:55 GMT+1]

[Ovu poruku je menjao eSsss dana 23.04.2009. u 13:14 GMT+1]
[ X Files @ 23.04.2009. 10:52 ] @
Za pocetak je vrlo bitno da celobrojne vrednosti pretvoris (kastujes) u nove float ili double, i kao takve prosledis petlji. U suprotnom, dzaba deljenje i procenti.
[ eSsss @ 23.04.2009. 12:11 ] @
To uopste nisam primetio, izmenicemo...ali to mi u sustini ne resava problem.
Jedino da za isto pijavljivanje nataliteta (n) u for petlji, stavim break ? Ali mi to bas i nije neko resenje.
[ X Files @ 23.04.2009. 12:26 ] @
Mislio sam na deo:
s = (p*n)/100;

Koji bi verovatno trebao biti /netestirano/:
f_s = ((float)p*(float)n)/100.; // < f_s je float


Zatim, bi trebalo utvrditi da li sa ceil() zaokruzivati broj umrlih na veci procenat, jer covek je ili mrtav ili ziv, tj ako je umrlo 1.2 neka to bude 2 umrla.

U tvom kodu bi to bilo mozda:
n -= (int)ceil(f_s); //umanjujemo broj stanovnika za broj mrtvih

Dalje, dok god postoji ova linija :
n += m; //uvecavamo broj stanovnika za broj novorodjenih
... pri cemu je m>0, mislim da nema sanse da bude ispunjen uslov za izlazak iz petlje:
for(int i = 0; n > 0; i++)

(uzgred, promenljiva "d" ti ne treba, jer je to zapravo "i")


Zato bi trebalo semanticki smisliti koji je zapravo stvarni uslov za izlazak iz petlje (npr, ne moze se iz nicega roditi beba niti jedna osoba moze roditi 66 beba), a to mora biti neka korelacija izmedju "m" i "f_s".

Pogledacu, pa se javljam ako bude bilo potrebe.
[ X Files @ 23.04.2009. 12:28 ] @
Eh da, nije lose u ovoj fazi trazenja uzroka staviti ispis test trenutnih vrednosti: ukupnog broja stanovnika, broja umrlih i sl, kao i:
cin.ignore()
...na kraju petlje da se moze pratiti.
[ eSsss @ 23.04.2009. 13:01 ] @
Prepravio sam sve o cemu si mi napisao...Ono d mi je ostalo do while petlje posto sam prvo isao preko nje.

Code:
    for(i = 0; n > 0; i++)
    {
        s =(int) ceil(((float)p*(float)n)/100);
        n -= s;
        n += m;
        if(s == m) break;
        cout << "\nStanovnika:" << n;
        cout << "\tDana:" << i;
    }    

           cout << "\nStanovnika:" << n;
    cout << "\tDana:" << i;


Jednio da onda kada mi se broj umrlih i novorodjenih izjednaci da stavim neke konstantne vrednosti za s i m (da s bude vece) i jednu while petlju pa da izgura do kraja?