#include <iostream>
#include <cstdlib>  // Βιβλιοθήκη για τη συνάρτηση rand()

using namespace std;

// Συνάρτηση που δεσμεύει δυναμικά έναν πίνακα n x n και
// τον γεμίζει με τυχαίους αριθμούς
int **init_a(int **a, int n) {// **=δεικτης σε δεικτη
   
  	a=new int *[n];
        for (int i=0;i<n;i++) 
        //Για κάθε γραμμή i, δεσμεύει δυναμικά έναν πίνακα από n 
        //ακεραίους (στήλες) και αποθηκεύει τον δείκτη στο a[i].
	   a[i]=new int[n];
 	for (int i=0;i<n;i++) {
	  for (int j=0;j<n;j++) 
	  {
	     a[i][j]=rand()%10;
	  }
				}
        return a; 	
            	               }
//εκτυπωση πινακα

void print_2D(int **a, int n) {
	for (int i=0; i <n ; i++)
	  {
	   for(int j=0; j<n ; j++)
	       {
		cout<< a[i][j] << " ";
		       }
		       cout<< endl;
		  }
	}

int main() 
{
//δηλώνω έναν διπλό δείκτη a και τον αρχικοποιω με nullptr για να μην δείχνει πουθενά
	int **a=nullptr;
	//Καλεί τη συνάρτηση init_a περνώντας τον a (αν και δεν χρησιμοποιείται
	// στην πραγματικότητα μέσα στη συνάρτηση) και το μέγεθος 4.
	// Η συνάρτηση δημιουργεί έναν πίνακα 4×4 με τυχαίες τιμές
	//και επιστρέφει τον δείκτη του, ο οποίος αποθηκεύεται στο a.
	a=init_a(a,4);
	/**Η init_a είναι μια συνάρτηση που δημιουργεί και αρχικοποιεί 
	έναν δισδιάστατο πίνακα (τετραγωνικό) μεγέθους n × n. 
	Ανήκει στο καθολικό πεδίο (global scope) του προγράμματος,
	δηλαδή ορίζεται έξω από τη main.*/
	print_2D(a,4);
	return 0 ;
}
