PDA

Prikaži potpunu verziju : Problematičan program u C-u 2


NEWSWEETTOFFEE
18.9.2012, 12:01
Pozdrav, forumaši!
Imam jedan zadatak koji me zbunjuje u smislu njegovog smisla. Tekst zadatka je sljedeći:

Zadatu matricu ispisati spiralno, u smjeru kazaljke na satu, počevši od člana A11.

Ono što me zbunjuje je da li treba da napišem program koji spiralno ispisuje brojeve u matrici ili samo da ispišem članove po ''spiralnom'' redu?

Ivan452
18.9.2012, 13:00
ako je matrica:

1 2 3 4
5 6 7 8
9 10 11 12

misli se da ispises:
1 2 3 4 8 12 11 10 9 5 6 7

Predpostavljam da nisu mislili da graficki spiralno predstavis matricu :)

Belphegor
18.9.2012, 13:12
Prvi Google rezlutat. :D

http://www.geeksforgeeks.org/archives/10768

ivan90BG
18.9.2012, 14:07
Pa nije fora Google, nego da se malo pokrenu vijuge. :icon_stud

Analiza

Primer matrice, date su kooordinate jer sadržaj nije bitan, koordinate počinju od 0 jer je tako u nizovima u skoro svim programskim jezicima.

| (0,0) (0,1) (0,2) (0,3) (0,4) |
| |
| (1,0) (1,1) (1,2) (1,3) (1,4) |
| |
| (2,0) (2,1) (2,2) (2,3) (2,4) |
| |
| (3,0) (3,1) (3,2) (3,3) (3,4) |
| |
| (4,0) (4,1) (4,2) (4,3) (4,4) |

Spiralno ispisivanje sadržaja (krug po krug)
(0,0)->(0,1)->(0,2)->(0,3)->(0,4)->
(1,4)->(2,4)->(3,4)->(4,4)->
(4,3)->(4,2)->(4,1)->(4,0)->
(3,0)->(2,0)->(1,0)->

(1,1)->(1,2)->(1,3)->
(2,3)->(3,3)->
(3,2)->(3,1)->
(2,1)->

(2,2)

U opštem slučaju, ako je širina matrice m, a visina n
ispis ide ovako

prvi krug
od (0,0) do (0,m-1)
od (1,m-1) do (n-1,m-1)
od (n-1,m-2) do (n-1,0)
od (n-2,0) do (1,0)

drugi krug
od (1,1) do (1,m-2)
od (2,m-2) do (n-2,m-2)
od (n-2,m-3) do (n-2,1)
od (n-3,1) do (2,1)

i tako dalje

Ovde imamo 16 indeksa od kojih se 8 povećavaju za 1, a 8 smanjuju za jedan

od 8 indeksa koji se povećavaju 6 počinju od 0, a 2 od 1
od 8 indeksa koji se smanjuju 3 počinju od m-1, 3 od n-1, 1 od m-2, jedan od n-2

znači imamo 6 početnih indeksa

Treba nam petlja sa još 4 petlje unutar nje. Posle svake iteracije velike petlje ćemo prva dva od šest indeksa inkrementovati, a ostala četiri dekrementovati. Ali u svakoj od unutrašnjih treba inkrementovati brojač da bi znali kada smo ispisali celu matricu. Moguće da se dubljom analizom može eliminisati ovaj brojač i matematički utvrditi zavisnost broja iteracija (velikih) od dimenzija matrice, pa onda i dokle da se ide unutar poslednje, ali to je za matematičare, čak je moguće da bi imalo slabije performanse od prostog brojanja polja.

Kod:


#include <stdio.h>

#define SIRINA 5
#define VISINA 5

int main(int argc, char* argv[])
{
int matrica[VISINA][SIRINA] = {
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15},
{16,17,18,19,20},
{21,22,23,24,25}
};
//početni indeksi
int a = 0; //ink
int b = 1; //ink
int c = VISINA - 1; //dek
int d = SIRINA - 1; //dek
int e = VISINA - 2; //dek
int f = SIRINA - 2; //dek

int ukupno = VISINA * SIRINA;
int brojac = 1;

int i,j;

while (1)
{
for (j = a; j <= d; j++, brojac++)
{
printf("%d\n", matrica[a][j]);
if (brojac >= ukupno) goto kraj;
}
for (i = b; i <= c; i++, brojac++)
{
printf("%d\n", matrica[i][d]);
if (brojac >= ukupno) goto kraj;
}
for (j = f; j >= a; j--, brojac++)
{
printf("%d\n", matrica[c][j]);
if (brojac >= ukupno) goto kraj;
}
for (i = e; i >= b; i--, brojac++)
{
printf("%d\n", matrica[i][a]);
if (brojac >= ukupno) goto kraj;
}

a++; b++; c--; d--; e--; f--;
}
kraj:

return 0;
}


Provereno radi.

NEWSWEETTOFFEE
19.9.2012, 8:27
Dakle, ne može se grafički ispisati matrica na spiralni način.
Mada niste morali odmah da postavite rešenje. Sad nema toliko slasti u zadatku. :)

A kako i ja da postavljam tekstove kodova?

Belphegor
19.9.2012, 8:36
Mozes da nadjes drugacije resenje.

Za kod kucas ovako:

tvoj kod ovde

rezlutat:

tvoj kod ovde

ivan90BG
19.9.2012, 10:32
Mada niste morali odmah da postavite rešenje. Sad nema toliko slasti u zadatku. :)

Ih, to je najmanji problem, ima kolko oćeš raznih ovakvih zadataka. Ja sam ovde pokazao jedan metod rešavanja koji pasuje na ovaj zadatak, a to je da vidiš da li možeš da konstruišeš rešenje za neki primer, pa da vidiš da li možeš da primetiš neki generalan metod iz tog primera. (ali nemam pojma koje su druge metode, prethodnu rečenicu sam sad izmislio :D).