Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

ΜΑΘΗΜΑ 2 0 Δομή Προγράμματος, Πίνακες Παραδείγματα, ΑΤΔ.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "ΜΑΘΗΜΑ 2 0 Δομή Προγράμματος, Πίνακες Παραδείγματα, ΑΤΔ."— Μεταγράφημα παρουσίασης:

1 ΜΑΘΗΜΑ 2 0 Δομή Προγράμματος, Πίνακες Παραδείγματα, ΑΤΔ

2 ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ Όπως είπαμε, ένα πρόγραμμα αποτελείται από: –Directives –καθολικές μεταβλητές –Τη συνάρτηση main (κύριο πρόγραμμα) –Άλλες συναρτήσεις Σημειώσεις: –το κύριο πρόγραμμα ονομάζεται main –οι διαδικασίες εάν δεν ορισθούν αλλοιώς έχουν αποτέλεσμα void –όλες οι συναρτήσεις στο ίδιο επίπεδο –δεν επιτρέπονται φωλιασμένες συναρτήσεις –μόνο πέρασμα κατά τιμή (call by value)

3 ΔΟΜΗ ΑΠΛΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ C directives directives main() main() { statements statements } other functions other functions #include #include void main() { printf(“Hello World.\n”); printf(“Hello World.\n”); function_1(); function_1(); } void function_1() { void function_1() { { printf(“Hello from function_1 \n”); printf(“Hello from function_1 \n”); }

4 DIRECTIVES DIRECTIVES Είναι εντολές για τον προ-επεξεργαστή Χρησιμοποιούνται συνήθως για τις παρακάτω περιπτώσεις: –Να εισάγουν βιβλιοθήκες π.χ. #include #include #include “myBestLibrary.h” –Να ορίσουν σταθερές π.χ. #define FREEZING_POINT_CELCIUS 0.0 #define FREEZING_POINT_FARHENEIT 32.0 # –Να εισάγουν πηγαίο κώδικα ανάλογα με συγκεκριμένες συνθήκες που υπολογίζονται από τον προ-επεξεργαστή π.χ. #define DEBUG1 ……………………. ……………………. #if DEBUG #if DEBUG printf(“To print the values of %d\n”, i) printf(“To print the values of %d\n”, i) #endif #endif

5 ΣΥΝΑΡΤΗΣΕΙΣ Οι συναρτήσεις είναι σαν τις ρουτίνες/υπο-ρουτίνες (routines, subroutines, procedures) σε άλλες γλώσσες προγραμματισμού. Ουσιαστικά είναι τα δομικά υλικά ενός προγράμματος. Οι συναρτήσεις πρέπει το κατά το δυνατόν να παράγουν όσο το δυνατόν πιο συγκεκριμένη λειτουργια (high cohesion) καί να εξαρτώνται όσο το δυνατόν λιγότερο η μία από την άλλη (low coupling). Υπάρχουν δύο μεγάλες κατηγορίες συναρτήσεων: –Συναρτήσεις βιβλιοθήκης – library functions (είναι κομμάτι της βιβλιοθήκης) –Συναρτήσεις εφαρμογών – application functions (ορίζονται από τον προγραμματιστή) Οι συναρτήσεις της C αποτελούνται από εντολές Μία συνάρτηση μπορεί να υπολογίζει ένα αποτέλεσμα καί να το επιστρέφει στο σημείο της κλήσης (αλλά αυτό δεν είναι πάντα απαραίτητο) π.χ. void main() { int i = 0; ……… i = addOne(i) ………; } int addOne(int j) { j = j+1; return (j); } Ορισμός της συνάρτησης Το κύριο πρόγραμμα

6 Η ΣΥΝΑΡΤΗΣΗ main Η συνάρτηση main είναι μία ειδική συνάρτηση που πρέπει να έχει ορισθεί σε κάθε C πρόγραμμα Η συνάρτηση main είναι η πρώτη συνάρτηση που καλείται σε ένα C πρόγραμμα. Η κλήση γίνεται αυτόματα από το λειτουργικό σύστημα όταν το πρόγραμμα αρχίζει να «τρέχει» Η συνάρτηση main μπορεί να επιστρέφει, ή να μην επιστρέφει κάποιο αποτέλεσμα

7 ΕΙΣΑΓΩΓΗ ΣΤΑ ΔΙΑΝΥΣΜΑΤΑ (ARRAYS) Στη C ο όρος array ορίζει μία συλλογή στοιχείων (δεδομένων). Η ιδέα των διανυσμάτων είναι λίγο πολύ η ίδια με τα μαθηματικά Στη C μπορούμε να έχουμε –μονοδιάστατα διανύσματα (vectors) πχ. Ένα διάνυσμα 100 στοιχείων α 1 α 2 α 3 α 4.....α 100 α 1 α 2 α 3 α 4.....α 100 –ή πολυδιάστατα διανύσματα (πίνακες – matrix) πχ. Ένας πίνακας 9Χ100 β1,1 β1,2 β1,3 β1,4.....β1,100 β1,1 β1,2 β1,3 β1,4.....β1,100 β2,1 β2,2 β2,3 β2,4......β2,100 β2,1 β2,2 β2,3 β2,4......β2,100.............................................................................................. β9,1 β9,2 β9,3 β9,4......β9,100 β9,1 β9,2 β9,3 β9,4......β9,100 Μπορούμε φυσικά να έχουμε και διανύσματα με περισσότερες από δύο διαστάσεις π.χ. 100Χ100Χ100Χ100 (τέσσερις διαστάσεις).

8 ΧΑΡΑΚΤΗΡΙΣΤΙΚΑ ΔΙΑΝΥΣΜΑΤΩΝ Τα χαρακτηριστικά γνωρίσματα ενός διανύσματος είναι: –Ο τύπος όλων των στοιχείων του (ο ίδιος τύπος δεδομένων για όλα τα στοιχεία του διανύσματος) –Ο αριθμός των διαστάσεων του –Το «μήκος» κάθε διάστασης

9 ΔΗΛΩΣΗ ΔΙΑΝΥΣΜΑΤΟΣ Στη C τα διανύσματα δηλώνονται με την παρακάτω έκφραση : [έκφραση 0 ] [έκφραση 1 ]..... [έκφραση n-1 ] [έκφραση 0 ] [έκφραση 1 ]..... [έκφραση n-1 ] Ο τύπος των στοιχείων του διανύσματος Το όνομα της μεταβλητής που αντιστοιχεί στο διάνυσμα και που χρησιμοποιούμε στο πρόγραμμά μας Το μήκος κάθε διάστασης. Οι εκφράσεις θα πρέπει να είναι ακέραιες σταθερές n διαστάσεις

10 ΠΑΡΑΔΕΙΓΜΑ float A[10] /* Μονοδιάστατο διάνυσμα 10 στοιχείων τύπου float */ int B[10] [30] /* Δισδιάστατο διάνυσμα 10Χ30 στοιχείων τύπου int */ /* δηλαδή πίνακας 10 γραμμών και 30 στηλών */ /* δηλαδή πίνακας 10 γραμμών και 30 στηλών */ double C[5][10][5][20] /* Διάνυσμα τεσσάρων διαστάσεων 5Χ10Χ5Χ20 */ /* όπου κάθε στοιχείο είναι τύπου double /* όπου κάθε στοιχείο είναι τύπου double Α0Α1Α9..................................................................

11 ΧΡΗΣΗ ΤΩΝ ΔΙΑΝΥΣΜΑΤΩΝ Σ’ένα πρόγραμμα C μπορούμε να χρησιμοποιήσουμε κάθε ένα στοιχείο με το να δώσουμε το όνομα του διανύσματος και τη θέση του στοιχείου στο διάνυσμα Η θέση του στοιχείου (οι συντεταγμένες του δηλαδή) πρέπει να είναι ακέραιοι αριθμοί. Η θέση ενός στοιχείου ορίζεται από τον δείκτη θέσης (συντεταγμένη) Ένα στοιχείο ενός διανύσματος μπορεί να χρησιμοποιηθεί σε ένα οποιοδήποτε σημείο ενός προγράμματος αρκεί η χρήση του τύπου του στοιχείου να είναι συμβατή με το σημείο του προγράμματος

12 ΠΑΡΑΔΕΙΓΜΑ float A[100]; /* Μονοδιάστατο διάνυσμα 100 στοιχείων τύπου float */ Α[0] = 33.34; Α[1] = 26.67; int B[9] [9]; /* Δισδιάστατο διάνυσμα 10Χ30 στοιχείων τύπου int */ /* δηλαδή πίνακας 10 γραμμών και 30 στηλών */ /* δηλαδή πίνακας 10 γραμμών και 30 στηλών */ Β[3][7] = 356; Β[0][3] = 124; double C[5][10][5][20]; /* Διάνυσμα τεσσάρων διαστάσεων 5Χ10Χ5Χ20 */ /* όπου κάθε στοιχείο είναι τύπου double */ /* όπου κάθε στοιχείο είναι τύπου double */ C[4][9][4][19] = 123.34567; /* Αυτό είναι το «τελευταίο στοιχείο του /* διανύσματος» */ /* διανύσματος» */

13 ΠΑΡΑΤΗΡΗΣΕΙΣ Στη C η υλοποίηση των διανυσμάτων στη γλώσσα είναι αρκετά απλοϊκή σχετικά με άλλες γλώσσες προγραμματισμού Θα πρέπει να προσέχουμε τα παρακάτω: –Όλοι οι δείκτες (index) αρχίζουν από το μηδέν ( 0) !!!!!! –Το μήκος των διαστάσεων δεν ελέγχεται αυτόματα. Δηλαδή σ’ένα μονοδιάστατο διάνυσμα 100 στοιχείων μπορείτε να προσπαθήσετε να θέσετε μια τιμή μέσα από το πρόγραμμά σας στο 101 στοιχέιο και ο συμβολομεταφραστής μπορεί να μην το δει (out of bound run time error) –Τα διανύσματα δεν είναι σαν τις άλλες διακριτές μεταβλητές

14 ΔΕΙΚΤΕΣ ΘΕΣΗΣ ΔΙΑΝΥΣΜAΤΩΝ Όλοι οι δείκτες θέσης διανυσμάτων σ’ένα πρόγραμμα C αρχίζουν από το μηδέν. Αντίθετα στα μαθηματικά είμαστε συνηθισμένοι να αρχίζουμε από το 1. Δηλαδή στη C η δήλωση διανύσματος: float a[5]; float a[5]; ορίζει: ορίζει: α[0], α[1], α[2], α[3], α[4] /*Κάθε στοιχείο είναι τύπου float */ α[0], α[1], α[2], α[3], α[4] /*Κάθε στοιχείο είναι τύπου float */ και η δήλωση διανύσματος: και η δήλωση διανύσματος: int b[3][4] /*Κάθε στοιχείο είναι τύπου int */ int b[3][4] /*Κάθε στοιχείο είναι τύπου int */ ορίζει: ορίζει: b[0][0], b[0][1], b[0][2], b[0][3] b[0][0], b[0][1], b[0][2], b[0][3] b[1][0], b[0][1], b[0][2], b[0][3] b[1][0], b[0][1], b[0][2], b[0][3] b[2][0], b[0][1], b[0][2], b[0][3] b[2][0], b[0][1], b[0][2], b[0][3]

15 ΟΡΙΑ ΔΕΙΚΤΩΝ Στη C όπως είπαμε τα όρια δεν ελέγχονται κατά την εκτέλεση του προγράμματος. Αυτό σημαίνει ότι εάν μία μεταβλητή που χρησιμοποιείται σαν δείκτης θέσης μίας διάστασης ενός διανύσματος πάρει μία ακέραια τιμή μεγαλύτερη από την μέγιστη επιτρεπτή τιμή της μπορεί να χρησιμοποιηθεί σαν δείκτης θέσης στο διάνυσμα με άσχημες επιπτώσεις για το πρόγραμμα (program crash – out of array bounds run time error). Θα πρέπει να είμαστε προσεκτικοί στη χρήση των δεικτών θέσης. Παράδειγμα: int i; int i; float a[4]; float a[4]; …………. …………. i = 3; i = 3; a[i+1] = 34.56 /*Προσπαθούμε εδώ να αποθέσουμε την τιμή */ a[i+1] = 34.56 /*Προσπαθούμε εδώ να αποθέσουμε την τιμή */ /* 34.56 στον δείκτη θέσης 4 – πέμπτη θέση – ενώ */ /* 34.56 στον δείκτη θέσης 4 – πέμπτη θέση – ενώ */ /* το διάνυσμα έχει μόνο τέσσερις θέσεις. */ /* το διάνυσμα έχει μόνο τέσσερις θέσεις. */ /* ΑΥΤΟ ΕΙΝΑΙ ΛΑΘΟΣ */ /* ΑΥΤΟ ΕΙΝΑΙ ΛΑΘΟΣ */

16 ΔΙΑΝΥΣΜΑΤΑ ΣΑΝ ΜΕΤΑΒΛΗΤΕΣ Όπως είπαμε τα διανύσματα διαφέρουν λιγάκι από τις άλλες διακριτές μεταβλητές. Για παράδειγμα εάν έχουμε τις μεταβλητές: int i = 10, j; int i = 10, j; /* μπορούμε να πούμε: */ /* μπορούμε να πούμε: */ j = i; j = i; Όμως εάν έχουμε: Όμως εάν έχουμε: int a[3]; int a[3]; int b[3]; int b[3]; a[0] = 10; a[1] = 12; a[2] = 14; a[0] = 10; a[1] = 12; a[2] = 14; ………….. ………….. /* Δεν μπορούμε να πούμε */ /* Δεν μπορούμε να πούμε */ b = a; b = a; ΛΑΘΟΣ

17 AΠΟΘΕΣΗ ΤΙΜΩΝ ΜΕΤΑΞΥ ΔΙΑΝΥΣΜΑΤΩΝ Στα διανύσματα η απόθεση τιμών γίνεται στοιχείο- στοιχείο. Για παράδειγμα, η απόθεση τιμών στα στοιχεία του διανύσματος a[3] από το διάνυσμα β[3] γίνεται: for(i=0; i<3; i++) for(i=0; i<3; i++) a[i] = b[i]; a[i] = b[i]; Θα δούμε αργότερα ότι και η χρήση των διανυσμάτων στις συναρτήσεις διαφέρει λιγάκι από αυτή των άλλων μεταβλητών.

18 ΠΡΟΓΡΑΜΜΑΤΙΚΑ ΙΔΙΩΜΑΤΑ int a[5]; for (i=0; i<5; i++) a[i] = 0; /* Αρχική απόθεση τιμών στο διάνυσμα */ a[i] = 0; /* Αρχική απόθεση τιμών στο διάνυσμα */ for (i=0; i<5; i++) a[i] = a[i]++; /* Δηλαδή a[i] = a[i] + 1. Aύξηση τιμών κατά 1 */ a[i] = a[i]++; /* Δηλαδή a[i] = a[i] + 1. Aύξηση τιμών κατά 1 */ for (i=0; i<5; i++) /* Διάβασμα τιμών από τον χρήστη */ scanf(“%d”, &a[i]); scanf(“%d”, &a[i]); for (i=0; i<5; i++) sum += a[i] /* Δηλαδή sum = sum + a[i]. Υπολογισμός sum += a[i] /* Δηλαδή sum = sum + a[i]. Υπολογισμός αθροίσματος τιμών */ αθροίσματος τιμών */

19 ΚΟΙΝΑ ΛΑΘΗ int a[10], j; for (i=1; i<=10; i++) a[i] = 0; a[i] = 0; i = 0; while (i < 10) a[++i] = 0; /* Σωστό είναι το a[i++] = 0; a[++i] = 0; /* Σωστό είναι το a[i++] = 0; i = 0; while (i < 10) a[i] = b[i++] /* Εάν το δεξιό μέρος υπολογιστεί πρώτα τότε */ a[i] = b[i++] /* Εάν το δεξιό μέρος υπολογιστεί πρώτα τότε */ /* το b[i] αποτίθεται στο a[i+1] !!! */ /* το b[i] αποτίθεται στο a[i+1] !!! */ /* Η λύση είναι να γράψουμε a[i] = b[i]; i++; */ /* Η λύση είναι να γράψουμε a[i] = b[i]; i++; */

20 ΠΑΡΑΔΕΙΓΜΑΤΑ Αντιστροφή στοιχείων διανύσματος και αντιγραφή του σε άλλο διάνυσμα #include #include #define N 10 void main() { int a[N], b[N], j; int a[N], b[N], j; printf(“Enter %d numbers:”, N); printf(“Enter %d numbers:”, N); for (j=0; i<N; j++) for (j=0; i<N; j++) scanf(“%d”, &a[j]); scanf(“%d”, &a[j]); printf(“\n”); printf(“\n”); printf(“Printing in reverse order and copying to b \n”); printf(“Printing in reverse order and copying to b \n”); for (j = N-1; j==0; j--) { for (j = N-1; j==0; j--) { printf(“%d,”, a[i]); printf(“%d,”, a[i]); b[abs(j-N+1)] = a[j]; b[abs(j-N+1)] = a[j]; } printf(“\n”); printf(“\n”); printf(“Printing array b \n”); printf(“Printing array b \n”); for(j = 0; j<N; j++) for(j = 0; j<N; j++) printf(“%d,”, b[j]); printf(“%d,”, b[j]); printf(“\n”); printf(“\n”);}

21 ΧΡΗΣΗ ΤΗΣ ΣΥΝΑΡΤΗΣΗΣ sizeof Η συνάρτηση sizeof επιστρέφει το μέγεθος σε bytes της μεταβλητής που χρησιμοποιείται σαν παράμετρος της συνάρτησης Για παράδειγμα εάν ένα διάνυσμα έχει 10 ακέραιους αριθμούς και εάν κάθε ακέραιος έχει μέγεθος 16 bits (2 bytes) τότε το μέγεθος του διανύσματος είναι 20 bytes. Εάν κάθε ακέραιος έχει μέγεθος 32 bits, τότε το μέγεθος του διανύσματος είναι 40 bytes. H έκφραση sizeof(a)/sizeof(a[0]) υπολογίζει το αριθμό των στοιχείων ενός μονοδιάστατου πίνακα. Μπορούμε δηλαδή να γράψουμε: for(i=0; i < sizeof(a)/sizeof(a[0]); i++) for(i=0; i < sizeof(a)/sizeof(a[0]); i++) a[i] = 0; a[i] = 0; ή να δηλώσουμε ένα macro (δουλεύει μόνο για το διάνυσμα a) ή να δηλώσουμε ένα macro (δουλεύει μόνο για το διάνυσμα a) #define ARRAY_SIZE (sizeof(a) / sizeof(a[0])) #define ARRAY_SIZE (sizeof(a) / sizeof(a[0])) ………………………………….. ………………………………….. for(i=0; i < ARRAY_SIZE; i++) for(i=0; i < ARRAY_SIZE; i++) a[i] = 0; a[i] = 0;

22 ΠΑΡΑΔΕΙΓΜΑ ΜΕ ΠΟΛΥΔΙΑΣΤΑΤΑ ΔΙΑΝΥΣΜΑΤΑ Στη C τα πολυδιάστατα διανύσματα αποθηκεύονται στη μνήμη σειριακά κατα σειρά (row-major order) Ένα παράδειγμα χρήσης πολυδιάστατου (2 διαστάσεις) πίνακα είναι #define N 10 #define N 10 float ident_matrix[N][N] float ident_matrix[N][N] int row, col; int row, col; for (row = 0; row < N; row++) for (row = 0; row < N; row++) for(col=0; col <N; col++) for(col=0; col <N; col++) if(row == col) if(row == col) ident_matrix[row][col] = 1.0; ident_matrix[row][col] = 1.0; else else ident_matrix[row][col] = 0.0 ident_matrix[row][col] = 0.0

23 ΑΡΧΙΚΕΣ ΤΙΜΕΣ ΔΙΑΝΥΣΜΑΤΟΣ Εάν το διάνυσμα δεν είναι μεγάλο τότε μπορούμε να του δώσουμε αρχικές τιμές με τον παρακάτω τρόπο: int [3][4] = { {1, 3, 5, 2}, int [3][4] = { {1, 3, 5, 2}, {6, 10, 9, 12}, {6, 10, 9, 12}, {4, 3, 1} {4, 3, 1} } Ό,τι στοιχεία μπορεί να λείπουν από μία γραμμή παίρνουν αρχική τιμή 0. Άλλο παράδειγμα αρχικοποίησης (διάνυσμα με χαρακτήρες) char s[][10] = { "my", "name", "is", "joe" "my", "name", "is", "joe"};Συμβολοσειρές –Είναι ειδική περίπτωση πίνακων χαρακτήρων char s[6] = "abcde"; –Τερματίζονται με τον κενό χαρακτήρα '\0' char s[6] = {'a', 'b', 'c', 'd', 'e', '\0'}; 'd', 'e', '\0'};

24 ΠΑΡΑΔΕΙΓΜΑ ΕΥΡΕΣΗΣ ΣΤΟΙΧΕΙΟΥ ΣΕ ΔΙΑΝΥΣΜΑ Ένα κοινό πρόβλημα που χρησιμοποιεί διανύσματα είναι η εύρεση στοιχείου σ’ένα διάνυσμα Το πρόβλημα είναι: –Δεδομένου ενός διανύσματος α[Ν] και μίας τιμής χ θέλουμε να βρούμε τον δείκτη του διανύσματος κ που έχει στη θέση αυτή του διανύσματος αυτή τη δεδομένη τιμή, δηλαδή α[κ] == x Υπάρχουν δύο περιπτώσεις στο πρόβλημα 1.Το διάνυσμα δεν έχει ταξινομηθεί 2.Το διάνυσμα είναι ταξινομημένο (π.χ. Σε αύξουσα σειρά)

25 ΑΠΛΗ ΠΕΡΙΠΤΩΣΗ ΕΥΡΕΣΗΣ ΣΤΟΙΧΕΙΟΥ Ας δούμε ένα παράδειγμα με μη ταξινομημένο διάνυσμα #include #include int main() { int i=0; int i=0; int found = 0; int found = 0; int list[10]; int list[10]; int location = -1; int location = -1; for(i = 0; i<10, i++) { for(i = 0; i<10, i++) { printf(“Enter number :”); printf(“Enter number :”); scanf(“%d”, &list[i]); scanf(“%d”, &list[i]); printf(“\n”); printf(“\n”); }; }; i = 0; i = 0; while(i<10 && !found) while(i<10 && !found) if (key = list[i]) { if (key = list[i]) { location = i; location = i; found = 1; found = 1; } else else i++; i++; return (location); return (location);}

26 ΑΦΗΡΗΜΕΝΟΣ ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) Ο Τύπος δεδομένων ή ο βασικός τύπος δεδομένων όπως κάποιοι αναφέρουν (data type) μίας μεταβλητής ορίζει το είδος των τιμών που αυτή η μεταβλητή μπορεί να λάβει. Για παράδειγμα μία μεταβλητή float μπορεί να λάβει τιμές που είναι πραγματικοί αριθμοί Ουσιαστικά, ένας τύπος δεδομένων ορίζει: 1. 1.Μία συλλογή αντικειμένων με μία κοινή σχέση (π.χ. Το είδος το τιμών, την κοινή κατασκευαστική δομή) 2. 2.Ένα σύνολο έγκυρων πράξεων επί των αντικειμένων. Μία πράξη είναι έγγυρη για κάποια αντικείμενα εάν μπορεί να εκτελεσθεί για αυτά τα αντικείμενα Ο Αφηρημένος Τύπος Δεδομένων (Abstract Data Type) είναι ένα Μαθηματικό μοντέλο που περιγράφει ένα τύπο δεδομένων (δηλαδή τα χαρακτηριστικά του, και τις έγκυρες πράξεις σε αυτό τον τύπο δεδομένων). Η σημαντική διαφορά του Αφηρημένου Τύπου Δεδομένων, και του Τύπου Δεδομένων που ορίζεται από τον ΑΤΔ είναι ότι ο ΑΤΔ είναι: 1. 1.Μαθηματικό μοντέλο και όχι δήλωση τύπου σε κάποια γλώσσα προγραμματισμού 2. 2.Η περιγραφή των έγκυρων πράξεων και των αντικειμένων είναι διαχωρισμένες από την παράσταση των αντικειμένων (π.χ. Τη δήλωση τους), και την υλοποίηση των έγκυρων πράξεων

27 ΠΑΡΑΔΕΙΓΜΑ Για παράδειγμα η έννοια της Λίστας σαν Αφηρημένος Τύπος Δεδομένων είναι ένα αντικείμενο το οποίο έχει τα παρακάτω χαρακτηριστικά και έγκυρες πράξεις: Χ.1 Μήκος (πλήθος στοιχείων) Χ.1 Μήκος (πλήθος στοιχείων) Χ.2 Αρχικό στοιχείο Χ.2 Αρχικό στοιχείο Χ.2 Τελικό στοιχείο Χ.2 Τελικό στοιχείο Π.1 Υπολογισμός μήκους Π.1 Υπολογισμός μήκους Π.2 Υπολογισμός αρχικού στοιχείου Π.2 Υπολογισμός αρχικού στοιχείου Π.3 Απόθεση αρχικού στοιχείου Π.3 Απόθεση αρχικού στοιχείου Π.4 Υπολογισμός τελικού στοιχείου Π.4 Υπολογισμός τελικού στοιχείου Π.5 Απόθεση τελικού στοιχείου Π.5 Απόθεση τελικού στοιχείου Π.6 Εισαγωγή νέου στοιχείου στη Λίστα Π.6 Εισαγωγή νέου στοιχείου στη Λίστα Π.7 Σβήσιμο ν-οστού στοιχείου από τη Λίστα Π.7 Σβήσιμο ν-οστού στοιχείου από τη Λίστα Π.8 Εύρεση στοιχείου στη Λίστα Π.8 Εύρεση στοιχείου στη Λίστα Σε αυτό τον ορισμό της έννοιας της Λίστας δεν ενδιαφερόμαστε πώς αυτή η έννοια υλοποιείται σε κάποια γλώσσα προγραμματισμού (π.χ. Στη C)

28 ΠΛΕΟΝΕΚΤΗΜΑΤΑ ΤΩΝ ΑΔΤ Οι ΑΔΤ υποστηρίζουν τις έννοιες: 1.Της Γενίκευσης (Generalization). Για παράδειγμα η Λίστα σαν ΑΤΔ δεν μας περιορίζει στο είδος των στοιχείων της Λίστας, ούτε πως οι έγκυρες πράξεις ορίζονται 2.Της Ειδίκευσης (Specialization). Για παράδειγμα μπορούμε να ορίσουμε μία υποκατηγορία Λίστας οπού τα νέα στοιχεία εισάγονται πάντα στο τέλος της Λίστας, ή μία άλλη υποκατηγορία που τα νέα στοιχεία εισάγονται πάντα στην αρχή της Λίστας 3.Της Τοπικότητας Για παράδειγμα η Λίστα σαν ΑΤΔ δεν μας περιορίζει πως αυτή υλοποιείται (π.χ. Σαν διάνυσμα – array, σαν διασυνδεδεμένη λίστα κλπ.). Οπότε είναι εύκολη η αλλαγή της υλοποίησης του ΑΤΔ 3.Της Τοπικότητας (Locality). Για παράδειγμα η Λίστα σαν ΑΤΔ δεν μας περιορίζει πως αυτή υλοποιείται (π.χ. Σαν διάνυσμα – array, σαν διασυνδεδεμένη λίστα κλπ.). Οπότε είναι εύκολη η αλλαγή της υλοποίησης του ΑΤΔ 4.Της Απόκρυψης Πληροφορίας (Information hiding), δηλαδή η συμπεριφορά των έγκυρων πράξεων είναι φανερή αλλά οι λεπτομέρειες υλοποίησης των έγκυρων πράξεων από ένα πρόγραμμα είναι κρυμμένες. Αυτό σημαίνει ότι κάποιος που χρησιμοποιεί μία υλοποίηση μιας Λίστας (π.χ. Βιβλιοθήκη) στο πρόγραμμα του δεν χρειάζεται να γνωρίζει πως αυτές οι πράξεις υλοποιήθηκαν, αλλά μόνο τι κάνουν και πια είναι η συμπεριφορά τους (behavior) 5.Της Ενθυλάκωσης (Encapsulation), δηλαδή τα χαρακτηριστικά και οι έγκυρες πράξεις ενός ΑΔΤ ορίζονται μόνο μέσα στον ΑΤΔ, και μπορούν να εφαρμοσθούν μόνο σε σχέση με αυτόν τον ΑΤΔ (π.χ. Δεν μπορώ να εφαρμόσω πράξεις σε ένα ΑΤΔ εάν αυτές οι πράξεις δεν έχουν ορισθεί σε σχέση με αυτόν τον ΑΤΔ).

29 ΔΟΜΙΚΗ ΣΧΕΣΗ ΣΤΟΙΧΕΙΩΝ ΑΤΔ Οι ΑΤΔ μπορούν να κατηγοριοποιηθούν και σύμφωνα με τη δομική σχέση των στοιχείων τους –Γραμμική Σχέση: Κάθε στοιχείο του ΑΤΔ έχει το πολύ ένα άμεσο προηγούμενο και το πολύ ένα άμεσο επόμενο στοιχείο. Επιπλέον υπάρχει το πρώτο και το τελευταίο στοιχείο –Ιεραρχική Σχέση: Κάθε στοιχείο του ΑΤΔ έχει το πολύ ένα άμεσο προηγούμενο και ένα ή περισσότερα επόμενα στοιχεία. Επιπλέον υπάρχει το πρώτο και τα τελευταία στοιχεία –Σχέση Δικτύου: Κάθε στοιχείο του ΑΤΔ έχει ένα ή περισσότερα άμεσα προηγούμενα και ένα ή περισσότερα επόμενα στοιχεία –Σχέση Συνόλου: Τα στοιχεία του ΑΤΔ δεν έχουν κάποια σχέση ταξινόμησης μεταξύ τους

30 ΑΤΔ - ΣΧΗΜΑΤΙΚΑ Ο ΑΤΔ Λίστα μπορεί να παρασταθεί γραφικά: Mikos, Arxkiko_Stoix,Teliko_Stoix

31 ΓΕΝΙΚΕΥΣΗ / ΕΙΔΙΚΕΥΣΗ Mikos, Arxkiko_Stoix,Teliko_Stoix

32 ΒΑΣΙΚΟΙ ΑΤΔ Προφανώς οι ΑΤΔ έχουν ευρεία χρήση για σύνθετα αντικείμενα (π.χ. Λίστα) που ενθυλακώνουν πράξεις και χαρακτηριστικά Όμως μπορούμε να ξεκινήσουμε και να ορίσουμε σαν ΑΤΔ ακόμα και την έννοια του ακέραιου αριθμού, του πραγματικού αριθμού, και του χαρακτήρα. Άλλοι «απλοί» ΑΤΔ είναι οι έννοιες του μονοδιάστατου πίνακα, του πολυδιάστατου πίνακα, του αραιού πίνακα, της δομής, του συνόλου....

33 Ο ΑΤΔ ΑΚΕΡΑΙΟΣ Χαρακτηριστικά: –Τιμή –Διεύθυνση Έγκυρες Πράξεις –Καταχώρηση(τιμή) –Πρόσθεση(ακέραιος, ακέραιος) : ακέραιος –Αφαίρεση(ακέραιος, ακέραιος) : ακέραιος –Πολλαπλασιασμός(ακέραιος, ακέραιος) : ακέραιος –Διαίρεση(ακέραιος, ακέραιος) : ακέραιος –Υπόλοιπο(ακέραιος, ακέραιος) : ακέραιος –Μηδέν?(ακέραιος): λογικό –Θετικός?(ακέραιος): λογικό

34 Ο ΑΤΔ ΠΡΑΓΜΑΤΙΚΟΣ Χαρακτηριστικά: –Τιμή –Διεύθυνση Έγκυρες Πράξεις –Καταχώρηση(τιμή) –Πρόσθεση(πραγματικός, πραγματικός) : πραγματικός –Αφαίρεση(πραγματικός, πραγματικός) : πραγματικός –Πολλαπλασιασμός(πραγματικός, πραγματικός) : πραγματικός –Διαίρεση(πραγματικός, πραγματικός) : ακέραιος –Υπόλοιπο(πραγματικός, πραγματικός) : ακέραιος –Μηδέν?(ακέραιος): λογικό –Θετικός?(ακέραιος): λογικό

35 Ο ΑΤΔ ΧΑΡΑΚΤΗΡΑΣ Χαρακτηριστικά: –Τιμή –Διεύθυνση Έγκυρες Πράξεις –Καταχώρηση(τιμή) –Κωδικός(χαρακτήρας) : ακέραιοσ | Θετικός?(Κωδικός(χαρακτήρας) = Αληθές –Υπολογισμός_Χαρακτήρα(ακέραιος) : χαρακτηρας

36 Ο ΑΤΔ ΜΟΝΟΔΙΑΣΤΑΤΟΣ ΠΙΝΑΚΑΣ Χαρακτηριστικά: –Μήκος –Αρχικό στοιχείο Έγκυρες Πράξεις –Δημιουργία() : πίνακας –Αποθήκευση(πίνακας, δείκτης, τιμή) : πίνακας –Ανάκτηση(πίνακας, δείκτης) : αντικείμενο

37 Ο ΑΤΔ ΣΥΜΒΟΛΟΣΕΙΡΑ Χαρακτηριστικά: –Μήκος Έγκυρες Πράξεις –Δημιουργία() : συμβολοσειρά –Εύρεση_Μήκους(συμβολοσειρά) : ακέραιος –Ανάκτηση(συμβολοσειρά, δείκτης) : χαρακτήρας –Προσάρτηση_στο_τελος(συμβολοσειρα, χαρακτήρας) : συμβολοσειρά –Διαγραφή_Πρώτου(συμβολοσειρα) : συμβολοσειρά –Αντιγραφή(συμβολοσειρά, συμβολοσειρα, δείκτης, δείκτης) : συμβολοσειρά –Συνένωση(συμβολοσειρά, συμβολοσειρά) : συμβολοσειρά –Αναζήτηση(συμβολοσειρά, συμβολοσειρά) : ακέραιος –Εισαγωγή(συμβολοσειρά, συμβολοσειρά, δείκτης) : συμβολοσειρά –Αντικατάσταση(συμβολοσειρά, δείκτης, δείκτης, συμβολοσειρά) : συμβολοσειρά –Απομάκρυνση(συμβολσειρά, δείκτης, πλήθος) : συμβολοσειρά –Σύγκριση(συμβολοσειρά, συμβολοσειρά, τελεστής) : λογικό

38 Ο ΑΤΔ ΣΥΝΟΛΟ Χαρακτηριστικά: –Πλήθος_Στοιχείων Έγκυρες Πράξεις –Δημιουργία() : σύνολο –Εισαγωγή(σύνολο, αντικείμενο) : σύνολο –Διαγραφή(σύνολο, αντικείμενο) : σύνολο –Μέλος?(σύνολο, αντικείμενο) : λογικό –Κενό?(σύνολο) : λογικό –Ίσα?(σύνολο, σύνολο) : λογικό –Υποσύνολο?(σύνολο, σύνολο) : λογικό –Ένωση(σύνολο, σύνολο) : σύνολο –Τομή(σύνολο, σύνολο) : σύνολο –Διαφορά(σύνολο, σύνολο) : σύνολο –Εύρεση_Πλήθους_Στοιχείων(σύνολο) : ακέραιος

39 ΠΑΡΑΔΕΙΓΜΑ ΑΤΔ: ΣΥΝΟΛΟ(i) Σημασιολογία –Αξιωματικός ορισμός member : member(x, empty) = false member(x, add(x, s)) = true member(x, add(y, s)) = member(x, s) αν x != y –Αξιωματικός ορισμός union : union(empty, s) = s union(add(x, s1), s2) = add(x, union(s1, s2))

40 ΠΑΡΑΔΕΙΓΜΑ ΑΤΔ: ΣΥΝΟΛΟ(ii) Σημασιολογία –Αξιωματικός ορισμός subset : subset(empty, s) = true subset(add(x, s1), s2) = band(member(x, s2), subset(s1, s2)) –Αξιωματικός ορισμός equal : equal(s1, s2) = band(subset(s1, s2), subset(s2, s1))

41 ΣΥΓΚΕΚΡΙΜΕΝΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ Συγκεκριμένος τύπος δεδομένων – ΣΤΔ (concrete data type) –καθορίζει τις ιδιότητες του τύπου δεδομένων –καθορίζει επακριβώς την υλοποίησή του Κάθε γλώσσα προγραμματισμού υποστηρίζει ορισμένους ΣΤΔ, π.χ. –απλοί τύποι: ακέραιοι αριθμοί, πραγματικοί αριθμοί, χαρακτήρες, λογικές τιμές –σύνθετοι τύποι: πίνακες (arrays), εγγραφές (records), δείκτες (pointers), σύνολα (sets)

42 ΣΧΕΣΗ ΑΤΔ και ΣΤΔ(i) ΑΤΔ set: σύνολα ακεραίων s = { 1, 3, 7, 9 } Υλοποίηση 1: πίνακας από boolean falsetruefalsetrue false s[2]s[1]s[8]s[3]s[7]s[9]s[0] s[4] s[5]s[6]s[10] Υλοποίηση 2: bits ενός πίνακα από int 0 s[1]s[3] s[7] s[9] 101000101000000 –Στατικός τρόπος υλοποίησης ΣΤΔ

43 ΣΧΕΣΗ ΑΤΔ και ΣΤΔ(ii) Υλοποίηση 3: Υλοποίηση συνόλου σαν διάνυσμα (Στατική μέθοδος – θα πρέπει να ελέγχουμε για επαναλήψεις στοιχείων) int s[4] = {1, 3, 7, 9} int s[4] = {1, 3, 7, 9} Υλοποίηση 4: απλά συνδεδεμένη λίστα (Δυναμική μέθοδος – θα πρέπει να ελέγχουμε για επαναλήψεις στοιχείων) 1379

44 ΑΝΑΣΚΟΠΗΣΗ Δομή Προγράμματος C Πίνακες – Μονοδιάστατοι, Πολυδιάστατοι Αφηρημένοι Τύποι Δεδομένων Συγκεκριμένοι Τύποι Δεδομένων


Κατέβασμα ppt "ΜΑΘΗΜΑ 2 0 Δομή Προγράμματος, Πίνακες Παραδείγματα, ΑΤΔ."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google