C++ - funkcija koja prima broj i niz brojeva

poruka: 14
|
čitano: 10.726
|
moderatori: XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
14 godina
neaktivan
offline
Pomoć oko c++ zadatka

Molim vas malo pomoći sa sljedećim zadatkom:

 

Napišite funkciju koja prima dva parametra: prvi parametar je jedan broj, a drugi parametar je niz brojeva.
Rezultat funkcije neka je niz brojeva koji se sastoji od svih članova zadanog niza koji su manji od
zadanog broja.Nakon toga napišite program koji iskušava tu funkciju.

 

Hvala

 
0 0 hvala 0
14 godina
neaktivan
offline
Pomoć oko c++ zadatka

niz kao vector<int> ili int[]

 

ako je int[] onda je malo teze, je kasnije nemas pojma koliko je dugacak taj array, osim ako ne spremis i to negdje.

 

pa evo :

  #include <iostream>
#include <vector>

using namespace std;

typedef vector <int> intarray;

intarray function(intarray array, int elem)
{
intarray ret;

for (int i = 0; i < array.size(); ++i)
if (array[i] < elem)
ret.push_back(array[i]);

return ret;
}

int main()
{
int len, elem;
intarray arr;

cin >> len >> elem;
for (int i = 0; i < len; ++i) {
int x; cin >> x;
arr.push_back(x);
}

intarray retArr = function(arr, elem);

for (int i = 0; i < retArr.size(); ++i)
cout << retArr[i] << "\n";
}

 

 

  #include <iostream>

const int MaxLen = 1000;
int arr[ MaxLen ];
int len;

int index;

int* function(int elem, int *array)
{
    int ret[MaxLen];

    index = 0;
    for (int i = 0; i < len; ++i)
    if (array[i] < elem)
      ret[index++] = array[i];

    return ret;
}

int main()
{
int elem;
std::cin >> len >> elem;
for (int i = 0; i < len; ++i)
    std::cin >> arr[i];

int *newArray = function(elem, arr);

for (int i = 0; i < index; ++i)
    std::cout << *(newArray + i) << "\n";
}

 

Poruka je uređivana zadnji put ned 20.3.2011 22:20 (Budimir).
 
2 0 hvala 1
14 godina
neaktivan
offline
Re: Pomoć oko c++ zadatka

Ja ću samo preraditi Budimirovo rješenje tako da bude u stilu ostatka knjige:

 

 

 

 

#include <iostream>

#include <vector>

 

using namespace std;

 

vector <double> OdaberiManje(double elem, vector<double> niz)

{

    vector <double> ret;

 

    for (int i = 0; i < int(niz.size()); i++)

    if (niz[i] < elem)

        ret.push_back(niz[i]);

 

    return ret;

}

 

int main()

{

    int len;

    double elem;

    vector <double> arr;

       

    cout << "Upisite broj elemenata niza:" << endl;

    cin >> len;

   cout << "Upisite elemente niza:" << endl;

    for (int i = 0; i < len; ++i) {

        int x;

        cin >> x;

        arr.push_back(x);

        }

 

    cout << "Upisite ogranicenje:" << endl;

    cin >> elem;

 

    vector <double> retArr = OdaberiManje(elem, arr);

 

    for (int i = 0; i < int(retArr.size()); i++)

        cout << retArr[i] << "\n";

}

 

 

 

 

Poruka je uređivana zadnji put pon 21.3.2011 10:51 (kresoc).
14 godina
neaktivan
offline
Re: Pomoć oko c++ zadatka
kresoc kaže...

Ja ću samo preraditi Budimirovo rješenje tako da bude u stilu ostatka knjige:

 

 

 

Koje knjige ??

14 godina
neaktivan
offline
Re: Pomoć oko c++ zadatka

Zadatak je iz knjige "Naučite programirati uz C++"

14 godina
neaktivan
offline
Pomoć oko c++ zadatka

Treba mi mala pomoć.

Da li je moguće iz funkcije main, polje koje je već definirano i popunjeno elementima "prebaciti" u neku drugu funkciju ali bez ikakve petlje.

 

Da li je ovo točno (neću ispisati cijeli kod)

 

 

 

vector<int> Zbroj(vector<int> broj1, vector<int> broj2)

{

...

return rezultat;

}

 

int main(){    vector<int> broj1;    vector<int> broj2;        cout << "Upis 1. broja: " << endl;    for(int i=0;i<5;i++)    {       cin >> broj1[i];    }    cout << "Upis 2. broja: " << endl;    for(int i=0;i<3;i++)    {       cin >> broj2[i];    }    cout << "Zbroj dva broja je jednak " << Zbroj(broj1, broj2) << endl;}

Poruka je uređivana zadnji put čet 24.3.2011 10:42 (tblues87).
 
0 0 hvala 0
14 godina
neaktivan
offline
Pomoć oko c++ zadatka

Pa da, vector <int> je objekt tj predlozak razreda, moze biti kao parametar.

 

ali cout << Zbroj() ti ne valja.

 

Zbroj ti vraca vector, a njega moras ispisati redom iteriranjem.

 

vector <int> zbroj = Zbroj( A, B );

for ( int i = 0; i < (int)zbroj.size(); ++i )

  cout << zbroj[i] << " ";

 
0 0 hvala 1
17 godina
offline
C++ - funkcija koja prima broj i niz brojeva

Polje u funkciju prebaciš preko pokazivača na ovaj način, kao što vidiš ispis polja niz koje se nalazi u main funkciji

ima vrijednosti koje su dobijene u funkciji MnozenjeSa5(niz);

 

 

#include<iostream>

using namespace std;

 

 

void MnozenjeSa5(int *polje, int duljinaPolja)

{

for (int i=0; i<duljinaPolja; i++)

{

polje[i] *= 5;

}

}

 

int main()

{

int brojElemenata = 5;

int *niz = new int[brojElemenata];

   for(int i=0; i<brojElemenata; i++)

{

niz[i] = i+1;

}

MnozenjeSa5(niz, brojElemenata);

for(int i=0; i<5; i++)

{

cout<< niz[i] << " ";

}

delete[] niz;

}

 
0 0 hvala 0
16 godina
neaktivan
offline
Re: Pomoć oko c++ zadatka

Na ono što su dečki napisali bih nadodao ovo:

vector<int> Zbroj(vector<int> broj1, vector<int> broj2)


prebaci u

 

vector<int> Zbroj(const vector<int>& broj1, const vector<int>& broj2)

 

Pitaš se zašto? Gljučni dio ovog gore je znak &. On se odnosi na pojam REFERENCU. Jako koristan objekt u C++u, nešto slično pointeru. Kao što vjerojatno znaš, svaka funkcija kad se pokrene stvara svoje kopije objekata koje joj pošalješ kao parametre i onda s njima radi. vector<int> može biti jako velik objekt, a tebi jedino treba pristupanje pojedinom elementu kako bi ga čitao. Ovdje je bilo kakvo kopiranje bespotrebno i tu nam super dođu reference, koje su zapravo "drugo ime" za varijable. Sa const smo osigurali da će se samo čitati, a ova & označava da je to referenca (drugo ime) za objekt iz maina pa tako neće doći do bespotrebnog kopiranja, što oduzima i vrijeme i memoriju.

 

Probaj napraviti program za vektore od 10000 elemenata i testiraj ga sa funkcijom Zbroj napravljenu sa i bez referenci. Mislim da ćeš vidjeti razliku :D

http://manutd-croatia.com/forum/index.php ... forum i udruga navijača Manchester Uniteda...
17 godina
offline
C++ - funkcija koja prima broj i niz brojeva

Dobro primjećeno, ne dozvoliti manipuliranje vrijednosnim tipovima, jer oni kopiraju podatke, nego koristiti reference i pokazivače, čime se izbjegava kopiranje podataka

 

btw. primjećujem da je ta Ćosićeva knjiga dobra, uz takve zadatke uči čovjeka da razmišlja programerski.

Poruka je uređivana zadnji put čet 24.3.2011 13:54 (Floki).
 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Pomoć oko c++ zadatka

Poljem koje je definirano kao "vector" moguće je manipulirati na isti način kao i s bilo kojom drugom promjenljivom. Dakle, moguće ga je predati funkciji, kao cjelinu, i ono također može biti rezultat funkcije.

 

Nije moguće polje ispisati pomoću "cout" kao cjelinu, već je potrebno ispisivati element po element.

 

Mnoge stvari koje su se pojavile u drugim odgovorima mi se čine daleko presložene za početnike. Obično izbjegavam pokazivače i reference.

 

Edit:

Ili ovako: bolje NE koristiti reference i pokazivače, i to upravo zbog popratnih pojava koje početnik može previdjeti. Prenos po vrijednosti je sam po sebi mnogo jasniji, što je i glavni razlog zašto smo kolega Marendić i ja odabrali baš jezik C++ za tumačenje programiranja.

Poruka je uređivana zadnji put čet 24.3.2011 14:38 (kresoc).
14 godina
neaktivan
offline
Re: Pomoć oko c++ zadatka
tblues87 kaže...

     vector<int> broj1;          cout << "Upis 1. broja: " << endl;    for(int i=0;i<5;i++)    {       cin >> broj1[i];    }  

 

Još jedna greška: Ne može se ovako učitavati u polje koje je prazno.

Ili da to ovako kažem: Element broj1[i] ne postoji, jer polje ne sadržava nijedan element, jer je uvedeno kao prazno polje.

 

Dakle, ili treba navesti veličinu polja pri njegovom uvođenju, ili koristiti push_back za dodavanje elemenata u polje.

Poruka je uređivana zadnji put čet 24.3.2011 16:09 (kresoc).
14 godina
neaktivan
offline
Re: Pomoć oko c++ zadatka
kresoc kaže...
tblues87 kaže...

        vector<int> broj1;                  cout << "Upis 1. broja: " << endl;      for(int i=0;i<5;i++)      {            cin >> broj1[i];      }   

 

Još jedna greška: Ne može se ovako učitavati u polje koje je prazno.

Ili da to ovako kažem: Element broj1[i] ne postoji, jer polje ne sadržava nijedan element, jer je uvedeno kao prazno polje.

 

Dakle, ili treba navesti veličinu polja pri njegovom uvođenju, ili koristiti push_back za dodavanje elemenata u polje.

Treba se samo napraviti:

broj1.resize(5)

Poruka je uređivana zadnji put čet 24.3.2011 20:15 (Budimir).
17 godina
protjeran
offline
C++ - funkcija koja prima broj i niz brojeva

Rješenje u C++ TR1 stilu

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
 
vector<int> OdaberiManje(int elem, vector<int>  niz) {
    vector<int> ret;
    for_each(niz.begin(), niz.end(), [&ret, elem] (int i){
        if (i < elem) ret.push_back(i);
    });
    
    return ret;
}

int main() {
    cout << "Upisite broj elemenata niza:" << endl;
    int len;
    cin >> len;

    cout << "Upisite elemente niza:" << endl;
    vector <int> arr;
    for (int i = 0; i < len; ++i) {
        int x;
        cin >> x;
        arr.push_back(x);
    }

    cout << "Upisite ogranicenje:" << endl;
    int elem;
    cin >> elem;
    // Kraj Prologa
 
    vector <int> retArr = OdaberiManje(5, arr);

    for_each(retArr.begin(), retArr.end(), [](int i){ cout << i << endl;} );

    return 0;
}

 

EDIT: Ovo će raditi u VS 2010 i samo u compilerima koji imaju implementiran TR1

Programko http://programko.bloger.hr
Poruka je uređivana zadnji put pet 25.3.2011 9:32 (Programko).
 
0 0 hvala 0
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice