Η γλώσσα C σε βάθος Κεφάλαιο 3: Προετοιµασία για αργότερα...61 Η C και η µνήµη...62 Ο τελεστής & Ο τελεστής sizeof Τρεις συναρτήσεις παρακ

Σχετικά έγγραφα
Περιεχόµενα. Πρόλογος... 15

Περιεχόμενα. Πρόλογος... 17

Περιεχόμενα. Πρόλογος... 21

#define, 70, 575 #elif, 580 #else, 580 #endif, 580 #error, 584 #if, 580 #ifdef, 583 #ifndef, 580, 583 #include, 70, 227, 574 #undef, 579

Βασικές Αρχές Προγραμματισμού

Περιεχόμενα. Λίγα λόγια για αυτή την έκδοση... 23

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

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

Επεξεργασία Αρχείων Κειµένου

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

Ενδεικτική περιγραφή μαθήματος

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

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

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

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Επανάληψη για τις Τελικές εξετάσεις

ΣΥΝΟΠΤΙΚΟΣ ΟΔΗΓΟΣ ΓΛΩΣΣΑΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

Διάλεξη 18η: Διαχείρηση Αρχείων

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Από την πρώτη στην τέταρτη έκδοση...

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

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

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

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

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

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

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

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

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

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

a = 10; a = k; int a,b,c; a = b = c = 10;

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

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

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

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

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

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

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

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

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

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

ΚΕΦΑΛΑΙΟ 2: Τύποι δεδομένων και εμφάνιση στοιχείων...33

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

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

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

ΕΝΔΕΙΚΤΙΚΕΣ ΣΕΛΙΔΕΣ. Περιεχόμενα. Πρόλογος... 21

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

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

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

H ΓΛΩΣΣΑ C. Μάθηµα 16: Είσοδος/Έξοδος: Συναρτήσεις Eξόδου. ηµήτρης Ψούνης

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

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

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

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

2 η Διάλεξη C++ Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

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

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

Περιεχόμενα. Κεφάλαιο 1: Εισαγωγή Κεφάλαιο 2: Μια πρώτη ματιά στη C

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

4 C Θεωρία και Πράξη. 6.8 Συναρτήσεις και στατικές μεταβλητές Αναδρομικές συναρτήσεις 119

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

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

είκτες και Πίνακες (2)

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

10 η Διάλεξη C++ - Πίνακες. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

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

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

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

Περιεχόμενα. Κεφάλαιο 1: Εισαγωγή Κεφάλαιο 2: Μια πρώτη ματιά στη C

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο. Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

Εισαγωγή στην επιστήμη των υπολογιστών

5. ΣΥΝΑΡΤΗΣΕΙΣ. (Πρόχειρο σχέδιο - Μαθήµατος 3) p Συναρτήσεις, που δεν επιστρέφουν κάποια τιµή

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

scanf() scanf() stdin scanf() printf() int float double %lf float

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

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

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

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. ( ιάλεξη 13) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

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

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

C Programming EPL032 Maria Stavrinou Ioannou Εισαγωγή στη Γλώσσα C

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

Προγραµµατιστικές Τεχνικές

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου)

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

ΕΡΓΑΣΤΗΡΙΟ 2 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Εργαστήριο 2. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

Ασκήσεις σε Επαναληπτικούς Βρόχους και Συναρτήσεις. Επανάληψη για την ενδιάμεση εξέταση. (Διάλεξη 13)

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

Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 131 Αρχές Προγραµµατισµού I 3-2

ΕΠΕΞΕΡΓΑΣΙΑ ΑΡΧΕΙΩΝ Λέµε αρχείο

Transcript:

Περιεχόµενα Πρόλογος...17 Κεφάλαιο 1: Εισαγωγή...19 Πώς να διαβάσετε αυτό το βιβλίο...20 Η γλώσσα C Ιστορική αναδροµή...22 Τα χαρακτηριστικά της C...22 C Μια δοµηµένη γλώσσα... 23 C Μια γλώσσα για προγραµµατιστές... 23 C Μια µεταφραστική γλώσσα... 23 Βασικές έννοιες του προγραµµατισµού...24 Μεταβλητές...24 Σταθερές...26 Εντολές...26 Αναγνωριστικά...27 Σχεδιασµός και ανάπτυξη προγραµµάτων...27 Λογικό διάγραµµα...28 Κεφάλαιο 2: Μια πρώτη µατιά στη C...37 Το πρώτο σας πρόγραµµα στη C...38 Η δοµή ενός προγράµµατος στη C...39 Σχόλια προγράµµατος... 41 ηλώσεις µεταβλητών... 42 Αρχικές τιµές µεταβλητών... 44 Μεταβλητές µόνο για ανάγνωση... 44 Προτάσεις... 44 Παραστάσεις... 45 Παραστάσεις µε µέλη διαφορετικού τύπου... 48 Λογικές παραστάσεις... 49 Παραδείγµατα κώδικα µε παραστάσεις... 51 Η C και οι αγκύλες της... 52 Σύνθετη πρόταση (compound statement)... 53 Ο προ-µεταγλωττιστής της C...54 Η οδηγία #include...54 Η οδηγία #define...54

Η γλώσσα C σε βάθος Κεφάλαιο 3: Προετοιµασία για αργότερα...61 Η C και η µνήµη...62 Ο τελεστής &... 63 Ο τελεστής sizeof... 64 Τρεις συναρτήσεις παρακαλώ...64 Η συνάρτηση printf()... 64 Η συνάρτηση scanf()... 67 Η συνάρτηση exit()... 69 Ολίγη if παρακαλώ...70 Κεφάλαιο 4: Ο τύπος δεδοµένων int...79 Σταθερές τύπου int...80 Μεταβλητές τύπου int...80 Ακέραιοι χωρίς πρόσηµο (unsigned)... 81 Αρχική τιµή µεταβλητής... 81 Αριθµητικοί τελεστές... 82 Χρήση συντµήσεων σε παραστάσεις... 84 Ο τελεστής υπολοίπου %... 85 υαδικοί αριθµοί...85 Μετατροπή δυαδικού σε δεκαδικό... 85 Μετατροπή δεκαδικού σε δυαδικό... 86 Οι δυαδικοί (bitwise) τελεστές... 87 Προτεραιότητα τελεστών...91 Κεφάλαιο 5: Ο τύπος δεδοµένων char...99 Σταθερές τύπου char...100 Οι χαρακτήρες είναι αριθµοί!!!... 100 Χαρακτήρες διαφυγής... 101 Μεταβλητές τύπου char...102 Τρεις συναρτήσεις χειρισµού χαρακτήρων... 102 H scanf() και τα µικρά της προβλήµατα!... 104 Συµβολοσειρές (character strings)... 107 Οι συµβολοσειρές έχουν τιµή;... 107 Πίνακας ASCII...109 Κεφάλαιο 6: Ο τύπος δεδοµένων float...115 Σταθερές τύπου float...116 Μεταβλητές τύπου float...116 8

Περιεχόµενα Χρήση δεδοµένων τύπου κινητής υποδιαστολής...117 Η χρήση της printf() µε δεδοµένα κινητής υποδιαστολής... 117 Χρήση της συνάρτησης scanf() µε δεδοµένα τύπου float... 118 Οι συναρτήσεις pow() και sqrt()... 119 Κεφάλαιο 7: Εντολές συνθήκης...123 Η εντολή if...124 H απλή πρόταση if... 124 Η πρόταση if-else... 125 Η πρόταση if - else if... 126 Η εντολή switch - case...128 Ο τελεστής?...130 Κεφάλαιο 8: Εντολές αλλαγής ροής και επανάληψης...141 Η "επικίνδυνη" εντολή goto...142 Ο βρόχος while...143 O βρόχος do-while...146 Ο βρόχος for...147 Ένθετοι βρόχοι for... 150 Ο τελεστής "κόµµα" (,)...153 Η εντολή break...154 Η εντολή continue...156 Καταµέτρηση και άθροιση σε επαναλαµβανόµενες διαδικασίες... 157 Υπολογισµός µέγιστου και ελάχιστου σε ένα σύνολο αριθµών... 159 Κεφάλαιο 9: Συναρτήσεις...171 Oρισµός µιας συνάρτησης...173 Συναρτήσεις χωρίς παραµέτρους... 174 Συναρτήσεις µε παραµέτρους... 175 Συναρτήσεις που επιστρέφουν τιµή...178 Συναρτήσεις που δεν επιστρέφουν τιµή...179 Η κλήση µιας συνάρτησης... 180 Παράµετροι συνάρτησης...183 Ορίσµατα και µεταβίβαση παραµέτρων... 183 Χρήση συναρτήσεων βιβλιοθήκης...185 Σύνταξη των συναρτήσεων βιβλιοθήκης... 187 Μετατροπή τύπου (type casting)...188 Αυτόµατη µετατροπή τύπου... 189 9

Η γλώσσα C σε βάθος Κεφάλαιο 10: Εµβέλεια µεταβλητών...199 Τοπικές µεταβλητές (local variables)...200 Καθολικές µεταβλητές (global variables)...204 ήλωση τοπικών µεταβλητών σε σύνθετη πρόταση...207 Στατικές τοπικές µεταβλητές (static local variables)...207 Κεφάλαιο 11: είκτες...219 Μεταβλητές δείκτη (Pointer variables)...221 ήλωση µιας µεταβλητής δείκτη...221 Οι τελεστές & και *...223 Μέχρι τώρα µάθαµε ότι......226 Αριθµητική των δεικτών...226 είκτες τύπου Void...229 είκτης NULL...230 Εµφάνιση διευθύνσεων και περιεχόµενα δεικτών...230 είκτες και συναρτήσεις...231 Συναρτήσεις που επιστρέφουν δείκτη... 233 Παραστάσεις αριστερής τιµής (lvalues)... 234 Κεφάλαιο 12: Πίνακες (arrays)...245 Πίνακες µίας διάστασης...246 Οι πίνακες µίας διάστασης και οι δείκτες...248 Προσοχή Προσοχή!!!...249 Μεταβίβαση ενός πίνακα ως παραµέτρου µιας συνάρτησης...250 Πίνακες χαρακτήρων...252 Η χρήση της printf() και της scanf() µε πίνακες χαρακτήρων... 253 Χειρισµός συµβολοσειρών...254 Συναρτήσεις που εφαρµόζονται σε συµβολοσειρές... 255 Αρχική τιµή ενός πίνακα µίας διάστασης...261 Χειρισµός πινάκων µιας διάστασης...262 Πίνακες πολλών διαστάσεων...265 Πίνακες δύο διαστάσεων...265 Πίνακες δύο διαστάσεων και δείκτες...267 Πίνακες συµβολοσειρών...269 Μεταβίβαση πινάκων πολλών διαστάσεων σε συναρτήσεις... 271 Απεικόνιση πινάκων πολλών διαστάσεων... 273 Περιπτώσεις επεξεργασίας πινάκων δύο διαστάσεων (2 )...275 10

Περιεχόµενα Γέµισµα πίνακα 2 µε τυχαίους αριθµούς... 275 Άθροισµα των στοιχείων ενός πίνακα 2... 276 Εύρεση της µεγαλύτερης και της µικρότερης τιµής σε έναν πίνακα 2... 277 Εύρεση ενός αριθµού σε έναν πίνακα 2... 278 Μορφοποιηµένη εµφάνιση ενός πίνακα 2... 278 Εµφάνιση του αθροίσµατος κάθε γραµµής ενός πίνακα 2... 279 Εµφάνιση της µέγιστης τιµής κάθε στήλης ενός πίνακα 2... 279 Ένα όλοκληρωµένο πρόγραµµα επεξεργασίας ενός πίνακα 2... 280 Κεφάλαιο 13: Tύποι δεδοµένων οριζόµενοι από το χρήστη (User-Defined data types)...295 οµές (structures)...296 Αναφορά στα πεδία µιας δοµής... 300 Πίνακες από δοµές... 301 Μεταβίβαση των πεδίων µιας δοµής σε µια συνάρτηση...302 Μεταβίβαση ολόκληρης της δοµής σε συνάρτηση...303 είκτες σε δοµές...307 Πίνακες από δοµές και δείκτες... 309 οµές µέσα σε δοµές (ένθετες δοµές))...309 Και όµως γίνεται...... 310 Πεδία εύρους ενός, ή περισσοτέρων, bits (bit fields)...311 Ενώσεις (unions)...313 Απαριθµήσεις (Enumerations)...314 Η χρήση της typedef...315 Κεφάλαιο 14: Κανάλια επικοινωνίας - Χειρισµός αρχείων...323 Κανάλια (ρεύµατα) επικοινωνίας...324 Προκαθορισµένα ρεύµατα...325 Είδη ρευµάτων...325 Χειρισµός αρχείων...326 Αρχεία κειµένου και δυαδικά αρχεία...326 Σειριακή και τυχαία προσπέλαση...327 Άνοιγµα/κλείσιµο αρχείου...329 fopen()... 330 fclose()... 333 ferror()... 333 fflush()... 334 fflushall()... 334 11

Η γλώσσα C σε βάθος Αρχεία κειµένου (text files)...335 fputc()... 335 fgetc()... 335 fprintf()... 336 fscanf()... 337 feof()... 33 9 fgets()... 341 fputs()... 342 υαδικά αρχεία (binary files) και τυχαία προσπέλαση...343 fseek()... 343 rewind()... 344 fread()... 344 fwrite()... 345 Η λογική της τυχαίας προσπέλασης... 346 Κεφάλαιο 15: Προχωρηµένα θέµατα συναρτήσεων...361 Αναδροµή...362 Παράµετροι γραµµής εντολής...364 είκτες σε συναρτήσεις!!!...367 ήλωση δείκτη σε συνάρτηση... 368 Ανάθεση τιµής σε µεταβλητή δείκτη σε συνάρτηση... 368 Κλήση συνάρτησης µε τη χρήση ενός δείκτη σε συνάρτηση... 369 Έλεγχος των περιεχοµένων ενός δείκτη σε συνάρτηση... 370 είκτες σε συναρτήσεις ως παράµετροι... 371 Πίνακες δεικτών σε συναρτήσεις... 371 Εµβόλιµες συναρτήσεις (inline functions)...372 Προγράµµατα µε πολλά πηγαία αρχεία...374 Ο µεταγλωττιστής GCC... 375 Μεταγλώττιση και σύνδεση ξεχωριστών αρχείων... 376 ηµιουργία δικών µας βιβλιοθηκών... 378 Συνοψίζοντας...... 381 Κεφάλαιο 16: Αναζήτηση και ταξινόµηση...393 Σειριακή αναζήτηση...395 υαδική αναζήτηση (binary search)...397 Ταξινόµηση φυσαλίδας (bubble sort)...400 Ταξινόµηση επιλογής (selection sort)...403 Ταξινόµηση quick sort...405 12

Περιεχόµενα Ταξινόµηση πινάκων δύο διαστάσεων...410 Ταξινόµηση πίνακα συµβολοσειρών... 412 Κεφάλαιο 17: υναµική διαχείριση µνήµης...419 υναµική κατανοµή µνήµης...422 Η συνάρτηση malloc()... 423 Η συνάρτηση calloc()... 424 Η συνάρτηση free()... 425 Η συνάρτηση realloc()... 425 Κεφάλαιο 18: υναµικές δοµές δεδοµένων...431 Συνδεδεµένες λίστες...433 Απλά συνδεδεµένη λίστα (simple linked list)...433 Κυκλικά συνδεδεµένη λίστα (circularly linked list)...434 ιπλά συνδεδεµένη λίστα (double linked list)...434 Κυκλικά διπλά συνδεδεµένη λίστα...435 Προσθήκη νέου κόµβου σε µια λίστα...435 Προσθήκη νέου κόµβου σε απλά συνδεδεµένη λίστα... 435 Υλοποίηση συνδεδεµένης λίστας στη C...437 ιατεταγµένη συνδεδεµένη λίστα... 441 Υλοποίηση της δοµής στοίβας... 442 Υλοποίηση της δοµής ουράς... 446 υαδικά δένδρα...450 Χειρισµός ενός δυαδικού δένδρου...452 Προσθήκη νέου κόµβου...452 Αναζήτηση κόµβου...455 ιάσχιση ενός δυαδικού δέντρου...456 ιάσχιση κατά σειρά (in-order)... 456 ιάσχιση κατά προδιάταξη (pre-order)... 457 ιάσχιση κατά µεταδιάταξη (post-order)... 458 ιαγραφή κόµβου από το δυαδικό δένδρο...458 ιαγραφή κόµβου χωρίς θυγατρικούς κόµβους... 459 ιαγραφή κόµβου µε ένα θυγατρικό κόµβο... 459 ιαγραφή κόµβου µε δύο θυγατρικούς κόµβους... 459 ιαγραφή του κόµβου ρίζας... 460 Υλοποίηση της δοµής δυαδικού δένδρου...461 13

Η γλώσσα C σε βάθος Κεφάλαιο 19: Από τη C, στη C++...477 C++, η κληρονοµιά από τη C...478 C++, µια αντικειµενοστρεφής γλώσσα...479 Αντικειµενοστρεφής προγραµµατισµός...480 Κλάσεις και αντικείµενα (classes and objects)... 482 Ενθυλάκωση (Encapsulation)... 485 Κληρονοµικότητα (Inheritance)... 486 Πολυµορφισµός (Polymorphism)... 487 Το πρώτο µας πρόγραµµα σε C++...489 Παίζοντας µε αντικείµενα...489 Το αντικείµενο cout... 490 Το αντικείµενο cin... 492 ιαφορές µεταξύ C και C++...495 Μερικά από τα νέα διαδικαστικά χαρακτηριστικά της C++... 496 Τα αντικειµενοστρεφή χαρακτηριστικά της C++... 499 Παράρτηµα Α: Συναρτήσεις βιβλιοθήκης της C...503 Η τυπική βιβλιοθήκη της C...504 <ctype.h>...504 int islower(int c);... 504 int isupper(int c);... 505 int isprint(int c);... 505 int tolower(int c);... 505 int toupper(int c);... 505 <math.h>...505 double exp(double x);... 505 double log(double x);... 506 double log10(double x);... 506 double pow(double x, double y);... 506 double sqrt(double x);... 507 double fabs(double x);... 507 int abs(int x);... 507 double sin(double x);... 507 double cos(double x);... 508 double tan(double x);... 508 <stdio.h>...508 EOF... 508 FOPEN_MAX... 508 14

Περιεχόµενα NULL... 508 SEEK_CUR... 508 SEEK_END... 509 SEEK_SET... 509 stdin... 509 stdout... 509 stderr... 510 FILE... 510 FILE *fopen(char *filename, char *mode);... 510 FILE *freopen(char *filename, char *mode, FILE *fp);... 510 int fflush(file *fp);... 511 int fclose(file *fp);... 511 int remove(char *filename);... 511 int rename(char *oldname, char *newname);... 511 int fprintf(file *fp, char *format, παράµετροι,...,...);... 511 int printf(char *format,...);... 512 int sprintf(char *s, char *format,...);... 512 int fscanf(file *fp, char *format, διευθύνσεις,...);... 512 int scanf(char *format,...);... 512 int sscanf(char *s, char *format,...);... 513 int fgetc(file *fp);... 513 char *fgets(char *s, int n, FILE *fp);... 513 int fputc(int c, FILE *fp);... 513 char *fputs(char *s, FILE *fp);... 513 int getc(file *fp);... 513 int getch();... 514 char *gets(char *s);... 514 int putc(int c, FILE *fp);... 514 int putch(int c);... 514 int puts(char *s);... 514 int fread(void *ptr, int size, int num, FILE *fp);... 514 int fwrite(void* ptr, int size, int num, FILE *fp);... 515 int fseek(file *fp, int apostasi, int thesi);... 515 void rewind(file *fp);... 515 int feof(file *fp);... 515 <stdlib.h>...515 NULL... 515 void *calloc(int num, int size);... 515 void *malloc(int size);... 516 15

Η γλώσσα C σε βάθος void *realloc(void *p, int size);... 516 void free(void *p);... 516 void exit(int status);... 516 int system(char *s);... 516 int rand();... 517 void srand(unsigned int seed);... 518 int atoi(char *str);... 518 double atof(char *str);... 519 <string.h>...520 NULL... 520 char *strcpy(char *str1, char *str2);... 520 char *strncpy(char *str1, char *str2, n);... 520 char *strcat(char *str1, char *str2);... 520 char *strncat(char *str1, char *str2, n);... 520 int strcmp(char *str1, char *str2);... 520 int strncmp(char *str1, char *str2, n);... 521 char *strchr(char *str, int c);... 521 char *strrchr(char *str, int c);... 522 char *strstr(char *str1, char *str2);... 522 int strlen(char *str);... 522 Παράρτηµα Β: Το ολοκληρωµένο περιβάλλον του DEV C++...523 Εγκατάσταση του DEV C++...524 Οι βασικές λειτουργίες του DEV C++...525 ηµιουργία απλού προγράµµατος µε ένα πηγαίο αρχείο... 525 Αποθήκευση του αρχείου... 525 Σύνταξη του κώδικα... 526 Μεταγλώττιση και εκτέλεση του προγράµµατος... 526 ηµιουργία νέου έργου (µε περισσότερα πηγαία αρχεία)... 527 Επιλογή του είδους του έργου... 527 Προσθήκη πηγαίων αρχείων, µεταγλώττιση και εκτέλεση του έργου... 527 Παράθυρο αποτελεσµάτων... 528 Το DEV C++ και οι Ελληνικοί χαρακτήρες... 528 Βιβλιογραφία...529 Βιβλιογραφικές πηγές...530 Αναφορές στο διαδίκτυο...530 Ευρετήριο...533 16

Η γλώσσα C σε βάθος Μια πρώτη µατιά στη C Στο κεφάλαιο αυτό ξεκινά µια µικρή "περιοδεία" στη γλώσσα C. Γίνεται µια πρώτη γνωριµία, ώστε να αποκτήσει ο αναγνώστης µια σφαιρική εικόνα της δοµής και των χαρακτηριστικών της γλώσσας. Τα περισσότερα από όσα αναφέρονται στο παρόν κεφάλαιο θα εξεταστούν ξανά και πιο αναλυτικά στα επόµενα κεφάλαια. Το πρώτο σας πρόγραµµα στη C Έφτασε η ώρα να γράψετε το πρώτο σας πρόγραµµα στη C, το οποίο δεν θα µπορούσε να είναι άλλο από το κλασικό "Hello world". #include <stdio.h> main() printf("hello world"); Το πρόγραµµα αποτελείται µόνο από µία συνάρτηση, τη main() και εµφανίζει στην οθόνη τη φράση Hello world. Παρακάτω επεξηγούνται µία-µία οι προτάσεις του προγράµµατος. #include <stdio.h> Η πρόταση αυτή αναγκάζει το µεταγλωττιστή της C να συµπεριλάβει το αρχείο stdio.h κατά τη διαδικασία της µεταγλώττισης. Το αρχείο αυτό περιέχει τις δηλώσεις των συναρτήσεων εισόδου/εξόδου της C. Για να µπορέσουµε να χρησιµοποιήσουµε οποιαδήποτε από αυτές τις λειτουργίες εισόδου/εξόδου στο πρόγραµµά µας (π.χ. τη συνάρτηση printf () που ακολουθεί), θα πρέπει οπωσδήποτε 3 να συµπεριληφθεί (#include) το συγκεκρι- µένο αρχείο. main() Η συνάρτηση main() είναι υποχρεωτική σε κάθε πρόγραµµα της C. Στην περίπτωση που το πρόγραµµά µας έχει µόνο µία συνάρτηση, αυτή πρέπει 3 Αρκετά ολοκληρωµένα περιβάλλοντα ανάπτυξης (IDE) συµπεριλαµβάνουν κατά τη διαδικασία της µεταγλώττισης συνηθισµένα αρχεία κεφαλίδας ακόµα και αν δεν έχουν ορισθεί ρητά στον κώδικα του προγράµµατος. Αυτό έχει σαν αποτέλεσµα να επιτρέπουν τη χρήση µερικών συναρτήσεων ακόµη και αν ο προγραµµατιστής δεν έχει συµπεριλάβει το αρχείο κεφαλίδας στο οποίο δηλώνονται. 38

Κεφάλαιο 2: Μια πρώτη µατιά στη C να είναι η main(). Αν το πρόγραµµά µας περιέχει περισσότερες από µία συναρτήσεις, η main() είναι η πρώτη που εκτελείται. Η αριστερή αγκύλη σηµατοδοτεί την αρχή των προτάσεων της συνάρτησης main(). printf("hello world"); Η συνάρτηση printf() χρησιµοποιείται για την έξοδο πληροφοριών στην οθόνη. Στη συγκεκριµένη περίπτωση θα εµφανίσει το κείµενο "Hello world". Η δεξιά αγκύλη σηµατοδοτεί το τέλος των προτάσεων της συνάρτησης main(). Στη συνέχεια του βιβλίου, σε πολλά παραδείγµατα, χάριν συντοµίας η πρόταση #include <stdio.h> µπορεί να παραλείπεται και να εµφανίζεται µόνο η συνάρτηση main(). Αν θέλουµε να χρησιµοποιήσουµε τον κώδικα στην πράξη, η πρόταση αυτή θα πρέπει να προστεθεί πριν από τη main(). Προσοχή, τα κενά διαστήµατα και οι αλλαγές γραµµής δεν λαµβάνονται υπόψη από τον µεταγλωττιστή της C. Εποµένως το παραπάνω πρόγραµµα θα µπορούσε, χωρίς κανένα πρόβληµα, να γραφεί ως εξής: #include <stdio.h> main() printf("hello world"); Η δοµή ενός προγράµµατος στη C Ένα απλό πρόγραµµα στη C αποτελείται συνήθως από 3 βασικά τµήµατα: Μία συνάρτηση µε όνοµα main(): Αυτή η συνάρτηση είναι αυτή που καλείται και εκτελείται πρώτη. Κάθε πρόγραµµα πρέπει να έχει µία και µόνο µία συνάρτηση main(). Η συνάρτηση main(), όπως και κάθε συνάρτηση της C, έχει την παρακάτω µορφή: main() 39

Η γλώσσα C σε βάθος δηλώσεις µεταβλητών; εκτελέσιµες προτάσεις; ηλώσεις µεταβλητών: Όλες οι µεταβλητές που χρησιµοποιούνται σε ένα πρόγραµµα της C πρέπει να έχουν προηγουµένως δηλωθεί. Μία δήλωση µεταβλητής περιλαµβάνει το όνοµα της µεταβλητής και τον τύπο της (µπορεί επίσης να περιλαµβάνει και την αρχική της τιµή). Έτσι, η πρόταση int a,b; δηλώνει δύο ακέραιες µεταβλητές µε ονόµατα a και b. Κάθε δηλωτική πρόταση, τερµατίζεται µε ελληνικό ερωτηµατικό (;). Εκτελέσιµες προτάσεις: Μετά από τις δηλώσεις µεταβλητών πρέπει να ακολουθούν οι εκτελέσιµες προτάσεις (εντολές ή παραστάσεις) του προγράµµατος. Κάθε εκτελέσιµη πρόταση τερµατίζεται µε ελληνικό ερωτηµατικό (;). Ένα πιο σύνθετο πρόγραµµα περιλαµβάνει περισσότερες συναρτήσεις πέρα από τη συνάρτηση main(): main() δηλώσεις µεταβλητών της συνάρτησης main(); εκτελέσιµες προτάσεις της συνάρτησης main(); function1() δηλώσεις µεταβλητών της συνάρτησης function1(); εκτελέσιµες προτάσεις της συνάρτησης function1(); function2() δηλώσεις µεταβλητών της συνάρτησης function2(); εκτελέσιµες προτάσεις της συνάρτησης function2(); 40

Κεφάλαιο 2: Μια πρώτη µατιά στη C Παρατηρούµε ότι µπορούµε να δηλώνουµε ξεχωριστές µεταβλητές σε κάθε συνάρτηση. Οι µεταβλητές αυτές καλούνται τοπικές µεταβλητές (local variables) και µπορούν να χρησιµοποιηθούν µόνο µέσα στις συναρτήσεις στις οποίες δηλώθηκαν. Στο Κεφάλαιο 10 αναλύονται σε βάθος η χρήση και οι ιδιότητες των τοπικών µεταβλητών. Σχόλια προγράµµατος Ο σωστός σχεδιασµός ενός προγράµµατος επιβάλει τη χρήση σχολίων µέσα στο ίδιο το πρόγραµµα µε σκοπό να το κάνει περισσότερο ευανάγνωστο και κατανοητό. Τα σχόλια µπορούν να περιλαµβάνουν οποιοδήποτε µήνυµα, αρχίζουν µε το ζεύγος των χαρακτήρων /* και τελειώνουν µε τους χαρακτήρες */. Ακολουθεί ένα παράδειγµα µιας συνάρτησης main() µε σχόλια. /* Το πρώτο µου πρόγραµµα στη C Μυτιλήνη 24/10/1983 */ main() /*η χρήση της συνάρτησης printf()*/ printf("hello world\n"); /*Εµφανίζει ένα σύνολο χαρακτήρων*/ Παρατηρούµε ότι σχόλια µπορούν να µπουν οπουδήποτε µέσα σε ένα πρόγραµµα της C: είτε στην αρχή, είτε ενδιάµεσα στον κώδικα. Αρκετοί µεταγλωττιστές της C και της C++, µεταξύ των οποίων και ο DEV C++, αναγνωρίζουν "σχόλια γραµµής" τα οποία ξεκινάνε µε δύο συνεχόµενες καθέτους (//). Για παράδειγµα: // Το πρώτο µου πρόγραµµα στη C // Μυτιλήνη // 24/10/1983 main() 41

Η γλώσσα C σε βάθος printf("hello world\n"); //Θα εµφανίσει το κείµενο Hello world Όταν ο µεταγλωττιστής (compiler) της C εντοπίσει το συνδυασµό /* αγνοεί οτιδήποτε βρει µέσα στο πρόγραµµα µέχρι το επόµενο */. Αρκετοί µεταγλωττιστές αγνοούν επίσης και οτιδήποτε υπάρχει µετά από διπλή κάθετο (//) µέχρι το τέλος της γραµµής. ηλώσεις µεταβλητών Πριν χρησιµοποιηθεί οποιαδήποτε µεταβλητή, πρέπει πρώτα να έχει δηλωθεί. Στην πρόταση της δήλωσης ενηµερώνουµε το µεταγλωττιστή της C για το όνο- µα και τον τύπο της µεταβλητής. Η σύνταξη µιας δηλωτικής πρότασης στη C έχει την παρακάτω µορφή: type όνοµα1,όνοµα2,... όνοµαν; όπου type ο τύπος δεδοµένων των µεταβλητών και όνοµα1, όνοµα2,... όνοµαν είναι ονόµατα µεταβλητών. Οι βασικοί τύποι µεταβλητών στη C είναι τρεις: int Ακέραια µεταβλητή. Περιέχει ακέραιο αριθµό char Μεταβλητή χαρακτήρα. Περιέχει ένα χαρακτήρα. float Πραγµατική µεταβλητή. Περιέχει πραγµατικό αριθµό κινητής υποδιαστολής (µε δεκαδικά ψηφία). Πέρα από τους παραπάνω τύπους, υπάρχουν και άλλοι τύποι µεταβλητών, που θα αναλυθούν αργότερα και οι οποίοι στηρίζονται σε αυτούς τους τρεις βασικούς τύπους. Τα ονόµατα των µεταβλητών, αλλά και άλλων οντοτήτων της C (π.χ. συναρτήσεις, δοµές) ακολουθούν τους παρακάτω κανόνες: Το όνοµα µιας µεταβλητής µπορεί να αποτελείται από χαρακτήρες, αριθµούς, και το χαρακτήρα υπογράµµισης "_". Ο πρώτος χαρακτήρας του ονόµατος πρέπει να είναι γράµµα. Το πλήθος των χαρακτήρων του ονόµατος θεωρητικά είναι απεριόριστο αλλά µπορεί να µεταβάλλεται από έκδοση σε έκδοση. 42

Κεφάλαιο 2: Μια πρώτη µατιά στη C Οι ίδιοι περιορισµοί ισχύουν και για όλα τα άλλα αναγνωριστικά που ορίζονται από το χρήστη, όπως ονόµατα συναρτήσεων, τύπων κ.λπ., τα οποία θα συναντήσουµε αργότερα. εν επιτρέπεται η χρήση Ελληνικών χαρακτήρων σε ονόµατα µεταβλητών. Έτσι, µπορούµε π.χ. να έχουµε µεταβλητές µε τα ονόµατα: a teliko_apotelesma a23 αλλά όχι µε τα ονόµατα: Τελικό_σύνολο 23a number of students Ελληνικοί χαρακτήρες Ξεκινάει από αριθµό Περιέχει κενά διαστήµατα Οι παρακάτω δηλωτικές προτάσεις αντιστοιχούν σε τέσσερις µεταβλητές διαφορετικών τύπων: int number_of _students, a2; Με την πρόταση αυτή δηλώνουµε δύο ακέραιες µεταβλητές µε ονόµατα number_of_students και a2. char apantisi; Με την πρόταση αυτή δηλώνουµε µία µεταβλητή χαρακτήρα µε όνοµα apantisi. float mesos_oros; Με την πρόταση αυτή δηλώνουµε µία πραγµατική µεταβλητή µε ό- νοµα mesos_oros. Στη C οι πεζοί και οι κεφαλαίοι χαρακτήρες είναι διακριτοί. Αυτό σηµαίνει ότι η µεταβλητή a είναι διαφορετική από την A. Επίσης, όλες οι εντολές και συναρτήσεις βιβλιοθήκης της C συντάσσονται µε πεζούς χαρακτήρες. 43

Η γλώσσα C σε βάθος Αρχικές τιµές µεταβλητών Στην πρόταση δήλωσης µιας µεταβλητής είναι δυνατόν ταυτόχρονα να της α- ναθέσουµε και µία τιµή. Για παράδειγµα: int a=4,b; float c=4.6,m; char ch='a'; Οι παραπάνω προτάσεις είναι δηλωτικές για τις µεταβλητές a, b, c, m και ch και ταυτόχρονα καταχωρίζουν στις µεταβλητές a, c και ch τις τιµές 4, 4.6, και 'Α' αντίστοιχα. Μεταβλητές µόνο για ανάγνωση Στη C µπορούµε να δηλώσουµε µεταβλητές στις οποίες να δώσουµε αρχική τι- µή χωρίς όµως στη συνέχεια να µπορούµε να µεταβάλλουµε το περιεχόµενό τους. Μια τέτοια µεταβλητή δηλώνεται όπως και οι υπόλοιπες, προσθέτοντας µπροστά από τον τύπο της το διακριτικό const. const int a=8; const float c=4.6; Οι παραπάνω προτάσεις δηλώνουν δύο µεταβλητές µόνο για ανάγνωση a και c, µε αρχικές τιµές 8 και 4.6 αντίστοιχα. Στις µεταβλητές αυτές δεν επιτρέπεται να αναθέσουµε αργότερα άλλες τιµές. Η χρήση τέτοιου είδους µεταβλητών είναι πολύ περιορισµένη. ΠΡΟΣΟΧΗ όταν δηλώνουµε µεταβλητές µόνο για ανάγνωση πρέπει απαραίτητα να τις δίνουµε αρχική τιµή. Προτάσεις Στη C µπορεί να έχουµε δύο ειδών προτάσεις: Tις προτάσεις δήλωσης Tις εκτελέσιµες προτάσεις (εντολές, παραστάσεις ή κλήσεις συναρτήσεων) Οι προτάσεις δήλωσης, πέρα από αυτές που δηλώνουν µεταβλητές, όπως αναφέραµε προηγουµένως, µπορεί να δηλώνουν συναρτήσεις ή µεταβλητές κά- 44

Κεφάλαιο 2: Μια πρώτη µατιά στη C ποιου σύνθετου τύπου. Προς το παρόν, µέχρι να φτάσουµε στο σηµείο να αναφερθούµε σε αυτές τις διαφορετικές προτάσεις δήλωσης, θα έχουµε υπόψη µόνο τις προτάσεις που δηλώνουν µεταβλητές των τριών βασικών τύπων (int, char, και float). Οι εκτελέσιµες προτάσεις είναι εντολές, παραστάσεις ή κλήσεις συναρτήσεων που εκτελούν κάποια συγκεκριµένη λειτουργία. Στο παρακάτω παράδειγµα, main() int x,y; ηλωτική πρόταση x=5; Εκτελέσιµη πρόταση y=x+4*20; Εκτελέσιµη πρόταση η πρώτη πρόταση είναι δηλωτική και οι δύο επόµενες εκτελέσιµες. Παρατηρούµε ότι στο συγκεκριµένο παράδειγµα οι εκτελέσιµες προτάσεις µπορεί να αποτελούνται από απλές παραστάσεις, οι οποίες συνθέτουν άλλες πιο πολύπλοκες παραστάσεις. Στην επόµενη παράγραφο αναλύεται η φιλοσοφία των παραστάσεων στη C. Παραστάσεις Μια παράσταση αποτελείται από σταθερές, µεταβλητές, και συναρτήσεις, συνήθως σε συνδυασµό µε αριθµητικούς (π.χ. +, -, /) ή λογικούς τελεστές (π.χ. <, <=, ==). Σταθερές (constants): Μια σταθερά µπορεί να είναι του τύπου int, char, ή float και συνήθως δεν αποτελεί από µόνη της µια πρόταση σε ένα πρόγραµµα της C (αν και συντακτικά αυτό είναι δυνατόν, όπως θα αναφέρουµε παρακάτω). Παραδείγµατα σταθερών είναι: 7 σταθερά τύπου int 123.4 σταθερά τύπου float 'A' σταθερά τύπου char 45

Η γλώσσα C σε βάθος Όπως κάθε παράσταση, έτσι και οι σταθερές έχουν µία τιµή και έναν τύπο. Π.χ. η σταθερά 123.4 έχει τιµή 123.4 και τύπο float. Μεταβλητές (variables): Το όνοµα µιας µεταβλητής αποτελεί από µόνο του µια απλή παράσταση. Παραστάσεις µε µία µεταβλητή συνήθως δεν αποτελούν από µόνες τους µια πρόταση αλλά συνήθως συνδυάζονται µε άλλες παραστάσεις. Ακολουθούν παραδείγµατα χρήσης µεταβλητών σε παραστάσεις: Μεταβλητή ως απλή παράσταση: a; Μεταβλητή ως τµήµα µιας σύνθετης παράστασης: a + 6; Η τιµή της παραπάνω παράστασης υπολογίζεται ως το άθροισµα του περιεχο- µένου της µεταβλητής a και του 6. b = a + 6; Σε αυτή την περίπτωση, ο τελεστής ίσον (=) καταχωρίζει το αποτέλεσµα της παράστασης a + 6 στη µεταβλητή b. Στη C το ίσον (=) είναι ένας απλός τελεστής όπως και οι γνωστοί αριθµητικοί τελεστές (+,-...) και δεν αποτελεί µια εντολή ανάθεσης όπως σε άλλες γλώσσες προγραµµατισµού. Ο τελεστής ίσον (=) καταχωρίζει το αποτέλεσµα της παράστασης που βρίσκεται δεξιά του, στη µεταβλητή που εµφανίζεται στα αριστερά του. Αριστερά από έναν τελεστή ίσον (=) επιτρέπεται να εµφανίζεται µόνο το όνοµα µιας µεταβλητής 4. Μια παράσταση που περιέχει τον τελεστή ανάθεσης = έχει και αυτή µία τι- µή, όπως έχει και οποιαδήποτε άλλη παράσταση. Η τιµή µιας τέτοιας παράστασης είναι η τιµή που καταχωρίζεται στη µεταβλητή αριστερά του ίσον. Τα παρακάτω παραδείγµατα κάνουν σαφή τη χρήση του τελεστή =. Παραστάσεις που απαγορεύονται ρητά σε άλλες γλώσσες προγραµµατισµού, όχι µόνο επιτρέπονται, αλλά χρησιµοποιούνται ευρέως από τους προγραµµατιστές της C. 4 Για την ακρίβεια αριστερά του τελεστή =, εκτός από όνοµα µεταβλητής, επιτρέπεται οποιαδήποτε παράσταση αναφέρεται σε θέση µνήµης. Τέτοιου είδους παραστάσεις λέγονται lvalues και θα τις συναντήσουµε αργότερα (βλέπε σελίδα 234). 46

Κεφάλαιο 2: Μια πρώτη µατιά στη C a = 5; Ο τελεστής = καταχωρίζει το 5 στη µεταβλητή a και το αποτέλεσµα της παράστασης a = 5 είναι το 5. b = a = 5; Η παράσταση αυτή καταχωρίζει το 5 και στη µεταβλητή a, και στη µεταβλητή b. Αν σκεφτούµε αυτή την παράσταση ως b = (a = 5), η παράσταση a = 5 καταχωρίζει στην a το 5 και έχει αποτέλεσµα 5. Έτσι, δεξιά από το πρώτο = η τι- µή της παράστασης είναι 5, το οποίο καταχωρίζεται στην b. Το αποτέλεσµα όλης της παράστασης είναι πάλι το 5. ΠΡΟΣΟΧΗ πρέπει να δοθεί στο γεγονός ότι µια µεταβλητή στη C, πριν να της ανατεθεί κάποια τιµή, έχει απροσδιόριστο περιεχόµενο (και όχι 0 ή κενό όπως συµβαίνει σε άλλες γλώσσες). Για παράδειγµα, αν θεωρήσουµε τις παρακάτω προτάσεις: int a,b,c; a=5; c=a+b; η µεταβλητή c θα πάρει απροσδιόριστη τιµή διότι στη b δεν έχει πρηγουµένως ανατεθεί κάποια τιµή. Πιο σύνθετα παραδείγµατα θα αναφέρουµε σε επόµενες παραγράφους, όταν θα αναφερθούµε στους υπόλοιπους τελεστές της C και στην προτεραιότητα των πράξεων. Συναρτήσεις: Μια συνάρτηση µπορεί από µόνη της να αποτελέσει µια πρόταση ή να µετέχει σε µια παράσταση. Μια συνάρτηση καλείται χρησιµοποιώντας µόνο το όνοµά της. Μόλις εκτελεστεί ο κώδικας της συνάρτησης, ο έλεγχος του προγράµµατος ε- πιστρέφει αµέσως µετά το ση- µείο κλήσης της συνάρτησης. 47

Η γλώσσα C σε βάθος Κάθε συνάρτηση στη C επιστρέφει µία τιµή (εκτός αν έχει συγκεκριµένα δηλωθεί ότι δεν θα επιστρέψει τιµή). Μια συνάρτηση στη C µπορεί να είναι µια συνάρτηση βιβλιοθήκης, δηλαδή µια έ- τοιµη συνάρτηση µε προκαθορισµένη λειτουργία, ή να ορίζεται µέσα στο ίδιο το πρόγραµµα ως ξεχωριστό τµήµα προγράµµατος. Μια συνάρτηση παίρνει πληροφορίες από το πρόγραµµα που την καλεί (µέσω των παραµέτρων της), εκτελεί τη λειτουργία για την οποία σχεδιάστηκε, και τελικά επιστρέφει στο πρόγραµµα που την κάλεσε. Μια συνάρτηση εκτελεί οπωσδήποτε µια συγκεκριµένη λειτουργία, µπορεί όµως να µην έχει καµία παράµετρο και να µην επιστρέφει καµία τιµή (ή η τιµή που επιστρέφει να µη χρησιµοποιείται από το πρόγραµµα). Παραστάσεις µε µέλη διαφορετικού τύπου Σε µια παράσταση µπορούν να µετέχουν µέλη διαφορετικού τύπου. Το ερώτη- µα είναι τι τύπου θα είναι το αποτέλεσµα της παράστασης; Αν ιεραρχήσουµε τους τύπους δεδοµένων της C, η σειρά από τον ιεραρχικά χαµηλότερο προς τον υψηλότερο είναι: char, int, float, και double (πραγµατικός τύπος δεδοµένων αλλά µε περισσότερη ακρίβεια στα δεκαδικά ψηφία). Το αποτέλεσµα µιας παράστασης είναι του ίδιου τύπου δεδοµένων µε τον τύπο του ιεραρχικά υψηλότερου µέλους της παράστασης. int a,b; float c; a=10; b=5; c=(a+b)/2; // ήλωση δύο ακεραίων µεταβλητών a και b // ήλωση µιας πραγµατικής µεταβλητής c //Καταχώριση της τιµής 10 στη µεταβλητή a //Καταχώριση της τιµής 5 στη µεταβλητή b //Καταχώριση του αποτελέσµατος της παράστασης στη µεταβλητή c Στο παραπάνω παράδειγµα, ενώ περιµένουµε η τιµή του c να είναι 7.5 (15/2), θα είναι 7. Αυτό γίνεται διότι η παράσταση (a+b)/2 έχει αποτέλεσµα int, εφόσον όλα τα µέλη της είναι τύπου int και δεν επιστρέφει δεκαδικά ψηφία. Αν θέλουµε να έχουµε το σωστό αποτέλεσµα (το 7.5), θα πρέπει η παράσταση να γραφεί µε τον ακόλουθο τρόπο: c=(a+b)/2.0; 48

Κεφάλαιο 2: Μια πρώτη µατιά στη C Σε αυτή την περίπτωση, επειδή η σταθερά 2.0 είναι τύπου float, η παράσταση (a+b)/2.0 επιστρέφει τιµή float. Στην παράσταση αυτή ο τύπος float είναι ο ιεραρχικά υψηλότερος από τους τύπους των υπόλοιπων µελών της παράστασης. Λογικές παραστάσεις Μια λογική παράσταση απαρτίζεται από µία ή περισσότερες λογικές φράσεις οι οποίες συνδέονται µεταξύ τους µε συνδετικούς τελεστές. Μια λογική φράση, είναι µια σύγκριση µε χρήση συγκριτικών τελεστών. Μια λογική φράση και, επο- µένως, µια λογική παράσταση, µπορεί να έχει την τιµή Αλήθεια ή την τιµή Ψέµα. Για παράδειγµα, η παράσταση a>5 είναι µια λογική φράση που έχει αποτέλεσµα Αλήθεια στην περίπτωση που η τιµή της µεταβλητής a είναι µεγαλύτερη από 5 και Ψέµα σε διαφορετική περίπτωση. Στη C, κάθε λογική παράσταση έχει ως αποτέλεσµα µία αριθµητική τιµή: 1 για Αλήθεια και 0 για Ψέµα. Στον επόµενο πίνακα αναφέρονται οι συγκριτικοί και λογικοί τελεστές της C. Συγκριτικοί τελεστές Λογικοί τελεστές == ίσο && λογικό AND!= όχι ίσο (διάφορο) λογικό OR > µεγαλύτερο! λογικό NOT >= µεγαλύτερο ή ίσο < µικρότερο <= µικρότερο ή ίσο Παρατηρούµε ότι ο τελεστής της ισότητας είναι δύο ίσον (==) και διαφέρει από τον αριθµητικό τελεστή ανάθεσης, το µονό ίσον (=). Προσοχή γιατί αυτή η λεπτή διαφορά είναι αιτία για αρκετούς πονοκεφάλους. Οι λογικοί τελεστές && (AND) και (OR) συνδέουν δυο λογικές εκφράσεις δηµιουργώντας έτσι µία σύνθετη λογική παράσταση: Λογική-έκφραση-Α && Λογική-έκφραση- Β Έχει ως αποτέλεσµα Αλήθεια όταν και οι δυο εκφράσεις είναι αληθείς. 49

Η γλώσσα C σε βάθος Λογική-έκφραση-Α Λογική-έκφραση-Β Έχει ως αποτέλεσµα Αλήθεια όταν έστω µία από τις δύο εκφράσεις είναι αληθής. Το αποτέλεσµα των λογικών τελεστών AND (&&) και OR ( ) φαίνεται στους πίνακες αλήθειας που ακολουθούν. Πίνακας αλήθειας του λογικού τελεστή && (AND) Λογική φράση Α Λογική φράση Β Α && Β Αλήθεια Αλήθεια Αλήθεια Αλήθεια Ψέµα Ψέµα Ψέµα Αλήθεια Ψέµα Ψέµα Ψέµα Ψέµα Πίνακας αλήθειας του λογικού τελεστή (OR) Λογική φράση Α Λογική φράση Β Α Β Αλήθεια Αλήθεια Αλήθεια Αλήθεια Ψέµα Αλήθεια Ψέµα Αλήθεια Αλήθεια Ψέµα Ψέµα Ψέµα Ο τελεστής! (NOT) δεν συνδέει λογικές φράσεις µεταξύ Λογική έκφραση Α! Α Πίνακας αλήθειας του τελεστή! (NOT) τους αλλά εφαρµόζεται σε µία Αλήθεια Ψέµα µόνο λογική φράση (προς τα Ψέµα Αλήθεια δεξιά του) και αντιστρέφει τη λογική της. Όπως αναφέρθηκε και προηγουµένως, µια λογική παράσταση στη C επιστρέφει µία αριθµητική τιµή: 1 για Αλήθεια και 0 για Ψέµα. Εποµένως παραστάσεις όπως: a=3>2; είναι απολύτως αποδεκτές. Στη συγκεκριµένη περίπτωση η µεταβλητή a θα πάρει την τιµή 1 διότι η λογική παράσταση 3>2, ως αληθής, επιστρέφει τιµή 1. Θα διαπιστώσουµε αργότερα ότι αριθµητικές παραστάσεις και λογικές εκφράσεις µπορούν να συνυπάρχουν µέσα στην ίδια παράσταση. Όταν έχουµε πολλές συνδεδεµένες λογικές εκφράσεις, για να ορίσουµε την προτεραιότητα µε την οποία θα υπολογιστούν χρησιµοποιούµε παρενθέσεις. Για παράδειγµα στην παράσταση που ακολουθεί: 50

Κεφάλαιο 2: Μια πρώτη µατιά στη C (a>b && a==c) a<c Πρώτα θα υπολογιστεί η λογική παράσταση µέσα στις παρενθέσεις. Στην περίπτωση που δεν υπάρχουν παρενθέσεις, η προτεραιότητα των τελεστών είναι καθορισµένη και αναφέρεται στο κεφάλαιο 4 (σελίδα 91). Παραδείγµατα κώδικα µε παραστάσεις Στα παραδείγµατα που ακολουθούν θα χρησιµοποιήσουµε δύο συναρτήσεις βιβλιοθήκης της C: την printf() και την rand(). εδοµένου ότι η C δεν έχει ενσωµατωµένες εντολές για είσοδο και έξοδο πληροφοριών, τις λειτουργίες αυτές αναλαµβάνουν οι συναρτήσεις βιβλιοθήκης. Η printf() χρησιµοποιείται για την εµφάνιση πληροφοριών στην οθόνη. Θα χρησιµοποιήσουµε την πιο απλή µορφή της συνάρτησης, η οποία απλώς εµφανίζει ένα σύνολο χαρακτήρων στην οθόνη: printf("αυτό εµφανίζεται στην οθόνη"); Όταν καλούµε την παραπάνω συνάρτηση, στην οθόνη εµφανίζεται το κείµενο µέσα στα εισαγωγικά. Ίσως φανεί παράξενο, αλλά η printf() πέρα από τη λειτουργία που εκτελεί (την εµφάνιση των χαρακτήρων στην οθόνη), επιστρέφει και µία τιµή. Η τιµή αυτή είναι ο αριθµός των χαρακτήρων που εµφάνισε, δηλαδή στη συγκεκριµένη περίπτωση ο αριθµός 27 (αλφαβητικοί χαρακτήρες µαζί µε τα κενά διαστήµατα). Η συνάρτηση rand() δεν δέχεται παραµέτρους και επιστρέφει ως τιµή έναν τυχαίο ακέραιο αριθµό, από το 0 µέχρι το 32767. Το επόµενο πρόγραµµα υπολογίζει το µέσο όρο των περιεχοµένων των µεταβλητών k και l. main() int k,l; float c; k = rand(); Στη µεταβλητή k καταχωρίζεται ένας τυχαίος ακέραιος αριθµός l = 18; c = (k + l)/2.0; Στη µεταβλητή c καταχωρίζεται o µέσος όρος των k και l 51

Η γλώσσα C σε βάθος Οι δύο πρώτες προτάσεις είναι δηλωτικές και ενηµερώνουν το µεταγλωττιστή για την ύπαρξη των τριών µεταβλητών k, l και c. Στις µεταβλητές k και l µπορούν να καταχωριστούν ακέραιοι αριθµοί, ενώ η c µπορεί να αποθηκεύσει ένα δεκαδικό αριθµό. Οι τρεις εκτελέσιµες προτάσεις που ακολουθούν, σε άλλες γλώσσες προγραµ- µατισµού, µπορεί να θεωρηθούν εντολές ανάθεσης για τις µεταβλητές k, l και c αντίστοιχα. Στη C, καµία από αυτές δεν θεωρείται εντολή (µε την ακριβή έννοια του όρου) αλλά είναι παραστάσεις που απλώς περιέχουν τον τελεστή ανάθεσης ίσον (=). Αναφέρθηκε προηγουµένως ότι µια πρόταση σε ένα πρόγραµµα της C µπορεί να είναι δηλωτική πρόταση, εντολή, ή παράσταση. Είναι εποµένως συντακτικά σωστό το πρόγραµµα που ακολουθεί; main() int a,b; 5+3; a = 6; 8; Και όµως, είναι!!! Η δεύτερη πρόταση αποτελείται από την παράσταση 5+3, η οποία απλώς υπολογίζεται χωρίς το αποτέλεσµά της να χρησιµοποιείται και ούτε να καταχωρίζεται πουθενά. Η πρόταση αυτή δεν επηρεάζει τη λειτουργία του προγράµµατος, είναι εντελώς άχρηστη, αλλά συντακτικά σωστή, όπως και η τελευταία (το "σκέτο" 8). ουλεύοντας µε τη C πρέπει να ξεχάσουµε πολλούς από τους περιορισµούς άλλων γλωσσών και να µπούµε στη δικιά της ελεύθερη και γοητευτική φιλοσοφία. Η C και οι αγκύλες της Μέχρι τώρα, περιοριστήκαµε στη χρήση των αγκυλών για την ένδειξη της αρχής (µε την αριστερή αγκύλη) και του τέλους (µε τη δεξιά αγκύλη) του συνόλου των προτάσεων µιας συνάρτησης: 52

Κεφάλαιο 2: Μια πρώτη µατιά στη C main() Αρχή προτάσεων......... Τέλος προτάσεων Οι αγκύλες όµως δεν έχουν µόνο αυτή τη χρήση. Αντίθετα, αποτελούν ένα βασικό κοµµάτι της φιλοσοφίας της C για τη δηµιουργία δοµηµένων και "ευανάγνωστων" προγραµµάτων. Σύνθετη πρόταση (compound statement) Σύνθετη πρόταση είναι µια οµάδα από απλές προτάσεις που περιέχονται µέσα σε αγκύλες: a=4; b=8; printf("αυτή είναι µία σύνθετη πρόταση"); Μια σύνθετη πρόταση µπορεί να περιέχει οποιονδήποτε αριθµό απλών προτάσεων, αλλά και άλλες σύνθετες προτάσεις. a=4; m=8; printf("αυτή είναι µία ακόµη σύνθετη πρόταση"); printf("αυτή είναι µία σύνθετη πρόταση"); Οι απλές προτάσεις τελειώνουν πάντα µε ελληνικό ερωτηµατικό (;) ενώ οι σύνθετες όχι. Ο µεταγλωττιστής της C µεταχειρίζεται µια σύνθετη πρόταση όπως οποιαδήποτε απλή πρόταση. Έτσι, µε τον όρο "πρόταση" εννοείται είτε απλή είτε σύνθετη πρόταση ακόµα και καµία πρόταση. 53