Gdje su greške u ovom C++ kodu?

poruka: 14
|
čitano: 4.468
|
moderatori: XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
14 godina
neaktivan
offline
C++ pomoć

Molim vas ako mi netko može reći što je krivo u ovom kodu:

 

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

int main()
{
    int k;
    vector<int> brojevi;

    cout << "Upisite jedan cijeli broj koji veci ili jednak nuli i manji ili jednak devet: " << endl;
    cin >> k;
    if(k<0 || k>9)
    {
       cout << "Unesli ste nedopusteni broj, unesite ponovo broj: ";
       cin >> k;
    }
    cout << endl;
    cout << "Zapocinje unos od 10 brojeva." << endl;
    cout << endl;
   
    int i=0;
    while (i!=k) 
    {
       cout << "Unesite " << i+1 << ". broj: ";
       brojevi.push_back(i);
       cin >> brojevi[i];
       i++;
    }
    brojevi.pop_back();

    i=k-1;
    do {
       i++;
       cout << "Unesite " << i+1 << ". broj: ";
       brojevi.push_back(i);
       cin >> brojevi[i];
       }
    while(i<10);
}

 

inače zadatak ide ovako:

Napišite program koji sa standardnog ulaza najprije učitava jedan cijeli broj, nazovimo ga k, veći ili jednak nuli i
manji ili jednak 9. Zatim naka program učitava deset brojeva u neko polje. Neka program zatim izbaci iz polja e
element na indeksu odnosno položaju k. Naposljetku, ispisati novodobiveno polje koje sada sadržava devet elemenata.

 

Ovako:

prvu petlju mi program izvrti sve dok i=k, kada je to istina izađe iz petlje te ukloni posljednji element polja "brojevi", zatim bi trebao ući u novu petlju i sve je dobro

dok ne trebam unesti sljedeći broj tada mi javi error.

 

Učim programirati po knjizi pa sam malo zapeo, drugačije ideje za riješiti zadatak dobrodošle.

Hvala.

 
0 0 hvala 0
17 godina
neaktivan
offline
C++ pomoć

uff, za početak miješaš kad treba koristiti for, kada while. Zato ti je kod grozan za citati. Nemoj se uvrijediti niti obeshrabriti, i ja sam kad sam pocinjao pisao strahote. :D

Idem sad kopirati to u VS pa ti javim problem.

 
0 0 hvala 0
14 godina
offline
C++ pomoć

#include <iostream>
using namespace std;

int main(){

    int k;
    int niz[10];

    do{
        cin >> k;
    }while(k>9 || k <0);

    cout << "Upisite 10 brojeva:" << endl;

    for(int i = 0 ; i < 10 ; ++i) cin >> niz[i];

    cout << "element na indexu "<<k<<" je jednak:" << niz[k] << endl;

    cout << "NOVO POLJE:" << endl;

    for(int i = 0 ; i < 10 ; ++i) if(i != k ) cout << niz[i] << " ";

    cout << endl;

return 0;
}

 

EDIT:Nije mi baš jasno što si ti pokušavao,evo kako bi to ja rješio :)


Inteligencija nije znanje,već mašta
Poruka je uređivana zadnji put uto 15.3.2011 0:03 (KKristijan).
 
0 0 hvala 0
17 godina
neaktivan
offline
C++ pomoć

Kristijan ne valja ti jer ga mora maknuti iz polja, ne samo ga preskociti u ispisu.

 

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

int main()
{
    int k;
    vector<int> brojevi;

    cout << "Upisite jedan cijeli broj koji veci ili jednak nuli i manji ili jednak devet: " << endl;
    cin >> k;
    while (k<0 || k>9)//if(k<0 || k>9)
    {
       cout << "Unesli ste nedopusteni broj, unesite ponovo broj: ";
       cin >> k;
    }
    cout << endl;
    cout << "Zapocinje unos od 10 brojeva." << endl;
    cout << endl;
    brojevi.resize(10);
    for (int i=0; i<10;++i)//while (i!=k)
    {
       cout << "Unesite " << i+1 << ". broj: ";
       //  brojevi.push_back(i);
       cin >> brojevi[i];
       //i++;
    }
    for (int i=k;i<9;++i)
       brojevi[i]=brojevi[i+1];

    brojevi.pop_back();

  
}

Poruka je uređivana zadnji put uto 15.3.2011 0:04 (Zoidberg).
 
0 0 hvala 1
14 godina
neaktivan
offline
Re: C++ pomoć

Hvala za primjer riješenja ali stvar je u tome da pratim knjigu pa je poglavlje u kojem je zadatak o ubacivanju i izbacivanju elemenata iz polja.

Ja sam išao ovim načinom razmišljanj (možda sam u krivu):

 

1. Učitati broj između 0 i 9

2. Petlju while sam upotrijebio jer mi naredba "brojevi.pop_back()" iz polja izbacuje zadnji element, pa se ona vrti dok "i" što predstavlja indeks elementa polja dok ne bude jednak sa "k" te se taj element mora izbaciti iz polja.

3. Dalje sam upotrijebio for da završim unos brojeva do kraja ali tu je problem koji sam i prije naveo.

 

Poruka je uređivana zadnji put uto 15.3.2011 0:18 (tblues87).
14 godina
neaktivan
offline
Re: C++ pomoć

Hvala

Poruka je uređivana zadnji put uto 15.3.2011 0:22 (tblues87).
17 godina
neaktivan
offline
Re: C++ pomoć
tblues87 kaže...

Hvala za primjer riješenja ali stvar je u tome da pratim knjigu pa je poglavlje u kojem je zadatak o ubacivanju i izbacivanju elemenata iz polja.

Ja sam išao ovim načinom razmišljanj (možda sam u krivu):

 

1. Učitati broj između 0 i 9

2. Petlju while sam upotrijebio jer mi naredba "brojevi.pop_back()" iz polja izbacuje zadnji element, pa se ona vrti dok "i" što predstavlja indeks elementa polja dok ne bude jednak sa "k" te se taj element mora izbaciti iz polja.

3. Dalje sam upotrijebio for da završim unos brojeva do kraja ali tu je problem koji sam i prije naveo.

 

A gle možeš to i sa for. Uglavnom praksa je da je for kada znaš koliko češ puta nešto raditi(nije bitno jel to konstantan broj ili varijabla k ) a while kada "čekaš nešto". Tipa da korisnik upiše 'X' ili tako nešto.

A rješenje ti je krivo jer kaže neka program učita 10 brojeva, zatim izbaci.... Ti ne učitaš 10 brojeva pa iz izbaciš, nego izbaciš prije nego učitaš 10 brojeva.

 

EDIT: jedna moguca greška je što iteriraš do 9(<10) na kraju a smanjio si dimenzije na 9, dakle max index je 8, ne 9

Poruka je uređivana zadnji put uto 15.3.2011 0:45 (Zoidberg).
14 godina
neaktivan
offline
Re: C++ pomoć

Moram priznati da mi je veliko zadovoljstvo vidjeti da netko čita moju knjigu i da se interesira za rješenja zadataka. Nadam se da vam se knjiga svidjela, barem do sada.

 

U poglavlju koje trenutačno čitate zaboravili smo napomenuti da su zadaci koji su dani na kraju tog poglavlja dosta teški, pa ako neki zadatak ne možete riješiti najbolje je da ga preskočite. Ipak, dobro je da bar pokušate riješiti navedene zadatke. Zadatak koji pokušavate riješiti je najlakši od svih 7 danih, dakle, ostali su zaista, zaista teški.

 

Osim toga, da budem točan i ispravim sam sebe, nije uopće riječ o zadacima. Zadaci su označeni drugačije. Te upute na kraju poglavlja zovu se "Ideje za programe". Razlog je taj što mi se čini bezobraznim navoditi gomilu zadataka koje bi čitatelj, tobože, morao riješiti da bi mogao nastaviti čitati knjigu.

 

Kao što je napomenuto u ranijem poglavlju, zadatak može ograničiti dozvoljene oblike unosa. Zato na početku programa nije potrebno provjeravati je li broj k zaista između 0 i 9, s obzirom da zadatak izričito navodi da će taj broj biti upravo takav.

 

Ideja zadatka je da program učita 10 brojeva sa standardnog ulaza u polje. Dakle, da se ne 'preskače' učitavanje nekog broja, nego da se zadani broj naknadno izbaci iz polja, nakon što se svi brojevi učitaju na uobičajen način.

 

Ovaj zadatak (i idući) je jedan od rijetkih zadataka u knjizi gdje se od čitatelja ne traži samo da pronađe točno rješenje, već i da pri tome poštuje proceduru kako je opisana u zadatku. Poanta zadatka je da čitatelj pokuša dokučiti kako se iz polja može "izbaciti" broj. To znanje trebalo bi biti korisno pri rješavanju 3. i 4. zadatka istog poglavlja.

 

U priloženom rješenju ima dosta grešaka.

 

Deset brojeva u polje preporučujem učitati na jedan od sljedeća dva načina. Prvi način (kako je napravljeno u poglavlju "Polja") je da se unaprijed zada veličina polja:

 

vector<double> brojevi(10);

 

cout << "Upisite 10 brojeva: " << endl;

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

    cin >> brojevi[i];       

 

 

Drugi način je da se polje popunjava brojevima. Primjer toga nije eksplicitno dan, ali se vrlo sličan kod nalazi u poglavlju ''Ubaci i izbaci":

 

vector<double> brojevi;

double ulaz;

 

 

cout << "Upisite 10 brojeva: " << endl;

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

    {

    cin >> ulaz;

    brojevi.push_back(ulaz);  

    }

 

Također preporučujem, da biste ustanovili što s programom "ne valja", da pokušate koristiti istrebljivač. U ovom slučaju, konkretna greška zbog koje se program sruši je da u drugoj petlji, naredba "i++" mora ići na kraju petlje.

 

I još jedna mala greška u programu koji ste priložili je da ste polje brojeva uveli kao

vector<int> brojevi;

, a nigdje u zadatku se ne govori da će brojevi na standardnom ulazu biti cijeli.

 

I na kraju programa treba ispisati novodobiveno polje.

 

I još, iako to u zadataku nije eksplicitno navedeno, mislio sam da će biti jasno da broj k indeksira polje počevši od 0. Dakle, ako je k jednak 3, onda zapravo treba izbaciti četvrti broj iz polja, ako je k jednak nula onda prvi, ako je k jednak 9 onda deseti.

 

Jedna moja greška. 3. i 4. zadatak iz tog poglavlja bolje glase ovako:

 

·      Napišite program koji sa standardnog ulaza učitava 9 brojeva, te ispisuje peti najmanji.

 

·      Napišite program koji sa standardnog ulaza učitava 14 brojeva, te ispisuje sedmi najmanji.

 

 

I za kraj, kada biste baš željeli zadatak riješiti baš na način kako ste vi to zamislili, tada bi se to trebalo napisati ovako:

 

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

int main()
{
    int k;
    vector<double> brojevi(10);

    cout << "Upisite jedan cijeli broj koji veci ili jednak nuli i manji ili jednak devet: " << endl;
    cin >> k;   
    cout << endl;
    cout << "Zapocinje unos od 10 brojeva." << endl;
    cout << endl;
   
    for (int i=0;i<k;i++)                         
        cin >> brojevi[i];       
       
    for (int i=k-1;i<9;i++)             
        cin >> brojevi[i];       

    cout << "Unos bez " << k << "-tog elementa: " << endl;
    for (int i=0;i<9;i++)                         
        cout << brojevi[i] << endl;                       
}
Još jednom napominjem da ovo nije ispravno rješenje zadatka, već samo rješenje na način kako ste vi zadatak shvatili. KKristijanovo rješenje također ne mogu prihvatiti. Što se ispravnog rješenja tiče, to ostavljam vama. Osim toga, ne bi uopće bilo zabavno da kažem baš sve...
 
Nadam se da će vam knjiga biti zabavna i zanimljiva.
 
Kreso

 

Poruka je uređivana zadnji put uto 15.3.2011 11:33 (kresoc).
14 godina
neaktivan
offline
Gdje su greške u ovom C++ kodu?

Opet sam zapeo na jednom zadatku pa ako netko može pomoći.

 

Zadatak ide ovako:

 

Napišite program koji sa standardnog niza učitava 10 brojeva, pa ispisuje koliko je u tom nizu dug najdulji rastući podniz uzastopnih elemenata. Ako ima više takvih podnizova iste duljine, odabrati prvoga.Također neka ispisuje i položaje prvog i posljednjeg elementa pronađenog najduljeg niza.

 

Napisao sam kako dobiti najdulji rastući niz ali neznam kako dobiti indekse polje prvog i zadnjeg elementa tog najduljeg rastućeg podniza.

 

Ovo sam napravio dosada:

 

#include <iostream>#include <vector>#include <iomanip>using namespace std;int main(){    vector<double> brojevi(10);    vector<double> pom_polje;    int k=8;    cout << "Zapocinje unos od 10 brojeva.";    cout << endl;    for (int i=0;i<10;i++)                            //učitavanje brojeva   {       cout << "Unesite " << setw(2) << i+1 << ". broj: ";       cin >> brojevi[i];    }    for (int i=0;i<9;i++)   // brojenje unaprije, od indeks polja brojevi 0 do 8   {          pom_polje.push_back(0);          if (brojevi[i]+1==brojevi[i+1])               {             int j=i             while j!=9 && brojevi[j]+1==brojevi[j+1]             {                   pom_polje[i]++;                   j++;             }             pom_polje[i]++;          }    }    for (int i=9;i>0;i--)                      // brojanje unazad, od indeksa polja brojevi 9 do 1   {       k++;       pom_polje.push_back(0);       if(brojevi[i]+1==brojevi[i-1])       {          int j=i;          while (j!=0 && brojevi[j]+1==brojevi[j-1])          {             pom_polje[k]++;             j--;          }          pom_polje[k]++;       }    }    int brojElemenata = int (pom_polje.size());    double najveci=pom_polje[0];    for (int i=0;i<brojElemenata;i++)       if (pom_polje[i]>najveci)          najveci=pom_polje[i];   cout << endl;    cout << "Najdulji rastuci niz je niz od " << najveci << " broja/brojeva." << endl;

 

Hvala.

Poruka je uređivana zadnji put čet 17.3.2011 12:56 (tblues87).
 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Gdje su greške u ovom C++ kodu?

Evo rješenja tog zadatka, koje namjeravamo objaviti zajedno s još nekim rješenjima i dopunama:

 

 

#include <iostream>

#include <vector>

using namespace std;

 

int main()

{

    vector<double> podatci(10);

 

    cout << "Upisite 10 brojeva: " << endl;

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

        cin >> podatci[i];       

 

    int prvi=0;

    int duljina=1;

 

    int prviNajduljeg=prvi;

    int duljinaNajduljeg=duljina;

 

    for (int i=1;i<10;i++)

        {

        if (podatci[i]>podatci[i-1])

            duljina++;

        else{

            prvi=i;

            duljina=1;

            }

        if (duljina>duljinaNajduljeg)

            {

            prviNajduljeg=prvi;

            duljinaNajduljeg=duljina;

            }

        }

 

    cout << "Najdulji rastuci podniz dug je " << duljinaNajduljeg

         << " elemenata. " << endl;

    cout << "Proteze se od " << prviNajduljeg+1 << ". elementa" << endl;

    cout << "pa do " << prviNajduljeg+duljinaNajduljeg

         << ". elementa." << endl;

}

Poruka je uređivana zadnji put čet 17.3.2011 17:11 (kresoc).
14 godina
neaktivan
offline
Re: Gdje su greške u ovom C++ kodu?

Gledajući originalni program:

 

što se tiče sintagme "podniz uzastopnih elemenata", to se misli na neprekinuti podniz, dakle elementi su jedan pored drugog, a ne na to da vrijednosti tih elemenata moraju biti 'uzastopne'.

 

Ali to je minorno.

 

Nego, nakon što petlja za "brojenje unaprijed" pobroji dulinu podniza počevši od svakog mogućeg mjesta, onda mi dalje nije baš jasno čemu služi iduća for petlja.

 

Na kraju, algotiram najveće vrijednosti pronađe najdulji niz. To je OK.

 

Samo onda, za ispisivanje duljine, trebali je još zapamtiti i gdje je taj maksimum. Npr:

 

int pozicijaNajveceg;

 

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

    if (pom_polje[i]>najveci)

        {         

        najveci=pom_polje[i];

        pozicijaNajveceg=i;

        }

 

cout << "Pocetak:" << pozicijaNajveceg+1 << "  , a kraj: "  << pozicijaNajveceg+najveci << endl;

 

 

14 godina
neaktivan
offline
Re: Gdje su greške u ovom C++ kodu?

Kad sam već to napisao, odmah da napomenem da je tu istu stvar "uobičajenije" napisati ovako:

 

int pozicijaNajveceg=0;

 

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

    if (pom_polje[i]>pom_polje[pozicijaNajveceg])

        pozicijaNajveceg=i;

 

cout << "Pocetak:" << pozicijaNajveceg+1 << "  , a kraj: "  << pozicijaNajveceg+pom_polje[pozicijaNajveceg] << endl;

14 godina
neaktivan
offline
Re: Gdje su greške u ovom C++ kodu?

Ovako sam ja shvatio sintagmu "podniz uzastopnih elemenata":

 

- nakon što se unese polje od 10 elemenata pronalazi se najveći rastući podniz uzastopnih elemenata dakle npr.

      [0] = 1

      [1] = 2

      [2] = 3

        ...

 

   ovo je rastući niz uzastopnih elemenata

 

- ali sam razmišljao da rastući niz uzastopnih elemenata može biti

 

    [0] = 3

    [1] = 2

    [2] = 1

 

i zato samo stavio drugu for petlju da gleda rastuće  uzastopne nizove suprotno od prve petlje

14 godina
neaktivan
offline
Re: Gdje su greške u ovom C++ kodu?

'Podniz' je dio niza koji se može dobiti preskakanjem nekih elemenata.

 

http://sr.wikipedia.org/sr-el/%D0%9F%D0%BE%D0%B4%D0%BD%D0%B8%D0%B7

 

Podniz uzastopnih elemenata dobijemo tako da zadamo njegov početni i završni element, a on sadržava i sve elemente između ta dva navedena.

 

Ako uzmemo niz, s označenim pozicijama poviše::

 

1 2 3 4 5 6 7 8 9 10

3 6 4 2 7 8 9 2 5 7

 

Onda su ponizovi uzastopnih elemenata npr:

od 2. do 8. elementa

od 4. do 7. elementa

od 8. do 10. elemnta

 

Drugi i treći od tih podnizova su rastući. A drugi podniz je najdulji rastući.

 

 

 

1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice