Τρίτη, 28 Νοεμβρίου 2017

Παράδειγμα Αντικειμενοστραφή Προγραμματισμού

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

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



Υπερκλάση Τράπεζα {
      Μοναδικό:
            Συνολο, ΤρέχονΚλειδί$
            Κατάσταση Λογαριασμοί, Ποσά, ΜεΑφμ, ΑφμΟνομα
            Συνάρτηση Κλειδί$ (ν){
                  μ=ν υπόλοιπο 9+1
                  ν*=28395671
                  ν=Τιμή(Γραφή$(ν,{00000000})) υπολοιπο 100000000
                 =Μορφη$("4{0}{1}",Δεξι$(Γραφή$(ν,{00"-"0000"-"00}), 10), μ)
            }
      Δημόσιο:
      ΚαταθέτηςΝο, Κλειδί$, Όνομα$
      Χρήματα
      Κλάση Λογαριασμός {
            Ποσό, Κλειδί$
            Κλάση:
            Τμήμα Λογαριασμός {
                  Διάβασε ? .Κλειδί$, .Ποσό
            }
      }
      Τμήμα Τρέχον (Αφμ, ν) {
            Για Υπερκλάση, Αυτό {
                  Μ=.Ποσά(ν)
                  ..Χρήματα<=Μ.Ποσό
                  ..ΚαταθέτηςΝο<=ν
                  ..Κλειδί$<=Μ.Κλειδί$
                        Αν Υπάρχει(.ΑφμΟνομα, Αφμ) Τότε {
                             Αυτό.Όνομα$<=Εκφρ$(.ΑφμΟνομα)
                        }
            }
      }
      Συνάρτηση Πρόσθεσε {
                  Διάβασε Αφμ, ποιος$
                  Διάβασε ? πόσο
                  Τοπική ν, κ$
                  Για Υπερκλάση {
                              ν=μηκος(.Λογαριασμοί)
                              Επανέλαβε{
                                    ν++
                                    οκ=αληθές
                                   Δες οκ {
                                          κ$=.Κλειδι$(ν)
                                          Προσθήκη .Λογαριασμοί, κ$:=(ν, Αφμ)
                                    }
                              } Μέχρι οκ
                               Προσθήκη .Ποσά, ν:=.Λογαριασμός(κ$, ποσό)
                               Αν υπάρχει(.ΜεΑφμ,Αφμ) Τότε {
                                     ΜΜ=Ένωση(Εκφρ(.ΜεΑφμ), (ν,))
                                    Επιστροφή .ΜεΑφμ, Αφμ:=ΜΜ
                              } Αλλιώς {
                                    Προσθήκη .ΜεΑφμ, Αφμ:=(ν,)
                                    Προσθήκη .ΑφμΟνομα, Αφμ:=Κεφ$(ποιος$)
                              }
                  }
                
                 .ΚαταθέτηςΝο<=ν
                 .Κλειδί$<=κ$
                 .Όνομα$<=Ποιος$
                 =Αληθής
            }
            Τμήμα Συνδικαιούχος (Αφμ, ποιος$) {
                  Για Υπερκλάση {
                        Αν υπάρχει(.ΜεΑφμ, Αφμ) Τότε {
                        ' δες αν είναι ήδη συνδικαιούχος
                        ' οκ
                              ΜΜ=Ένωση(Εκφρ(.ΜεΑφμ), (Αυτό.ΚαταθέτηςΝο,))
                              Επιστροφή .ΜεΑφμ, Αφμ:=ΜΜ
                        } Αλλιώς {
                              Προσθήκη .ΜεΑφμ, Αφμ:=(Αυτό.ΚαταθέτηςΝο,)
                              Προσθήκη .ΑφμΟνομα, Αφμ:=Κεφ$(ποιος$)
                        }
                        Αν υπάρχει(.Λογαριασμοί,Αυτό.Κλειδί$) Τότε {
                              ΜΜ1=Ένωση(Εκφρ(.Λογαριασμοί), (Αφμ,))
                              Επιστροφή .Λογαριασμοί, Αυτό.Κλειδί$:=ΜΜ1
                        }
                  }
            }
            Συνάρτηση Δικαιούχοι {
                   Α=(,)
                   Για Υπερκλάση {
                        Αν υπάρχει(.Λογαριασμοί,Αυτό.Κλειδί$) Τότε {
                              Α=Ένωση(Α,Εκφρ(.Λογαριασμοί))
                              Επιστροφή .Λογαριασμοί, Αυτό.Κλειδί$:=Α
                        }
                        Πίνακας Αντίγραφο()
                        Αντίγραφο()=Α
                        =Αντίγραφο()
                  }
            }
            Συνάρτηση ΤρέχονΛογαριασμός {
                  Μ=.Λογαριασμός()
                  Για Υπερκλάση {
                        Μ=.Ποσά(Αυτό.ΚαταθέτηςΝο)
                  }
                  Ομάδα Μ1 {
                        Ιδιότητα Ποσό {Αξία}=Μ.Ποσό
                        Ιδιότητα Ποιός$ {Αξία}=Αυτό.Όνομα$
                        Ιδιότητα Λογαριασμός$ {Αξία}=Μ.Κλειδί$
                  }
                  =Μ1
            }
            Συνάρτηση ΌνομαΑπόΑφμ$ (Αφμ) {
                  Για Υπερκλάση {
                        Αν Υπάρχει(.ΑφμΟνομα, Αφμ) Τότε {
                              =Εκφρ$(.ΑφμΟνομα)
                        }
                  }
            }
            Συνάρτηση ΠίνακαςΑφμ {
                  Για Υπερκλάση {
                        Πίνακας Όλα$(Μήκος(.ΑφμΟνομα))
                        Μ=κάθε(.ΑφμΟνομα)
                        Ενώ Μ {
                              Όλα$(Μ^)=Εκφρ$(.ΑφμΟνομα, Μ^)
                        }
                       Ν=Όλα$()
                       =Ν
                  }
            }
            Συνάρτηση ΠίνακαςΛογαριασμώνΒάσειΑφμ (Αφμ){
                  Για Υπερκλάση {
                        Α=(,)
                        Αν Υπάρχει(.ΜεΑφμ, Αφμ) Τότε {
                               Α=Εκφρ(.ΜεΑφμ)
                        }
                        =Α
                  }                  
            }
}
ΤράπεζαΑλφα=Τράπεζα
Συνάρτηση ΚαταθετικόςΛογαριασμός {
      Διάβασε Τράπεζα, Αφμ, Όνομα$, Ποσό
      Αν Τράπεζα.Πρόσθεσε(Αφμ, Όνομα$, Ποσό) Τότε {
            =Τράπεζα
      } Αλλιώς Λάθος "Δεν μπορώ να προσθέσω Καταθετικό Λογαριασμό"
}
    
Τερματικό1=ΚαταθετικόςΛογαριασμός(ΤράπεζαΑλφα, 58475754, "Γ. Φ. Καρράς", 1000)
ΔείξεΤρέχον(Τερματικό1)
Αν Τερματικό1.Πρόσθεσε(78495861, "Χ. Φ. Καρρά", 20000) Τότε {
      Τερματικό1.Συνδικαιούχος 58475754, "Γ. Φ. Καρράς"
      ΔείξεΤρέχον(Τερματικό1)
}
ΛογαριασμοίΑνάΑφμ(Τερματικό1)

Τέλος
Ρουτίνα ΔείξεΤρέχον(Τερματικό)
      Τοπική Ν0, Όλοι
      Για Τερματικό {
            Τοπική Μ=.ΤρέχονΛογαριασμός()
            Για Μ {
                  Τύπωσε "Λογαριασμός:";..Λογαριασμός$
                  Τύπωσε "Ποσό",..Ποσό
                  Όλοι=.Δικαιούχοι()
                  Τύπωσε "Δικαιούχοι"
                  Ν0=Κάθε(Όλοι, 2, -1)
                  Ενώ Ν0 {
                        Τύπωσε Μορφη$("{1:20} {0}",γραφη$(Πίνακας(Ν0),"000000000"), .ΌνομαΑπόΑφμ$(Πίνακας(Ν0)))
                  }
            }
      }
      Τέλος Ρουτίνας
Ρουτίνα ΛογαριασμοίΑνάΑφμ(Τερματικό)
      Τύπωσε "Λογαριασμοί ανά ΑΦΜ"
      Τοπική Ολα, Μ, Ν
      Για Τερματικό {
            Όλα=.ΠίνακαςΑφμ()
            Μ=Κάθε(Όλα)
            Ενώ Μ {
                  Τύπωσε Μορφη$("{1:20} {0}",γραφη$(Πίνακας(Μ),"000000000"), .ΌνομαΑπόΑφμ$(Πίνακας(Μ)))
                  Ν=.ΠίνακαςΛογαριασμώνΒάσειΑφμ(Πίνακας(Μ))
                  Ν0=Κάθε(Ν)
                  Ενώ Ν0 {
                    .Τρέχον Πίνακας(Μ), Πίνακας(Ν0)
                    Τύπωσε .Κλειδί$, .Χρήματα
                  }
            }
      }
Τέλος Ρουτίνας