Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Αγρονόμων Τοπογράφων Μηχανικών Εισαγωγή στην πληροφορική Βασίλειος Βεσκούκης Δρ. Ηλεκτρολόγος Μηχανικός & Μηχανικός Υπολογιστών ΕΜΠ v.vescoukis@cs.ntua.gr Παραδείγματα δομημένου προγραμματισμού σε C++ (Μέρος 2) Χρήση πινάκων Παράδειγμα 1: Πρόσθεση πινάκων Να κατασκευαστεί πρόγραμμα C++ που να προσθέτει δύο πίνακες ακεραίων, με διαστάσεις το πολύ ΝxM. Σχεδίαση του Ορισμός των Μ και Ν ως σταθερές με «εύλογα μεγάλες» τιμές: Μ_max, N_max Ορισμός τριών πινάκων Α, B, C διαστάσεων Μ_max x N_max Χρήση δύο μτβλ Μ και Ν για τις ανάγκες του Απόδοση τιμών στα Μ και Ν κατά την εκτέλεση του (τι πρέπει να ισχύει για τις τιμές των Μ και Ν;) Ανάγνωση τιμών των πινάκων Α, Β Υπολογισμός κάθε στοιχείου του πίνακα C ως άθροισμα των αντιστοίχων στοιχείων των Α και Β Εκτύπωση του πίνακα C 1
Χρήση πινάκων Υλοποίηση χωρίς συναρτήσεις (δες tables-example1.cpp) Μεγάλο κύριο πρόγραμμα Δύσκολο στην κατανόηση Δύσκολο στη συντήρηση βελτίωση διόρθωση Υλοποίηση με συναρτήσεις (δες tables-example2.cpp) Μικρό κύριο πρόγραμμα Κατανοητές λειτουργίες μέσα στο κύριο πρόγραμμα Υλοποίηση λειτουργιών ως συναρτήσεις Εύκολες οι τροποποιήσεις στις συναρτήσεις και διαθέσιμες σε όλες τις κλήσεις των συναρτήσεων Λίγες και μόνο στην αρχή οι δυσκολίες ορισμού συναρτήσεων και περάσματος παραμέτρων Χρήση του switch Παρατηρήσεις Ανάλογα με την τιμή μιας παράστασης (μεταβλητή ελέγχου) το switch αρχίζει την εκτέλεση ενός block εντολών από ένα συγκεκριμένο σημείο Το switch ΔΕΝ εκτελεί ένα block εντολών για κάθε τιμή της μεταβλητής ελέγχου Αν θέλουμε να εκτελούμε μόνο μία ομάδα εντολών για κάθε τιμή της μτβλ ελέγχου, πρέπει στο τέλος της ομάδας να βάζουμε break Παράδειγμα (υπολογισμός της ημέρας της εβδομάδας) Διάβασε τον αριθμό της ημέρας (0-6) Δώσε τιμή στη μτβλ dow (0=Sunday, 6=Saturday) Εμφάνισε στην οθόνη την τιμή της μτβλ dow 2
Χρήση του switch (παράδειγμα) int d; string dow; do { cout<<"enter the day number:"; cin>>d; } while ((d<0) (d>6)); switch (d) { case 0: dow="sunday"; case 1: dow="monday"; case 2: dow="tuesday"; case 3: dow="wednesday"; case 4: dow="thursday"; case 5: dow="friday"; case 6: dow="saturday"; default:dow="***"; } cout << endl << dow << endl; Χρήση του switch (παράδειγμα) int d; string dow; do { cout<<"enter the day number:"; cin>>d; } while ((d<0) (d>6)); switch (d) { case 0: dow="sunday"; case 1: dow="monday"; case 2: dow="tuesday"; case 3: dow="wednesday"; case 4: dow="thursday"; case 5: dow="friday"; case 6: dow="saturday"; default:dow="***"; } cout << endl << dow << endl; 3
Χρήση του switch int d; float parking_price; do { cout<<"parking from a specified day till Saturday"<<endl; cout<<"enter the day you will park the car:"; cin>>d; } while ((d<0) (d>6)); parking_price=20; // minimum charge switch (d) { case 0: case 1: parking_price=parking_price+10; case 2: parking_price=parking_price+10; case 3: parking_price=parking_price+10; case 4: parking_price=parking_price+10; case 5: parking_price=parking_price+10; case 6: parking_price=parking_price+10; } cout << endl << parking_price << endl; Παραδειγμα αθροίσματος σειράς Ας υπολογίζουμε το ημίτονο ως άθροισμα της σειράς sin(x) = x 1 /1! + x 3 /3! + x 5 /5! + x 7 /7! +... Μέχρι του σημείου που η διαφορά δύο διαδοχικών όρων να είναι μικρότερη από 10-4 Ακολουθούμε τα βήματα: Μαθηματικός τύπος: Σ (x n /n!) Ο πρώτος όρος: x Ο γενικός όρος: x n /n! Η συνθήκη συνέχισης της άθροισης: x n /n! >= 10-4 Επαλήθευση! Αλγόριθμος 4
Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Αγρονόμων Τοπογράφων Μηχανικών Εισαγωγή στην πληροφορική Βασίλειος Βεσκούκης Δρ. Ηλεκτρολόγος Μηχανικός & Μηχανικός Υπολογιστών ΕΜΠ v.vescoukis@cs.ntua.gr Επισκόπηση της περιπέτειας του προγραμματισμού Μια γνωστή ακολουθία ενεργειών... Δεδομένα, ζητούμενα, περιορισμοί Μέθοδος επίλυσης Εισοδος, επεξεργασία, έξοδος Ακολουθία, απόφαση, επανάληψη Τύποι δεδομένων, συντακτικό, εκφράσεις, δομές ελέγχου και επανάληψης, είσοδος-έξοδος, δομή Σύνταξη εντολών και δομών ελέγχου Επιβεβαίωση ότι η περιγραφή της λύσης στη C++ είναι σωστή Επιβεβαίωση ότι η λύση είναι σωστή 5
Μια γνωστή ακολουθία ενεργειών... Δεδομένα, ζητούμενα, περιορισμοί Μέθοδος επίλυσης ΑΝ ΔΕΝ ΜΠΟΡΟΥΜΕ ΝΑ ΕΠΙΛΥΣΟΥΜΕ ΕΝΑ ΠΡΟΒΛΗΜΑ ΜΕ ΤΟ ΧΕΡΙ, ΔΕΝ ΜΠΟΡΟΥΜΕ ΝΑ ΤΟ ΕΠΙΛΥΣΟΥΜΕ ΟΥΤΕ ΜΕ ΥΠΟΛΟΓΙΣΤΗ Εισοδος, επεξεργασία, έξοδος Ακολουθία, απόφαση, επανάληψη Τύποι δεδομένων, συντακτικό, εκφράσεις, δομές ελέγχου και επανάληψης, είσοδος-έξοδος, δομή Σύνταξη εντολών και δομών ελέγχου Επιβεβαίωση ότι η περιγραφή της λύσης στη C++ είναι σωστή Επιβεβαίωση ότι η λύση είναι σωστή Μια γνωστή ακολουθία ενεργειών... Δεδομένα, ζητούμενα, περιορισμοί Μέθοδος επίλυσης Εισοδος, επεξεργασία, έξοδος Ακολουθία, απόφαση, επανάληψη "ΔΙΑΙΡΕΙ ΚΑΙ ΒΑΣΙΛΕΥΕ": ΕΙΣΗΓΑΓΕ ΔΟΜΗ ΣΤΗ ΛΥΣΗ, ΧΡΗΣΙΜΟΠΟΙΩΝΤΑΣ ΑΥΤΑ ΤΑ ΤΡΙΑ ΜΕΣΑ Τύποι δεδομένων, συντακτικό, εκφράσεις, δομές ελέγχου και επανάληψης, είσοδος-έξοδος, δομή Σύνταξη εντολών και δομών ελέγχου Επιβεβαίωση ότι η περιγραφή της λύσης στη C++ είναι σωστή Επιβεβαίωση ότι η λύση είναι σωστή 6
Μια γνωστή ακολουθία ενεργειών... Δεδομένα, ζητούμενα, περιορισμοί Μέθοδος επίλυσης Εισοδος, επεξεργασία, έξοδος Ακολουθία, απόφαση, επανάληψη Τύποι δεδομένων, συντακτικό, εκφράσεις, δομές ελέγχου και επανάληψης, είσοδος-έξοδος, δομή Σύνταξη εντολών και δομών ελέγχου Επιβεβαίωση ότι η περιγραφή της λύσης στη C++ είναι σωστή Επιβεβαίωση ότι η λύση είναι σωστή ΠΕΡΙΓΡΑΨΕ ΤΗ ΛΥΣΗ ΜΕ ΕΝΤΟΛΕΣ C++ ΠΟΥ ΥΛΟΠΟΙΟΥΝ ΤΟΝ ΑΛΓΟΡΙΘΜΟ. ΧΡΗΣΙΜΟΠΟΙΗΣΕ ΤΑ ΕΡΓΑΛΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ. Μια γνωστή ακολουθία ενεργειών... Δεδομένα, ζητούμενα, περιορισμοί Μέθοδος επίλυσης Εισοδος, επεξεργασία, έξοδος Ακολουθία, απόφαση, επανάληψη Τύποι δεδομένων, συντακτικό, εκφράσεις, δομές ελέγχου και επανάληψης, είσοδος-έξοδος, δομή Σύνταξη εντολών και δομών ελέγχου Επιβεβαίωση ότι η περιγραφή της λύσης στη C++ είναι σωστή Επιβεβαίωση ότι η λύση είναι σωστή ΕΠΙΧΕΙΡΗΣΕ ΝΑ ΜΕΤΑΓΛΩΤΤΙΣΕΙΣ ΤΟ ΠΡΟΓΡΑΜΜΑ ΩΣΤΕ ΝΑ ΕΛΕΓΧΘΕΙ Η ΣΥΝΤΑΚΤΙΚΗ ΤΟΥ ΟΡΘΟΤΗΤΑ 7
Μια γνωστή ακολουθία ενεργειών... Δεδομένα, ζητούμενα, περιορισμοί Μέθοδος επίλυσης Εισοδος, επεξεργασία, έξοδος Ακολουθία, απόφαση, επανάληψη Τύποι δεδομένων, συντακτικό, εκφράσεις, δομές ελέγχου και επανάληψης, είσοδος-έξοδος, δομή Σύνταξη εντολών και δομών ελέγχου Επιβεβαίωση ότι η περιγραφή της λύσης στη C++ είναι σωστή Επιβεβαίωση ότι η λύση είναι σωστή ΧΡΗΣΙΜΟΠΟΙΩΝΤΑΣ ΔΟΚΙΜΑΣΤΙΚΑ ΔΕΔΟΜΕΝΑ ή ΑΛΛΟ ΤΡΟΠΟ, ΕΠΙΒΕΒΑΙΩΣΕ ΟΤΙ ΕΚΤΟΣ ΑΠΟ ΤΗΝ ΠΕΡΙΓΡΑΦΗ, ΕΙ ΣΩΣΤΗ ΚΑΙ Η ΟΥΣΙΑ ΤΗΣ ΛΥΣΗΣ! Εφαρμογή των παραπάνω: παράδειγμα Δίδονται Ν σημεία στο καρτεσιανό επίπεδο. Nα επιλεχθούν εκείνα τα οποία ανήκουν σε κυκλικό δίσκο ακτίνας R και να εκτυπωθούν οι συντεταγμένες τους. y (x n, y n ) (x k, y k ) x R 8
Εφαρμογή των παραπάνω: παράδειγμα Δίδονται Ν σημεία στο καρτεσιανό επίπεδο. Nα επιλεχθούν εκείνα τα οποία ανήκουν σε κυκλικό δίσκο ακτίνας R και να εκτυπωθούν οι συντεταγμένες τους. y (x n, y n ) (x k, y k ) x ΛΥΣΗ ΜΕ ΤΟ ΧΕΡΙ: Αν για το σημείο i ισχύει ότι x i2 +y i2 <=R 2, τότε το σημείο ανήκει στον κυκλικό δίσκο ακτίνας R, διαφορετικά όχι R Εφαρμογή των παραπάνω: παράδειγμα ΛΥΣΗ ΜΕ ΤΟ ΧΕΡΙ: Αν για το σημείο i ισχύει ότι x i2 +y i2 <=R 2, τότε το σημείο ανήκει στον κυκλικό δίσκο ακτίνας R, διαφορετικά όχι ΕΙΣΑΓΩΓΗ ΑΡΧΗ ΔΙΑΒΑΣΕ ΤΙΣ ΣΥΝΤΕΤΑΓΜΕΝΕΣ ΤΩΝ Ν ΣΗΜΕΙΩΝ ΕΠΕΞΕΡΓΑΣΙΑ ΕΛΕΓΞΕ ΑΝ ΤΟ ΣΗΜΕΙΟ i ΑΝΗΚΕΙ ΣΤΟΝ ΔΙΣΚΟ (R) ANHK EI ΕΚΤΥΠΩΣΕ Xi, Yi ΕΞΟΔΟΣ i=n ΤΕΛΟΣ 9
Εφαρμογή των παραπάνω: παράδειγμα ΔΙΑΒΑΣΕ ΤΙΣ ΣΥΝΤΕΤΑΓΜΕΝΕΣ ΤΩΝ Ν ΣΗΜΕΙΩΝ ΕΛΕΓΞΕ ΑΝ ΤΟ ΣΗΜΕΙΟ i ΑΝΗΚΕΙ ΣΤΟΝ ΔΙΣΚΟ (R) ANHK EI ΕΚΤΥΠΩΣΕ Xi, Yi Πρέπει να: Εξασφαλίσω χώρο για την αποθήκευση των συντεταγμένων Διαβάσω το πλήθος των σημείων Ν και την ακτίνα R Επαναλάβω ανάγνωση συντεταγμένων για όλα τα Ν σημεία i=n ΤΕΛΟΣ Θα χρησιμοποιήσω μια επαναληπτική δομή for() η οποία χρειάζεται μια ακέραια μεταβλητή ελέγχου i, την οποία πρέπει να δηλώσω. Χρειάζομαι έναν πίνακα πραγματικών αριθμών x και έναν πίνακα y. Το πλήθος των στοιχείων των πινάκων (Μ) καθορίζεται αυθαίρετα. Χρειάζομαι έναν ακέραιο Ν για να αποθηκεύσω το πλήθος των σημείων. Πρέπει Ν<=Μ. Θα ορίσω έναν πραγματικό αριθμό για την R. Εφαρμογή των παραπάνω: παράδειγμα ΔΙΑΒΑΣΕ ΤΙΣ ΣΥΝΤΕΤΑΓΜΕΝΕΣ ΤΩΝ Ν ΣΗΜΕΙΩΝ ΕΛΕΓΞΕ ΑΝ ΤΟ ΣΗΜΕΙΟ i ΑΝΗΚΕΙ ΣΤΟΝ ΔΙΣΚΟ (R) ANHK EI ΕΚΤΥΠΩΣΕ Xi, Yi Πρέπει να: Επαναλάβω τον έλεγχο των Ν σημείων i=n ΤΕΛΟΣ Θα χρησιμοποιήσω μια επαναληπτική δομή for() για τιμές από i=0, ενόσω i<ν και αυξάνοντας κατά 1 σε κάθε επανάληψη. 10
Εφαρμογή των παραπάνω: παράδειγμα ΔΙΑΒΑΣΕ ΤΙΣ ΣΥΝΤΕΤΑΓΜΕΝΕΣ ΤΩΝ Ν ΣΗΜΕΙΩΝ ΕΛΕΓΞΕ ΑΝ ΤΟ ΣΗΜΕΙΟ i ΑΝΗΚΕΙ ΣΤΟΝ ΔΙΣΚΟ (R) ANHK EI ΕΚΤΥΠΩΣΕ Xi, Yi i=n ΤΕΛΟΣ Πρέπει να: Ελέγξω για το σημείο i: αν x i2 +y i2 <R 2 τότε εκτύπωσε x i, y i Θα χρησιμοποιήσω μια δομή ελέγχου if η οποία δεν χρειάζεται να έχει σκέλος "else". Εφαρμογή των παραπάνω: παράδειγμα int main() { const int M=100; int N, i; float x[m], y[m], R; ΔΙΑΒΑΣΕ ΤΙΣ ΣΥΝΤΕΤΑΓΜΕΝΕΣ ΤΩΝ Ν ΣΗΜΕΙΩΝ ΕΛΕΓΞΕ ΑΝ ΤΟ ΣΗΜΕΙΟ i ΑΝΗΚΕΙ ΣΤΟΝ ΔΙΣΚΟ (R) cin>>r; cin>>n; for(i=0;i<n;i++) { cin>>x[i]>>y[i]; } // είσοδος ANHK EI ΕΚΤΥΠΩΣΕ Xi, Yi for(i=0;i<n;i++) { // επεξεργασία if (x[i]*x[i]+y[i]*y[i]<=r*r) cout<<x[i]<<y[i]; // έξοδος } } i=n ΤΕΛΟΣ 11
Παράδειγμα με πίνακες (Θέμα εξέτασης και κατατακτηρίων) Συμμετρικός ως προς την κεντρική γραμμή είναι ο πίνακας Α διαστάσεων 3xN (Ν είναι ακέραιος υποχρεωτικά περιττός) για τον οποίο ισχύει ότι Α[0,j]=A[2,j] για κάθε επιτρεπτή τιμή του j. Στο διπλανό σχήμα φαίνεται ως παράδειγμα ένας τέτοιος πίνακας. Α. Σχεδιάστε έναν αλγόριθμο ο οποίος εξετάζει αν ο πίνακας ακεραίων αριθμών Α, διαστάσεων 3 x n είναι συμμετρικός ως προς την κεντρική γραμμή. Β. Να υλοποιήσετε τον αλγόριθμο που κατασκευάσατε σε πηγαίο κώδικα C++ θεωρώντας ότι τα στοιχεία του πίνακα Α έχουν ήδη διαβαστεί. Το πρόγραμμά σας να αποφασίζει αν ο πίνακας Α είναι ο μοναδιαίος ή όχι και να εμφανίζει ανάλογο μήνυμα στην οθόνη. 1 5 9 0 1 0 1 5 9 1 4 9 0 1 0 1 5 9 Παράδειγμα: Μέθοδος διχοτόμησης για επίλυση μη γραμμικών εξισώσεων 12
Παράδειγμα: Μέθοδος διχοτόμησης για επίλυση μη γραμμικών εξισώσεων Παράδειγμα: Μέθοδος διχοτόμησης για επίλυση μη γραμμικών εξισώσεων 13