Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 22:56 uto, 19. 6. 2007 Naslov: Prakticni kolokvij, zadatak 42 |
|
|
Dakle, famozni zadatak 42, iz nekog razloga, zbunjuje narodne mase (iako, statisticki, nije najlosije rijeseni zadatak). :? Zadatak je glasio ovako (sada je malo izmijenjen, jer ne objavljujemo rjesenja aktualnih zadataka):
[quote="Zadatak 42"]Napišite program koji učitava prirodne brojeve m i n (m < n), te pomoću zvjezdica ispisuje cik-cak graf dimenzija m × n tako da “krene” iz gornjeg lijevog kuta, te se “spušta” dolje desno, zatim (nakon što dođe do dna) ide gore desno, zatim opet dolje desno i tako do desnog ruba.
Primjer (brojeve linija NE treba ispisati): m = 5 i n = 19
[code:1] 1: * * *
2: * * * * *
3: * * * * *
4: * * * *
5: * *[/code:1][/quote]
Ideju rjesenja sam opisao [url=http://degiorgi.math.hr/forum/viewtopic.php?p=77910#77910]ovdje[/url], a sada prilazem i rjesenje (nakucano iz glave u cca 5 minuta):
[code:1]#include <stdio.h>
#include <stdlib.h>
int main(void) {
char **mat;
int m, n, i, j, dir = -1;
printf("m = "); scanf("%d", &m);
printf("n = "); scanf("%d", &n);
mat = (char**)malloc(m * sizeof(char*));
for (i = 0; i < m; i++) {
mat[i] = (char*)malloc((n+1) * sizeof(char));
for (j = 0; j < n; j++)
mat[i][j] = ' ';
mat[i][n] = '\0';
}
i = 0;
j = 0;
while (j < n) {
mat[i][j++] = '*';
if (!i || i == m - 1) dir = -dir;
i += dir;
}
printf("\n");
for (i = 0; i < m; i++) {
printf("%s\n", mat[i]);
free(mat[i]);
}
free(mat);
return 0;
}[/code:1]
Rjesenje moze i bez stringova: treba samo
a) smanjiti dimenziju u drugom [tt]malloc()[/tt]-u
b) maknuti [tt]mat[i][n] = '\0';[/tt]
c) [tt]printf("%s\n", mat[i]);[/tt] zamijeniti s [tt]for()[/tt] petljom i dodatnim ispisom skoka u novi red.
Ako netko rijesi originalnu verziju (dakle ovu ovdje, a ne onu s weba) bez matrica (objasnih i to na onom linku), moze zalijepiti na ovaj topic. 8)
Inace, ovo je jedini "crtacki" zadatak (za sada :twisted:) koji je bitno laksi ako se koriste matrice... :g:
Podsjecam da objavljivanje rjesenja aktualnih zadataka i dalje nije dozvoljeno... :)
Dakle, famozni zadatak 42, iz nekog razloga, zbunjuje narodne mase (iako, statisticki, nije najlosije rijeseni zadatak). Zadatak je glasio ovako (sada je malo izmijenjen, jer ne objavljujemo rjesenja aktualnih zadataka):
Zadatak 42 (napisa): | Napišite program koji učitava prirodne brojeve m i n (m < n), te pomoću zvjezdica ispisuje cik-cak graf dimenzija m × n tako da “krene” iz gornjeg lijevog kuta, te se “spušta” dolje desno, zatim (nakon što dođe do dna) ide gore desno, zatim opet dolje desno i tako do desnog ruba.
Primjer (brojeve linija NE treba ispisati): m = 5 i n = 19
Kod: | 1: * * *
2: * * * * *
3: * * * * *
4: * * * *
5: * * |
|
Ideju rjesenja sam opisao ovdje, a sada prilazem i rjesenje (nakucano iz glave u cca 5 minuta):
Kod: | #include <stdio.h>
#include <stdlib.h>
int main(void) {
char **mat;
int m, n, i, j, dir = -1;
printf("m = "); scanf("%d", &m);
printf("n = "); scanf("%d", &n);
mat = (char**)malloc(m * sizeof(char*));
for (i = 0; i < m; i++) {
mat[i] = (char*)malloc((n+1) * sizeof(char));
for (j = 0; j < n; j++)
mat[i][j] = ' ';
mat[i][n] = '\0';
}
i = 0;
j = 0;
while (j < n) {
mat[i][j++] = '*';
if (!i || i == m - 1) dir = -dir;
i += dir;
}
printf("\n");
for (i = 0; i < m; i++) {
printf("%s\n", mat[i]);
free(mat[i]);
}
free(mat);
return 0;
} |
Rjesenje moze i bez stringova: treba samo
a) smanjiti dimenziju u drugom malloc()-u
b) maknuti mat[i][n] = '\0';
c) printf("%s\n", mat[i]); zamijeniti s for() petljom i dodatnim ispisom skoka u novi red.
Ako netko rijesi originalnu verziju (dakle ovu ovdje, a ne onu s weba) bez matrica (objasnih i to na onom linku), moze zalijepiti na ovaj topic.
Inace, ovo je jedini "crtacki" zadatak (za sada ) koji je bitno laksi ako se koriste matrice...
Podsjecam da objavljivanje rjesenja aktualnih zadataka i dalje nije dozvoljeno...
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Zadnja promjena: vsego; 23:24 uto, 19. 6. 2007; ukupno mijenjano 1 put.
|
|
[Vrh] |
|
Luuka Forumaš(ica)
Pridružen/a: 13. 02. 2007. (20:34:54) Postovi: (925)16
Spol:
Lokacija: Hakuna Matata
|
Postano: 23:10 uto, 19. 6. 2007 Naslov: |
|
|
Samo jedno pitanje: zašto se program crasha nakon ispisa? dodao sam scanf("%%"); prije returna, dakle nakon svega, program napravi sve što treba, ali onda se javi onaj prozorčić da ima problem bla bla bla javit microsoftu...ne znam dal i drugima tako
radim u devcpp-u na windowsima
i vrlo zanimljiv pristup zadatku...
a zadatak nije sam po sebi težak, nego treba doć na ideju, pa sve to prebrojat, pa iskodirat sve te ideje itd...
Samo jedno pitanje: zašto se program crasha nakon ispisa? dodao sam scanf("%%"); prije returna, dakle nakon svega, program napravi sve što treba, ali onda se javi onaj prozorčić da ima problem bla bla bla javit microsoftu...ne znam dal i drugima tako
radim u devcpp-u na windowsima
i vrlo zanimljiv pristup zadatku...
a zadatak nije sam po sebi težak, nego treba doć na ideju, pa sve to prebrojat, pa iskodirat sve te ideje itd...
_________________ "Bolje bi prolazio na faxu da sam na drogama nego na netu" - by a friend of mine
"Poslije spavanja doma spavanje bilo di mi je najdraža stvar" - by the same guy
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 23:27 uto, 19. 6. 2007 Naslov: |
|
|
[quote="Luuka"]Samo jedno pitanje: zašto se program crasha nakon ispisa? dodao sam scanf("%%"); prije returna, dakle nakon svega, program napravi sve što treba, ali onda se javi onaj prozorčić da ima problem bla bla bla javit microsoftu...ne znam dal i drugima tako
radim u devcpp-u na windowsima[/quote]
Tip-feller: u zadnjem [tt]for()[/tt] je pisalo [tt]< n[/tt], umjesto [tt]< m[/tt], a u konzoli (radim, naravno, u Linuxu) nisam primijetio da kaze "Segmentation fault". :)
[quote="Luuka"]a zadatak nije sam po sebi težak, nego treba doć na ideju, pa sve to prebrojat, pa iskodirat sve te ideje itd...[/quote]
Ideje sam popisao na onom linku, a za slaganje koda ste imali vremena (doma), mada mislim da je pola sata sasvim dosta (na prakt.kol. imate sat i pol). :)
Luuka (napisa): | Samo jedno pitanje: zašto se program crasha nakon ispisa? dodao sam scanf("%%"); prije returna, dakle nakon svega, program napravi sve što treba, ali onda se javi onaj prozorčić da ima problem bla bla bla javit microsoftu...ne znam dal i drugima tako
radim u devcpp-u na windowsima |
Tip-feller: u zadnjem for() je pisalo < n, umjesto < m, a u konzoli (radim, naravno, u Linuxu) nisam primijetio da kaze "Segmentation fault".
Luuka (napisa): | a zadatak nije sam po sebi težak, nego treba doć na ideju, pa sve to prebrojat, pa iskodirat sve te ideje itd... |
Ideje sam popisao na onom linku, a za slaganje koda ste imali vremena (doma), mada mislim da je pola sata sasvim dosta (na prakt.kol. imate sat i pol).
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
matmih Forumaš(ica)
Pridružen/a: 07. 12. 2006. (22:57:42) Postovi: (1A4)16
Spol:
Lokacija: {Zg, De , Ri}
|
|
[Vrh] |
|
Luuka Forumaš(ica)
Pridružen/a: 13. 02. 2007. (20:34:54) Postovi: (925)16
Spol:
Lokacija: Hakuna Matata
|
Postano: 23:38 uto, 19. 6. 2007 Naslov: |
|
|
Da, sad radi i meni...
a što se tiče tih ideja na onom linku, pomogle su jako malom broju ljudi...ipak većina nije nikad programirala pa im tak nešto ne dolazi baš intuitivno...nije baš sve sasvim jasno...
Da, sad radi i meni...
a što se tiče tih ideja na onom linku, pomogle su jako malom broju ljudi...ipak većina nije nikad programirala pa im tak nešto ne dolazi baš intuitivno...nije baš sve sasvim jasno...
_________________ "Bolje bi prolazio na faxu da sam na drogama nego na netu" - by a friend of mine
"Poslije spavanja doma spavanje bilo di mi je najdraža stvar" - by the same guy
|
|
[Vrh] |
|
Mala_022 Forumaš(ica)
Pridružen/a: 21. 01. 2006. (18:15:12) Postovi: (73)16
Spol:
Lokacija: ...evo mene među moje...
|
Postano: 0:07 sri, 20. 6. 2007 Naslov: |
|
|
Evo, "slučajno" san ovo nedavno rješavala pa da podilin s onima koje zanima (nije baš najelegantnije, al sad... :wink: )
[code:1]#include <stdio.h>
int main(){
int m, n, i, j;
printf("Unesi brojeve m i n (m<n): ");
scanf("%d %d", &m, &n);
for (i=0; i<m; i++){ //Idemo po recima m x n (zamisljene) "matrice"
for (j=0; j<n; j++) //...za svaki redak po stupcima
/* Vidi se da je "graf" periodican, s periodom 2*m-2.
Znaci, dosta je gledati prvi dio (prvo slovo "V").
Da bi na neko mjesto stavili '*', indeks stupca pri dijeljenju s periodom mora davati ostatak
jednak indeksu retka ili -(indeks retka) zbog simetrije.
*/
if ((j-i)%(2*m-2)==0 || (j+i)%(2*m-2)==0) printf("*");
else printf(" ");
printf("\n"); // Dosli smo na kraj reda, prelazimo u novi i ponavljamo postupak (i tako sve dok ne prodemo sve redove)
}
return 0;
}
[/code:1]
Evo, "slučajno" san ovo nedavno rješavala pa da podilin s onima koje zanima (nije baš najelegantnije, al sad... )
Kod: | #include <stdio.h>
int main(){
int m, n, i, j;
printf("Unesi brojeve m i n (m<n): ");
scanf("%d %d", &m, &n);
for (i=0; i<m; i++){ //Idemo po recima m x n (zamisljene) "matrice"
for (j=0; j<n; j++) //...za svaki redak po stupcima
/* Vidi se da je "graf" periodican, s periodom 2*m-2.
Znaci, dosta je gledati prvi dio (prvo slovo "V").
Da bi na neko mjesto stavili '*', indeks stupca pri dijeljenju s periodom mora davati ostatak
jednak indeksu retka ili -(indeks retka) zbog simetrije.
*/
if ((j-i)%(2*m-2)==0 || (j+i)%(2*m-2)==0) printf("*");
else printf(" ");
printf("\n"); // Dosli smo na kraj reda, prelazimo u novi i ponavljamo postupak (i tako sve dok ne prodemo sve redove)
}
return 0;
}
|
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
Mala_022 Forumaš(ica)
Pridružen/a: 21. 01. 2006. (18:15:12) Postovi: (73)16
Spol:
Lokacija: ...evo mene među moje...
|
|
[Vrh] |
|
RonnieColeman Forumaš(ica)
Pridružen/a: 26. 04. 2006. (10:35:00) Postovi: (20B)16
Spol:
Lokacija: |R^3
|
|
[Vrh] |
|
|