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

poruka: 7.285
|
čitano: 1.731.977
|
moderatori: XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
14 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

nisam stigao do pokazivaca (radim po knjizi od ćosića i marendića), a ovaj drugi nacin mi nije bas jasan....

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

Trebao bih pomoć sa zadatkom.Riješio sam ga i daje točna rješenje,jedino nešto nije u redu sa sortom.Prvi i treci primjeri rade,a drugi mi ne radi.Ne znam zašto.Hvala.

Zadatak:

Uopće ne treba upotrijebiti sort i raditi sa dva niza, dovoljno je u vector container staviti pair<int,int>, gdje je prvi član para redni broj, a drugi član broj bodova.

Nakon toga kroz petlje eliminirati tri najmanja i to je to. (ako nisi radio sa vector container-om i pair-om, evo prilike).

 

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


int main()
{
    vector<pair<int, int>> rezultat;
    int suma = 0;

    for(int i= 0; i<8; i++)
    {
       int b;
       cin>> b;
       rezultat.push_back(make_pair(i+1, b));
       suma += b;
    }

    for(int i = 0; i<3; i++)
    {
       int najmanji = rezultat[0].second;
       int index = 0;

       for(int j = 1; j<rezultat.size(); j++)
       {
          if(rezultat[j].second < najmanji)
          {
             najmanji = rezultat[j].second;
             index = j;
          }
       }
       suma -= najmanji;
       rezultat.erase(rezultat.begin() + index);
    }
    cout<< suma << endl;
    for(int i=0; i<rezultat.size(); i++)
    {
       cout<< rezultat[i].first << " ";
    }
    return 0;
}

Poruka je uređivana zadnji put pon 23.1.2012 16:17 (Floki).
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Da,nisam koristio niti vector niti pair.Hvala na rješenju.

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

Da,nisam koristio niti vector niti pair.Hvala na rješenju.

jednostavnije je, brže i lakše

inače tamo kod nizova možeš napisati svoj bubble sort kao algoritam za sortiranje.

http://www.cplusplus.com/reference/stl/vector/

http://www.cplusplus.com/reference/std/utility/pair/

(nije neka mudrost, a čovjek se lako nauči na fleksibilnost ovih containera)

Poruka je uređivana zadnji put pon 23.1.2012 16:21 (Floki).
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
CRT kaže...

nisam stigao do pokazivaca (radim po knjizi od ćosića i marendića), a ovaj drugi nacin mi nije bas jasan....

Ovaj drugi nacin ti je pass by reference, to su ti u biti takoder pokazivaci. Vidim da ti nitko nije napisao odgovor (a nije da ovdje nema ljudi koji bi to objasnili puno bolje od mene), pa cu ti ukratko priloziti jedan programcic da si vidis kako otprilike ta dva nacina izgledaju:

 

#include <iostream>
#include <cstdio>

using namespace std;

//funkcija prima memorijske adrese varijabli, koje pohranjuje u pokazivace
//te preko tih pokazivaca mijenja vrijednosti varijabli
void postavi_brojeve(int *b1, int *b2)
{
     *b1=3;
     *b2=9;
    
     return;
}

//funkcija alocira polje od dva clana, dodjeli im vrijednosti te vrati
//to polje
int* vrati_polje()
{
    int *polje=new int[2];
    polje[0]=2;
    polje[1]=8;
   
    return polje;
}

int main()
{
    //varijable 'a' i 'b' su normalni integeri, varijabla 'brojevi' je
    //pokazivac na polje integera
    int a=0, b=0, *brojevi;
   
    //pozovi funkciju postavi_brojeve i proslijedi joj adrese varijabli
    //'a' i 'b'
    postavi_brojeve(&a, &b);
    cout << a << " " << b << endl;
   
    //pozovi funkciju vrati_polje koja ce vratiti pokazivac na alocirano
    //polje od 2 clana
    brojevi=vrati_polje();
    cout << brojevi[0] << " " << brojevi[1] << endl;
   
    system("pause");
    return 0;
}

 

Ako nisi shvatio ne ocajavaj, doci ces i do pokazivaca i naucit ces ih prije ili poslije ;)

My computer once beat me at chess, but we got even after a round of boxing.
15 godina
offline
Programiranje u C++-u - pitanja i odgovori

ljudi jel zna iko sta se dogodilo za alzan.info blogom, bia je savršeno mjestoza ucit c++ / c# i ostalo??

 

http://alzan.info/tag/c-plus-plus/

Nikad te necemo zaboraviti. RIP EnlightenedPhoenix 24.6.2011.
Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Što će ti return u funkciji tipa void i koja je poanta ove funkcije koja vraća pokazivač? To je jako opasna stvar koja se u praksi treba izbjegavati jer je memoriju lako zaboraviti dealocirati (kao i u tvom slučaju).

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

Što će ti return u funkciji tipa void i koja je poanta ove funkcije koja vraća pokazivač? To je jako opasna stvar koja se u praksi treba izbjegavati jer je memoriju lako zaboraviti dealocirati (kao i u tvom slučaju).

ovaj return ne vraca nikakav tip podataka, nekako mi je lijepse vidjeti return na kraju funkcije nego ga jednostavno izostaviti a mislim da je to i po standardu. U svakom slucaju taj return nikome ne skodi, kompajler ubacuje ret i izlazi iz funkcije neovisno o tome nalazi li se tu return ili ne.


"A function with void result type ends either by reaching the end of the function or by executing a return statement with no returned value."

 

Sto se dealokacije memorije tice, to se izvrsi automatski nakon sto program zavrsi, mogao sam iskoristiti delete nakon ispisa sa coutom ali cemu kada je program ionako gotov nakon toga. Poanta te funkcije pokazati kako izgleda funkcija koja vraca polje.

 

Priznajem da c++ nije moj teren, ali osim ako operator "new" nije drastocno razlicit od malloca, onda mislim da je sve tocno onako kako sam si ja to zamislio.

My computer once beat me at chess, but we got even after a round of boxing.
Poruka je uređivana zadnji put pon 23.1.2012 18:39 (rustweaver).
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Svakako nije standard jer se zna čemu return služi. Return nije potreban da se stavlja u funkcijama tipa void osim ako funkcija ne treba završiti s radom ranije nego što je to predviđeno normalnim putem (zbog greške ili sl., što tvoj citat zapravo i objašnjava). S obzirom da tvoja funkcija nema taj slučaj to je višak coda. Npr.

 

void f(int a, int b){
    if(b == 0){
        cout << "Nazivnik je 0!";
        return;
    }
    cout << (float)a/b;
}

Ovdje je return sasvim opravdan dok na kraju funkcije nije potreban.

 

Dealokacija dinamički alocirane memorije nije automatska. C++ nema garbage collector (kao npr. C#) i tu memoriju treba dealocirati ručno upotrebom delete. I nije da nema veze jer si tada napravio memory leak bez obzira što je tvoj program završio. Program će automatski uništiti samo one statičke objekte koji su na stog-u, a ove koje si kreirao na heapu operatorom new moraš sam uništiti.

Poruka je uređivana zadnji put pon 23.1.2012 18:59 (TracerCPP).
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Ok, pustimo sada return, to je ionako kozmeticki u ovom slucaju.

 

TracerCPP kaže...

Program će automatski uništiti samo one statičke objekte koji su na stog-u, a ove koje si kreirao na heapu operatorom new moraš sam uništiti.

Unistit, tj. oslobodit ce ih memory manager operacijskog sustava po zavrsetku programa. Da je program nastavljao dalje onda bi bilo logicnije pratiti i oslobadati alociranu memoriju. Ovako jednostavno nema razloga. Garbage collector ima veze samo sa izvodenjem programa kada je aktivan. Po zatvaranju programa aktivira se najbolji "garbage collector" koji postoji -  memory manager.

 

http://stackoverflow.com/questions/654754/what-really-happens-when-you-dont-free-after-malloc

 

Nemojmo sada skretati u teme je li to dobra praksa ili ne, zadrzimo se strogo na ovom programu koji sam napisao. Program se zatvara - memorija biva oslobodena. Osim ako mi ne podastres neki dokaz gdje je po zavrsetku programa memory pool operacijskog sustava trajno ostao umanjen za kolicinu neoslobodene memorije, ne vidim daljnji smisao nastavljanju ove rasprave.

My computer once beat me at chess, but we got even after a round of boxing.
Poruka je uređivana zadnji put pon 23.1.2012 19:29 (rustweaver).
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Nemam ja sad tu što tebi dokazivati. Dinamički alociranu memoriju treba osloboditi operatorom delete i toga se treba držati. Izbjegavanje toga samo vodi mogućim greškama u programu i zato ljude ne treba učiti da to izbjegavaju. Kome se to ne sviđa neka koristi STL.

Poruka je uređivana zadnji put pon 23.1.2012 19:55 (TracerCPP).
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
TracerCPP kaže...

i zato ljude ne treba učiti da to izbjegavaju.

S ovim se slazem, zato sam i rekao odmah u prvom postu da ovdje ima puno kompetentnijih ljudi koji bi to mogli pokazati, ali posto nitko nije reagirao ja sam uskocio.

My computer once beat me at chess, but we got even after a round of boxing.
Poruka je uređivana zadnji put pon 23.1.2012 20:06 (rustweaver).
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Treba učiti STL i svima će život biti lakši. Primjerice, prije i osobno sam s time boljku mučio pa sam pisao svoje predloške klasa da se ne zamaram s delete.

 

#include <iostream>
using namespace std;

template <class T>
class Polje
{
   public:
      T* polje;
      int BrojElemenata;

      Polje(int n);
      ~Polje() {delete[] polje;}
      int Sadrzi(T vrijednost);
};
template <class T> Polje<T>::Polje(int n)
{
   BrojElemenata = n;
   polje = new T[n];
}
template <class T> int Polje<T>::Sadrzi(T Vrijednost)
{
   int pom = 0;
   for(int i = 0; i < BrojElemenata; i++)
      if(polje[i] == Vrijednost)
         pom = 1;
   return pom;
}
int main()
{
        // kreiraj polje cijelih brojeva od 100 elemenata
   Polje <int> A(100);

        // inicijalizacije polja
   for(int i = 0; i < 100; i++)
      A.polje[i] = i;

        // da li se u polju nalazi broj 99?
   cout << A.Sadrzi(99);

        // koliki je broj elemenata
   cout << A.BrojElemenata;
   return 0;
}

 

No danas to nije potrebno.

17 godina
offline
Programiranje u C++-u - pitanja i odgovori

Zašto funkcijski član Sadrzi(T) ne vraća bool vrijednost, jel ima neki razlog.

 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Radio sam u nekom starom compileru na faksu koji nije podržavao bool..

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

Radio sam u nekom starom compileru na faksu koji nije podržavao bool..

Aha, kužim, ja mislio da template ima neki zahtjev{#}.

Poruka je uređivana zadnji put pon 23.1.2012 20:30 (Floki).
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Ne, ali bi ga se moglo preurediti da vraća indeks nađenog člana ili -1 ako ne postoji.

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

Ne, ali bi ga se moglo preurediti da vraća indeks nađenog člana ili -1 ako ne postoji.

To bi bilo pametno, da vraća -1 ako nema ili index ako ima, kao SadrziIndex(T), bolje nego bool.

15 godina
offline
Programiranje u C++-u - pitanja i odgovori

zanima me šta mislite za mene dal da prelazim na c# lagano pa u njemu dalje ucim i napredujem, znam koje su prednosti i mane c# i ipak bi prešao

 

 

6 Pređi na C# pa širi znanje
1 Zasad ostani na c++
Nikad te necemo zaboraviti. RIP EnlightenedPhoenix 24.6.2011.
Moj PC  
0 0 hvala 0
17 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
CRT kaže...

nisam stigao do pokazivaca (radim po knjizi od ćosića i marendića), a ovaj drugi nacin mi nije bas jasan....

Ovako izgleda rad sa referencama, varijable a i b ovdje predstavljaju reference varijabli prva i druga. Sva mudrost se nalazi u tome da one imaju iste memorijske adrese kao i varijable na koje se odnose.

Sve što uradiš sa varijablom a, uradio si sa varijablom prva. Ovdje predajom argumenta funkcijii vršiš sljedeću dodjelu: int& a = prva, u stvari pozivaš referencu (call by reference).

 

#include<iostream>
using namespace std;

void PovecajZaPet(int& a, int& b)
{
    cout<< "Adresa a: " << &a << " Adresa b: " << &b << endl;
    a += 5;
    b += 5;
}

int main()
{
    int prva =5, druga = 5;
    cout<< "Adresa prva: " << &prva << " Adresa druga: " << &druga << endl;
    PovecajZaPet(prva, druga);
    cout<< prva << " " << druga << endl;
    return 0;
}

 

 

Kod poziva po vrijednosti adrese nisu iste i varijable prva i druga nemju iste adrese kao varijable a i b. Ovdje predajom argumenta funkciji vršiš sljedeću dodjelu: int a = prva, kopiraš varijablu prva u novu varijablu a, tj. vršiš dodjelu, odnosno poziv funkcije po vrijednosti (call by value).

 

#include<iostream>
using namespace std;

void PovecajZaPet(int a, int b)
{
    cout<< "Adresa a: " << &a << " Adresa b: " << &b << endl;
    a += 5;
    b += 5;
}

int main()
{
    int prva =5, druga = 5;
    cout<< "Adresa prva: " << &prva << " Adresa druga: " << &druga << endl;
    PovecajZaPet(prva, druga);
    cout<< prva << " " << druga << endl;
    return 0;
}

 

Ovo su reference, čisto dostatne za tvoj zadatak, pokazivači su malo složeniji, a reference obično budu dostatne za uraditi većinu stvari.

U jednoj rečenici:

int& refPrva = prva;

refPrva je referenca varijable prva, praktično ista varijabla drugog imena.

 

 

 

 

 

 

 

Poruka je uređivana zadnji put uto 24.1.2012 12:59 (Floki).
15 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Kako da napravim da mi je pritisak tipke enter u naredbi? npr. "press enter to go to beginning" ovaj dio beginning znam, ali ovaj enter ne :/

Poruka je uređivana zadnji put uto 24.1.2012 18:25 (Leonardus97).
Moj PC  
0 0 hvala 0
13 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Molim te da nam malo pojasniš što hoćeš, hoćeš da se nastavi samo ako je pritisnut enter?, što?

14 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

pomocu getchara.

Igor
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

unosi se neki cjeli broj n, potrebno je ispisati sve kombinacije zbrajanja brojeva 1,2,5  za dobivanje n (ne moraju bit sva 3 broja u pojedinoj kombinacij)

 

po mogucnosti da mi nedate gotovo rjesenje nego me navedete malo na njega

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

Pozdrav, trebam pomoć oko ovoga programa(inače seminarski zadatak):

 

 

Zadatak:

Napisati program koji u unosu prima početni i krajnji broj niza. Brojevi moraju biti cijeli, pozitivni i dvoznamenkasti. 

Program treba ispisati sve brojeve od početnog do krajnjeg (uključujući i njih) u rastućem nizu (od najmanjeg prema najvećem), ali sa zamjenjenim znamenkama desetica i jedinica (npr. 63 treba ispisati kao 36, a 64 kao 46). U brojevima koji završavaju sa 0 (npr 10), obavezno ispisati i početnu 0 (10 postaje 01).

 

Unos i ispis možete prilagoditi i uljepšati prema izboru, dani primjeri samo pokazuju funkcionalnost programa. 

 

OVO sam ja isprogramirao, i bio na obrani seminarkog već 2 puta, i opet me frajer poslao, da se sljedeći tjedan vratim, pa mi je dopi*dilo. Može pomoć da se ovaj program doradi, da ima sve elemente (konkretno, kako ograničit na pozitivne i dvoznamenkaste brojeve - prvi dio) da napokon to završim. Molim vas.

Inače laik sam šta se tiče programiranja.

 

EDIT: Mislim da sam uspio, za sad radi, još koji test da vidim jel sve ok, i to je to! :D

#include <cstdlib>

#include <iostream>

 

using namespace std;

 

int main()

{

   int x,y;

   cout<<"Program daje rastuci niz dvoznamenkastih brojeva od zadane pocetne vrijednosti  do zadane ";

   cout<<"krajnje vrijednosti, te ih ispisuje tako da im zamijeni mjesta "<<endl;

   cout<<"znamenaka."<<endl<<endl;

   cout<<"Unesi pocetni dvoznamenkasti clan niza: ";

   cin>>x;

   cout<<"Unesi zavrsni dvoznamenkasti clan niza: ";

   cin>>y;

   cout<<endl<<"Trazeni niz:"<<endl<<"";

   while((x<=y) && (x>=10) && (x<=99) && (y>=10) && (y<=99))

   {

         if(x%10==0)cout<<0<<x/10<<" ";

         else cout<<x%10<<x/10<<" ";

         x++;

   }

   cout<<endl<<endl;

   system("PAUSE");

   return EXIT_SUCCESS;

}

Pretpostavka je majka svih zajeba. || To do list....go to Pamplona and run in front of bulls!!
Poruka je uređivana zadnji put pet 27.1.2012 14:40 (Zero Chance).
Moj PC  
0 0 hvala 0
17 godina
offline
Programiranje u C++-u - pitanja i odgovori

Traži ti dvije stvari:

- selekciju upisa

- ispis po rastućim elementima dobijenih elemenata

 

Hoće li ti ovo biti "over rating", ne znam jeste radili vektore.

 

 

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

int main()
{
    int prvi=0 ,drugi=0;
    vector<int> brojevi;
    while((prvi<=9 || prvi>=100) || (drugi<=9 || drugi>=100))
    {
       cin>> prvi >> drugi;
    }
    for(int index=prvi; index<=drugi; index++)
    {
       int broj = ((index%10)*10) + (index/10);
       brojevi.push_back(broj);
    }
    sort(brojevi.begin(), brojevi.end());

    while(!brojevi.empty())
    {
       if(brojevi.front() < 10)
       {
          cout<< 0 << brojevi.front() << " ";
       }
       else
       {
          cout<< brojevi.front() << " ";
       }
       brojevi.erase(brojevi.begin());
    }
   
    return 0;
}

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

Ako pak završni niz ne treba poredati, nego prikazuje brojeve poredane po originalnom nizu, onda ovako:

(ovo je ono što si ti napravio, samo ispravno)

 

 

#include <iostream>
using namespace std;

int main()
{
    int prvi=0 ,drugi=0;
    while((prvi<=9 || prvi>=100) || (drugi<=9 || drugi>=100))
    {
       cin>> prvi >> drugi;
    }
    for(int index=prvi; index<=drugi; index++)
    {
       cout<< index%10 << index/10 << " ";
    }
   
  
    return 0;
}

Poruka je uređivana zadnji put pet 27.1.2012 15:46 (Floki).
 
0 0 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
xxxmitoxxx kaže...

unosi se neki cjeli broj n, potrebno je ispisati sve kombinacije zbrajanja brojeva 1,2,5  za dobivanje n (ne moraju bit sva 3 broja u pojedinoj kombinacij)

 

po mogucnosti da mi nedate gotovo rjesenje nego me navedete malo na njega

Probaj prvo sa dva broja npr. 3 i 5

Pod sve kombinacije da li je ista kombinacija 115 i 151?

 

Ovo je najjednostavnije rijesit tako da prođeš sve kombinacije pomoću 3 for petlje, izvodi se sporo za velike n
To je kao da riješavaš jednadžbu "i*1 + j*2 + k*5 = n" gdje su i,j,k nenegativni cijeli brojevi.

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

unosi se neki cjeli broj n, potrebno je ispisati sve kombinacije zbrajanja brojeva 1,2,5  za dobivanje n (ne moraju bit sva 3 broja u pojedinoj kombinacij)

 

po mogucnosti da mi nedate gotovo rjesenje nego me navedete malo na njega

trostruka for petlja

Igor
13 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
athlon64 kaže...

zanima me šta mislite za mene dal da prelazim na c# lagano pa u njemu dalje ucim i napredujem, znam koje su prednosti i mane c# i ipak bi prešao

 Ma prelazi!

E-mail:
Lozinka:
 
vrh stranice