Άσκηση 1
Να γραφεί τμήμα προγράμματος που διαβάζει 10000 αριθμούς και βρίσκει τον μέσο όρο τους.
Λύση
Σ←0
ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 10000
ΔΙΑΒΑΣΕ Χ
Σ←Σ+Χ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ Σ/10000
Για την επεξεργασία 10000 αριθμών απαιτούνται μόλις τρείς μεταβλητές! Υπάρχουν όμως προβλήματα που απαιτούνται πολύ περισσότερες.
Άσκηση 2
Να γραφεί τμήμα προγράμματος που διαβάζει 10000 αριθμούς και τους εμφανίζει με την ανάποδη
σειρά (ο τελευταίος να εμφανιστεί πρώτος, ο προτελευταίος να εμφανιστεί δεύτερος κοκ).
Λύση
Σε αυτή την περίπτωση θα πρέπει μία μία οι τιμές να αποθηκευτούν σε ξεχωριστές μεταβλητές. Ιδανικά θα χρειαστούμε 10000 μεταβλητές. Κάτι τέτοιο όμως είναι ιδιαίτερα προβληματικό. Τι ονόματα θα δώσουμε; Πως θα θυμόμαστε ποια είναι η πρώτη μεταβλητή, η δεύτερη κλπ.; Εδώ χρειάζεται ένας πίνακας.
Ο πίνακας είναι πολλές μεταβλητές του ιδίου τύπου (ονομάζονται κελιά) που έχουν το ίδιο όνομα. Έστω π.χ. ο πίνακας Π που περιλαμβάνει 10000 αριθμούς (κελιά). Όταν θέλουμε να έχουμε πρόσβαση σε μία από τις μεταβλητές (π.χ. την 65η) δεν έχουμε παρά να γράψουμε Π[65]. Ακολουθεί το πρόγραμμα που ζητά η άσκηση 2.
ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 10000
ΔΙΑΒΑΣΕ Π[Ι]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΙΑ Ι ΑΠΟ 10000 ΜΕΧΡΙ 1 ΜΕ_ΒΗΜΑ -1
ΓΡΑΨΕ Π[Ι]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΠΛΕΟΝΕΚΤΗΜΑΤΑ ΚΑΙ ΜΕΙΟΝΕΚΤΗΜΑΤΑ ΑΠΟ ΤΗΝ ΧΡΗΣΗ ΠΙΝΑΚΩΝ
Οι πίνακες συνήθως κάνουν την δουλειά του προγραμματιστή πιο εύκολη. Ας δούμε όμως μια σειρά από ερωτήματα που προκύπτουν από την χρήση πινάκων:
- Σε ποιες περιπτώσεις είναι εφικτό να χρησιμοποιήσουμε πίνακες;
- Ποια τα μειονεκτήματα από την χρήση πινάκων;
- Όταν ένα πρόβλημα μπορεί να αντιμετωπιστεί με πίνακες αλλά και χωρίς, ποιο τρόπο να
επιλέξουμε;
Οι πίνακες, όπως κάθε μεταβλητή πρέπει να δηλώνονται στην αρχή κάθε προγράμματος και μάλιστα όχι μόνο ο τύπος τους αλλά και το πλήθος των κελιών. Άρα πίνακες μπορούμε να χρησιμοποιήσουμε μόνο όταν ξέρουμε από την αρχή (από την εκφώνηση) το πλήθος των δεδομένων. Οι παρακάτω εκφωνήσεις μας οδηγούν στο συμπέρασμα ότι μπορούμε να χρησιμοποιήσουμε πίνακες.
Παράδειγμα 1: «Στους σχολικούς αγώνες συμμετείχαν 120 αθλητές. Να διαβάσετε το όνομα, την
ηλικία, την επίδοση ….»
Παράδειγμα 2: «Στις εξετάσεις προσήλθαν 75 υποψήφιοι. Να διαβάσετε τον προφορικό βαθμό, τον
γραπτό, το όνομα , … »
Η παρακάτω εκφώνηση όμως είναι παραπλανητική.
Παράδειγμα 3: «Στους φετινούς σχολικούς αγώνες συμμετείχαν παιδιά από όλη την Ελλάδα. Να γραφεί πρόγραμμα που αφού διαβάσει το πλήθος των αθλητών να διαβάσει για το κάθε ένα , το όνομα του, την επίδοση του , …. ».
Σε αυτήν εδώ την περίπτωση δεν μπορούμε να χρησιμοποιήσουμε πίνακες και αυτό διότι δεν ξέρουμε από την αρχή (πριν εκτελεστεί το πρόγραμμα από τον υπολογιστή) το πλήθος τον παιδιών ώστε να δηλώσουμε την ακριβή διάσταση (πλήθος κελιών) του κάθε πίνακα. Ο υπολογιστής θα διαβάσει πρώτα τις μεταβλητές (και τους πίνακες), θα εξασφαλίσει τον απαραίτητο ελεύθερο χώρο για αυτές στην μνήμη (RAM) και μετά θα μάθει το πλήθος των παιδιών. Τα μειονεκτήματα από την χρήση πινάκων (σύμφωνα με το βιβλίο) είναι:
- Οι πίνακες δεσμεύουν μνήμη. Το πρόγραμμα της άσκησης 2 απαιτεί ελάχιστη μνήμη (3 μεταβλητές) ενώ αυτό της άσκησης 3 , χρειάζεται 10001 μεταβλητές.
- Οι πίνακες περιορίζουν τις δυνατότητες του προγράμματος. Οι πίνακες δηλώνονται στην
αρχή και καθ’ όλη την διάρκεια του προγράμματος παραμένουν σταθεροί ως προς το πλήθος των κελιών τους. Αν π.χ. ένας πίνακας δηλωθεί με 100 κελιά και το πρόγραμμα διαπιστώσει ότι τα δεδομένα είναι περισσότερα , τότε δεν υπάρχει τρόπος να αυξήσουμε το πλήθος των κελιών. Το αντίθετο δεν είναι τόσο μεγάλο πρόβλημα, διότι απλούστατα αν τα δεδομένα είναι λιγότερα από όσα είχαν αρχικά υπολογιστή τότε απλά το πρόγραμμα δεν θα κάνει χρήση όλων των κελιών.
Σε εκείνα τα προβλήματα που μπορούν να αντιμετωπιστούν με πίνακες αλλά και χωρίς είναι
προτιμότερο να λυθούν με πίνακες και αυτό γιατί:
- Κάθε ερώτημα της εκφώνησης μπορεί να αντιμετωπιστεί ξεχωριστά. Πρώτα γράφουμε τις εντολές του πρώτου ερωτήματος, μετά του δευτέρου κοκ. Όταν δεν έχουμε πίνακες τότε όλα σχεδόν τα ερωτήματα πρέπει να χωρέσουν σε μία μεγάλη επανάληψη, αυξάνοντας την πιθανότητα λάθους.
- Η δέσμευση θέσεων μνήμης που συνοδεύει την χρήση πινάκων δεν αποτελεί πρόβλημα στις Πανελλαδικές εξετάσεις αφού δεν προβλέπεται αφαίρεση βαθμών για τέτοιες περιπτώσεις.
ΠΟΛΥΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ
Όταν θέλουμε να αποθηκεύσουμε ένα σύνολο τιμών (του ιδίου τύπου), τότε χρησιμοποιούμε ένα μονοδιάστατο πίνακα.
Αν θέλουμε να αποθηκεύσουμε πολλούς μονοδιάστατους πίνακες μαζί, τότε χρησιμοποιούμε ένα δισδιάστατο πίνακα. Οι δισδιάστατοι πίνακες με ίσο πλήθος γραμμών και στηλών, λέγονται τετραγωνικοί.
Αν θέλουμε να αποθηκεύσουμε πολλούς δισδιάστατους πίνακες π.χ. ένα για κάθε σχολική χρονιά, τότε χρειαζόμαστε τρισδιάστατο πίνακα.
Ο παρακάτω μονοδιάστατος πίνακας θα μπορούσε να χρησιμοποιηθεί για να αποθηκεύσουμε την σημερινή μέση θερμοκρασία σε 10 πόλεις της Ελλάδας. Ο δισδιάστατος είναι κατάλληλος για αποθήκευση της μέσης θερμοκρασίας σε 10 πόλεις της Ελλάδας και για κάθε μέρα του έτους.
Τέλος ο τρισδιάστατος θα μπορούσε να χρησιμοποιηθεί για την αποθήκευση της μέσης θερμοκρασίας, 10 πόλεων κάθε μέρα για κάποια χρόνια.
Στον δισδιάστατο πίνακα (Δ) αν θέλουμε να έχουμε πρόσβαση στην θερμοκρασία της π.χ. δεύτερης πόλης, την 26η μέρα, θα πρέπει να γράψουμε Δ[2,26]. Γενικά όταν θέλουμε το κελί που βρίσκεται στην Ι γραμμή και J στήλη γράφουμε Δ[I, J]. Όμοια και για τον τρισδιάτατο πίνακα. Το κελί της I πόλης, J μέρας και Ζ χρονιάς γράφεται Τ[I, J, Z].
Για να προσπελάσουμε τα κελιά ενός μονοδιάστατου πίνακα αρκεί μία ΓΙΑ.
ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 10
ΔΙΑΒΑΣΕ Μ[Ι]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
Για να προσπελάσουμε τα κελιά ενός δισδιάστατου πίνακα απαιτούνται δύο εμφωλευμένες ΓΙΑ.
ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 10
ΓΙΑ J ΑΠΟ 1 ΜΕΧΡΙ 365
ΔΙΑΒΑΣΕ Δ[Ι,J]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
Παρατήρηση
Το παραπάνω τνήμα προγράμματος διαβάζει τις τιμές των κελιών ανά γραμμή. Ξεκινάει από το κελί που βρίσκεται στην πρώτη γραμμή και πρώτη στήλη, συνεχίζει στο κελί της πρώτης γραμμής αλλά στην δεύτερη στήλη κοκ. Όταν εξαντλήσει τα κελιά μιας γραμμής, συνεχίζει στην αποκάτω. Αν θέλουμε να σαρώσουμε τον πίνακα ανά στήλη, θα πρέπει να γράψουμε:
ΓΙΑ J ΑΠΟ 1 ΜΕΧΡΙ 365
ΓΙΑ I ΑΠΟ 1 ΜΕΧΡΙ 10
ΔΙΑΒΑΣΕ Δ[Ι,J]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
Για να προσπελάσουμε τα κελιά ενός τρισδιάστατου πίνακα απαιτούνται τρείς εμφωλευμένες ΓΙΑ.
ΓΙΑ Ι ΑΠΟ 1 ΜΕΧΡΙ 10
ΓΙΑ J ΑΠΟ 1 ΜΕΧΡΙ 365
ΓΙΑ Z ΑΠΟ 1 ΜΕΧΡΙ 3
ΔΙΑΒΑΣΕ T[Ι,J,Z]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
Η ΓΛΩΣΣΑ υποστηρίζει πίνακες με περισσότερες από τρείς διαστάσεις όμως είναι εξαιρετικά απίθανο να ζητηθεί κάτι ανάλογο στις Πανελλαδικές εξετάσεις.
Οι πίνακες δηλώνονται στην αρχή του προγράμματος όπως και οι μεταβλητές, με την διαφορά ότι
πρέπει να δηλωθούν οι ακριβείς διαστάσεις του (δηλαδή σε δισδιάστατο, το πλήθος των γραμμών
και στηλών).
ΠΡΟΓΡΑΜΜΑ Ασκηση_με_πίνακα
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: Π[10,365]
. . .
Ερωτήσεις ανάπτυξης απο Πανελλαδικές εξετάσεις
- (E2015-ΘΑ4) Δίνεται το παρακάτω τμήμα αλγορίθμου, με αριθμημένες τις γραμμές του:
1. max ← Π[1] 2. Για i από 2 μέχρι 5 3. Αν Π[i] > max τότε 4. max ← Π[i] 5. Τέλος_αν 6. Τέλος_επανάληψης
α. Τι υπολογίζει αυτό το τμήμα αλγορίθμου;
β. Πόσες φορές τουλάχιστον θα εκτελεστεί η εντολή στη γραμμή 4;
γ. Πόσες φορές το πολύ θα εκτελεστεί η εντολή στη γραμμή 4;
δ. Να αιτιολογήσετε γιατί ο πίνακας Π δεν μπορεί να είναι πίνακας λογικών τιμών. - (E2011-Θ B2, ΕΒ2011-Θ B2) Δίνεται ο πίνακας Α τεσσάρων στοιχείων με τιμές: A[1]=3, A[2]=5, A[3]=8, A[4]=13 και το παρακάτω τμήμα αλγορίθμου:
i ← 1 j ← 4 Όσο i <= 3 επανάλαβε πρόχειρο ← Α[j] Α[j] ← Α[i] Α[i] ← πρόχειρο Γράψε Α[1], Α[2], Α[3] i ← i + 1 j ← j - 1 Τέλος_επανάληψης
Να γράψετε στο τετράδιό σας τις τιμές που θα εμφανιστούν κατά την εκτέλεσή του.
- (2012-A3, B2012-A3) Δίνεται ο πίνακας Α[10], στον οποίο επιθυμούμε να αποθηκεύσουμε όλους τους ακέραιους αριθμούς από το 10 μέχρι το 1 με φθίνουσα σειρά. Στον πίνακα έχουν εισαχθεί ορισμένοι αριθμοί, οι οποίοι εμφανίζονται στο παρακάτω σχήμα:
α. Να συμπληρώσετε τις επόμενες εντολές εκχώρησης, ώστε τα κενά κελιά του πίνακα να αποκτήσουν τις επιθυμητές τιμές.A[3] ← 3 + A[…]
A[9] ← A[…] – 2
A[8] ← A[…] – 5
A[4] ← 5 + A[…]
A[5] ← (A[…] + A[7]) div 2
β. Να συμπληρώσετε το παρακάτω τμήμα αλγορίθμου, το οποίο αντιμεταθέτει τις τιμές των κελιών του πίνακα Α, έτσι ώστε η τελική διάταξη των αριθμών να είναι από 1 μέχρι 10.
Για i από … μέχρι …
αντιμετάθεσε Α[…] , Α[…]
Τέλος_επανάληψης - (E2012-A5, ΕΒ2012-A5) Δίνεται το παρακάτω τμήμα αλγορίθμου που χρησιμοποιεί ένα μονοδιάστατο πίνακα Α[20]. Ο πίνακας περιέχει άρτιους και περιττούς θετικούς ακέραιους, σε τυχαίες θέσεις. Το τμήμα αλγορίθμου δημιουργεί ένα νέο πίνακα Β[20] στον οποίο υπάρχουν πρώτα οι άρτιοι και μετά ακολουθούν οι περιττοί. Να γράψετε στο τετράδιό σας τον αλγόριθμο συμπληρώνοντας τα κενά:
Κ ← 0 Για i από ... μέχρι ... Αν Α[i] mod 2 = 0 τότε Κ ← ... B[…] ← Α[i] Τέλος_αν Τέλος_επανάληψης Για i από ... μέχρι ... Αν Α[i] mod 2 = ... τότε ………. B[…..] ← Α[…..] Τέλος_αν Τέλος_επανάληψης
- (Β2008-Θ2Β) Δίνεται το παρακάτω τμήμα αλγορίθμου:
MAX ← Α[1] MIN ← Α[1] ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 5 ΑΝ Α[i] < MIN ΤΟΤΕ MIN ← Α[i] ΑΛΛΙΩΣ ΑΝ Α[i]>MAX ΤΟΤΕ MAX ← Α[i] ΤΕΛΟΣ_ΑΝ ΤΕΛΟΣ_ΑΝ ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ ΕΜΦΑΝΙΣΕ MIN, MAX
Να μετατρέψετε το παραπάνω τμήμα αλγορίθμου σε ισοδύναμο με χρήση της δομής επανάληψης ΟΣΟ … ΕΠΑΝΑΛΑΒΕ.
- (2010-A4) Έστω πίνακας table με Μ γραμμές και Ν στήλες που περιέχει αριθμητικές τιμές. Δίνεται ο παρακάτω αλγόριθμος που υπολογίζει το άθροισμα κατά γραμμή, κατά στήλη και συνολικά.
1. Αλγόριθμος Αθρ_Πίνακα 2. Δεδομένα // m, n, table // 3. sum ← 0 4. Για i από 1 μέχρι m 5. row[i] ← 0 6. Τέλος_επανάληψης 7. Για j από 1 μέχρι n 8. col[j] ← 0 9. Τέλος_επανάληψης 10. Για i από 1 μέχρι m 11. Για j από 1 μέχρι n 12. ....................... 13. ....................... 14. ....................... 15. Τέλος_επανάληψης 16. Τέλος_επανάληψης 17. Αποτελέσματα // row, col, sum // 18. Τέλος Αθρ_Πίνακα
Τα αθροίσματα των γραμμών καταχωρίζονται στον πίνακα row, των στηλών στον πίνακα col και το συνολικό άθροισμα στη μεταβλητή sum.
Να γράψετε στο τετράδιό σας τις εντολές που πρέπει να συμπληρωθούν στις γραμμές 12, 13 και 14, ώστε ο αλγόριθμος να επιτελεί τη λειτουργία που περιγράφηκε. - x