/*----------------------------0.1.c--------------------------*/
/* Hello, world! */

#include <stdio.h>

int main() {
  printf("Hello, world!\n");
  return 0;
}

/*----------------------------0.10.c--------------------------*/
/* Program ilustruje globalne i lokalne promenljive */

#include <stdio.h>

/* Globalna promenljiva */
int a = 1;

void f() {
  /* Lokalna promenljiva */
  int a = 2;
  printf("a = %d\n", a); /* Odnosi se na lokalno a */
}

void g(int a) {
  printf("a = %d\n", a); /* Odnosi se na formalni parametar a */
}

int main() {
  printf("a = %d\n", a); /* Odnosi se na globalno a */
  f();
  g(3);
  return 0;
}

/*----------------------------0.2.c--------------------------*/
/* Program ilustruje definisanje i ispis 
   celobrojnih promenljivih */

#include <stdio.h>

int main() {
  int a = 3, b = 5, c;
  c = a + b; 
  printf("Zbir je: %d\n", c);

  return 0;
}

/*----------------------------0.2b.c--------------------------*/
/* Program ilustruje ucitavanje, obradu i ispis celih brojeva - sabiranje dva uneta cela broja */
#include <stdio.h>

int main() {
  int a, b, c;
  printf("Unesi prvi broj : ");
  scanf("%d", &a);
  printf("Unesi drugi broj : ");
  scanf("%d", &b);
  c = a + b;
  printf("%d + %d = %d\n", a, b, c);
  return 0;
}

/*----------------------------0.3a.c--------------------------*/
/* Program ilustruje grananje (if) - 
   ispisuje se ukoliko je uneti ceo broj negativan */
#include <stdio.h>

int main() {
  int b;
  printf("Unesi ceo broj:");
  scanf("%d", &b);
  if (b < 0)
	printf("Broj je negativan\n");
  return 0;
}

/*----------------------------0.3b.c--------------------------*/
/* Program ilustruje blok {} */

#include <stdio.h>

int main() {
  int b;
  printf("Unesi ceo broj:");
  scanf("%d", &b);

  /* Ukoliko se telo if iskaza sastoji od vise iskaza, neophodno je
     koristiti blok {} */
  if (b < 0) {
    printf("Uneli ste broj %d\n", b);
    printf("Broj je negativan\n");
  }


  /* 
  Neispravno (bez obzira na ispravno nazubljivanje):
  if (b < 0)
     printf("Uneli ste broj %d\n", b);
     printf("Broj je negativan\n");
  */

  return 0;
}

/*----------------------------0.3c.c--------------------------*/
/* Program ilustruje grananje (if-else) -
   ispisuje se da li je broj negativan ili nije */

#include <stdio.h>

int main() {
  int b;
  printf("Unesi broj: ");
  scanf("%d", &b);

  if (b < 0)
	printf("Broj je negativan\n");
  else
	printf("Broj nije negativan\n");

  return 0;
}

/*----------------------------0.3d.c--------------------------*/
/* Program ilustruje visestruko grananje (if-else) - 
   ispituje se znak broja */
#include <stdio.h>

int main() {
  int b;
  printf("Unesi ceo broj : ");
  scanf("%d", &b);
  if (b < 0)
    printf("Broj je negativan\n");
  else  if (b == 0)
    printf("Broj je nula\n");
  else /* if (b > 0) */
    printf("Broj je pozitivan\n");

  /* Iako se prethodno nazubljivanje cesce koristi
     zbog preglednosti, sintaksna struktura koda
     u sustini odgovara sledecem:
     if (b < 0)
        printf("Broj je negativan\n");
     else
        if (b == 0)
           printf("Broj je nula\n");
        else
           printf("Broj je pozitivan\n");

     cela konstrukcija
         if (uslov) iskaz else iskaz
     predstavlja jedan iskaz te nisu neophodne
     zagrade.
   */

  return 0;
}

/*----------------------------0.3e.c--------------------------*/
/* Program ilustruje grananje (switch) - 
   ispituje se vrsta karaktera */

#include <stdio.h>

int main() {
  /* Cita se karakter sa standardnog ulaza */
  char c = getchar();
  switch(c) {
  case 'a':
  case 'e':
  case 'i':
  case 'o':
  case 'u':
	printf("Srpski samoglasnik\n");
	/* break; */
  case 'y':
	printf("Engleski samoglasnik\n");
	break;
  case ',':
  case '.':
  case ';':
  case ':':
	printf("Interpunkcijski znak\n");
	break;
  default:
	printf("Nesto drugo\n");
	break;
  }
  return 0;
}

/*----------------------------0.4a.c--------------------------*/
/* Program ilustruje petlju (while) */
#include <stdio.h>

int main() {
  int x;
	
  x = 1;
  while (x<10) {
    printf("x = %d\n",x);
    x++; /* x++ je isto kao i x=x+1 */
  }

  return 0;
}

/*----------------------------0.4b.c--------------------------*/
/* Program ilustruje petlju (do-while) */
#include <stdio.h>

int main() {
  int x;
	
  x = 1;
  do {
    printf("x = %d\n",x);
    x++; /* x++ je isto kao i x=x+1 */
  } while (x<=10);
}

/*----------------------------0.4c.c--------------------------*/
/* Program ilustruje petlju (for) */
#include <stdio.h>

int main() {
  int x;

  for (x = 1; x < 10; x++)
    printf("x = %d\n",x);

  return 0;
}

/*----------------------------0.4d.c--------------------------*/
/* Program ilustruje prekide petlje (continue, break) */
#include <stdio.h>

int main() {
  int i, j;

  for (i = 0; i < 10; i++) {
	if (i == 3)
	  break;   /* Prekid petlje */
	printf("i = %d\n", i);
  }

  for (j = 0; j < 10; j++) {
	if (j == 3)
	  continue; /* Prelazak na sledecu iteraciju */
	printf("j = %d\n", j);
  }

  
  return 0;
}

/*----------------------------0.5.c--------------------------*/
/* Program ilustruje definisanje funkcija - funkcija koja sabira dva broja */

#include <stdio.h>

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

int main() {
  /* Poziv funkcije */
  printf("%d\n", sum(3,5));
  return 0;
}


/*----------------------------0.6.c--------------------------*/
/* Program ilustruje rad sa (staticki alociranim) nizovima - pronalazenje maksimalnog elementa niza */
#include <stdio.h>

int main() {
  int a[] = {5, 8, 1, 3, 9, 4, 7, 2};
  /* Ovo ne moze:
         int a[];
     Ovo moze:
         int a[10];
     Cak i ovo:
         int a[100] = {3, 4};
  */

  int n = sizeof(a)/sizeof(int);

  int i, max;

  max = a[0];
  for (i = 1; i < n; i++)
	if (a[i] > max)
	  max = a[i];

  printf("Najveci je %d\n", max);
}

/*----------------------------0.7.c--------------------------*/
/* Program ilustruje rad sa niskama karaktera - funkcija koja izracunava duzinu niske */
#include <stdio.h>

int strlen(char s[]) {
  int d = 0;
  while (s[d] != '\0')
	d++;
  return d;
}

int main() {
  char s[] = "Poruka";
  /* Moze i ovako:
	 char s[] = {'P', 'o', 'r', 'u', 'k', 'a', '\0'};
	 Obratiti paznju na dodatu nulu na kraju!
	 'a' je razlicito od "a"
  */
  printf("Broj alociranih karaktera: %d\n", 
		 sizeof(s)/sizeof(char));

  printf("Duzina niske \"%s\" je %d\n", s, strlen(s));
}

/*----------------------------0.8.c--------------------------*/
/* Program ilustruje strukture - duzina vektora */
#include <stdio.h>
#include <math.h>

int main() {
  /* Vektori predstavljeni uredjenim parom koordinata */
  struct vector {
	int x, y;
  };

  struct vector a = {3, 4};

  printf("Duzina: %f\n", sqrt(a.x*a.x + a.y*a.y));

  return 0;
}

/*----------------------------0.9.c--------------------------*/
/* Program ilustruje C pretrpocesor - direktiva #define */

#include <stdio.h>

/* Simbolicka konstanta */
#define BROJ 3

/* Kvadrat broja - ne radi u svim slucajevima */
#define square1(a) a*a

/* Kvadrat broja - ispravljena verzija */
#define square2(a) ((a)*(a))

/* Do problema dolazi jer C pretprocesor doslovno vrsi zamene -  
   pogledati obavezno program nakon faze pretprocesiranja: gcc -E 0.9.c
*/

int main() {
	printf("BROJ: %d\n", BROJ);
	printf("square1(3): %d\n", square1(3));
	printf("square1(3+2): %d\n", square1(3+2));
	printf("square2(3+2): %d\n", square2(3+2));
}