summaryrefslogtreecommitdiffstats
path: root/inf/rtk/2021-šolsko-delo/4.c
diff options
context:
space:
mode:
Diffstat (limited to 'inf/rtk/2021-šolsko-delo/4.c')
-rw-r--r--inf/rtk/2021-šolsko-delo/4.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/inf/rtk/2021-šolsko-delo/4.c b/inf/rtk/2021-šolsko-delo/4.c
new file mode 100644
index 0000000..0c09d09
--- /dev/null
+++ b/inf/rtk/2021-šolsko-delo/4.c
@@ -0,0 +1,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;
+}