Pregled posta

Adresa bloga: https://blog.dnevnik.hr/z1prijevara

Marketing

Program za prebrojavanje trokuta (by popular demand)

Slijedi kod u C-u:



#include

#define MAXN 100
#define MAXM (MAXN*(MAXN-1)/2)
#define INFILE "trokuti.in"
#define MAXLINE 80

int m, n;
int g[MAXN][MAXN];
int vrh[MAXN][MAXM];

int kolinearni(int a, int b, int c)
{
int i;

for (i = 0; i < m; ++i)
if (vrh[a][i] && vrh[b][i] && vrh[c][i])
return 1;

return 0;
}

int spojeni(int a, int b)
{
int i;

for (i = 0; i < m; ++i)
if (vrh[a][i] && vrh[b][i])
return 1;

return 0;
}

main()
{
int i, j, k, l;
int trokut;
char line[MAXLINE+1];
FILE *in;

in = fopen(INFILE, "rt");

if (in == NULL)
{
printf("File not found!n");
return 1;
}

for (i = 0; i < MAXN; ++i)
for (j = 0; j < MAXM; ++j)
vrh[i][j] = 0;

m = n = 0;
while (!feof(in))
{
fgets(line, MAXLINE, in);

for (i = 0; line[i]; i++)
{
if (line[i] < '0' || line[i] > '9')
continue;

l = 0;
while (line[i] >= '0' && line[i] <= '9')
{
l = l*10 + line[i]-'0';
i++;
}

if (l >n) n = l;
vrh[l-1][m] = 1;
}

m++;
}

for (i = 0; i < n; ++i)
for (j = i+1; j < n; ++j)
g[i][j] = spojeni(i, j);

trokut = 0;
for (i = 0; i < n; ++i)
for (j = i+1; j < n; ++j)
for (k = j+1; k < n; ++k)
if ( (g[i][j] && g[j][k] && g[i][k]) && (!kolinearni(i, j, k)) )
{
printf("(%d, %d, %d)n", i+1, j+1, k+1);
trokut++;
}

printf("%dn", trokut);

getch();
fclose(in);
return 0;
}



Treba na prvu liniju koda (iza #include) nadopisati 'manje'stdio.h'vece', gdje je 'manje' znak <, a 'vece' znak >. (blog.hr i nije bas previse zahvalan za pisanje kodova).

Uputa:
Podaci se unose iz fajla koji se zove trokuti.in i koji izgleda ovako:

a1 a2 a3 ...
b1 b2 b3 ...
c1 c2 c3 ...
...

gdje a1, b1, c1, itd. označavaju brojeve vrhova i to tako da se a1, a2, a3, ... nalaze na prvom pravcu, b1, b2, b3, ... na drugom pravcu, i tako dalje.

Najvažnije je na slici uočiti sve različite pravce i unijeti ih u fajl trokuti.in na gore opisani način. Zatim se pokrene program i ispiše se broj trokuta zajedno sa popisom tih trokuta.

Primjer:
Promotrimo jednostavan primjer iz prvog posta



Prvo uočimo sva sjecišta pravaca na ovoj slici i označimo ih brojevima od 1 do 6 (brojevi se već nalaze na slici). Zatim uočimo sve različite pravce i pronađimo sva sjecišta koja se nalaze na njima. Na ovoj slici ima 5 pravaca. File trokuti.in ima 5 redaka i izgleda ovako:

1 4 2
1 6 3
2 3
2 5 6
3 5 4

Znači, prvi pravac je onaj na kojemu se nalaze vrhovi 1, 4, 2, drugi pravac je onaj na kojemu su vrhovi 1, 6, 3, i tako dalje. Zatim se pokrene program i to je to - dobije se ukupan broj trokuta na slici, kao i popis tih trokuta koji se mora podudarati sa popisom danim u prvom postu.

Besplatnih C compilera ima popriličan broj, meni je najdraži Bloodshed Dev-C .

Post je objavljen 02.08.2006. u 19:29 sati.