Κεφάλαιο. Εισαγωγή. Ενδεικτικές. σελίδες

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

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

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

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

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

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

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

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

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

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

Προγραμματισμός Ι. Χαρακτήρες. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3 η Διάλεξη C++ - Βασικοί τύποι δεδομένων. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

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

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

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

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

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

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

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

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

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

Εισαγωγή στον προγραμματισμό. Τμήμα Πληροφορικής & Επικοινωνιών ΤΕΙ Σερρών Εργαστήριο 2

for for for for( . */

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

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

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

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

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

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

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

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

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

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

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

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

Master Mind εφαρμογή στη γλώσσα προγραμματισμού C

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

5. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Β' μέρος: while - do..while)

Τύποι Δεδομένων Είσοδος/Έξοδος

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

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

ΚΕΦΑΛΑΙΟ 7 ο. Έτσι ο προγραµµατισµός µε τη ΓΛΩΣΣΑ εστιάζεται στην ανάπτυξη του αλγορίθµου και τη µετατροπή του σε σωστό πρόγραµµα.

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

ΑΣΚΗΣΗ 2: ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΣΤΗ C

Εισαγωγή στους Αλγόριθμους και τον Προγραμματισμό. 3η Διάλεξη Είσοδος Δεδομένων Συνθήκες Βρόχοι Παραδείγματα

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

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

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

Μεταβλητές τύπου χαρακτήρα

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

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

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

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

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

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

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

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

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

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

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

Β. Εισαγωγή στον Προγραμματισμό Η/Υ με την JavaScript

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

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

2.2.3 Η εντολή Εκτύπωσε

Κεφάλαιο 2.6: Είσοδος / Έξοδος εδοµένων, Μορφοποίηση εδοµένων Εξόδου. ( ιάλεξη 7) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

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

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

Μεταφερσιμότητα Τα προγράμματα μεταφέρονται εύκολα σε διαφορετικά λειτουργικά συστήματα

επιµέλεια Θοδωρής Πιερράτος

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

ΕΠΛ 003: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ

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

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

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

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

Γλώσσα Προγραμματισμού C

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

Βασικοί τύποι δεδομένων (Pascal) ΕΠΑ.Λ Αλίμου Γ Πληροφορική Δομημένος Προγραμματισμός (Ε) Σχολ. Ετος Κων/νος Φλώρος

Οικονόμου Βαγγέλησ Διάλεξη Νο 2. Δομημένοσ Προγραμματιςμόσ - Διάλεξη 2

Δεδομένα, τελεστές, είσοδος/έξοδος

Κεφάλαιο 2 ο Βασικές Έννοιες Αλγορίθμων (σελ )

Transcript:

Κεφάλαιο Εισαγωγή

Η γλώσσα C σε βάθος Εισαγωγή Οκτώβριος του 1983. Ως µεταπτυχιακός φοιτητής, γνώρισα µια δεκαοχτάχρονη αµερικανιδούλα που την έλεγαν BCPL. H σχέση µας κράτησε ένα χρόνο περίπου. Ευέλικτη αλλά δύστροπη. ύσκολο να την κατανοήσεις και δυσκολότερο να τη χειριστείς. Την επόµενη χρονιά µού γνώρισε τη µικρότερη αδελφή της, τη C. Από την πρώτη στιγµή µε εντυπωσίασε, είχε πιο δοµηµένη σκέψη, ήταν τροµερά ευέλικτη και πολύ πιο φιλική. Η γνωριµία αυτή δεν άργησε να εξελιχθεί σε ένα µεγάλο έρωτα, ο οποίος κρατάει ακόµη και σήµερα. Από τότε συνάντησα και άλλες πολλές, πολύ πιο νέες και εµφανίσιµες, µε πολλές δυνατότητες και προσόντα, έµεινα όµως πάντα πιστός στη µεσήλικα πια αγάπη µου, τη C. Ευτυχώς που είναι µόνο... µια γλώσσα προγραµµατισµού! Και όµως, η πολύχρονη αυτή σχέση είχε και έναν καρπό, την παραγωγή πλούσιου εκπαιδευτικού υλικού που χρησιµοποιήθηκε όλα αυτά τα χρόνια για τη διδασκαλία της γλώσσας C και το οποίο αποτέλεσε τη βάση για τη συγγραφή αυτού του βιβλίου. Το βιβλίο αυτό απευθύνεται τόσο στον αρχάριο όσο και στον έµπειρο προγραµµατιστή που θέλει να γνωρίσει τις αρχές και τη φιλοσοφία του δοµηµένου προγραµµατισµού, µέσα από µια ευέλικτη και χωρίς όρια γλώσσα όπως η C. Με ιδιαίτερο τρόπο προσεγγίζονται όλα τα χαρακτηριστικά της γλώσσας και δίνεται έµφαση στην αναλυτική και σε βάθος επεξήγηση των "στρυφνών" της σηµείων. Μεγάλο βάρος έχει δοθεί στη διδακτική σειρά αυτού του βιβλίου, ώστε η ανάγνωση και η κατανόηση ενός κεφαλαίου να προϋποθέτει µόνο τις γνώσεις που αποκτήθηκαν στα προηγούµενα κεφάλαια. Πώς να διαβάσετε αυτό το βιβλίο Αν είστε γνώστης µιας οποιασδήποτε άλλης γλώσσας προγραµµατισµού µπορείτε να παραλείψετε το Κεφάλαιο 1 και να προχωρήσετε κατευθείαν στο επό- µενο κεφάλαιο. Το Κεφάλαιο 2 είναι µια µικρή "περιοδεία" στη γλώσσα. Γίνεται µια πρώτη γνωριµία, ώστε να αποκτήσετε µια σφαιρική εικόνα από τη δοµή και τα χαρα- 20

Κεφάλαιο 1: Εισαγωγή ("στάνταρ") εγκατάστασή της "βιβλιοθήκες" µε κάθε είδους συναρτήσεις για είσοδο-έξοδο, χειρισµό χαρακτήρων, χειρισµό αρχείων, γραφικών κ.λπ. C Μια δοµηµένη γλώσσα Το διακριτικό χαρακτηριστικό µιας δοµηµένης γλώσσας προγραµµατισµού είναι η δυνατότητα για τµηµατικό χειρισµό (modularity) του προγράµµατος, µε τρόπο ώστε κάθε τµήµα να µπορεί να "κρύβει" τον κώδικα και τις πληροφορίες που περιέχει από το υπόλοιπο πρόγραµµα. Η C ενθαρρύνει τη χρήση ξεχωριστών συναρτήσεων (υποπρογραµµάτων) για κάθε συγκεκριµένη λειτουργία του προγράµµατος. Κάθε συνάρτηση (function) µπορεί να έχει τις δικές της τοπικές µεταβλητές (local variables), οι οποίες είναι "κρυµµένες" από το υπόλοιπο πρόγραµµα. C Μια γλώσσα για προγραµµατιστές Η C παρέχει στον πραγµατικό επαγγελµατία προγραµµατιστή αυτό που ακριβώς ζητάει: Λίγους περιορισµούς και µεγάλη ευελιξία υνατότητα για δοµηµένα προγράµµατα Λίγες αλλά ισχυρά δοµηµένες εντολές Η C έχει όµως και απαιτήσεις. Η έλλειψη περιορισµών και το γεγονός ότι υ- πάρχει µικρός βαθµός ελέγχου λαθών, αναγκάζουν τον προγραµµατιστή να είναι πολύ προσεκτικός και να ελέγχει, µέσα από τον κώδικα του προγράµµατος, πράγµατα που ελέγχονται αυτόµατα από άλλες γλώσσες προγραµµατισµού. Ένα χαρακτηριστικό παράδειγµα είναι ότι αν έχουµε ένα πίνακα 100 θέσεων µπορούµε κάλλιστα να προσπελάσουµε τη θέση 105!!! Τώρα το τι θα βρούµε εκεί µέσα και το τι παρενέργειες θα υπάρξουν, αφήστε το για αργότερα. C Μια µεταφραστική γλώσσα Όλες οι γλώσσες προγραµµατισµού (εκτός από τη γλώσσα µηχανής), και ανάλογα µε τη φιλοσοφία µε την οποία µεταφράζουν το πηγαίο πρόγραµµα σε γλώσσα µηχανής, παρουσιάζονται είτε σε ερµηνευτική (interpreter's), είτε σε µεταγλωττιζόµενη (compiler's) µορφή. 23

Η γλώσσα C σε βάθος Η BASIC π.χ. είναι µια γλώσσα που συχνά τη συναντούµε σε ερµηνευτική µορφή. Αντίθετα η C είναι πάντα σε µεταγλωττιζόµενη µορφή. Στο σχήµα που ακολουθεί βλέπετε µια απλοποιηµένη διαδικασία µεταγλωττισµού µέσω µεταγλωττιστή (compiler). Το αρχείο που περιέχει τον πηγαίο κώδικα του προγράµµατος (source code) µπορεί να δηµιουργηθεί µε οποιονδήποτε επεξεργαστή κειµένου ή µέσα από το ολοκληρωµένο περιβάλλον της γλώσσας (αν η έκδοση της γλώσσας διαθέτει τέτοιο περιβάλλον). Κατά τη διάρκεια της µεταγλώττισης (compile time), ο µεταγλωττιστής εντοπίζει τυχόν συντακτικά λάθη που υπάρχουν στον πηγαίο κώδικα. Εφόσον ο µεταγλωττιστής δεν εντοπίσει κανένα λάθος, θα δηµιουργήσει ένα αρχείο που περιέχει τον εκτελέσιµο κώδικα (executable code), δηλαδή πρόγραµµα σε γλώσσα µηχανής, άµεσα εκτελέσιµο από τον Η/Υ. Στην πραγµατικότητα, η διαδικασία της µεταγλώττισης είναι λίγο διαφορετική, ιδίως όταν γίνεται χρήση βιβλιοθηκών στην οποία θα αναφερθούµε αναλυτικά στο αντίστοιχο κεφάλαιο. Βασικές έννοιες του προγραµµατισµού Το τµήµα αυτό απευθύνεται στους αρχάριους στον προγραµµατισµό. Αναφέρει και εξηγεί βασικές έννοιες του προγραµµατισµού, απαραίτητες για τον αναγνώστη που έρχεται πρώτη φορά σε επαφή µε µια γλώσσα προγραµµατισµού. Κάθε πρόγραµµα, αναπτυγµένο σε οποιαδήποτε γλώσσα προγραµµατισµού, επεξεργάζεται δεδοµένα και δίνει αποτελέσµατα. Η επεξεργασία των δεδοµένων γίνεται πάντα µε έναν προκαθορισµένο τρόπο (αλγόριθµο). Τα συστατικά που συνθέτουν ένα απλό πρόγραµµα είναι οι µεταβλητές, οι σταθερές, και οι εντολές. Μεταβλητές Τα δεδοµένα, οι ενδιάµεσες πράξεις, αλλά και τα αποτελέσµατα ενός προγράµ- µατος αποθηκεύονται στην κεντρική µνήµη (RAM) του Η/Υ. Η διαχείριση της µνήµης είναι βασικό µέληµα µιας γλώσσας προγραµµατισµού. 24

Η γλώσσα C σε βάθος Παραδείγματα Π1.1 Ας υποθέσουμε ότι θέλουμε να παίξουμε ένα παιχνίδι στο οποίο κάποιος βάζει έναν τυχαίο αριθμό στο μυαλό του και εμείς προσπαθούμε να τον βρούμε. Λέμε συνέχεια αριθμούς στον παίκτη και αυτός μας α- παντά αν ο κρυφός αριθμός είναι μεγαλύτερος ή μικρότερος. Το παιχνίδι τελειώνει μόλις βρούμε τον αριθμό. Το λογικό διάγραμμα απεικονίζει τη διαδικασία του παιχνιδιού. Μια μικρή παραλλαγή του παιχνιδιού, στην ο- ποία μόλις βρεθεί ο αριθμός ο παίκτης μάς ρωτάει αν θέλουμε να ξαναπαίξουμε, φαίνεται στο διπλανό λογικό διάγραμμα. Στην περίπτωση που α- παντήσουμε ΝΑΙ, τότε ο παίκτης βάζει έναν άλλο αριθμό στο μυαλό του και το παιχνίδι ξαναρχίζει. Στην περίπτωση που απαντήσουμε αρνητικά το παιχνίδι σταματάει. 32

Κεφάλαιο 1: Εισαγωγή Π1.2 Η διαδικασία που απεικονίζει το διπλανό λογικό διάγραµµα, ζητάει συνέχεια αριθµούς και εµφανίζει στο τέλος το συνολικό τους άθροισµα. Η διαδικασία σταµατάει όταν δοθεί ο αριθµός 0. Σκεφτείτε τις τροποποιήσεις που θα πρέπει να γίνουν ώστε η διαδικασία να σταµατάει όταν δοθούν 100 αριθµοί. Ανασκόπηση Κεφαλαίου 1 Η C είναι µια µεταγλωττιζόµενη γλώσσα τα χαρακτηριστικά της οποίας ευνοούν το δοµηµένο και τµηµατικό προγραµµατισµό. Η C είναι µια "λιτή" γλώσσα, η οποία για τις περισσότερες λειτουργίες της βασίζεται στις συναρτήσεις βιβλιοθήκης που τη συνοδεύουν. Τα διαφορετικά είδη δεδοµένων που µπορεί να χειριστεί µια γλώσσα λέγονται τύποι δεδοµένων. Οι βασικοί τύποι δεδοµένων που υποστηρίζει η C είναι τρείς: int, char και float. Μια µεταβλητή είναι το όνοµα µιας θέσης µνήµης, της οποίας η τιµή µπορεί να µεταβάλλεται. Το λογικό διάγραµµα είναι ένας εποπτικός τρόπος παρουσίασης µιας διαδικασίας ή ενός προγράµµατος και συµβάλλει στην κατανόησή του. Το λογικό διάγραµµα χρησιµοποιεί συγκεκριµένα, αλλά διαφορετικά, γεωµετρικά σχήµατα για να απεικονίσει τις διαδικασίες ανάλογα µε το είδος τους. Το λογικό διάγραµµα είναι ανεξάρτητο από οποιαδήποτε γλώσσα προγραµµατισµού. 33

Κεφάλαιο Μια πρώτη µατιά στη C

Η γλώσσα 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

Κεφάλαιο 2: Μια πρώτη µατιά στη C Η παράσταση a = rand() έχει ως αποτέλεσµα την καταχώριση ενός τυχαίου αριθµού στη µεταβλητή a. Η πρόταση rand(); καλεί τη συνάρτηση rand() που επιστρέφει έναν τυχαίο αριθµό, ο οποίος όµως χάνεται. Ουσιαστικά αυτή η πρόταση είναι άχρηστη. Η τελευταία πρόταση αποτελείται από µια παράσταση, όχι και τόσο παράλογη αν αναλογιστούµε τη διαφορετική φιλοσοφία της C: Η συνάρτηση printf("tέλος") επιστρέφει την τιµή 5 (το πλήθος των χαρακτήρων που εµφάνισε). Το 10 (από 5+5) καταχωρίζεται στην a και η όλη παράσταση επιστρέφει τιµή 10. Tο 14 (από 10+4) καταχωρίζεται στη µεταβλητή b. Η όλη παράσταση επιστρέφει τιµή 14, η οποία δεν χρησι- µοποιείται. Η σειρά εκτέλεσης των πράξεων θα γίνει ξεκάθαρη όταν θα αναφερθούµε στην προτεραιότητα των τελεστών στο κεφάλαιο 4 (σελίδα 91). Ανασκόπηση Κεφαλαίου 2 Κάθε πρόγραµµα της C περιέχει υποχρεωτικά µία συνάρτηση main() η οποία είναι εκείνη που εκτελείται πρώτη. Κάθε πρόγραµµα της C µπορεί να περιέχει και άλλες συναρτήσεις, εκτός από τη main(), οι οποίες για να εκτελεστούν πρέπει να κληθούν. Κάθε µεταβλητή που χρησιµοποιείται πρέπει να δηλώνεται. Οι δηλωτικές προτάσεις των µεταβλητών τοποθετούνται στην αρχή µιας συνάρτησης και πριν από τις εκτελέσιµες προτάσεις. Οι βασικοί τύποι µεταβλητών στη C είναι ο τύπος char, ο τύπος int, και ο τύπος float. 57

Η γλώσσα C σε βάθος Οι αριθμητικές παραστάσεις είναι πράξεις μεταξύ αριθμητικών δεδομένων και έχουν αποτέλεσμα έναν αριθμό. Οι λογικές παραστάσεις χρησιμοποιούν συγκριτικούς και λογικούς τελεστές και έχουν αποτέλεσμα αλήθεια (τιμή 1) ή ψέμα (τιμή 0). Ο τελεστής = καταχωρίζει το αποτέλεσμα της παράστασης στα δεξιά του στη μεταβλητή που βρίσκεται αριστερά του, π.χ. a=b+3 Μια σύνθετη πρόταση αποτελείται από απλές προτάσεις μέσα σε αριστερή και δεξιά αγκύλη. Ασκήσεις Κεφαλαίου 2 2.1 Τι θα περιέχουν οι μεταβλητές a, b, και c μετά το τέλος του παρακάτω κώδικα: main() int a,b,c=3; a=b=2; a=c+b; 2.2 Τι θα περιέχουν οι μεταβλητές a, b, και c μετά το τέλος του παρακάτω κώδικα: #define MM 23 main() const int c=3; int a,b; a=4+(b=2); b=c+b+mm; 58

Κεφάλαιο Προετοιµασία για αργότερα

Η γλώσσα C σε βάθος Προετοιµασία για αργότερα Η C και η µνήµη Όπως αναφέρθηκε και προηγουµένως, η C χειρίζεται τρεις βασικούς τύπους µεταβλητών: int, float, και char. Φανταζόµαστε την κάθε µεταβλητή σαν ένα κουτί µε ένα όνοµα και κάποιο περιεχόµενο. Οι µεταβλητές καταλαµβάνουν χώρο στη µνήµη RAM του Η/Υ, αλλά γνωρίζουµε ότι κάθε θέση µνήµης RAM έχει µέγεθος 1 byte. Κάθε λοιπόν µεταβλητή του προγράµµατος καταλαµβάνει ακριβώς τον ίδιο χώρο στη µνήµη του Η/Υ; ΟΧΙ βέβαια. Κάθε µεταβλητή καταλαµβάνει έναν αριθµό θέσεων µνήµης (byte), ο οποίος εξαρτάται από τον τύπο της µεταβλητής και από τον τύπο του συστήµατος Η/Υ στο ο- ποίο δουλεύουµε. Στα συστήµατα προσωπικών Η/Υ που βασίζονται στους επεξεργαστές 32bit της INTEL, η µεταβλητή τύπου int καταλαµβάνει τέσσερα bytes, η float επίσης τέσσερα, και η char ένα byte. Αργότερα θα αναφερθούµε και σε άλλους τύπους µεταβλητών (που στηρίζονται πάντως στους τρεις βασικούς) µε διαφορετικά µεγέθη σε byte. Ας θεωρήσουµε τέσσερις µεταβλητές, οι οποίες δηλώνονται µε τις παρακάτω προτάσεις: char a,gramma; float pososto; int b; Στο διπλανό σχήµα φαίνεται εποπτικά η µνήµη ενός Η/Υ σαν ένα σύνολο από 62

Κεφάλαιο 3: Προετοιµασία για αργότερα κουτιά (θέσεις µνήµης) το ένα πάνω από το άλλο. Το κάθε κουτί έχει µέγεθος ενός byte και διαθέτει έναν αύξοντα αριθµό (ο αριθµός στα δεξιά) ο οποίος α- ποτελεί τη "διεύθυνση" του κουτιού µέσα στη µνήµη. Κάθε µεταβλητή που δηλώνεται, δεσµεύει κάποιες θέσεις µνήµης ανάλογα µε τον τύπο της. Έτσι η a δεσµεύει µία θέση (την 1), όπως δεσµεύουν και η gramma µία θέση (την 8), η pososto τέσσερις (τις 3,4,5, και 6), και η b επίσης τέσσερις (τις 350000, 350001, 350002, και 350003). Πέρα λοιπόν από το όνοµα και το περιεχόµενο µιας µεταβλητής, έννοιες που είναι ήδη γνωστές, συναντούµε εδώ δύο νέες έννοιες: της διεύθυνσης και του µεγέθους µιας µεταβλητής. ιεύθυνση µιας µεταβλητής είναι η διεύθυνση του πρώτου byte των θέσεων (ή της θέσης) µνήµης που δεσµεύει η µεταβλητή. Έτσι, οι διευθύνσεις των παραπάνω µεταβλητών είναι: a 000001 b 350000 pososto 000003 gramma 000008 Μέγεθος µιας µεταβλητής είναι ο αριθµός των bytes που δεσµεύει αυτή η µεταβλητή και καθορίζεται από τον τύπο της. Η C διαθέτει τελεστές, οι οποίοι επιστρέφουν τη διεύθυνση και το µέγεθος µιας µεταβλητής. Ο τελεστής & Ο τελεστής & επιστρέφει έναν ακέραιο αριθµό, ο οποίος προσδιορίζει τη διεύθυνση µιας µεταβλητής. Έτσι, σύµφωνα µε το προηγούµενο σχήµα, η παράσταση &a επιστρέφει τιµή 1 και η παράσταση &gramma τιµή 8. Η διεύθυνση µιας θέσης µνήµης, στα συστήµατα προσωπικών Η/Υ που βασίζονται στους επεξεργαστές 32bit της INTEL, είναι πάντα ένας αριθµός µεγέθους 4 bytes ο οποίος συνήθως αναπαρίσταται σε δεκαεξαδική µορφή. 63

Κεφάλαιο 3: Προετοιµασία για αργότερα Η συνάρτηση scanf() Η C επίσης, δεν διαθέτει εντολές εισόδου για την ανάγνωση δεδοµένων από το πληκτρολόγιο. Η διαδικασία αυτή υλοποιείται µε τη χρήση συναρτήσεων βιβλιοθήκης. Η πιο πλήρης συνάρτηση γι αυτή τη λειτουργία είναι η συνάρτηση scanf() µε την οποία διαβάζει δεδοµένα από το πληκτρολόγιο και τα καταχωρίζει σε µεταβλητές του προγράµµατος. Στη συνάρτηση καθορίζεται ο τρόπος και ο τύπος των δεδοµένων που θα αναγνωστούν, καθώς και οι διευθύνσεις των µεταβλητών στις οποίες θα καταχωριστούν. Η σύνταξη της scanf() είναι σχεδόν ίδια µε της printf(): scanf("αλφαριθητικό µορφοποίησης", διε1, διε2, διε3,..., διεn); όπου, το αλφαριθητικό µορφοποίησης (format string) καθορίζει τον τρόπο µε τον οποίο πρέπει να δοθούν τα δεδοµένα καθώς και τον τύπο τους. Το αλφαριθητικό µορφοποίησης περιέχει τριών ειδών πληροφορίες: Ειδικά σύµβολα για την ανάγνωση των τιµών που θα ανατεθούν στις µεταβλητές, µε τις διευθύνσεις που ακολουθούν (διε1~διεn). %c για έναν απλό χαρακτήρα %d για ακέραιο αριθµό %f για δεκαδικό αριθµό και άλλα σύµβολα που θα αναφερθούν αργότερα. Χαρακτήρες διαστήµατος. Αναγκάζουν τη scanf() να διαβάσει και να αγνοήσει ένα ή περισσότερα κενά διαστήµατα ή χαρακτήρες αλλαγής γραµµής, στη σειρά των δεδοµένων που πληκτρολογούνται. Για παράδειγ- µα, το αλφαριθµητικό µορφοποίησης: "%d %d" διαβάζει δύο ακέραιους, αγνοώντας τα µεταξύ τους κενά και τους χαρακτήρες αλλαγής γραµµής (αν υπάρχουν). Άλλους χαρακτήρες. Αναγκάζουν τη scanf() να διαβάσει και να αγνοήσει ένα συγκεκριµένο χαρακτήρα. Αν ο χαρακτήρας δεν βρεθεί, η scanf() τερ- µατίζει. Για παράδειγµα, το αλφαριθµητικό µορφοποίησης: "%d,%d" 67

Η γλώσσα C σε βάθος Παραδείγµατα Π3.1 Το παρακάτω πρόγραµµα ζητάει τρεις βαθµούς ενός µαθητή και υπολογίζει το µέσο όρο τους. Αν ο µέσος όρος είναι µεγαλύτερος ή ίσος µε 10, εµφανίζει "Πέρασες µε βαθµό ##", διαφορετικά εµφανίζει "Κόπηκες" (στη θέση του ## εµφανίζεται ο µέσος όρος). #include <stdio.h> 3_p3_1.c main() int b1,b2,b3; Η scanf() διαβάζει από το πληκτρολόγιο τρεις ακεραίους αριθ- float mo; printf(" ώσε τρεις βαθµούς:"); µούς τους οποίους καταχωρίζει στις µεταβλητές b1,b2 και b3. scanf("%d %d %d",&b1,&b2,&b3); mo=(b1+b2+b3)/3.0; Υπολογισµός του µέσου όρου. if(mo>=10) printf("πέρασες µε βαθµό %f\n",mo); else Έλεγχος του µέσου όρου και printf("κόπηκες\n"); εµφάνιση του κατάλληλου µηνύ- µατος. Π3.2 Το παρακάτω πρόγραµµα έχει λάθη: main() int a,b,c; float d; scanf("%d %d",a,b); int k; scanf("%c",&c); if(c==1) printf("nai\n"); else printf("oxi\n"); Η scanf() χρειάζεται τις διευθύνσεις των µεταβλητών. Θα έπρεπε να ήταν &a,&b. εν µπορεί να υπάρχει δηλωτική πρόταση µετά από εκτελέσιµες. Εφόσον ζητείται ακέραιος αριθ- µός, το αλφαριθµητικό µορφοποίησης θα πρέπει να είναι %d. 72

Κεφάλαιο 3: Προετοιµασία για αργότερα Ασκήσεις Κεφαλαίου 3 3.1 Να γραφεί ένα πρόγραµµα το οποίο να ζητάει τρεις δεκαδικούς αριθµούς, να υπολογίζει, και να εµφανίζει το µέσο όρο τους. 3.2 Τι αποτέλεσµα θα έχει το επόµενο πρόγραµµα; main() int a=4,b=5; char ch; ch='a'; printf("%d %d %c",a,b,ch); printf("%d %d %d\n",a,b,ch); printf("%d\n%d \n%c\n",a,b,ch); printf("τέλος\n"); 3.3 Να γραφεί πρόγραµµα το οποίο να ζητάει 3 αριθµούς και να υπολογίζει το άθροισµα, το γινόµενο, και το µέσο όρο τους. Το ώσε τον πρώτο αριθµό: 6 πρόγραµµα να µας βγάζει ώσε τον δεύτερο αριθµό: 2 ώσε τον τρίτο αριθµό: 10 µηνύµατα για το τι πρέπει Το άθροισµα των 6,2,10 είναι 18 να δώσουµε και να βγάζει Το γινόµενο των 6,2,10 είναι 120 τα αποτελέσµατα όπως Ο µέσος όρος των 6,2,10 είναι 6 στο διπλανό παράδειγµα. 3.4 Τι αποτέλεσµα θα έχει το παρακάτω πρόγραµµα; main() int a,b; float f; char ch; printf("%d %d %d\n",sizeof a,sizeof f,sizeof ch); 75

Κεφάλαιο Ο τύπος δεδοµένων int

Η γλώσσα C σε βάθος Ο τύπος δεδοµένων int Το κεφάλαιο αυτό εισάγει και αναλύει τον τρόπο χρήσης των ακεραίων (integer) στη γλώσσα C. Στο κεφάλαιο αυτό εξετάζεται η εσωτερική απεικόνιση των ακέραιων σταθερών και µεταβλητών, καθώς και οι τελεστές που εφαρ- µόζονται σε ακέραια µεγέθη. Πολλοί από αυτούς τους τελεστές εφαρµόζονται και σε άλλους τύπους δεδοµένων. Σταθερές τύπου int Οι ακέραιες σταθερές δεν είναι τίποτε άλλο από απλοί ακέραιοι αριθµοί. Μια ακέραια σταθερά αποθηκεύεται στη µνήµη αφού µετατραπεί σε δυαδικό αριθµό. Μια σταθερά τύπου int µετατρέπεται σε ένα δυαδικό αριθµό µήκους 4 bytes. Με 4 bytes µπορεί να αναπαρασταθεί αριθµός από -2.147.483.648 µέχρι +2.147.483.647. Το bit υπ' αριθµόν 31 (τα 32 bits αριθµούνται από το 0 έως το 31) χρησιµοποιείται για το πρόσηµο και τα υπόλοιπα 31 για την αναπαράσταση του αριθµού. Μεταβλητές τύπου int Η C διαθέτει, πέρα από τον τύπο int που έχουµε ήδη αναφέρει, άλλους δυο τύπους ακέραιων µεταβλητών: long int και short int. Οι µεταβλητές τύπου int δηλώνονται ως εξής: int όνοµα_µεταβλητής1, όνοµα_µεταβλητής2,...; Οι µεταβλητές τύπου long int δηλώνονται ως εξής: long int όνοµα_µεταβλητής1, όνοµα_µεταβλητής2,...; ή 80

Κεφάλαιο 4: Ο τύπος δεδοµένων int long όνοµα_µεταβλητής1, όνοµα_µεταβλητής2,...; Στην πρόταση δήλωσης η λέξη int µπορεί να παραλειφθεί, αλλά για λόγους σαφήνειας αυτό δεν συνιστάται. Οι µεταβλητές τύπου short int δηλώνονται ως εξής: short int όνοµα_µεταβλητής1, όνοµα_µεταβλητής2,...; ή short όνοµα_µεταβλητής1, όνοµα_µεταβλητής2,...; Οι µεταβλητές τύπου int και long int δεσµεύουν 4 bytes 5 (32 bits) και µπορούν να αποθηκεύσουν έναν ακέραιο αριθµό από -2.147.483.648 µέχρι +2.147.483.647. Οι µεταβλητές τύπου short int δεσµεύουν 2 bytes (16 bits) και µπορούν να αποθηκεύσουν έναν ακέραιο αριθµό από -32.768 µέχρι +32.767. Ακέραιοι χωρίς πρόσηµο (unsigned) Μια µεταβλητή τύπου int (int, long int ή short int) µπορεί να ορισθεί ότι δεν θα περιέχει πρόσηµο, χρησιµοποιώντας το προσδιοριστικό unsigned πριν από το όνοµα του τύπου, όπως παρακάτω: unsigned int όνοµα_µεταβλητής1, όνοµα_µεταβλητής2,...; ή unsigned long int όνοµα_µεταβλητής1, όνοµα_µεταβλητής2,...; ή unsigned short int όνοµα_µεταβλητής1, όνοµα_µεταβλητής2,...; ή Οι µεταβλητές τύπου unsigned δεσµεύουν τα ίδια bytes µε τις αντίστοιχες προσηµασµένες µεταβλητές. Όµως, σε µια µεταβλητή τέτοιου τύπου το πρώτο bit του αριθµού δεν χρησιµοποιείται για το πρόσηµο, αλλά συµµετέχει στην απεικόνιση του αριθµού. Εποµένως, σε µεταβλητές τύπου unsigned µπορούν να αποθηκευτούν µόνο θετικοί αριθµοί, αλλά µε διπλάσια απόλυτη τιµή (από τους αντίστοιχους προσηµασµένους). Αρχική τιµή µεταβλητής Όταν δηλώνουµε µια µεταβλητή, µπορούµε ταυτόχρονα να της δώσουµε αρχική τιµή. Για παράδειγµα, στην παρακάτω πρόταση: 5 Σε παλαιότερα συστήµατα 16bit, οι µεταβλητές τύπου int καταλαµβάνουν 2 bytes, ενώ οι long int 4. 81

Η γλώσσα C σε βάθος int a=4,b=8; γίνεται δήλωση δύο µεταβλητών a και b, στις οποίες ανατίθενται ταυτόχρονα οι τιµές 4 και 8 αντίστοιχα. Αριθµητικοί τελεστές Εκτός από τους "κλασικούς" αριθµητικούς τελεστές, η C διαθέτει και µερικούς τελεστές οι οποίοι δεν συναντώνται σε άλλες γλώσσες προγραµµατισµού. Ο διπλανός πίνακας αναφέρει τους διαθέσι- µους αριθµητικούς τελεστές στη C. Τελεστής Λειτουργία + Πρόσθεση εν θα ασχοληθούµε µε τους κλασικούς - Αφαίρεση αριθµητικούς τελεστές αλλά µόνο µε τούς * Πολλαπλασιασµός νέους τελεστές ++ και -- που εισάγει η C. Οι τελεστές ++ και -- εφαρµόζονται µόνο σε µεταβλητές και µπορεί να προηγούνται ή να ακολουθούν το όνοµα µιας µεταβλητής. / % ++ -- ιαίρεση Υπόλοιπο ακέραιας διαίρεσης Αύξηση κατά 1 Μείωση κατά 1 π.χ. ++a; a++; --a; a--; Ο τελεστής ++ αυξάνει το περιεχόµενο της µεταβλητής κατά 1, ενώ ο τελεστής -- µειώνει το περιεχόµενο της µεταβλητής κατά 1. Η λειτουργία αυτή γίνεται ανεξάρτητα από τη θέση του τελεστή (πριν ή µετά από τη µεταβλητή). main() int a,b; b=a=5; ++a; --b; printf("a=%d b=%d\n",a,b); Με την παράσταση ++a η a αυξάνεται κατά 1 (6) και µε την παράσταση --b η b µειώνεται κατά 1 (4). Έτσι η printf() θα εµφανίσει στην οθόνη: a=6 b=4 Όπως κάθε παράσταση, έτσι και οι παραστάσεις µε τους τελεστές ++ και -- ε- πιστρέφουν µία τιµή. Η τιµή αυτή εξαρτάται από τη θέση του τελεστή (πριν ή µετά από τη µεταβλητή). 82

Κεφάλαιο Ο τύπος δεδοµένων char

Η γλώσσα C σε βάθος Ο τύπος δεδοµένων char Το κεφάλαιο αυτό εισάγει και αναλύει τον τρόπο χρήσης των χαρακτήρων (characters) στη γλώσσα C. Εξετάζουµε τον τρόπο µε τον οποίο η C χειρίζεται τις σταθερές και τις µεταβλητές τύπου char. Ακόµη, αναφερόµαστε και σε συναρτήσεις που χρησιµοποιούνται για το χειρισµό των χαρακτήρων. Σταθερές τύπου char Μια σταθερά τύπου char δεν είναι τίποτε άλλο από ένας χαρακτήρας που περικλείεται σε µονά εισαγωγικά. Για παράδειγµα, οι παρακάτω εκφράσεις: 'ρ' '1' '*' είναι παραδείγµατα σταθερών τύπου char. Οι χαρακτήρες είναι αριθµοί!!! Η εσωτερική απεικόνιση µιας σταθεράς (αλλά και µιας µεταβλητής) τύπου char είναι ένας αριθµός. Ο αριθµός αυτός είναι ο κωδικός ASCII 7 του χαρακτήρα. Για παράδειγµα, η συνάρτηση: printf("%c %d\n",'a','a'); θα εµφανίσει το Α και το 65 (ο κωδικός ASCII του Α). Η C χειρίζεται τους χαρακτήρες σαν αριθµούς. Αυτό σηµαίνει ότι µπορούν να µετέχουν σε αριθµητικές παραστάσεις. Εποµένως, οι ακόλουθες παραστάσεις δεν είναι καθόλου παράξενες: 5 + '*' επιστρέφει την τιµή 47 (5 + 42 που είναι ο κωδικός ASCII του '*'). printf("%d %c\n",'a'+1,'a'+1); εµφανίζει στην οθόνη το 66 και το Β. 7 Κάθε χαρακτήρας µετατρέπεται σε έναν αριθµό σύµφωνα µε ένα καθορισµένο πρότυπο µετατροπής. Το πρότυπο αυτό ονοµάζεται ASCII και ο οµώνυµος πίνακας µετατροπής υπάρχει στο τέλος του παρόντος κεφαλαίου. 100

Κεφάλαιο 5: Ο τύπος δεδοµένων char Το 66 εµφανίζεται διότι είναι το αποτέλεσµα της παράστασης 'Α'+1 και η παράµετρος %d "λέει" στην printf() να το εµφανίσει σαν ακέραιο αριθµό. Το Β εµφανίζεται διότι η δεύτερη παράµετρος %c "λέει" στην printf() να εµφανίσει το αποτέλεσµα της παράστασης 'Α'+1 (το 66) σαν χαρακτήρα. Έτσι εµφανίζεται το Β, το οποίο έχει κωδικό ASCII 66. Χαρακτήρες διαφυγής Οι χαρακτήρες διαφυγής (escape characters) αναφέρονται και ως σειρές διαφυγής (escape sequences). Οι χαρακτήρες αυτοί δεν εµφανίζουν τίποτα στην οθόνη, αλλά ελέγχουν ορισµένες από τις λειτουργίες της. Οι χαρακτήρες διαφυγής της C είναι: \n new line (νέα γραµµή) \b backspace (µία θέση πίσω) \f form feed (νέα σελίδα) \r carriage return (αρχή γραµµής) \t tab (επόµενη στηλοθετηµένη στήλη)) \\ backslash (o χαρακτήρας "ανάποδη κάθετος", \) \' τα απλά εισαγωγικά (') \" τα διπλά εισαγωγικά (") \0 null character (byte 00000000) Σύµφωνα µε τα παραπάνω, η επόµενη Οι κλήση της συνάρτησης printf() έχει το "χαρακτήρες διαφυγής" αποτέλεσµα που εµφανίζεται στο διπλανό πλαίσιο: είναι 9 printf("οι\n\"χαρακτήρες διαφυγής\"\nείναι 9\n"); Παρατηρούµε ότι επειδή τα διπλά εισαγωγικά (") έχουν ειδικό νόηµα για την printf(), δεν µπορούν να µπουν στο αλφαριθµητικό µορφοποίησης σαν κανονικός χαρακτήρας. Για το λόγο αυτό πρέπει να χρησιµοποιηθεί ο χαρακτήρας διαφυγής \". 101

Η γλώσσα C σε βάθος Ο χαρακτήρας του διαστήµατος, ο χαρακτήρες tab, και ο χαρακτήρας αλλαγής γραµµής λέγονται επίσης και χαρακτήρες λευκού διαστήµατος (whitespace characters). Όταν εποµένως στη συνέχεια του βιβλίου αναφερόµαστε σε χαρακτήρες λευκού διαστήµατος, θα εννοούµε οποιονδήποτε από τους τρεις αυτούς χαρακτήρες. Μεταβλητές τύπου char Οι µεταβλητές τύπου char δηλώνονται ως εξής: char όνοµα_µεταβλητής1, όνοµα_µεταβλητής2,...; Οι µεταβλητές τύπου char δεσµεύουν 1 byte (8 bits). Στη µεταβλητή αποθηκεύεται ο κωδικός ASCII του χαρακτήρα, δηλαδή ένας ακέραιος αριθµός. Η C χειρίζεται τις µεταβλητές χαρακτήρων ως αριθµούς, οπότε µπορούν να µετέχουν σε αριθµητικές παραστάσεις. Για παράδειγµα, µετά από τις παρακάτω προτάσεις: int a,b; char ch; ch='a'; //Στη µεταβλητή ch καταχωρίζεται ο ASCII κωδικός του 'Α' που είναι ο αριθµός 65 a=ch+2; η µεταβλητή a θα περιέχει στο τέλος τον αριθµό 67 (65+2). Τρεις συναρτήσεις χειρισµού χαρακτήρων Για την είσοδο (από το πληκτρολόγιο) και την έξοδο (στην οθόνη) ενός χαρακτήρα χρησιµοποιούνται οι συναρτήσεις getch(), getchar() και putch(). getch() Η συνάρτηση getch() περιµένει να πληκτρολογηθεί ένας χαρακτήρας και επιστρέφει ως τιµή τον κωδικό του χαρακτήρα. εν τον εµφανίζει στην οθόνη και δεν περιµένει πάτηµα του πλήκτρου <Enter>. Η συνάρτηση δεν χρειάζεται κα- 102

Κεφάλαιο Ο τύπος δεδοµένων float

Η γλώσσα C σε βάθος Ο τύπος δεδοµένων float Το κεφάλαιο αυτό εισάγει και αναλύει τον τρόπο χρήσης των αριθµών κινητής υποδιαστολής (floating point) στη γλώσσα C. Εξετάζεται ο τρόπος µε τον ο- ποίο η C χειρίζεται τις σταθερές και τις µεταβλητές τύπου float. Επίσης γίνεται αναφορά σε συναρτήσεις που χρησιµοποιούνται για το χειρισµό δεδοµένων κινητής υποδιαστολής (δεκαδικών αριθµών). Σταθερές τύπου float Μια σταθερά τύπου float δεν είναι τίποτε άλλο από ένας δεκαδικός αριθµός. Για να θεωρηθεί τύπου float, ένας αριθµός πρέπει απαραίτητα να περιέχει το χαρακτήρα της υποδιαστολής (.), για παράδειγµα οι παρακάτω αριθµοί: 123.45 123.0 123. 0.1 είναι παραδείγµατα σταθερών τύπου float. Μεταβλητές τύπου float Υπάρχουν δύο τύποι µεταβλητών κινητής υποδιαστολής (floating point), ο τύπος float και ο τύπος double. Οι µεταβλητές τύπου float καταλαµβάνουν 4 bytes, ενώ οι τύπου double 8. Οι µεταβλητές τύπου double έχουν µεγαλύτερη ακρίβεια στα δεκαδικά ψηφία. Οι µεταβλητές τύπου float δηλώνονται όπως παρακάτω: float όνοµα_µεταβλητής1, όνοµα_µεταβλητής2,...; double όνοµα_µεταβλητής1, όνοµα_µεταβλητής2,...; long float όνοµα_µεταβλητής1, όνοµα_µεταβλητής2,...; όπου το long float είναι ισοδύναµο µε το double. 116

Κεφάλαιο 6: Ο τύπος δεδοµένων float Χρήση δεδοµένων τύπου κινητής υποδιαστολής Οι διαθέσιµοι τελεστές για πράξεις µεταξύ δεδοµένων τύπου κινητής υποδιαστολής (floating point) είναι πολύ περιορισµένοι σε σχέση µε τούς τελεστές που ε- + Πρόσθεση Τελεστής Λειτουργία φαρµόζονται σε δεδοµένα τύπου int και char. Οι τελεστές που εφαρµόζονται σε δεδοµένα τύπου float (ή double) αναφέρονται στο διπλανό πίνακα. - * / Αφαίρεση Πολλαπλασιασµός ιαίρεση Παρατηρούµε ότι οι αριθµητικοί τελεστές %, ++ και -- δεν εφαρµόζονται σε δεδοµένα τύπου float. Μερικοί µεταγλωττιστές της C (όπως ο gcc που περιέχεται στο περιβάλλον του DEV C++) επιτρέπουν και σε µεταβλητές τύπου float τη χρήση των τελεστών ++ και --. Η χρήση της printf() µε δεδοµένα κινητής υποδιαστολής Ας θεωρήσουµε το επόµενο πρόγραµµα του οποίου το αποτέλεσµα φαίνεται στο διπλανό πλαίσιο: main() float a,b; a=21.234; b=5467.1; printf("%f\n",a); printf("%f\n",b); 21.234 5467.1 Παρατηρούµε ότι αν και τα αποτελέσµατα εµφανίζονται σωστά, µπορεί να προτιµούσαµε τις χιλιάδες κάτω από τις χιλιάδες, τις εκατοντάδες κάτω από τις εκατοντάδες κ.ο.κ. Για να επιτύχουµε µορφοποιηµένη (φορµαρισµένη) έξοδο αριθµών, η ακολουθία %f στο αλφαριθµητικό ελέγχου της printf() µπορεί να διαµορφωθεί ως ε- ξής: %n.mf 117

Η γλώσσα C σε βάθος όπου n ο συνολικός αριθµός των θέσεων που θα καταλάβει ο αριθµός (µαζί µε την υποδιαστολή) και m ο αριθµός των θέσεων µετά από την υποδιαστολή. Έτσι, %8.3f σηµαίνει ότι ο αριθµός θα εµφανιστεί σε 8 θέσεις από τις οποίες οι 3 θα είναι για το δεκαδικό µέρος. Για µορφοποιηµένη έξοδο, το προηγούµενο πρόγραµµα θα µπορούσε να διατυπωθεί ως εξής: main() float a,b; a=21.234; b=5467.1; printf("%8.3f\n",a); printf("%8.3f\n",b); 21.234 5467.100 Χρήση της συνάρτησης scanf() µε δεδοµένα τύπου float Η scanf() χρησιµοποιείται για την είσοδο δεκαδικών αριθµών µε το πληκτρολόγιο. Για παράδειγµα, το επόµενο πρόγραµµα ζητάει και εµφανίζει δύο δεκαδικούς. #include <stdio.h> 6_float_scanf.c main() float a; double b; printf(" ώσε δεκαδικό:"); scanf("%f",&a); // ιαβάζει έναν αριθµό τύπου float και των καταχωρίζει στη µεταβλητή a printf(" ώσε δεκαδικό:"); scanf("%lf",&b); // ιαβάζει έναν αριθµό τύπου double και των καταχωρίζει στη µεταβλητή b printf("εδωσες %f και %f\n",a,b); Παρατηρούµε οτι όταν πρόκειται να διαβαστεί αριθµός διπλής ακρίβειας (τύπου double), στο αλφαριθµητικό ελέγχου της συνάρτησης scanf(), η ακολουθία %lf α- ντικαθιστά την %f. 118

Κεφάλαιο Εντολές συνθήκης

Η γλώσσα C σε βάθος Εντολές συνθήκης H C διαθέτει δύο εντολές µε τις οποίες έχει τη δυνατότητα εκτέλεσης προτάσεων υπό συνθήκη ("υπό όρους"). Είναι η εντολή if και η εντολή switch-case. Η εντολή if Η εντολή if ελέγχει µια λογική παράσταση και ανάλογα µε το αποτέλεσµα του ελέγχου (αληθές ή ψευδές), εκτελεί (ή δεν εκτελεί) κάποιες προτάσεις. Η if συντάσσεται µε τρεις τρόπους: ως απλή πρόταση if ως συνδυασµός if - else ως συνδυασµός if - else if H απλή πρόταση if To συντακτικό της if στην πιο απλή της µορφή είναι: if (λογική παράσταση) πρόταση-a; Σε αυτή τη µορφή η if ελέγχει τη λογική παράσταση και, αν είναι αληθής (Α), εκτελεί την πρόταση-α που ακολουθεί. Αν η λογική παράσταση είναι ψευδής (Ψ), εκτελείται η πρόταση αµέσως µετά από την εντολή if. Ας θυµηθούµε ότι µια λογική παράσταση στη C επιστρέφει µία αριθµητική τιµή: την τιµή 1 αν είναι αληθής και την 0 αν είναι ψευδής. Επίσης, η C θεωρεί αληθή οποιαδήποτε παράσταση επιστρέφει τιµή διάφορη του µηδενός (βλέπε παράδειγµα Π7.3). Στο λογικό διάγραµµα φαίνεται η λογική της πρότασης if. Η πρόταση-α µπορεί να είναι και µία σύνθετη πρόταση (compound statement). Παράδειγµα χρήσης της απλής πρότασης if: 124

Κεφάλαιο 7: Εντολές συνθήκης if(a==5) printf("a=5\n"); if(a==5) printf("a=5\n"); if(a==5) printf("a=5\n"); η οποία µπορεί να γραφεί και ή και Όπως αναφέραµε, η πρόταση-α µπορεί να είναι και µία σύνθετη πρόταση: if(a==5) printf("a=5\n"); printf("µία σύνθετη πρόταση\n"); Η πρόταση if-else if (λογική παράσταση) Πρόταση-Α; else Πρόταση-Ψ; Σε αυτή τη µορφή, η if ελέγχει τη λογική παράσταση και, αν είναι αληθής (Α), εκτελεί την Πρόταση-Α που ακολουθεί. Αν η λογική παράσταση είναι ψευδής (Ψ), εκτελείται η Πρόταση-Ψ. Μετά εκτελείται κανονικά η επόµενη από την if πρόταση του προγράµµατος. Στο διπλανό λογικό διάγραµµα φαίνεται η λογική της πρότασης if-else. Οι προτάσεις Α και Ψ µπορεί να είναι και σύνθετες προτάσεις. Παράδειγµα χρήσης της if-else: if(a==5) printf("ναι"); else printf("όχι"); ή και if(a==5) printf("ναι"); 125

Η γλώσσα C σε βάθος else printf("όχι"); if(a==5) printf("ναι\n"); printf("σύνθετη πρόταση - A\n"); else printf("όχι\n"); printf("σύνθετη πρόταση - B\n"); Η πρόταση if - else if Εφόσον µετά το else µπορεί να υπάρξει οποιαδήποτε πρόταση µπορεί αυτή να είναι άλλη µία πρόταση if. Η λογική της πρότασης if-else if φαίνεται στο λογικό διάγραµµα της επόµενης σελίδας. Η Πρόταση-Ψ εκτελείται µόνο όταν όλες οι λογικές παραστάσεις είναι ψευδείς. Π.χ.: if(λογ_παράσταση-1) Πρόταση-A 1 ; else if(λογ_παράσταση-2) Πρόταση-A 2 ;... else if(λογ_παράσταση-ν) Πρόταση-A ν ; Εκτελείται όταν η Λογ_παράσταση-1 είναι αληθής Εκτελείται όταν η Λογ_παράσταση-2 είναι αληθής Εκτελείται όταν η Λογ_παράσταση-3 είναι αληθής 126

Κεφάλαιο Εντολές αλλαγής ροής και επανάληψης

Η γλώσσα C σε βάθος Εντολές αλλαγής ροής και επανάληψης Η "επικίνδυνη" εντολή goto Στη C, όπως και στις περισσότερες γλώσσες προγραμματισμού, με την εντολή goto μεταφέρουμε τον έλεγχο του προγράμματος σε ένα διαφορετικό του σημείο. Δεδομένου ότι στη C οι προτάσεις ενός προγράμματος δεν αριθμούνται, χρησιμοποιούνται ετικέτες (labels) για να "επισημαίνουν" διάφορα σημεία μέσα σε ένα πρόγραμμα. Μια ετικέτα (label) είναι ένα αναγνωριστικό ακολουθούμενο από μία άνω και κάτω τελεία (:), για παράδειγμα: telos: Μια ετικέτα μπορεί να βρίσκεται μόνη της σε μια γραμμή του προγράμματος ή να βρίσκεται μπροστά από μια πρόταση. Η εντολή goto μεταφέρει τον έλεγχο σε μια ετικέτα του προγράμματος (αλλά πάντα μέσα στην ίδια συνάρτηση). Το συντακτικό της goto είναι: goto ετικέτα; όπου ετικέτα είναι η ετικέτα στην οποία θέλουμε να μεταφερθεί ο έλεγχος του προγράμματος. Το επόμενο πρόγραμμα εμφανίζει συνέχεια αριθμούς ξεκινώντας από το 1 και αυξάνοντάς τους κατά 1. main() int a; a=0; pali: printf("%d\n",++a); goto pali; //Αυξάνει την τιμή της a κατά 1 και την εμφανίζει //Μεταφέρει τον έλεγχο του προγράμματος στη θέση της ετικέτας pali 1 2 3 4 142

Κεφάλαιο 8: Εντολές αλλαγής ροής και επανάληψης Παρατηρούµε ότι η ετικέτα pali δεν ακολουθείται από ερωτηµατικό (;). Όταν η ετικέτα βρίσκεται πριν από µία πρόταση, η πρόταση τερµατίζεται κανονικά µε ερωτη- µατικό (;). Στη σύνταξη της goto η ετικέτα δεν ακολουθείται από την άνω και κάτω τελεία (goto pali;) Το επόµενο πρόγραµµα εκτελεί την ίδια λειτουργία µε το προηγούµενο: main() int a; a=0; pali: printf("%d\n",++a); goto pali; Η goto ως µέθοδος µεταφοράς ελέγχου του προγράµµατος είναι ο χειρότερος ε- χθρός του δοµηµένου προγραµµατισµού. Αφού λοιπόν έγινε κατανοητή η χρήση της goto, το επόµενο στάδιο είναι να την ξεχάσουµε. Αν θέλουµε τα προγράµµατα µας να είναι δοµηµένα και ευανάγνωστα δεν πρέπει να τη χρησιµοποιούµε ποτέ. Η C διαθέτει εντολές ελέγχου και επαναληπτικές διαδικασίες που κάνουν περιττή τη χρήση της goto. Ο βρόχος while Ο βρόχος while αποτελεί τη µια από τις τρεις δοµές επανάληψης της C. Με τη χρήση της εντολής while είναι δυνατή η επαναληπτική εκτέλεση µιας ή παραπάνω προτάσεων. Η επανάληψη ή όχι των προτάσεων εξαρτάται από την τιµή µιας λογικής παράστασης. Για παράδειγµα, ο παρακάτω βρόχος while εκτελείται όσο η τιµή της µεταβλητής a είναι µεγαλύτερη από το 0. a=5; while (a>0) printf("a=%d\n",a); --a; Ελέγχεται αν η τιµή της µεταβλητής a είναι µεγαλύτερη από 0. Αν είναι, συνεχίζεται η εκτέλεση των εντολών του βρόχου. 143

Η γλώσσα C σε βάθος Η εντολή (ή βρόχος) while επιτυγχάνει την επανάληψη µιας πρότασης (απλής ή σύνθετης) ενόσω µια λογική παράσταση είναι αληθής. Το συντακτικό της while είναι: while (λογική_παράσταση) πρόταση; while (λογική_παράσταση) πρόταση; while (λογική_παράσταση) πρόταση1; πρόταση2; Το διπλανό λογικό διάγραµµα δείχνει τη φιλοσοφία της while. εδοµένου ότι µια λογική παράσταση στη C επιστρέφει αριθµητική τιµή, στη θέση της λογικής παράστασης µπορεί να είναι οποιαδήποτε παράσταση που ε- πιστρέφει αριθµητική τιµή. Αν η τιµή της είναι 0, θεωρείται ψευδής διαφορετικά θεωρείται αληθής. Η παρακάτω εντολή while έχει ως αποτέλεσµα τη συνεχή εµφάνιση της πρότασης "Η γλώσσα C σε βάθος", δεδοµένου ότι η παράσταση έχει συνέχεια τιµή 1 δηλαδή αληθής. Σε αυτό το σηµείο η εκτέλεση του προγράµµατος θα 'κολλήσει'. Ένας τέτοιος βρόχος καλείται ατέρµων βρόχος. while (1) printf("η γλώσσα C σε βάθος\n"); Το πρόγραµµα που ακολουθεί, εµφανίζει την τιµή της µεταβλητής a, ενόσω αυτή είναι µεγαλύτερη του µηδενός. Μετά το τέλος του βρόχου, εµφανίζει τη λέξη "ΤΕΛΟΣ". ή ή 144

Κεφάλαιο 8: Εντολές αλλαγής ροής και επανάληψης #include <stdio.h> main() int a,b; a=5; while (a>0) printf("a=%d\n",a); --a; printf("τελοσ\n"); Το επόµενο πρόγραµµα περιµένει να πατηθεί το πλήκτρο του διαστήµατος (ASCII 32). #include <stdio.h> main() char ch; ch=''; while (ch!=32) ch=getch(); printf("επιτέλους το πάτησες\n"); Ο βρόχος while εκτελείται συνέχεια ενόσω το πλήκτρο που πατιέται δεν είναι το πλήκτρο του διαστήµατος. Εκµεταλλευόµενοι τη µαγεία της C, θα µπορούσαµε να γράψουµε το προηγούµενο πρόγραµµα µε τον ακόλουθο τρόπο. #include <stdio.h> main() char ch=''; while ((ch=getch())!= 32); printf("επιτέλους το πάτησες\n"); a=5 a=4 a=3 a=2 a=1 ΤΕΛΟΣ 8_while1.c 8_while2.c 8_while3.c ΠΡΟΣΟΧΗ: ο βρόχος while δεν περιέχει καµία πρόταση. 145

Η γλώσσα C σε βάθος Η εντολή continue Η εντολή continue έχει µια παρόµοια λειτουργία µε την break. Η διαφορά της είναι ότι δεν τερµατίζει τον βρόχο (όπως η break), αλλά επιβάλλει την εκτέλεση της επόµενης επανάληψης παραλείποντας τις ενδιάµεσες εντολές. Τα επό- µενα παραδείγµατα δείχνουν παραστατικά τη λειτουργία της. //βρόχος while while (1) ch=getch(); if (ch==27) continue; putch(ch);... printf("τέλος βρόχου while\n"); //βρόχος do-while do ch=getch(); if (ch==27) continue; putch(ch);... while (1); printf("τέλος βρόχου do-while\n"); //βρόχος for for (i=1;i<=100;++i) ch=getch(); if (ch==27) continue; putch(ch);... printf("τέλος βρόχου for\n"); Η εντολή continue µεταφέρει τον έλεγχο του προγράµµατος αµέσως µετά την τελευταία πρόταση του βρόχου αλλά πριν από το τέλος του (δεξιό άγκιστρο). Έτσι γίνεται κανονικά (αν πρέπει να γίνει) η επόµενη επανάληψη του βρόχου και α- πλώς παραλείπεται η εκτέλεση των προτάσεων από την εντολή continue µέχρι το τέλος του βρόχου. while (1) ch=getch(); if (ch==27) goto pali; putch(ch); pali: printf("τελος βρόχου while\n"); Και στους τρεις βρόχους του παραδείγµατος, µόλις πατηθεί το πλήκτρο Esc (ASCII 27), η εντολή continue επιβάλλει την εκτέλεση της επόµενης επανάληψης παραλείποντας τις ενδιάµεσες εντολές. 156

Κεφάλαιο 8: Εντολές αλλαγής ροής και επανάληψης Και εδώ αναφέρεται ένα ισοδύναµο παράδειγµα που χρησιµοποιεί την εντολή goto για την επανάληψη του βρόχου. Καταµέτρηση και άθροιση σε επαναλαµβανόµενες διαδικασίες Πολλές φορές στα προγράµµατά µας θα χρειαστεί να µετρήσουµε πόσες φορές συνέβη ένα γεγονός (για παράδειγµα το πλήθος των αριθµών που είναι µεγαλύτεροι από 10), αλλά και να αθροίσουµε τις διαφορετικές τιµές που λαµβάνει µια µεταβλητή. Για την καταµέτρηση ενός συµβάντος πάντα χρησιµοποιούµε µια µεταβλητή στην οποία δίνουµε αρχική τιµή 0, και κάθε φορά που δηµιουργείται το συµβάν, αυξάνουµε τη µεταβλητή κατά 1. Για το συνολικό άθροισµα διαφορετικών τιµών, χρησιµοποιούµε πάλι µια µεταβλητή στην οποία δίνουµε επίσης αρχική τιµή 0, και κάθε φορά που δηµιουργείται µια νέα τιµή, αυξάνου- µε τη µεταβλητή κατά την τιµή αυτή. Το παρακάτω πρόγραµµα διαβάζει έναν-έναν δώδεκα αριθµούς που δίνονται από το πληκτρολόγιο και εµφανίζει το άθροισµά τους. Για την καταµέτρηση των αριθµών χρησιµοποιείται η µεταβλητή cnt και για το άθροισµά τους η µεταβλητή sum. Στον κώδικα του προγράµµατος, χρησιµοποιείται η συνάρτηση scanf() η οποία διαβάζει έναν αριθµό από το πληκτρολόγιο και τον καταχωρίζει στη µεταβλητή a. #include <stdio.h> main() int a,cnt,sum; cnt=sum=0; while (cnt<12) printf(" ώσε αριθµό:"); scanf("%d",&a); cnt++; sum=sum+a; printf("άθροισµα=%d\n",sum); Θέτουµε αρχική τιµή στις µεταβλητές cnt και sum το 0. Όταν δοθούν 12 αριθµοί, η επαναληπτική διαδικασία σταµατάει. 8_sum.c ιαβάζει έναν αριθµό από το πληκτρολόγιο και τον καταχωρίζει στη µεταβλητή a. Κάθε φορά που δίνεται ένας αριθµός (a), η cnt αυξάνεται κατά 1. Επίσης ο αριθµός (a) προστίθεται στη sum. Εµφανίζει το συνολικό άθροισµα όλων των αριθµών που δόθηκαν. 157

Κεφάλαιο Συναρτήσεις

Η γλώσσα C σε βάθος Συναρτήσεις Σε αυτό το κεφάλαιο θα αναφερθούµε στη χρήση των συναρτήσεων από τη C. Μέχρι στιγµής είδαµε τη χρήση της main(), µιας συνάρτησης απαραίτητης σε κάθε πρόγραµµα της C. Επίσης συναντήσαµε και ορισµένες συναρτήσεις βιβλιοθήκης όπως οι: printf(), scanf(), getch() κ.α. Οι συναρτήσεις βοηθούν τον προγραµµατιστή να "κοµµατιάσει" ένα µεγάλο πρόγραµµα σε µικρότερα τµήµατα, κάθε ένα από τα οποία επιτελεί µια συγκεκριµένη λειτουργία. Στις γλώσσες δοµηµένου προγραµµατισµού, οι συναρτήσεις µπορούν να "κρύβουν" κοµµάτια κώδικα από το υπόλοιπο πρόγραµµα µε τρόπο ώστε οι µεταβλητές µιας συνάρτησης να µην επηρεάζουν το υπόλοιπο πρόγραµµα. Όπως αναφέρθηκε στην εισαγωγή, ένα πρόγραµµα στη C έχει την ακόλουθη γενική µορφή: main() δηλώσεις µεταβλητών της συνάρτησης main(); εκτελέσιµες προτάσεις της συνάρτησης main(); function-1() δηλώσεις µεταβλητών της συνάρτησης function-1(); εκτελέσιµες προτάσεις της συνάρτησης function-1(); function-2() δηλώσεις µεταβλητών της συνάρτησης function-2(); εκτελέσιµες προτάσεις της συνάρτησης function-2(); function-n() δηλώσεις µεταβλητών της συνάρτησης function-n(); 172

Κεφάλαιο 9: Συναρτήσεις εκτελέσιµες προτάσεις της συνάρτησης function-n(); Οι συναρτήσεις εκτελούνται µόνο αν κληθούν από µια άλλη συνάρτηση. Η µόνη συνάρτηση που εκτελείται πάντοτε είναι η συνάρτηση main(). Στη C κάθε συνάρτηση επιστρέφει µια τιµή, εκτός αν έχει δηλωθεί µε σαφήνεια ότι δεν επιστρέφει καµία τιµή. Σε κάθε περίπτωση µια συνάρτηση έχει έναν τύπο (int, float κ.λπ.) ανάλογα µε τον τύπο δεδοµένων που επιστρέφει ως τιµή. Όπως θα γίνει κατανοητό στη συνέχεια του παρόντος κεφαλαίου, ακόµα και αν δεν επιστρέφει καµία τιµή, θα πρέπει να δηλωθεί µε τον κατάλληλο τύπο (void). Επίσης, µια συνάρτηση µπορεί να έχει παραµέτρους µέσω των οποίων το πρόγραµµα που καλεί τη συνάρτηση µπορεί να της "µεταβιβάσει" πληροφορίες. Στη C κάθε συνάρτηση ανήκει σε κάποιο τύπο δεδοµένων. Μια συνάρτηση µπορεί να έχει καµία, µία ή περισσότερες παραµέτρους. Oρισµός µιας συνάρτησης Μια συνάρτηση ορίζεται µε τον ακόλουθο τρόπο: τύπος_συνάρτησης όνοµα_συνάρτησης (τύπος παράµετρος1, τύπος παρά- µετρος2,...) δηλώσεις µεταβλητών συνάρτησης; εκτελέσιµες προτάσεις συνάρτησης; Ο τύπος της συνάρτησης καθορίζει τον τύπο της τιµής που επιστρέφει η συνάρτηση. Στην περίπτωση που η συνάρτηση δεν επιστρέφει τιµή, δηλώνεται ως τύπου void. Αν δεν οριστεί ο τύπος της συνάρτησης, η C υποθέτει ότι η συνάρτηση επιστρέφει τιµή τύπου int. 173

Η γλώσσα C σε βάθος Οι παράµετροι της συνάρτησης (αν υπάρχουν) ορίζονται, µαζί µε τον τύπο τους, µέσα στις παρενθέσεις που ακολουθούν το όνοµα της συνάρτησης. Οι παράµετροι µιας συνάρτησης αποτελούν και αυτές τοπικές µεταβλητές της συνάρτησης. Συναρτήσεις χωρίς παραµέτρους Στην πιο απλή τους µορφή οι συναρτήσεις δεν έχουν παραµέτρους. Σε αυτή την περίπτωση το πρόγραµµα που τις καλεί δεν µπορεί να τους µεταβιβάσει πληροφορίες. Μια τέτοια συνάρτηση τη φανταζόµαστε σαν ένα ερµητικά κλειστό κουτί το οποίο επιτελεί κάποια λειτουργία, αλλά δεν έχουµε καµία δυνατότητα να τροποποιήσουµε τη λειτουργία του. Για παράδειγµα, η παρακάτω συνάρτηση εµφανίζει τους αριθµούς από το 5 µέχρι το 10. εν επιστρέφει καµία τιµή και για το λόγο αυτό δηλώνεται ως void. εν διαθέτει καµία παράµετρο και, κάθε φορά που καλείται, εκτελεί ακριβώς την ίδια λειτουργία. void display_numbers() int i; for (i=5;i<=10;i++) printf("%d\n",i); Η συνάρτηση εµφανίζει τους αριθµούς 5, 6, 7, 8, 9, και 10. main() printf("πρώτη κλήση της συνάρτησης\n"); display_numbers(); Κλήση της συνάρτησης 174

Κεφάλαιο 9: Συναρτήσεις printf(" εύτερη κλήση της συνάρτησης\n"); display_numbers(); Η συνάρτηση main() καλεί τη συνάρτηση display_numbers() δύο φορές. Κάθε φορά η συνάρτηση εµφανίζει τους ίδιους αριθµούς. Aπό τη στιγµή που η συνάρτηση δεν έχει παραµέτρους δεν υπάρχει τρόπος να επηρεάσουµε τη λειτουργία της. Συναρτήσεις µε παραµέτρους Οι παράµετροι είναι ένας τρόπος µε τον οποίο ένα πρόγραµµα µεταβιβάζει πληροφορίες σε µια συνάρτηση. Μια τέτοια συνάρτηση τη φανταζόµαστε σαν ένα κουτί το οποίο διαθέτει εγκοπές στις οποίες µπορούµε να τοποθετήσουµε πληροφορίες. Ο κώδικας της συνάρτησης χρησιµοποιεί αυτές τις πληροφορίες και ανάλογα µπορεί να τροποποιεί τη λειτουργία του. Όταν καλούµε µια συνάρτηση µε παραµέτρους, την καλούµε µε ισάριθµα ορίσµατα. Το διπλανό σχήµα δείχνει µια συνάρτηση µε δύο παραµέτρους func(παρ1,παρ2) σαν ένα κουτί µε δύο εγκοπές. Όταν καλούµε τη συνάρτηση func(), πρέπει να χρησιµοποιήσουµε ισάριθµα ορίσµατα func(ορ1,ορ2). Η τιµή του πρώτου ορίσµατος µεταβιβάζεται στην πρώτη παρά- µετρο (εγκοπή), και του δεύτερου ορίσµατος στη δεύτερη. Η παρακάτω συνάρτηση είναι µια παραλλαγή της συνάρτησης display_numbers() µε δύο παραµέτρους, ώστε το πρόγραµµα που την καλεί να µπορεί να καθορίζει το εύρος των αριθµών που εµφανίζει. 175

Κεφάλαιο 9: Συναρτήσεις Παράµετροι συνάρτησης Όπως αναφέρθηκε προηγουµένως, αν µια συνάρτηση έχει παραµέτρους, αυτές δηλώνονται µαζί µε το όνοµα της συνάρτησης µέσα στις παρενθέσεις που ακολουθούν. int add(int x, int y)...... Ο δεύτερος τρόπος δήλωσης των παραµέτρων µιας συνάρτησης, είναι αµέσως µετά από το όνοµα της συνάρτησης, σε ξεχωριστή πρόταση: int add(x,y) Όνοµα συνάρτησης int x,y; ήλωση παραµέτρων...... Σώµα συνάρτησης Οι δύο τρόποι δήλωσης των παραµέτρων µιας συνάρτησης είναι ισοδύναµοι αλλά στη συνέχεια του βιβλίου θα χρησιµοποιούµε τον πρώτο που είναι ο πιο διαδεδο- µένος. Ορίσµατα και µεταβίβαση παραµέτρων Οι παράµετροι µιας συνάρτησης χρησιµοποιούνται για τη µεταβίβαση δεδοµένων από το πρόγραµµα προς τη συνάρτηση την οποία καλεί. Οι τιµές µε τις οποίες καλείται µια συνάρτηση λέγονται ορίσµατα της συνάρτησης. Ας θεωρήσουµε το επόµενο παράδειγµα κλήσης της συνάρτησης add() από τη συνάρτηση main(). main() int a,b,c; ήλωση παραµέτρων Σώµα συνάρτησης 183

Η γλώσσα C σε βάθος a=10; b=20; c=add(a,b); printf("%d\n",c); int add(int x, int y) int ss; ss=x+y; return(ss); Η συνάρτηση add() έχει οριστεί µε δύο παραµέτρους x και y. Όταν καλείται η συνάρτηση, οι τιµές των ορισµάτων της (το 10 και το 20) αντιγράφονται στις παραµέτρους x και y αντίστοιχα. Τα ορίσµατα µε τα οποία καλείται µια συνάρτηση, καλούνται πραγµατικές παράµετροι. Ορίσµατα συνάρτησης. Καλούνται και πραγµατικές παράµετροι. Παράµετροι συνάρτησης. Καλούνται και τυπικές παράµετροι. Αυτός ο τρόπος µεταβίβασης των ορισµάτων λέγεται κλήση ή µεταβίβαση κατ' αξία (call by value), κατά τον οποίο αντιγράφονται οι τιµές των ορισµάτων στις αντίστοιχες παραµέτρους της συνάρτησης. Οι µεταβλητές των παραµέτρων που ορίζονται σε µια συνάρτηση (στην περίπτωση µας οι x και y) λέγονται τυπικές παράµετροι (formal parameters) της συνάρτησης. 184

Κεφάλαιο 9: Συναρτήσεις Παραδείγµατα Π9.1 Η επόµενη συνάρτηση δέχεται ως παράµετρο έναν αριθµό, τον εµφανίζει αντίστροφα, και επιστρέφει ως τιµή το πλήθος των ψηφίων του. int reverse(int ar) int y,p,cnt=0; do y=ar % 10; p=ar/10; printf("%d",y); cnt++; ar=p; while (p!=0); return cnt; Π9.2 Η επόµενη συνάρτηση δέχεται ως παράµετρο ένα χαρακτήρα και επιστρέφει τιµή 1 αν είναι Ελληνικός κεφαλαίος, 2 αν είναι Ελληνικός πεζός, 3 αν είναι αριθµητικό ψηφίο (0~9), και 0 σε κάθε άλλη περίπτωση. int isgreek(char ch) int ap; if (ch>='a' && ch<='ω') // 'Α'= Ελληνικό άλφα κεφαλαίο! ap=1; else if (ch>='α' && ch<='ω') ap=2; else if (ch>='0' && ch<='9') ap=3; else ap=0; return ap; Ο αλγόριθµος που ακολουθούµε για το συγκεκριµένο πρόβληµα είναι ο ίδιος µε το παράδειγµα Π8.5 του προηγούµενου κεφαλαίου: Υπολογίζουµε το υπόλοιπο και το πηλίκο της διαίρεσης του αριθµού δια 10. Το υπόλοιπο αποτελεί το πρώτο ψηφίο. Αντικαθιστούµε τον αριθµό µε το πηλίκο που βρήκαµε και συνεχίζουµε τη διαδικασία µέχρι να βρούµε πηλίκο 0. Η µεταβλητή cnt "µετράει" τα ψηφία του αριθµού. Η συνάρτηση επιστρέφει την τιµή της cnt. 9_p9_1.c 9_p9_2.c 191

Η γλώσσα C σε βάθος 9.9 Ο είκτης Μάζας Σώµατος ( ΜΣ) υπολογίζεται από τον τύπο Β/Υ 2, ό- που Β το βάρος σε κιλά και Υ το ύψος σε µέτρα. Ανάλογα µε την τιµή του ΜΣ ένα άτοµο χαρακτηρίζεται σύµφωνα µε τον παρακάτω πίνακα: ΜΣ µικρότερος από 18.5 από 18.5 και µικρότερος του 25 από 25 και µικρότερος του 30 από 30 και πάνω Περιγραφή Λιποβαρής Κανονικός Υπέρβαρος Παχύσαρκος Να γραφεί πρόγραµµα το οποίο θα ζητάει να πληκτρολογούµε το βάρος και το ύψος διάφορων ατόµων, θα υπολογίζει τον ΜΣ και θα εµφανίζει το χαρακτηρισµό του ατόµου (π.χ. υπέρβαρος). Το πρόγραµµα θα σταµατάει όταν δοθεί τιµή 0 είτε για το βάρος είτε για το ύψος. Ο υπολογισµός του ΜΣ πρέπει να υλοποιείται από µια συνάρτηση. Επίσης από µια δεύτερη συνάρτηση θα πρέπει να υλοποιείται η εµφάνιση των αποτελεσµάτων. 9.10 Με δεδοµένη την αλγεβρική συνάρτηση f(x)=x 4-10x 2 +2, να γραφεί πρόγραµµα που να εµφανίζει τις τιµές που επιστρέφει η συνάρτηση για τιµές του x από 0 µέχρι 1 µε βήµα 0.05. Να εµφανίζονται τα ζεύγη τιµών x, f(x) µε ακρίβεια τριών δεκαδικών ψηφίων. Η τιµή της f(x) να υπολογίζεται από ξεχωριστή συνάρτηση στο πρόγραµµά σας. 9.11 Ο ΦΠΑ ενός προϊόντος µπορεί να ανήκει στις παρακάτω κατηγορίες: Κατηγορία Ποσοστό ΦΠΑ 1 0.00 2 0.06 3 0.13 4 0.19 Να γραφεί πρόγραµµα το οποίο θα ζητάει να πληκτρολογούµε το πλήθος, τη τιµή µονάδας και τη κατηγορία ΦΠΑ για 10 προϊόντα. Το πρόγραµµα θα πρέπει να εµφανίζει το συνολικό κόστος της δαπάνης καθώς και το σύνολο του ΦΠΑ για όλα τα προϊόντα που αγοράσαµε. Ο υπολογισµός του ΦΠΑ πρέπει να υλοποιείται από µια συνάρτηση στην οποία θα µεταβιβάζεται το συνολικό ποσό ανά προϊόν καθώς και η κατηγορία ΦΠΑ στην οποία ανήκει. 198