Σάββατο, 18 Μαρτίου 2017

Αναθεώρηση 3 της έκδοσης 8.5

Πολύ καλή η αναθεώρηση 3. Δουλεύτηκε αρκετά και αφαιρέθηκαν Bug και προστέθηκε λειτουργικότητα!

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

Στις ομάδες η θέαση είναι μεγαλύτερη, τα τμήματα και οι συναρτήσεις (και οι τελεστές) βλέπουν ότι έχει η ομάδα, αρκεί να βάλουμε μια τελεία στην αρχή. Για αντικατάστη τιμών χρησιμοποιούμε το <= εκτός και αν είναι αντικείμενο που θέλει ειδική εντολή για να γίνει οπότε αρκεί το =.
Επειδή οι ομάδες μπορούν να έχουν ομάδες, η θέαση μεταβλητών προς τα πάνω, προς το πατρικό, δεν είναι δυνατόν, επειδή στην ομάδα εντός δεν  υπάρχει κάτι που να λέει "ανήκεις στην τάδε ομάδα". Όταν έφτιαξα τις ιδιότητες ήθελα η μεταβλητή πίσω από την ιδιότητα να μην είναι εντός της ιδιότητας. Επειδή η ιδιότητα σχεδιάστηκε να είναι ομάδα, έπρεπε να βρεθεί τρόπος να διαβάζουμε κάτι από τη γονική ομάδα (ακόμα και αν είναι κρυφό, όπως ό,τι είναι Ιδιωτικό). Αυτό λοιπόν το κάνει η εντολή Ένωσε Γονικό. Στην ουσία αυτή η εντολή υποθέτει ότι υπάρχει γονικό, βάζει την υποτιθέμενη ισχνή αναφορά (μια διεύθυνση) και καλεί μια Διάβασε να βγάλει τα κάστανα από τη φωτιά, η οποία αν πετύχει κάνει την γνήσια αναφορά, αν όχι βγάζει λάθος!

Σε επόμενη ανάρτηση θα δείξω και τη προσθήκη της ετικέτας Κλάση: στους ορισμούς Κλάσεων


Πήρα το παράδειγμα από το εγχειρίδιο Τεύχος 5 και το έφτιαξα με ιδιότητες.
Η κλάση Αυτοκίνητα πρέπει να φορτώνει ένα αντικείμενο (το μοντέλο) και να το κρατάει κλειστό, μέσα σε πίνακα (Μοντέλ(1)). Αυτό γίνεται γιατί δεν μπορούμε να πάρουμε την αναφορά στην ομάδα, αλλά θα πάρουμε αντίγραφο στη θέση του πίνακα (δεν έχει όνομα η ομάδα αυτή αλλά θέση πίνακα).
Η εντολή Ιδιότητα φτιάχνει άλλες εντολές και τις βάζει σε μια ομάδα με το όνομα της ιδιότητας. Εϊναι μια μακροεντολή, όπου συνθέτει κάτι αλλά δεν το πραγματοποιεί, απλά ο κώδικας θα δώσει το τελικό αποτέλεσμα. Μπορούμε να φτιάχνουμε ιδιότητες χωρίς τη χρήση της εντολής Ιδιότητα. Δείτε στην κλάση Αυτοκίνητα την ομάδα Μοντέλο. Έχει δυο τμήματα, το Αξία και το Θέσε, που σημαίνει ότι δίνει τιμή (Αξία) και λαμβάνει (θέσε). Επειδή οι ομάδες δεν βλέπουν προς το γονικό απ΄ευθείας θα πρέπει να γίνει μέσω αναφοράς. Η ένωσε γονικό φτιάχνει την αναφορά που θέλουμε. Και στην εντολή ιδιότητα υπάρχει αυτή η εντολή και ο διερμηνευτής παίρνει το όνομα της ιδιότητας έστω  Χ φτιάχνει στο γονικό την [Χ] και εκτλεί εντός της Αξία την Ένωσε Γονικό [Χ] στο Χ.


\\Παράδειγμα με αντικείμενα για την αναπαράσταση δεδομένων,
\\για μια έκθεση μεταχειρισμένων αυτοκινήτων.
Κλάση Αυτοκίνητα {
Ιδιωτικό:
      άδειες,
      Πίνακας Βάση 0, Άδειες(), Μοντέλ(1)
Δημόσιο:
      Ιδιότητα Έτος {Αξία}
      Ιδιότητα αρ_πλαισίου$ {Αξία}
      Ιδιότητα χρώμα$ {Αξία}
      Ιδιότητα εξοπλισμός$ {Αξία}
      \\ Ιδιότητα ως κατασκευή με Ομάδα
      Ομάδα Μοντέλο {
                  Αξία {
                        Ένωσε Γονικό Μοντέλ() στο Μοντ()
                        =Μοντ(0)
                  }
                  Θέσε {
                        Ένωσε Γονικό Μοντέλ() στο Μοντ()
                        Διάβασε Μοντ(0)
                  }
            }
      Ιδιότητα ΠρώτηΆδεια {
            Αξία {
                  Ένωσε Γονικό άδειες στο άδειες
                  Ένωσε Γονικό άδειες() στο άδειες()
                  Αν άδειες>0 τότε {
                        Αξία=άδειες(0)
                  } Αλλιώς {
                        ομάδα Α { Όνομα$ }
                        Αξία=Α
                  }
            }        
      }
      Ιδιότητα ΤελευταίαΆδεια {
            Αξία {
                  Ένωσε Γονικό άδειες στο άδειες
                  Ένωσε Γονικό άδειες() στο άδειες()
                  Αν άδειες>0 τότε {
                        Αξία=άδειες(άδειες-1)
                  } Αλλιώς {
                        ομάδα Α { Όνομα$ }
                        Αξία=Α
                  }
            }
      }
      Τμήμα Εισαγωγή_Αυτοκινήτου {
            Αν .αρ_πλαισίου$="" τότε {
                  Διάβασε .[αρ_πλαισίου]$, .[χρώμα]$, .[εξοπλισμός]$, .[Έτος]
                  Αν .αρ_πλαισίου$="" ή .χρώμα$="" ή .εξοπλισμός$="" τότε {
                        .[αρ_πλαισίου]$<=""
                        Λάθος "Λάθος στοιχεία"
                        }
              Διάβασε .Μοντελ(0)
            }
      }
      \\ Όμοια με το Νέα_Άδεια1, μόνο διαβάζει δεν διαβάζεται
      \\ Αντί της Ιδιότητας που χρησιμοποιεί τα αναγνωριστικά Αξία, Αξία$
      \\ εδώ μας αρκεί η απλή κατασκευή ιδιότητας!
      Ομάδα Νέα_Αδεια {
            Θέσε {
                  Αν Ταύτιση("Ο") τότε {
                        Ένωσε Γονικό άδειες στο άδειες
                        Ένωσε Γονικό άδειες() στο άδειες()
                        άδειες++
                        Πίνακας Άδειες(άδειες)
                        Διάβασε Άδειες(άδειες-1)
                  }
            }
      }
      Τμήμα Άδειασε_Η_Θέση {
                  .άδειες<=0
                  Πίνακας Βάση 0, .Άδειες()
                  Πίνακας Βάση 0, Μοντέλ()
                  Πίνακας Βάση 0, Μοντέλ(1)
                  .[αρ_πλαισίου]$=""
      }
}
Κλάση Αυτοκίνητο {
Ιδιωτικό:
      Ειδος_Μηχανής
      άλλοείδος$
Δημόσιο:
      Ιδιότητα Μάρκα$ {Αξία}
      Ιδιότητα Επιβάτες {Αξία}
      Ιδιότητα Κυβικά {Αξία}
      Ιδιότητα Ισχύς {Αξία}
      Ιδιότητα Αυτοδυναμία {Αξία}
      Ιδιότητα ΤύποςΜηχανής$ {
            Αξία {
                  Ένωσε Γονικό Ειδος_Μηχανής στο Ειδος_Μηχανής
                  Ένωσε Γονικό άλλοείδος$ στο άλλοείδος$
                  Αν Ειδος_Μηχανής<>0 τότε {
                        Επίλεξε Με Ειδος_Μηχανής
                        Με 1
                              Βάλε "ΠΕΤΡΕΛΑΙΟ"
                        Με 2
                              Βάλε "ΒΕΝΖΙΝΗ"
                        Με 3
                              Βάλε "ΗΛΕΚΤΡΙΚΟ"
                        Αλλιώς
                              Βάλε άλλοείδος$
                        Τέλος Επιλογής
                        Διάβασε Αξία$
                 }
           }
      }
Κλάση:
      Τμήμα Αυτοκίνητο {
            Αν .[Μάρκα]$="" τότε {
                  Αν Ταύτιση("ΓΑΑΑΓΑ") τότε Διάβασε .[Μάρκα]$, .[Επιβάτες], .[Κυβικά], .[Ισχύς], Λεκτικό$, .[Αυτοδυναμία]
                  Επίλεξε με Κεφ$(Λεκτικό$)
                  Με "DIESEL", "ΠΕΤΡΕΛΑΙΟ"
                        .Ειδος_Μηχανής<=1
                  Με "GASOLINE","ΒΕΝΖΙΝΗ"
                        .Ειδος_Μηχανής<=2
                  Με "ELECTRICITY","ΗΛΕΚΤΡΙΚΟ"
                        .Ειδος_Μηχανής<=3
                  Αλλιώς
                  {
                        .Ειδος_Μηχανής<=99
                        .άλλοείδος$<=Κεφ$(Λεκτικό$)
                  }
                  Τέλος Επιλογής
            }
      }
}
Κλάση Άδεια {
      Ιδιότητα Όνομα$ {Αξία}
      Ιδιότητα Έτος {Αξία}
      Ιδιότητα Μήνας {Αξία}
      Ιδιότητα ΑΦΜ$ {Αξία}
Κλάση:
      Τμήμα Άδεια {
            Διάβασε .[Όνομα]$, .[Έτος], .[Μήνας], .[ΑΦΜ]$
      }
}


\\ Το πρόγραμμα ξεκινάει εδώ:  Φτιάχνουμε ένα αντικείμενο για το αυτοκίνητο
Μοντέλο1=Αυτοκίνητο("SCODA FELICIA", 5, 1289, 50,"ΒΕΝΖΙΝΗ", 400)


\\ έστω η έκθεση έχει 20 θέσεις για αυτοκίνητα
ΠΙΝΑΚΑΣ Βάση 1, Έκθεση(20)=Αυτοκίνητα()


\\ Θα βάλουμε σε θέση1 και θέση2 αυτοκίνητα ίδιου μοντέλου, αλλά με διαφορές σε αριθμό πλαισίου, χρώμα, επίπεδο εξοπλισμού, χρονολογία κατασκευής.
Έκθεση(1).Εισαγωγή_Αυτοκινήτου "B123XV54JKL01309","BLUE","LS", 1995, Μοντέλο1
Έκθεση(2).Εισαγωγή_Αυτοκινήτου "B124XV14JKL01507","GREEN METALIC","XLS", 1995, Μοντέλο1
\\ Θα βάλουμε σε κάθε αμάξι τις άδειες που έχει βγάλει δίνοντας όνομα κατόχου, έτος, μήνας και ΑΦΜ.
Έκθεση(1).Νέα_Αδεια=Αδεια("ΧΑΛΑΣΤΡΑΣ ΧΑΡΗΣ",1995,10,"045451234")
Έκθεση(1).Νέα_Άδεια=Αδεια("ΧΑΛΑΣΤΡΑΣ ΠΑΝΑΓΙΩΤΗΣ",2004,3,"055477651")
Έκθεση(2).Νέα_Άδεια=Αδεια("ΓΑΡΓΑΛΑΣ ΜΑΚΗΣ",1995,8,"049454556")
\\ Η καταχώρηση έγινε!
Φόρμα 80, 40
Διπλά
Αναφορά 2, "Έκθεση Αυτοκινήτων"
Κανονικά


Τύπωσε $(4,20),
Για Ι=1 Έως 20 {
      Πένα 13 {
            Τύπωσε $(4,10), ΜΟΡΦΗ$("Α/Α:{0}",Γραφή$(Ι,"00")),
      }
      Για Έκθεση(Ι) {
        Αν .Αρ_Πλαισίου$="" Τότε Έξοδος
        Τύπωσε
            \\ παίρνουμε από ένα αντίγραφο, από τα εσωτερικά αντικείμενα.
            Στη Μοντελο=.Μοντέλο, Άδεια=.ΠρώτηΆδεια, Τελευταία=.ΤελευταίαΆδεια
            Για Μοντέλο {
                  Τύπωσε "Μάρκα:",..Μάρκα$
                  Τύπωσε "Επίπεδο Εξοπλισμου:", @(Στηλη(1)),.Εξοπλισμός$
                  Τύπωσε "Χρώμα:",.Χρώμα$
                  Τύπωσε "Έτος Παραγωγής:",Γραφή$(.Έτος, "#")
                  Για Άδεια {
                        Αν ...Όνομα$<>"" Τότε {
                              Τύπωσε "Πρώτη 'Αδεια:",Μορφη$("{0}/{1}", ...Μήνας, ...Έτος)
                        } Αλλιώς {
                              Τύπωσε "Πρώτη 'Αδεια:","-"
                        }
                  }
                  Για Τελευταία {
                        Αν ...Όνομα$<>"" Τότε {
                              Τύπωσε "Τελευταία 'Αδεια:",Μορφη$("{0}/{1}", ...Μήνας, ...Έτος)
                        } Αλλιώς {
                              Τύπωσε "Τελευταία 'Αδεια:","-"
                        }
                  }
                  Τύπωσε "Αρ. Πλαισίου:",.Αρ_Πλαισίου$
                  Τύπωσε "Επιβάτες:", Γραφή$(..Επιβάτες,{# "άτομα"})
                  Τύπωσε "Κυβικά:", Γραφή$(..Κυβικά,{#" cc"})
                  Τύπωσε "Ισχύς:", Γραφή$(..Ισχύς,{#" hp"})
                  Τύπωσε "Κινητήρας:", ..ΤύποςΜηχανής$
                  Τύπωσε "Αυτοδυναμία:", Γραφή$(..Αυτοδυναμία,{#" Km"})
            }
      }    
}