Διδάσκων: Παναγιώτης Ανδρέου

Σχετικά έγγραφα
Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διάλεξη 5: Δείκτες και Συναρτήσεις

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 6: Δείκτες και Πίνακες

Διδάσκων: Παναγιώτης Ανδρέου

Διδάσκων: Παναγιώτης Ανδρέου

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δείκτες και Συναρτήσεις (Κεφάλαιο 11, KNK-2ED)

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 )

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Η/Υ (ΤΛ2007 )

Διάλεξη 11η: Δείκτες, μέρος 1

είκτες και Πίνακες Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Δομημένος Προγραμματισμός

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

Προγραμματισμό για ΗΜΥ

Δομημένος Προγραμματισμός (ΤΛ1006)

ΠΛΗ111. Ανοιξη Μάθηµα 1 ο Ανασκόπηση της Γλώσσας Προγραµµατισµού C. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Η γλώσσα C. Δείκτες (pointers)

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

Η γλώσσα προγραμματισμού C

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 12η: Δείκτες, μέρος 2

Δομημένος Προγραμματισμός (ΤΛ1006)

Εργαστήριο 1: Επανάληψη Βασικών Εννοιών στη Γλώσσα C

Οι δείκτες στη γλώσσα C

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Διαδικασιακός Προγραμματισμός

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Προγραμματισμός Η/Υ (ΤΛ2007 )

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Στοιχειώδης προγραμματισμός σε C++

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

Διδάσκων: Παναγιώτης Ανδρέου

Στόχοι και αντικείμενο ενότητας. Τύπος πίνακα. Τύπος πίνακα (συν.) #6. Πίνακες και Δείκτες

Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

Η γλώσσα C. Δείκτες (pointers)

Δομημένος Προγραμματισμός

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

Αναφορές, είκτες και Αλφαριθμητικά

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

οµές (structures) και Eνώσεις (unions)

Δομημένος Προγραμματισμός (ΤΛ1006)

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

Προγραμματισμός Δομές Δεδομένων

Μεταβλητές. Έστω η μεταβλητή

Εισαγωγή στον Προγραμματισμό

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ.

Μεθόδων Επίλυσης Προβλημάτων

Αντικειμενοστρεφής Προγραμματισμός

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Εργαστήριο 2: Πίνακες

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Εργαστήριο 9: Αρχεία

Τύποι δεδομένων, τελεστές, μεταβλητές

Εισαγωγή στη γλώσσα προγραμματισμού C++

Προγραμματισμός Υπολογιστών με C++

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός ΙI (Θ)

Διαδικασιακός Προγραμματισμός

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Ερωτήσεις Επανάληψης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Ανάπτυξη και Σχεδίαση Λογισμικού

Εφαρμοσμένη Πληροφορική ΙΙ (Θ) Είσοδος/Έξοδος Μεταβλητές Τύποι Μεταβλητών Τελεστές και Προτεραιότητα Μετατροπές Μεταξύ Τύπων

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

2.1. Εντολές Σχόλια Τύποι Δεδομένων

ΗΥ-150. Προγραμματισμός

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

ΗΥ-150. Προγραμματισμός

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

ιαφάνειες παρουσίασης #5 (β)

ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι String Interning

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

Δείκτες & Πίνακες Δείκτες, Πίνακες

Mεταβλητές (variables) και Σταθερές (constants)

Transcript:

Διάλεξη 3: Δείκτες (pointers) και Πίνακες Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Εισαγωγή στις έννοιες: - Αριθμητική Δεικτών - Δείκτες και Πίνακες - Παραδείγματα Διδάσκων: Παναγιώτης Ανδρέου ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 1

Δείκτες (Pointers) Ορισμός Pointer: Μία μεταβλητή που περιέχει τη διεύθυνση μιας άλλης μεταβλητής. Δηλώνεται με τον τύπο δεδομένων και *, π.χ., int * p Δείκτες χρησιμοποιούνται στη C γιατί Μερικές φορές είναι ο μόνος τρόπος για τη διατύπωση κάποιου υπολογισμού. Συνήθως οδηγούν σε πιο περιεκτικό και αποτελεσματικό κώδικα. Η μνήμη είναι οργανωμένη ως μια σειρά κελιών, με διαδοχική αρίθμηση, ή διευθύνσεις, που μπορούν να χρησιμοποιηθούν έναένα ή σε συνεχείς ομάδες. 1κελί τους ενός byte => π.χ., char,bool 2 κελιά τους ενός byte => π.χ., short 4 κελιά του ενός byte => π.χ.,int Δείκτης είναι μια ομάδα κελιών 4 (x86) ή 8 (x64)που μπορούν να κρατήσουν μια διεύθυνση Node Address data next Παράδειγμα n2 3143928 B 0 n1 A next n2 Β next NULL 3143932 n1 3143936 A 3143928 ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 2

Βασικοί Τύποι Δεδομένων C - Περίληψη(για x86) Τύπος Μέγεθος Πεδίο Τιμών Μοναδικές char 1byte a.. z A.. Z 0.. 9 28 ή 256 bool 1byte true, false 2 int 4 bytes -2 31 2 31-1 2 32 short int 2 bytes -2 15 2 15-1 2 16 float 4 bytes 10-37 10 38 2 32 double 8 bytes 10-307 10 308 2 64 δείκτης 4 bytes διευθύνσεις 2 32 (0..2 32-1) ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 3

Δείκτες και Διευθύνσεις Έστω x ένας int, καιpένας δείκτηςπρος τον x. Στο επίπεδο της μνήμης, γραφικά, αυτό σημαίνει: p?? x=5???? Variable Address data x 2293544 5 p 2293562 2293544 Τελεστής διεύθυνσης: &(η διεύθυνση του αντικειμένου) Δίνει τη διεύθυνση ενός αντικειμένου. π.χ. &cαποδίδει τη διεύθυνση του x. p = &x : έχει ως αποτέλεσμα ανάθεση στο δείκτη pτη διεύθυνση του x. Τελεστής Έμμεσης Αναφοράς: *(το περιεχόμενο του δείκτη) Όταν εφαρμόζεται σε δείκτη προσπελάζει το αντικείμενο που δείχνει ο δείκτης. Το *p,έχει τιμή την τιμή του x. int x=5; int* p=&x; printf("x=%d\t&x=%d\n", x, &x); printf("p=%d\t*p=%d\n", p, *p); Τυπώνει x=5 &x=2293544 p=2293544 *p=5 ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 4

Δήλωση Δεικτών Δήλωση Pointer: <τύπος δεδομένων> * <όνομα μεταβλητής> Παραδείγματα: int *p; //Δείκτης σε ακέραιο int foo(char *); //Δείκτης σε χαρακτήρα int **p; //Διπλός Δείκτης Επομένως ένας δείκτης δείχνει σε αντικείμενα κάποιου συγκεκριμένου τύπου δεδομένων. (εξαίρεση: δείκτης σε void) Προσοχή στη χρήση του *!! a*b; (Τελεστής γινομένου) int *p; x = *p + 1; (Δήλωση Δείκτη) (Τελεστής Έμμεσης Αναφοράς) ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 5

Παραδείγματα με δείκτες int int x = 1, y = 2, z[10]; *ip, *iq, **dip; ip = &x; /* o ip δείχνει τώρα την x */ *ip = *ip + 1; /* η μεταβλητή που δείχει o ip (η x) αυξάνεται κατά 1 */ y = *ip + 3; /* η y παίρνει την τιμή 5 */ *ip = 0; /* η x παίρνει την τιμή 0 */ ip = &z[6];??? /* o ip δείχνει τώρα τo z[6]*/ iq = ip; /* o iq δείχνει εκεί που δείχνει και ο ip */ dip = &ip; /* o dip δείχνει τώρα την ip */ **dip = 13; /* η x παίρνει την τιμή 13 */ ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 6

Δείκτες και ορίσματα συναρτήσεων Ξέρουμε ότι αν καλέσουμε μια συνάρτηση με κάποιες παραμέτρους (δια τιμής) τότε αυτές οι τιμές δεν αλλάζουν (Εξαίρεση: πίνακες οι οποίοι περνάνε δια-αναφοράς εξ ορισμού). void increment(int c){ c++; int x=5; printf("%d\n", x); 5 increment(x); printf("%d\n", x); 5 Παράδειγμα: Να γράψετε μια συνάρτηση η οποία να έχει σαν αποτέλεσμα την εναλλαγή δύο στοιχείων. void swap(int *px, int *py){ int temp; temp = *px; *px = *py; *py = temp; ΛΑΘΟΣ! Καλώντας την συνάρτηση ως swap1(a,b) δεν θα έχει καμιά επίδραση στις τιμές των a και b. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 7

Δείκτες και ορίσματα συναρτήσεων void swap(int *px, int *py){ int temp; temp = *px; *px = *py; *py = temp; Η κλήση swap(&a, &b) θα έχει το επιθυμητό αποτέλεσμα: Αφού ο τελεστής &δίνει τη διεύθυνση μιας μεταβλητής, οι &a και &bείναι δείκτες προς τις μεταβλητές aκαι b. Οι παραμέτροιτης swapδηλώνονται ως δείκτες και η προσπέλαση και ανταλλαγή των τιμών των aκαι bγίνονται μέσω των δεικτών αυτών. ΣΩΣΤΟ! int a=3; int b=5; printf("a=%d\tb=%d\n", a, b); // Τυπώνει a=3 b=5 swap(&a,&b); printf("a=%d\tb=%d\n", a, b); // Τυπώνει a=5 b=3 ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 8

Δείκτες και Πíνακες(συν.) Στην C υπάρχει ισχυρός δεσμός ανάμεσα στους δείκτεςκαι στους πίνακες. Οποιαδήποτε πράξη μπορεί να γίνει με δείκτες πινάκων (πχ α[i]) μπορεί να γίνει και με δείκτες διευθύνσεων *pa. Έστω πίνακας inta[10]. H δήλωση αυτή ορίζει ένα μπλοκ 10 διαδοχικών αντικειμένων με ονόματα α[0], α[1],..., α[9]. Αν int *pa; τότε η ανάθεση pa = &a[0]; κάνει τον pa να δείχνει το μηδενικό (πρώτο) στοιχείο του πίνακα. Αριθμητική δεικτών:αν ο pa είναι δείκτης σε κάποια θέση του πίνακα, τότε οι pa ±i, pa++, pa--είναι επίσης δείκτες pa + 1, pa++ pa + i, (pa i) δείκτης στο επόμενο στοιχείο του πίνακα από αυτό πουδείχνει ο pa. δείκτης στο σημείο του πίνακα που βρίσκεται i θέσεις μετά (πριν) από αυτό που δείχνει ο pa. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 9

Δείκτες και Πίνακες Έτσι, αν pa = &a[0], τότε για παράδειγμα, pa + 2 δείχνει στη τρίτη θέσητου πίνακα, δηλ. στο α[2]. *(pa + 2) έχει τιμή την τιμή της 3ης θέσης του πίνακα, δηλ. το α[2]. Έξ ορισμού, η τιμή μιας μεταβλητής τύπου πίνακα (inta[]) είναι η διεύθυνση του μηδενικού στοιχείου του πίνακα. Επομένως αντί pa = &a[0]μπορούμε να γράψουμε pa = a. Tότεοι pa καιaέχουν τις ίδιες τιμές και μπορούν να χρησιμοποιούνται η μια στη θέση της άλλης: Το a[i] είναι ταυτόσημο με τα *(pa +i) ή *(a + i) ή pa[i]. To &a[i] είναι ταυτόσημο με τα a+i, pa+i. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 10

Δείκτες και Πíνακες(συν.) ΠΡΟΣΟΧΗ:ο δείκτης είναι μεταβλητή και έτσι pa = a και pa++ είναι έγκυρες εκφράσεις. Το όνομα ενός πίνακα όμως δεν είναι μεταβλητή, επομένως κατασκευές όπως α = paκαι α++ δεν είναι έγκυρες! Ποιες από τις πιο κάτω εντολές είναι έγκυρες; int a[5] = {, pa = a; pa[2] = 3; ++pa; i = 4, *pa; *pa = 14; *(a+i) = 33; ++a; a p,a p 0 1 2 3 4 index 0 0 0 0 0 value p? 0 0 0 0 0 0 0 3 0 0 0 0 3 0 0 0 14 3 0 0 0 14 3 0 33 => compile error ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 11

Παράδειγμα Αντιγραφή String <strcpy> Ζητούμενο: να γράψετε συνάρτηση που αντιγράφει ένα αλφαριθμητικό t στο αλφαριθμητικό s. Ερώτηση:Γιατί δεν είναι αρκετό να γράψουμε s=t ;;; Eκδοχή με πίνακες: void mystrcpy( char * dest, const char * source ){ int i=0; while(dest[i]!='\0'){ dest[i]=source[i]; i++; void mystrcpy( char * dest, const char * source ){ int i=0; while(dest[i]=source[i++]); ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 12

Παράδειγμα Αντιγραφή String <strcpy> (συν.) Εκδοχή με Δείκτες: void mystrcpy_p( char * dest, const char * source ){ void mystrcpy_p( char * dest, const char * source ){ while(*dest!='\0'){ *dest=*source; *dest++; *source++; while(*dest++=*source++); ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 13

Παράδειγμα Σύγκριση Strings <strcmp> Ζητούμενο:να γράψετε συνάρτηση να συγκρίνει τα αλφαριθμητικά s1και s2 και επιστρέφει «1»αν το s1μεγαλύτερο λεξικογραφικά, 0 αν είναι ίσα και «-1» αν s2 μεγαλύτερο λεξικογραφικά Παράδειγμα s1 D o g \0? s1>s2, D > C s2 C a t \0? strcmp(s1,s2)=1 Εκδοχή με πίνακες int mystrcmp(const char * dest, const char * source ){ int i=0; while(dest[i]==source[i]){ if(dest[i]=='\0') return 0; i++; return dest[i]>source[i]? 1:-1; ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 14

Παράδειγμα Σύγκριση Strings <strcmp> Εκδοχή με δείκτες: int mystrcmp_p( const char * dest, const char * source ){ while(*dest==*source){ if(*dest=='\0') return 0; *dest++; *source++; return (*dest>*source)? 1:-1; Εκδοχή με δείκτες 2: int mystrcmp_p2( const char * dest, const char * source ){ while(*dest++==*source++){ if(!(*(dest-1))) return 0; return (*(--dest)>*(--source))? 1:-1; ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 15