Programiranje u C++-u - pitanja i odgovori izdvojena tema

poruka: 7.285
|
čitano: 1.719.357
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Radim u dev c++ i mislim bas na winapp ne cosole program
13 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Evo jedan program koj sam napravio al ima error tj. nezeli inicijalizirati varjablu.

 

#include <iostream>

using namespace std;

class ZbrajanjeOduzimanje
{
    public : double c;

    public : double Zbroji(float a, float b)
             {
                 c = a + b;
                 return c;
             }

             float Oduzmi(float a, float b)
             {
                 c = a - b;
                 return c;
             }
};

class Identifikacija
{
    private : string username;

    username = "David";

    private : string password;

    password = "mypwdavid123";

    public : string un;
    public : string pw;

    public : bool IsDavid(string un, string pw)
             {
                 if(un == username && pw == password)
                 {
                     return true;
                 }
                 return false;
             }

};

int main()
{
    string operacija;
    double unos1, unos2;

    ZbrajanjeOduzimanje obj1;
    Identifikacija id;


    cout << "Korisnicko ime:";
    cin >> id.un;
    cout << "Lozinka:";
    cin >> id.pw;

    if(id.IsDavid(id.un, id.pw) == true)
    {
    cout << "Unesi recunsku operaciju koju zelis izvesti (+,-) :";
    cin >> operacija;

    if(operacija == "+")
    {
        cout << "Odabrali se racunsku operaciju zbrajanje" << endl;
        cout << "Unesite brojeve koje zelite zbrojiti" << endl;
        cin >> unos1 >> unos2;
        cout << "Rezultat je:" << obj1.Zbroji(unos1, unos2) << endl;
    }
    if(operacija == "-")
    {
        cout << "Odabrali se racunsku operaciju oduzimanje" << endl;
        cout << "Unesite brojeve koje zelite oduzeti" << endl;
        cin >> unos1 >> unos2;
        cout << "Rezultat je:" << obj1.Oduzmi(unos1, unos2) << endl;
    }
    }
    return 0;
}

 

Errori:

 

||=== OOP, Debug ===|
C:\Users\David\Dropbox\C++\OOP\main.cpp|26|error: 'username' does not name a type|
C:\Users\David\Dropbox\C++\OOP\main.cpp|30|error: 'password' does not name a type|
||=== Build finished: 2 errors, 0 warnings ===|

Moj PC  
0 0 hvala 0
17 godina
offline
Programiranje u C++-u - pitanja i odgovori

edit

Poruka je uređivana zadnji put sri 23.5.2012 13:45 (Floki).
 
0 0 hvala 0
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
/*vidi ako si doma na stolnom kompajleru , sklepao sam na brzini 
na online verziji , nisam doma i guzva, trebalo bi biti ok */
#include <iostream>
using namespace std;
class ZbrajanjeOduzimanje
{
   public : double c;
   public : double Zbroji(float a, float b)
       {
         c = a + b;
         return c;
       }
       float Oduzmi(float a, float b)
       {
         c = a - b;
         return c;
       }
};
class Identifikacija
{
   private:
   string username;
   string password;
   public: 
   string un;
   string pw;
   void setUsername(string user) {username = user;} 
   void setPassword(string pass) {password= pass;}
   bool IsDavid(string un, string pw)
       {
         if(un == username && pw == password)
         {
           return true;
         }
         return false;
       }
};
int main()
{
   string operacija;
   double unos1, unos2;
   ZbrajanjeOduzimanje obj1;
   Identifikacija id;
   id.setUsername("David");
   id.setPassword("mypwdavid123"); 
   cout << "Korisnicko ime:";
   cin >> id.un;
   cout << "Lozinka:";
   cin >> id.pw;
   if(id.IsDavid(id.un, id.pw) == true)
   {
   cout << "Unesi recunsku operaciju koju zelis izvesti (+,-) :";
   cin >> operacija;
   if(operacija == "+")
   {
     cout << "Odabrali se racunsku operaciju zbrajanje" << endl;
     cout << "Unesite brojeve koje zelite zbrojiti" << endl;
     cin >> unos1 >> unos2;
     cout << "Rezultat je:" << obj1.Zbroji(unos1, unos2) << endl;
   }
   if(operacija == "-")
   {
     cout << "Odabrali se racunsku operaciju oduzimanje" << endl;
     cout << "Unesite brojeve koje zelite oduzeti" << endl;
     cin >> unos1 >> unos2;
     cout << "Rezultat je:" << obj1.Oduzmi(unos1, unos2) << endl;
   }
   }
   return 0;
}
Poruka je uređivana zadnji put sri 23.5.2012 14:03 (nik_02).
17 godina
offline
Programiranje u C++-u - pitanja i odgovori

Kako mogu vremenski ograničiti izvršavanje niti ako koristim _beginthread()?

Recimo imam nit u kojoj se računa nešto što optereti jezgru procesora na 100%, ali htio bih vremenski ograničiti koliko dugo da se izvršava.

I onda ako imam više niti da se za svaku može odvojeno vrijeme izvršavanja postaviti, kako bi se to moglo?

Prodajem RAGE za PS3: http://www.bug.hr/forum/topic/igre-accounti-igrama/prodaja-igra-rage-playstation-3/129629.aspx?page=0&amp;amp;jumpto=2529211&amp;amp;sort=asc&amp;amp;view=flat
Moj PC  
0 0 hvala 0
13 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Napravio sam ovako(u klasi Identifikacija):

 

void SetID(string a, string b)
             {
                 username = a;
                 password = b;
             }

 

i u int main()

 

id.SetID(David, mypwdavid123)

 

i dobijem:

 

C:\Users\David\Dropbox\C++\OOP\main.cpp||In function 'int main()':|
C:\Users\David\Dropbox\C++\OOP\main.cpp|59|error: 'David' was not declared in this scope|
C:\Users\David\Dropbox\C++\OOP\main.cpp|59|error: 'mypwdavid123' was not declared in this scope|
||=== Build finished: 2 errors, 0 warnings ===|

Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
191x7 kaže...

Kako mogu vremenski ograničiti izvršavanje niti ako koristim _beginthread()?

Koristeci GetTickCout kako bi dobio vrijeme u milisekundama, i onda prekidaj izvrsavanje funkcije nakon odredenog vremena.

Oscar-Mike-Golf Whiskey-Tango-Foxtrot
17 godina
offline
Programiranje u C++-u - pitanja i odgovori

Napravio si grešku u tome što ne možeš inicijalizirati podatkovne članove klase na način kako si to učinio.

Najbolje je to učiniti preko konstruktora.

Obrati pažnju kako sam podatkovne članove klase stavio pod private, a metode pod public, to sam učinio zato jer mi nema što vanjski kod brljati po podatkovnim članovima klase.

A zaboravio si i u headeru uključiti string, neophodno za uspoređivanje stringova.

Zašto kao argumente funkcija Zbroji i Oduzmi koristiš float tip za argumente, a klasa ima double podatkovni član - nepotreban casting koji može dovesti do gubitka podataka.

Klasu ZbrajanjeOduzimanje bi trebalo drukčije napisati, odnosno da funkcija na osnovu argumenta + ili - kao trećeg računa rezultat, a ne u vanjskom kodu raditi komplikacije, ali to ostavljam tebi.

 

 

 

#include <iostream>
#include<string>
using namespace std;

class ZbrajanjeOduzimanje
{
    private :
       double c;

    public :
       double Zbroji(double a, double b)
             {
                 c = a + b;
                 return c;
             }

             float Oduzmi(double a, double b)
             {
                 c = a - b;
                 return c;
             }
};

class Identifikacija
{
    private :
      string username;
      string password;

    public :
       Identifikacija()
       {
          username = "David";
          password = "mypwdavid";
       }
       bool IsDavid(string un, string pw)
             {
             if((un == username) && (pw == password))
                 {
                     return true;
                 }
                 return false;
             }

};

int main()
{
    string operacija, username, password;
    double unos1, unos2;

    ZbrajanjeOduzimanje obj1;
    Identifikacija id;


    cout << "Korisnicko ime:";
    cin >>  username;
    cout << "Lozinka:";
    cin >> password;
    if(id.IsDavid(username, password))
    {
    cout << "Unesi recunsku operaciju koju zelis izvesti (+,-) :";
    cin >> operacija;

    if(operacija == "+")
    {
        cout << "Odabrali se racunsku operaciju zbrajanje" << endl;
        cout << "Unesite brojeve koje zelite zbrojiti" << endl;
        cin >> unos1 >> unos2;
        cout << "Rezultat je:" << obj1.Zbroji(unos1, unos2) << endl;
    }
    if(operacija == "-")
    {
        cout << "Odabrali se racunsku operaciju oduzimanje" << endl;
        cout << "Unesite brojeve koje zelite oduzeti" << endl;
        cin >> unos1 >> unos2;
        cout << "Rezultat je:" << obj1.Oduzmi(unos1, unos2) << endl;
    }
    }
    return 0;
}

 

 

 

Poruka je uređivana zadnji put sri 23.5.2012 14:43 (Floki).
 
3 0 hvala 0
13 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Kako to predajes stringove funkciji crni Davide. Gdje su dvostruki navodnici?

 

David i mypaw123 nisu varijable, ako su parametri znakovni niz, tj. string, u tvom slučaju jesu, moraš ih navesti pod navodnim znacima, dvostrukim, naravno.

Poruka je uređivana zadnji put sri 23.5.2012 14:33 (royalhero).
13 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Vidi stvarno tu sam fulao,ma navika iz onog fcking PAWN-a.

Moj PC  
0 0 hvala 0
17 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
rustweaver kaže...
191x7 kaže...

Kako mogu vremenski ograničiti izvršavanje niti ako koristim _beginthread()?

Koristeci GetTickCout kako bi dobio vrijeme u milisekundama, i onda prekidaj izvrsavanje funkcije nakon odredenog vremena.

Dakle prije izvršavanja u jednu varijablu spremim vrijeme i onda kad se izvršava provjeravam je li GetTickCount npr za 10.000 veći od vrijednosti te varijable (ako hoću da se vrti 10.000 milisekundi)?

 

Ako svaka nit poziva istu funkciju, kako mogu u svakoj pozvanoj funkciji imati različito vrijeme (da jedna traje npr 30 sekundi, druga 50, treća 80, četvrta 40,..)?

U biti morao bih za svaku nit imati odvojenu/drugu funkciju, bar mislim da se drugačije ne može riješiti. Ne bih znao.

Prodajem RAGE za PS3: http://www.bug.hr/forum/topic/igre-accounti-igrama/prodaja-igra-rage-playstation-3/129629.aspx?page=0&amp;amp;jumpto=2529211&amp;amp;sort=asc&amp;amp;view=flat
17 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
royalhero kaže...

Kako to predajes stringove funkciji crni Davide. Gdje su dvostruki navodnici?

 

David i mypaw123 nisu varijable, ako su parametri znakovni niz, tj. string, u tvom slučaju jesu, moraš ih navesti pod navodnim znacima, dvostrukim, naravno.

Na što misliš?

Nije tu bila greška, nego ne može izvršiti inicijalizaciju podatkovnog člana na taj način.

Ovo je inače dozvoljena operacija:

string username;

username = "fgdt";

Deklaracija, pa inicijalizacija.

Druga stvar je što se ne može vršiti inicijalizacija podatkovnog člana klase na ovaj način.

 

Aha, misliš na onaj SetID funkciju, je, to je greška, u pravu si.

Poruka je uređivana zadnji put sri 23.5.2012 15:30 (Floki).
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
191x7 kaže...

Dakle prije izvršavanja u jednu varijablu spremim vrijeme i onda kad se izvršava provjeravam je li GetTickCount npr za 10.000 veći od vrijednosti te varijable (ako hoću da se vrti 10.000 milisekundi)?

Upravo tako. Na pocetku funkcije pozoves GetTickCount da dobijes pocetno vrijeme, i onda ides dok razlika izmedu pocetnog vremena i trenutnog vremena ne iznosi 10 000 milisekundi.

 

191x7 kaže...
Ako svaka nit poziva istu funkciju, kako mogu u svakoj pozvanoj funkciji imati različito vrijeme (da jedna traje npr 30 sekundi, druga 50, treća 80, četvrta 40,..)?

U biti morao bih za svaku nit imati odvojenu/drugu funkciju, bar mislim da se drugačije ne može riješiti. Ne bih znao.

Ne. Sredi da trajanje u milisekundama proslijedujes kao argument funkciji.

Oscar-Mike-Golf Whiskey-Tango-Foxtrot
Poruka je uređivana zadnji put sri 23.5.2012 15:15 (rustweaver).
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Floki kaže...

Na što misliš?

Nije tu bila greška, nego ne može izvršiti inicijalizaciju podatkovnog člana na taj način.

Da, ali ni sintaksa nije bila tocna. Valjda je na to mislio.

Oscar-Mike-Golf Whiskey-Tango-Foxtrot
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Floki kaže...
royalhero kaže...

Kako to predajes stringove funkciji crni Davide. Gdje su dvostruki navodnici?

 

David i mypaw123 nisu varijable, ako su parametri znakovni niz, tj. string, u tvom slučaju jesu, moraš ih navesti pod navodnim znacima, dvostrukim, naravno.

Na što misliš?

Nije tu bila greška, nego ne može izvršiti inicijalizaciju podatkovnog člana na taj način.

id.SetID(David, mypwdavid123);

 

id.SetID( "David" ,  "mypwdavid123" );

17 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
nik_02 kaže...
Floki kaže...
royalhero kaže...

Kako to predajes stringove funkciji crni Davide. Gdje su dvostruki navodnici?

 

David i mypaw123 nisu varijable, ako su parametri znakovni niz, tj. string, u tvom slučaju jesu, moraš ih navesti pod navodnim znacima, dvostrukim, naravno.

Na što misliš?

Nije tu bila greška, nego ne može izvršiti inicijalizaciju podatkovnog člana na taj način.

id.SetID(David, mypwdavid123);

 

id.SetID( "David" ,  "mypwdavid123" );

Aha, sorry, to nisam ni gledao.

Te dvije funkcije su inače nepotrebne, učini inicijalizaciju kroz konstruktor, ovako samo uvodiš dvije suvišne varijable u igru.

A program ima i logičku grešku, korisnik namješta username i password preko metoda, a onda ih unosi za provjeru.

Poruka je uređivana zadnji put sri 23.5.2012 15:36 (Floki).
13 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Floki kaže...
Aha, misliš na onaj SetID funkciju, je, to je greška, u pravu si.

Da, mislim na poziv funkcije SetID, pogrešno je predavao znakovni niz, to je rješenje zašto mu je compiler izbacivao greške da su David i mypw123 nepoznati pojmovi.

15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Dinko7 kaže...

Evo ljudi ja sam malo krenuo u windows app vode pa me zanima kako u da u svoj windows app ubacim funkciju koja ce mi vratit string i kako da to ispisem

Nista mi nije jasno, kuzim da koristis standardni DevCpp predlozak za WinAPI aplikaciju, ali sto zelis napraviti? Sto ti nije jasno? Ne znas napisati funkciju koja vraca string? Ne znas ispisati taj string u prozor? Daj malo detaljnije, po mogucnosti i kôd.

 

U meduvremenu pogledaj si ovamo kako bi pohvatao konce sa nekim osnovama.

A ako si ozbiljan s time i ne kanis prijeci na nesto drugo (modernije, jednostavnije), onda si obavezno nabavi i ovu knjigu.

Oscar-Mike-Golf Whiskey-Tango-Foxtrot
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
191x7 kaže...
U biti morao bih za svaku nit imati odvojenu/drugu funkciju, bar mislim da se drugačije ne može riješiti. Ne bih znao.

Evo i primjera koji pokazuje uporabu GetTickCount za ograničavanje vremenske duljine izvršavanja niti. Koristio sam tvoj prerađeni kôd jer si već upoznat s njime (i dodao sam pravilan način čekanja umjesto onog hacka sa sleep petljom).

 

#include <iostream>
#include <vector>
#include <process.h>
#include <cmath>
#include <windows.h>

using namespace std;

void prostbr(void*);

typedef struct
{
    int interval;
    int prosti;
    unsigned long vrijeme;
    vector<int> prosti_brojevi;
} THREAD_DATA, *PTHREAD_DATA;

int main()
{
    HANDLE niti[3];
    THREAD_DATA t1={0, 0, 20},  //interval=0, prosti=0, vrijeme=20
                t2={0, 0, 40},  //interval=0, prosti=0, vrijeme=40
                t3={0, 0, 80};  //interval=0, prosti=0, vrijeme=80

    cout<<"\n Ovaj program ispisat ce sve proste brojeve do"
        <<"\n unesenih brojeva...\n";

    cout<<"\n Unesite brojeve: ";
    cin>> t1.interval;
    cin>> t2.interval;
    cin>> t3.interval;

    niti[0]=(HANDLE)_beginthread(prostbr, 0, (void*)&t1);
    niti[1]=(HANDLE)_beginthread(prostbr, 0, (void*)&t2);
    niti[2]=(HANDLE)_beginthread(prostbr, 0, (void*)&t3);

    WaitForMultipleObjects(3, niti, TRUE, INFINITE);

    /////////////////////////
    cout<<"\n Evo svih prostih brojeva do "<<t1.interval<<".\n";

    for (int n=0; n<t1.prosti_brojevi.size(); n++)
        cout<<t1.prosti_brojevi[n] << " ";

    cout<<endl<<"\nPostoji "<<t1.prosti
        <<" prostih brojeva manjih ili jednakih "<<t1.interval<<".\n\n";

    /////////////////////////
    cout<<"\n Evo svih prostih brojeva do "<<t2.interval<<".\n";

    for (int n=0; n<t2.prosti_brojevi.size(); n++)
        cout<<t2.prosti_brojevi[n] << " ";

    cout<<endl<<"\nPostoji "<<t2.prosti
        <<" prostih brojeva manjih ili jednakih "<<t2.interval<<".\n\n";

    /////////////////////////
    cout<<"\n Evo svih prostih brojeva do "<<t3.interval<<".\n";

    for (int n=0; n<t3.prosti_brojevi.size(); n++)
        cout<<t3.prosti_brojevi[n] << " ";

    cout<<endl<<"\nPostoji "<<t3.prosti
        <<" prostih brojeva manjih ili jednakih "<<t3.interval<<".\n\n";

    return 0;
}

// Funkcija za prepoznavanje prostih...
void prostbr(void *arg)
{
    PTHREAD_DATA data=(PTHREAD_DATA)arg;
    long double x=data->interval;
    bool prost=true;
    int broj2=(int)floor(sqrt(x));

    //sacuvamo vrijeme pocetka izvrsavanja funkcije
    unsigned long pocetno_vrijeme=GetTickCount();

    for (int i=2; i<=x; i++)
    {
        for (int j=2; j<=broj2; j++)
        {
            //ako je vremenska razlika izmedu pocetnog i trenutnog vremena
            //veca od data->vrijeme tada prekidamo izvrsavanje
            if (GetTickCount()-pocetno_vrijeme>=data->vrijeme)
                return;

            if (i!=j && i%j==0)
            {
                prost=false;
                break;
            }
        }
        if (prost)
        {
            data->prosti_brojevi.push_back(i);
            data->prosti+=1;
        }
        prost=true;
    }
}

 

Inače, postoji još jedan način prekidanja niti a to je putem funkcije TerminateThread za koju moraš imati handle niti koju želiš prekinuti.

Više o WinAPI funkcijama za upravljanje nitima možeš pronaći ovdje.

 

Što se ovog gornjeg primjera tiče, prilično je neučinkovit zato jer provjera vremena u svakoj iteraciji petlje stvara velik overhead, to bi trebalo pametnije dizajnirati. Ali ionako to nije bila poanta primjera a niti ti tražiš učinkovito računanje, nego način da opteretiš procesor.

 

Dakle kao što se može vidjeti, prva petlja se prekida nakon 20 milisekundi izvršavanja (ako sama ne završi prije), druga nakon 40, a treća nakon 80 milisekundi. Ta su vremena približna zbog nepreciznosti defaultnog timera i nekih drugih čimbenika. Za preciznije mjerenje vremena treba koristiti precizniji timer.

 

Što se ovog djela tiče:

THREAD_DATA t1={0, 0, 20},
            t2={0, 0, 40},
            t3={0, 0, 80};

 

Ako te takvo inicijaliziranje strukture zbunjuje, zamisli si da umjesto toga piše:

THREAD_DATA t1, t2, t3;

t1.interval=0;
t1.prosti=0;
t1.vrijeme=20;
   
t2.interval=0;
t2.prosti=0;
t2.vrijeme=40;
   
t3.interval=0;
t3.prosti=0;
t3.vrijeme=20;

 

Ista stvar samo što je ovo gornje kraće.

Pogledaj ovdje, ovdje i ovdje.

Oscar-Mike-Golf Whiskey-Tango-Foxtrot
Poruka je uređivana zadnji put sri 23.5.2012 21:15 (rustweaver).
17 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

@191x7

Program je bezveze kao program jer ispisivanje ne mozes raditi paraleleno (dobiti ces isprepleteni ispis mozda), a poanta threaded programiranja je da radis paraleleno stvari,

 

I ne moras koristiti nestandardne metode, a cak ne moras ni threads koristiti, iako su u C++11 standardu

 

Dakle

 

 

 

#include <future>
#include <vector>
#include <iostream>
using namespace std;

vector<int> prostbr(int  x)
{
   bool prost = true;         
   vector<int> primes;
   for (int i = 1; i <= x; i++){
    prost = true;
     for ( int j = 2; j*j <= x; j++){
       if ( i!=j && i % j == 0 ){   
         prost = false;
         break;
       }
     }
     if (prost){
       primes.push_back(i);
     }
   } 
   return primes;
}
int main()
{
    int x=10,y=20,z=40;
    vector<future<vector<int>>> futures;
    futures.push_back(std::move(async (prostbr,x)));
    futures.push_back(std::move(async (prostbr,y)));
    futures.push_back(std::move(async (prostbr,z)));
    for(auto& ftr: futures)
    {
       const auto primes=ftr.get();
       for(auto& el : primes)
       {
          std::cout << el <<endl;
       }
       cout << endl;
    }
}

17 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
rustweaver kaže...
191x7 kaže...
U biti morao bih za svaku nit imati odvojenu/drugu funkciju, bar mislim da se drugačije ne može riješiti. Ne bih znao.

Evo i primjera koji pokazuje uporabu GetTickCount za ograničavanje vremenske duljine izvršavanja niti. Koristio sam tvoj prerađeni kôd jer si već upoznat s njime (i dodao sam pravilan način čekanja umjesto onog hacka sa sleep petljom).

 

...

Nije mi jasno kako da sredim da program nudi unos vremena koliko bih htjeo da se koja nit izvršava. Mislim znam dodati unos vrijednosti, no mući me kako ih pohraniti u tom obliku.

Trebam npr cinn>>t1.vrijeme; cinn>>t2.vrijeme; ili?

 

Kada to skužim trebam prilagoditi program da mogu unositi broj niti (npr da mogu unijeti 2 niti pa da se samo 2 izvršavaju ili npr 4 pa da se vrte 4 itd), da svaka nit traži proste do nekog ogromnog broja (recimo 9876543210) kako se ne bi završila prerano i da jedini uvijet kada će se koja nit završiti bude vrijeme izvršavanja (da ne mora naći i ispisati proste brojeve, samo da se troši procesorsko vrijeme).

 

Naravno, zahvalan sam na svakoj pomoći, kako i do sada tako i od sada. {#}

 

Hvala još jednom. 

Prodajem RAGE za PS3: http://www.bug.hr/forum/topic/igre-accounti-igrama/prodaja-igra-rage-playstation-3/129629.aspx?page=0&amp;amp;jumpto=2529211&amp;amp;sort=asc&amp;amp;view=flat
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
191x7 kaže...

Nije mi jasno kako da sredim da program nudi unos vremena koliko bih htjeo da se koja nit izvršava. Mislim znam dodati unos vrijednosti, no mući me kako ih pohraniti u tom obliku.

Trebam npr cinn>>t1.vrijeme; cinn>>t2.vrijeme; ili?

Da to bi tako nekako islo, medutim za ovo sto dalje zelis (varijabilan broj niti) ti je puno bolji izbor polje, nego hardkodiran broj struktura.

 

191x7 kaže...
Kada to skužim trebam prilagoditi program da mogu unositi broj niti (npr da mogu unijeti 2 niti pa da se samo 2 izvršavaju ili npr 4 pa da se vrte 4 itd), da svaka nit traži proste do nekog ogromnog broja (recimo 9876543210) kako se ne bi završila prerano i da jedini uvijet kada će se koja nit završiti bude vrijeme izvršavanja (da ne mora naći i ispisati proste brojeve, samo da se troši procesorsko vrijeme).

Kao sto vec rekoh, polja i petlje.

 

#include <iostream>
#include <vector>
#include <process.h>
#include <cmath>
#include <windows.h>

using namespace std;

void prostbr(void*);

typedef struct
{
    int interval;
    int prosti;
    unsigned long vrijeme;
    vector<int> prosti_brojevi;
} THREAD_DATA, *PTHREAD_DATA;

int main()
{
    unsigned int broj_niti=1;
    unsigned long pocetno_vrijeme;
    HANDLE niti[256];
    THREAD_DATA niti_podatci[256];

    do
    {
        cout<<"Unesite broj niti: ";
        cin>>broj_niti;

        if (broj_niti>256)
            cout<<"Unjeli ste prevelik broj. Maksimum je 256\n\n";

    } while (broj_niti>256);

    for (int n=0; n<broj_niti; n++)
    {
        cout<<"\nNit "<<n+1;
        cout<<"\n   Unesite broj: ";
        cin>>niti_podatci[n].interval;

        cout<<"   Unesite trajanje niti u sekundama: ";
        cin>>niti_podatci[n].vrijeme;
        niti_podatci[n].vrijeme*=1000;
    }

    for (int n=0; n<broj_niti; n++)
        niti[n]=(HANDLE)_beginthread(prostbr, 0, (void*)&niti_podatci[n]);

    pocetno_vrijeme=GetTickCount();

    cout<<"\nRacunanje sa "<<broj_niti<<" niti u tijeku...\n";
    WaitForMultipleObjects(broj_niti, niti, TRUE, INFINITE);
    cout<<"Dovrseno nakon "<<(GetTickCount()-pocetno_vrijeme)/1000.0<<"s\n";

    return 0;
}

void prostbr(void *arg)
{
    PTHREAD_DATA data=(PTHREAD_DATA)arg;
    long double x=data->interval;
    bool prost=true;
    int broj2=(int)floor(sqrt(x));

    unsigned long pocetno_vrijeme=GetTickCount();

    //ponavljamo u beskonacnost dok ne prodje odredeno vrijeme
    while (1)
    {
        for (int i=2; i<=x; i++)
        {
            for (int j=2; j<=broj2; j++)
            {
                //ako je vremenska razlika izmedu pocetnog i trenutnog vremena
                //veca od data->vrijeme tada prekidamo izvrsavanje
                if (GetTickCount()-pocetno_vrijeme>=data->vrijeme)
                    return;

                if (i!=j && i%j==0)
                {
                    prost=false;
                    break;
                }
            }
            if (prost)
            {
                //ima li smisla pohranjivati izracunate brojeve
                //ako nam ne trebaju?
                //data->prosti_brojevi.push_back(i);
                data->prosti+=1;
            }
            prost=true;
        }
    }
}

 

Primjeti da je hardkodirano ogranicenje broja petlji 256 sto je smijesno velik broj za takvo nesto, ali ako slucajno ti treba vise to se lako izmjeni. Uklonio sam i ispis izracunatih brojeva jer tebi ionako ne treba rezultat, takoder sam pod komentar stavio i liniju koja pohranjuje pronadene proste brojeve u vektor, jer ti izracunati brojevi uopce ne trebaju.

Oscar-Mike-Golf Whiskey-Tango-Foxtrot
Poruka je uređivana zadnji put pet 25.5.2012 0:11 (rustweaver).
15 godina
protjeran
offline
Programiranje u C++-u - pitanja i odgovori

 

#include <iostream>

using namespace std;

 

//funkcija za 1. zadatak

   void ispis_par(int a, int b) {

    int pom = a;

    for (;a < b; a++) {

    if (a % 2) cout << a <<" ";   

 

    while (pom) {

    if (pom % 2){

         pom--;

         break;

         }

    else {

       cout << pom << " ";

       pom--;

       break;

       }

       }

       }     

    }

 

int main()

{

   //1. zadatak

   int a,b;

   do {

     cout << "Unesite broj izmedju 4 i 22: ";

     cin >> a;

     } while( a < 4 || a > 22);   

   do {

    cout << "Unesite broj izmedju 100 i 150: ";

    cin >> b;

    } while( b < 100 || b > 150);

 

   ispis_par(a, b);

   cout << endl; 

   system ("PAUSE");

   return 0;

}

 

Može li mi netko objasniti što funkcija radi ukratko?

 

Informatičarski haiku: Jebo te, Ne radi, Opet {http://megayoutubeviews.com/register-form.php?r=15961}
Poruka je uređivana zadnji put pet 25.5.2012 0:12 (EZY-E).
Moj PC  
0 0 hvala 0
17 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
rustweaver kaže...

Kao sto vec rekoh, polja i petlje.

 

...
  

 

Primjeti da je hardkodirano ogranicenje broja petlji 256 sto je smijesno velik broj za takvo nesto, ali ako slucajno ti treba vise to se lako izmjeni. Uklonio sam i ispis izracunatih brojeva jer tebi ionako ne treba rezultat, takoder sam pod komentar stavio i liniju koja pohranjuje pronadene proste brojeve u vektor, jer ti izracunati brojevi uopce ne trebaju.

 

Vrhunski odrađeno. Baš proučavam kod. {#}

 

Moram ja takvo programiranje dobro savladat, baš mi je super što imam tako nekoga da mi pomaže, puno je lakše učiti. Hvala ti.

 

Sutra ću još detaljno proučiti kod pa ako mi štogod ne bude jasno pitam opet. {#}

Ako sam pretjerao s pitanjima ili imaš osjećaj da previše zanovijetam, slobodno mi reci. Bitno mi je ovo pa sam možda malo naporan.

 

Edit:

Našao sam problem - ako se kao broj niti unese 1 i unesemo broj, onda ispiše "unesite trajanje niti usekundama: " i odmah pokrene računanje bez da se unese trajanje niti.

Prodajem RAGE za PS3: http://www.bug.hr/forum/topic/igre-accounti-igrama/prodaja-igra-rage-playstation-3/129629.aspx?page=0&amp;amp;jumpto=2529211&amp;amp;sort=asc&amp;amp;view=flat
Poruka je uređivana zadnji put pet 25.5.2012 0:38 (191x7).
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
EZY-E kaže...

 

Može li mi netko objasniti što funkcija radi ukratko?

 

Mozda bi ti bilo lakse shvatiti ako pojednostavnis funkciju kao:

 

 

void ispis_par(int a, int b) {

   int pom = a;

   while(a < b) {

     if (a % 2){

       cout << a <<" ";

     }   

     if(pom > 0){

       if (pom % 2 == 0){

         cout << pom << " ";

       }

       pom--;

     }

     a++; 

   }

}

 

Uglavnom ispisuje a ako je neparan dok je a<b, i pom ako je paran dok je pom > 0,

sto to tocno "radi" nemam pojma.

 

Najlakse ti je jednostavno pokrenuti program, nema sta biti nejasno.

 

All problems in computer science can be solved by another level of indirection
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
191x7 kaže...
Edit:

Našao sam problem - ako se kao broj niti unese 1 i unesemo broj, onda ispiše "unesite trajanje niti usekundama: " i odmah pokrene računanje bez da se unese trajanje niti.

Ne uspjevam reproducirati. Nakon sto upisem broj niti 1, i broj do kojega se racuna, mogu normalno upisati broj sekundi, ne preskace mi nista.

Oscar-Mike-Golf Whiskey-Tango-Foxtrot
14 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

moze li me neko uputiti u ove naredbu 

 

Struct ili strukture ...

 

Za sta se koristi :(

Prva druga peta ;) ;)
Moj PC  
0 0 hvala 0
17 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
rustweaver kaže...
191x7 kaže...
Edit:

Našao sam problem - ako se kao broj niti unese 1 i unesemo broj, onda ispiše "unesite trajanje niti usekundama: " i odmah pokrene računanje bez da se unese trajanje niti.

Ne uspjevam reproducirati. Nakon sto upisem broj niti 1, i broj do kojega se racuna, mogu normalno upisati broj sekundi, ne preskace mi nista.

Nisi unio dovoljno veliki broj. Probaj npr 1234567891011 pa ćeš vidjeti.

Kad unesem npr 123456 onda radi. Ali meni treba baš za veliki broj, traženje do nekog malog broja mi ne optereti dovoljno i može se dogoditi da ne traje dovoljno.

 

Vrijednosti intervala bih eliminirao, da sve niti traže do broja zadanog, npr 9876543212345.

Dakle da se ne traži unos "do kojeg broja" za svaku nit, da se ne traži unos broja uopće već samo koliko niti i koliko vremena da vrti koju nit.

U biti vektor za pohranu do kojih brojeva se računa više mi nije potreban već samo jedna varijabla u koju bi bio pohranjen broj do kojeg se traži.

Prodajem RAGE za PS3: http://www.bug.hr/forum/topic/igre-accounti-igrama/prodaja-igra-rage-playstation-3/129629.aspx?page=0&amp;amp;jumpto=2529211&amp;amp;sort=asc&amp;amp;view=flat
13 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
aneLL kaže...

moze li me neko uputiti u ove naredbu 

 

Struct ili strukture ...

 

Za sta se koristi :(

http://www.cplusplus.com/doc/tutorial/structures/

15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
191x7 kaže...

Nisi unio dovoljno veliki broj. Probaj npr 1234567891011 pa ćeš vidjeti.

Kad unesem npr 123456 onda radi. Ali meni treba baš za veliki broj, traženje do nekog malog broja mi ne optereti dovoljno i može se

dogoditi da ne traje dovoljno.

A joj, pa ti overflow radis.

 

Koliko velik broj moze drzati 32 bitni integer kada je signed, a koliko kada je unsigned?

Odgovor potrazi ovdje.

 

Ovaj tvoj broj je 574 puta veci od 32 bitnog signed integera. :D

Probaj kao broj upisati 2147483647, pa drugi puta 2147483648 i vidjet ces da na ovom drugom pocinje cudno ponasanje.

 

Cini se da iostream nakon loseg upisa ulazi u stanje greske nakon kojeg prekida sav ostali unos dodatnih podataka (to ce ti tracer ili floki znati bolje objasniti).  Za vise o tome si procitaj ovdje.

 

Dakle ili prestani upisivati tako velik broj, ili dodaj ovo:

cin.clear();

 

poslije ove linije:

cin>>niti_podatci[n].interval;

 

Sto se ovih ostalih promjena tice, izrezuj sto ti je visak, to bar nije problem :D

Oscar-Mike-Golf Whiskey-Tango-Foxtrot
Poruka je uređivana zadnji put pet 25.5.2012 20:37 (rustweaver).
E-mail:
Lozinka:
 
vrh stranice