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]
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
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 )
|