#Σκοπός της Άσκησης είναι:
#Να ζητήσεις απο τον χρήστη εναν αριθμό m>10
#Να δημιουργήσεις έναν πίνακα mxm με τυχαίους μιγαδικούς αριθμούς (real + imagj),όπου κάθε μέρος,πραγματικό και φανταστικό είναι στο διάστημα [-1,1]
#Να τυπώσεις τους μιγαδικούς αριθμούς με μορφή "real+imagj"
#Να υπολογίσεις το μέγιστο πραγματικό μέρος και τον μέσο όρο τωβ φανταστικών μερών


#!/usr/bin/python3
import random
#Δήλωση ότι το αρχείο ειναι Python3 script
#Εισάγει τη βιβλιοθήκη random για παραγωγή τυχαίων αριθμών.
def read_integer():
	while True:
	 try:
	      m=int(input("Dose m:"))
	      if m<=10:
	      	raise ValueError("To m >10")
	      return m
	 except Exception as e:
		 print (f"Error:{e}")
		 exit(1)
#Ζητάει απο τον χρήστη έναν ακέραιο m
#Ελέγχει οτι το m>10.Αν όχι εμφανίζει μήνυμα και τερματίζει το πρόγραμμα.
#Επιστρέφει τον έγκυρο αριθμό.
def generate_complex_2d_list(m):
	return [[
		complex(round(random.uniform(-1,1),2),round(random.uniform(-1,1),2))
		for _ in range(m)
		] for _ in range(m)]
#Δημιουργεί και επιστρέφει έναν δισδιάστατο πίνακα (mxm) απο μικρούς μιγαδικούς αριθμούς.
#Για κάθε στοιχείο του πίνακα:Το πραγματικό μέρος είναι δεκαδικός στο διάστημα [-1,1](με 2 δεκαδικά ψηφία)
#Το φανταστικό μέρος ειναι επίσης στο [-1,1]
def split_real_imag(matrix):
	real_parts=[]
	imag_parts=[]
	for row in matrix:
		for z in row:
			real_parts.append(z.real)
			imag_parts.append(z.imag)
	return real_parts,imag_parts
#Παίρνει τον 2D πίνακα matrix και τον επεξεργάζεται.
#Εξάγει τα:Πραγματικά μέρη κάθε αριθμού->real parts
#και τα φανταστικά μέρη->imag_parts.
#Επιστρέφει τις δύο λίστες.

def main():
	m=read_integer()
	complex_matrix=generate_complex_2d_list(m)
#Διαβάζει το m απο τον χρήστη
#Δημιουργεί τον πίνακα με τυχαίους μιγαδικούς αριθμούς.
	#print(complex_matrix)
	for row in complex_matrix:
		print([f"{z.real}+{z.imag}j" for z in row])
#Τυπώνει κάθε γραμμή του πίνακα,φορμαρισμένη ώστε κάθε μιγαδικός αριθμός να εμφανίζεται ως real+imagj
	real_parts,imag_parts=split_real_imag(complex_matrix)
	print (f"Max real={max(real_parts)}, Mean imag={sum(imag_parts)/len(imag_parts)}")
#Χωρίζει τα μέρη των μιγαδικών.
#Υπολογίζει:Το μέγιστο πραγματικό μέρος(max(real_parts)) και τον μέσο όρο φανταστικών τιμών (sum(imag_parts)/len(imag_parts))
if __name__=="__main__":
	main()
#Εκτελεί την main οταν το αρχείο τρέχει ως script


#Απο την άσκηση μαθαίνουμε:
#Πως να χειρίζομαι δισδιαστατες λίστες (2D)
#Πώς να δημιουργώ και να εργάζομαι με μιγαδικούς αριθμούς στην Python.
#Πώς να χρησιμοποιώ random.uniform() για δεκαδικούς στο συγκεκριμένο διάστημα.
#Πώς να φορμάρω την έξοδο με τρόπο που ννα διαβάζεται εύκολα
#Πως να εξάγω και να στατικοποιώ δεδομένα (max/mean) απο δομές δεδομένων 

