summaryrefslogtreecommitdiffstats
path: root/inf/rtk/2021-šolsko-delo/dos/2.c
diff options
context:
space:
mode:
Diffstat (limited to 'inf/rtk/2021-šolsko-delo/dos/2.c')
-rw-r--r--inf/rtk/2021-šolsko-delo/dos/2.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/inf/rtk/2021-šolsko-delo/dos/2.c b/inf/rtk/2021-šolsko-delo/dos/2.c
new file mode 100644
index 0000000..5555a99
--- /dev/null
+++ b/inf/rtk/2021-šolsko-delo/dos/2.c
@@ -0,0 +1,36 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+int podprogram (int * t /* tabela s kovanci */, int l /* dolzina tabele */) {
+ int c = 0; /* oznacuje, kje v tabeli trenutno smo */
+ int s = 0; /* sestevek */
+ int a = -2; /* kateri kupcek smo pobrali nazadnje */
+ int i = 0; /* indeks pri iteraciji */
+ while (c < l) { /* za vsak kupcek */
+ if (c-a > 1 && t[c] >= t[c+1]) { /* poberemo le, ce prej nismo pobarli in ce je naslednji manjsi ali enak trenutnemu */
+ for (i = c; i > a + 1; i = i - 2) /* ce je nekaj kupckov vmes med prejsnjim pobranim in tem, so urejeni po velikosti, gremo vzvratno in poberemo vsakega drugega. tukaj se pobere tudi trenutni. */
+ s += t[i];
+ a = c;
+ }
+ c++;
+ }
+ return s; /* vrnemo seštevek */
+}
+
+#if __INCLUDE_LEVEL__ == 0
+int main (int argc, char ** argv) {
+ if (argc < 2) { /* ni bilo povedanih nobenih kupckov */
+ fprintf(stderr, "uporaba: %s 1 2 3 4 ...\n", argv[0]);
+ return 1; /* zapremo program */
+ }
+ int * t = malloc(sizeof(int)*argc); /* pripravimo prostor za tabelo s kupcki, en kupcek vec */
+ int i = 1; /* indeks pri iteracijah */
+ for (i = 1; i < argc; i++) /* pretvorimo vhodne kupcke iz nizov v cela stevila */
+ t[i-1] = atoi(argv[i]); /* in jih postavimo v tabelo */
+ t[i-1] = 0; /* potrebujemo en namisljen kupcek vec, ki nima smeti v vrednosti */
+ fprintf(stdout, "sestevek: %d\n", podprogram(t, argc-1)); /* pozenemo podprogram in natisnemo izhodni sestevek */
+ free(t); /* sprostimo spomin, kjer je bila tabela dinamično alocirana */
+ t = NULL; /* zgolj kot dobro prakso vsakic po sproscanju nastavimo pointer na null, da preprecimo double-free napake (free ne naredi nicesar na naslovu 0x00) */
+ return 0; /* z uspesnim statusom zapremo program */
+}
+#endif