Dijamant
Παρατηρούμε δηλώσεις τάξεων σε μια αντικειμενοστρεφή γλώσσα προγραμματισμού παρόμοια με τη .
Καθε δήλωση τάξης είναι της μορφής "" όπου είναι το όνομα της νέας τάξης που δηλώθηκε και τα ονόματα των τάξεων που κληρονομούνται από την τάξη .
Για παράδειγμα, "shape :;"" είναι μια δήλωση τάξης "shape" που δεν κληρονομεί καμία άλλη τάξη, ενώ "square: shape rectangle ;" είναι μια δήλωση τάξης "square" που κληρονομεί τις τάξεις "shape" και "rectangle".
Εάν η τάξη κληρονομεί την τάξη , η τάξη κληρονομεί την τάξη και ούτω καθεξής, μέχρι την κλάση που κληρονομεί την κλάση ,τότε λέμε ότι όλες οι τάξεις προέρχονται από την κλάση .
Οι κανόνες της προγραμματιστικής γλώσσας απαγορεύουν τους κυκλικούς ορισμούς, επομένως δεν επιτρέπεται να υπάρχει τάξη που προέρχεται από τον εαυτό της.
Με άλλα λόγια,η ιεραρχία της τάξης σχηματίζει ένα κατευθυνόμενο άκυκλο γράφημα.
Επιπλέον, δεν επιτρέπεται για το λεγόμενο διαμάντι να εμφανίζεται στην ιεραρχία της τάξης.
Ένα διαμάντι αποτελείται από τέσσερις διαφορετικές κατηγορίες έτσι ώστε να ισχύει:
- Οι τάξεις και προέρχονται από το .
- Η τάξη προέρχεται τόσο από το όσο και από το .
- Ούτε η τάξη προέρχεται από το , ούτε η τάξη προέρχεται από το .
Ένα διαμάντι Η ιεραρχία μετά την επεξεργασία όλων των δηλώσεων
από το πρώτο παράδειγμα.
Σας δίνεται μια σειρά από δηλώσεις τάξεων που πρέπει να επεξεργαστείτε διαδοχικά και να καθορίσετε για κάθε μία αν έχει δηλωθεί σωστά. Οι σωστά δηλωμένες τάξεις προστίθενται στην ιεραρχία, ενώ οι λανθασμένες απορρίπτονται. Δήλωση "" δηλώνεται σωστά αν ισχύει το εξής:
- Η τάξη δεν έχει δηλωθεί ακόμα
- Όλες οι τάξεις έχουν δηλωθεί προηγουμένως. Σημειώστε ότι αυτή η συνθήκη διασφαλίζει ότι τάξη δεν μπορεί ποτέ να προέλθει από τον εαυτό της ή ότι οι κύκλοι δεν μπορούν να υπάρχουν στην ιεραρχία της τάξης.
- Προσθέτοντας κλάση που κληρονομεί τα η ιεραρχία της τάξης παραμένει σε τάξη, δηλαδή δε σχηματίζεται κανένα διαμάντι.
Γράψτε ένα πρόγραμμα που θα επεξεργάζεται τις δηλώσεις αντίστοιχα όπως περιγράφεται παραπάνω και θα προσδιορίζει την ορθότητα της κάθεμίας από αυτές.
Είσοδος
Η πρώτη γραμμή εισόδου περιέχει τον ακέραιο - τον αριθμό των δηλώσεων.
Καθεμία από τις ακόλουθες γραμμές περιέχει μια μόνο δήλωση με τη μορφή "" όπου είναι μια σειρά από μηδέν, μία ή περισσότερες τάξεις που κληρονομεί η τάξη .
Όλα τα ονόματα τάξεων σε μια δήλωση είναι αμοιβαία διαφορετικά.
Το όνομα κάθε τάξης είναι μια συμβολοσειρά το πολύ πεζών γραμμάτων του αγγλικού αλφαβήτου.
Όλα τα στοιχεία μιας δήλωσης (τα ονόματα και οι χαρακτήρες τάξεων "" και "") χωρίζονται με ακριβώς ένα χώρο. Σε κάθε συγκεκριμένη δήλωση, για τον αριθμό των τάξεων ισχύει .
Έξοδος
Πρέπει να εκτυπώσετε γραμμές. Η γραμμή πρέπει να περιέχει "ok" εάν η δήλωση είναι σωστή και "greska" εάν δεν είναι.
Βαθμολογία
Υποπρόβλημα | Βαθμοί | Περιορισμοί |
1 | 13 | , η ορθότητα μπορεί να προσδιοριστεί ελέγχοντας μόνο τη συνθήκη . |
2 | 14 | , η ορθότητα μπορεί να προσδιοριστεί ελέγχοντας μόνο τις συνθήκες και . |
3 | 29 | |
4 | 44 |
Παραδείγματα
input
10
shape : ;
rectangle : shape ;
circle : shape ;
circle : ;
square : shape rectangle ;
runnable : object ;
object : ;
runnable : object shape ;
thread : runnable ;
applet : square thread ;
output
ok
ok
ok
greska
ok
greska
ok
ok
ok
greska
Επεξήγηση του 1ου παραδείγματος:
- Η τέταρτη δήλωση είναι λανθασμένη επειδή η τάξη "circle" έχει ήδη οριστεί στην τρίτη σειρά.
- Η έκτη δήλωση είναι λανθασμένη επειδή η τάξη "object" δεν έχει οριστεί ακόμα.
- Η όγδοη δήλωση είναι σωστή γιατί η τάξη "object" έχει πλέον δηλωθεί και η έκτη δήλωση απορρίφθηκε, επομένως η τάξη "runnable" δεν έχει οριστεί ακόμα.
- Η δέκατη δήλωση είναι λανθασμένη γιατί διαφορετικά σχηματίζονται τα ακόλουθα διαμάντια: "shape", "applet", "square", "runnable".
input
9
a : ;
x : ;
b : a x ;
c : b ;
d : a b c ;
e : d a ;
f : c e ;
y : x ;
g : c y e ;
output
ok
ok
ok
ok
ok
ok
ok
ok
greska
Επεξήγηση του 2ου παραδείγματος:
*Η δέκατη δήλωση είναι λανθασμένη γιατί διαφορετικά σχηματίζονται τα ακόλουθα διαμάντια: "", "", "", "" (και πολλά άλλα).
Comments