ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα: Αλφαριθμητικά θεωρία Δ. Ε. Μετάφας Τμ. Ηλεκτρονικών Μηχ. Τ.Ε.
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Χαρακτήρες Ένας χαρακτήρας κωδικοποιείται σαν ακέραιος με τιμή ανάμεσα στο 0 και το 255, επομένως ο τύπος δεδομένων char, που έχει μέγεθος 1 byte, μπορεί να χρησιμοποιηθεί για την αποθήκευση χαρακτήρων. Π.χ. char ch; ch = 'c'; Όταν αποθηκεύεται ένας χαρακτήρας σε μία μεταβλητή τύπου char, στην πραγματικότητα αποθηκεύεται η ASCII τιμή του χαρακτήρα
Εμφάνιση χαρακτήρων Ανάλογα με το προσδιοριστικό μετατροπής που θα χρησιμοποιήσουμε στην printf (%c ή %d) εμφανίζεται ο ίδιος ο χαρακτήρας ή η ASCII τιμή του, αντίστοιχα
ASCII πίνακας
Συνάρτηση getchar() Η συνάρτηση getchar() διαβάζει έναν χαρακτήρα από το stdin (πληκτρολόγιο) int getchar(); Αν δεν υπάρχει άλλος χαρακτήρας στο stdin για να διαβαστεί ή αν συμβεί κάποιο λάθος, η getchar() επιστρέφει μία ειδική σταθερά που ονομάζεται EOF και έχει τιμή -1
Αλφαριθμητικά Αλφαριθμητικό (string) είναι μία ακολουθία χαρακτήρων, η οποία πρέπει να τελειώνει με έναν ειδικό χαρακτήρα, ο οποίος είναι ο χαρακτήρας '\0 (τερματικός χαρακτήρας ή null character, ASCII τιμή 0) Μία ακολουθία χαρακτήρων που περιέχεται μέσα σε διπλά εισαγωγικά ονομάζεται κυριολεκτικό αλφαριθμητικό και αποθηκεύεται στη μνήμη σαν να ήταν πίνακας χαρακτήρων. Δεσμεύονται για αυτό θέσεις μνήμης ίσες με το μήκος του και ένας για το \0. Εφόσον είναι πίνακας χαρακτήρων μπορούμε να το χρησιμοποιήσουμε και σαν δείκτη σε χαρακτήρα char*
Μεταβλητές και αρχικοποίηση Η αποθήκευση αλφαριθμητικών γίνεται σε μεταβλητές που δηλώνονται σαν πίνακες χαρακτήρων. Π.χ. char a[9]; char a[9] = { d, i, m, i, t, r, i, s, \0 }; char a[9] = dimitris ; char a[] = dimitris ; char a[40] = dimitris ; Προσοχή στη διαφορά του a (αλφαριθμητικό) και του a (χαρακτήρας)
Εμφάνιση αλφαριθμητικού (1) Για την εμφάνιση αλφαριθμητικού χρησιμοποιούμε το προσδιοριστικό %s στην εντολή printf(). Π.χ. char a[] = dimitris ; printf( %s, a); printf( %s, a+5); printf( %s, &a[5]); Η συνάρτηση printf() εμφανίζει όλους τους χαρακτήρες από τον πρώτο χαρακτήρα στον οποίο δείχνει ο δείκτης μέχρι να συναντήσει τον τερματικό χαρακτήρα ('\0')
Εμφάνιση αλφαριθμητικού (2) Για την εμφάνιση ενός αλφαριθμητικού, μπορούμε να χρησιμοποιήσουμε και τη συνάρτηση puts(). Έχει μοναδική παράμετρο έναν δείκτη στην ακολουθία χαρακτήρων και την εμφανίζει μέχρι να συναντήσει τον τερματικό χαρακτήρα ('\0'). Π.χ. char a[] = dimitris ; puts( a); Στο τέλος της ακολουθίας χαρακτήρων η puts() αντικαθιστά αυτόματα τον τερματικό χαρακτήρα ('\0') με τον χαρακτήρα νέας γραμμής ('\n')
Αλφαριθμητικά ως δείκτες Ένας εναλλακτικός τρόπος για να χειριστούμε ένα κυριολεκτικό αλφαριθμητικό είναι να δηλώσουμε έναν δείκτη που να δείχνει στον πρώτο χαρακτήρα του αλφαριθμητικού αυτού. Π.χ. char *pa= Dimitris ; το οποίο ωστόσο έχει διαφορές με το char a[]= Dimitris ; στην πρώτη περίπτωση η μεταβλητή pa είναι δείκτης σε char, μπορεί να αλλάξει το που δείχνει κατά την εκτέλεση του προγράμματος, και οι χαρακτήρες του Dimitris είναι read-only (συνήθως). Στη δεύτερη περίπτωση παρότι το a είναι επίσης δείκτης με διεύθυνση αυτήν του a[0] δεν μπορεί να δείξει σε άλλο αλφαριθμητικό
Διάβασμα αλφαριθμητικού Η συνάρτηση scanf() σταματάει το διάβασμα του αλφαριθμητικού, όταν συναντήσει τον κενό χαρακτήρα ή τον χαρακτήρα νέας γραμμής Σε αντίθεση με τη συνάρτηση scanf(), η συνάρτηση gets() διαβάζει όλους τους χαρακτήρες μέχρι να συναντήσει τον χαρακτήρα νέας γραμμής ('\n'). Η gets() αντικαθιστά τον χαρακτήρα νέας γραμμής ('\n') με τον τερματικό χαρακτήρα ('\0') Προσοχή! Οι scanf() και gets() δεν ελέγχουν αν υπάρχει διαθέσιμος χώρος για την αποθήκευση όλων των χαρακτήρων του αλφαριθμητικού Εναλλακτικά fgets(str, sizeof(str), stdin); scanf( %40s, str);
Συναρτήσεις αλφαριθμητικών (1) Η συνάρτηση strlen() επιστρέφει τον αριθμό των χαρακτήρων που περιέχει ένα αλφαριθμητικό, χωρίς να μετράει τον τερματικό χαρακτήρα ('\0'). Δέχεται σαν παράμετρο έναν δείκτη προς τη μνήμη που είναι αποθηκευμένη το αλφαριθμητικό size_t strlen(const char *str); Η συνάρτηση strcpy() αντιγράφει ένα αλφαριθμητικό σε μία άλλη θέση μνήμης. Δέχεται σαν παραμέτρους δύο δείκτες και αντιγράφει το αλφαριθμητικό στο οποίο δείχνει ο δεύτερος δείκτης (source), συμπεριλαμβανομένου του τερματικού χαρακτήρα, στη μνήμη που δείχνει ο πρώτος δείκτης (dest). Προσοχή, γιατί δεν ελέγχει τη μνήμη που έχει δεσμευτεί στο πρώτο αλφαριθμητικό char *strcpy(char *dest, const char *source); Η συνάρτηση strcat() συνενώνει δύο αλφαριθμητικά. Δέχεται σαν παραμέτρους δύο δείκτες και προσθέτει το αλφαριθμητικό στο οποίο δείχνει ο δείκτης source στο τέλος της μνήμης που δείχνει ο δείκτης dest char *strcat(char *dest, const char *source);
Συναρτήσεις αλφαριθμητικών (2) Η συνάρτηση strcmp() χρησιμοποιείται για τη σύγκριση αλφαριθμητικών. Δέχεται σαν παραμέτρους δύο δείκτες και συγκρίνει το αλφαριθμητικό στο οποίο δείχνει ο δείκτης str1 με το αλφαριθμητικό στο οποίο δείχνει ο δείκτης str2 Αν τα δύο αλφαριθμητικά είναι ακριβώς ίδια, τότε η συνάρτηση strcmp() επιστρέφει την τιμή μηδέν (0). Αν το πρώτο αλφαριθμητικό είναι μικρότερο από το δεύτερο, τότε επιστρέφει μία αρνητική τιμή, ενώ αν είναι μεγαλύτερο επιστρέφει μία θετική τιμή int strcmp(const char *str1, const char *str2); Ένα αλφαριθμητικό θεωρείται μικρότερο από κάποιο άλλο αν: α) η τιμή του πρώτου μη κοινού χαρακτήρα είναι μικρότερη από την τιμή του αντίστοιχου χαρακτήρα στο δεύτερο αλφαριθμητικό, β) οι χαρακτήρες τους είναι οι ίδιοι, αλλά το μήκος του είναι μικρότερο
Διδιάστατοι πίνακες αλφαριθμητικών Μπορούμε να χειριστούμε το καθένα από τα N στοιχεία a[0], a[1],..., a[n-1] ενός διδιάστατου πίνακα, έστω char a[n][m], σαν δείκτη σε πίνακα που περιέχει τα Μ στοιχεία της αντίστοιχης γραμμής
Τέλος Ενότητας