Προγράμματα σε ΓΛΩΣΣΑ της ΑΕΠΠ (3ης Λυκείου) Σελίδα 2

Μέρος 2ο (προηγούμενο, επόμενο)
Τα προγράμματα σε αυτή τη σελίδα αναφέρονται σε δημοσιεύσεις που έχουν γίνει στο http://alkisg.mysch.gr/steki/index.php αλλά η διαχειριστική ομάδα του συγκεκριμένου τόπου θέλει να τα αφαιρέσει, με τη δικαιολογία ότι "αποσπούν" την προσοχή των μαθητών και των καθηγητών από τα προβλεπόμενα. Σέβομαι την άποψη του διαχειριστή που επικοινώνησε μαζί μου, και για "ιστορικούς λόγους" θα μπουν τα προγράμματα εδώ:

τα προγράμματα βρίσκονται εδώ σε αρχείο zip.

Κυκλική Ουρά σε πίνακα

Πρόγραμμα Κυκλική_Ουρα.glo
Λοιπόν έκατσα και το έφτιαξα, αυτό που εννοούσα Κυκλική Ουρά. Οι πίνακες στη ΓΛΩΣΣΑ ξεκινούν από 1, οπότε έχουμε το -1+1 και το +1 που έγραφα πιο πάνω (Απλά εδώ δεν φαίνεται το -1+1). Επίσης η κενή ουρά φαίνεται όταν το Μπροστά είναι μηδέν, δηλαδή ένα νούμερο που δεν μπορούμε να χρησιμοποιήσουμε για το πίνακα, αφού είναι από το 1. Έχω βάλει τρεις διαδικασίες, μια για Εισαγωγή, μια για εξαγωγή και μια για να δείχνει την ουρά, χωρίς να αλλάζει τίποτα.
Στο τέλος επίτηδες ζητάω να αφαιρεθεί ένα παραπάνω και μου λέει το πρόγραμμα ότι κάνω λάθος.
Επίσης αν βάλουμε περισσότερα στοιχεία απλά δεν τα βάζει, και μας το αναφέρει.


Η ουρά είναι άδεια
Αρχή Ουράς 1
1
2
3
4
5
6
7
8
9
10
Τέλος ουράς 1
Εξαγωγή 1
Εξαγωγή 2
Εξαγωγή 3
Εξαγωγή 4
Εξαγωγή 5
Αρχή Ουράς 6
6
7
8
9
10
Τέλος ουράς 1
Αρχή Ουράς 6
6
7
8
9
10
11
12
13
14
15
Τέλος ουράς 6
Εξαγωγή 6
Εξαγωγή 7
Εξαγωγή 8
Εξαγωγή 9
Εξαγωγή 10
Εξαγωγή 11
Εξαγωγή 12
Εξαγωγή 13
Εξαγωγή 14
Εξαγωγή 15
Η ουρά είναι άδεια
Αρχή Ουράς 6
16
17
Τέλος ουράς 8
Εξαγωγή 16
Εξαγωγή 17
Λάθος Εξαγωγής, Η ουρά είναι άδεια
Η ουρά είναι άδεια


Υ.Γ.
Φαίνεται πόσο χάλια είναι η ΓΛΩΣΣΑ από δυο πράγματα:
Οι σταθερές δεν μπορούν να γραφτούν ως γενικές. Θα ήθελα να αλλάξω σε μια σταθερή το μέγεθος του πίνακα, και όπου υπάρχει το 10 να αλλάξει και να γίνει η σταθερή. Μέσα στις διαδικασίες όμως πρέπει να ορίσουμε πάλι τη σταθερή, έτσι δεν έχει πρακτική αξία να συμμαζέψει κανείς το κώδικα με μια γενική σταθερή.

Άλλο σημείο που επίσης είναι χάλια, είναι η δήλωση του πίνακα Ουρα[] μέσα στην διαδικασία. Αυτό είναι πλεονασμός. Διότι ο πίνακας ήδη έχει δηλωθεί. Τι δεν μου αρέσει;

1. Δεν υπάρχει η γενική σταθερή που θα έδινε το μέγεθος του πίνακα σε όλο το πρόγραμμα, επίσης δεν υπάρχει συνάρτηση που να επιστρέφει το μέγεθος, αλλά ακόμα και έτσι, ας το περάσουμε σε παράμετρο.
2. Επειδή σώνει και καλά πρέπει να ισχύει το copy in copy out στο πέρασμα με αναφορά (δεν έχει καμία λογική στο μάθημα αυτό αυτή η παραξενιά), κάποιος σκέφτηκε ότι θα ισχύει και για τους πίνακες, και έτσι επίσης σκέφτηκε ότι πριν την αντιγραφή πρέπει να έχει δηλωθεί ο πίνακας (λες και πρέπει κάποιος να τον έχει στατικό στη διαδικασία, ενώ αυτό δεν είναι απαραίτητο, αφού κάθε φορά παίρνει τις νέες τιμές από το όρισμα). Αμέσως τι χάνουμε; Ότι η διαδικασία έχει φιξαριστεί για συγκεκριμένο μέγεθος. Αν έχω τρεις διαφορετικού μεγέθους ουρές πρέπει να έχω τρεις πανομοιότυπες διαδικασίες με την διαφορά στη δήλωση μεγέθους του πίνακα! Να γράφουμε για να φαίνεται μεγάλο το πρόγραμμα!

MASTERMIND αλα Bugman

Πρόγραμμα MASTERMIND.glo
Αρχικά δίνουμε την ώρα πχ αν είναι 10:15 δίνουμε το 1015
το πρόγραμμα ρωτάει αν θέλουμε να δούμε τις οδηγίες, και δίνουμε Ν και enter, ή Ο και enter ανάλογα.
μετά μας ζητάει ένα προς ένα τέσσερα νούμερα, τα οποία πρέπει να διαφέρουν από το σύνολο 0 έως 9.
Αν υπάρχει κάποιο σε σωστή θέση τότε δίνει *, αν απλώς υπάρχει αλλά σε λάθος θέση δίνει %, αλλά πάντα τα μπερδεύει ώστε να μην ξέρουμε ποιο υπάρχει και ποιο είναι και στη σωστή θέση.

Π.χ στο παρακάτω παράδειγμα στη σειρά 2 μας δίνει το [*%] που σημσίνει ότι ένα από τα τέσσερα είναι στη σωστή θέση και ένα άλλο υπάρχει σε λάθος θέση

Μέγιστες προσπάθειες είναι οι 50. Οποτεδήποτε, εκτός αν βρούμε τη λύση, μπορούμε να ζητήσουμε τη λύση.  Κάθε φορά που τελειώνει ένα παιχνίδι, με λύση ή χωρίς, μας ρωτάει αν θέλουμε να παίξουμε άλλο.

Όπως φαίνεται και στο κώδικα πρέπει να επιτρέψουμε από τις επιλογές του διερμηνευτή τη συνένωση αλφαριθμητικών.

MASTER MIND
-----------
1. 1234 []
2. 5678 [*%]
3. 1209 [%%]
4. 5690 [%%%]
5. 9067 [*%%]
6. 8067 [*%%]
7. 5076 [%%]
8. 0897 [%*%]
9. 1987 [*%]
10. 1207 [%]
11. 1230 [%]
12. 0968 [****]
ΜΠΡΑΒΟ ΤΟ ΒΡΗΚΕΣ
ΘΕΣ ΝΑ ΠΑΙΞΕΙΣ ΝΕΟ ΠΑΙΧΝΙΔΙ(Ν/Ο)
Ν
MASTER MIND
-----------
ΘΕΛΕΙΣ ΠΛΗΡΟΦΟΡΙΕΣ ΓΙΑ ΤΟ ΠΑΙΧΝΙΔΙ(Ν/Ο)
Ν
ΕΧΟΥΜΕ ΔΕΚΑ ΨΗΦΙΑ 0..9
ΚΡΥΒΩ ΤΕΣΣΕΡΑ ΑΠΟ ΑΥΤΑ
ΠΡΕΠΕΙ ΝΑ ΒΡΕΙΣ ΠΟΙΑ ΕΙΝΑΙ
ΚΑΙ ΣΕ ΠΟΙΑ ΘΕΣΗ
ΣΕ ΚΑΘΕ ΑΠΑΝΤΗΣΗ ΣΟΥ...
ΣΟΥ ΛΕΩ ΠΟΣΑ ΒΡΗΚΕΣ ΜΕ ΣΗΜΑΔΙ %
ΚΑΙ ΠΟΣΑ ΣΕ ΣΩΣΤΗ ΘΕΣΗ ΜΕ ΣΗΜΑΔΙ *
ΑΛΛΑ ΤΑ ΣΗΜΑΔΙΑ ΕΙΝΑΙ ΣΕ ΤΥΧΑΙΕΣ ΘΕΣΕΙΣ
ΟΠΟΤΕ ΘΕΣ ΜΠΟΡΕΙ ΝΑ ΤΟ ΠΑΡΕΙ ΤΟ ΠΟΤΑΜΙ...
ΚΑΙ ΝΑ ΜΑΘΕΙΣ ΤΗΝ ΛΥΣΗ!
ΒΡΕΣ ΤΑ ΤΕΣΣΕΡΑ ΣΗΜΕΙΑ
α/α. ΧΧΧΧ [ΕΛΕΓΧΟΣ]
1ο:
1
2ο:
2
3ο:
3
4ο:
4
MASTER MIND
-----------
1. 1234 [%]
ΘΕΣ ΝΑ ΣΥΝΕΧΙΣΕΙΣ(Ν/Ο)
Ν
1ο:
5
2ο:
6
3ο:
7
4ο:
8
MASTER MIND
-----------
1. 1234 [%]
2. 5678 [**]
ΘΕΣ ΝΑ ΣΥΝΕΧΙΣΕΙΣ(Ν/Ο)
Ν
1ο:
2
2ο:
3
3ο:
4
4ο:
0
MASTER MIND
-----------
1. 1234 [%]
2. 5678 [**]
3. 2340 [%*]
ΘΕΣ ΝΑ ΣΥΝΕΧΙΣΕΙΣ(Ν/Ο)
Ν
1ο:
1
2ο:
3
3ο:
6
4ο:
9
MASTER MIND
-----------
1. 1234 [%]
2. 5678 [**]
3. 2340 [%*]
4. 1369 [*]
ΘΕΣ ΝΑ ΣΥΝΕΧΙΣΕΙΣ(Ν/Ο)
Ν
1ο:
0
2ο:
3
3ο:
7
4ο:
8
MASTER MIND
-----------
1. 1234 [%]
2. 5678 [**]
3. 2340 [%*]
4. 1369 [*]
5. 0378 [****]
ΜΠΡΑΒΟ ΤΟ ΒΡΗΚΕΣ



ΔΥΑΔΙΚΟΣ ΑΘΡΟΙΣΤΗΣ 4 bit

Πρόγραμμα Adder4bit.glo
Έχουμε έναν υποθετικό υπολογιστή με μνήμη τριων 4 bit αριθμών, καθώς και ενός bit υπερχείλισης, Βεβαίως έχει και ότι χρειάζεται για νε εκτελέσει το άθροισμα των δυο πρώτων αριθμών της μνήμης και να το βάλει στο τρίτο αριθμό της μνήμης.

Το ενδιαφέρον εδώ είναι ότι το άθροισμα πρέπει να γίνει με χρήση πυλών. Τις πύλες δεν τις γνωρίζει ο υπολογιστής, αλλά μπορεί να χρησιμοποιεί bit των δυαδικών αριθμών και να τα βάζει σε πίνακες οι οποίοι παίζουν το ρόλο των πυλών. Επειδή στη ΓΛΩΣΣΑ έχουμε δείκτη σε πίνακα από το 1, θα χρησιμοποιούμε εσωτερικά στην μνήμη και στους πίνακες των πυλών το 1 ως 0 και το 2 ως 1.

Για παράδειγμα η πύλη ΟΧΙ_[2] έχει δυο θέσεις την 1 και την 2, ώστε το ΟΧΙ_[1] δίνει 2 και το ΟΧΙ_[2] δίνει 1  (λέγεται και αναστροφή)

Το κύκλωμα του αθροιστή περιλαμβάνει τέσσερις Full Adder (ολοκληρωμένους αθροιστές του ενός bit). Κάθε ένας Full Adder έχει δυο μισούς αθροιστές (Half Adders). Ο τετραπλός αθροιστής έχει έναν πίνακα υπερχειλίσεων ή υπερ[] ο οποίος έχει 5 στοιχεία. Κάθε Full Adder (FA) για κάθε ι bit, θέλει τρια πράγματα, και επιστρέφει δύο. Θέλει τα bit που θα προστεθούν συν το bit από το  υπερ[ι], και δίνει το bit αποτελέσματος (ή τελικό) και τυχόν υπερχείλιση στο υπερ[ι+1], έτσι ώστε αν υπάρχει επόμενος αθροιστής επειδή το ι θα γίνει ι+1 θα είναι σαν να έχει γίνει εισαγωγή. Το τελευταίο υπερ[ι] όπου ι=5 θα γίνει εξαγωγή ως υπερχείλιση αφού αφαιρέσουμε το 1 για να έχουμε τιμές από 0 έως 1.

Για να γίνει η πρόσθεση υπάρχουν δυο φάσεις, ή  δυο μισοί αθροιστές (Half Adder). Κάθε half adder παίρνει δυο πράγματα και επιστρέφει άλλα δυο.  Ο πρώτος παίρνει το bit  του πρώτου καταχωρητή (ή θέση μνήμης), και το bit υπερχείλισης και δίνει δυο αποτελέσματα, το sa και το ca.  O δεύτερος παίρνει σαν εισαγωγή το sa και το bit του δεύτερου καταχωρητή και δίνει το τελικό bit και το cb. Τα ca και cb βγάζουν την υπερχείλιση, για τον επόμενο αθροιστή, με έναν τύπο υπερ[ι+1]<-Η_[ca, cb]  δηλαδή αρκεί ένα από τα ca και cb να είναι αληθές για να δώσουν αληθές (τελικά το 1 θα δούμε, αν και εσωτερικά δουλεύει με +1 λόγω της βάσης των πινάκων της ΓΛΩΣΣΑΣ).

Ο κάθε μισός αθροιστής έχει δυο φάσεις (που γίνονται και παράλληλα). Η πρώτη φάση είναι η εξαγωγή του XOR() ή αλλιώς αποκλειστικού Η, το οποίο το φτιάχνουμε με πύλες ώστε

ΑΠΟΚΛ_Η_(α,β)=Η_[ΚΑΙ_[α, ΟΧΙ_[β]], ΚΑΙ_[β, ΟΧΙ_[α]]]

Στους επεξεργαστές μόνο οι τρεις πύλες υπάρχουν και ότι άλλο βγαίνει από αυτές.



Το ερώτημα εδώ είναι πώς θα μπορέσουμε να προσθέσουμε δυο 8 bit αριθμούς, τους οποίους θα δίνουμε ανά 4 bit. Η απάντηση είναι ότι όταν μηδενίσαμε (εδώ βάζουμε το 1 για μηδέν) τον πίνακα υπερ[] πρέπει να μπορούμε να βάλουμε στο υπερ[1] το Υπερχείλιση+1 (+1 για να πάμε στο 1 έως 2). Έτσι αρχικά μηδενίζουμε την Υπερχείλιση και προσθέτουμε τα δυο "χαμηλά" 4 bit και μετά προσθέτουμε τα δυο "ψηλά" 4 bit,  οπότε θα έχουμε δυο θέσεις μνήμης μια για κάθε άθροισμα.  Η ίδια τεχνική χρησιμοποιήθηκε στους 8 Bit επεξεργαστές για να προσθέσουν 32 bit αριθμούς, ενώ ο βασικός αθροιστής ήταν 8bit. Υπήρχε το carry flag το οποίο αρχικά με μια εντολή το σβήναμε και μετά κάναμε τις τέσσερις αθροίσεις. Αν δε έβγαινε το  carry flag ενεργό τότε λειτουργούσε σαν overflow flag δηλαδή σαν υπερχείλιση, γιατί δεν μπορεί τελικά να αποθηκευτεί στη μνήμη! Ενώ όσο έχουμε και άλλες προσθέσεις να κάνουμε που χρησιμοποιούν το carry flag δεν υπάρχει πρόβλημα, γιατί το στοιχείο του θα μπει στην άθροιση.


ΔΥΑΔΙΚΟΣ ΑΘΡΟΙΣΤΗΣ 4 bit ΓΙΑ 8 bit ΑΡΙΘΜΟΥΣ

Πρόγραμμα
Τώρα η μνήμη του υποθετικού υπολογιστή αυξήθηκε στις 6 θέσεις μνήμης. Στις δυο πρώτες θα βάζουμε έναν δυαδικό 8 bit, βάζοντας τα 4 bit χαμηλότερης αξίας σε χαμηλότερη θέση (βάσει της διεύθυνσης στη μνήμη). Έτσι στη μνήμη 1 θα είναι τα 4 χαμηλά bit και στην μνήμη 2 τα 4 υψηλά bit, ενός 8 bit αριθμού.

Επειδή θα μπορούσε να γραφτεί και αλλιώς, δηλαδή τα χαμηλά 4 bit να μπουν στην θέση 2 και τα υψηλά στην θέση 1, ο ορισμός θέσης ορίζεται και λέγεται Endianess. Αυτή η ιδιότητα έχει δυο τιμές, την Little-endian (αυτή χρησιμοποιούμε) και την Big-endian.

το πρόγραμμα ζητάει για κάθε 8 bit αριθμό, με το τρόπο που τους γράφει στην μνήμη.

Έτσι το 11110011 θα το δώσουμε ως 0011 και 1111 (τα αρχικά 0 μπορούμε να μην τα δώσουμε)

Και παραπάνω νούμερα να δώσουμε το πρόγραμμα κρατάει μόνο τα τέσσερα χαμηλότερης αξίας για να κάνει τον 4 Bit αριθμό
Δώσε ενα δυαδικό αριθμό ή έναν αρνητικό για τέλος
1.1
Μετατροπή σε 4 bit: 0 0 0 1
2.11
Μετατροπή σε 4 bit: 0 0 1 1
3.111
Μετατροπή σε 4 bit: 0 1 1 1
4.1111
Μετατροπή σε 4 bit: 1 1 1 1
θέσεις Μνήμης: 1 2 Δυαδικός:   0 0 1 1 0 0 0 1 μετατροπή σε δεκαδικό:49
θέσεις Μνήμης: 3 4 Δυαδικός:   1 1 1 1 0 1 1 1 μετατροπή σε δεκαδικό:247
θέσεις Μνήμης: 5 6 Δυαδικός:   0 0 1 0 1 0 0 0 μετατροπή σε δεκαδικό:40
Με υπερχείλιση
θέσεις Μνήμης: 5 6 Δυαδικός: 1 0 0 1 0 1 0 0 0 μετατροπή σε δεκαδικό:296



OOP στη ΓΛΩΣΣΑ


Πρόγραμμα oop.glo
Όπως με τις ουρές και τις στοίβες μπορούμε να τις κατασκευάσουμε με πίνακες (στην ουσία ο πίνακας είναι μνήμη), έτσι μπορούμε να φτιάξουμε αντικείμενα με πίνακες.

Το πρόγραμμα που ετοίμασα φτιάχνει μνήμη για έναν "αφηρημένο" τύπο αντικειμένου με μέχρι δυο ακέραιες τιμές, και συνδέει δέκα κενά αντικείμενα, αρχικά χωρίς τύπο. Ορίζουμε μια διαδικασία Νέο η οποία μας επιστρέφει έναν δείκτη σε νέο αντικείμενο, (θα είναι 0 αν δεν υπάρχει ελεύθερη μνήμη), και αφαιρεί από την λίστα των κενών το νέο αντικείμενο. Ορίζουμε μια διαδικασία ΒάλεΤιμές η οποία βάζει σε ένα αντικείμενο (βάσει του δείκτη) τον τύπο και τις άλλες δυο παραμέτρους. Ορίζουμε την διαδικασία Διαγραφή που διαγράφει το δείκτη που δίνουμε, και καθαρίζει την μνήμη.

Φτιάχνουμε τέσσερα αντικείμενα, έναν κύκλο, ένα τετράπλευρο, έναν ακόμα κύκλο, και ένα ακόμα τετράπλευρο. Παράλληλα βάζουμε το δείκτη του καθένα αντικειμένου στο πίνακα αντικείμενο[] δυο φορές.  Ο πίνακας αυτός έχει δέκα θέσεις, και αρχικά έχει τιμές 0, δηλαδή το δείκτη Τίποτα (Null)

Με μια Για διατρέχουμε το  πίνακα αντικείμενο και αν ο δείκτης δεν είναι ο Τίποτα, τότε εμφανίζουμε την τιμή του δείκτη (τον αριθμό μνήμης) και  καλούμε τρεις διαδικασίες, την Στοιχεία, την Περίμετρο και την Εμβαδόν. Και οι τρεις διαδικασίες γράφουν αποτελέσματα βάσει του τύπου του αντικειμένου.

Στο τέλος σβήνουμε τα αντικείμενα χρησιμοποιώντας τον πίνακα των αντικειμένων. Εδώ βέβαια έχουμε ένα πρόβλημα στη διαδικασία Διαγραφή: Στο πίνακα υπάρχουν οι δείκτες των αντικειμένων δυο φορές. Άρα την πρώτη φορά ο δείκτης θα χρησιμοποιηθεί για να διαγράψει τη μνήμη (να την αποδώσει πίσω στη λίστα των κενών). Την δεύτερη φορά τι θα γίνει; Ο δείκτης θα δείχνει σε ένα στοιχείο που θα έχει διαγραφεί! Εδώ το ξεπερνάμε το πρόβλημα με το εξής σκεπτικό:
Βάζουμε τους τύπους των αντικειμένων με αρνητικό πρόσημο, ενώ με θετικό πρόσημο είναι η διεύθυνση του επόμενου κενού στοιχείου, και το 0 είναι το Τίποτα. Έτσι πριν χρησιμοποιήσουμε έναν δείκτη σε αντικείμενο κοιτάμε αν είναι έγκυρος.

Σε άλλη έκδοση θα δείξω πώς λειτουργεί η μέτρηση δεικτών, ένας τρόπος που διαγράφει ένα αντικείμενο μόνο όταν διαγραφεί ο τελευταίος δείκτης! Δηλαδή στο πίνακα αντικείμενο θα μπαίνει 0 στη θέση του πίνακα που διαγράφουμε ένα αντικείμενο, αλλά το αντικείμενο θα διαγραφεί μόνο όταν και ο τελευταίος δείκτης προς αυτό θα διαγραφεί.

Κενή μνήμη: 10
Δημιουργία 4 αντικειμένων
Κενή μνήμη: 6
Πίνακας αντικείμενο, θέση  1 στη διεύθυνση #1
Κύκλος (#1) ακτίνα: 10
Κύκλος (#1) περίμετρος: 62
Κύκλος (#1) εμβαδόν: 314
Πίνακας αντικείμενο, θέση  2 στη διεύθυνση #2
Τετράπλευρο (#2) πλευρές: 15Χ10
Τετράπλευρο (#2) Περίμετρος: 50
Τετράπλευρο (#2) εμβαδόν: 150
Πίνακας αντικείμενο, θέση  3 στη διεύθυνση #3
Κύκλος (#3) ακτίνα: 5
Κύκλος (#3) περίμετρος: 31
Κύκλος (#3) εμβαδόν: 78
Πίνακας αντικείμενο, θέση  4 στη διεύθυνση #4
Τετράπλευρο (#4) πλευρές: 4Χ8
Τετράπλευρο (#4) Περίμετρος: 24
Τετράπλευρο (#4) εμβαδόν: 32
Πίνακας αντικείμενο, θέση  5 στη διεύθυνση #1
Κύκλος (#1) ακτίνα: 10
Κύκλος (#1) περίμετρος: 62
Κύκλος (#1) εμβαδόν: 314
Πίνακας αντικείμενο, θέση  6 στη διεύθυνση #3
Κύκλος (#3) ακτίνα: 5
Κύκλος (#3) περίμετρος: 31
Κύκλος (#3) εμβαδόν: 78
Πίνακας αντικείμενο, θέση  7 Τίποτα
Πίνακας αντικείμενο, θέση  8 Τίποτα
Πίνακας αντικείμενο, θέση  9 στη διεύθυνση #2
Τετράπλευρο (#2) πλευρές: 15Χ10
Τετράπλευρο (#2) Περίμετρος: 50
Τετράπλευρο (#2) εμβαδόν: 150
Πίνακας αντικείμενο, θέση  10 στη διεύθυνση #4
Τετράπλευρο (#4) πλευρές: 4Χ8
Τετράπλευρο (#4) Περίμετρος: 24
Τετράπλευρο (#4) εμβαδόν: 32
Διαγραφή αντικειμένων
Κενή μνήμη: 10

 (προηγούμενοεπόμενο)

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.