|
Programiranje Programski jezici, tehnike, alatke... |
|
Alatke vezane za temu | Vrste prikaza |
4.5.2011, 17:34 | #1 | |
Član
|
Dinamičko menjanje dužine niza
Imam sledeći zadatak:
Citat:
Kod:
int[] x = new int[20]; int[] y; int brojac = 0; Random nasumicanBroj = new Random(); for (int i = 0; i < x.Length; i++) { x[i] = nasumicanBroj.Next(0, 30) + 1; if(x[i] % 2 != 0) { brojac++; y = new int[brojac]; // duzina niza ce se povecavati svaki put kada se pojavi neparan broj y[brojac-1] = x[i]; } } foreach(int broj in y) { Console.WriteLine("Niz y: {0}",broj); } |
|
4.5.2011, 17:46 | #2 |
V.I.P. Zaštita
Član od: 30.9.2007.
Lokacija: Hypnos Control Room, Tokyo Metropolitan Government Building
Poruke: 5.914
Zahvalnice: 1.181
Zahvaljeno 1.320 puta na 1.094 poruka
|
Re: Dinamičko menjanje dužine niza
Ako sam te dobro shvatio hoćeš da promijeniš dužinu niza da bude <>20. Ne znam da li je to C# ili Java, ali mogu ti reći da je to u C/C++ nemoguće uraditi „jednostavnom naredbom”. Ovako bi išao C++ pseudokod za mijenjanje dužine niza (napravi kopiju, izbriši original, kopiraj kopiju u novi, izbriši kopiju):
Kod:
x = new int[n] ; . . . temp = new int[n] ; for ( i=0 ; i < n ; i++) temp[i] = x[i] ; delete [] x ; x = new int[m] ; for ( i=0 ; i < n ; i++) x[i] = temp[i] ; delete [] temp ; EDIT: Savjet, da ne bi pri svakom unošenju jednog člana niza radio veliko kopiranje, neka ti nova dužina niza bude za 5-10 duža. Naravno, ne zaboravi ubaciti i brojač koji govori koliko je niz popunjen. |
4.5.2011, 17:56 | #3 |
Član
|
Re: Dinamičko menjanje dužine niza
Potrebno je da u drugi niz stavim samo neparne brojeve. Unapred ne mogu znati koliko će neparnih brojeva biti generisano, a na osnovu promenljive "brojac" mogu da menjam dužinu tog niza u zavisnosti od toga koliko se neparnih brojeva pojavljuje, jedino je problem što kada se dužina niza promeni gubim prethodne neparne brojeve koje sam smeštao u taj niz. Inače, ovo je C#.
|
4.5.2011, 18:04 | #4 |
Starosedelac
|
Re: Dinamičko menjanje dužine niza
Imaš Array.Resize ako već insistiraš na tom pristupu.
Lakše ti je (i u ovom slučaju verovatno brže) da koristiš List<T> i samo dodaješ elemente... Array.Resize je za .net 3.5 i 4.0. Za starije frameworke, uradi kako ti je Sass Drake rekao... Ili jednostavno napravi drugi niz da bude iste dužine kao i prvi i ograniči ispis, pretpostavljam da je i to opcija... |
4.5.2011, 18:19 | #5 |
Član
|
Re: Dinamičko menjanje dužine niza
Probao sam Array.Resize i radi isto što sam i već probao sa y = new int[brojac], međutim problem je što se opet svi članovi niza resetuju na 0 svaki put kad se dužina niza promeni. Ne bih koristio nikakve "naprednije" metode jer profesor/asistent traži da radimo zadatke na osnovu njegovih tutorijala, bez obzira na to što ovakav zadatak nije pokazivao.
|
4.5.2011, 18:55 | #6 |
Starosedelac
|
Re: Dinamičko menjanje dužine niza
Nemoguće je da ne radi:
Kod:
int[] x = new int[20]; int[] y = new int[0]; int brojac = 0; Random nasumicanBroj = new Random(); for (int i = 0; i < x.Length; i++) { x[i] = nasumicanBroj.Next(0, 30) + 1; if (x[i] % 2 != 0) { brojac++; Array.Resize(ref y, brojac); y[brojac - 1] = x[i]; } } foreach (int broj in y) { Console.WriteLine("Niz y: {0}", broj); } |
Sledeći korisnik se zahvaljuje korisniku MG-RAY na korisnoj poruci: | ||
Bolton (4.5.2011) |
4.5.2011, 19:00 | #7 |
Član
Član od: 16.4.2010.
Lokacija: Pančevo
Poruke: 462
Zahvalnice: 41
Zahvaljeno 68 puta na 63 poruka
|
Re: Dinamičko menjanje dužine niza
Dužina niza ne može da se dinamički menja. Zbog toga je i uvedene klasa ArrayList koja je u stvari dinamički niz. Tako da ćeš morati ili da se odlučiš za ovu klasu ili da kreiraš još jedan niz gde ćeš svaki put da čuvaš prethodno stanje i da updejtuješ novo, ali to rešenje baš i nije praktično.
|
4.5.2011, 19:12 | #8 |
Član
|
Re: Dinamičko menjanje dužine niza
E sad radi! Našao sam grešku: nisam odredio dužinu niza (iako će ona biti 0), pre nego što sam koristio Array.Resize metod, već sam stavio da je ona y = new int[brojac]. Hvala svima na odgovorima.
|
4.5.2011, 19:12 | #9 |
V.I.P. Programiranje
Član od: 9.1.2009.
Lokacija: Beograd, Banovo Brdo
Poruke: 1.157
Zahvalnice: 83
Zahvaljeno 448 puta na 303 poruka
|
Re: Dinamičko menjanje dužine niza
ja sam jednom prilikom koristio Array.Resize u .net 2.0 projektu, tako da ne razumem zasto kazes samo za 3.5 i 4.0
i ne, array.resize ne resetuje sve na 0, ako tebi, Bolton, array.resize resetuje na 0, znaci da si negde drugde ostavio ono "= new" @Todors, ja nisam sto posto siguran sta array.resize radi u pozadini, nije me previse zanimalo, ali ono sto je bitno je rezultat pozivanja te funkcije, a to je array drugih dimenzija koje su promenjene dinamicki. e sad, dal on kreira novi pa prekopira stare vrednosti automatski ili ne, ne znam. inace, ako bas hoce da koristi obican array, ok, samo napred, al naravno da treba forsirati List<T> kad god je moguce. |
4.5.2011, 19:23 | #10 |
Starosedelac
|
Re: Dinamičko menjanje dužine niza
Označeno je da je dodat naknadno u .net 2.0, pa nisam ni primetio, ali da, u pravu si, postoji i tamo.
Inace, Array.Resize pravi novi niz, prekopira vrednosti i promeni referencu... @Bolton Zaobiđi ovaj metod ako nije neophodno da ga koristiš, kada bi pokušavao da resizeuješ niz dužine nekoliko miliona, načekao bi se... |
4.5.2011, 19:48 | #11 |
Član
Član od: 16.4.2010.
Lokacija: Pančevo
Poruke: 462
Zahvalnice: 41
Zahvaljeno 68 puta na 63 poruka
|
Re: Dinamičko menjanje dužine niza
|
4.5.2011, 19:54 | #12 |
Član
|
Re: Dinamičko menjanje dužine niza
@irreal
Da, to je i bio problem (odgovorismo u isto vreme, pa nisi stigao da pročitaš ) @MG-RAY Ovako sam morao da odradim samo zato što tako profesor traži, a i to radim za drugara kome je i ovo previše @Todors I ja se slažem! |
4.5.2011, 20:26 | #13 |
Član
Član od: 15.12.2010.
Lokacija: Beograd
Poruke: 120
Zahvalnice: 26
Zahvaljeno 39 puta na 32 poruka
|
Re: Dinamičko menjanje dužine niza
@Sass Drake
U C++-u je sasvim normalno korišćenje dinamičkih nizova i iskren da budem ja uglavnom i koristim te dinamičke koji se zovu vector. |
4.5.2011, 21:10 | #14 |
Član
Član od: 1.12.2005.
Lokacija: Batajnica
Poruke: 184
Zahvalnice: 9
Zahvaljeno 42 puta na 32 poruka
|
Re: Dinamičko menjanje dužine niza
|
5.5.2011, 9:28 | #15 | |
V.I.P. Zaštita
Član od: 30.9.2007.
Lokacija: Hypnos Control Room, Tokyo Metropolitan Government Building
Poruke: 5.914
Zahvalnice: 1.181
Zahvaljeno 1.320 puta na 1.094 poruka
|
Re: Dinamičko menjanje dužine niza
Citat:
U C-u da, ali za C++ nije baš najsrećnije rješenje. (iako će u većini slučajeva raditi sa nizovima osnovnih tipova, dok za nizove objekata baš i nisam siguran da će raditi). EDIT: Sad sam baš provjerio sa objektima koji imaju statičke podatke članove. realloc će kopirati stare članove niza, ali tokom proširivanja, konstruktori novih neće biti izvršeni, pa ako objekat ima poneki dinamički podatak član biće šta će biti. Ako se skraćuje, onda destruktori neće biti izvršeni. Poslednja ispravka: Sass Drake (5.5.2011 u 10:51) |
|
5.5.2011, 11:20 | #16 |
Član
Član od: 15.12.2010.
Lokacija: Beograd
Poruke: 120
Zahvalnice: 26
Zahvaljeno 39 puta na 32 poruka
|
Re: Dinamičko menjanje dužine niza
Ja nisam ni rekao da si TI napisao da nije normalno. Samo sam pokušao da objasnim onima koji ovo čitaju da se mogu koristiti vektori, posto vidim da si naveo kako je to u C++ nemoguće uraditi "jednostavnim komandama". Ipak ovaj forum čitaju i ljudi koji su slabije upućeni u programiranje, pa mislim da ne bi bilo dobro da steknu pogrešno mišljenje o nekim sasvim NORMALNIM i jednostavnim komandama.
|
Sledeći korisnik se zahvaljuje korisniku chaami na korisnoj poruci: | ||
Sass Drake (5.5.2011) |
5.5.2011, 11:45 | #17 | |
V.I.P. Zaštita
Član od: 30.9.2007.
Lokacija: Hypnos Control Room, Tokyo Metropolitan Government Building
Poruke: 5.914
Zahvalnice: 1.181
Zahvaljeno 1.320 puta na 1.094 poruka
|
Re: Dinamičko menjanje dužine niza
Citat:
Kad se samo sjetim koliko sam relativno kratko ostajao na labovima zahvaljujući toj magičnoj klasi. |
|
5.5.2011, 15:29 | #18 |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
Re: Dinamičko menjanje dužine niza
Mislim da ponasanje realloc-a zavisi od fragmentacije heap-a, koliko sam razumeo trebalo bi da radi inplace dodelu produzavanje (ili skracivanje) memorijskog bloka ako ima mesta za taj niz u protivnom postavlja ceo novi blok na drugo mesto. Ispravite ako gresim.
offtopic Blago vama vi ste to imali u skoli, mojom krivicom ja to nisam jer sam se zaj**vao u to vreme (idiot). Pa sad kad sam omatorio (relativno) odlucio sam se da mi C++ bude hobi pa mi ucenje ide sporije nego vama, ali ipak mi se svidja ukus zadovoljstva svaki put kad naucim nesto novo i funkcionalno pored muke citanja tudjeg koda i knjiga na engleskom jeziku. S'obzirom da imam veoma lose drustvo ja sam dobro prosao i C++ mi dodje kao dobra terapija. |
5.5.2011, 16:02 | #19 |
V.I.P. Zaštita
Član od: 30.9.2007.
Lokacija: Hypnos Control Room, Tokyo Metropolitan Government Building
Poruke: 5.914
Zahvalnice: 1.181
Zahvaljeno 1.320 puta na 1.094 poruka
|
Re: Dinamičko menjanje dužine niza
^ Mislim da je baš problem u tome, što radi samo to, dok konstruktori i destruktori ostaju neizvršeni što je u C++ ne čini pogodnom.
offtopic: Ja sam to učio na faksu. |
29.10.2011, 13:50 | #20 |
Starosedelac
|
Re: Dinamičko menjanje dužine niza
Ja sam takve zadatke imao u srednjoj skoli
A ovo vase je, zasto jednostavno kad moze komplikovano Kod:
#include<stdio.h> main() { int x[20],y[20],i,j=0,n; printf("Unesite n");//n-proizvoljan broj od 1 do 20 scanf("%d",&n); printf("Unesite brojeve od 1-30"); for(i=0;i<n;i++) scanf("%d",&x[i]); for(i=0;i<n;i++) if(x[i]%2==1) { y[j]=x[i]; j++; } for(i=0;i<j;i++) printf("%d",y[i]); } |
Bookmarks sajtovi |
|
|