Διδακτικά Βιβλία του Παιδαγωγικού Ινστιτούτου

Αναζήτηση

Βρες
Εμφάνιση

14.1.1 Απλότητα - τυπικότητα

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

Παρ’ όλα αυτά και σήμερα προικισμένοι προγραμματιστές, ολισθαίνουν προς το σχεδιασμό ενός περίπλοκου προγράμματος, χρησιμοποιώντας συνήθως "ισχυρότερες" δομές από αυτές που είναι αναγκαίες.

Το απλό είναι ωραίο !!

Με το επόμενο παράδειγμα δίνονται για το ίδιο πρόβλημα τρεις διαφορετικές λύσεις και σχολιάζονται κατά πόσον ικανοποιούν το κριτήριο της απλότητας και της τυπικότητας.

Παράδειγμα 1 Δίδεται ταξινομημένος μονοδιάστατος πίνακας ακεραίων αριθμών 1000 θέσεων. Ζητείται να κατασκευαστεί πρόγραμμα, το οποίο να βρίσκει τη συχνότητα εμφάνισης κάθε αριθμού του πίνακα. Τα αποτελέσματα να εμφανίζονται στην οθόνη.

Ένας απλός και τυπικός αλγόριθμος θα πρέπει: - Να δίνει τις ίδιες τιμές στις μεταβλητές, είτε είναι η αρχή του προγράμματος, είτε πρόκειται για νέο αριθμό. - Αυτό που γίνεται σπανιότερα (), εδώ η αλλαγή του αριθμού, να ξεχωρίζει μέσα σε ένα ΑΝ, ενώ αυτό που γίνεται συνήθως (=) να βρίσκεται στην κανονική ροή του προγράμματος. - Ένα ΑΝ μπορεί να πραγματοποιεί τον επιθυμητό έλεγχο.

Έστω ότι τα περιεχόμενα του πίνακα είναι 2, 2, 3, 3, 3, 3, 5, 6, 6, 6, 6, 6, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9. Τότε το πρόγραμμα θα πρέπει να εμφανίσει τα εξής αποτελέσματα:

Αριθμός Συχνότητα 2 2 3 4 5 1 6 5 7 1 8 6 9 6

Τα επόμενα τρία προγράμματα λύνουν το πρόβλημα.

ΠΡΟΓΡΑΜΜΑ Συχνότητα1 ΜΕΤΑΒΛΗΤΕΣ ΑΚΕΡΑΙΕΣ: i, S, Προηγ_Α, A[1000] ΑΡΧΗ i S Προηγ_Α ΟΣΟ i < 1001 ΕΠΑΝΑΛΑΒΕ ΑΝ Προηγ_Α Α[i] ΤΟΤΕ ΓΡΑΨΕ Προηγ_Α, S Προηγ_Α S ΤΕΛΟΣ_ΑΝ S ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ ΓΡΑΨΕ Προηγ_Α, S ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ Συχνότητα1

ΠΡΟΓΡΑΜΜΑ Συχνότητα2 ΜΕΤΑΒΛΗΤΕΣ ΑΚΕΡΑΙΕΣ: i, S, Προηγ_Α, A[1000] ΑΡΧΗ i S Προηγ_Α ΟΣΟ i < 1001 ΕΠΑΝΑΛΑΒΕ ΟΣΟ Προηγ_Α = Α[i] ΚΑΙ i < 1001 ΕΠΑΝΑΛΑΒΕ S ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ ΓΡΑΨΕ Προηγ_Α, S Προηγ. Α S ΤΕΛΟΣ_ ΕΠΑΝΑΛΗΨΗΣ ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ Συχνότητα2

ΠΡΟΓΡΑΜΜΑ Συχνότητα3 ΜΕΤΑΒΛΗΤΕΣ ΑΚΕΡΑΙΕΣ: i, S, Προηγ_Α, A[1000] ΑΡΧΗ i S Προηγ_Α ΟΣΟ i < 1001 ΕΠΑΝΑΛΑΒΕ ΑΝ Προηγ_Α= Α[i] ΤΟΤΕ S ΑΛΛΙΩΣ ΓΡΑΨΕ Προηγ_ Α, S Προηγ_Α S ΤΕΛΟΣ_AΝ ΤΕΛΟΣ_ ΕΠΑΝΑΛΗΨΗΣ ΓΡΑΨΕ Προηγ_Α, S ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ Συχνότητα 3

Αρχικά παρατηρούμε ότι όλες οι λύσεις πληρούν όλους τους κανόνες του δομημένου προγραμματισμού και γενικότερα όλων των αρχών και κανόνων που θέσαμε σ’ αυτό το βιβλίο.

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

Στη δεύτερη λύση για κάποιες τιμές του i θα γίνει δύο φορές η ερώτηση i Αυτό θα συμβεί όταν βρεθεί το Προηγ_Α(i). Τότε η εσωτερική επαναληπτική διαδικασία θα τερματιστεί, θα γίνουν η εκτύπωση κ.λπ. και αμέσως μετά θα γίνει η ερώτηση i

Ένας λόγος που συνέβη αυτό είναι ότι, χρησιμοποιήθηκε ή δομή ΟΣΟ … ΕΠΑΝΑΛΑΒΕ που είναι ισχυρότερη της ΑΝ που πραγματικά χρειάζεται.

Στην τρίτη λύση δεν έχουμε τυποποίηση, γιατί η λύση δίνει την ίδια βαρύτητα στο συνηθισμένο γεγονός (=) και στο σπάνιο (), τοποθετώντας τα μέσα σε ένα ΑΝ…TOTE…ΑΛΛΙΩΣ.

Συμπερασματικά: - Η πρώτη λύση είναι απλούστερη και τυπικότερη. - Η δεύτερη λύση δεν πληρεί το κριτήριο της απλότητας, μια που χρησιμοποιεί δομή περισσότερο σύνθετη απ’ όσο χρειάζεται. - Η τρίτη λύση είναι απλή, υστερεί όμως σε τυπικότητα.

Παρατηρήστε ότι και στις τρεις λύσεις, οι ενέργειες που γίνονται όταν αλλάζει το περιεχόμενο του Α(i) χωρίζονται σε δύο επιμέρους τμήματα. Το ένα "ΓΡΑΨΕ Προηγ.Α, S" επαναλαμβάνεται το ίδιο πριν το τέλος του προγράμματος, ενώ το άλλο "Προηγ. Α Ο χωρισμός γίνεται γιατί, στο κάθε τμήμα μπορούμε να διακρίνουμε συγκεκριμένο σκοπό. Το τμήμα με την εντολή "ΓΡΑΨΕ Προηγ.A, S" είναι η βασική επεξεργασία, η καρδιά του προγράμματος, εκτελείται κάθε φορά που αλλάζει ο αριθμός, αλλά και μετά το τέλος της επαναληπτικής διαδικασίας. Το άλλο τμήμα, με τις εντολές "s A Σ’ αυτά τα προγράμματα υπάρχει συνήθως, μία ακόμα ενότητα που είναι η προετοιμασία της βασικής επεξεργασίας. Εδώ αυτή αποτελείται από μία μόνο εντολή την s