summaryrefslogtreecommitdiffstats
path: root/inf/rtk/2021-šolsko-delo/dos/4.c
blob: 9703707d9a6e8872fd3d203e51d6089b27db0d03 (plain) (blame)
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <stdio.h>
#include <stdlib.h>

/* tukaj si kar nekaj kode izposodimo iz prejsnje naloge, predvsem za branje iz standardnega vhoda, zato ne bom pisal komentarjev tam, kjer so ze v nalogi 3. */

struct preusm {
	int s; /* izvorni naslov */
	int t; /* naslov, na katerega bomo preusmerjeni */
	int o; /* 1, v kolikor smo ze obiskali to preusmeritev, 0 na zacetku */
};

int podprogram(
		struct preusm * p, /* seznam preusmeritev */
		int n, /* stevilo preusmeritev */
		int z /* naslov, ki naj ga funkcija obravnava - rekurzija */
		) { /* vrne nic, ce se zacikla, vrne koncni naslov, ko se le-ta najde */
	int i = 0; /* iteracijski decek */
	for (i = 0; i < n; i++) /* za vsako preusmeritev */
		if (p[i].s == z) { /* ko najdemo nas naslov */
			if (p[i].o == 1) /* ups, ocitno se zacikla, na tej preusmeritvi smo ze bili */
				return 0; /* vrnemo s statusom, ki zaznamuje zaciklanost */
			p[i].o = 1; /* za v prihodnje zaznamujemo, da smo na tej preusmeritvi ze bili */
			return podprogram(p, n, p[i].t); /* rekurzivno naprej sledimo preusmeritvam */
		}
	return z; /* ocitno tega naslova ni v tabeli preusmeritev, to je koncni naslov */
}

/* vhodni podatki - seznam preusmeritev
 * 1,2 1,3 1,4 6,2 8,3 1,6 2,6 1,6
 * argv[1] - z (zacetni naslov) v desetiskem sistemu
 *
 * jaz osebno menim, da n ni potreben in je tu samo zato, da me zavede. zatorej program ne uporablja nja, glede na navodilo pa ga mora sprejeti, zato ga dajte v argv[2], vendar ne bo uporabljen.
 * */
int main (int argc, char ** argv) {
	if (argc < 1+1) { /* ce ni podanega zacetnega naslova */
		fprintf(stderr, "uporaba: %s z (stevilka) < 4.in (preusmeritve)\n", argv[0]);
		return 1; /* napaka */
	}
	struct preusm * k = malloc(sizeof(struct preusm)*1);
	char * b = malloc(sizeof(char)*1);
	size_t d = 0;
	char * p;
	char c = fgetc(stdin);
	int o;
	int z;
	while (!feof(stdin)) {
		b = realloc(b, sizeof(char)*(d+2));
		b[d++] = c;
		c = fgetc(stdin);
	}
	if (b[d-1] == '\n')
		d--;
	if (b[d-1] == '\r')
		d--;
	b[d] = '\0';
	d = 0;
	p = b;
	z = atoi(argv[1]); /* pridobimo zacetni naslov */
	do {
		k = realloc(k, sizeof(struct preusm)*(d+2));
		k[d].o = 0;
		k[d].s = strtol(p, &p, 10 /* mimogrede, ta desetica oznacuje desetiski sistem */);
		p++;
		k[d].t = strtol(p, &p, 10);
		p++;
		d++;
	} while (p[-1] != '\0');
	o = podprogram(k, d, z);
	fprintf(stdout, "%s%c%d\n", o == 0 ? "preusmeritev se zacikla\n" : "preusmeritve se koncajo na naslovu", o == 0 ? '\0' : ' ', o); /* malo format string magije */
	free(b);
	b = NULL;
	free(k);
	k = NULL;
	return 0;
}