Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Αγρονόμων Τοπογράφων Μηχανικών Εισαγωγή στην πληροφορική Βασίλειος Βεσκούκης Δρ. Ηλεκτρολόγος Μηχανικός & Μηχανικός Υπολογιστών ΕΜΠ v.vescoukis@cs.ntua.gr Η γλώσσα προγραμματισμού C++ Λογικές εκφράσεις, επαναληπτικές δομές, πίνακες Πίνακες (arrays) Οι μεταβλητές μνήμης προσφέρουν χώρο αποθήκευσης ατομικών (απλών) δεδομένων int a; float x, y, z; char c1, c2, c3; Συνήθως τα δεδομένα των οποίων κάνουμε την επεξεργασία με χρήση ΗΥ δεν είναι απλά αλλά πρέπει να οργανωθούν κατάλληλα Παραδείγματα Μετρήσεις συντεταγμένων διαδοχικών θέσεων στο επίπεδο Οι εγγραφές και η βαθμολογία των σπουδαστών στο πανεπιστήμιο Διαδοχικές μετρήσεις φυσικών μεγεθών σε τακτά χρονικά διαστήματα Τα δεδομένα αυτά έχουν είτε σύνθετη δομή, είτε/και διάταξη 1
Πίνακες Για την παράσταση σύνθετων δεδομένων, η C++ διαθέτει ένα σύνολο εργαλείων και μηχανισμών, όπως: Δομές (structures) Κλάσεις (classes) Απαριθμητούς τύπους (enumerated types) Πίνακες (arrays) Αρχεία (files) Πίνακες Ενας πίνακας είναι μια συλλογή ενός προκαθορισμένου αριθμού στοιχείων, τα οποία είναι όλα του ίδιου τύπου δεδομένων 120 ακέραιοι 24 πραγματικοί αριθμοί 25 χαρακτήρες κ.ά. Πίνακες Τα στοιχεία ενός πίνακα μπορούν να διατάσσονται σε μία ή περισσότερες διαστάσεις (dimensions) Μονοδιάστατοι πίνακες Δισδιάστατοι πίνακες Τρισδιάστατοι κλπ Μας διευκολύνει να αντιλαμβανόμαστε την οργάνωση των μονοδιάστατων και δισδιάστατων πινάκων σε γραμμές και στήλες Κάθε στοιχείο σε έναν πίνακα διακρίνεται από τα άλλα από τη θέση του 3ο στοιχείο 2η γραμμή 1η στήλη 2
Πίνακες στη C++ Δήλωση πινάκων τύπος ονομα [μέγεθος διάστασης1] [μέγεθος διάστασης2] [μέγεθος διάστασης3]... Παραδείγματα int exam_grades[120] δηλώνει έναν μονοδιάστατο πίνακα ακεραίων με όνομα exam_grades και μέγεθος 120 120 float temperatures[12][31] δηλώνει έναν δισδιάστατο πίνακα ακεραίων με όνομα temperatures και μήκος 12x31 31 12 Πίνακες στη C++ Μετά τη δήλωση του πίνακα, κάθε στοιχείο του διακρίνεται από τα υπόλοιπα από τον/τους δείκτες που ακολουθούν το όνομα του πίνακα int grades[120]; grades[20]=9; grades[21]=4; // η δήλωση // αναφορά σε στοιχεία ΠΡΟΣΟΧΗ!!! Στη C++ η αρίθμηση των στοιχείων ξεκινά από το 0 (μηδέν). Τα στοιχεία ενός πίνακα που δηλώνεται με μέγεθος n, αριθμούνται από 0 έως n-1 int grades[120]; // grades[0] -> grades[119] float temp[12][31]; // temp[0][0] -> temp[11][30] 0,0 5,3 2,8 2,30 3
Παράδειγμα Υπολογισμός μέσης θερμοκρασίας του έτους, όταν δίνονται οι μέσες θερμοκρασίες για κάθε μήνα Παράδειγμα Υπολογισμός μέγιστης θερμοκρασίας του έτους 4
Παράδειγμα Βελτίωση για την εισαγωγή των θερμοκρασιών και την εύρεση του μήνα στον οποίο προκύπτει η μέγιστη θερμοκρασία Προγραμματισμός με C++ Παράδειγμα Να κατασκευαστεί πρόγραμμα C++ το οποίο διαβάζει από το πληκτρολόγιο τις τιμές της μέσης θερμοκρασίας κάθε ημέρας του έτους και υπολογίζει α) τη μέγιστη θερμοκρασία του έτους και β) τη μέση θερμοκρασία του έτους Σημείωση: Οι αποδεκτές τιμές της θερμοκρασίας είναι στο διάστημα [-50, 50] Δεδομένα εισόδου: 365 τιμές θερμοκρασίας (αγνοούμε τα δίσεκτα) -> πραγματικοί αριθμοί Αποτελέσματα: Μέση τιμή = άθροισμα / 365 Μέγιστη τιμή Λοιπά: Συνθήκη εγκυρότητας θερμοκρασίας κατά την ανάγνωση δεδομένων εισόδου 5
Παράδειγμα Δεδομένα εισόδου: 365 πραγματικοί αριθμοί -> πίνακας float temperature[365] Τιμές: temperature[0] έως temperature[364] Διάβασμα δεδομένων εισόδου Για 365 φορές (i:0->364) επανάλαβε: Ανάγνωση μιας τιμής θερμοκρασίας Υπολογισμοί 1 Θέσε άθροισμα = 0 Για 365 φορές επανάλαβε: πρόσθεσε τη θερμοκρασία temperature[i] στο άθροισμα Μέση τιμή = άθροισμα / 365 temperature temperature i i 365 365 + t_sum Παράδειγμα Υπολογισμοί 2 Θεώρησε ότι μέγιστη τιμή είναι η πρώτη τιμή του πίνακα θερμοκρασιών max_known=temperature[0] max_known Διάτρεξε τον υπόλοιπο πίνακα (i: 1->364) και για κάθε τιμή του Αν temperature[i] > max_known τότε max_known=temperature[i] i > max_known? max_known 6
Παράδειγμα Βελτίωση 1 Να εισάγονται στον πίνακα μόνο στοιχεία στο διάστημα [-50, 50] Διάβασμα δεδομένων εισόδου ΑΚΥΡΑ ΕΓΚΥΡΑ Για 365 φορές (i:0->364) επανάλαβε: Επανάλαβε -50 50 Ανάγνωση μιας τιμής θερμοκρασίας T Οσο ισχύει ότι η θερμοκρασία είναι μη αποδεκτή ΑΚΥΡΑ Λογική συνθήκη Εγκυρότητα (T>=-50) and (T<=50) (αποδεκτές τιμές) Αν C1 είναι η λογική συνθήκη Τ>=50 και C2 η λογική συνθήκη T<=50 Αποδεκτές τιμές: (C1 and C2) Μη αποδεκτές τιμές not(c1 and C2) ή αλλιώς not(c1) OR not(c2) not(c1) = T<-50 και not(c2) = T>50 Τελικά: συνθήκη μη αποδοχής: Τ<-50 OR Τ>50 και σε C++ ((t<-50) (t>50)) Παράδειγμα Βελτίωση 2 Να γίνεται ο υπολογισμός του μέγιστου στην ίδια επανάληψη με την ανάγνωση Διάβασμα δεδομένων εισόδου max_known = -50 // γιατί;;;; Για 365 φορές (i:0->364) επανάλαβε: Επανάλαβε Ανάγνωση μιας τιμής θερμοκρασίας T Οσο ισχύει ότι η θερμοκρασία είναι μη αποδεκτή Αν temperature[i] > max_known τότε max_known=temperature[i] 7
Συγγραφή προγράμματος Δήλωση μεταβλητών float temperature[365], average, max_known, temp_sum int i Ανάγνωση δεδομένων (1) for(i=0; i<365; i++) cin>>temperature[i]; Ανάγνωση δεδομένων με έλεγχο for(i=0; i<365; i++) { do { cin>>temperature[i]; } while ((temperature[i]<-50) (temperature[i]>50)) } Συγγραφή προγράμματος Υπολογισμός ΜΤ και κατόπιν υπολογισμός μέγιστου temp_sum=0; for(i=0; i<365; i++) temp_sum=temp_sum+temperature[i]; average=temp_sum/365; max_known=temperature[0]; for(i=1; i<365; i++) if (temperature[i]>max_known) max_known=temperature[i]; Υπολογισμός σε μία επανάληψη temp_sum=0; max_known=-50; for(i=0; i<365; i++) { temp_sum=temp_sum+temperature[i]; if (temperature[i]>max_known) max_known=temperature[i]; } average=temp_sum/365; 8