četvrtak, 28. veljače 2008.

CLR ,polja,osnove-nastavak!

Ovi programi prikazuju funkciju Sort()..........







Ovo je samo nastavak poglavlja o poljima u CLR-u kao novi post ali nastavak staroga.
U ovim programima pokušajte sami malo dokučiti o čemu se radi i uočite kako je jednostavno u CLR-programiranju jednostavno koristiti funkciju Sort() koja sortira elemente polja i naravno ono malo kompliciranije je {ime_polja,3,2} što u biti znači da sortiranje počinje od trećeg elementa i ide po dva .Malo proučite ,objašnjenje slijedi.Naravno kad obradimo C++/CLI osnove naravno,krenuti ćemo s WindowsForms osnove koje naravno koriste CLR programski kod !Tek nakon toga krenuti ćemo na DLL-ove.

Objašnjenje programa...osnove...kratko.

Sortiranje jednodimenzionalnog polja u CLR-u.
Tu funkciju radi jako dobro i elegantno funkcija Sort() pripadnica klase Array.
Naravno i pristup toj klasi i funkciji se piše preko dvotočki:Array::Sort().
Na taj način pozivajući funkciju Sort() i navodeći argumente unutar zagrada mi sortiramo prije definirano polje int tipa.

Za ispis koristimo također elegantnu :
for each---petlju koja pregledava svaki broj i stavlja ga na svoje mjesto po veličini ,nama preostaje jedino ispis!
Drugi program radi sve isto kao i prvi samo što kreće od mjesta koje smo zadali prvo unutar vitićastih zagarda i pregledava onoliko mjesta koliko smo stavili u broj koji je drugi unutar vitićastih zagrada!
Naravno ,sortirani brojevi sad drugačije izgledaju ali to je zbog tog našeg zahtjeva!
Sad malo pobliže treći program koji nam vrši sortiranj po imenima i brojkama.
Prvo smo definirali naše polje String niza i char tipa a zatim polje s brojkama tj.visinom int tipa.
Sad to treba povezati!
U biti mi ništa ne povezujemo nego samo radimo ispis s dvije petlje koje smo prilagodili da izgledaju tako jedna ispod druge ,a dva puta smo primjenili for each petlju i dva puta ispis i eto ime i visina dotične osobe je pokazano zajedno.
Vidite sad smo obradili funkciju Sort() klase Aray.

U slijedećem programu ćemo pretraživati polje da bi našli točno određen broj i na kojem je mjestu....to za nas radi također funkcija pripadnica klase Array
.... a to je BinarySearch() funkcija!

Napomena je da ta funkcija traži broj i nalazi ga ako je polje već prethodno sortirano...kasnije ćemo poraditi na nesortiranom polju koje prvo treba sortirati.Također i u ovom programu je primjenjen zhtjev da se trži od određenog mjesta i koliko mjesta da se pretraži.Probajte to izmjeniti i pogledajte što se dešava.Također ,zbrišite komentare od druge funkcije a stavite znak komentara na funkciju koja je sad aktivna i tako malo kombinirajte i vježbajte. Iščitavanje broja koji nam treba ide preko if else uvjeta i kad su oni zadovoljeni i program se izvršava.

Sad u ovom programu objedinjujemo dvije funkcije,pogodite koje , malo ga proučite!

Detaljnije objašnjenje slijedi.
Program radi tako da smo objedinili dvije funkcije ,Sort() i BinarySearch.
Prvo smo napravili dva polja koja odgovaraju jednop drugom,imena i visine !
Zatim smo napravili treće polje koje je polje koje želimo da bude novo a u njemu su imena koja tražimo i neka nova imena koja zelimo naći kao i stara imena koja tražimo,tj. to polje je puno imena koja želimo naći!
Prvo pozivamo funkciju Sort() ;
Ta funkcija prvo uređuje naša dva polja slažući imena s visinama po redu kako jedno drugome odgovara i tek onda idemo na slijedeći korak.
Prvo moramo deklarirati objekt u koji ćemo spremati rezultate i najbolje je odmah inicijalizirati na nulu kao početnu vrijednost.
Zatim oformimo petlju for each kojom prolazimo kroz naše novo polje (treće) ime po ime i dok tako prolazimo ime po ime ,imamo funkciju traženja koja svako ime traži s njegovom pripadajućom visinom i sprema u objekt(gotovo) ili kako kasnije vidite naše novo polje.
Zbog if- else uvjeta to se polje ispisuje na ekran onako kako mi želimo i povežemo s našim traženjem. Vidite da smo polje mogli tako pretražiti jer smo prije for petlje primjenili funkciju Sort() koja je stvorila jedinstveno polje s povezanim imenima i visinom i na taj način smo mogli sve zajedno pretražiti i ispisati na ekran pomoću funkcije traženja i naših uvjeta.Proučavajte logiku programa i vježbajte što više s logikom ispisa.
Slijedi rad s višedimenzionalnim poljima u C++/CLI CLR programiranju!

No,prije toga još jedan mali program koji nam može pokazati kako da umetnemo neko novo ime i povećamo naše polje a da ne remetimo ništa unutar samog polja.Tu se susrećemo s bitovnim operatorom ~ koji ima taj oblik i dobijete ga s AltGr + 1(kod mene).O tom operatoru ću nešto više reći kad budemo govorili o destruktorima,zasad on nam nalazi mjesto gdje možemo umetnuti novo ime koje želimo staviti unutar polja imena i naravno tad možemo stvoriti sasvim novo polje primjenjujući alokaciju gcnew,na taj načim smo i proširili naše polje za još jedan čljan koji smo umetnuli na položaj koji smo saznali pomoću ~ operatora.Na kraju taj položaj i ime iščitavamo da bi se uvjerili da je na tom položaju.Ono što nisam sad objasnio ,objasniti ću tokom daljnjeg izlaganja o poljima.Proučavajte program,smislite nešto novo i vi sami!!!

...ova slika ovdje se dobije kad skinete komentare s imena=nullptr a želite iščitati nepostojeće polje koje ste u biti zbrisali.
Ovdje iščitivamo samo novo_polje tj ime koje je dodano....a ona prva može čitati oba polja jer je imena =nullptr u komentaru i zato još uvijek postoji i to polje!!!!Ako želimo da ne postoji a time i memoriju oslobodimo tad napišemo imena = nullptr; !!!!!!!!!!
Eto malo proučavajte i taj program i uvidjet ćete logiku svih naredbi i rada s jednodimenzionalnim poljima ,naravno same osnove!!!!!!!!!

Višedimenzionalna polja i rad s njima.....želim to što bolje i razumljivije prikazati ,zato ćemo se i malo više zadržati na ovom poglavlju.
Sad krećemo s višedimenzionalnim poljima koja se malo i razlikuju od takvih polja u C++ nativnom programiranju.Prvo ,ćemo ispisati program jer mislim da će biti lakše tako objašnjavati ,ispišite ga u editor koda i pokrenite.U CLI programiranju vi možete napraviti do 32 dimenzije polja,to je dovoljno za većinu programa koji se pišu.Ja ću pokušati objasniti rad s njima ,osnove,kako se pišu i kako se išćitavaju,postupak je uglavnom isti a vi kad uđete u „štos“ vidjet ćete da i nije tako teško.Samo naravno treba vježbati i vježbati!

...objašnjenje slijedi ...a dimenzije polja određujemo unutar < > tih zagrada na početku programa...naša dimenzija je dva ! Znači dvodimenzionalno polje.Znači naše polje koje smo stvorili može sadržavati dvadeset elemenata!Naravno i ispis je malo drugačiji nego u nativnom c++-u ,ali uglavnom kad jednom uđete u "štos" ispisa ,vjerujte da nije teško.Također bez obzira na ovo vi morate ipak znati rad s petljama i svim aspektima iščitavanja petlji iz nativnog kodiranja,tako je puno lakše shvatiti što dalje slijedi.Sve to imate u tutu o osnovama programiranja.Sami vidite da nema jednog indeksa pomoću kojeg iščitavamo red po red nego dvije petlje ,vanjska i unutrašnja koja svaka ima svoj zadatak.Petlje iščitavaju red po red .Vi na taj način možete postaviti do 32 dimenzije iščitavanja!U slijedećem primjeru moći ćemo malo bolje sve aspekte ispisa objasniti.
Evo programa koji nam prikazuje tablicu a napravili smo je s dvodimenzionalnim poljem.Proučavajte je malo i uvidjet ćete logiku ispisa i kreiranja tablice pomoću for petlji i sama sruktura te tablice je jednostavno nastala slažući petlje!

Normalno ovo iznad je jedan program,spojite to u editoru.
Ovo je kad izvršite program ,a objašnjenje slijedi.
Prije nego krenem objašnjenje ovog programa pogledajte još jedan manji program pomoću kojeg možemo vidjeti koliko elemenata višedimenzionalno polje može i primiti.Malo proučite ispis koda i vidite kako je jednostavno,kao da naredite "sad mi pokaži dužinu ili broj elemenata!" pomoću naravno Length !!!!!



Slijedi opet objašnjenje programa prije ovog s dužinom polja:

Višedimenzinalna polja:
Prvo stvaramo dvodimenzionalno polje slijedećim izrazom:

const int VELICINA= 12;
array <> ^ pro = gcnew array <> (VELICINA,VELICINA);

(naravno ovdje između uglatih zagrada poslije array stoji; int,2 između <>^)
Prva linija je konstanta tipa int koja se odnosi na dimenzije našeg dvodimenzionalnog polja.Koliko svako polje ima elemenata.Koristiti ćemo isto ime jer je broj isti.
Druga linija nam govori da smo stvorili dvodimenzionalno polje i uvijek se tako definira ,prvo tip pa zarez pa broj dimenzije i hat poslije kose-uglate zagrade.Zatim slijedi tj.slijede petlje koje vanjska i unutrašnja pomoću koje (vanjska )prolazimo kroz redove, a (unutrašnja) kroz stupce. I naravno izračun koji se pokazuje za svaki broj jer se nalazi u unutrašnjoj petlji-ponoviti petlje u petlji!!!Sve što slijedi dalje nam je stvaranje tablice i uočite da kad smo stvorili taj okvir od linija ,prije zadnje crte koja sve podvalči,pišemo ovu petlju:

for(int x = 0;x < VELICINA;x++)
{
Console::Write(L"{0,3} ",x+1);//ovdje se ispisuje vodoravni niz brojeva


for(int y=0;y < VELICINA;y++)
Console::Write(L"{0,3} ",pro[x,y]);//ovdje za svaki broj vodoravno niz okomitih
Console::WriteLine();//ali kao rezuzltat umnoska dva broj ,to jr napisano u

}//u petoj liniji main programa

Pomoću te petlje je ispis one dvije petlje na početku
programa,vanjska i unutrašnja i tako smještamo brojeve unutar naše tablice koju smo stvorili.Nije teško shvatiti ovaj kod i njegov ispis jer u biti se radi o slaganju svega u jedinstveni oblik tablice.Mijenjajte kod malo ,neke izmjene napravite s ispisima i vidjet ćete kako sve funkcionora.I na taj način se uči!
Program koji se odnosi samo na zaključak o dužini sami proučite jer biti će sličnih zaključaka pa da se ne vraćam.
Sad slijede programi koji se većinom bave riječma u poljima ,i poljima koja sadrže polja kao svoj element.Zvuči i izgleda možda komplicirano ali nije toliko,samo na prvi pogled.

1 komentar:

CharlieAmer kaže...

Ja imam jedan mali problem. Kada kreiram projekt sa podrškom za CLR, ne mogu naći načina da upotrijebim funkcije iz windows.h biblioteke (error LNK2028: unresolved token (0A00000D) ... i error LNK2019: unresolved external symbol "extern "C" ...) , a kada probam da stavim using namespace system (ili neki namespace unutar system) nemože naći taj namepace. Moje pitanje je: Kako u CLR projektu podesiti linker da podrži windows komande ili koja biblioteka treba da se doda u windows projekt da bi postojao namespace system. HVALA :)