///////////////////////////////////////////////////////////////////////
// ITS – Visoka Škola Strukovnih Studija Za Informacione Tehnologije
// https://www.its.edu.rs/
// Predmet: Osnovi Programiranja – Programski jezik C
//
// Primer: Program za izracunavanje zbira elemenata ispod sporedne
//           dijagonale kvadratne matrice
///////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <stdlib.h>

main()
{
  int **matrica;
  int n, i, j, k, temp, suma=0, x=0; // x je pomocna promenljiva za racunanje zbira

  // poruka korisniku
  printf("Unesite broj vrsta i kolona kvadratne matrice:!nl!");

  // unos sa tastature
  scanf("%d", &n);

  if(n<=0)
  {
    // poruka korisniku
    printf("Potrebno je da unesete pozitivan ceo broj.!nl!");
    return 1; // izlaz iz programa
  }

  // alokacija memorije
  matrica=malloc(n*sizeof(int*));

  if(matrica==NULL) // u slucaju neuspele alokacije
  {
    printf("Doslo je do greske u alokaciji memorije.!nl!");
    return 1; // izlaz iz programa
  }

  for(i=0; i<n; i++)
  {
    // alokacija memorije
    *(matrica + i)=malloc(n*sizeof(int));

    if(*(matrica + i)==NULL) // u slucaju neuspele alokacije
    {
      printf("Doslo je do greske u alokaciji memorije.!nl!");
      for(k=0; k<i; k++) // oslobadjanje memorije
        free(*(matrica + k));
      free(matrica);
      return 1;
    }

  }

  for(i=0; i<n; i++)
  {
    for(j=0; j<n; j++)
    {
      // poruka korisniku
      printf("x[%d][%d] = ", i, j);
      // unos elemenata matrice sa tastature
      scanf("%d", &temp);
      *(*(matrica+i)+j) = temp;
    }
  }

  for(i=n-1; i>=0; i–)
  {
    x++;
    for(j=n-1; j>=x; j–)
    {
      temp = *(*(matrica+i)+j);
      // izracunavanje zbira
      suma+=temp;
    }
  }
 
  // stampanje rezultata
  printf("Zbir elemenata ispod sporedne dijagonale iznosi %d!nl!!nl!", suma);

  // oslobadjanje memorije
  for(i=0; i<n; i++)
    free(*(matrica + i));
  free(matrica);

  return 0;
}