Šta je novo?

Pomoć oko programiranja u PASCAL-u

Nisam razumeo najbolje. Ako je niz(array) cifara, njegovom n-tom elementu pristupas sa niz[n].
 
Niz nastaje kada slepiš sve brojeve i tako dobiješ jedan ogroman broj sa beskonačno cifara i kada ja unesem recimo 15, on izbaci 15.cifru tog niza, ako ne grešim to je broj 2.
 
Zadatak je više teoretsko-logički, pošto teoretski n može biti bio koji prirodan broj...

Ja bih ovako formulisao "pomoć" postavljaču: pokušaj da rešiš zadatak "ručno". Videćeš da nije moguće za svaki n kreirati dovoljno veliki niz koji bi stao u memoriju ili na papir. Pretpostavimo da je n maksimalno najveći pozitivan broj int64 tipa.

Da bi rešio problem, uzmi dovoljno mali n i utvrdi način kako bez formiranja niza možeš da odrediš koji broj će biti u okolini n-tog mesta u nizu. Ostatak oko pisanja programa je time trivijalan.
 
@ Markic

Evo mala pomoc od mene:

Kod:
 123456789101112131415161718192021...

Prvo razdvoji brojeve u grupe sa istim brojem cifara (jednocifreni, dvocifreni, trocifreni, cetvorocifreni ... )

Kod:
 1..9 - Grupa 1 (9 jednocifrenih brojeva) - ukupan broj cifara u celoj grupi 9 * 10^(broj cifara - 1) * broj cifara = 9 * 10^0 * 1 = 9 * 1 * 1 = 9.
Kod:
 10..99 - Grupa 2 (90 dvocifrenih brojeva) - ukupan broj cifara u celoj grupi 9 * 10^(broj cifara - 1) * broj cifara = 9 * 10^1 * 2 = 9 * 10 * 2 = 180.
Kod:
 100..999 - Grupa 3 (900 trocifrenih brojeva) - ukupan broj cifara u celoj grupi 9 * 10^(broj cifara - 1) * broj cifara = 9 * 10^2 * 3 = 9 * 100 * 3 = 2700.
Kod:
 1000..9999 - Grupa 4 (9000 cetvorocifrenih brojeva) - ukupan broj cifara u celoj grupi 9 * 10^(broj cifara - 1) * broj cifara = 9 * 10^3 * 4 = 9 * 1000 * 4 = 36000.

I cilj ti je da ignorises grupe u kojima ti se broj ne nalazi, recimo uzmimo primer taj broj 15.

Prvo oduzmes 9 cifara koje se nalaze u prvoj grupi. 15-9 = 6. Sto znaci da ce trazena cifra biti 6ta cifra u drugoj grupi, tj nalazice se u 3cem broju u drugoj grupi - broju 12 (10, 11, 12) jer druga grupa sadrzi dvocifrene brojeve.
 
@GreenBall

U pedagoško-psihološkom radu sa decom, prioritet je da se dete stimuliše da kreativno i samostalno razmišlja, a ne da mu se ponudi sve na gotovo. Lako je "grubom silom" pokušati da se reši problem, ali lepota upravo leži u samostalnom pronalaženju elegantnijeg rešenja.

Ovako, dete stiče naviku da mu je prvi i najlakši potez da nadje gotovo rešenje na internetu ili pita druge da urade domaći zadatak umesto njega. Ali kada mu se u realnom životu postavi problem i zabrani upotreba interneta, rezultat je naravno katastrofalan.
 
Poslednja izmena:
Da se vratim na predhodni zadatak oko palindroma, pošto vidim da je rešen upotrebom "grube sile"...

Pitanje koje bi dete sebi trebalo da postavlja je je uvek isto, može li brže i elegantnije? U ovom slučaju, rešenje je takodje jednostavno...

Pošto je palindrom trocifrenog broja uvek u obliku "xnx", gde je x u rasponu od 1 do 9, a n u rasponu od 0 do 9, 900 iteracija je prespor proces, a optimizacija se svodi na jednostavno štampanje u dvostrukoj petlji. To proizlazi iz činjenice da su palindromi trocifrenih brojeva sledeći:

101
111
121
...
989
999

Analogno tome, napraviti program koji će izbrojati sve palindrome četvorocifrenih, petocifrenih, odnosno n-to cifrenih brojeva. Probijanjem realnih granica procesorske snage, uvidja se brzo da je "grubom silom" to teško rešiv problem u realnom vremenu.

Teško je današnjoj deci objasniti činjenicu da su nekada procesori imali maksimalni clock od 1MHz i par KB RAM-a, a ne kao danas 4-5GHz i 8 i više GB RAM-a i da je umetnost programiranja bila u tome da se princip "grube sile" izbegava maksimalno, osim ako nije neophodan, pošto se rezultat ne bi dobio u realnom vremenu.

Zato je danas mnogo neoptimizovanog softvera, pošto su se programeri zbog toga generalno "ulenjili" i ne razmišljaju o optimizaciji čak ni u vremenski kritičnim operacijama.

I tome slično...
 
Poslednja izmena:
@newpc

I ako se slazem sa tobom, moja pretpostavka je bila da je on vec probao da resi zadatak (seo, razmislio o njemu) i uvideo da mu je potrebna pomoc. Cak i sa mojim "hint-om" to je samo jedan deo problema i pitanje je da li ce se snaci za ostatak.
 
Poslednja izmena:
@newpc

I ako se slazem sa tobom, moja pretpostavka je bila da je on vec probao da resi zadatak (seo, razmislio o njemu) i uvideo da mu je potrebna pomoc. Cak i sa mojim "hint-om" to je samo jedan deo problema i pitanje je da li ce se snaci za ostatak.

Hvala za hint, baš danas sam u školi došao do ideje da uradim ovako kako si mi ti rekao. Daleko od toga da sam lenj i da ne rešavam probleme sam, čak sam ovaj zadatak i dobio od profesora pošto sam se žalio kako su klasični zadaci šablonski, pa mi je on dao neke sa takmičenja, među kojima je bio i ovaj.
 
Ma samo polako i slobodno pitaj sta te zanima, to o cemu je @newpc pricao je za ljude koji copy/paste domaci zadatak i posle copy/paste resenje.

I ako pretpostavljam da je cilj zadatka za palindrome bio da se vidi da li djak ispravno koristi "div" i "mod" operatore i da se ocekivalo resenje koje je dao @ivanbass1, ovo ti je idealan primer da vidis kako zadatak moze da se resi na efikasniji, lepsi, kraci a i dosta laksi nacin.
 
Ovde sam ja ponajviše dobronamerno kritikovao GreenBall-a, zato što ti je ponudio idealno rešenje, a ne malo manje očigledno upućivanje na pravi put... :)

A iz poslednje poruke vidi se da nisi od onih koje jedva da zanima i standardno školsko gradivo, kao ni izuzetno laki zadaci iz programiranja. Za pohvalu je i to što si dobio ideju u školi da tako rešiš zadatak, verovatno dok nisi ni razmišljao intenzivno o tome, narodski rečeno: "samo se upalila sijalica", a to meni takodje mnogo govori.

Tako je, slobodno pitaj šta te zanima, ali pre toga sagledaj problem iz više uglova i probaj sam da dodješ do elegantnijeg rešenja. Od profesora svakako i dalje traži teže zadatke, kao i one sa takmičenja i rešavaj ih na času umesto trivijalih koje daje ostatku odeljenja, ako se on saglasi sa tim, ili kod kuće, svejedno. Sa iskustvom ćeš svakako sve teže i teže zadatke rešavati sa lakoćom, a časovi ti svakako neće biti dosadni.
 
Poslednja izmena:
Imam zadatak u kojem moram da nađem element niza sa najbližom vrednošću proseka tog niza. Meni j jasno kako naći prosek elemenata nekog niza, ali kako naći element sa najbližom vrednošću kao prosek, ako prosek bude broj sa decimalom?
 
Pa oduzimaš svaki element tog niza od prethodno izračunatog proseka i gledaš koji element ima najmanju razliku (po apsolutnoj vrednosti).

Sent from my Pixel 2 XL using Tapatalk
 
Zadatak za extra poene: naci taj element samo jednim prolazom kroz niz ;)
 
Ajd odaj :) malo sam zaglupeo...

Sent from my HUAWEI MT7-L09 using Tapatalk
 
Imam zadatak u kojem moram da nađem element niza sa najbližom vrednošću proseka tog niza. Meni j jasno kako naći prosek elemenata nekog niza, ali kako naći element sa najbližom vrednošću kao prosek, ako prosek bude broj sa decimalom?

Znaci, ako ti je jasno kako da nadjes prosek tog niza, nakon sto ga nadjes trebas da izracunas(apsolutnu) razliku svakog pojedinacnog elementa sa prosekom i onaj element koji ima najmanju razliku je trazeni element niza. Najlaksi nacin da to uradis jeste da napravis varijablu real tipa koja ce da predstavlja najmanju razliku i varijablu integer tipa koja ce da predstavlja index elementa sa najmanjom razlikom. Izracunas razliku za prvi elemenat i nju postavis kao vrednost real varijable za najmanju razliku, a 1 postavis za vrednost int varijable za index elementa. Onda svaku narednu razliku uporedjujes sa tom. Ako se nadje neka koja je manja, postavis tu razliku za najmanju i u istom potezu postavis index tog elementa u int varijablu koja je zaduzena za to.

evo kako bi to trebalo da izgleda
u primeru ce duzina niza biti 10 i elementi niza ce biti int tipa i unosice se sa tastature, posto nisi naveo drugacije
(* ovo je sintaksa za komentar i sve sto se nalazi u ovim zagradama sa zvezdicama program ne cita *)
PROGRAM najblizi_elemenat;
TYPE
niz = array[1..10] of integer;

(*ovde podesavas koliku memoriju zelis da ti zauzme niz pri inicijalizaciji, ne moras u primeru da iskoristis svih 10 elemenata*)
VAR
primer_niza: niz;
i, a, zbir_elemenata, index_najmanjeg: integer;
srednja_vrednost, najmanja_razlika: real;

BEGIN
zbir_elemenata:= 0;
FOR i := 1 to 10 DO
BEGIN
READLN(a);
primer_niza:= a;
zbir_elemenata:= zbir_elemenata+primer_niza;
END;

(* ovim prvim for ciklusom smo radili unos 10 elemenata u niz preko tastature i nasli im zbir *)
srednja_vrednost:= zbir_elemenata / 10;
(* eovim smo nasli srednju vrednost elemenata niza*)
najmanja_razlika:=abs(srednja_vrednost-primer_niza[1]);
(* abs() komanda je komanda koja se izvrsava nad varijablama i njen rezultat jeste da vrednost u zagradi pretvara u pozitivnu vrednost, tj u njenu apsolutnu vrednost *)
index_najmanjeg:=1;
FOR i := 2 to 10 DO

(*FOR ciklus ide od 2 a ne od 1 zato sto smo vec prvi elemenat stavili kao pocetni i nema razloga da ga uporedjujemo samog sa sobom *)
IF ( abs( srednja_vrednost - primer_niza ) < najmanja_razlika) THEN
(*ovaj IF poredi apsolutnu vrednost razlike srednje vrednosti niza sa trenutnim elementom niza u for ciklusu i ako je ona manja od nase dosadasnje najmanje razlike, postavljamo da nasa najmanja razlika bude ova nova i postavljamo da je index broja sa najmanjom razlikom ovaj index*)
BEGIN
najmanja_razlika:= abs(srednja_vrednost-primer_niza);
index_najmanjeg:= i;
END;
writeln('Element najblizi srednjoj vrednosti niza je ', primer_niza[index_najmanjeg] );
end.
 
Poslednja izmena:
A jel bi mogao da metodom lažne pretpostavke kažem da je minimum:=prosek, i onda preko ciklusa računam razliku proseka i a(i) člana niza, i ako je ta razlika manja od minimuma, onda kažemo da je novo minimum:=a(i), i kada završi sa ciklusom ispiše minimum?
 
Ajd odaj :) malo sam zaglupeo...
Ne, ne, ovo je za duboko mozganje :)
Inace takav algoritam radi otprilike 3n puta vise deljenja + mnozenja nego obican algoritam, pa je primenljiv za slucajeve kada je citanje podataka mnogo skuplje nego same operacije (baze podataka recimo, a pogotovu citanje sa magnetnih diskova, gde podaci ne mogu ostati u cache memoriji RAMa).
 
A kako da napišem komandu koja proverava da li se jedan niz javlja kao podniz uzastopnih elemenata drugog?
 
A kako da napišem komandu koja proverava da li se jedan niz javlja kao podniz uzastopnih elemenata drugog?

http://poincare.matf.bg.ac.rs/~andjelkaz/p1i/cas11_nizovi_niske/10_3.c

Nije Pascal ali je prinip isti.

Zadatak 4, Pascal, s tim što je ovde traženo da podniz bude u rastućem redosledu.

https://rti.etf.bg.ac.rs/rti/ir1p1/materijali/vezbe/P1_9_10_Pascal_nizovi_potprogrami.pdf

Nije ni uredu da ti mi guglamo za ovako proste i banalne primere.
 
Poslednja izmena:
A jel bi mogao da metodom lažne pretpostavke kažem da je minimum:=prosek, i onda preko ciklusa računam razliku proseka i a(i) člana niza, i ako je ta razlika manja od minimuma, onda kažemo da je novo minimum:=a(i), i kada završi sa ciklusom ispiše minimum?

Ne bi bilo najpametnije da se to uradi jer moze da se javi situacija gde je svaka razlika veca od tog proseka i da na kraju se ne promeni vrednost za minimum vec da ostane na proseku.
 
Evo mene ponovo sa pitanjcem: U pitanju je zadatak: Data je matrica A. Odštampati vrstu koja ima najveći zbir.
Imam ideju da za svaku vrstu računam zbir i onda analogno broju vrste to prebacujem u novi niz. I onda metodom lažne pretpostavke nađem max član tog niza. E sad on meni treba da ispiše celu vrstu koja ima najveći zbir. Kapiram da bih trebao nakon pronalaženja max da zavrtim novi ciklus za kolonu (k), a da vrednost vrste uzmem nekako iz max? Da li je moguće da program pamti koju poziciju max ima (konkretno recimo a(i) da bude a(2), pa da ja odatle znam da je to druga vrsta?) I onda samo u krajnjem ciklusu generišem niz preko a(i,k)
 
Ajde razmisli još jednom. Može to jednostavnije sa 2 pomoćne promenljive. Jedna čuva trenutno najbolji rezultat, a druga broj vrste koja ima taj trenutno najbolji rezultat.
Da li sa ovim predlogom možeš da smislis algoritam za taj program?

Sent from my Pixel 2 XL using Tapatalk
 
Mislim da mogu, znači kažem da je max=0. I kada izračunam zbir prve vrste uporedim sa max, njen zbir postane max i automatski u promenljivu m upisujem njen redni broj vrste. (max:=z m:=v). Jel sam upravu?
 
Tako je.. ali samo ako je mač nove vrste veći od trenutnog max. To znači, "našao sam bolje rešenje, ali nisam siguran da li je najbolje dok ne proverim ostale vrste".
Vodi računa da početni max ne može biti 0 zato što se u matrici mogu nalaziti negativni brojevi. Početni mada bi trebalo da bude najmanji mogući broj koji može da se zapiše. Možda minint ili -maxint.

Sent from my Pixel 2 XL using Tapatalk
 
Vrh Dno