summaryrefslogtreecommitdiffstats
path: root/inf/rtk/2021-šolsko-delo/dos/2.c
blob: 5555a99e4f904e5f8b39542227d4aa8ad3b4b466 (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
#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