Υπάρχουν πολλές. Καλή λύση είναι η σύντομη και απλή. Μια άλλη:
Code:
Μ<-Α
ΑΝ Β>Α Ή Γ>Α ΤΟΤΕ
ΑΝ Β>Γ ΤΟΤΕ
Μ<-Β
ΑΛΛΙΩΣ
Μ<-Γ
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΑΝ
Ευχαριστώ Πληροφορικάριε. Η αλήθεια είναι πως όντως με την χρήση εμφωλευμένης Αν γίνεται πολύ σύνθετο και δυσνόητο. Την τελευταία λύση που μου έστειλες δεν θα την σκεφτόμουν ποτέ. Τώρα, μπήκα στις διαδικασίες που ομολογώ πως είναι μακράν πιο περίπλοκες από τις συναρτήσεις. Σου στέλνω την εξής άσκηση που δεν πολυκαταλαβαίνω το σκεπτικό της διαδικασίας.
Μία αίθουσα κινηματογράφου αποτελείται από 15 σειρές καθισμάτων. Κάθε σειρά καθισμάτων περιλαμβάνει 30 καθίσματα.
Η 1η σειρά βρίσκεται μπροστά στην αίθουσα, ενώ αντίστοιχα η 15η στο πίσω μέρος της αίθουσας.
Για τον λόγο αυτό υπάρχει ένας πίνακας ΘΕΣΕΙΣ[15, 30] που αναπαριστά τις μέχρι τώρα δεσμευμένες θέσεις. Έτσι, το στοιχείο ΘΕΣΕΙΣ[i,j] αναπαριστά την j θέση της i σειράς. Τιμή 0 σε αυτό το στοιχείο σημαίνει πως η θέση δεν έχει ακόμη δεσμευθεί, ενώ τιμή 1 σημαίνει πως η θέση είναι δεσμευμένη.
Να γίνει πρόγραμμα το οποίο:
1) Θα γεμίζει τον πίνακα ΘΕΣΕΙΣ με μηδενικά (0).
2) Για κάθε πελάτη,
α) θα διαβάζει τον αριθμό των εισιτηρίων που θέλει να αγοράσει. Κατά την ανάγνωση να πραγματοποιείται έλεγχος εγκυρότητας ώστε ο αριθμός των εισιτηρίων να είναι μεταξύ 1 και 4 ή -1.
β) θα καλεί το υποπρογράμματος ΒΡΕΣ_ΚΑΛΥΤΕΡΕΣ_ΘΕΣΕΙΣ με την βοήθεια του οποίου θα εμφανίζει σε ποια σειρά και σε ποιες θέσεις έγινε η κράτηση ή κατάλληλο μήνυμα σε περίπτωση που ήταν αδύνατο να βρεθούν θέσεις μέσα στην αίθουσα,
γ) να ενημερώνει τις κατάλληλες θέσεις του πίνακα ΘΕΣΕΙΣ εφόσον πραγματοποιήθηκε η κράτηση
δ) να σταματάει όταν η αίθουσα γεμίσει ή δοθεί η τιμή -1 για αριθμό εισιτηρίων
3) Να εμφανίζει τον αριθμό των αδιάθετων θέσεων.
4) Να γίνει το υποπρόγραμμα ΒΡΕΣ_ΚΑΛΥΤΕΡΕΣ_ΘΕΣΕΙΣ που θα δέχεται τον πίνακα ΘΕΣΕΙΣ και τον αριθμό των εισιτηρίων προς κράτηση. Το υποπρόγραμμα θα αναζητά τις καλύτερες διαδοχικές θέσεις και θα πρέπει να βρίσκονται όλες στην ίδια σειρά, ξεκινώντας πάντα από την τελευταία σειρά. Το υποπρόγραμμα να επιστρέφει τον αριθμό της σειράς και την πρώτη θέση από από το σύνολο των θέσεων που εντοπίστηκαν προς κράτηση. Αν δεν βρέθηκαν θέσεις, τότε να επιστρέφει 0 και 0 για αριθμό σειράς και θέσεις αντίστοιχα.
ΠΡΟΓΡΑΜΜΑ κινηματογράφος
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: i, j, ΘΕΣΕΙΣ[15, 30], σειρά, θέση, εισ, διατέθηκαν
ΑΡΧΗ
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 15
ΓΙΑ j ΑΠΟ 1 ΜΕΧΡΙ 30
ΘΕΣΕΙΣ[i, j] <- 0
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
διατέθηκαν <- 0
ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
ΔΙΑΒΑΣΕ εισ
ΜΕΧΡΙΣ_ΟΤΟΥ εισ >= 1 ΚΑΙ εισ <= 4 Η εισ = -1
ΑΝ εισ > 0 ΤΟΤΕ
ΚΑΛΕΣΕ ΒΡΕΣ_ΚΑΛΥΤΕΡΕΣ_ΘΕΣΕΙΣ(ΘΕΣΕΙΣ, εισ, σειρά, θέση)
ΑΝ σειρά <> 0 ΚΑΙ θέση <> 0 ΤΟΤΕ
ΓΡΑΨΕ "Βρέθηκαν εισιτήρια στην σειρά ", σειρά, " από την θέση ", θέση, " μέχρι την θέση ", (θέση + εισ - 1)
ΓΙΑ j ΑΠΟ θέση ΜΕΧΡΙ θέση + εισ - 1
ΘΕΣΕΙΣ[σειρά, j] <- 1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
διατέθηκαν <- διατέθηκαν + εισ
ΑΛΛΙΩΣ
ΓΡΑΨΕ "Δεν βρέθηκαν ", εισ, " διαδοχικές θέσεις σε κάποια σειρά"
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΑΝ
ΜΕΧΡΙΣ_ΟΤΟΥ διατέθηκαν = 15*30 Η εισ = -1
ΓΡΑΨΕ "Έμειναν αδιάθετες ", 15*30 - διατέθηκαν, " θέσεις!"
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ κινηματογράφος
ΔΙΑΔΙΚΑΣΙΑ ΒΡΕΣ_ΚΑΛΥΤΕΡΕΣ_ΘΕΣΕΙΣ(ΘΕΣΕΙΣ, εισ, σειρά, θέση)
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: i, j, ΘΕΣΕΙΣ[15, 30], σειρά, θέση, εισ, κ, πλ
ΛΟΓΙΚΕΣ: βρέθηκε, βρέθηκε2
ΑΡΧΗ
σειρά <- 0
θέση <- 0
i <- 15
βρέθηκε <- ΨΕΥΔΗΣ
ΟΣΟ (i >= 1 ΚΑΙ βρέθηκε = ΨΕΥΔΗΣ) ΕΠΑΝΑΛΑΒΕ
j <- 1
πλ <- 0
ΟΣΟ j <= 30 ΚΑΙ βρέθηκε = ΨΕΥΔΗΣ ΕΠΑΝΑΛΑΒΕ
ΑΝ ΘΕΣΕΙΣ[i, j] = 0 ΤΟΤΕ
πλ <- πλ + 1
ΑΝ πλ = εισ ΤΟΤΕ
βρέθηκε <- ΑΛΗΘΗΣ
σειρά <- i
θέση <- j - εισ + 1
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΑΝ
j <- j + 1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
i <- i - 1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ
Πρώτον, το "κ" που βάζει στις μεταβλητές δεν το χρησιμοποιεί καν. Δεύτερον, όταν λέει πως "ΑΝ ΘΕΣΕΙΣ[i,j]=0 ΤΟΤΕ
πλ<--πλ+1"
εννοεί πως αν υπάρχει κενή θέση τότε την προσθέτουμε στο πλήθος των θέσεων που εντοπίστηκαν προς κράτηση?
Και συνεχίζει "ΑΝ πλ=εισ ΤΟΤΕ
βρέθηκε<--ΑΛΗΘΗΣ
σειρά<--i
θέση<--j-εισ+1"
Αυτό το κομμάτι δεν το καταλαβαίνω καθόλου. Μπορείς να μου το εξηγήσεις?