Prikaz jedne poruke
Stara 18.9.2012, 14:07   #4
ivan90BG
Veteran
 
Član od: 3.5.2008.
Lokacija: Beograd
Poruke: 760
Zahvalnice: 81
Zahvaljeno 213 puta na 144 poruka
Određen forumom Re: Problematičan program u C-u 2

Pa nije fora Google, nego da se malo pokrenu vijuge.

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.
Kod:
| (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:

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.

Poslednja ispravka: ivan90BG (18.9.2012 u 14:32)
ivan90BG je offline   Odgovor sa citatom ove poruke
Sledećih 2 korisnika se zahvaljuje korisniku ivan90BG na korisnoj poruci:
Belphegor (19.9.2012), NEWSWEETTOFFEE (19.9.2012)