Πίνακες (Arrays) Εισαγωγή στη C++
Γενικά Στη C++, όπως και σε όλες τις γλώσσες προγραμματισμού, υπάρχει η δυνατότητα ομαδοποίησης δεδομένων ίδιου τύπου. Ο τρόπος με τον οποίο επιτυγχάνεται αυτό είναι με τη δημιουργία πινάκων (arrays). Με τη χρήση ενός πίνακα μπορούμε να αποθηκεύσουμε πολλές τιμές μέσα σε μια μόνο δομή: double scores[5]; 2
double scores[5]; Με την πιο πάνω δήλωση, δημιουργούμε πέντε στοιχεία τύπου double (πραγματικός αριθμός) τα οποία αποθηκεύονται σε σειρά στη μνήμη. Τα πέντε στοιχεία του πιο πάνω πίνακα αναφέρονται ως: scores[0], scores[1], scores[2], scores[3], scores[4] Οι αριθμοί μέσα στις αγκύλες καλούνται δείκτες (indexes) Στην C++ η αρίθμηση των στοιχείων ενός πίνακα ξεκινά πάντα από το μηδέν και μπορείτε να τον φανταστείτε όπως πιο κάτω: 3
Στοιχεία πίνακα Μέσα στο πρόγραμμα μπορούμε να χρησιμοποιήσουμε τα στοιχεία του πίνακα σαν κανονικές μεταβλητές: scores[0] = 2.7; scores[2] = 9.5; scores[1] = scores[2]; 4
Δήλωση πινάκων Για τον ορισμό ενός πίνακα παρέχουμε τρία στοιχεία. Το όνομα του πίνακα, τον τύπο δεδομένων των στοιχείων του και το πλήθος των στοιχείων του πίνακα ανάμεσα σε αγκύλες. Το πλήθος των στοιχείων καλείται και μέγεθος του πίνακα, αφού καθορίζει πόσες θέσεις δεδομένων του τύπου που ορίσαμε θα δεσμευτούν στη μνήμη. 5
Απόδοση αρχικών τιμών Αν γνωρίζουμε εκ των προτέρων τις τιμές που θα πάρουν τα στοιχεία του πίνακα, η απόδοση τιμών μπορεί να γίνει ως εξής: int grades[4] = {16, 18, 15, 20}; Η δήλωση του μεγέθους μέσα στις αγκύλες δεν είναι απαραίτητη: int primes[ ] = {1, 2, 3, 5, 7}; Αν το μέγεθος του πίνακα είναι μεγαλύτερο από το πλήθος των στοιχείων, στα στοιχεία του πίνακα που απομένουν θα αποδοθεί ως αρχική τιμή το 0: int a[5] = {12, 5, 4}; // a {12, 5, 4, 0, 0} Αν όμως το μέγεθος του πίνακα είναι μικρότερο από το πλήθος των στοιχείων, τότε υπάρχει σφάλμα: char letters[2] = {'a', 'b', 'c', 'd'}; //Σφάλμα! 6
Εισαγωγή στοιχείων σε πίνακα Για την εισαγωγή στοιχείων σε πίνακα μπορούμε να χρησιμοποιήσουμε τη δομή επανάληψης for μαζί με μια μεταβλητή-δείκτη. Η διαδικασία έχει ως ακολούθως: char arr[10]; for (int i=0; i<10; i++) cin >> arr[i]; // εισαγωγή και καταχώρηση 7
Εμφάνιση στοιχείων του πίνακα Για την εμφάνιση των στοιχείων του πίνακα στην οθόνη χρησιμοποιούμε παρόμοια δομή επανάληψης με την εισαγωγή στοιχείων, αυτή τη φορά με εντολή εξόδου: char arr[10]; for (int i=0; i<10; i++) cin >> arr[i]; for (int i=0; i<10; i++) cout << arr[i] << " "; // εμφάνιση στοιχείου 8
Παράδειγμα 1 Να γράψετε πρόγραμμα που να αποθηκεύει τους αριθμούς 8,0,69,167,349,428,29 σε ένα πίνακα ακεραίων και να τους εμφανίζει στην οθόνη, τον ένα κάτω από τον άλλο. 9
Παράδειγμα 1 #include<iostream> using namespace std; int main(){ int arr[] = {8,0,69,167,349,-428,29}; for (int i = 0; i < 7; i++) cout << arr[i] << endl; return 0; } 10
Παράδειγμα 2 Να γράψετε πρόγραμμα που να διαβάζει δέκα χαρακτήρες από το πληκτρολόγιο και να τους εμφανίζει σε αντίστροφη σειρά στην οθόνη. Παράδειγμα εισόδου A B C D E F G H I J Παράδειγμα εξόδου J I H G F E D C B A 11
Παράδειγμα 2 #include<iostream> using namespace std; int main(){ char arr[10]; for (int i = 0; i < 10; i++) cin >> arr[i]; for (int i = 9; i >= 0; i--) cout << arr[i] << " "; return 0; } 12
Παράδειγμα 3 Να γράψετε πρόγραμμα που να γεμίζει ένα πίνακα ακεραίων 100 θέσεων με τους 30 πρώτους αριθμούς της ακολουθίας: 1, 3, 7, 15, 31, 63, 2Ν-1+1. Ακολούθως να ζητά από το χρήστη ένα αριθμό Ν (1<=Ν<=30) και να επιστρέφει το Ν-οστό αριθμό της πιο πάνω σειράς. Παράδειγμα εισόδου 6 Παράδειγμα εξόδου 63 13
Παράδειγμα 3 #include<iostream> using namespace std; int main(){ int arr[30], Ν; arr[0]=1; for (int i = 1; i < 30; i++) arr[i] = 2 * arr[i-1] + 1; cin >> N; cout << arr[n-1]; return 0; } 14
Παράλληλοι πίνακες Πολλές φορές έχουμε περισσότερα δεδομένα, διαφορετικών τύπων, για να χειριστούμε. Για παράδειγμα, έχουμε τον πιο κάτω πίνακα που παρουσιάζει τα συνολικά κέρδη μια εταιρείας ανά έτος: Για να καταφέρουμε να συσχετίσουμε τα πιο πάνω στοιχεία, μπορούμε να χρησιμοποιήσουμε δύο παράλληλους πίνακες (parallel arrays). Αρχικά καταχωρούμε τα στοιχεία σε δύο πίνακες: int year[] = {2010, 2011, 2012, 2013, 2014}; double profit[] = {97.77, 98.34, 103.56, 102.68, 104.54}; 15
Παράλληλοι πίνακες Αν η τιμή του δείκτη ενός από τους πίνακες, είναι η ίδια με την τιμή του δείκτη του άλλου πίνακα, τότε αναφερόμαστε στα δύο στοιχεία της ίδιας χρονιάς. Δηλαδή τα στοιχεία year[3] και profit[3] θα αναφέρονται στα στοιχεία 2013 και 102.68 αντίστοιχα. Με αυτό τον τρόπο μπορούμε να επιτύχουμε το συσχετισμό ανόμοιων στοιχείων. Αν θέλουμε να εμφανίσουμε το πιο πάνω αποτέλεσμα στην οθόνη, τότε θα χρησιμοποιήσουμε τον πιο κάτω κώδικα: cout << "YEAR" << "\t" << "PROFIT" << endl; // for (int i = 0; i < 5; i++) cout << year[i] << "\t" << profit[i] << endl; \t = TAB 16
Παράδειγμα 4 Ο κανονισμός για την ελλιπή φοίτηση στα λύκεια είναι σαφής. Ειδικά για το Β Τετράμηνο, ο κανονισμός αναφέρει ότι παραπέμπονται σε ανεξετάσεις τον Σεπτέμβριο όσοι έχουν αριθμό αδικαιολόγητων απουσιών μεταξύ 21 και 25 ή στο σύνολο 76 μέχρι 80. Επίσης παραπέμπονται σε όσα μαθήματα συγκεντρώσουν εφταπλάσιο αριθμό απουσιών από τις ώρες διδασκαλίας του μαθήματος. Η γραμματεία έχει δημιουργήσει την πιο κάτω αναφορά για N μαθητές, η οποία παρουσιάζει αναλυτικά τα εξής: αριθμός μητρώου μαθητή, αδικαιολόγητες απουσίες Β τετραμήνου, συνολικές απουσίες Β τετραμήνου και εφταπλάσιο. Ενδεικτικά, η αναφορά εμφανίζεται όπως πιο κάτω. Συγκεκριμένα για το εφταπλάσιο, η αναφορά εμφανίζει 1 αν ο μαθητής έχει συμπληρώσει το εφταπλάσιο σε κάποιο μάθημα, αλλιώς εμφανίζει 0. Aρ. Μητρώου Αδικαιολόγητες Β Τετραμήνου Σύνολο Εφταπλάσιο 1001 30 90 1 1002 26 56 0 1003 19 93 0 1004 24 80 1 1005 25 76 0 Να γράψετε ένα πρόγραμμα να αποθηκεύει τα στοιχεία των μαθητών και να βρίσκει και να εμφανίζει στην οθόνη το πλήθος των μαθητών που παραπέμπονται για το Β τετράμηνο. 17
Παράδειγμα 4 #include <iostream> using namespace std; int main(){ int N, ans=0; cin >> N; int am[n], adik[n], sin[n]; bool eft[n]; for (int i=0; i<n; i++){ cin >> am[i] >> adik[i] >> sin[i] >> eft[i]; if ((adik[i]>=21 && adik[i]<=25) (sin[i]>=76 && sin[i<=80]) (eft[i]==1)) ans++; } cout << ans << endl; return 0; } 18