diff options
Diffstat (limited to 'inf/rtk/2021-šolsko-delo/4.c')
-rw-r--r-- | inf/rtk/2021-šolsko-delo/4.c | 75 |
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; +} |