Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje
Uputstvo Članstvo Kalendar Današnje poruke Pretraži

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 4.5.2011, 17:34   #1
Bolton
Član
 
Član od: 16.6.2006.
Lokacija: Surčin
Poruke: 434
Zahvalnice: 19
Zahvaljeno 117 puta na 89 poruka
Slanje poruke preko Skypea korisniku Bolton
Question Dinamičko menjanje dužine niza

Imam sledeći zadatak:
Citat:
U niz x[20] unose se slucajni brojevi od 1-30. U niz y upisati samo neparne brojeve. Ispisati niz y.
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);
            }
Svaki put kada se poveća dužina niza njegovi članovi se resetuju na 0. Kako je moguće dinamički menjati dužinu niza a da se ne brišu njegovi članovi? Da li postoji neki drugi (jednostavan) način kako se ovaj zadatak može rešiti?
Bolton je offline   Odgovor sa citatom ove poruke
Stara 4.5.2011, 17:46   #2
Sass Drake
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
Određen forumom 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 ;
Ako negdje ima greška, recite.

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.
Sass Drake je offline   Odgovor sa citatom ove poruke
Stara 4.5.2011, 17:56   #3
Bolton
Član
 
Član od: 16.6.2006.
Lokacija: Surčin
Poruke: 434
Zahvalnice: 19
Zahvaljeno 117 puta na 89 poruka
Slanje poruke preko Skypea korisniku Bolton
Određen forumom 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#.
Bolton je offline   Odgovor sa citatom ove poruke
Stara 4.5.2011, 18:04   #4
MG-RAY
Starosedelac
 
Član od: 15.2.2006.
Lokacija: Midlands
Poruke: 1.523
Zahvalnice: 277
Zahvaljeno 307 puta na 207 poruka
Slanje poruke preko Skypea korisniku MG-RAY
Određen forumom 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...
MG-RAY je offline   Odgovor sa citatom ove poruke
Stara 4.5.2011, 18:19   #5
Bolton
Član
 
Član od: 16.6.2006.
Lokacija: Surčin
Poruke: 434
Zahvalnice: 19
Zahvaljeno 117 puta na 89 poruka
Slanje poruke preko Skypea korisniku Bolton
Određen forumom 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.
Bolton je offline   Odgovor sa citatom ove poruke
Stara 4.5.2011, 18:55   #6
MG-RAY
Starosedelac
 
Član od: 15.2.2006.
Lokacija: Midlands
Poruke: 1.523
Zahvalnice: 277
Zahvaljeno 307 puta na 207 poruka
Slanje poruke preko Skypea korisniku MG-RAY
Određen forumom 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);
            }
MG-RAY je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku MG-RAY na korisnoj poruci:
Bolton (4.5.2011)
Stara 4.5.2011, 19:00   #7
Todors
Član
 
Član od: 16.4.2010.
Lokacija: Pančevo
Poruke: 462
Zahvalnice: 41
Zahvaljeno 68 puta na 63 poruka
Određen forumom 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.
Todors je offline   Odgovor sa citatom ove poruke
Stara 4.5.2011, 19:12   #8
Bolton
Član
 
Član od: 16.6.2006.
Lokacija: Surčin
Poruke: 434
Zahvalnice: 19
Zahvaljeno 117 puta na 89 poruka
Slanje poruke preko Skypea korisniku Bolton
Određen forumom 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.
Bolton je offline   Odgovor sa citatom ove poruke
Stara 4.5.2011, 19:12   #9
irreal
V.I.P. Programiranje
 
Član od: 9.1.2009.
Lokacija: Beograd, Banovo Brdo
Poruke: 1.157
Zahvalnice: 83
Zahvaljeno 448 puta na 303 poruka
Određen forumom 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.
irreal je offline   Odgovor sa citatom ove poruke
Stara 4.5.2011, 19:23   #10
MG-RAY
Starosedelac
 
Član od: 15.2.2006.
Lokacija: Midlands
Poruke: 1.523
Zahvalnice: 277
Zahvaljeno 307 puta na 207 poruka
Slanje poruke preko Skypea korisniku MG-RAY
Određen forumom 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...
MG-RAY je offline   Odgovor sa citatom ove poruke
Stara 4.5.2011, 19:48   #11
Todors
Član
 
Član od: 16.4.2010.
Lokacija: Pančevo
Poruke: 462
Zahvalnice: 41
Zahvaljeno 68 puta na 63 poruka
Određen forumom Re: Dinamičko menjanje dužine niza

Citat:
irreal kaže: Pregled poruke
inace, ako bas hoce da koristi obican array, ok, samo napred, al naravno da treba forsirati List<T> kad god je moguce.
Potpuno se slažem!
Todors je offline   Odgovor sa citatom ove poruke
Stara 4.5.2011, 19:54   #12
Bolton
Član
 
Član od: 16.6.2006.
Lokacija: Surčin
Poruke: 434
Zahvalnice: 19
Zahvaljeno 117 puta na 89 poruka
Slanje poruke preko Skypea korisniku Bolton
Post 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!
Bolton je offline   Odgovor sa citatom ove poruke
Stara 4.5.2011, 20:26   #13
chaami
Član
 
Član od: 15.12.2010.
Lokacija: Beograd
Poruke: 120
Zahvalnice: 26
Zahvaljeno 39 puta na 32 poruka
Određen forumom 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.
chaami je offline   Odgovor sa citatom ove poruke
Sledećih 2 korisnika se zahvaljuje korisniku chaami na korisnoj poruci:
Belphegor (4.5.2011), zokocx (5.5.2011)
Stara 4.5.2011, 21:10   #14
enaB
Član
 
Član od: 1.12.2005.
Lokacija: Batajnica
Poruke: 184
Zahvalnice: 9
Zahvaljeno 42 puta na 32 poruka
Određen forumom Re: Dinamičko menjanje dužine niza

Citat:
Sass Drake kaže: Pregled poruke
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”.
Moguće je, postoji funkcija realloc();
enaB je offline   Odgovor sa citatom ove poruke
Stara 5.5.2011, 9:28   #15
Sass Drake
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
Određen forumom Re: Dinamičko menjanje dužine niza

Citat:
chaami kaže: Pregled poruke
@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.
Gdje sam ja napisao da nije normalno?

Citat:
enaB kaže: Pregled poruke
Moguće je, postoji funkcija realloc();
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)
Sass Drake je offline   Odgovor sa citatom ove poruke
Stara 5.5.2011, 11:20   #16
chaami
Član
 
Član od: 15.12.2010.
Lokacija: Beograd
Poruke: 120
Zahvalnice: 26
Zahvaljeno 39 puta na 32 poruka
Određen forumom Re: Dinamičko menjanje dužine niza

Citat:
Sass Drake kaže: Pregled poruke
Gdje sam ja napisao da nije normalno?
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.
chaami je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku chaami na korisnoj poruci:
Sass Drake (5.5.2011)
Stara 5.5.2011, 11:45   #17
Sass Drake
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
Određen forumom Re: Dinamičko menjanje dužine niza

Citat:
chaami kaže: Pregled poruke
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.
Pod „jednostavnim komandama” sam konkretno mislio na standardni tip niza bez upotrebe magičnih klasa. Trebalo je da to naglasim.
Kad se samo sjetim koliko sam relativno kratko ostajao na labovima zahvaljujući toj magičnoj klasi.
Sass Drake je offline   Odgovor sa citatom ove poruke
Stara 5.5.2011, 15:29   #18
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom 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.
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 5.5.2011, 16:02   #19
Sass Drake
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
Određen forumom 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.
Sass Drake je offline   Odgovor sa citatom ove poruke
Stara 29.10.2011, 13:50   #20
Mr.Deeds
Starosedelac
 
Član od: 11.9.2006.
Lokacija: Nedodjija
Poruke: 1.508
Zahvalnice: 582
Zahvaljeno 139 puta na 103 poruka
Slanje poruke preko MSN-a korisniku Mr.Deeds
Određen forumom 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]);
}
Zar nije lakse bilo ovako uraditi?
Mr.Deeds je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi


Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno



Sva vremena su po Griniču +2 h. Sada je 13:44.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com