| Pokušat ću skrenuti pažnju na česte pogreške u 3. zadatku.
Pokušat ću skrenuti pažnju na česte pogreške u 3. zadatku.Za početak, i zadatke i rješenja 3. zadatka možete pronaći
 na sljedećoj stranici
 http://web.math.pmf.unizg.hr/~maerceg/prog2.html
 
 Glavni dio a) dijela zadatka je bio shvatiti kako pročitati
 odgovarajuće elemente matrice. Zapravo ista stvar je
 napravljena u skripti za vježbe tako da ću samo istaknuti
 nekoliko stvari.
 U svojim rješenjima sam napisao kod koji linearno ovisi o
 [tex]n[/tex] (jedna petlja), ali čak se i elegantnije može
 riješiti kad imamo dvije petlje, tj. kvadratnu ovisnost o [tex]n[/tex].
 Problem bi se sveo na to da za proizvoljne dvije točke u ravnini
 moramo naći uvjet uz koji će ležati na nekom od dva dana
 pravca, tj. treba naći jednadžbu pravaca. Vrlo jednostavno možete
 dobiti da su dani pravci upravo
 [dtex]
 y=x +j-i \,, \quad y=-x+j+i \,,
 [/dtex]
 tj. ako su [tex]k[/tex] i [tex]l[/tex] indeksi proizvoljne točke
 na danim pravcima u matrici, onda oni moraju zadovoljavati
 [dtex]
 l=k +j-i \,, \quad l=-k+j+i \,.
 [/dtex]
 Još trebamo paziti da ne "pobjegnemo" iz matrice pa zahtjevamo
 [tex]k,l\in\{0,1,\dots,n-1\}[/tex]. Konačno, sljedeći kod
 [code:1]
 zbroj=0;
 for(k=0; k<n; k++)
 for(l=0; l<n; l++)
 if(l==k+j-i || l==-k+j+i)
 zbroj+=x[k][l];
 [/code:1]
 bi bio dobar za jednu grupu. Ako želite još malo pojednostaviti uvjet,
 lako možete vidjeti da je on ekvivalentan (što naravno ima i svoju
 geometrijsku interpretaciju) s
 [code:1]
 abs(k-i) == abs(l-j)
 [/code:1]
 
 Ipak najčešće rješenje je bilo da se skup traženih točaka podijeli
 na četiri skupa (zapravo se radi o četiri dužine) koje dobivamo s
 [tex]x[i+k][j+k], \, x[i+k][j-k], \, x[i-k][j-k], \, x[i-k][j+k][/tex], gdje
 je [tex]k[/tex] neki brojač u odgovarajućem rasponu. Ovdje su se
 javljale tri česte greške. Prva je da se nije pazilo da se srednja
 točka, [tex]x[i][j][/tex], ne broji više puta (često se brojala 4 puta),
 ali za to sam samo uzimao jedan bod.  To naravno ipak nije imalo utjecaja kod grupa s minimumom i maksimumom. Druga pogreška
 je da se nije dobro pazilo na raspon brojača [tex]k[/tex], a treća
 je da se nije pazilo da prvu i drugu koordinatu, tj. indeks, moramo  [b]istovremeno[/b] mijenjati. Konkretno, sljedeći kod
 [code:1]
 for(k=i; k<n; k++)
 for(l=j; l<n; l++)
 zbroj+=x[k][l];
 [/code:1]
 nije dobar.
 
 Što se tiče b) dijela, naglasak je bio da se memorija pravilno
 alocira i [b]dealocira[/b], te da se pravilno pozove funkcija jer
 je ipak algoritam koji se javio bio nešto što se jako često javljalo
 prošli semestar.
 Već je bilo dosta pitanja i priče po forumu o mogućnosti deklariranja
 matrice na način
 [code:1]
 int n;
 scanf("%d", &n);
 double x[n][n];
 [/code:1]
 ali to nisam prihvaćao kao dobro rješenje. Razlog je što za takvu
 matricu funkcija iz a) dijela ne bi bila dobra, tj. program bi trebao
 javiti pogrešku. Za razlog se samo prisjetite da smo kod funkcija
 pisanih za statičke matrice uvijek eksplicitno morali navesti gornju
 ogradu za drugu dimenziju matrice što bi značilo da bismo u prethodnom
 slučaju morali napisati u prototip funkcije  [tex]x[][n][/tex] što
 naravno neće program progutati.
 Naravno, i da nema prethodnog razloga, opet bismo vjerojatno
 pokušali ne priznati gornji način deklaracije jer je naglašeno na
 vježbama da se to neće priznavti na kolokviju.
 
 M.E.
 
 P.S. ako sam nešto krivo rekao, slobodno me ispravljajte
 [size=7](jer ipak moje znanje iz programiranja nije puno veće od ovih slova :P)[/size]
 Za početak, i zadatke i rješenja 3. zadatka možete pronaći
 na sljedećoj stranici
 http://web.math.pmf.unizg.hr/~maerceg/prog2.html
 
 Glavni dio a) dijela zadatka je bio shvatiti kako pročitati
 odgovarajuće elemente matrice. Zapravo ista stvar je
 napravljena u skripti za vježbe tako da ću samo istaknuti
 nekoliko stvari.
 U svojim rješenjima sam napisao kod koji linearno ovisi o
 [tex]n[/tex] (jedna petlja), ali čak se i elegantnije može
 riješiti kad imamo dvije petlje, tj. kvadratnu ovisnost o [tex]n[/tex].
 Problem bi se sveo na to da za proizvoljne dvije točke u ravnini
 moramo naći uvjet uz koji će ležati na nekom od dva dana
 pravca, tj. treba naći jednadžbu pravaca. Vrlo jednostavno možete
 dobiti da su dani pravci upravo
 [dtex]
 y=x +j-i \,, \quad y=-x+j+i \,,
 [/dtex]
 tj. ako su [tex]k[/tex] i [tex]l[/tex] indeksi proizvoljne točke
 na danim pravcima u matrici, onda oni moraju zadovoljavati
 [dtex]
 l=k +j-i \,, \quad l=-k+j+i \,.
 [/dtex]
 Još trebamo paziti da ne "pobjegnemo" iz matrice pa zahtjevamo
 [tex]k,l\in\{0,1,\dots,n-1\}[/tex]. Konačno, sljedeći kod
 
  	  | Kod: |  	  | zbroj=0;
 for(k=0; k<n; k++)
 for(l=0; l<n; l++)
 if(l==k+j-i || l==-k+j+i)
 zbroj+=x[k][l];
 
 | 
 bi bio dobar za jednu grupu. Ako želite još malo pojednostaviti uvjet,
 lako možete vidjeti da je on ekvivalentan (što naravno ima i svoju
 geometrijsku interpretaciju) s
 
  	  | Kod: |  	  | abs(k-i) == abs(l-j)
 
 | 
 
 Ipak najčešće rješenje je bilo da se skup traženih točaka podijeli
 na četiri skupa (zapravo se radi o četiri dužine) koje dobivamo s
 [tex]x[i+k][j+k], \, x[i+k][j-k], \, x[i-k][j-k], \, x[i-k][j+k][/tex], gdje
 je [tex]k[/tex] neki brojač u odgovarajućem rasponu. Ovdje su se
 javljale tri česte greške. Prva je da se nije pazilo da se srednja
 točka, [tex]x[i][j][/tex], ne broji više puta (često se brojala 4 puta),
 ali za to sam samo uzimao jedan bod.  To naravno ipak nije imalo utjecaja kod grupa s minimumom i maksimumom. Druga pogreška
 je da se nije dobro pazilo na raspon brojača [tex]k[/tex], a treća
 je da se nije pazilo da prvu i drugu koordinatu, tj. indeks, moramo  istovremeno mijenjati. Konkretno, sljedeći kod
 
  	  | Kod: |  	  | for(k=i; k<n; k++)
 for(l=j; l<n; l++)
 zbroj+=x[k][l];
 
 | 
 nije dobar.
 
 Što se tiče b) dijela, naglasak je bio da se memorija pravilno
 alocira i dealocira, te da se pravilno pozove funkcija jer
 je ipak algoritam koji se javio bio nešto što se jako često javljalo
 prošli semestar.
 Već je bilo dosta pitanja i priče po forumu o mogućnosti deklariranja
 matrice na način
 
  	  | Kod: |  	  | int n;
 scanf("%d", &n);
 double x[n][n];
 
 | 
 ali to nisam prihvaćao kao dobro rješenje. Razlog je što za takvu
 matricu funkcija iz a) dijela ne bi bila dobra, tj. program bi trebao
 javiti pogrešku. Za razlog se samo prisjetite da smo kod funkcija
 pisanih za statičke matrice uvijek eksplicitno morali navesti gornju
 ogradu za drugu dimenziju matrice što bi značilo da bismo u prethodnom
 slučaju morali napisati u prototip funkcije  [tex]x[][n][/tex] što
 naravno neće program progutati.
 Naravno, i da nema prethodnog razloga, opet bismo vjerojatno
 pokušali ne priznati gornji način deklaracije jer je naglašeno na
 vježbama da se to neće priznavti na kolokviju.
 
 M.E.
 
 P.S. ako sam nešto krivo rekao, slobodno me ispravljajte
 (jer ipak moje znanje iz programiranja nije puno veće od ovih slova
  ) 
 
 |