Drage takmičarke i dragi takmičari,
Nadam se da ste se lepo odmorili i da ste spremni za nastavak priprema za 2. krug kvalifikacija, koji je planiran od 19. do 21.januara. Sledeće konsultacije u kabinetu planiramo za petak 12.januar posle 6.časa.
Sada je pravo vreme da počnemo sa upoznavanjem nizova, tako to ćemo kao primer iskoristiti 3. zadatak iz prvog kruga kvalifikacija (word dokument u prilogu).
U prilogu se nalazi arhiviran fajl, koji će, kada ga budete raspakovali na svojim računarima, napraviti poseban novi podfolder sa nekoliko fajlova, koje ću u nastavku mejla detaljnije obijasniti.
1. Deo - Nizovi - Osnovno upoznavanje (tip podataka, učitavanje i prikazivanje elemenata niza, jednostavne operacije sa elementima niza)
Na početku, bilo bi dobro da se najpre upoznamo sa osnovnim karakteristikama nizovnog tipa podataka, odnosno nizovima, tako to ćete pregledati sledeće materijale:
- PDF dokument na Petlja.org, tačnije u okviru kursa Uvod u alogritme: https://petlja.org/BubbleBee/r/Lectures/osnovne-strukture-podataka, odnosno https://petljamedia.blob.core.windows.net/root/Media/Default/Lecture/Osnovne%20strukture%20podataka/Nizovi.pdf
U ovom dokumentu objaenje nizovnog tipa podataka namenjeno je pre svega takmičarima, korićenjem programskih jezika Pascal, C i C# i odmah su zatim dati zadaci za vebanje, koji se često koriste za reevanje delova takmičarskih zadataka, kao to su Palidrom, Uzastopna slova i Trag matrice.
- Pre reavanja ovih zadataka, bilo bi dobro da svako od vas najpre pregleda (i ukoliko eli reava) neto jednostavnije zadatke ovim redom:
1. zadatke od 221 do 229 u okviru poglavlja 9. Nizovi, odnosno redovnog programa (kursa) za 3. razred. U okviru tog poglavlja nalaze se i materijali (lekcije) koje bi trebalo da pregledate.
2. zadatke u okviru Zbirke na petlja.org tačnije poglavlja 4. Nizovi i to najpre iz dela 4.2. Elementarno korićenje nizova, odnosno zadatke kao to su: ispis u obrnutom redosledu, prosečno odstupanje od minimalnog i sl.
2. Deo - Nizovi - Grubo grupisanje vrste zadataka (problema) sa nizovima
Sada bi trebalo da imamo neki opti (grubi) pregled vrsta/grupa zadataka u kojima se koriste nizovi i ako je ikako moguće da budu poređani po teini od najlakih ka najteim, to ćemo pokuati ovde i da uradimo sa pratećim kratkim napomenama:
- Najosnovnije operacije korićenjem elemenata niza - to bi bili zadaci od 221 do 229 na nasaskola.edu.rs (kao i iz poglavlja 4.2. Elementarno korićenje nizova u Zbirci), kao to su: zbir svih elemenata niza, aritmetička sredina elemenata niza, najveći i/ili najmanji element niza, indeks najmanjeg elementa niza, prebrojavanje elemenata niza koji ispunjavaju određene uslove i sl.
Napomena: skoro svi zadaci iz ove 1. grupe bi trebalo da mogu se se ree i bez nizova, korićenjem uglavnom samo brojačkih ciklusa. - Generisanje elemenata novog niza - U ovim zadacima potrebno je da na osnovu nekih zadatih pravila generiemo nekoliko ili sve elemente niza, kao na primer da pronađemo zbir dva vektora (niz se posmatra i kao vektor) i sl.
- Opreacije nad elementima niza karaktera - Ukoliko su elementi niza slova, a ne brojevi, onda se radi o nizu karaktera. Princip reavanja zadataka je sličan prethodnom, ali je svakako raznovsniji, kao to je to u poglavlju 4.1. Karakteri i niske.
Napomena: skoro svi zadaci iz ove 2. grupe bi trebalo da mogu se se ree i bez nizova, korićenjem uglavnom samo brojačkih ciklusa i/ili tipa podataka String. - Trasformacije nizova - pomeranje elemenata niza za jedno (ili nekoliko) mesta ulevo ili udesno, izbacivanje određenih elemenata iz niza, ubacivanje novih elemenata u niz i sl, kao u poglalju 4.3. Transformacije nizova.
Napomena: Počev od ove 4. grupe zadataka, postaje neizbeno korićenje nizovnog tipa podataka, tj zadaci se ne mogu tako lako reiti bez ovog tipa podataka. - Obilazak niza - poglavlje 4.4.
- Podnizovi - poglavlje 4.5.
- Sortiranje niza - poglavlje 4.6. - Napomena: Ovo je veoma vano poglavlje za nizove.
- Sloeniji zadaci sa jednodimenzionalnim nizovima i uvod u dvodimenzionalne nizove (preostala poglavlja 4.7 i 4.8 iz Zbirke).
3. Deo - Nizovi - Reavanje takmićarskih zadataka sa kvalifikacija
Sada smo spremni za reavanje takmičarskih zadataka sa kvalifikacija u kojem se koriste nizovi.
Ukoliko ste paljivo proučili prva dva dela, trebalo bi da relativno lako dođete do prve verzije reenja takmičarskog zadatka, ne vodeći računa o optimizaciji. Na takmičenju u većini ovih zadataka, od takmičara se trai i optimizacija i to i memorijskog prostora i brzine, to podrazumeva odgovarajući izbor tipa podataka (i elemenata niza), duine nizova, kao i posebne tehnike (algoritme), odnosno metode reavanja, koje ćemo raditi kasnije.
U ovoj etapi reavanja zadatka ne treba da vodimo računa o optimizaciji (koja nije tako jednostavna), tako da prve verzije reenja bi trebalo da prođu bar nekoliko unapred zadatih (najjednostavnijih) test primera, to ćemo videti u primeru iz 3. zadatka (Prodavnice) sa kvalifikacija.
4. Deo - Nizovi - Algoritamsko reavanje takmićarskog zadataka sa kvalifikacija - 3. zadatak - Prodavnice - FlowGorithm
Korićenjem uobičajenih smernica za reavanje zadataka (koje sam vam poslao 20.decembra) moemo doći do prve verzije algoritamskog reenja. Pri tom, čak moemo i da koristimo program FlowGorithm za crtanje i testiranje prvog algoritamskog reenja.
Već u ovom delu ćemo vrlo brzo zaključiti da je ne moemo da izbegnemo niz, tačnije da moramo da koristimo bar jedan niz kako bi zapamtili (smestili u memoriju) podatke iz drugog reda sa ulaza o rasporedu kuća (X), a koji će nam biti neophodni za određivanje rastojanja do prodavnica u svim sledećim algoritamskim koracima.
Dobra okolnost je to program FlowGorithm ima mogućnost korićenja jednodimenzionalnih nizova, te moemo doći do prve verzije algoritamskog reenja kao u fajlu u prilogu:
- Tkm_DMS_Programiranje_2017_01_KV_01_Z_03.fprg
Primetićete da smo u deklaraciji definisali promenljivu X kao niz duine 1000 celih brojeva (Array), ali da to nismo uradili i za rasporede prodavnica (A i B). Dakle, za sada ćemo koristiti samo jedan niz (X), dok ćemo A i B da učitavamo kao obične cele brojeve u brojačkom ciklusu, i odmah nakon učitavanja da izračunavamo zbir svih rastojanja, koji ćemo prikazati na kraju tog brojačkog ciklusa.
Takođe unutar tog glavnog brojačkog cikusa (za svaki par/red A i B) nakon učitavanja para u drugom unutranjem brojačkom ciklusu izraćunavamo pojedinačna rastojanja svake kuće od tačaka A i B, pronalazimo najmanja i dodajemo na postojeći zbir rastojanja.
Pogledajte i proučite algoritamskog reenja iz navednog fajla u programu FlowGorithm. Ukoliko imate nekih pitanja ili nedoumica, zapiite ih, pripremite i postavite na sledećim konsultacijama.
5. Deo - Nizovi - Testiranje prve verzije algoritamskog reenja
Obavezno testirajte prvo algoritamsko reenje za dati test primer u 3. zadatku na kvalifikacijama:
- Tkm_DMS_Programiranje_2017_01_KV_01_Z_03.fprg
Trebalo bi da daje tačne rezultate za prvi test primer, kao i za drugi, mada je moguće da kod drugog test primera dođe do prekorečenja (memorije), jer se radi o veoma velikim brojevima, ali je za sada vano da za jednostavne test primere daje dobre rezultate. Takođe, u ovom trenutku ne vodimo računa o formatu ulaza i izlaza.
6. Deo - Nizovi - Automatsko generisanje programskog koda iz prve verzije algoritamskog reenja
Ukoliko smo dobili tačno reenje prilikom testiranja algoritma, sada je vreme da genereimo automatski programski kod u jednom od nekoliko programskih jezika (Pascal, C++, C#, Java), kao u fajlovima iz priloga:
- Tkm_DMS_Programiranje_2017_01_KV_01_Z_03_00_FG.pas
- Tkm_DMS_Programiranje_2017_01_KV_01_Z_03_00_FG.java
Naravno i da odmah nakon toga ovako automatski generisan progrmaki kod iskopiramo u razvojno okruenje (Lazarus - console application, FreePascal i sl), kompajliramo (ukoliko je potrebno otklonimo sintaksne greke) i testiramo iz razovojnog okruenja za prvi test primer.
7. Deo - Nizovi - Prva modifikacija automatski generisanog programskog koda iz prve verzije algoritamskog reenja - Prilagođavanje razvojnom okruenju i naredbi za ulaz i izlaz uslovima navedenim u tekstu zadatka za ulaz i izlaz
Sada je potrebno da malo ispravimo automatski generisan programski kod, tačnije naredbe ReadLn i WriteLn, kao i da sve tipove podataka Integer prepravimo u LongInt, poto se u zadatku trae veliki celi brojevi, kao u fajlu iz priloga:
- Tkm_DMS_Programiranje_2017_01_KV_01_Z_03_01_LongInt.pas
Ponovo testiramo programski kod iz razvojnog okruenja. Ukoliko bi postavili ovu verziju kao reenje zadatka komisiji na ocenjivanje, trebalo bi da prođe nekoliko najjednostavnijih unpared generisanih test primera, ali sasvim sigurno ne sve, jer jo uvek nismo uradili pravu optimizaciju (samo smo ispravili naredbe ulaza/izlaza i tipove podataka iz Integer u LongInt).
8. Deo - Nizovi - Druga modifikacija programskog koda - Prilagođavanje uslovima/ograničenjima navedenim u tekstu zadatka koja se odnose na tipove podataka, odnosno opsege mogućih vrednosti brojeva (INT64)
Sada popravljamo podatak o maksimalnoj duini niza (umesto 1..1000, treba da stoji 1..100005) i poto se radi o veoma velikm celim brojevima (10 na 9) prvi put uvodimo najveći mogući tip podataka za cele brojeve Int64, kao u fajlu iz priloga:
- Tkm_DMS_Programiranje_2017_01_KV_01_Z_03_01_Int64.pas
Ponovo testiramo programski kod iz razvojnog okruenja. Ukoliko bi postavili ovu verziju kao reenje zadatka komisiji na ocenjivanje, trebalo bi da prođe nekoliko ne previe zahtevnih unpared generisanih test primera, ali sasvim sigurno ne sve, jer jo uvek nismo zavrili pravu optimizaciju, odnosno samo smo je započeli sređivanjem skoro svih tipova podataka i duine niza.
Preciznije, u ovom konkretnom 3. zadatku sa takmičenja, ova verzija programskog koda će proći svih 22 unapred generisanih test primera, to moete i sami da proverite (pokazaću vam kako), ali će za vie od pola test primera (počev od test primera 09.in) raditi previe sporo, po nekoliko sekundi, odnosno minuta, jer se radi o zaista mnogo velikim brojevima, te će za te test primere ostati bez bodova, jer nije ispunjen uslov vremenskog ograničenja.
9. Deo - Nizovi - Optimizacija brzine izvravanja progrmskog koda - Ispunjavanje uslova vremenskog ograničenja
Optimizacija brzine izvravanja programskog koda je najtei deo i zahteva mnogo iskustva u radu i korićenje poznatih algoritamskih metoda i tehnika. Za to je takođe potrebno vreme, a mi ćemo objaenjenje ovog dela ostaviti za kasnije. Za sada, vano je da imamo programski kod koji prolazi kroz nekoliko test primera, a ukoliko elimo da programski kod ubrzamo neophodno je da razmiljamo u sledećem pravcu:
- Da pronađemo neki matematičko-logički model boljeg reenja (vraćajući se na sam tekst zadatka), odnosno da pokuamo nekako da poređamo raspored kuća u nekom pravilnijem redosledu (na primer rastućem), pa da vidimo da li ćemo uočiti neke zakonitosti.
- Biće neophodno da sortiramo niz.
- Verovatno ćemo morati da uvedemo jo jedan niz iste duine.
- Verovatno ćemo morati da nađemo sredinu između tačaka A i B.
O svemu ovome biće vie reči na sledećim konusltacijama.
Pozdrav,
Dragan Ilić
Dragan Ilić
Нема коментара:
Постави коментар