/***************************************************************************
 * File:     vb-matrix.c
 * Status:   20-mar-2002, pfk.
 *           22-sep-201, wlm
 * Functie:  Voorbeeld van dynamisch alloceren van matrix en van werken met
 *           matrix.
 ***************************************************************************/

#include <stdio.h>
#include <stdlib.h>

#define MAX_DIM 10  /* maximaal toegestane grootte van NxN matrix */

/*=========================================================================*/

int main ()
{
  int   **matr;                 /* pointer naar array van arrays = matrix */
  int   aantal_kol, aantal_rij; /* afmetingen van matrix */
  int   kolom, rij;             /* loopvariabelen */

/* Vraag afmeting van matrix. */

  printf ("\nGeef dimensie N van NxN matrix [2 <= dim <= %d]: ", MAX_DIM);
  scanf ("%d", &aantal_rij);
  if ( (aantal_rij< 2) || (aantal_rij>MAX_DIM) )
  { printf ("  Waarde %d ligt buiten gevraagde grenzen!\n", aantal_rij);
    return (1);
  }
  aantal_kol = aantal_rij;  /* NxN matrix */

/* Alloceer ruimte voor matrix:
 *   eerst een array van pointers (de rijen),
 *   dan voor elk rij-element een array van integers (de kolommen).   */

  matr = (int **) malloc (aantal_rij*sizeof(int *));
  if ( matr == NULL) {
        fprintf(stderr,"Alloceren geheugen voor **matr mislukt\n");
        exit(10);
  }
  for (rij=0; rij<aantal_rij; rij++) {
    matr[rij] = (int *) malloc (aantal_kol*sizeof(int));
    if ( matr[rij] == NULL) {
        fprintf(stderr,"Alloceren geheugen voor matr[%d] mislukt\n",rij);
        exit(10);
    }
 }
/* Vul matrix. */

  for (rij=0; rij<aantal_rij; rij++)
  { for (kolom=0; kolom<aantal_kol; kolom++)
      matr[rij][kolom] = rij * kolom - rij;
  }

/* Schrijf matrix uit. */

  printf ("\n  Matrix is %dx%d:\n", aantal_rij, aantal_kol);
  for (rij=0; rij<aantal_rij; rij++)
  { for (kolom=0; kolom<aantal_kol; kolom++)
      printf ("%4d", matr[rij][kolom]);
    printf ("\n");
  }
  printf ("\n");

/* Spiegel matrix. */

  for (rij=0; rij<aantal_rij; rij++)
  { for (kolom=0; kolom<rij; kolom++)
    { int temp; /* lokale hulpvariabele in {...}-blok */
      temp = matr[kolom][rij];
      matr[kolom][rij] = matr[rij][kolom];
      matr[rij][kolom] = temp;
    }
  }

/* Schrijf resultaat uit. */

  printf ("  Gespiegelde matrix:\n");
  for (rij=0; rij<aantal_rij; rij++)
  { for (kolom=0; kolom<aantal_kol; kolom++)
      printf ("%4d", matr[rij][kolom]);
    printf ("\n");
  }
  printf ("\n");

  return (0);
}
