Zamjena 1. i zadnjeg člana niza - ne radi za parne

poruka: 13
|
čitano: 2.277
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
6 godina
neaktivan
offline
Zamjena 1. i zadnjeg člana niza - ne radi za parne

treba napisati funkciju koja zamijeni prvi i zadnji član unesenog niza.

 

oči su mi ispale koliko gledam ovo ,ali ne vidim zašto ne radi kako treba:

- kad unesem neparni broj članova niza n ( npr 3 ili 5 članova) program radi normalno - ispisuje zamijenjen 1. i zadnji član

- ali kad unesem niz sa 2, 4, ili 6 članova onda ispisuje niz kako je unesen - tj. ne zamijeni ih

 

 

#include <iostream>
using namespace std;

void ispremjesa (int x1[], int n1) {
    int temp;
        for(int i=1; i<=n1; i++)
        {
            temp=x1[1]; // zamjena 1. i zadnjeg člana niza 
            x1[1]=x1[n1];
            x1[n1]=temp; 
        }
        for(int i=1; i<=n1; i++)
        cout<<x1[i]; // niz u funkciji = x1[], a u mainu = x[]
}
int main() {
    int n;
    cin >>n;
    int x[n];
        for(int i=1; i<=n; i++)
        {
            cout<<"unesi broj "<<i <<". ";
            cin >>x[i];
        }
  ispremjesa (x, n) ;
}

Poruka je uređivana zadnji put ned 30.9.2018 21:35 (Tomo22).
 
0 0 hvala 0
9 godina
offline
Zamjena 1. i zadnjeg člana niza - ne radi za parne

Pokušaj ovako nešto:

https://pastebin.com/raw/qKszQGMs

 
0 0 hvala 0
6 godina
neaktivan
offline
Zamjena 1. i zadnjeg člana niza - ne radi za parne

sličan tip zadatka (funkcija koja radi nešto s članovima niza) - isto se čudno ponaša, vjerujem da je isti tip greške ali je ne vidim nikako?

 

Funkcija treba vratiti koliko u nizu od n brojeva ima parnih, a koliko neparnih

 

iako sam unio konkretan broj članova niza n, program nekad traži unos više članova,

ili vraća izračun nakon unesenog manjeg od n??

 

output na kraju

 

 

#include <iostream>
using namespace std;

void par_nepar (int x1[], int n1) {
    int par=0,nep=0;   
        for(int i=1; i<=n1; i++)
        {
           if (x1[i]%2) nep++;
           else par++;
        }
        cout<<par<<", "<<nep;
}
int main() {
    int n, x[n];
    cin >>n;
    for(int i=1; i<=n; i++)
        {
            cout<<"unesi broj "<<i <<". ";
            cin >>x[i];
        }
  par_nepar (x,n) ;

}

 
0 0 hvala 0
6 godina
neaktivan
offline
Re: Zamjena 1. i zadnjeg člana niza - ne radi za p
0x4c756b61 kaže...

Pokušaj ovako nešto:

https://pastebin.com/raw/qKszQGMs

 Hvala, to radi, ali zadatak trebam riješiti funkcijom koja se poslije poziva u main, i to što jednostavnije (*pokazivače još ne kužim najbolje)

 

I jako me zanima radi boljeg razumijevanja da skužim gdje sam napravio grešku u mom kodu?

9 godina
offline
Re: Zamjena 1. i zadnjeg člana niza - ne radi za p

Ne znam koji kompajler koristiš, ali ovo se ne bi trebalo ni kompajlirati:

 

int n;
cin >> n;
int x[n];

 

(Ne može kompajler alocirati n mjesta u polju x, ako je n nepoznat)

 

Zatim petljom prolaziš kroz niz počevši od indeksa 1 do n, umjesto od 0 do (n - 1).
Isto to radiš i u funkciji. Mijenjaš 2. broj po redu za nepostojeći (n + 1).

 

 

Poruka je uređivana zadnji put ned 30.9.2018 22:45 (0x4c756b61).
9 godina
offline
Re: Zamjena 1. i zadnjeg člana niza - ne radi za p
Je li nesto propustam ali nije mi jasno zašto se ovo ponavlja n1 puta.

temp=x1[1];
x1[1]=x1[n1];
x1[n1]=temp;
 
0 0 hvala 1
6 godina
neaktivan
offline
Re: Zamjena 1. i zadnjeg člana niza - ne radi za p
LunKraljPonoci kaže...
Je li nesto propustam ali nije mi jasno zašto se ovo ponavlja n1 puta.

temp=x1[1];
x1[1]=x1[n1];
x1[n1]=temp;

da imaš pravo, to je ustvari nepotrebno - mogu u funkciji zamjenu 1. i n-tog izvršiti i bez petlje: http://cpp.sh/3v4yc

 

Poruka je uređivana zadnji put pon 1.10.2018 10:52 (Tomo22).
6 godina
neaktivan
offline
Re: Zamjena 1. i zadnjeg člana niza - ne radi za p
0x4c756b61 kaže...

Ne znam koji kompajler koristiš, ali ovo se ne bi trebalo ni kompajlirati:

 

int n;
cin >> n;
int x[n];

 

(Ne može kompajler alocirati n mjesta u polju x, ako je n nepoznat)

int x[n] dolazi nakon što se učita n - zar nije onda n poznat, ili se ne gleda tako?

 

Ako ne, kako onda deklariram x[n]? (ako stavim prazno x[], vraća "error: storage size of 'x' isn't known")

Moram staviti neki otprilike broj - recimo x[100] ili kako?


(koristim c++ shell online: http://cpp.sh/3krc6)

 

 

> Zatim petljom prolaziš kroz niz počevši od indeksa 1 do n, umjesto od 0 do (n - 1).

> Isto to radiš i u funkciji. Mijenjaš 2. broj po redu za nepostojeći (n + 1).

 

da, zaboravio sam da je prvi član niza uvijek x[0]   -  je li onda ovako ok? (izmjene označene)

 

#include <iostream>
using namespace std;

void ispremjesa (int x1[], int n1) {
    int temp;
            temp=x1[0]; // zamjena 1. i zadnjeg člana niza
           x1[0]=x1[n1-1];
            x1[n1-1]=temp;
        for(int i=0; i<n1; i++)
        cout<<x1[i]; // niz u funkciji = x1[], a u mainu = x[]
}
int main() {
    int n;
    cin >>n;
    int x[100];
        for(int i=0; i<n; i++)
        {
            cout<<"unesi broj "<<i+1 <<". ";
            cin >>x[i];
        }
  ispremjesa (x, n) ;
}

 

 

 

 

 

 

-

Poruka je uređivana zadnji put pon 1.10.2018 11:47 (Tomo22).
9 godina
offline
Re: Zamjena 1. i zadnjeg člana niza - ne radi za p

Sad je u redu, ali je polje fiksne veličine (100) i u funkciju šalješ kopiju niza (pass-by-value).

Ako pokušaš ispisati niz u mainu umjesto u funkciji, vidjet ćeš da je niz ostao nepromijenjen.

 

Rješenje su dinamičko alociranje memorije i pokazivači/reference.

 

Druga opcija je da koristiš neku kolekciju tipa vector, ako ti nije poznata veličina niza.

Primjer: https://pastebin.com/SYsAHA1q

6 godina
neaktivan
offline
Re: Zamjena 1. i zadnjeg člana niza - ne radi za p
0x4c756b61 kaže...

Sad je u redu, ali je polje fiksne veličine (100) i u funkciju šalješ kopiju niza (pass-by-value).

Ako pokušaš ispisati niz u mainu umjesto u funkciji, vidjet ćeš da je niz ostao nepromijenjen.

 

Rješenje su dinamičko alociranje memorije i pokazivači/reference.

> ali je polje fiksne veličine (100)

 

kako onda da ga drugačije deklariram, ako ne smijem staviti x[n]? (ako stavim prazno x[], vraća "error: storage size of 'x' isn't known")

 

 

> Rješenje su dinamičko alociranje memorije i pokazivači/reference.

 

Znam kako upotrijebiti ref. za običnu varijablu u funkciji koju ću poslije pozvati, tako da zadrži vrijednost

ali kad to pokušam ovdje - gdje je varijabla niz (polje), javlja grešku - kako ću onda?

 

void ispremjesa (int &x1[], int &n1) {
    int temp;
            temp=x1[0]; // zamjena 1. i zadnjeg člana niza
           x1[0]=x1[n1-1];
            x1[n1-1]=temp;
        for(int i=0; i<n1; i++)
        cout<<x1[i]; // niz u funkciji = x1[], a u mainu = x[]
}

 

 

9 godina
offline
Zamjena 1. i zadnjeg člana niza - ne radi za parne

3 su rješenja kojih se ja mogu sjetiti:

 

1) dinamičko polje - kao što sam ti dao primjer u prvom odgovoru - https://pastebin.com/raw/qKszQGMs

2) kolekcija tipa vector - kao što sam ti dao primjer u zadnjem odgovoru - https://pastebin.com/SYsAHA1q

3) koristi polje fiksne veličine kao do sad ali ograniči unos, npr. nešto ovako - https://pastebin.com/raw/2GGNgKAW

 

Drugo pitanje:

Proslijedi pokazivač na prvi element u polju i broj elemenata, kako bi znao gdje završava.

https://pastebin.com/raw/Hj3ZktxU

 

 

 
0 0 hvala 1
6 godina
neaktivan
offline
Re: Zamjena 1. i zadnjeg člana niza - ne radi za p
0x4c756b61 kaže...

3) koristi polje fiksne veličine kao do sad ali ograniči unos, npr. nešto ovako - https://pastebin.com/raw/2GGNgKAW

 

 

gledam to, možeš objasniti kako je ovdje ograničen unos?

 

#include <iostream>
using namespace std;

int main() {

   int n;
   cin >> n;

   int brojevi[100];

   // unos
   for (int i = 0; i < n; i++) {
      cout << "Unesi " << (i + 1) << ". broj: ";
      cin >> brojevi[i];
   }

   // zamjena
   swap(brojevi[0], brojevi[n - 1]);

   // ispis
   for (int i = 0; i < n; i++) {
      cout << brojevi[i];
   }

   return 0;
}

11 godina
offline
Re: Zamjena 1. i zadnjeg člana niza - ne radi za p

Trebao bi provjerit da je n<=100 i javit gresku ako nije, jer je polje ograniceno na max 100 elemenata.
Ja ne znam kako tebi izraz 'int x[n]' uopce kompajlira. VS2017 baca gresku...

> int x[n] dolazi nakon što se učita n - zar nije onda n poznat, ili se ne gleda tako?
Memorija za obicno polje se alocira tijekom kompajliranja od strane kompajlera - kompajler mora znati velicinu polja prije nego se program uopce izvrsava.

1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice