Εισαγωγή στον Προγραμματισμό Ενότητα 6 Πίνακες Πανεπιστήμιο Αιγαίου Τμήμα Μηχανικών Πληροφοριακών και Επικοινωνιακών Συστημάτων
Τύπος πίνακα (array) Σύνθετος τύπος δεδομένων Αναπαριστά ένα σύνολο ομοειδών τιμών π.χ. βαθμοί μαθητών μιας τάξης, θερμοκρασίες ενός μήνα, κτλ. Τα στοιχεία ενός πίνακα αποθηκεύονται σε διαδοχικές θέσεις μνήμης Χαρακτηριστικά: Μέγεθος πίνακα Τύπος στοιχείων
Δήλωση πίνακα <τύπος> <όνομα πίνακα> [<μέγεθος πίνακα>]; float temp[5]; int arr[10]; Αρχικοποίηση float temp[5]={25.2, 25.5, 26.6, 26, 25.9; float temp[]={25.2, 25.5, 26.6, 26, 25.9; float temp[5]={25.2, 25.5, 26.6;
Αναφορά στα στοιχεία του πίνακα Ένα στοιχείο του πίνακα προσδιορίζεται από το όνομα του πίνακα και ένα αριθμό που προσδιορίζει τη σειρά του Το πρώτοστοιχείο του πίνακα έχει σειρά 0 (αποθηκεύεται στη θέση 0) είκτης: Πίνακας temp 0 1 2 3 4 25.2 25.5 26.6 26.0 25.9 temp[0] temp[1] temp[4]
Δήλωση και αρχικοποίηση πίνακα #include <stdio.h> #define N 10 main() { int a[n]; int i; for ( i=0; i<n; i++ ) a[i] = 0;
Χρήση στοιχείων του πίνακα Τα στοιχεία του πίνακα τα χειριζόμαστε όπως και τις απλές μεταβλητές x = temp[2]*10; temp[0] = 25.4; temp[i] = temp[i+1] + 2; for (i=0; i<5; i++) if (temp[i]<25) temp[i]++; else temp[i]--;
Διαχείριση στοιχείων πίνακα Αποθήκευση τιμών σε μονοδιάστατο πίνακα for (i=0; i<10; i++) scanf("%d", &a[i]); Άθροιση τιμών μονοδιάστατου πίνακα for (i=0; i<10; i++) sum += a[i]; Εμφάνιση τιμών μονοδιάστατου πίνακα for (i=0; i<10; i++) printf("ημερα %d - ΩΡΕΣ %d\n", i, a[i]);
Πολυδιάστατοι πίνακες Ένας πίνακας μπορεί να έχει στοιχεία που είναι πίνακες int array[4][12];/* 4 γραµµές, 12 στήλες */ array[0][1];/* το στοιχείο της πρώτης γραµµής και δεύτερης στήλης */ array[0,1]; /* ΛΑΘΟΣ */ Αποθήκευση στη μνήμη σε γραμμές (ως μονοδιάστατος)
Δισδιάστατος πίνακας Βαθμοί 5 φοιτητών σε 3 μαθήματα int bathmoi[5][3]; Μαθήµατα Φοιτητές 0 1 2 3 4 0 1 2 7 8 6 3 7 4 3 5 5 7 9 8 4 4 6 Αρχικοποίηση: bathmoi[5][3]= {{7,8,6, {3,7,4, {3,5,5, {7,9,8, {4,4,6
Αρχικοποίηση δισδιάστατου πίνακα #define N 3 #define M 10 double f[n][m]; double f[n][m]; int i, j; for (i = 0; i < N; i++) for (j = 0; j < M; j++) f[i][j] = 0.0;
Επεξεργασία στοιχείων πίνακα (1) Άθροιση των στοιχείων των διαγωνίων σε τετραγωνικό πίνακα int i,j; int sum1=0; int sum2=0; for ( i=0; i < N; i++ ) for ( j=0; j < Ν; j++ ) { if (i == j) /*κύρια διαγώνιος*/ sum1 += a[i][j]; if ((i + j) == N-1) /*δευτερεύουσα διαγώνιος*/ sum2 += a[i][j];
Επεξεργασία στοιχείων πίνακα (2) Άθροιση των στοιχείων των διαγωνίων σε τετραγωνικό πίνακα int i; int sum1=0; int sum2=0; for (i=0; i < N; i++) { sum1 += a[i][i]; /*κύρια διαγώνιος*/ sum2 += a[i][n-1-i]; /*δευτερεύουσα διαγώνιος*/
Διάβασμα τιμών 2 πινάκων Α και Β Σύγκριση των στοιχείων και αποθήκευση του µεγαλύτερου στον πίνακα C #include <stdio.h> #define N 15 /* Μέγεθος των πινάκων */ int A[N], B[N], C[N]; main() { int i; for (i=0; i<n; i++) { printf(" ώστε τιµή για το στοιχείο Α[%d]: ", i); scanf("%d", &A[i]); printf(" ώστε τιµή για το στοιχείο B[%d]: ", i); scanf("%d", &B[i]); C[i] = (A[i]>B[i])? A[i] : B[i]; /*Ισοδύναµο µε: if (A[i]>B[i]) C[i] = A[i]; else C[i] = B[i];*/
Εύρεση μέσου όρου (1D array) #include <stdio.h> const int N=5; void main() { int sum=0, i, x[n]; float avg; for (i=0; i<n; i++) { /* ιάβασµα πίνακα */ printf("dose to %d stoixeio: ", i+1); scanf("%d", &x[i]); for (i=0; i<n; i++) /* Υπολογισµός Μ.Ο. */ sum += x[i]; avg = (float)sum/n; printf("\nmesos oros = %.2f \n", avg); /* Ακρίβεια 2 δεκαδικών ψηφίων*/
Εύρεση μέσου όρου (2D array) #include <stdio.h> const int N=5, Μ=3; void main() { int sum=0, i, j, x[n][μ]; float avg; for (i=0; i<n; i++) /* ιάβασµα πίνακα */ for (i=0; i<n; i++) /* ιάβασµα πίνακα */ for (j=0; j<m; j++) { printf("dose to stoixeio x[%d][%d]: ",i, j); scanf("%d", &x[i][j]); for (i=0; i<n; i++) /* Υπολογισµός Μ.Ο. */ for (j=0; j<m; j++) sum += x[i][j]; avg = (float)sum /(N*M); printf("\nmesos oros = %.2f \n", avg); /* Ακρίβεια 2 δεκαδικών ψηφίων*/
Εύρεση μεγαλύτερου/μικρότερου και θέσης #include <stdio.h> const int N=5; void main() { int max, maxp, min, minp, i, x[n]; for (i=0; i<n; i++) { /* ιάβασµα Πίνακα */ printf("dose to %d stoixeio: ", i+1); scanf("%d", &x[i]); max=min=x[0]; maxp=minp=0; for (i=0; i<n; i++) { /* Εύρεση Μεγαλ./Μικρ. */ if (x[i] > max) { max = x[i]; maxp = i; if (x[i] < min) { min = x[i]; minp = i; printf("megisto = %d sti thesi %d \n", max, maxp); printf("elaxisto = %d sti thesi %d \n", min, minp);
Εναλλαγή 1 ης και τελευταίας γραμμής/στήλης /* εδοµένου πίνακα x[n][m] */ int i, temp; for (i=0; i<m; i++) { /* Εναλλαγή γραµµής */ temp = x[0][i]; x[0][i] = x[n-1][i]; x[n-1][i] = temp; for (i=0; i<n; i++) { /* Εναλλαγή στήλης */ temp = x[i][0]; x[i][0] = x[i][μ-1]; x[i][μ-1] = temp;
Πολλαπλασιασμός πινάκων /* εδοµένων Πινάκων a[x][y] και b[y][z] */ float c[x][z]; /* Υπολογισµός γινοµένου πίνακα */ for (i=0; i<x; i++) { for (j=0; j<z; j++) { c[i][j]=0; for (k=0; k<y; k++) c[i][j] += a[i][k]*b[k][j]; /* Εκτύπωση αποτελέσµατος */ for (i=0; i<x; i++) { for (j=0; j<z; j++) printf("%.0f\t", c[i][j]); printf("\n");
Ταξινόμηση πίνακα int a[]={3,2,5,7,1,8,4,9,6; {1,2,3,4,5,6,7,8,9 Μέθοδοι ταξινόμησης: Ταξινόμηση φυσαλίδας (bubble sort) Ταξινόμηση επιλογής(selection sort) Γρήγορη ταξινόμηση(quicksort)
Μέθοδος ταξινόμησης Bubble Sort Σύγκρινε το πρώτο με το δεύτερο στοιχείο Αν το πρώτο είναι μεγαλύτερο αντάλλαξε τις τιμές τους Συνέχισε με το δεύτερο και τρίτο στοιχείο... Επανέλαβε τη διαδικασία ξεκινώντας πάλι από το πρώτο στοιχείο και συγκρίνοντας όλα τα στοιχεία εκτός του τελευταίου... Επανέλαβε τη διαδικασία εφόσον υπάρχει έστω μία ανταλλαγή
Μέθοδος ταξινόμησης Bubble Sort /* εδοµένου πίνακα a[n] */ typedef unsigned char bool; int i, n, tmp, a[n]; bool stop_taxinomisi; n = N; /* Ο αριθµός στοιχείων που θα ταξινοµηθούν */ do { stop_taxinomisi=true; for (i=0; i<n-1; i++) if (a[i] > a[i+1]) { tmp = a[i]; a[i] = a[i+1]; a[i+1] = tmp; stop_taxinomisi=false; /*έγινε ανταλλαγή*/ n=n-1; /*Μείωσε το εύρος των δυνατών συγκρίσεων */ while(!stop_taxinomisi);
Ταξινόμηση με Επιλογή Βρες το μικρότερο στοιχείο του πίνακα Αντάλλαξέ το με το πρώτο στοιχείοτου πίνακα Επανέλαβε τη διαδικασία για τον πίνακα από το 2ο ως το τελευταίο στοιχείο όσο ο πίνακας έχει πάνω από 1 στοιχείο
Ταξινόμηση με Επιλογή /* εδοµένου πίνακα a[n] */ int i, j, tmp, min; for (i=0; i < N-1; i++) { min = i; for (j = i+1; j < N; j++) if (a[j] < a[min]) min = j; /* Θέση του µέγιστου */ tmp = a[i]; /* Ανταλλαγή στοιχείων */ a[i] = a[min]; a[min] = tmp;
Αναζήτηση πίνακα Ελέγχεται αν ο πίνακας περιέχει ένα στοιχείο με μία συγκεκριμένη τιμή Πίνακας ={2,4,3,5,1,6,7 Τιμή αναζήτησης=1 Αποτέλεσμα=ΝΑΙ (5 ο στοιχείο /4 η θέση του πίνακα) Τιμήαναζήτησης=8 Αποτέλεσμα=ΟΧΙ Μέθοδοι αναζήτησης Γραμμική αναζήτηση Δυαδική αναζήτηση (απαιτεί ταξινομημένο πίνακα)
Γραμμική αναζήτηση /* εδοµένου πίνακα a[n] */ int i=0, timi; bool found = FALSE; scanf("%d", &timi); scanf("%d", &timi); while ((!found) && (i<n)) if (a[i] == timi) found = TRUE; else i++; if (found) printf("bρεθηκε ΤΟ %d ΣΤΗ ΘΕΣΗ %d\n", a[i], i); else printf(" ΕΝ ΒΡΕΘΗΚΕ\n");
Δυαδική αναζήτηση Εφαρμόζεται σε ταξινομημένους πίνακες Εξετάζεται η τιμή του μεσαίου στοιχείου Αν έχει την τιμή που αναζητούμε, η αναζήτηση τερματίζεται επιτυχώς Αν έχει μεγαλύτερη τιμή, η αναζήτηση συνεχίζεται στο αριστερό τμήμα του πίνακα Αν έχει μικρότερη τιμή, η αναζήτηση συνεχίζεται στο δεξιό τμήμα του πίνακα Η διαδικασία επαναλαμβάνεται στο νέο τμήμα πίνακα μέχρι να βρεθεί το στοιχείο ή το τμήμα να περιέχει ένα μόνο στοιχείο που δεν είναι αυτό που αναζητούμε
Δυαδική αναζήτηση /* εδοµένου ταξινοµηµένου πίνακα a[n] */ int left, right, mid; bool found; left=0; right=n-1; found=false; while ((!found) && (left <= right)) { mid = (left+right)/2; if (a[mid] == timi) found=true; else if(a[mid] > timi) right = mid-1; else left = mid+1; if (found) printf("bρεθηκε ΤΟ %d ΣΤΗ ΘΕΣΗ %d\n", a[mid], mid); else printf(" ΕΝ ΒΡΕΘΗΚΕ\n");
Άσκηση Τι περιέχει το a[8] µετά την εκτέλεση του παρακάτω κώδικα; int i, a[10]; for (i = 0; i < 10; i++) a[i] = 9 - i; for (i = 0; i < 10; i++) a[i] = a[a[i]]; ΛΥΣΗ: i: 0 1 2 3 4 5 6 7 8 9 a[i] after 1st loop: 9 8 7 6 5 4 3 2 1 0 a[i] after 2nd loop: 0 1 2 3 4 4 3 2 1 0
Άσκηση Σε ένα πίνακα 10 θέσεων αποθηκεύουµε συχνότητεςεµφάνισης 10 αντικειµένων (20 εµφανίσεις) και βρίσκουµε το πιο συχνό αντικείµενο. Εντοπίστε πιθανά λάθη. main() { int num, i, j, maxi, a[9]; for (j=0; j<20; j++) { scanf("%d", num); a[num-1]++; for (i = 0; i < 10; i++); if (a[i] > a[maxi]) maxi = i; printf("max = %d\n", maxi);
Λάθη main() { int num, i, j, maxi, a[9]; for (j=0; j<20; j++) { scanf("%d", num); a[num-1]++; for (i = 0; i < 10; i++); if (a[i] > a[maxi]) maxi = i; printf("max = %d\n", maxi); #include <stdio.h> int a[10 10] scanf("%d", &num) O a[] πρέπει να αρχικοποιηθεί Το maxiπρέπει να αρχικοποιηθεί Λάθος ;μετά τη 2η for Μπορεί να εισαχθεί τιμή <0 ή >10
Ερωτήσεις; 31