Διαφάνειες παρουσιάσεων
-
Upload
joelle-harmon -
Category
Documents
-
view
40 -
download
1
description
Transcript of Διαφάνειες παρουσιάσεων
![Page 1: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/1.jpg)
ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ
Διδάσκοντες: Γιάννης Μαΐστρος([email protected])Νίκος Παπασπύρου([email protected])Βασίλης Βεσκούκης([email protected])Πέτρος Στεφανέας([email protected])
http://www.softlab.ntua.gr/~nickie/Courses/progtech/
1Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Διαφάνειες παρουσιάσεων
Η γλώσσα προγραμματισμού CΠρογραμματιστικές τεχνικέςΔομές δεδομένων
DRAFTDRAFT
330/03/030/03/03
![Page 2: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/2.jpg)
2Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Η ιστορία της C
1969-1973 AT&T Bell Labs, Dennis Ritchie1978 “The C Programming Language”
K&R: Kernighan & Ritchie1983 Σύσταση ANSI Standardization
Committee X3J111989-1990 Αποδοχή ANSI/ISO Standard
ANSI C1990-1999 Αναθεώρηση του standard υπό
εξέλιξη — C9X C99
![Page 3: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/3.jpg)
3Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Χαρακτηριστικά της C (i)
Γλώσσα προστακτικού προγραμματισμού Γλώσσα μετρίου επιπέδου Οικονομία στην έκφραση
(λιτή και περιεκτική) Σχετικά χαλαρό σύστημα τύπων Φιλοσοφία: ο προγραμματιστής έχει πλήρη
έλεγχο και ευθύνεται για τα σφάλματά του
![Page 4: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/4.jpg)
4Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Χαρακτηριστικά της C (ii)
Ιδιαίτερα δημοφιλής στην πράξη Έχει χρησιμοποιηθεί για τον
προγραμματισμό ευρέως φάσματος συστημάτων και εφαρμογών
Έχει χρησιμοποιηθεί ως βάση για πληθώρα άλλων γλωσσών: C++, Java
![Page 5: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/5.jpg)
5Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Hello world!
#include <stdio.h>
void main (){ printf("Hello world!\n");}
Παρατηρήσεις Η επικοινωνία με τον «έξω» κόσμο γίνεται
μέσω της βιβλιοθήκης συναρτήσεων Το σημείο έναρξης του προγράμματος είναι η
«κύρια» συνάρτηση main.
![Page 6: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/6.jpg)
6Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Εκτέλεση προγραμμάτων
Πηγαίοςκώδικας(source)
ΜεταγλωττιστήςC (compiler)
Συνδέτης(linker)
Βιβλιοθήκη(library)
Αρχείαεπικεφαλίδας(header files)
Objectcode
Εκτελέσιμοπρόγραμμα(executable)
hello.c
hello.o
hello
printf
stdio.h
![Page 7: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/7.jpg)
7Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Τύποι δεδομένων (απλοί)
Ακέραιοι αριθμοίint char
Καθορισμός προσήμανσηςsigned unsigned
Καθορισμός μεγέθουςshort long
Αριθμοί κινητής υποδιαστολήςfloat double
![Page 8: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/8.jpg)
8Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Πίνακας απλών τύπων δεδομένων
char , signed char , unsigned char
signed short int , unsigned short int
signed int , unsigned int
signed long int , unsigned long int
float
double
long double
Με κόκκινο χρώμα όσα μπορούν να παραλειφθούν.
![Page 9: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/9.jpg)
9Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ορισμός μεταβλητών
int x;
int x, y, z;
double r;
unsigned long abc;
Αρχικοποίησηint x = 1;
int x, y = 0, z = 2;
double r = 1.87;
unsigned long abc = 42000000;
![Page 10: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/10.jpg)
10Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Σταθερές (i)
Ακέραιες42 0 -1 δεκαδικές
037 οκταδικές
0x1f δεκαεξαδικές
42U 42L 42UL unsigned & long Κινητής υποδιαστολής
42.0 -1.3 δεκαδικές
2.99e8 με δύναμη του 10
42.0F 42.0L float & long double
![Page 11: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/11.jpg)
11Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Σταθερές (ii)
Χαρακτήρα'a' '0' '$'
Ειδικοί χαρακτήρες\n αλλαγή γραμμής\' απόστροφος\\ χαρακτήρας \ (backslash)\t αλλαγή στήλης (tab)\" εισαγωγικό\0 χαρακτήρας με ASCII = 0 (null)\037 » με ASCII = 37 (οκταδικό)\x1f » με ASCII = 1f (δεκαεξαδικό)
![Page 12: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/12.jpg)
12Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Σταθερές (iii)
Συμβολοσειρές"abc" "Hello world!\n""a\"51\""
Δηλώσεις σταθερώνconst int size = 10, num = 5;
const double pi = 3.14159;
const char newline = '\n';
![Page 13: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/13.jpg)
13Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Σχόλια
Μεταξύ /* και */#include <stdio.h>
/* This simple program greets the
world by saying "hello" */
void main ()
{
printf( /* eh? */ "Hello world!\n");
}
Το παρακάτω είναι λάθος/* Nested /* comments */ are wrong! */
![Page 14: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/14.jpg)
14Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Εκτύπωση με την printf
Απλοί τύποι δεδομένων int %d char %c double %lf string %s
Παράδειγμαprintf("%d %lf %c %s\n",42, 1.2, 'a', "hello");
Αποτέλεσμα42 1.200000 a hello
![Page 15: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/15.jpg)
15Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Εισαγωγή με την scanf
Ίδιοι κωδικοί για τους απλούς τύπους Παράδειγμα
int n;
double d;
char c;
scanf("%d", &n);
scanf("%lf", &d);
scanf("%c", &c);
![Page 16: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/16.jpg)
16Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ένα πιο σύνθετο παράδειγμα
#include <stdio.h>
void main (){int celcius;double farenheit;
printf("Give the temperature (C): ");scanf("%d", &celcius);farenheit = 9.0 * celcius / 5.0 + 32.0;printf("%d degrees Celcius ” "is %lf degrees Farenheit", celcius, farenheit);
}
![Page 17: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/17.jpg)
17Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Τελεστές και εκφράσεις (i)
Αριθμητικοί τελεστές+ - * / %
Σχεσιακοί τελεστές== != < > <= >=
Λογικοί τελεστές&& λογική σύζευξη (και)
|| λογική διάζευξη (ή)
! λογική άρνηση (όχι)
π.χ. (x % 3 != 0) && !finished
![Page 18: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/18.jpg)
18Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Τελεστές και εκφράσεις (ii)
Τελεστές bit προς bit (bitwise)& σύζευξη bit (AND)
| διάζευξη bit (OR)
^ αποκλειστική διάζευξη bit (XOR)
~ άρνηση (NOT)
<< ολίσθηση bit αριστερά
>> ολίσθηση bit δεξιά
Παράδειγμα(0x0101 & 0xfff0) << 2
0x0400
![Page 19: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/19.jpg)
19Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Τελεστές και εκφράσεις (iii)
Τελεστής συνθήκης(a >= b) ? a : b
Τελεστής παράθεσηςa-1, b+5
Τελεστές ανάθεσηςa = b+1
a += x ισοδύναμο με a = a + x
Τελεστές αύξησης και μείωσηςa++ a-- τιμή πριν τη μεταβολή
++a --a τιμή μετά τη μεταβολή
![Page 20: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/20.jpg)
20Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Eντολές και έλεγχος ροής (i)
Κενή εντολή;
Εντολή έκφρασηςa = b+5;
a++;
Εντολή ifif (a >= b)
max = a;
else
max = b;
![Page 21: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/21.jpg)
21Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Eντολές και έλεγχος ροής (ii)
Σύνθετη εντολή
if (a >= b) {min = b;max = a;
}else {max = b;min = a;
}
Ορίζει νέα εμβέλεια
if (x < y) {
int temp = x;
x = y;y = temp;
}
![Page 22: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/22.jpg)
22Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Eντολές και έλεγχος ροής (iii)
Εντολή whileint i = 1, s = 0;
while (i <= 10) {
s += i;
i++;
}
συνθήκη
εντολή
αληθής
ψευδής
while (συνθήκη) εντολή
![Page 23: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/23.jpg)
23Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Eντολές και έλεγχος ροής (iv)
Εντολή do-whileint i = 1, s = 0;
do
s += i++;
while (i <= 10);
συνθήκη
εντολή
ψευδήςαληθής
do εντολήwhile (συνθήκη);
![Page 24: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/24.jpg)
24Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Eντολές και έλεγχος ροής (v)
Εντολή forint i, s;
for (i=1, s=0; i <= 10; i++)
s += i;
for (αρχικοποίηση ;συνθήκη ;βήμα)
εντολήσυνθήκη
εντολή
αληθής
ψευδής
βήμα
αρχικοποίηση
![Page 25: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/25.jpg)
25Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Εντολή breakint s;
for (i=0, s=0; i < 10; i++) {
int x;
scanf("%d", &x);
s += x;
}
printf("Sum is: %d\n", s);
Eντολές και έλεγχος ροής (vi)
if (x < 0)
break;
![Page 26: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/26.jpg)
26Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Eντολές και έλεγχος ροής (vii)
Εντολή continueint s;
for (i=0, s=0; i < 10; i++) {
int x;
scanf("%d", &x);
s += x;
}
printf("Sum is: %d\n", s);
if (x < 0)
continue;
![Page 27: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/27.jpg)
27Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Eντολές και έλεγχος ροής (viii)
Εντολή switch
switch (ch) { case 'a': printf("alpha\n"); break; case 'b': case 'c': printf("beta or c\n"); break; default: printf("other\n");}
![Page 28: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/28.jpg)
28Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Eντολές και έλεγχος ροής (ix)
Ετικέτες και εντολή goto
int i = 1, s = 0;
loop:
s += i++;
if (i < 10)
goto loop;
printf("The sum is %d\n", s);
Όχι goto: δομημένος προγραμματισμός!
![Page 29: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/29.jpg)
29Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δομή του προγράμματος
Το πρόγραμμα αποτελείται από: συναρτήσεις καθολικές μεταβλητές
Διαφορές από την Pascal: κύριο πρόγραμμα, διαδικασίες και συναρτήσεις
δε διαφοροποιούνται το κύριο πρόγραμμα ονομάζεται main οι διαδικασίες έχουν αποτέλεσμα void όλες οι συναρτήσεις στο ίδιο επίπεδο δεν επιτρέπονται φωλιασμένες συναρτήσεις μόνο πέρασμα κατά τιμή (call by value)
![Page 30: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/30.jpg)
30Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Παράδειγμα
int f (int x, int y){ return x * y;}
int a;
void p (int x){ a = f(x, x+1);}
void main (){ p(6);}
![Page 31: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/31.jpg)
31Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Πίνακες (arrays) (i)
Ακολουθία μεταβλητών με το ίδιο όνομα, με τον ίδιο τύπο δεδομένων, σε συνεχόμενες θέσεις μνήμης.
Παράδειγμαint a[50];
double d1[5], d2[10];
Η αρίθμηση αρχίζει από το 0 !for (i = 0; i < 50; i++)
a[i] = i;
![Page 32: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/32.jpg)
32Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Πίνακες (arrays) (ii)
Αρχικοποίηση πινάκωνint a[3] = {6, 7, 42};
char c[] = {'a', 'b', 'c', 'd', 'e'};
Συμβολοσειρές Είναι πίνακες χαρακτήρωνchar s[6] = "abcde";
Τερματίζονται με τον κενό χαρακτήρα '\0'char s[6] = {'a', 'b', 'c',
'd', 'e', '\0'};
![Page 33: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/33.jpg)
33Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Πίνακες (arrays) (iii)
Παράδειγμαint a[3] = {5, 6, 7};int b[3] = {2, 3, 1};int i;
for (i = 0; i < 3; i++) printf("%d times %d is %d\n", a[i], b[i], a[i]*b[i]);
5 times 2 is 106 times 3 is 187 times 1 is 7
5 times 2 is 106 times 3 is 187 times 1 is 7
![Page 34: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/34.jpg)
34Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Πολυδιάστατοι πίνακες (i)
Παράδειγμαint a[3][5];
char c[5][10][4];
Αρχικοποίησηint i[3][3] = { {1, 0, 0},
{0, 1, 0},
{0, 0, 1} };
char s[][10] = {
"my", "name", "is", "joe"
};
![Page 35: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/35.jpg)
35Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Πολυδιάστατοι πίνακες (ii)
Παράδειγμα: πολλαπλασιασμός πινάκων
double a[3][4] = ... , b[4][5] = ... , c[3][5];int i, j, k;
for (i=0; i<3; i++) for (j=0; j<5; j++) { c[i][j] = 0.0; for (k=0; k<4; k++) c[i][j] += a[i][k] * b[k][j]; }
![Page 36: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/36.jpg)
36Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Εισαγωγή στις δομές δεδομένων (i)
ΑλγόριθμοςΠεπερασμένο σύνολο εντολών που,όταν εκτελεστούν,επιτυγχάνουν κάποιο επιθυμητό αποτέλεσμα
Δεδομένα εισόδου και εξόδου Κάθε εντολή πρέπει να είναι:
• καλά ορισμένη• απλή
Η εκτέλεση πρέπει να σταματά
![Page 37: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/37.jpg)
37Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Εισαγωγή στις δομές δεδομένων (ii)
ΠολυπλοκότηταΜέτρο εκτίμησης της απόδοσης αλγορίθμωνως συνάρτηση του μεγέθουςτου προβλήματος που επιλύουν
Χρόνος εκτέλεσης Χωρητικότητα μνήμης που απαιτείται
Ακριβής μέτρηση πολυπλοκότηταςt = f(n)
Τάξη μεγέθους, συμβολισμοί Ο, Ω, Θt = O(f(n))
![Page 38: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/38.jpg)
38Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Εισαγωγή στις δομές δεδομένων (iii)
Ορισμός των κλάσεων Ο, Ω, Θ Άνω όριο
g = O(f)Ϋ� c. n0. n > n0. g(n) < c f(n) Κάτω όριο
g = Ω(f)Ϋ� c. n0. n > n0. g(n) > c f(n) Τάξη μεγέθους
g = Θ(f)Ϋ� c1, c2. n0. n > n0.c1 f(n) < g(n) < c2 f(n)
Διάταξη μερικών κλάσεων πολυπλοκότηταςO(1) < O(logn) < O(n) < O(n) < O(nlogn)
< O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
![Page 39: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/39.jpg)
39Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Εισαγωγή στις δομές δεδομένων (iv)
Αφαίρεση δεδομένων (data abstraction) Διαχωρισμός ιδιοτήτων και υλοποίησης Ιδιότητες ενός τύπου δεδομένων:
ο τρόπος με τον οποίο δημιουργεί κανείς και χρησιμοποιεί δεδομένα αυτού του τύπου
Υλοποίηση ενός τύπου δεδομένων:ο τρόπος με τον οποίο αναπαρίστανται τα δεδομένα στη μνήμη του υπολογιστή και προγραμματίζονται οι διαθέσιμες πράξεις
![Page 40: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/40.jpg)
40Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Εισαγωγή στις δομές δεδομένων (v)
Οι λεπτομέρειες υλοποίησης επηρεάζουντην πολυπλοκότητα των αλγορίθμων
Είναι συχνή επομένως η αλλαγή τρόπου υλοποίησης κάποιου τύπου δεδομένων
Η αφαίρεση δεδομένων ελαχιστοποιεί τις αλλαγές που απαιτούνται στο πρόγραμμα που χρησιμοποιεί έναν τύπο δεδομένων, όταν αλλάξει ο τρόπος υλοποίησης
![Page 41: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/41.jpg)
41Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Αφηρημένοι τύποι δεδομένων
Αφηρημένος τύπος δεδομένων – ΑΤΔ(abstract data type) καθορίζει τις ιδιότητες του τύπου δεδομένων δεν καθορίζει την υλοποίησή του
Αλγεβρικός ορισμός ΑΤΔ σύνταξη: όνομα του τύπου και επικεφαλίδες
των πράξεων σημασιολογία: κανόνες που περιγράφουν τη
λειτουργία των πράξεων
![Page 42: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/42.jpg)
42Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Παράδειγμα ΑΤΔ: Σύνολα (i)
Σύνταξη Όνομα τύπου: set (σύνολα ακεραίων) Επικεφαλίδες πράξεων:const set empty;
set add (int x, set s);
boolean member (int x, set s);
set union (set s1, set s2);
boolean subset (set s1, set s2);
boolean equal (set s1, set s2);
Σημείωση: θεωρούμε ότι έχει οριστεί κατάλληλα ο τύπος boolean.
![Page 43: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/43.jpg)
43Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Παράδειγμα ΑΤΔ: Σύνολα (ii)
Σημασιολογία Αξιωματικός ορισμός 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))
![Page 44: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/44.jpg)
44Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Παράδειγμα ΑΤΔ: Σύνολα (iii)
Σημασιολογία Αξιωματικός ορισμός 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))
![Page 45: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/45.jpg)
45Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Συγκεκριμένοι τύποι δεδομένων
Συγκεκριμένος τύπος δεδομένων – ΣΤΔ(concrete data type) καθορίζει τις ιδιότητες του τύπου δεδομένων καθορίζει επακριβώς την υλοποίησή του
Κάθε γλώσσα προγραμματισμού υποστηρίζει ορισμένους ΣΤΔ, π.χ. απλοί τύποι: ακέραιοι αριθμοί, πραγματικοί
αριθμοί, χαρακτήρες, λογικές τιμές σύνθετοι τύποι: πίνακες (arrays), εγγραφές
(records), δείκτες (pointers), σύνολα (sets)
![Page 46: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/46.jpg)
46Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Σχέση ΑΤΔ και ΣΤΔ (i)
ΑΤΔ set: σύνολα ακεραίων s = { 1, 3, 7, 9 }
Υλοποίηση 1: πίνακας από boolean
falsetrue falsetrue true truefalse false false false 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]
1 0 1 0 0 0 1 0 1 0 0 0 0 0 0
Στατικός τρόπος υλοποίησης ΣΤΔ
![Page 47: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/47.jpg)
47Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Σχέση ΑΤΔ και ΣΤΔ (ii)
Υλοποίηση 3: απλά συνδεδεμένη λίστα
Δυναμικός τρόπος υλοποίησης ΣΤΔ
Υλοποίηση 4: συμβολοσειρά που περιέχει το μαθηματικό ορισμό του συνόλου
"{x | x=1 \/ x=3 \/ x=7 \/ x=9}"
"{x | 1<=x<=10 /\ x%2=1 /\ x<>5}" Δύσκολη η υλοποίηση των πράξεων Απειροσύνολα: "{x | x > 100}"
1 3 7 9
![Page 48: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/48.jpg)
48Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Πίνακες ως ΑΤΔ (i)
Βασική πράξη: προσπέλαση στοιχείουa[i]
Συνήθως υλοποιούνται με κάποιο ΣΤΔ πινάκων (arrays) Κόστος προσπέλασης: O(1)
Ο ΣΤΔ του μονοδιάστατου πίνακα επαρκεί για την υλοποίηση κάθε ΑΤΔ πίνακα Συνάρτηση loc υπολογίζει τη θέση ενός
στοιχείου του ΑΤΔ πίνακα στο μονοδιάστατο ΣΤΔ πίνακα της υλοποίησης
![Page 49: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/49.jpg)
49Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Πίνακες ως ΑΤΔ (ii)
ΑΤΔ πίνακα δύο διαστάσεων n m
loc (n, m, i, j) = m (i – 1) + j – 1
Αρίθμηση κατά στήλεςloc (n, m, i, j) = n (j – 1) + i – 1
0 1 2 3 4 5
6 7 8 9 10 11
12 13 14 15 16 17
i = 1
i = 2
i = 3
j = 1 2 4 5 63
n = 3
m = 6
![Page 50: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/50.jpg)
50Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Πίνακες ως ΑΤΔ (iii)
ΑΤΔ κάτω τριγωνικού πίνακα n n
loc (n, i, j) = i (i – 1) / 2 + j – 1
Ομοίως για συμμετρικούς πίνακες
0
1 2
3 4 5
i = 1
i = 2
i = 3
j = 1 2 4 53
n = 5
6 7 8 9
10 11 12 13 14
i = 4
i = 5
![Page 51: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/51.jpg)
51Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Πίνακες ως ΑΤΔ (iv)
ΑΤΔ τριδιαγώνιου πίνακα n n
loc (n, i, j) = 2 i + j – 3
0 1
2 3 4
5 6 7
i = 1
i = 2
i = 3
j = 1 2 4 53
n = 5
8 9 10
11 12
i = 4
i = 5
![Page 52: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/52.jpg)
52Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Πίνακες ως ΑΤΔ (v)
ΑΤΔ αραιού πίνακα n m
Υλοποίηση με δυαδικό πίνακα Υλοποίηση με τρεις πίνακες
row = [ 1, 2, 3, 3, 4 ] col = [ 1, 3, 2, 3, 5 ]val = [ a1, a2, a3, a4, a5 ]
a1
a2
a3 a4
i = 1
i = 2
i = 3
j = 1 2 4 53
n = 4
a5i = 4
m = 5
![Page 53: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/53.jpg)
53Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Αναζήτηση σε πίνακες (i)
Σειριακή αναζήτηση Τα στοιχεία διατρέχονται κατά σειρά Κόστος: O(n)
12 9 72 22 42 99 14 61n = 8x = 42
(1) (3)(2) (4) (5)
Βελτίωση: στοιχείο “φρουρός” (sentinel)
12 9 72 22 42 99 14 61n = 8x = 77
![Page 54: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/54.jpg)
54Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Αναζήτηση σε πίνακες (ii)
Υλοποίηση σε C
int ssearch (int a[], int n, int x){ int i;
for (i = 0; i < n; i++) if (a[i] == x) return i; return -1;}
![Page 55: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/55.jpg)
55Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Αναζήτηση σε πίνακες (iii)
Υλοποίηση σε C με φρουρό
int ssearch_s (int a[], int n, int x){ int i;
a[n] = x; for (i = 0; a[i] != x; i++); return (i < n) ? i : -1;}
![Page 56: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/56.jpg)
56Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Αναζήτηση σε πίνακες (iv)
Δυαδική αναζήτηση Ο πίνακας πρέπει να είναι ταξινομημένος Κόστος: O(logn)
3 7 14 22 42 61 72 99n = 8x = 42
(1) (3) (2)
Άλλες μέθοδοι αναζήτησης Μικρότερο κόστος περισσότερος χώρος Πίνακες κατακερματισμού (hash tables)
![Page 57: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/57.jpg)
57Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινόμηση πινάκων (i)
Ταξινόμηση επιλογής (selection sort) Ιδέα:
για κάθε i κατ’ αύξουσα σειρά
βρες το μικρότερο των στοιχείων μετά το a[i]
αντιμετάθεσέ το με το a[i] Κόστος: Ο(n2) Βελτίωση: στοιχείο φρουρός
![Page 58: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/58.jpg)
58Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινόμηση πινάκων (ii)
Ταξινόμηση επιλογής, υλοποίηση σε Cvoid ssort (int a[], int n){ int i, j;
for (i = 0; i < n-1; i++) { int min = a[i], minj = i;
for (j = i+1; j < n; j++) if (a[j] < min) min = a[minj = j];
a[minj] = a[i]; a[i] = min; }}
![Page 59: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/59.jpg)
59Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινόμηση πινάκων (iii)
Ταξινόμηση εισαγωγής (insertion sort) Χρησιμοποιούμε αυτό τον τρόπο όταν
ταξινομούμε τα χαρτιά μιας τράπουλας Ιδέα:
για κάθε i από το δεύτερο και κατ’ αύξουσα σειρά
τοποθέτησε το a[i] στη σωστή του θέσημεταξύ των στοιχείων που είναι πριν από αυτό
Κόστος: Ο(n2) Βελτιώσεις:
• στοιχείο φρουρός• δυαδική εισαγωγή
![Page 60: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/60.jpg)
60Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινόμηση πινάκων (iv)
Ταξινόμηση εισαγωγής, υλοποίηση σε Cvoid isort (int a[], int n){ int i, j;
for (i = 1; i < n; i++) { int x = a[i];
for (j = i-1; j >= 0; j--) if (x < a[j]) a[j+1] = a[j]; else break;
a[j+1] = x; }}
![Page 61: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/61.jpg)
61Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινόμηση πινάκων (v)
Ταξινόμηση φυσαλίδας (bubble sort) Ιδέα:
για κάθε i κατ’ αύξουσα σειρά
για κάθε j > i κατά φθίνουσα σειρά
αν a[j-1] > a[j] αντιμετάθεσε τα a[j-1] και a[j]
Κόστος: Ο(n2) Βελτιώσεις:
• σταματά αν σε ένα πέρασμα δεν γίνει αντιμετάθεση• σε ποιο σημείο έγινε η τελευταία αντιμετάθεση• αλλαγή κατεύθυνσης μεταξύ διαδοχικών περασμάτων
(shake sort)
![Page 62: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/62.jpg)
62Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινόμηση πινάκων (vi)
Ταξινόμηση φυσαλίδας, υλοποίηση σε C
void bsort (int a[], int n){ int i, j;
for (i = 0; i < n; i++) for (j = n-1; j > i; j--) if (a[j-1] > a[j]) { int temp = a[j-1];
a[j-1] = a[j]; a[j] = temp; }}
![Page 63: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/63.jpg)
63Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινόμηση πινάκων (vii)
Ταξινόμηση με διαμέριση (quick sort) Ιδέα:
διάλεξε ένα τυχαίο στοιχείο x του πίνακα
διαμέρισε τον πίνακα, μεταφέροντας:
– τα στοιχεία μικρότερα του x στην αρχή
– τα στοιχεία μεγαλύτερα του x στο τέλος
αναδρομικά, ταξινόμησε τα δύο μέρη Κόστος: Ο(n2) στη χειρότερη περίπτωση
Ο(n logn) κατά μέσο όρο
![Page 64: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/64.jpg)
64Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινόμηση πινάκων (viii)
Quick sort, υλοποίηση σε Cvoid qsort (int a[], int n){ qsort_auxil(a, 0, n-1);}
void qsort_auxil (int a[], int lower, int upper){ if (lower < upper) { int x = a[(lower + upper) / 2]; int i, j;
for (i = lower, j = upper; i <= j; i++, j--) { while (a[i] < x) i++; while (a[j] > x) j--;
![Page 65: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/65.jpg)
65Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινόμηση πινάκων (ix)
Quick sort, υλοποίηση σε C(συνέχεια) if (i <= j) { int temp = a[i];
a[i] = a[j]; a[j] = temp; } } qsort_auxil(a, lower, j); qsort_auxil(a, i, upper); }}
![Page 66: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/66.jpg)
66Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινόμηση πινάκων (x)
Άλλοι τρόποι ταξινόμησης Ταξινόμηση του Shell (shell sort),
κόστος: Ο(n2) Ταξινόμηση σε σωρό (heap sort),
κόστος: Ο(n logn) Ταξινόμηση με συγχώνευση (merge sort),
κόστος: Ο(n logn)
![Page 67: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/67.jpg)
67Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ορισμοί τύπων
Συνώνυμα απλών τύπωνtypedef double real;
real x, y;
Συνώνυμα σύνθετων τύπωνtypedef double vector [10];
vector v;
for (i = 0; i < 10; i++)
v[i] = i;
![Page 68: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/68.jpg)
68Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Απαριθμήσεις (enumerations)
Ο τύπος enumenum color_tag {
GREEN, RED, BLUE, WHITE, BLACK
};
enum color_tag c;
c = GREEN;
typedef enum {
GREEN, RED, BLUE, WHITE, BLACK
} color;
color c = WHITE;
![Page 69: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/69.jpg)
69Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δομές (structures) (i)
Ο τύπος structstruct complex_tag {
double re, im;
};
struct complex_tag z;
z.re = 1.0;
z.im = -1.0;
typedef struct complex_tag complex;
complex z;
complex zs [100];
re
im
z
![Page 70: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/70.jpg)
70Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δομές (structures) (ii)
Παράδειγμα
complex complement (complex z){ complex result;
result.re = z.re; result.im = -z.im return result;}
![Page 71: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/71.jpg)
71Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δομές (structures) (iii)
Παράδειγμαtypedef struct {
char firstName [30];
char lastName [50];
char phone [10];
int age;
double salary;
} record;
record r [1000];
r[423].age = 32;
![Page 72: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/72.jpg)
72Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ενώσεις (unions)
Ο τύπος unionunion number_tag {
int i;
double d;
};
union number_tag n;
d
in
n.d = 1.2;
printf("%lf\n", n.d);
n.i = 42;
printf("%d\n", n.i);
printf("%lf\n", n.d); /* wrong! */
![Page 73: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/73.jpg)
73Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δείκτες (pointers) (i)
Μεταβλητές που δεν περιέχουν μια τιμή κάποιου απλού
τύπου δεδομένων αλλά τη διεύθυνση μιας άλλης μεταβλητής
Παράδειγμαint x, *p;
x
δ124
p
δ247
42
δ124
![Page 74: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/74.jpg)
74Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δείκτες (pointers) (ii)
Δεικτοδότηση: & η διεύθυνση μιας μεταβλητήςp = &x;
Αποδεικτοδότηση: * το περιεχόμενο μιας διεύθυνσηςprintf("%d", *p);*p = 7;
x
δ124
p
δ247
42
δ124
![Page 75: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/75.jpg)
75Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Πίνακες και δείκτες(i)
Αριθμητική δεικτώνint a[3] = {7, 6, 42};int *p;
p
δ247
a
δ124 7
δ125 6
δ126 42
δ124
p = &(a[0]);p = &a;p = a;
printf("%d\n", *p);printf("%d\n", *(p+1));p = p+2;printf("%d\n", *p);
![Page 76: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/76.jpg)
76Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Πίνακες και δείκτες(ii)
Ισοδυναμία πινάκων και δεικτών Ένας πίνακας είναι ένας δείκτης στο πρώτο
στοιχείο. a[i] ισοδύναμο με *(a+i) Οι πίνακες όμως είναι σταθεροί δείκτες,
δηλαδή δεν μπορούν να αλλάξουν τιμή
int a[3] = {7, 6, 42};
int *p = &a;
p++; /* correct */
a++; /* wrong! */
![Page 77: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/77.jpg)
77Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Πίνακες και δείκτες(iii)
Παράδειγμα: αντιγραφή πινάκων
int a[10], b[10];
int *p = a, *q = b, i;
/* assume b initialized */
for (i=0; i<10; i++)
*p++ = *q++;
![Page 78: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/78.jpg)
78Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Πίνακες και δείκτες(iv)
Παράδειγμα: εκτύπωση συμβολοσειράς
void putchar (char c);
char s[] = "Hello world!\n";
char *p;
for (p = s; *p != '\0'; p++)
putchar(*p);
![Page 79: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/79.jpg)
79Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Κενός δείκτης και δείκτης σε κενό
Ο κενός δείκτης: NULL Απαγορεύεται να αποδεικτοδοτηθεί!int *p = NULL;
*p = 42; /* wrong! */ Ο μόνος δείκτης που αντιστοιχεί στην ψευδή
λογική τιμή, όταν χρησιμοποιείται σε συνθήκη
Ο δείκτης σε κενό: void * Γενική μορφή δείκτη Απαγορεύεται να αποδεικτοδοτηθεί! Απαγορεύεται η αριθμητική δεικτών!
![Page 80: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/80.jpg)
80Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δείκτες αντί περάσματος με αναφορά
Κώδικας Pascalprocedure inc (var x : integer);begin x := x+1end;
... inc(a) ...
Ισοδύναμος κώδικας Cvoid inc (int * px){ (*px)++;}
... inc(&a) ...
![Page 81: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/81.jpg)
81Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δείκτες σε εγγραφές
Συντομογραφίαp->x είναι ισοδύναμο με (*p).x
Παράδειγμαstruct { int x, y;} coordinates, *p;
coordinates.x = 1;coordinates.y = 3;
p = &coordinates;
printf("%d\n", p->x);printf("%d\n", p->y);
![Page 82: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/82.jpg)
82Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Μετατροπές τύπων (i)
Έμμεσες (coercions)double d = 3; (με ανάθεση)int x = 3.14;
int f (int x); (με πέρασμα παραμέτρου)f(3.14);
Άμεσες (type casting)( τύπος ) έκφραση(double) 3(int) 3.14(int *) NULL
![Page 83: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/83.jpg)
83Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Μετατροπές τύπων (ii)
Πρόβλημα: πώς μπορώ να τυπώσω το αποτέλεσμα της πραγματικής διαίρεσης δυο ακεραίων αριθμών, χωρίς νέες μεταβλητές;
int x = 5, y = 3;
Λάθος λύση #1: printf("%d", x/y); Λάθος λύση #2: printf("%lf", x/y); Σωστές λύσεις:
printf("%lf", 1.0 * x / y);printf("%lf", (double) x / (double) y);printf("%lf", (double) x / y);
![Page 84: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/84.jpg)
84Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δυναμική παραχώρηση μνήμης (i)
Συναρτήσεις βιβλιοθήκης <stdlib.h> void * malloc (size_t n);
Δυναμική παραχώρηση μνήμης μήκους n bytes.Το αποτέλεσμα πρέπει να μετατραπεί στο σωστό τύπο.Επιστρέφεται NULL αν εξαντληθεί η μνήμη.
void free (void * p);
Αποδέσμευση της μνήμης στην οποία δείχνει το p.Το p πρέπει να έχει δημιουργηθεί με προηγούμενη κλήση στη malloc.
Πόσα bytes χρειάζονται; sizeof(type) π.χ. sizeof(int) sizeof(variable) π.χ. sizeof(x)
![Page 85: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/85.jpg)
85Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δυναμική παραχώρηση μνήμης (ii)
Παράδειγμαint *p;int i;
p = (int *) malloc(sizeof(int));*p = 42;free(p);
p = (int *) malloc(10 * sizeof(int));for (i = 0; i < 10; i++) p[i] = 42;free(p); Το αποτέλεσμα της malloc πρέπει
να ελεγχθεί ότι δεν είναι NULL!
![Page 86: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/86.jpg)
86Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δυναμικοί ΣΤΔ (i)
Χρησιμοποιούνται για την υλοποίηση ΑΤΔ Παραδείγματα
συνδεδεμένες λίστες δέντρα γράφοι
Πώς υλοποιούνται στη C; με κατάλληλο συνδυασμό δομών (struct)
και δεικτών (pointers), και με δυναμική παραχώρηση μνήμης
![Page 87: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/87.jpg)
87Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δυναμικοί ΣΤΔ (ii)
Πλεονεκτήματα έναντι στατικών ΣΤΔ Δεν επιβάλλουν περιορισμούς στο μέγιστο
πλήθος των δεδομένων Η μνήμη που χρησιμοποιείται είναι ανάλογη
του πραγματικού πλήθους των δεδομένων Κάποιες πράξεις υλοποιούνται αποδοτικότερα
Μειονεκτήματα έναντι στατικών ΣΤΔ Για σταθερό και γνωστό πλήθος δεδομένων,
χρησιμοποιούν συνήθως περισσότερη μνήμη Κάποιες πράξεις υλοποιούνται λιγότερο
αποδοτικά
![Page 88: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/88.jpg)
88Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δυναμικοί ΣΤΔ (iii)
Ιδέα Κατασκευάζεται ένα σύνολο κόμβων Κάθε κόμβος περιέχει πληροφορίες και
συνδέσμους προς άλλους κόμβους
Π Σ
![Page 89: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/89.jpg)
89Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Απλά συνδεδεμένες λίστες (i)
Είναι γραμμικές διατάξεις Κάθε κόμβος περιέχει ένα σύνδεσμο στον
επόμενο κόμβο Ο τελευταίος κόμβος έχει κενό σύνδεσμο
![Page 90: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/90.jpg)
90Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Απλά συνδεδεμένες λίστες (ii)
Παράδειγμα: λίστα ακεραίων
struct node_tag { int data; struct node_tag * next;};
typedef struct node_tag Node, * LinkedList;
Κενή λίστα
![Page 91: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/91.jpg)
91Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Απλά συνδεδεμένες λίστες (iii)
Προσθήκη στοιχείων απόφαση πού
θα προστεθεί δημιουργία
νέου κόμβου αντιγραφή
πληροφορίας σύνδεση
νέου κόμβου
ii
εδώ
![Page 92: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/92.jpg)
92Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Απλά συνδεδεμένες λίστες (iv)
Αφαίρεση στοιχείων απόφαση ποιο
στοιχείοθα αφαιρεθεί
καταστροφήκόμβου
σύνδεσηυπόλοιπωνκόμβων
αυτό
![Page 93: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/93.jpg)
93Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ουρές (i)
First In First Out (FIFO)ό,τι μπαίνει πρώτο, βγαίνει πρώτο
Ουρά ακεραίων ΑΤΔ: queue const queue queueEmpty; void queueInsert (queue * qp, int t); int queueRemove (queue * qp); int queueHead (queue q);
![Page 94: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/94.jpg)
94Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ουρές (ii)
Υλοποίηση με απλά συνδεδεμένη λίστα
first last
![Page 95: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/95.jpg)
95Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Υλοποίηση ουράς σε C (i)
Υλοποίηση με απλά συνδεδεμένη λίσταtypedef struct list_tag { int data; struct list_tag * next;} ListNode;
Τύπος queuetypedef struct { ListNode * first; ListNode * last;} queue;
![Page 96: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/96.jpg)
96Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Υλοποίηση ουράς σε C (ii)
Άδεια ουράconst queue queueEmpty = { NULL, NULL };
Εισαγωγή στοιχείουvoid queueInsert (queue * qp, int t){ ListNode * n = (ListNode *) malloc(sizeof(ListNode));
if (n == NULL) { printf("Out of memory\n"); exit(1); }
![Page 97: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/97.jpg)
97Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Υλοποίηση ουράς σε C (iii)
Εισαγωγή στοιχείου (συνέχεια)
n->data = t; n->next = NULL;
if (qp->last == NULL) qp->first = qp->last = n; else { qp->last->next = n; qp->last = n; }}
![Page 98: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/98.jpg)
98Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Υλοποίηση ουράς (iv)
Αφαίρεση στοιχείουint queueRemove (queue * qp){ ListNode * n; int result;
if (qp->first == NULL) { printf("Nothing to remove" " from an empty queue\n"); exit(1); }
![Page 99: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/99.jpg)
99Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Υλοποίηση ουράς (v)
Αφαίρεση στοιχείου (συνέχεια) n = qp->first; result = qp->first->data; qp->first = qp->first->next; free(n);
if (qp->first == NULL) qp->last = NULL;
return result;}
![Page 100: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/100.jpg)
100Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Υλοποίηση ουράς (vi)
Εξέταση στοιχείουint queueHead (queue q){ if (q.first == NULL) { fprintf(stderr, "Nothing to see" " in an empty queue\n");
exit(1); }
return q.first->data;}
![Page 101: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/101.jpg)
101Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Στοίβες (i)
Last In First Out (LIFO)ό,τι μπαίνει τελευταίο, βγαίνει πρώτο
Στοίβα ακεραίων ΑΤΔ: stack const stack stackEmpty; void stackPush (stack * sp, int t); int stackPop (stack * sp); int stackTop (stack s);
![Page 102: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/102.jpg)
102Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Στοίβες (ii)
Υλοποίηση με απλά συνδεδεμένη λίστα
top
![Page 103: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/103.jpg)
103Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Υλοποίηση στοίβας σε C (i)
Τύπος stacktypedef ListNode * stack;
Άδεια στοίβαconst stack stackEmpty = NULL;
Εισαγωγή στοιχείουvoid stackPush (stack * sp, int t){ ListNode * n = (ListNode *) malloc(sizeof(ListNode));
if (n == NULL) { printf("Out of memory\n"); exit(1); }
![Page 104: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/104.jpg)
104Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Υλοποίηση στοίβας σε C (ii)
Εισαγωγή στοιχείου (συνέχεια) n->data = t; n->next = *sp; *sp = n;}
Αφαίρεση στοιχείουint stackPop (stack * sp){ ListNode * n; int result;
if (*sp == NULL) { printf("Nothing to remove" " from an empty stack\n"); exit(1); }
![Page 105: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/105.jpg)
105Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Υλοποίηση στοίβας σε C (iii)
Αφαίρεση στοιχείου (συνέχεια) n = *sp; result = (*sp)->data; *sp = (*sp)->next; free(n); return result;}
![Page 106: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/106.jpg)
106Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Υλοποίηση στοίβας σε C (iv)
Εξέταση στοιχείουint stackTop (stack s){ if (s == NULL) { printf("Nothing to see" " in an empty stack\n"); exit(1); }
return s->data;}
![Page 107: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/107.jpg)
107Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Διπλά συνδεδεμένες λίστες (i)
first last
Επίσης γραμμικές διατάξεις Δυο σύνδεσμοι σε κάθε κόμβο, προς τον
επόμενο και προς τον προηγούμενο Γενική μορφή, π.χ. για υλοποίηση ουράς:
![Page 108: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/108.jpg)
108Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Διπλά συνδεδεμένες λίστες (ii)
Τύπος κόμβου DListNodetypedef struct DListNode_tag { int data; struct DListNode_tag * next; struct DListNode_tag * prev;} DListNode;
Τύπος dlisttypedef struct { DListNode * first; DListNode * last;} dlist;
Άδεια λίσταconst dlist dlistEmpty = { NULL, NULL };
![Page 109: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/109.jpg)
109Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Διπλά συνδεδεμένες λίστες (iii)
Εισαγωγή στοιχείου στην αρχήvoid dlistInsert (dlist * lp, int t){ DListNode * n = (DListNode *) malloc(sizeof(DListNode));
if (n == NULL) { fprintf(stderr, "Out of memory\n"); exit(1); }
n->data = t;
![Page 110: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/110.jpg)
110Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Διπλά συνδεδεμένες λίστες (iv)
Εισαγωγή στοιχείου στην αρχή (συνέχεια) if (lp->first == NULL) { n->prev = n->next = NULL; lp->first = lp->last = n; } else { n->prev = NULL; n->next = lp->first; lp->first->prev = n; lp->first = n; }}
![Page 111: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/111.jpg)
111Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Κυκλικές λίστες (i)
Τύπος clisttypedef struct { ListNode * first; ListNode * last;} clist;
Άδεια λίσταconst clist clistEmpty = { NULL, NULL };
first last
![Page 112: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/112.jpg)
112Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Κυκλικές λίστες (ii)
Εισαγωγή στοιχείουvoid clistInsert (clist * lp, int t){ ListNode * n = (ListNode *) malloc(sizeof(ListNode));
if (n == NULL) { fprintf(stderr, "Out of memory\n"); exit(1); }
n->data = t;
![Page 113: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/113.jpg)
113Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Κυκλικές λίστες (iii)
Εισαγωγή στοιχείου (συνέχεια) if (lp->first == NULL) { lp->first = lp->last = n; n->next = n; } else { n->next = lp->first; lp->last->next = n; lp->last = n; }}
![Page 114: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/114.jpg)
114Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Κυκλικές λίστες (iv)
Αφαίρεση στοιχείουint clistRemove (clist * lp){ int result;
if (lp->first == NULL) { fprintf(stderr, "Nothing to remove" " from empty list\n");
exit(1); }
result = lp->first->data;
![Page 115: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/115.jpg)
115Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Κυκλικές λίστες (v)
Αφαίρεση στοιχείου (συνέχεια) if (lp->first == lp->last) { free(lp->first); lp->first = lp->last = NULL; } else { lp->first = lp->first->next; free(lp->last->next); lp->last->next = lp->first; }
return result;}
![Page 116: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/116.jpg)
116Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Κυκλικές λίστες (vi)
Εκτύπωση στοιχείωνvoid clistPrint (clist l){ ListNode * n;
for (n = l.first; n != NULL; n = n->next) {
printf("%d\n", n->data); if (n->next == l.first) break; }}
![Page 117: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/117.jpg)
117Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινομημένες λίστες (i)
Τύπος slisttypedef ListNode * slist;
Άδεια λίσταconst slist slistEmpty = NULL;
Εισαγωγή στοιχείουvoid slistInsert (slist * lp, int t){ ListNode * n = (ListNode *) malloc(sizeof(ListNode));
if (n == NULL) { printf("Out of memory\n"); exit(1); }
![Page 118: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/118.jpg)
118Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινομημένες λίστες (ii)
Εισαγωγή στοιχείου (συνέχεια) n->data = t;
while (*lp != NULL && (*lp)->data < t) lp = &((*lp)->next);
n->next = *lp; *lp = n;}
![Page 119: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/119.jpg)
119Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινομημένες λίστες (iii)
Αφαίρεση στοιχείουvoid slistRemove (slist * lp, int t){ ListNode * n;
while (*lp != NULL && (*lp)->data < t) lp = &((*lp)->next);
if (*lp == NULL) { printf(”%d was not found\n”, t); exit(1); }
n = *lp; *lp = (*lp)->next; free(n);}
![Page 120: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/120.jpg)
120Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Παράμετροι του προγράμματος (i)
Επικεφαλίδα του προγράμματοςint main (int argc, char * argv[]);
Παράμετροι argc ο αριθμός των παραμέτρων argv[i] η i-οστή παράμετρος argv[0] το όνομα του προγράμματος
Αποτέλεσμα ακέραιος αριθμός που επιστρέφεται στο
λειτουργικό σύστημα συνήθως 0 για επιτυχή τερματισμό
![Page 121: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/121.jpg)
121Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Παράμετροι του προγράμματος (ii)
Παράδειγμα
int main (int argc, char * argv[]){ int i;
printf("Program %s called with " "%d parameters:\n", argv[0], argc-1); for (i = 1; i < argc; i++) printf(" %s", argv[i]); printf("\nand will return 0\n");
return 0;}
![Page 122: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/122.jpg)
122Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Συναρτήσεις εισόδου-εξόδου (i)
Βασικές συναρτήσεις εισόδου-εξόδουint printf (const char * format, ...);
int scanf (const char * format, ...);
Ειδικοί χαρακτήρες στο format Ακέραιοι αριθμοί%d στο δεκαδικό σύστημα
%u χωρίς πρόσημο στο δεκαδικό σύστημα
%o χωρίς πρόσημο στο οκταδικό σύστημα
%x χωρίς πρόσημο στο δεκαεξαδικό σύστημα
![Page 123: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/123.jpg)
123Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Συναρτήσεις εισόδου-εξόδου (ii)
Ειδικοί χαρακτήρες στο format Αριθμοί κινητής υποδιαστολής%f σε μορφή: [-]ddd.dddddd
%e σε μορφή: [-]ddd.dddddd e [+/-]ddd
%g σε μορφή %f ή %e Άλλοι τύποι%c χαρακτήρες
%s συμβολοσειρές
%p δείκτες
![Page 124: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/124.jpg)
124Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Συναρτήσεις εισόδου-εξόδου (iii)
Παραλλαγές στο format Μέγεθος αριθμών%h αριθμοί short π.χ. %hd, %hx
%l αριθμοί long ή double π.χ. %ld, %lf
%L αριθμοί long double π.χ. %Lf Μήκος αποτελέσματος%8d αριθμός σε μήκος 8 χαρακτήρων
%20s συμβολοσειρά σε μήκος 20 χαρακτήρων
%+8d αριθμός σε μήκος 8 χαρακτήρων με +
%08d αριθμός σε μήκος 8 χαρακτήρων, τα πρώτα 0
%-8d όπως το %8d με στοίχιση αριστερά
![Page 125: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/125.jpg)
125Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Συναρτήσεις εισόδου-εξόδου (iv)
Είσοδος-έξοδος χαρακτήρωνint putchar (int c);
int getchar ();
Είσοδος-έξοδος συμβολοσειρώνint puts (const char * s);
char * gets (char * s);
Έλεγχος τέλους δεδομένωνint eof (); Η σταθερά EOF παριστάνει το τέλος των
δεδομένων και έχει τύπο int.
![Page 126: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/126.jpg)
126Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Παράδειγμα
Αντιγραφή δεδομένων οι χαρακτήρες που διαβάζονται εκτυπώνονται,
μέχρι να παρουσιαστεί τέλος δεδομένων
void main (){ int c;
while ((c = getchar()) != EOF) putchar(c);}
![Page 127: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/127.jpg)
127Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Συναρτήσεις διαχείρισης αρχείων (i)
Τύπος αρχείουFILE * fp;
Άνοιγμα αρχείωνFILE * fopen (const char * filename, const char * mode);
Παράμετρος moder ανάγνωση (read)w εγγραφή (write)a προσθήκη (append)t κείμενο (text)b δυαδικά δεδομένα (binary)
![Page 128: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/128.jpg)
128Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Συναρτήσεις διαχείρισης αρχείων (ii)
Κλείσιμο αρχείωνint fclose (FILE * fp);
Είσοδος-έξοδος χαρακτήρωνint fputc (int c, FILE * fp);
int fgetc (FILE * fp);
Είσοδος-έξοδος συμβολοσειρώνint fputs (const char * s, FILE * fp);
char * fgets (char * s, int n, FILE * fp);
![Page 129: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/129.jpg)
129Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Συναρτήσεις διαχείρισης αρχείων (iii)
Βασικές συναρτήσεις εισόδου-εξόδουint fprintf (FILE * fp, const char * format, ...);
int fscanf (FILE * fp, const char * format, ...);
Έλεγχος τέλους αρχείουint feof (FILE * fp);
![Page 130: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/130.jpg)
130Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Συναρτήσεις διαχείρισης αρχείων (iv)
Είσοδος-έξοδος πολλών δεδομένωνsize_t fwrite (const void * p,size_t size, size_t num, FILE * fp);
size_t fread (void * p,size_t size, size_t num, FILE * fp);
Ο ακέραιος τύπος size_t χρησιμοποιείται για τη μέτρηση χώρου μνήμης σε bytes.
![Page 131: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/131.jpg)
131Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Παράδειγμα (i)
Αντιγραφή δυαδικών αρχείωνint main (int argc, char * argv[]){ FILE * fin, * fout; unsigned char buffer[1000]; size_t count;
fin = fopen(argv[1], "rb"); if (fin == NULL) return 1;
fout = fopen(argv[2], "wb"); if (fout == NULL) return 2;
![Page 132: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/132.jpg)
132Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Παράδειγμα (ii)
(συνεχίζεται) while (!feof(fin)) { count = fread(buffer, 1, 1000, fin);
fwrite(buffer, 1, count, fout); }
fclose(fin); fclose(fout);
return 0;}
![Page 133: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/133.jpg)
133Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Συναρτήσεις βιβλιοθήκης (i)
Είσοδος και έξοδος <stdio.h> Περιέχει όλες τις συναρτήσεις εισόδου-εξόδου Προκαθορισμένα αρχείαFILE * stdin; τυπική είσοδοςFILE * stdout; τυπική έξοδοςFILE * stderr; τυπική έξοδος σφαλμάτων
Ισοδυναμίεςprintf(...) fprintf(stdout, ...)scanf(...) fscanf(stdin, ...)κ.λπ.
Συναρτήσεις διαχείρισης αρχείων με τυχαία πρόσβαση (random access)
![Page 134: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/134.jpg)
134Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Συναρτήσεις βιβλιοθήκης (ii)
Διαχείριση συμβολοσειρών <string.h> size_t strlen (const char * s);
Μέτρηση αριθμού χαρακτήρων της συμβολοσειράς s. char * strcpy (char * s1, const char * s2);Αντιγραφή της συμβολοσειράς s2 στην s1.
char * strcat (char * s1, const char * s2);Προσθήκη της συμβολοσειράς s2 στο τέλος της s1.
int strcmp (const char * s1, const char * s2);
Σύγκριση των συμβολοσειρών s1 και s2.
![Page 135: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/135.jpg)
135Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Συναρτήσεις βιβλιοθήκης (iii)
Μετατροπή συμβολοσειρών <stdlib.h> int atoi (const char * s);
Μετατροπή της συμβολοσειράς s σε int. long int atol (const char * s);
Μετατροπή της συμβολοσειράς s σε long int. double atof (const char * s);
Μετατροπή της συμβολοσειράς s σε double.
![Page 136: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/136.jpg)
136Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Παράδειγμα
Μια δυνατή υλοποίηση της strcmpint strcmp (const char * s1, const char * s2){ while (*s1 == *s2 && *s1 != '\0') { s1++; s2++; }
return (*s1)-(*s2);} Υπόθεση: οι τιμές του τύπου char είναι στο
διάστημα 0-255 (όχι αρνητικές)
while (*s1 && *s1++ == *s2++);
![Page 137: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/137.jpg)
137Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Προεπεξεργαστής (preprocessor) (i)
Εντολή #include#include <stdio.h>
#include "myheader.h"
Εντολή #define#define MAX_CHARS 1000
char s[MAX_CHARS];
#define INC(x) ((x)++)
INC(a);
INC(*p);
![Page 138: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/138.jpg)
138Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Προεπεξεργαστής (preprocessor) (ii)
Εντολές #ifdef, #ifndef, #else και #endif#define DEBUG
#ifdef DEBUG
printf("debugging is on\n");
#else
printf("debugging is off\n")
#endif
#ifndef DEBUG
printf("optimizations allowed\n");
#endif
![Page 139: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/139.jpg)
139Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δυαδικά δένδρα (i) Binary trees Δυο σύνδεσμοι σε κάθε κόμβο
αριστερό και δεξί παιδί Κάθε κόμβος έχει
0, 1 ή 2 παιδιά Ρίζα: ο αρχικός κόμβος
του δένδρου Φύλλα: κόμβοι χωρίς
παιδιά Βάθος κόμβου: αριθμός
συνδέσμων από τη ρίζα
![Page 140: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/140.jpg)
140Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δυαδικά δένδρα (ii)
Τύπος κόμβου TreeNodetypedef struct TreeNode_tag { int data; struct TreeNode_tag * left; struct TreeNode_tag * right;} TreeNode;
Τύπος treetypedef TreeNode * tree;
Κενό δένδροconst tree treeEmpty = NULL;
![Page 141: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/141.jpg)
141Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δυαδικά δένδρα (iii)
Εισαγωγή σε δένδρα Καθοριστική απόφαση: σε ποιο σημείο του δένδρου
θα εισαχθεί ο νέος κόμβος Ισοζυγισμένα δένδρα (balanced trees): το βάθος δυο
φύλλων διαφέρει το πολύ κατά 1
Συνάρτηση μέγιστου βάθουςint treeDepth (tree t){ if (t == NULL) return 0; return 1 + max(treeDepth(t->left), treeDepth(t->right)); }
![Page 142: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/142.jpg)
142Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δυαδικά δένδρα (iv)
Εισαγωγή σε ισοζυγισμένα δένδραvoid treeBalancedInsert (tree * t, int d){ if (*t == NULL) { *t = (TreeNode *) malloc(sizeof(TreeNode));
if (*t == NULL) { printf("Out of memory\n"); exit(1); }
(*t)->data = d; (*t)->left = (*t)->right = NULL; }
![Page 143: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/143.jpg)
143Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δυαδικά δένδρα (v)
Εισαγωγή σε ισοζυγισμένα δένδρα (συνέχεια) else { int d1 = treeDepth((*t)->left); int d2 = treeDepth((*t)->right);
if (d1 <= d2) treeBalancedInsert( &((*t)->left), d);
else treeBalancedInsert( &((*t)->right), d);
}}
![Page 144: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/144.jpg)
144Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δένδρα γενικής μορφής
Κάθε κόμβος k έχει nk
απογόνους, όπου nkΝ
1
2 3 4
65 7
Κωδικοποίηση με δυαδικά δένδρα
1
2
3
4
5
7
6
![Page 145: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/145.jpg)
145Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Σειρά με την οποία διασχίζονται οι κόμβοι κατά βάθος (depth first) κατά πλάτος (breadth first)
Διάσχιση δυαδικών δένδρων (i)
42
10 50
7 55
523012
14
Κατά βάθος42, 10, 7, 14, 12, 30,
50, 55, 52
Κατά πλάτος42, 10, 50, 7, 14, 55,
12, 30, 52
![Page 146: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/146.jpg)
146Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Διάσχιση δυαδικών δένδρων (ii)
Εκτύπωση κατά βάθος πολύ απλά, με χρήση αναδρομής
Υλοποίησηvoid treePrintDF (tree t){ if (t != NULL) { printf("%d ", t->data); treePrintDF(t->left); treePrintDF(t->right); }}
![Page 147: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/147.jpg)
147Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Διάσχιση δυαδικών δένδρων (iii)
Εκτύπωση κατά πλάτος με τη βοήθεια ουράς για την αποθήκευση δεικτών
προς τους κόμβους που δεν έχουμε επισκεφθεί
Υλοποίηση
void treePrintBF (tree t){ queue q = queueEmpty;
if (t != NULL) queueInsert(&q, t);
![Page 148: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/148.jpg)
148Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Διάσχιση δυαδικών δένδρων (iv)
Εκτύπωση κατά πλάτος, υλοποίηση (συνέχεια)
while (!queueIsEmpty(q)) { TreeNode * n = queueRemove(&q);
printf("%d ", n->data); if (n->left != NULL) queueInsert(&q, n->left); if (n->right != NULL) queueInsert(&q, n->right); }}
![Page 149: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/149.jpg)
149Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Αριθμητικές εκφράσεις (i)
Παράδειγμα3 * (24 / 2) + (9 - 3)
Παράσταση σε μορφήδυαδικού δένδρου οι αριθμοί
στα φύλλα οι τελεστές στους
υπόλοιπους κόμβους
+
* –
3 3
224
/ 9
Διάσχιση κατά βάθος
![Page 150: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/150.jpg)
150Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Αριθμητικές εκφράσεις (ii)
Ενθεματική παράσταση infix notation ο τελεστής ανάμεσα στα
τελούμενα διφορούμενη:
χρειάζονταιπαρενθέσεις
η συνήθης μορφήγια τον άνθρωπο
Αποτέλεσμα(3 * (24 / 2)) + (9 - 3)
+
* –
3 3
224
/ 9
![Page 151: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/151.jpg)
151Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Αριθμητικές εκφράσεις (iii)
Προθεματική παράσταση prefix notation ο τελεστής πριν τα
τελούμενα όχι διφορούμενη,
δε χρειάζονταιπαρενθέσεις
απλή μηχανικήανάγνωση
Αποτέλεσμα+ * 3 / 24 2 - 9 3
+
* –
3 3
224
/ 9
![Page 152: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/152.jpg)
152Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Αριθμητικές εκφράσεις (iv)
Επιθεματική παράσταση postfix notation ο τελεστής μετά τα
τελούμενα όχι διφορούμενη,
δε χρειάζονταιπαρενθέσεις
απλή μηχανικήαποτίμηση
Αποτέλεσμα3 24 2 / * 9 3 - +
+
* –
3 3
224
/ 9
![Page 153: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/153.jpg)
153Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δυαδικά δένδρα αναζήτησης (i) Binary search trees Δυαδικά δένδρα με τις
παρακάτω ιδιότητεςγια κάθε κόμβο: όλοι οι κόμβοι του
αριστερού παιδιού έχουντιμές μικρότερες ή ίσεςτης τιμής του κόμβου
όλοι οι κόμβοι τουδεξιού παιδιού έχουντιμές μεγαλύτερες ή ίσεςτης τιμής του κόμβου
10
5 34
58
71
17
![Page 154: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/154.jpg)
154Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δυαδικά δένδρα αναζήτησης (ii)
Τα δυαδικά δένδρα αναζήτησηςδιευκολύνουν την αναζήτηση στοιχείων
Αναδρομική αναζήτηση αν η τιμή που ζητείται είναι στη ρίζα, βρέθηκε αν είναι μικρότερη από την τιμή της ρίζας,
αρκεί να αναζητηθεί στο αριστερό παιδί αν είναι μεγαλύτερη από την τιμή της ρίζας,
αρκεί να αναζητηθεί στο δεξί παιδί Κόστος αναζήτησης: O(log n)
υπό την προϋπόθεση το δένδρο να είναι ισοζυγισμένο
![Page 155: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/155.jpg)
155Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δυαδικά δένδρα αναζήτησης (iii)
ΑναζήτησηTreeNode * treeSearch (tree t, int key){ if (t == NULL) return NULL; /* not found */
if (t->data == key) return t; /* found */
if (t->data > key) return treeSearch(t->left, key); else return treeSearch(t->right, key);}
![Page 156: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/156.jpg)
156Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δείκτες σε συναρτήσεις
Παράδειγμα 1int f (int n);int (*p) (int n);
p = &f;printf("%d", (*p)(3));
Παράδειγμα 2double (*q) (double) = &sqrt;
Δείκτες ισοδύναμοι με συναρτήσεις
p = f;printf("%d", p(3));
![Page 157: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/157.jpg)
157Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ολοκλήρωση
double integral (double a, double b, double (*f) (double)){ const double step = 1e-6; double result = 0.0; double x; for (x=a; x<=b; x += step) result += f(x) * step; return result;}
...
result = integral(0, 3.14159, sin);
κακόςαλγόριθμος!
![Page 158: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/158.jpg)
158Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινόμηση φυσαλίδας (i)
Τα δεδομένα: void * a πού βρίσκονται int n πόσα είναι int size τί μέγεθος έχει καθένα comparison f πώς γίνεται η σύγκριση
Η σύγκριση των δεδομένων
typedef int (*comparison) (void * x, void * y);
![Page 159: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/159.jpg)
159Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινόμηση φυσαλίδας (ii)
void bsort (void * a, int n, comparison f, int size){ int i, j;
for (i = 0; i < n; i++) for (j = n-1; j > i; j--) { unsigned char * px = (unsigned char *) a + (j-1) * size; unsigned char * py = (unsigned char *) a + j * size;
![Page 160: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/160.jpg)
160Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινόμηση φυσαλίδας (iii)
(συνέχεια)
if (f(px, py) > 0) { int k;
for (k = 0; k < size; k++) { unsigned char temp = *px; *px++ = *py; *py++ = temp; } } }}
![Page 161: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/161.jpg)
161Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ταξινόμηση φυσαλίδας (iv)
Συνάρτηση σύγκρισης για ακέραιους
int intcompare (void * x, void * y){ return *((int *) x) - *((int *) y);}
Κλήση για πίνακα ακεραίων
int x[] = { 44, 55, 12, 42, ... };...bsort(x, n, intcompare, sizeof(int));
![Page 162: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/162.jpg)
162Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Υλοποίηση αριθμητικών εκφράσεων
Έκφραση: δυαδικό δένδρο ειδικής μορφής Κόμβοι τριών ειδών:
αριθμητικές σταθερές (φύλλα) τελεστές με ένα τελούμενο τελεστές με δύο τελούμενα
Πληροφορία: τιμή σταθεράς, ή σύμβολο τελεστή
Σύνδεσμοι: τελούμενα
![Page 163: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/163.jpg)
163Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Κόμβος δένδρου
typedef struct ExprNode_tag { enum { EXP_const, EXP_unop, EXP_binop } code; union { double constant; struct { char op; struct ExprNode_tag *arg; } unop; struct { char op; struct ExprNode_tag *arg1, *arg2; } binop; } data;} ExprNode, *expr;
![Page 164: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/164.jpg)
164Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Κατασκευή σταθερών
expr exprConst (double constant){ ExprNode * e = (ExprNode *) malloc(sizeof(ExprNode));
if (e == NULL) { printf("Out of memory\n"); exit(1); }
e->code = EXP_const; e->data.constant = constant; return e;}
![Page 165: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/165.jpg)
165Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Κατασκευή τελεστών με δύο τελούμενα
expr exprBinop (expr arg1, char op, expr arg2){ ExprNode * e = (ExprNode *) malloc(sizeof(ExprNode));
if (e == NULL) { printf("Out of memory\n"); exit(1); }
e->code = EXP_binop; e->data.binop.op = op; e->data.binop.arg1 = arg1; e->data.binop.arg2 = arg2; return e;}
![Page 166: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/166.jpg)
166Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Παράδειγμα κατασκευής
Έκφραση: 3 * (24 / 2) + (9 - 3)
+
* –
3 3
224
/ 9
expr e = exprBinop( exprBinop( exprConst(3),'*', exprBinop( exprConst(24), '/', exprConst(2) ) ), '+', exprBinop( exprConst(9), '-', exprConst(3) ) );
![Page 167: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/167.jpg)
167Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Καταστροφή έκφρασης
void exprFree (expr e){ switch (e->code) { case EXP_unop: exprFree(e->data.unop.arg); break; case EXP_binop: exprFree(e->data.binop.arg1); exprFree(e->data.binop.arg2); break; } free(e);}
![Page 168: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/168.jpg)
168Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Εκτύπωση έκφρασης (i)
void exprPrint (expr e){ switch (e->code) { case EXP_const: printf("%lg", e->data.constant); break; case EXP_unop: printf("(%c", e->data.unop.op); exprPrint(e->data.unop.arg); printf(")"); break;
![Page 169: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/169.jpg)
169Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Εκτύπωση έκφρασης (ii)
(συνέχεια) case EXP_binop: printf("("); exprPrint(e->data.binop.arg1); printf("%c", e->data.binop.op); exprPrint(e->data.binop.arg2); printf(")"); break; }}
![Page 170: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/170.jpg)
170Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Υπολογισμός έκφρασης (i)
double exprCalc (expr e){ switch (e->code) { case EXP_const: return e->data.constant; case EXP_unop: switch (e->data.unop.op) { case '+': return exprCalc(e->data. unop.arg); case '-': return - exprCalc(e->data. unop.arg); }
![Page 171: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/171.jpg)
171Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Υπολογισμός έκφρασης (ii)
(συνέχεια) case EXP_binop: switch (e->data.binop.op) { case '+': return exprCalc(e->data. binop.arg1) + exprCalc(e->data. binop.arg2); case '-': return exprCalc(e->data. binop.arg1) - exprCalc(e->data. binop.arg2); ...
![Page 172: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/172.jpg)
172Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δέντρα δυαδικής αναζήτησης
Δενδρικές δομές δεδομένων στις οποίες Ολα τα στοιχεία στο αριστερό υποδέντρο της
ρίζας είναι μικρότερα από την ρίζα Ολα τα στοιχεία στο δεξί υποδέντρο της ρίζας
είναι μεγαλύτερα ή ίσα με την ρίζα Το αριστερό και το δεξί υποδέντρο είναι δέντρα
δυαδικής αναζήτησης
Binary Search Trees - BSTs
![Page 173: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/173.jpg)
173Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δέντρα δυαδικής αναζήτησης
Η γενική εικόνα ενός τέτοιου δέντρου
>=
![Page 174: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/174.jpg)
174Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Παραδείγματα δέντρων BST
Εγκυρα δέντρα
![Page 175: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/175.jpg)
175Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Παραδείγματα δέντρων BST
Μη-έγκυρα δέντρα
![Page 176: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/176.jpg)
176Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Διάσχιση δυαδικών δέντρων
Preorder: 23 18 12 20 44 35 52 Postorder: 12 20 18 35 52 44 23 Inorder: 12 18 20 23 35 44 52
![Page 177: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/177.jpg)
177Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ζύγισμα δέντρων BST
Ανάλογα με τη σειρά άφιξης των στοιχείων και τον τρόπο δημιουργίας του δέντρου BST, για τα ίδια στοιχεία δεν προκύπτει πάντα το ίδιο δέντρο
Το ύψος του δέντρου σχετίζεται με το χρόνο αναζήτησης ενός στοιχείου μέσα στο δέντρο
![Page 178: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/178.jpg)
178Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ζύγισμα δέντρων BST
Αναζήτηση με πολυπλοκότητα Από Ο(Ν) [χειρότερη περίπτωση] Μέχρι Ο(Log2N) [καλύτερη περίπτωση]
![Page 179: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/179.jpg)
179Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ζύγισμα δέντρων BST
Προκειμένου μια αναζήτηση να διατρέχει όσο το δυνατόν μικρότερο μέρος του δέντρου, αυτό πρέπει να είναι «ζυγισμένο» «Ζυγισμένο»: το βάθος του αριστερού
υποδέντρου δεν διαφέρει περισσότερο από 1 από αυτό του δεξιού (ιδανικά: είναι ίσα)
Αν κατά την προσθήκη νέων στοιχείων στο δέντρο η ζυγαριά «γείρει» δεξιά ή αριστερά, απαιτείται διόρθωση του δέντρου
![Page 180: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/180.jpg)
180Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Παραδείγματα ζυγισμένων δέντρων
1
2
3
4
5
6
7
1
2
3
4
5
6
7
31
2
4
6
75
![Page 181: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/181.jpg)
181Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Ζυγισμένα δέντρα
Η περίπτωση όπου το ύψος του αριστερού υποδέντρου είναι ακριβώς ίσο με το ύψος του δεξιού, δεν επιτυγχάνεται εύκολα
Αν από την παραπάνω περίπτωση υπήρχαν «μικρές» αποκλίσεις, οι επιδόσεις του δέντρου στην αναζήτηση δεν θα επηρεάζονταν ιδιαίτερα
![Page 182: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/182.jpg)
182Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δέντρα AVL
Ενα δέντρο AVL (Adelson-Velskii and Landis) είναι ένα δέντρο BST του οποίου το ύψος του αριστερού υποδέντρου διαφέρει από αυτό του δεξιού το πολύ κατά 1
Το δεξί και αριστερό υποδέντρο ενός δέντρου AVL είναι επίσης δέντρα AVL
Το κενό δέντρο είναι δέντρο AVLΟι ιδιότητες αυτές διατηρούνται με παρεμβάσεις (αναδιάταξη) καθώς νέα στοιχεία προστίθενται στο δέντρο
![Page 183: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/183.jpg)
183Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δέντρα AVL
![Page 184: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/184.jpg)
184Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Δέντρα AVL
Ενα δέντρο AVL λέγεται «ψηλό από αριστερά» όταν το ύψος του αριστερού υποδέντρου είναι μεγαλύτερο από αυτό του δεξιού (κατά πόσο;;;)
Αντίστοιχα για το «ψηλό από δεξιά» Υπάρχουν αρκετοί τρόποι με τους οποίους
η προσθήκη ή η διαγραφή στοιχείων σε ένα δέντρο AVL παραβιάζει τη συνθήκη χαρακτηρισμού του
![Page 185: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/185.jpg)
185Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Αναδιάταξη δέντρων AVL
Η χαρακτηριστική ιδιότητα ενός δέντρου AVL μπορεί να παύει να ισχύει με την προσθήκη νέων στοιχείων
Η επαναφορά της ιδιότητας σε ισχύ, γίνεται με περιστροφή του δέντρου, ανάλογα με την περίπτωση αναδιάταξης που συντρέχει
![Page 186: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/186.jpg)
186Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Απλή περιστροφή
X Y
Z
k2
k1
h X
Y Z
k2
k1
New item
New Item
![Page 187: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/187.jpg)
187Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Διπλή περιστροφή (α)
k3
h
D
k2
k1
CB
A
k2
k1 k3
C
D
BA
![Page 188: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/188.jpg)
188Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Διπλή περιστροφή (β)
k3
k2
k1
CB
A
D
k3
k1
k2
C
BA
D
![Page 189: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/189.jpg)
189Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Διπλή περιστροφή (γ)
k3
k1
k2
C
BA
D
k2
k1k3
CBA D
![Page 190: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/190.jpg)
190Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Αναδιάταξη δέντρων AVL
Περιπτώσεις αναδιάταξης ΑΑ: ένα αριστερό υποδέντρο ενός δέντρου AVL
που είναι ψηλό από αριστερά, γίνεται επίσης ψηλό από αριστερά (left of left)
ΔΔ: τα αντίστοιχα για το δεξί υποδέντρο (right of right)
ΔΑ: ένα υποδέντρο ενός δέντρου AVL ψηλού από αριστερά, γίνεται ψηλό από δεξιά (right of left)
ΑΔ: ένα υποδέντρο ενός δέντρου AVL ψηλού από δεξιά, γίνεται ψηλό από αριστερά (left of right)
![Page 191: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/191.jpg)
191Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Περιπτώσεις αναδιάταξης (α)
![Page 192: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/192.jpg)
192Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Περιπτώσεις αναδιάταξης (β)
![Page 193: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/193.jpg)
193Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Αναδιάταξη σε περίπτωση ΑΑ
![Page 194: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/194.jpg)
194Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Αναδιάταξη σε περίπτωση ΔΔ
![Page 195: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/195.jpg)
195Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Αναδιάταξη σε περίπτωση ΔΑ
![Page 196: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/196.jpg)
196Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Αναδιάταξη σε περίπτωση ΑΔ
![Page 197: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/197.jpg)
197Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Υλοποίηση δέντρων AVL στη C
Μια δομή δεδομένωνNode
key <keyType>
data <dataType>
left <pointer to Node>
right <pointer to Node>
bal <LeftH, EvenH, RightH>
End Node
![Page 198: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/198.jpg)
198Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Εισαγωγή σε δέντρα AVL
H εισαγωγή νέων στοιχείων γίνεται στα φύλλα, όπως στα δέντρα BST
Εντοπίζεται το φύλλο στο οποίο θα γίνει η εισαγωγή και δημιουργείται νέος κόμβος
Γίνεται οπισθοδρόμηση μέχρι την κορυφή του δέντρου, με έλεγχο της ισχύος της συνθήκης ισορροπίας AVL σε κάθε βήμα προς τα πίσω, και επαναφορά σε ισορροπία, όπου απαιτείται
![Page 199: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/199.jpg)
199Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Εισαγωγή σε δέντρα AVL
Διάγραμμα κλήσης μιας αναδρομικής συνάρτησης εισαγωγής
![Page 200: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/200.jpg)
200Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
ΑΛΓΟΡΙΘΜΟΣ AVLInsert( ref root <tree pointer>, val newPtr <tree pointer>, ref taller <Boolean>)
1 if (root null) 1 root = newPtr 2 taller = true 3 return root2 end if3 if (newPtr->key < root->key) 1 root->left = AVLInsert (root->left, newPtr, taller) 2 if (taller) // Left subtree is taller 1 if (root left-high) 1 root = leftBalance (root, taller) 2 elseif (root even-high) 1 root->bal = left-high 3 else //Was right high -- now even high 1 root->bal = even-high 2 taller = false 4 end if4 else // New data >= root data
![Page 201: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/201.jpg)
201Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
(Συνέχεια) AVLInsert( ref root <tree pointer>, val newPtr <tree pointer>, ref taller <Boolean>)
...4 else // New data >= root data 1 root-> right = AVLInsert (root->right , newPtr, taller) 2 if (taller) // Right subtree is taller 1 if (root left-high) 1 root->bal = even-high 2 taller = false 2 elseif (root even-high) // Was balanced -- now right high 1 root->bal = right-high 3 else 1 root = rightBalance (root, taller) 4 end if 3 end if5 end if6 return root
end AVLInsert
![Page 202: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/202.jpg)
202Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
ΑΛΓΟΡΙΘΜΟΣ leftBalance (ref root <tree pointer>, ref taller <Boolean>)
1 leftTree = root-> left2 if (leftTree left-high)
// Case 1: Left of left. Single rotation right. 1 rotateRight (root) 2 root->bal = even-high 3 leftTree->bal = even-high 4 taller = false3 else
// Case 2: Right of left. Double rotation required. 1 rightTree = leftTree->right
// adjust balance factors 2 if (rightTree->bal left-high) 1 root->bal = right-high 2 leftTree->bal = even-high 3 elseif (rightTree->bal = even-high) 1 leftTree->bal = even-high 4 else
![Page 203: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/203.jpg)
203Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
(Συνέχεια)leftBalance (ref root <tree pointer>, ref taller <Boolean>)
4 else // rightTree->bal is right-high
1 root->bal = even-high 2 leftTree->bal = left-high 5 end if 6 rightTree->bal = even-high 7 root->left = rotateLeft (leftTree) 8 root = rotateRight (root) 9 taller = false4 end if5 return root
end leftBalance
![Page 204: Διαφάνειες παρουσιάσεων](https://reader035.fdocuments.net/reader035/viewer/2022062422/568132aa550346895d994f9f/html5/thumbnails/204.jpg)
204Νίκος Παπασπύρου Προγραμματιστικές Τεχνικές
Περισσότερα για δέντρα AVL
Διαγραφή στοιχείου Διαβάστε αντίστοιχο download από τη σελίδα
του μαθήματος
Βιβλιοθήκη συναρτήσεων Μπορείτε να κατεβάσετε ένα σύνολο έτοιμων
συναρτήσεων C για το χειρισμό δέντρων AVL από τη σελίδα web του μαθήματος