Δισδιάστατοι Πίνακες (2D Arrays) Εισαγωγή στη C++
Γενικά Η εντολή: int arr[5][2]; Δηλώνει την μεταβλητή arr σαν πίνακα με πέντε γραμμές (rows) και με δύο στήλες (columns). Η αρίθμηση και των δύο δεικτών ξεκινά από το μηδέν. arr[0][0] arr[1][0] arr[2][0] arr[3][0] arr[4][0] arr[0][1] arr[1][1] arr[2][1] arr[3][1] arr[4][1] 2
Αρχικοποίηση δισδιάστατου πίνακα Για να αρχικοποιηθεί ένας δισδιάστατος πίνακας, θα πρέπει κάθε γραμμή να περικλείεται από άγκιστρα. Αν δεν υπάρχουν σε κάποια στοιχεία τιμές τότε τα στοιχεία αυτά παίρνουν την τιμή 0. Η πιο κάτω εντολή δημιουργεί τον παρακάτω πίνακα: int arr[3][3] = { {1,2,3,{4,5,6,{7,8,9 ; 1 2 3 4 5 6 7 8 9 3
Στοιχεία δισδιάστατου πίνακα Μέσα στο πρόγραμμα μπορούμε να χρησιμοποιήσουμε τα στοιχεία του πίνακα σαν κανονικές μεταβλητές: char triliza[3][3]; triliza [0][1] = 'X'; triliza [0][2] = 'O'; triliza [1][1] = 'X'; triliza [2][0] = 'O'; triliza [2][1] = 'X'; O X X X O 4
Εισαγωγή στοιχείων Για την εισαγωγή στοιχείων σε πίνακα μπορούμε να χρησιμοποιήσουμε δύο εμφωλευμένες δομές επανάληψης for μαζί με δύο μεταβλητές-δείκτες. Η διαδικασία έχει ως ακολούθως: int arr[10][5]; for (int i=0; i<10; i++) for (int j=0; j<5; j++) cin >> arr[i][j]; 5
Εμφάνιση στοιχείων Για την εμφάνιση των στοιχείων δισδιάστατου πίνακα στην οθόνη χρησιμοποιούμε παρόμοια δομή επανάληψης με την εισαγωγή στοιχείων, αυτή τη φορά με εντολή εξόδου: int arr[10][5]; for (int i=0; i<10; i++) for (int j=0; j<5; j++) cin >> arr[i][j]; for (int i=0; i<10; i++){ for (int j=0; j<5; j++){ cout << arr[i][j] << " "; cout << endl; // αλλαγή γραμμής 6
Παράδειγμα 1 Να γράψετε ένα πρόγραμμα που να αποθηκεύει τον πίνακα προπαίδειας, από το 1 ως το 10, σε δισδιάστατο πίνακα και να τον εμφανίζει στην οθόνη. 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100 7
#include <iostream> #include <iomanip> using namespace std; int main(){ int arr[10][10]; Παράδειγμα 1 for (int i=0; i<10; i++){ for (int j=0; j<10; j++){ arr[i][j]=(i+1)*(j+1); cout <<setw(4)<< arr[i][j]; cout << endl; return 0; 8
Παράδειγμα 2 Να γράψετε πρόγραμμα που θα κάνει τα πιο κάτω: α) Να διαβάζει τα στοιχεία ενός δισδιάστατου πίνακα ακέραιων αριθμών με το όνομα numbers, που αποτελείται από 5 γραμμές και 5 στήλες. β) Να υπολογίζει και να εμφανίζει το άθροισμα κάθε γραμμής. γ) Να υπολογίζει και να εμφανίζει το άθροισμα κάθε στήλης. 9
#include <iostream> using namespace std; Παράδειγμα 2 int main(){ int numbers[5][5]; int sum_of_rows[5] = {0,0,0,0,0; int sum_of_cols[5] = {0,0,0,0,0; for (int i=0; i<5; i++){ for (int j=0; j<5; j++){ cin >> numbers[i][j]; sum_of_rows[i] +=numbers[i][j]; sum_of_cols[j] +=numbers[i][j]; for (int i=0; i<5; i++) cout << sum_of_rows[i] << " "; cout << endl; for (int i=0; i<5; i++) cout << sum_of_cols[i] << " "; return 0; 10
Παράδειγμα 3 Ανάστροφος (ΑΤ) ενός πίνακα Α, καλείται ο πίνακας που προκύπτει από τον Α αν οι γραμμές γίνουν στήλες και οι στήλες γραμμές, με την ίδια ακολουθία (δηλαδή, η πρώτη γραμμή να γίνει πρώτη στήλη, η δεύτερη γραμμή δεύτερη στήλη, κοκ). Να δημιουργήσετε πρόγραμμα που διαβάζει τις διαστάσεις ενός πίνακα Α x B καθώς και τον πίνακα που ακολουθεί. Στη συνεχεία τυπώνει τον ανάστροφο του πίνακα στην οθόνη. Παράδειγμα εισόδου 3 4 1 2 3 4 5 6 7 8 9 10 11 12 Παράδειγμα εξόδου 1 5 9 2 6 10 3 7 11 4 8 12 11
Παράδειγμα 3 #include <iostream> using namespace std; int main(){ int n, m; cin >> n >> m; int A[n][m]; int AT[m][n]; for (int i=0; i<n; i++) for (int j=0; j<m; j++){ cin >> A[i][j]; AT[j][i]=A[i][j]; for (int i=0; i<m; i++){ for (int j=0; j<n; j++) cout << AT[i][j] << " "; cout << endl; return 0; 12
Παράδειγμα 4 - (ΠΕ 2010 Άσκηση Β2) Οι 150 μαθητές της A τάξης ενός γυμνασίου της Κύπρου εξετάστηκαν σε ένα διαγώνισμα γενικών γνώσεων. Το διαγώνισμα περιλάμβανε 20 ερωτήσεις πολλαπλής επιλογής και για κάθε ερώτηση δίνονταν 5 επιλογές (A, B, C, D και E). Να γράψετε πρόγραμμα, το οποίο: α) να ζητά από το χρήστη τις σωστές απαντήσεις για τις 20 ερωτήσεις που δόθηκαν στο διαγώνισμα και να τις καταχωρεί στο μονοδιάστατο πίνακα Lyseis. β) να ζητά από το χρήστη τις απαντήσεις που έδωσαν οι μαθητές στο διαγώνισμα και να τις καταχωρεί σε ένα δισδιάστατο πίνακα 150 γραμμών και 20 στηλών με το όνομα Apantiseis, ο οποίος είναι παράλληλος με τον πίνακα Lyseis. Κάθε γραμμή του πίνακα Apantiseis θα αντιστοιχεί με τις 20 απαντήσεις ενός μαθητή στο διαγώνισμα. γ) να υπολογίζει και να εμφανίζει το βαθμό του κάθε μαθητή, αν η κάθε σωστή απάντηση βαθμολογείται με 5 μονάδες. Οι βαθμοί όλων των μαθητών να καταχωρούνται σε μονοδιάστατο πίνακα με το όνομα Vathmoi, ο οποίος είναι παράλληλος με τον πίνακα Apantiseis. 13
14
#include <iostream> using namespace std; #define Q 20 #define N 150 int main(){ char Lyseis[Q]; char Apantiseis[N][Q]; int Vathmoi[N]; for (int i=0; i<n; i++) Vathmoi[i]=0; cout << "Input correct answers: " << endl; for (int i=0; i<q; i++) cin >> Lyseis[i]; cout << "Input student answers: " << endl; for (int i=0; i<n; i++) for (int j=0; j<q; j++){ cin >> Apantiseis[i][j]; if (Apantiseis[i][j] == Lyseis[j]) Vathmoi[i] += 5; cout << "Student Grades"<< endl; for (int i=0; i<n; i++) cout << Vathmoi[i] << " "; return 0; 15