"Δύσκολες" ασκήσεις (pdf)

Φ_Ι (1/3)
1. Να αναπτύξετε αλγόριθµο που να διαβάζει έναν πίνακα χαρακτήρων Α[100] και
έναν αριθµό Ν και να εµφανίζει ένα µήνυµα «είναι παλίνδροµο» αν η λέξη που
σχηµατίζεται από τους χαρακτήρες Α[1] … Α[Ν] είναι παλίνδροµο. (Παλίνδροµη
ονοµάζεται µια λέξη που διαβάζεται το ίδιο είτε αρχίζουµε από δεξιά είτε
αρχίζουµε από αριστερά ΑΓΝΟΩΝΤΑΣ τους κενούς χαρακτήρες).
2. Έχουµε ένα πίνακα Α[10,100] µε 10 γραµµές και 100 στήλες. Να γραφεί τµήµα
προγράµµατος που θα ταξινοµεί τον πίνακα κατ’ αύξουσα σειρά µε βάση τα
στοιχεία της 5ης στήλης. (προσοχή: όταν γίνεται αντιµετάθεση, θα πρέπει να
γίνεται σε όλα τα στοιχεία των γραµµών και όχι µόνο στην 5η στήλη).
3. ΟΛΙΣΘΗΣΗ είναι η διαδικασία κατά την οποία τα στοιχεία ενός πίνακα
(µονοδιάστατου) αλλάζουν θέση και τοποθετούνται στις γειτονικές τους θέσεις.
Π.χ σε πίνακα µε στοιχεία: 4 , 6, 7, 2, 1, αν γίνει ολίσθηση µία θέση αριστερά, το
αποτέλεσµα είναι: 6, 7, 2, 1, 0 (από δεξιά µπαίνει το µηδέν).
Αν πρόκειται για ΚΥΚΛΙΚΗ ΟΛΙΣΘΗΣΗ, αντί για µηδέν τοποθετείται το
στοιχείο που περισσεύει. Στο προηγούµενο παράδειγµα η κυκλική ολίσθηση θα
έδινε: 6, 7, 2, 1, 4.
Α) Να γραφεί τµήµα αλγορίθµου που κάνει κυκλική ολίσθηση δεξιά κατά µία
θέση έναν πίνακα 100 στοιχείων.
Β) Να γραφεί τµήµα αλγορίθµου που κάνει κυκλική ολίσθηση αριστερά κατά
τρεις θέσεις έναν πίνακα 100 στοιχείων.
Γ) Η ολίσθηση µπορεί να επεκταθεί και σε πίνακα δύο διαστάσεων. Εκεί γίνεται
ολίσθηση σε κάθε γραµµή (ή και στήλη). Να γίνει τµήµα αλγορίθµου που κάνει
κυκλική ολίσθηση προς τα δεξιά κατά δύο θέσεις στις γραµµές ενός πίνακα 10 Χ
20.
4. Έχουµε έναν πίνακα Α[100], όπου τα πρώτα Ν στοιχεία είναι ταξινοµηµένα κατά
αύξουσα σειρά (τα υπόλοιπα δεν τα χρησιµοποιούµε, Ν <100). Να γραφεί τµήµα
προγράµµατος που θα διαβάζει έναν αριθµό Χ και θα τον εισάγει στον πίνακα στη
σωστή θέση (ώστε τελικά τα Ν+1 στοιχεία του πίνακα να είναι ταξινοµηµένα
κατά αύξουσα σειρά).
5. Υπάρχει ένας τρόπος για τη δηµιουργία τυχαίων αριθµών που χρησιµοποιεί την
ολίσθηση: Έχουµε έναν πίνακα A, 32 στοιχείων που το κάθε στοιχείο είναι είτε 0
είτε 1. Αρχικά τα 16 πρώτα στοιχεία του πίνακα έχουν τιµή 0 και τα υπόλοιπα 16
έχουν τιµή 1. Σε κάθε βήµα κάνουµε ολίσθηση των στοιχείων του πίνακα
αριστερά κατά µία θέση. Στη θέση 32 βάζουµε 0 αν τα στοιχεία στις θέσεις 2 και
5 είναι ίδια, και 1 αν είναι διαφορετικά. (Σηµ. µε τον τρόπο αυτό µπορούµε να
παράγουµε µια «τυχαία» ακολουθία από δυαδικά ψηφία). Για να πάρουµε έναν
ακέραιο αριθµό, εκτελούµε 8 βήµατα (δηλαδή ολισθήσεις όπως περιγράφηκαν πιο
πάνω) και χρησιµοποιούµε τα πρώτα 8 στοιχεία του πίνακα για να παράγουν έναν
αριθµό ως εξής: Α[1] + Α[2]*2 + Α[3] * 4 +Α[4]*8 +… +Α[8]*128. Ο αριθµός
που προκύπτει είναι ακέραιος και έχει τιµή από 0 µέχρι 255.
Να γραφεί πρόγραµµα που «τρέχει» την γεννήτρια αυτή για 10000 αριθµούς και
µετράει πόσες φορές εµφανίστηκε κάθε αριθµός. (Χρησιµοποίησε έναν πίνακα
256 στοιχείων για να καταγράφεις το πλήθος εµφάνισης κάθε αριθµού). Ο
πίνακας αυτός λέγεται πίνακας συχνοτήτων (ή ιστόγραµµα). Το πρόγραµµα να
βρίσκει και να εµφανίζει την µέγιστη και την ελάχιστη τιµή του πίνακα
συχνοτήτων. ΥΠΟ∆ΕΙΞΗ: είναι καλό η γέννηση των τυχαίων αριθµών να γίνει σε
συνάρτηση ώστε το πρόγραµµα να είναι πιο «καθαρό».
Φ_Ι (2/3)
6. Ένας τρόπος για να ανακατεύουµε την τράπουλα είναι ο εξής: Παίρνουµε το
πρώτο φύλλο της τράπουλας, µετά βάζουµε το επόµενο φύλλο κάτω από το
πρώτο, µετά βάζουµε το επόµενο φύλλο πάνω από τα 2 «ανακατεµένα» φύλλα,
µετά βάζουµε το επόµενο φύλλο κάτω από τα 3 «ανακατεµένα» φύλλα, και
συνεχίζουµε έτσι µέχρι να χρησιµοποιηθούν και τα 52 φύλλα της τράπουλας.
(στην πράξη αυτό γίνεται αν κρατάµε µε το ένα χέρι την αρχική τράπουλα,
περνάµε ένα φύλλο κάθε φορά στο άλλο χέρι και βάζουµε το φύλλο αυτό µία
φορά από πάνω και µία φορά από κάτω. Τελικά όλα τα φύλλα µαζεύονται στο
άλλο χέρι). Να γραφεί αλγόριθµος που διαβάζει τα 52 φύλλα της τράπουλας, τα
ανακατεύει µε τον προηγούµενο τρόπο και τα εµφανίζει.
7. Το τρίγωνο του PASCAL έχει στην κορυφή τον αριθµό 1, και κάθε γραµµή του
έχει ένα επιπλέον στοιχείο. Τα στοιχεία στις άκρες έχουν τιµή 1, και κάθε άλλο
στοιχείο είναι το άθροισµα των δύο στοιχείων που βρίσκονται από πάνω του:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
Αυτό µπορεί να τοποθετηθεί σε ένα πίνακα δύο διαστάσεων ως:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
…………
Να γραφεί πρόγραµµα που δηµιουργεί και εµφανίζει αυτόν τον πίνακα για 10
γραµµές.
8. Να δηµιουργηθεί και να εµφανιστεί πίνακας ως εξής:
1111111111
1222222221
1233333321
1234444321
1234554321
1234554321
1234444321
1233333321
1222222221
1111111111
9. Μια εικόνα αποθηκεύεται σε ένα πίνακα 1024 Χ 1024, όπου σε κάθε θέση του
πίνακα βρίσκεται ένας αριθµός που δείχνει τη φωτεινότητα ενός εικονοστοιχείου.
Στον πίνακα γίνεται η εξής επεξεργασία: Ξεκινώντας από τη θέση [1,1] ,
βρίσκουµε το µέσο όρο των 4 γειτονικών στοιχείων (δηλ των στοιχείων [1,1],
[1,2], [2,1] και [2,2]) και τον βάζουµε στη θέση [1,1] (διαγράφοντας αυτό που
υπήρχε εκεί). Συνεχίζουµε την ίδια εργασία για τις θέσεις [1,3], [1,5],
……[1,1023] , [3,1], [3,3], [3,5] …. κ.λ.π.
Μετά, ξεκινώντας πάλι από το στοιχείο [1,1], βρίσκουµε τον µέσο όρο των
τεσσάρων γειτονικών στοιχείων ΠΟΥ ΕΧΟΥΜΕ ΜΕΤΑΒΑΛΕΙ ΣΤΟ
ΠΡΟΗΓΟΥΜΕΝΟ ΠΕΡΑΣΜΑ: δηλ. των στοιχείων [1,1], [1,3], [3,1], [3,3] και
Φ_Ι (3/3)
βάζουµε το αποτέλεσµα στη θέση [1,1]. Συνεχίζουµε την ίδια εργασία για τις
θέσεις [1,5], [1,9], ….. [5,1], [5,9], ….
Συνεχίζουµε µε τον µέσο όρο των τεσσάρων γειτονικών στοιχείων που έχουµε
µεταβάλει στο προηγούµενο πέρασµα. Κάνουµε συνολικά 10 περάσµατα.
Γράψε πρόγραµµα που κάνει αυτή τη δουλειά σε µια ∆ΙΑ∆ΙΚΑΣΙΑ, και την
αντίστροφη δουλειά σε µια άλλη ∆ΙΑ∆ΙΚΑΣΙΑ.
Σηµ. Για πίνακα µε Ν Χ Ν στοιχεία, χρειάζονται log2N περάσµατα.
Σηµ. Η διαδικασία αυτή χρησιµοποιείται στη µετάδοση εικόνων στο internet ώστε
να µεταδίδεται «σταδιακά» µια εικόνα !
10. Ένας πίνακας δύο διαστάσεων X[Ν,Μ] µπορεί να αναπαρασταθεί από έναν
πίνακα µίας διάστασης A[N*M] (µε ΝxΜ στοιχεία) αν στα πρώτα Μ στοιχεία
βάλουµε τα στοιχεία της πρώτης γραµµής, στα επόµενα Μ στοιχεία βάλουµε τα
στοιχεία της δεύτερης γραµµής, κ.ο.κ.. Να κατασκευάσετε συνάρτηση read(A,i,j)
που δέχεται έναν µονοδιάστατο πίνακα και τις συντεταγµένες i,j και επιστρέφει
την τιµή που θα αντιστοιχούσε σε έναν δι-διάστατο πίνακα στις αντίστοιχες
θέσεις. Αντίστοιχα να γραφεί διαδικασία write(A,i,j,a) που θα γράφει στον
µονοδιάστατο πίνακα Α την τιµή a στη θέση που αντιστοιχεί σε δι-διάστατο
πίνακα στη θέση µε συντεταγµένες i,j . Να κατασκευαστεί πρόγραµµα που θα έχει
έναν µονοδιάστατο πίνακα Α[10*20] ακεραίων και θα τον χρησιµοποιεί σαν διδιάστατο πίνακα µε 10 γραµµές και 20 στήλες. Το πρόγραµµα θα χρησιµοποιεί
αυτές τις συναρτήσεις για να διαβάζει τα στοιχεία του πίνακα «γραµµή-γραµµή»
και να τα εµφανίζει «στήλη-στήλη».
11. Να γραφεί πρόγραµµα που:
Α) θα διαβάζει έναν πίνακα ακεραίων 100 Χ 100 και θα τον µετατρέπει σε αραιό
πίνακα (ουδέτερο στοιχείο το 0, θεωρούµε ότι έχει το πολύ 4% των στοιχείων του
µη-µηδενικά.
Β) Μέσα από ένα µενού επιλογών 1) αναζήτηση, 2) εισαγωγή, 3) διαγραφή, 4)
παρουσίαση και 5) έξοδος θα γίνονται οι διαδικασίες:
1) αναζήτηση: ο χρήστης θα δίνει συντεταγµένες στον αρχικό πίνακα και το
πρόγραµµα θα κάνει αναζήτηση στον αραιό πίνακα και θα εµφανίζει το
αποτέλεσµα.
2) εισαγωγή: ο χρήστης θα δίνει συντεταγµένες στον αρχικό πίνακα και τιµή
στοιχείου και αν το στοιχείο είναι µη-µηδενικό, το πρόγραµµα θα το εισάγει στον
αραιό πίνακα.
3) διαγραφή: ο χρήστης θα δίνει συντεταγµένες στον αρχικό πίνακα και το
πρόγραµµα θα ψάχνει στον αραιό πίνακα και αν βρίσκει καταχώρηση θα τη
διαγράφει (µετά θα κάνει ολίσθηση τα στοιχεία ώστε να µην υπάρχουν κενά).
4) παρουσίαση: θα εµφανίζονται τα στοιχεία του πίνακα 100 Χ 100 γραµµήγραµµή.
12. Να γίνει αλγόριθµος ο οποίος να δέχεται τους βαθµούς µιας τάξης 25 µαθητών
στο µάθηµα της Φυσικής και να τους αποθηκεύει σε έναν πίνακα Α. Στη συνέχεια
να εµφανίζει το βαθµό που παρατηρήθηκε τις περισσότερες φορές. Θεωρείστε ότι
οι βαθµοί είναι ακέραιοι αριθµοί από 1 µέχρι 10 (δεν απαιτείται έλεγχος
εγκυρότητας).