/*----------------------------3.1.c--------------------------*/
/* Demonstrira zivotni vek i oblasti vazenja promenjivih (scope) */
#include <stdio.h>

/* Globalna promenjiva */
int a = 0; 

/* Uvecava se globalna promenjiva a */ 
void increase() {
  a++;
  printf("increase::a = %d\n", a);
}

/* Umanjuje se lokalna promenjiva a. Globalna promenjiva zadrzava svoju vrednost. */
void decrease() {
  /* Ovo a je nezavisna promenjiva u odnosu na globalno a */
  int a = 0;
  a--;
  printf("decrease::a = %d\n", a);

}

void nonstatic_var() {
  /* Nestaticke promenjive ne cuvaju vrednosti kroz pozive funkcije */
  int s=0;
  s++;
  printf("nonstatic::s=%d\n",s);
}

void static_var() {
  /* Staticke promenjive cuvaju vrednosti kroz pozive funkcije. 
	 Inicijalizacija se odvija samo u okviru prvog poziva. */
  static int s=0;
  s++;
  printf("static::s=%d\n",s);
}

main() {
  /* Promenjive lokalne za funkciju main */
  int i;
  int x = 3;
  
  printf("main::x = %d\n", x);
  
  
  for (i = 0; i<3; i++) {
	/* Promenjiva u okviru bloka je nezavisna od spoljne promenjive.
	   Ovde se koristi promenjiva x lokalna za blok petlje koja ima 
	   vrednost 5, dok originalno x i dalje ima vrednost 3*/
	int x = 5;
	printf("for::x = %d\n", x);
  }
  
  /* U ovom bloku x ima vrednost 3 */
  printf("main::x = %d\n", x);
  
  increase();
  decrease();
  
  /* Globalna promenjiva a */
  printf("main::a = %d\n", a);
  
  /* Demonstracija nestatickih promenjivih */
  for (i = 0; i<3; i++)
	nonstatic_var();
  
  /* Demonstracija statickih promenjivih */
  for (i = 0; i<3; i++)
	static_var();
}


/*----------------------------3.2a.c--------------------------*/
/* Deklaracije i definicije - sum - verzija sa definicijom */

/* Definicija funkcije */
int sum(int a, int b) {
  return a+b;
}

int main() {
  /* Poziv funkcije */
  printf("%d\n", sum(3,5));
  /* Neispravan poziv bi prijavio gresku */
  /* printf("%d\n", sum(3)); */

  return 0;
}

/*----------------------------3.2b.c--------------------------*/
/* Deklaracije i definicije - sum - verzija sa deklaracijom */

/* Prototip (deklaracija) funkcije */
int zbir(int, int);

int main() {
  /* Poziv funkcije */
  printf("%d\n", zbir(3,5));
  /* Neispravan poziv bi prijavio gresku */
  /* printf("%d\n", zbir(3)); */

  return 0;
}

/* Definicija funkcije */
int zbir(int a, int b) {
  return a+b;
}

/*----------------------------3.2c.c--------------------------*/
/* Deklaracije i definicije - sum - verzija bez deklaracije */

int main() {
  /* Poziv funkcije */
  printf("%d\n", zbir(3,5));
  /* Neispravan poziv ne prijavljuje gresku */
  printf("%d\n", zbir(3));

  return 0;
}

/* Definicija funkcije */
int zbir(int a, int b) {
  return a+b;
}

/*----------------------------3.3a.c--------------------------*/
/* Demonstrira prenos nizova brojeva u funkciju - 
   funkcija za ispis niza brojeva */

#include <stdio.h>

/* Nizovi se prenose tako sto se prenese adresa njihovog pocetka.
   Uglaste zagrade ostaju prazne!
   Nizove je neophodno prenositi zajedno sa dimenzijom niza 
   (osim niski karaktera)
*/
void print_array(int a[], int n) {
  int i;
  for (i = 0; i < n; i++)
	printf("%d ",a[i]);
  putchar('\n');

  /* Obratite paznju na ovo : */
  printf("sizeof(a) - u okviru fje : %d\n", sizeof(a));
}

int main() {
	int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

	printf("sizeof(a) - u okviru main : %d\n", sizeof(a));
	print_array(a, sizeof(a)/sizeof(int));

	return 0;
}

/*----------------------------3.3b.c--------------------------*/
/* Demonstrira prenos niske karaktera u funkciju - 
   funkcija za ispis niske karaktera */
#include <stdio.h>

/* Uz nisku karaktera nije potrebno prenositi dimenziju ukoliko se postuje 
   dogovor da se svaka niska zavrsava karakterom '\0'. */
void print_string(char s[]) {
  int i;
  for (i = 0; s[i]; i++)
	putchar(s[i]);
}


int main() {
  char s[] = "Zdravo\n";
  print_string(s);
  s[2] = '\0';
  print_string(s);
  return 0;
}

/*----------------------------3.3c.c--------------------------*/
/* Demonstrira prenos parametara po vrednosti 
	- preneti parametri se ne mogu menjati */
#include <stdio.h>

/* Funkcija pokusava da ucita ceo broj. 
   Zbog prenosa parametara po vrednosti ovo ne uspeva */
void get_num(int a)
{
	scanf("%d", &a);
	printf("a = %d\n", a);
}


main()
{
	int x = 0;
	printf("Unesi broj : ");
	get_num(x);
	printf("x = %d\n", x);
}

/*----------------------------3.3d.c--------------------------*/
/* Demonstrira prenos nizova u funkciju - preneti niz se moze menjati */

#include <stdio.h>

/* Funkcija ucitava rec sa standardnog ulaza i smesta je u niz karaktera s.
   Ovo uspeva zbog toga sto se po vrednosti prenosi adresa pocetka niza, 
   a ne ceo niz */
void get_word(char s[])
{
	int c, i = 0;	
	while (!isspace(c=getchar()))
		s[i++] = c;
	s[i] = '\0';
}

main()
{
	/* Obavezno je alocirati memoriju za niz karaktera */
	char s[100];

	get_word(s);
	printf("%s\n", s);
}