26
Η Γλώσσα Προγραμματισμού C (Μέρος 1 - Εισαγωγή) Σύντομη Ιστορία της C Η γλώσσα προγραμματισμού C δημιουργήθηκε από τον Dennis Ritchie στα Bell Labs το 1972 όταν αυτός και ο Ken Thompson ασχολούνταν με τον σχεδιασμό του λειτουργικού συστήματος Unix. Η C ήταν μια εξέλιξη της γλώσσας Β του Ken Thompson και εκείνη με τη σειρά της ήταν μια εξέλιξη της γλώσσας BCPL και δημιουργήθηκε για να μπορέσει να καλύψει κάποιες αυξημένες ανάγκες στον προγραμματισμό. Αργότερα αναπτύχθηκαν πολλές παραλλαγές της C που ήταν επόμενο να έχουν ασυμφωνίες μεταξύ τους. Έτσι, δημιουργήθηκε μια επιτροπή στις αρχές του καλοκαιριού του 1983 που άρχισε να δουλεύει πάνω στη δημιουργία ενός προτύπου Ansi το οποίο και θα όριζε μια για πάντα τη γλώσσα C. Μια Σύγκριση των Γλωσσών Προγραμματισμού Η C θεωρείται γενικά γλώσσα μέσου επιπέδου και αυτό γιατί συνδυάζει στοιχεία των γλωσσών υψηλού επιπέδου (high level languages), όπως είναι η Cobol και η Pascal και στοιχεία των γλωσσών χαμηλού επιπέδου (low level languages), όπως είναι η Assembly. Για να διευκρινίσουμε, πρέπει να πούμε ότι σαν γλώσσα υψηλού επιπέδου θεωρείται η γλώσσα εκείνη που είναι αρκετά περιγραφική και που είναι έτσι πιο κοντά στην ανθρώπινη γραπτή γλώσσα και σαν γλώσσα χαμηλού επιπέδου θεωρείται εκείνη που είναι πιο κοντά στη μηχανή. Αυτός ο χαρακτηρισμός δεν έχει καμία απολύτως σχέση με τις δυνατότητες της γλώσσας. Σίγουρα, η κάθε γλώσσα προγραμματισμού έχει κάποιες προτεραιότητες να εκπληρώσει. Η Pascal, για παράδειγμα, χρησιμοποιείται κυρίως για τη σωστή διδασκαλία των αρχών του προγραμματισμού, ενώ η Basic δημιουργήθηκε έτσι ώστε να δώσει τη δυνατότητα σε αρχάριους στον προγραμματισμό να κάνουν με άνεση και ευκολία τα πρώτα τους βήματα στον ιδιόμορφο αυτό χώρο. Ο Clipper και η Cobol είναι καθαρά επαγγελματικές γλώσσες προγραμματισμού.

Glossa Programmatismou C 1 Eisagogi

Embed Size (px)

Citation preview

Page 1: Glossa Programmatismou C 1 Eisagogi

Η ΓλώσσαΠρογραμματισμού C(Μέρος 1 - Εισαγωγή)

Σύντομη Ιστορία της CΗ γλώσσα προγραμματισμού C δημιουργήθηκε από τον Dennis Ritchie σταBell Labs το 1972 όταν αυτός και ο Ken Thompson ασχολούνταν με τονσχεδιασμό του λειτουργικού συστήματος Unix. Η C ήταν μια εξέλιξη τηςγλώσσας Β του Ken Thompson και εκείνη με τη σειρά της ήταν μια εξέλιξητης γλώσσας BCPL και δημιουργήθηκε για να μπορέσει να καλύψει κάποιεςαυξημένες ανάγκες στον προγραμματισμό.

Αργότερα αναπτύχθηκαν πολλές παραλλαγές της C που ήταν επόμενο να έχουνασυμφωνίες μεταξύ τους. Έτσι, δημιουργήθηκε μια επιτροπή στις αρχές τουκαλοκαιριού του 1983 που άρχισε να δουλεύει πάνω στη δημιουργία ενόςπροτύπου Ansi το οποίο και θα όριζε μια για πάντα τη γλώσσα C.

Μια Σύγκριση των Γλωσσών ΠρογραμματισμούΗ C θεωρείται γενικά γλώσσα μέσου επιπέδου και αυτό γιατί συνδυάζειστοιχεία των γλωσσών υψηλού επιπέδου (high level languages), όπως είναι ηCobol και η Pascal και στοιχεία των γλωσσών χαμηλού επιπέδου (low levellanguages), όπως είναι η Assembly.

Για να διευκρινίσουμε, πρέπει να πούμε ότι σαν γλώσσα υψηλού επιπέδουθεωρείται η γλώσσα εκείνη που είναι αρκετά περιγραφική και που είναι έτσιπιο κοντά στην ανθρώπινη γραπτή γλώσσα και σαν γλώσσα χαμηλού επιπέδουθεωρείται εκείνη που είναι πιο κοντά στη μηχανή. Αυτός ο χαρακτηρισμός δενέχει καμία απολύτως σχέση με τις δυνατότητες της γλώσσας.

Σίγουρα, η κάθε γλώσσα προγραμματισμού έχει κάποιες προτεραιότητες ναεκπληρώσει. Η Pascal, για παράδειγμα, χρησιμοποιείται κυρίως για τη σωστήδιδασκαλία των αρχών του προγραμματισμού, ενώ η Basic δημιουργήθηκεέτσι ώστε να δώσει τη δυνατότητα σε αρχάριους στον προγραμματισμό νακάνουν με άνεση και ευκολία τα πρώτα τους βήματα στον ιδιόμορφο αυτόχώρο. Ο Clipper και η Cobol είναι καθαρά επαγγελματικές γλώσσεςπρογραμματισμού.

Page 2: Glossa Programmatismou C 1 Eisagogi

Η C, όμως, μπόρεσε να φέρει τον προγραμματιστή πιο κοντά στο hardware,που με τις άλλες γνωστές γλώσσες προγραμματισμού κάτι τέτοιο θα ήταν πολύδύσκολο να γίνει. Βέβαια, η κάθε γλώσσα προγραμματισμού κάνει καιδιαφορετική δουλειά και δεν θα ήταν σωστό να κάνουμε συγκρίσεις, για τονίδιο λόγο που δεν μπορούμε να συγκρίνουμε ένα αεροπλάνο μ’ ένα ποδήλατοκαθώς το καθένα είναι προορισμένο να κάνει διαφορετική δουλειά.

Τα Πλεονεκτήματα της CΤα τελευταία χρόνια η C έχει καθιερωθεί ως μια από τις σημαντικότερες καιδημοφιλέστερες γλώσσες προγραμματισμού. Τα σημαντικότεραπλεονεκτήματα που εξηγούν αυτήν την προτίμησή της, αναφέρονταιπαρακάτω.

Χαρακτηριστικά Σχεδίασης, Η C έχει μοντέρνες δομές ελέγχουγια να μπορούμε να κάνουμε επαναληπτικές εργασίες και γιαεύκολη επιλογή εναλλακτικών τρόπων δράσης. Με το πλήθοςτων δομών δεδομένων που διαθέτει, μπορεί να αναπαραστήσειένα μεγάλο σύνολο από διαφορετικούς τύπους πληροφοριών.Έχει και το μεγάλο πλεονέκτημα ότι επιβάλλει τη διάσπαση τουπρογράμματος σε αυτοδύναμες ενότητες, τις συναρτήσεις.

Αποτελεσματική, Η C είναι μια αποτελεσματική γλώσσαπρογραμματισμού, που είναι τόσο συμπεριεκτική, ώστε ναχρησιμοποιούμε σ' αυτήν πολύ λιγότερες λέξεις σε σχέση μεάλλες γλώσσες. Έχει έναν συμπαγή και γρήγορο κώδικα.

Φορητή Γλώσσα, Η C είναι μια φορητή γλώσσα, δηλ. ταπρογράμματά της μπορούν να τρέξουν με λίγες ή και με καθόλουτροποποιήσεις και σε ένα άλλο σύστημα. Μάλιστα θεωρείται σανη πιο φορητή γλώσσα.

Δυναμικότητα και Ευελιξία, Η C είναι δυναμική και ευέλικτη, δύοιδιότητες που είναι αρκετά δημοφιλείς στους υπολογιστές. Όπωςξέρουμε, το μεγαλύτερο μέρος του δυναμικού και ευέλικτουλειτουργικού συστήματος Unix είναι γραμμένο σε C. Αυτόισχύει και για επεξεργαστές κειμένων, μεταγλωττιστές(compilers) και ερμηνευτές (interpreters) γλωσσώνπρογραμματισμού. Η C διαθέτει μερικά από τα χαρακτηριστικάελέγχου που συνήθως τα συναντάμε στη συμβολική γλώσσα(assembly language).

Προσανατολισμός προς τον Προγραμματιστή, Η C είναιπροσανατολισμένη προς τις ανάγκες του προγραμματιστή, ο

eBooks4Greeks.gr

Page 3: Glossa Programmatismou C 1 Eisagogi

οποίος και έχει άμεση πρόσβαση στο υλικό. Με τη C έχουμε τησπουδαία δυνατότητα να μπορούμε να χειριζόμαστε μεμονωμένατα δυαδικά ψηφία (bits) της μνήμης. Γενικά η C είναι πολύλιγότερο περιοριστική στο να μας αφήνει να κάνουμε ό,τιθέλουμε σε σχέση με την Pascal για παράδειγμα.

Αυτή η ελευθερία είναι και πλεονέκτημα, αλλά είναι και επικίνδυνη όπως είναιφυσικό. Στη C τα πάντα (σχεδόν) επιτρέπονται. Δεν γίνεται έλεγχος τωντύπων, άρα μπορεί κανείς να ανακατέψει ό,τι δεδομένα θέλει, κάτι που είναιπολύ χρήσιμο όταν προγραμματίζουμε σε επίπεδο συστήματος. Ακόμη, η Cέχει μια τεράστια βιβλιοθήκη από χρήσιμες συναρτήσεις.

Τα Μειονεκτήματα της CΗ C έχει και μειονεκτήματα, γιατί όπως πολύ καλά ξέρουμε η πολύ ελευθερίαβλάπτει. Για παράδειγμα, η ελευθερία έκφρασης που αναφέραμε παραπάνω ότιέχει η C, απαιτεί από τον προγραμματιστή μια αυξημένη επαγρύπνηση καιυπευθυνότητα.

Ακόμη, η λακωνικότητα της C σε συνδυασμό με τον πλούτο των τελεστών πουέχει, έχει σαν αποτέλεσμα τη δημιουργία προγραμμάτων που είναι τόσοδυσανάγνωστα, ώστε να είναι δύσκολο να τα κατανοήσει κάποιος με την πρώτηματιά και πολλές φορές ακόμα και αυτός που τα έγραψε.

Επιπλέον, συχνά είναι πολύ δύσκολο να ανιχνευθούν και τα λογικά λάθη σ’ένα πρόγραμμα της C. Η C έχει τελικά τόσες πολλές δυνατότητες έκφρασης,ώστε να χρειαστεί πολύς καιρός για να μπορεί να πει κανείς με βεβαιότητα ότιτην έμαθε καλά.

Γράψιμο προγράμματος σε CΌπως είπαμε στα προηγούμενα, η C επιβάλλει τον καταμερισμό τουπρογράμματος σε ενότητες, που ονομάζονται συναρτήσεις (functions). Εάνείναι απαραίτητο, οι συναρτήσεις μπορούν να χωριστούν και σε μικρότερεςσυναρτήσεις. Επίσης, στη C το κύριο πρόγραμμα είναι κι αυτό μια συνάρτηση,που ονομάζεται main().

Μια μέθοδος για το γράψιμο ενός προγράμματος στη C είναι να ξεκινήσουμεγράφοντας τη συνάρτηση main(), την ενότητα του πιο πάνω επιπέδου και μετάνα ασχοληθούμε με τις συναρτήσεις των πιο κάτω επιπέδων. Η διαδικασίααυτή ονομάζεται πάνω-προς-τα-κάτω προγραμματισμός (top-downprogramming).

Page 4: Glossa Programmatismou C 1 Eisagogi

Η αντίστροφη διαδικασία, δηλ. το να ασχοληθούμε πρώτα με τις συναρτήσειςτων κατώτερων επιπέδων και μετά να ανεβαίνουμε προς τα πάνω, ονομάζεταικάτω-προς-τα-πάνω προγραμματισμός (bottom-up programming). Έναπλεονέκτημα του πάνω-προς-τα-κάτω προγραμματισμού είναι ότι μπορούμε ναχαράξουμε καλύτερα τη ροή του προγράμματος, μια και δεν ασχολούμαστεαπό την αρχή με τις λεπτομέρειες των επί μέρους συναρτήσεων.

Αντικατάσταση της Assembly από τη CΌπως ίσως ξέρουμε, η γλώσσα Assembly χρησιμοποιεί μια συμβολικήαναπαράσταση του πραγματικού δυαδικού κώδικα που εκτελεί απευθείας ουπολογιστής και η κάθε εντολή της Assembly αντιστοιχεί σε μία μόνο ενέργειαπου θα πρέπει να εκτελέσει ο υπολογιστής.

Η γλώσσα Assembly είναι, όμως, δύσκολη στο γράψιμο προγραμμάτων καιεπειδή δεν είναι καθόλου δομημένη, κάνει το τελικό πρόγραμμα να είναιανεπιθύμητο από τους προγραμματιστές. Ο ερχομός της C κάνει περιττή πλέοντη χρήση της Assembly.

Έτσι, με τη C μπορούμε να γράψουμε προγράμματα που να έχουν την ίδιααποτελεσματικότητα με άλλα ανάλογα προγράμματα που είναι γραμμένα στηγλώσσα Assembly, αλλά να έχουμε συγχρόνως και τα σπουδαίαπλεονεκτήματα μιας γλώσσας προγραμματισμού ανωτέρου επιπέδου.

Μεταγλώττιση και Σύνδεση ΠρογράμματοςΟ μεταγλωττιστής (compiler) της C μετατρέπει τον πηγαίο κώδικα (sourceprogram), δηλ. το πρόγραμμα που γράφουμε σε C, σ’ έναν αντικειμενικόκώδικα (object program) και το πρόγραμμα σύνδεσης (linker) συνδυάζει αυτόντον κώδικα με άλλους κώδικες και δημιουργείται έτσι το εκτελέσιμο αρχείο(executable file). Τα προγράμματα της C έχουν την επέκταση .c.

Ο ρόλος του προγράμματος σύνδεσης είναι να ενώσει τον τελικό κώδικα, τονκώδικα εκκίνησης (start-up code) του συστήματός μας και τον κώδικαβιβλιοθήκης (library code) στο εκτελέσιμο αρχείο. Ο κώδικας εκκίνησης έχεισχέση με την επικοινωνία μεταξύ του προγράμματος και του λειτουργικούσυστήματος και ο κώδικας βιβλιοθήκης περιέχει τον τελικό κώδικα για πολλέςσυναρτήσεις.

Σε μερικά συστήματα πρέπει να τρέξουμε τα προγράμματα μεταγλώττισης καισύνδεσης ξεχωριστά, ενώ σ' άλλα ο μεταγλωττιστής ενεργοποιεί το πρόγραμμασύνδεσης αυτόματα μόνος του.

Page 5: Glossa Programmatismou C 1 Eisagogi

Το Περιβάλλον της Turbo-CΗ Turbo-C φορτώνεται με την εντολή tc από το Dos. Θα εμφανιστεί ένα κύριομενού, που θα έχει τις παρακάτω επιλογές :

File : Εμφανίζει έναν νέο πίνακα επιλογών απ' όπου μπορούμε ναφορτώσουμε ένα παλιό πρόγραμμα, να ξεκινήσουμε ένακαινούργιο πρόγραμμα, να σώσουμε το τρέχον πρόγραμμα, νααλλάξουμε τρέχον υποκατάλογο και ακόμη να εγκαταλείψουμετην Turbo-C, προσωρινά ή και οριστικά.

Edit : Εμφανίζει μια νέα οθόνη όπου μπορούμε να γράψουμε τοπρόγραμμά μας.

Run : Διορθώνει, συνδέει και τρέχει τα προγράμματα αυτόματα.

Compile : Διορθώνει και μετατρέπει τα προγράμματα σεεκτελέσιμη μορφή.

Project : Συνδέει πολλά πηγαία και αντικείμενα αρχεία για τηδημιουργία κάποιου τελικού προγράμματος.

Options : Περιέχει επιλογές σχετικές με τον μεταγλωττιστή πουκαθορίζουν πώς δουλεύει το όλο περιβάλλον.

Debug : Βοηθά στην ανίχνευση λαθών και στον λάθος χειρισμόμηνυμάτων.

Ένα Απλό Πρόγραμμα στη C/* prog01.c – αυτό είναι ένα απλό πρόγραμμα στη γλώσσα C */

#include <stdio.h>

main()

{

int num; /* ορίζεται μια ακέραια μεταβλητή με το όνομα num */

num = 10 ; /* καταχώρηση τιμής στη μεταβλητή num */

printf("Ένα πολύ απλό πρόγραμμα σε C.\n"); /* η συνάρτηση printf() */

printf("Ο αγαπημένος μου αριθμός είναι ο %d.\n", num);

Page 6: Glossa Programmatismou C 1 Eisagogi

}

Αφού μεταγλωττίσουμε και τρέξετε το παραπάνω πρόγραμμα, τότε θα πρέπεινα εμφανισθούν στην οθόνη τα παρακάτω :

Ένα πολύ απλό πρόγραμμα σε C.

Ο αγαπημένος μου αριθμός είναι ο 10.

Σύντομη Ανάλυση του ΠρογράμματοςΗ πρώτη γραμμή του προγράμματος χρησιμοποιεί τα σύμβολα /* και */ για νασυμπεριλάβουμε εκεί κάποια σχόλια (comments), που θα μας βοηθήσουν νακάνουμε το πρόγραμμά μας πιο ευανάγνωστο. Αυτά τα σχόλια αγνοούνται απότον υπολογιστή. Η δεύτερη γραμμή λέει στον υπολογιστή να συμπεριλάβει(include) τις πληροφορίες που υπάρχουν στο αρχείο stdio.h, το οποίο αποτελείμέρος του πακέτου της γλώσσας C.

Τα προγράμματα της C αποτελούνται από μία ή περισσότερες συναρτήσεις,που είναι και οι βασικές ενότητες ενός προγράμματος C. Αυτό το πρόγραμμααποτελείται από μία μόνο συνάρτηση που καλείται main(). Οι παρενθέσειςυποδηλώνουν ότι το main() είναι ένα όνομα μιας συνάρτησης.

Η αγκύλη { δηλώνει την αρχή των προτάσεων που αποτελούν τη συνάρτησηκαι ο ορισμός της συνάρτησης τελειώνει με την αντίστοιχη αγκύλη }. Οιαγκύλες { και } είναι αντίστοιχες με τα begin και end της Pascal. Η πρότασηδήλωσης μάς λέει ότι θα χρησιμοποιήσουμε μια μεταβλητή με το όνομα numκαι ότι η num είναι ακέραια μεταβλητή (integer). Η πρόταση καταχώρησηςδίνει την τιμή 10 στη μεταβλητή num.

Η επόμενη γραμμή είναι για την εκτύπωση της φράσης που βρίσκεται μεταξύτων εισαγωγικών (" "). Το \n λέει στον υπολογιστή να ξεκινήσει μια νέαγραμμή (σαν να πατούσαμε το πλήκτρο <enter>). Η επόμενη γραμμή είναι γιατην εκτύπωση της τιμής της num (που είναι το 10) ανάμεσα στη φράση πουβρίσκεται μεταξύ των " ". Η εντολή %d λέει στον υπολογιστή πού και με ποιαμορφή να εκτυπώσει την τιμή της num. Το πρόγραμμα τελειώνει με τηναγκύλη }.

Λεπτομερής Ανάλυση του ΠρογράμματοςΤα Αρχεία Επικεφαλίδας #include

Page 7: Glossa Programmatismou C 1 Eisagogi

Το αρχείο stdio.h αποτελεί μέρος του μεταγλωττιστή της C και περιέχειπληροφορίες σχετικές με συναρτήσεις εισόδου και εξόδου, όπως είναι ηprintf(), που χρησιμοποιεί ο μεταγλωττιστής. Το όνομά του προέρχεται από τιςλέξεις standard input/output header. Οι χρήστες της C αναφέρουν σανεπικεφαλίδα μια συλλογή πληροφοριών που βρίσκεται στην αρχή ενόςαρχείου. Το αποτέλεσμα της εντολής #include <stdio.h> θα ήταν το ίδιο με τονα αντιγράφαμε όλο το περιεχόμενο του αρχείου stdio.h στο δικό μας αρχείο,στη θέση όπου εμφανίζεται αυτή η γραμμή προγράμματος.

Στην πραγματικότητα, αυτή η γραμμή προγράμματος δεν είναι καν μιαπρόταση της γλώσσας C. Το σύμβολο # σημαίνει ότι τη γραμμή αυτή τηδιαχειρίζεται ο προεπεξεργαστής (preprocessor) της C, ο οποίος διαχειρίζεταικάποιες εργασίες πριν από τον μεταγλωττιστή.

Η Συνάρτηση main()

Η εκτέλεση ενός προγράμματος σε C αρχίζει πάντα με μια συνάρτηση πουαποκαλείται main(). Είμαστε ελεύθεροι να επιλέξουμε τα ονόματα των άλλωνσυναρτήσεων που ίσως χρησιμοποιήσουμε, αλλά θα πρέπει υποχρεωτικά ναυπάρχει η συνάρτηση main() στην αρχή του προγράμματος. Οι παρενθέσειςδηλώνουν ότι η main() είναι μια συνάρτηση. Γενικά, οι παρενθέσεις περιέχουνπληροφορίες (ορίσματα) που θα περάσουν μέσα στη συνάρτηση. Όταν, βέβαια,δεν υπάρχουν πληροφορίες για να περάσουν (μεταβιβασθούν), τότε οιπαρενθέσεις είναι άδειες.

Τα Σχόλια

Όταν στο πρόγραμμά μας έχουμε σχόλια, τότε είναι πολύ ευκολότερο σεκάποιον άλλον, αλλά ακόμα και σε μας, να καταλάβει τι κάνει το πρόγραμμάμας. Ο,τιδήποτε υπάρχει ανάμεσα στο σύμβολο ανοίγματος /* και στοσύμβολο κλεισίματος */ των σχολίων αγνοείται από τον υπολογιστή και τασχόλια στη C μπορούν να τοποθετηθούν οπουδήποτε, ακόμα και σε πολλέςσυνεχόμενες γραμμές.

Αγκύλες, Σώματα, Μπλοκ

Οι αγκύλες { και } δηλώνουν την αρχή και το τέλος του σώματος μιαςσυνάρτησης και μπορούν ακόμη να χρησιμοποιηθούν για να συμπεριλάβουνμαζί προτάσεις μέσα σε μια ομάδα ή σ’ ένα μπλοκ του προγράμματος, κάτιδηλαδή παρόμοιο με τα begin και end της Pascal.

Οι Προτάσεις Δήλωσης

Η πρόταση δήλωσης είναι μια από τις σημαντικότερες προτάσεις της C. Ηδήλωση αυτή σημαίνει ότι κάπου μέσα στη συνάρτηση χρησιμοποιούμε τημεταβλητή που δηλώνουμε και ότι ο τύπος της είναι αυτός που δείχνουμε, π.χ.ακέραιος. Η λέξη int είναι μια λέξη-κλειδί της C, δηλ. δεν μπορεί να

Page 8: Glossa Programmatismou C 1 Eisagogi

χρησιμοποιηθεί αλλού μέσα στο πρόγραμμα σαν όνομα μιας συνάρτησης ήμιας μεταβλητής. Το ερωτηματικό στο τέλος της γραμμής δηλώνει ότι ηγραμμή αυτή αποτελεί μια πρόταση ή εντολή της C.

Οι Τύποι Δεδομένων και οι ΜεταβλητέςΗ C έχει διάφορα είδη (τύπους) δεδομένων : ακέραιους, χαρακτήρες, κινητήςυποδιαστολής, αριθμούς κ.ά. Για το όνομα μιας μεταβλητής μπορούμε ναχρησιμοποιήσουμε μικρά γράμματα, κεφαλαία γράμματα, ψηφία αριθμών καιτον χαρακτήρα της υπογράμμισης (_). Ο πρώτος χαρακτήρας, όμως, πρέπει ναείναι πάντα γράμμα.

Πρέπει να είναι όλες οι μεταβλητές του προγράμματος συγκεντρωμένες μαζίγια να είναι ευκολότερο για τον αναγνώστη να καταλάβει τι κάνει τοπρόγραμμα και ακόμη πρέπει να υπάρχουν και σχόλια δίπλα στην κάθεμεταβλητή που να εξηγούν την αποστολή της. Ακόμη, η ονομασία που δίνουμεστις μεταβλητές πρέπει να μας βοηθάει να καταλαβαίνουμε και τη χρήση τους.

Η Εντολή Καταχώρησης

Η πρόταση καταχώρησης είναι μια από τις βασικότερες προτάσεις της C και μετη χρήση της δίνουμε τιμές στις μεταβλητές του προγράμματος. Η πρότασηκαταχώρησης ολοκληρώνεται μ’ ένα ερωτηματικό ;.

Η Συνάρτηση printf()

Οι παρενθέσεις δηλώνουν κατ' αρχήν ότι πρόκειται για συνάρτηση. Ταστοιχεία που περιέχονται μεταξύ των παρενθέσεων είναι οι πληροφορίες πουπερνάμε (μεταβιβάζουμε) από τη συνάρτηση main() στη συνάρτηση printf(). Ηπληροφορία που περνάει λέγεται όρισμα της συνάρτησης και η συγκεκριμένησυνάρτηση printf() εξετάζει τι υπάρχει μεταξύ των " " και το απεικονίζει στηνοθόνη ενός τερματικού.

Για να καλέσουμε μια συνάρτηση το μόνο που χρειάζεται να κάνουμε είναι ναγράψουμε το όνομά της και να συμπεριλάβουμε το επιθυμητό όρισμα μέσα σεπαρενθέσεις. Όταν το πρόγραμμα φθάσει σ’ αυτή τη γραμμή, τότε ο έλεγχοςπερνάει στη συνάρτηση και μετά την ενεργοποίησή της, ο έλεγχος επιστρέφειστο αρχικό πρόγραμμα.

Ο χαρακτήρας \n, που δεν εμφανίζεται όταν τρέξει το πρόγραμμα, είναι στηνπραγματικότητα μια εντολή για το ξεκίνημα μιας νέας γραμμής. Ο συνδυασμός\n αποτελεί έναν απλό χαρακτήρα που καλείται χαρακτήρας νέας γραμμής,δηλ. ενεργεί όπως το πλήκτρο <enter>. Ο χαρακτήρας νέας γραμμής είναι έναπαράδειγμα αυτού που ονομάζεται ακολουθία διαφυγής και πουχρησιμοποιείται για να παριστάνει δύσκολους ή αδύνατον να

Page 9: Glossa Programmatismou C 1 Eisagogi

πληκτρολογηθούν χαρακτήρες. Άλλα παραδείγματα τέτοιων χαρακτήρων είναιτο \t για το πλήκτρο tab και το \b για ένα διάστημα προς τα πίσω (backspace).

Τι είναι, όμως, το σύμβολο %d;

Δείχνει σε ποιο σημείο θα εμφανιστεί η τιμής μιας μεταβλητής και ότι ημεταβλητή αυτή είναι ένας ακέραιος αριθμός.

Μια συνάρτηση στη C αποτελείται από μια επικεφαλίδα και ένα σώμα. Ηεπικεφαλίδα περιέχει τις προτάσεις του προεπεξεργαστή, όπως είναι η#include, και το όνομα της συνάρτησης. Το σώμα της συνάρτησης βρίσκεταιμέσα στις αγκύλες { και } και αποτελείται από μια σειρά προτάσεων, που ηκάθε μια τελειώνει μ’ ένα ελληνικό ερωτηματικό ;. Μέσα στο σώμα τηςσυνάρτησης μπορεί να υπάρχουν προτάσεις δήλωσης, καταχώρησης καικλήσης άλλων συναρτήσεων.

Τεχνικές για πιο Ευανάγνωστα ΠρογράμματαΔύο τέτοιες τεχνικές που είδαμε στα προηγούμενα ήταν η χρήση σχολίων και ησωστή ονομασία των μεταβλητών. Μια άλλη τεχνική είναι η χρήση κενώνγραμμών για να ξεχωρίζουν τα τμήματα του προγράμματος. Ακόμη, στη Cμπορούμε να τοποθετήσουμε πολλές προτάσεις σε μια γραμμή ή και ναχωρίσουμε μια πρόταση σε πολλές γραμμές.

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

Ένα Ακόμη Παράδειγμα στη C/* prog02.c – το πρόγραμμα αυτό μετατρέπει τα μέτρα σε εκατοστά */

#include <stdio.h>

main()

{

int cm, metres;

metres = 2;

cm = 100 * metres;

Page 10: Glossa Programmatismou C 1 Eisagogi

printf("Υπάρχουν %d εκατοστά σε %d μέτρα. \n", cm, metres);

}

Όπως βλέπουμε, το πρώτο σχόλιο του προγράμματος περιέχει το όνομά τουκαι το τι ακριβώς κάνει. Ακόμη, το πρόγραμμα δηλώνει δύο ακέραιεςμεταβλητές μαζί, τις οποίες και διαχωρίζει με κόμμα. Χρησιμοποιεί τοντελεστή του πολλαπλασιασμού, που είναι το * και εκτυπώνει πολλέςμεταβλητές μαζί στη συνάρτηση printf(). Όταν τρέξει το πρόγραμμα, θα δώσειτο εξής αποτέλεσμα :

Υπάρχουν 200 εκατοστά σε 2 μέτρα.

Κλήση ΣυνάρτησηςΣτο επόμενο παράδειγμα θα δούμε πώς μπορούμε να συμπεριλάβουμε και νακαλούμε και μια δική μας συνάρτηση.

/* prog03.c – ένα πρόγραμμα που καλεί μια συνάρτηση */

#include <stdio.h>

main()

{

printf("Θα καλέσω τη συνάρτηση της Φλώρινας.\n");

florina();

printf("Η κλήση της συνάρτησης έγινε.\n");

}

florina()

{

printf("Γεια σας από τη Φλώρινα.\n");

}

Το αποτέλεσμα του προγράμματος θα είναι το παρακάτω :

Θα καλέσω τη συνάρτηση της Φλώρινας.

Page 11: Glossa Programmatismou C 1 Eisagogi

Γεια σας από τη Φλώρινα.

Η κλήση της συνάρτησης έγινε.

Η συνάρτηση florina) ορίζεται με τον ίδιο τρόπο, όπως και η main(), με τοσώμα της να βρίσκεται ανάμεσα σε αγκύλες. Η συνάρτηση καλείται δίνονταςαπλά το όνομά της μαζί με τις παρενθέσεις. Όταν η συνάρτηση florina()τελειώσει τη δουλειά της, το πρόγραμμα προχωράει στην επόμενη πρόταση τηςmain().

Πρέπει να έχουμε υπόψη μας ότι οι συναρτήσεις μπορούν να γραφούν είτεπριν ή μετά από την κύρια συνάρτηση main(), αλλά εκτελούνται μόνο όταν καιόπου η main() τις καλεί.

Έλεγχος της Ορθότητας των ΠρογραμμάτωνΣυντακτικά Λάθη

Το συντακτικό λάθος στη C είναι κάτι ανάλογο με το γραμματικό λάθος στηγλώσσα που μιλάμε. Συντακτικά λάθη στη C μπορούν να γίνουν και με τηχρήση επιτρεπτών συμβόλων σε λανθασμένες θέσεις. Παραδείγματα τέτοιωνλαθών μπορεί να είναι η μη σωστή χρήση των αγκυλών { και } ή ακόμη το ναανοίγουμε μια αγκύλη και να μην την κλείνουμε, το να ανοίγουμε κάπουσχόλια και να ξεχνάμε να τα κλείσουμε κοκ.

Όπως ξέρουμε, μέρος της δουλειάς του μεταγλωττιστή είναι και η ανακάλυψητων συντακτικών λαθών του προγράμματος. Υπάρχουν, όμως, και περιπτώσειςόπου ένα λάθος παράγει, άθελά μας, και άλλα λάθη.

Εννοιολογικά Λάθη

Το εννοιολογικό λάθος είναι το λάθος στο νόημα των προτάσεων. Στη Cεννοιολογικά λάθη μπορούμε να κάνουμε, όταν ακολουθούμε μεν σωστά τουςκανόνες της γλώσσας, αλλά με λανθασμένο αποτέλεσμα. Τέτοιο λάθος μπορείνα γίνει, όταν π.χ. αντί να προσθέσουμε δύο μεταβλητές, τιςπολλαπλασιάζουμε. Με τα λάθη αυτά βέβαια δεν έχει καμία σχέση ομεταγλωττιστής. Είναι δική μας δουλειά να τα ανακαλύψουμε και να ταδιορθώσουμε. Ο καλύτερος τρόπος για να ανακαλύψουμε τέτοια λάθη είναι ναεξετάσουμε το πρόγραμμα βήμα-βήμα.

Μπορούμε ακόμα να χρησιμοποιούμε επιλεκτικά και τη συνάρτηση printf()μέσα στο πρόγραμμα, ώστε να ελέγχουμε τις τιμές κάποιων μεταβλητών τουπρογράμματος. Τις εντολές printf() τις απομακρύνουμε μετά όταν τοπρόγραμμά μας λειτουργήσει κανονικά. Και η χρήση των σχολίων μπορεί νααποδειχθεί χρήσιμη εδώ, γιατί με τη βοήθειά τους μπορούμε να απομονώσουμε

Page 12: Glossa Programmatismou C 1 Eisagogi

κάποιο κομμάτι του προγράμματος προσωρινά και να ελέγξουμε έτσι τηνορθότητα του υπόλοιπου προγράμματος.

Υπάρχουν και ειδικά προγράμματα που λέγονται αποσφαλματωτές (debuggers)και που μας επιτρέπουν να βλέπουμε τις τιμές των μεταβλητών τουπρογράμματος και ποια γραμμή του προγράμματος εκτελείται.

Οι Λέξεις-Κλειδιά της ANSI CΟι λέξεις-κλειδιά ή δεσμευμένες λέξεις (reserved words) αποτελούν το λεξιλόγιοτης C και γι’ αυτόν τον λόγο δεν μπορούμε να τις χρησιμοποιούμε για ναδηλώσουμε ονόματα μεταβλητών ή συναρτήσεων στα προγράμματά μας.

Οι λέξεις αυτές είναι οι εξής :

auto break case char const continue default do double else enum extern float for gotoif int long register return short signed sizeof static structswitch typedef union unsigned voidvolatile while

Θα δούμε τώρα τα δεδομένα και τις ιδιότητές τους και θα μελετήσουμε κυρίωςτις τρεις μεγάλες οικογένειες, των ακεραίων αριθμών, των αριθμών κινητήςυποδιαστολής και των χαρακτήρων.

Ένα Απλό ΠρόγραμμαΑκολουθεί ένα απλό πρόγραμμα σε C.

/* prog04.c – η αξία ενός ποσού σε ευρώ */

#include <stdio.h>

main()

{

float draxmes, euro; /* 2 μεταβλητές κινητής υποδιαστολής */

char beep; /* μια μεταβλητή τύπου χαρακτήρα */

Page 13: Glossa Programmatismou C 1 Eisagogi

beep = ‘\007’ /* καταχώρηση ενός ειδικού χαρακτήρα */

printf("Θέλετε να μάθετε την αξία των χρημάτων σας σε δραχμές;\n");

printf("Παρακαλώ δώστε την αξία σε ευρώ \n");

printf("και θα δούμε.\n");

scanf("%f", &euro); /* παίρνουμε δεδομένα από τον χρήστη */

draxmes = 340.75 * euro; /* ο συντελεστής 340.75 μετατρέπει τιςδραχμές σε ευρώ */

printf("%c Η αξία σε δραχμές είναι %.2f%c. \n", beep, draxmes, beep);

}

Αφού τρέξουμε αυτό το πρόγραμμα, θα πάρουμε το εξής αποτέλεσμα :

Θέλετε να μάθετε την αξία των χρημάτων σας σε δραχμές;

Παρακαλώ δώστε την αξία σε ευρώ και θα δούμε.

100.00

Η αξία σε δραχμές είναι 34075.00

Τι Καινούργια Στοιχεία ΥπάρχουνΠρώτα απ' όλα χρησιμοποιούμε δύο νέα είδη μεταβλητών, μια μεταβλητήκινητής υποδιαστολής (float) και μια μεταβλητή χαρακτήρων (char) καισυνεπώς μπορούμε τώρα να διαχειριστούμε περισσότερα δεδομένα. Για τηνεμφάνιση στην οθόνη αυτών των νέων ειδών μεταβλητών χρησιμοποιούμετους κώδικες %f και %c της printf() αντίστοιχα. Η χρήση του .2 σημαίνει δύοδεκαδικά ψηφία στην εμφάνιση του δεκαδικού αριθμού, άσχετα αν με τιςδραχμές δεν είχαμε δεκαδικά ψηφία.

Για την εισαγωγή δεδομένων από το πληκτρολόγιο χρησιμοποιούμε τησυνάρτηση scanf(). Ο κώδικας %f καθοδηγεί το πρόγραμμα να διαβάσει έναναριθμό κινητής υποδιαστολής και το &euro λέει στη συνάρτηση scanf() νακαταχωρήσει την τιμή στη μεταβλητή euro. Το σύμβολο & θα αναλυθείαργότερα.

Οι δύο συναρτήσεις printf() και scanf() επιτυγχάνουν τη διαλογική επικοινωνίαμας με τον υπολογιστή, αφού η μεν scanf() διαβάζει δεδομένα από τοπληκτρολόγιο και τα μεταφέρει για επεξεργασία στο πρόγραμμα και η printf()

Page 14: Glossa Programmatismou C 1 Eisagogi

διαβάζει δεδομένα από το πρόγραμμα και τα εμφανίζει στην οθόνη. Υπάρχειακόμα και ο χαρακτήρας beep που παριστάνει το ηχητικό σήμα.

Οι Τύποι ΔεδομένωνΟ τύπος μιας μεταβλητής μπορεί να καθοριστεί σε μια πρόταση δήλωσης. Η Cχρησιμοποιεί τις εξής επτά λέξεις-κλειδιά για τους τύπους δεδομένων της :

int, long, short, unsigned, char, float και double.

Η int δηλώνει τον βασικό τύπο ακεραίων και οι long, short και unsignedχρησιμοποιούνται σε παραλλαγές του βασικού τύπου. Η char χρησιμοποιείταιγενικά για τους χαρακτήρες και οι float, double και ο συνδυασμός long doubleχρησιμοποιούνται για την παράσταση αριθμών κινητής υποδιαστολής.

Οι πέντε πρώτες λέξεις-κλειδιά δημιουργούν ακέραιους τύπους, ενώ οι δύοτελευταίες τύπους κινητής υποδιαστολής. Οι ακέραιοι αποθηκεύονται σε μορφήψηφιακών αριθμών, ενώ για τους αριθμούς κινητής υποδιαστολής υπάρχουνπολλοί τρόποι για να τους παραστήσουμε μέσα στον υπολογιστή.

Ο πιο γνωστός είναι με τη χρήση του συμβόλου Ε, όπου και έχουμε τοκλασματικό και το εκθετικό τμήμα του αριθμού, τα οποία και αποθηκεύονταιξεχωριστά. Έτσι, ο 7 γράφεται σαν 0.7Ε1, που σημαίνει 0.7 Χ 101 = 7.

Κάτι που πρέπει να τονιστεί για τους αριθμούς κινητής υποδιαστολής είναι τασυχνά σφάλματα στρογγυλοποίησης που μπορεί να συμβούν μ' αυτούς και έτσισαν γενικό κανόνα πρέπει να έχουμε υπόψη μας το ότι όταν οι ακέραιοιαριθμοί κάνουν τη δουλειά μας, να τους χρησιμοποιούμε ανεπιφύλακτα.

Οι Ακέραιοι Τύποι ΔεδομένωνΟ τύπος int που ήδη ξέρουμε είναι ένας ακέραιος με πρόσημο, δηλ. πρέπει ναείναι ένας ολόκληρος ακέραιος και μπορεί να είναι θετικός, αρνητικός ή καιμηδέν. Συνήθως χρησιμοποιούνται δύο ψηφιολέξεις (bytes) για νααποθηκευθεί ένας ακέραιος της μορφής αυτής και έτσι το εύρος τιμών τουείναι από -32768 έως και +32767. Η λέξη-κλειδί int χρησιμοποιείται για τηδήλωση μεταβλητών αυτού του τύπου. Για να δηλώσουμε περισσότερεςμεταβλητές αυτού του τύπου, μπορούμε είτε να τις δηλώσουμε χωριστά, ή νατις δηλώσουμε όλες μαζί, αλλά χωρισμένες με κόμμα.

Οι δηλώσεις δημιουργούν μεταβλητές, αλλά δεν καταχωρούν τιμές σ' αυτές. Ηκαταχώρηση των τιμών γίνεται μέσα στο πρόγραμμα με τις εντολέςκαταχώρησης ή και μέσω της συνάρτησης scanf(). Απόδοση αρχικής τιμής σε

Page 15: Glossa Programmatismou C 1 Eisagogi

μια μεταβλητή σημαίνει να ορίσουμε την τιμή εκκίνησης της μεταβλητής. ΣτηC αυτό μπορεί να γίνει σε μια πρόταση δήλωσης, όπου μετά το όνομα τηςμεταβλητής υπάρχει ο τελεστής καταχώρησης (=) και μετά η αρχική τιμή τηςμεταβλητής, ως εξής :

int a=10;

int b, cs=20;

Στη C ειδικά προθέματα δηλώνουν ποια βάση αρίθμησης χρησιμοποιούμε. Τοπρόθεμα 0 (μηδέν) σημαίνει ότι γράφουμε στο οκταδικό και το πρόθεμα 0x ή0X σημαίνει ότι ο αριθμός είναι δεκαεξαδικός. Έτσι, ο δεκαδικός αριθμός 16γράφεται στο οκταδικό σύστημα σαν 020 και στο δεκαεξαδικό σύστημα σαν0x10 ή 0X10. Σ' όλες τις περιπτώσεις χρησιμοποιείται ο δυαδικός κώδικας απότον υπολογιστή για την αποθήκευση του αριθμού.

Το σύμβολο %d που είδαμε στα προηγούμενα παραδείγματα αντιστοιχεί σε μιαακέραια τιμή αριθμού, που μπορεί να είναι μια μεταβλητή τύπου int, μιαακέραια σταθερά τύπου int ή και οποιαδήποτε άλλη έκφραση, που έχει όμωςμια ακέραια τιμή int. Ακολουθεί ένα απλό πρόγραμμα που επεξηγεί ταπαραπάνω :

/* prog05.c – μερικές ιδιότητες της printf() */

#include <stdio.h>

main()

{

int ten = 10;

printf("%d μείον %d ίσον %d\n", ten, 2, ten-2);

}

Το αποτέλεσμα του προγράμματος θα είναι :

10 μείον 2 ίσον 8

Μπορούμε, όμως, να εκτυπώσουμε τους ακέραιους αριθμούς στο οκταδικόσύστημα με το σύμβολο %o και στο δεκαεξαδικό με το σύμβολο %x.Ακολουθεί ένα απλό παράδειγμα :

/* prog06.c – εκτύπωση του αριθμού 100 σε τρία αριθμητικά συστήματα */

#include <stdio.h>

main()

Page 16: Glossa Programmatismou C 1 Eisagogi

{

int x = 100;

printf("δεκαδ = %d; οκταδ = %o; δεκαεξ = %x\n", x, x, x);

}

Το αποτέλεσμα του προγράμματος θα είναι :

δεκαδ = 100; οκταδ = 144; δεκαεξ = 64

Παρατηρούμε ότι τα προθέματα 0 και 0x δεν παρουσιάζονται στην έξοδο.

Άλλοι Τύποι ΑκεραίωνΗ C προσφέρει τρεις τύπους λέξεις-κλειδιά για την τροποποίηση του βασικούτύπου ακεραίου : unsigned, long και short. Ο τύπος short int ή short είναι έναςτύπος με πρόσημο και χρησιμοποιεί λιγότερο χώρο αποθήκευσης, απ' ό,τι ο intκαι έτσι μπορεί να χρησιμοποιηθεί για μικρούς αριθμούς. Ο τύπος long int ήlong είναι ένας τύπος με πρόσημο που χρησιμοποιεί περισσότερο χώροαποθήκευσης απ' ό,τι ο int και συνεπώς επιτρέπει τη χρήση μεγάλων ακεραίων.Ο τύπος unsigned επιτρέπει τη χρήση της κλίμακας από το 0 μέχρι το 65535αντί για την κλίμακα από το -32768 μέχρι το +32767.

Όσον αφορά τώρα τη χρήση αυτών των τύπων ακεραίων, πρέπει να έχουμευπόψη μας ότι ο τύπος unsigned μπορεί να χρησιμοποιηθεί για μέτρημα, αφούδεν υπάρχουν σ' αυτόν τον τύπο αρνητικοί αριθμοί. Ο τύπος longχρησιμοποιείται αν έχουμε πολύ μεγάλους αριθμούς, που δεν μπορεί να τουςδιαχειριστεί ο τύπος int. Δεν πρέπει, όμως, να χρησιμοποιείται ο τύπος long αναυτό δεν είναι απαραίτητο, γιατί επιβραδύνει τους υπολογισμούς καικαταλαμβάνει πολύ μνήμη. Μπορούμε να χρησιμοποιήσουμε τον τύπο shortόταν χρησιμοποιούμε μεγάλους πίνακες ακεραίων στο πρόγραμμά μας.

Για να αποθηκευθεί μια σταθερά σαν τύπου long, θα πρέπει να προσθέσουμετην κατάληξη l ή L και οι καταλήξεις αυτές μπορούν να χρησιμοποιηθούνακόμα και με τους οκταδικούς ή τους δεκαεξαδικούς ακέραιους. Για τηνεκτύπωση ενός αριθμού τύπου unsigned χρησιμοποιούμε το σύμβολο %u, ενόςαριθμού τύπου long το %ld και ακόμη μπορούμε να συνδυάσουμε το l με τα oκαι x. Ακόμη, το %h χρησιμοποιείται για τον τύπο short.

Οι Χαρακτήρες

Page 17: Glossa Programmatismou C 1 Eisagogi

Όπως ήδη ξέρουμε, ο τύπος char χρησιμοποιείται για την αποθήκευσηχαρακτήρων, αν και στην πραγματικότητα αποθηκεύει ακέραιους. Για τονχειρισμό των χαρακτήρων ο υπολογιστής χρησιμοποιεί έναν αριθμητικόκώδικα, όπου συγκεκριμένοι ακέραιοι παριστάνουν συγκεκριμένουςχαρακτήρες. Ο πιο συχνά χρησιμοποιούμενος κώδικας είναι ο ASCII και γιαπαράδειγμα ο ακέραιος 65 παριστάνει το γράμμα Α. Οι μεταβλητές τύπου charδηλώνονται όπως όλες οι μεταβλητές :

char name, city;

Υπάρχουν εκδόσεις της C που έχουν τον τύπο char με πρόσημο και με περιοχήτιμών από -128 έως +127 και άλλες εκδόσεις της C έχουν τον τύπο char χωρίςπρόσημο και με περιοχή τιμών από 0 έως 255. Μπορούμε να δώσουμε αρχικέςτιμές στις μεταβλητές τύπου char με δύο τρόπους :

char grade = 65; /* εδώ χρησιμοποιούμε τον ASCII κώδικα του Α */

ή

char grade = 'A'; /* εδώ τα πράγματα είναι πιο απλά για μας */

Τα απλά εισαγωγικά ' ' δηλώνουν στη C μια σταθερά χαρακτήρα, ενώ τα διπλάεισαγωγικά " " θεωρούνται μια συμβολοσειρά, που θα την δούμε αναλυτικάπαρακάτω.

Οι μη Εκτυπούμενοι ΧαρακτήρεςΥπάρχουν μερικοί ASCII χαρακτήρες που είναι μη εκτυπούμενοι, όπως τοδιάστημα προς τα πίσω (backspace), το enter και το ηχητικό σήμα (beep). Η Cμάς παρέχει τρεις τρόπους για την αναπαράσταση τέτοιων χαρακτήρων. Οπρώτος είναι χρησιμοποιώντας τον κώδικα ASCII του χαρακτήρα, ως εξής :

char beep = 7;

Ο δεύτερος είναι χρησιμοποιώντας μια ειδική μορφή του κώδικα ASCII, όπουτοποθετούμε ανάμεσα σε απλά εισαγωγικά τον οκταδικό κώδικα ASCII μαζίμε μια πλάγια κάθετο \ πριν απ’ αυτόν, ως εξής :

beep = '\007';

Οι αριθμοί ερμηνεύονται σαν οκταδικοί, ακόμη και αν δεν υπάρχει μπροστάένα 0. Η ANSI C και πολλές νέες εκδόσεις δέχονται μια δεκαεξαδική μορφήγια τις σταθερές χαρακτήρα, όπου η πλάγια κάθετος \ ακολουθείται από ένα xή X και από 1 μέχρι 3 δεκαεξαδικά ψηφία. Έτσι, ο χαρακτήρας Control-P θαμπορεί να παρασταθεί σαν '\x10' ή '\X010'. Ο τρίτος τρόπος είναι να

Page 18: Glossa Programmatismou C 1 Eisagogi

χρησιμοποιήσουμε μια ειδική ακολουθία συμβόλων, που ονομάζεταιακολουθία διαφυγής (escape sequence) :

\a ειδοποίηση - beep (ANSI C)

\b ένα διάστημα προς τα πίσω (προσοχή δεν σβήνει τους χαρακτήρες)

\f τροφοδότηση σελίδας

\n νέα γραμμή (enter)

\r επιστροφή στην αρχή της τρέχουσας γραμμής

\t οριζόντια στηλοθέτηση (tab)

\v κάθετη στηλοθέτηση (ANSI C)

\\ πλάγια κάθετος (\)

\' απλά εισαγωγικά (')

\" διπλά εισαγωγικά (") (ANSI C)

Όλοι αυτοί οι χαρακτήρες κλείνονται σε απλά εισαγωγικά όταν καταχωρούνταισε μια μεταβλητή χαρακτήρα :

next = '\n';

Η εκτύπωση της μεταβλητής next προχωράει την εκτύπωση κατά μια γραμμήστην οθόνη ή στον εκτυπωτή. Η συνάρτηση printf() χρησιμοποιεί το %c για ναδείξει ότι πρέπει να τυπωθεί ένας χαρακτήρας. Θα πρέπει να θυμόμαστε ότι οιχαρακτήρες είναι αποθηκευμένοι σαν ακέραιοι, οπότε αν τυπώσουμε την τιμήμιας μεταβλητής τύπου char, θα πάρουμε έναν ακέραιο.

Ο προσδιορισμός %c λέει στην printf() να μετατρέψει τον ακέραιο στοναντίστοιχο χαρακτήρα. Αυτά φαίνονται καθαρά στο παρακάτω πρόγραμμα :

/* prog07.c - εμφανίζει τον κωδικό αριθμό κάποιου χαρακτήρα */

#include <stdio.h>

main()

{

char ch;

printf("Δώστε έναν χαρακτήρα : \n");

scanf("%c", &ch);

Page 19: Glossa Programmatismou C 1 Eisagogi

printf("Ο κώδικας του %c είναι το %d. \n", ch, ch);

}

Το αποτέλεσμα θα είναι :

Δώστε έναν χαρακτήρα :

C

Ο κώδικας του C είναι το 67.

Η printf() τυπώνει την τιμή της ch δύο φορές, την πρώτη σαν χαρακτήρα(προτρεπόμενη από τον κώδικα %c) και τη δεύτερη σαν ακέραιο(προτρεπόμενη από τον κώδικα %d). Οι προσδιοριστές της printf()αποφασίζουν για το πώς θα εμφανιστούν τα δεδομένα και όχι για το πώς θααποθηκευθούν.

Οι Τύποι float και doubleΣε προγράμματα μαθηματικής φύσης συχνά χρησιμοποιούμε αριθμούς κινητήςυποδιαστολής που στη C λέγονται τύπου float και είναι αντίστοιχοι με τουςτύπους real της Pascal. Έτσι, μπορούμε να παραστήσουμε ένα πολύμεγαλύτερο εύρος αριθμών, μεγάλων και μικρών. Υπάρχουν ακόμα και οιτύποι double (για διπλή ακρίβεια) και long double. Οι μεταβλητές αυτέςδηλώνονται όπως και οι άλλες :

float a=10.25e-3;

double b;

long double c;

Ένα πρόθεμα f ή F στην ANSI C σ’ έναν αριθμό κινητής υποδιαστολής τονκάνει τύπου float, π.χ. 2.3f και 9.11E9F, ενώ μια κατάληξη l ή L τον κάνειτύπου long double, π.χ. 54.31l και 4.32e4L.

Η συνάρτηση printf() χρησιμοποιεί τον προσδιοριστή μορφής %f για νατυπώσει τύπου float και double αριθμούς με δεκαδικό συμβολισμό και τημορφή %e για να τους τυπώσει σε εκθετικό συμβολισμό. Για τους τύπους longdouble έχουμε αντίστοιχα τους προσδιοριστές %Lf και %Le.

Ο Τελεστής sizeof

Page 20: Glossa Programmatismou C 1 Eisagogi

Η C έχει έναν εσωτερικό τελεστή, τον sizeof, που δίνει το μέγεθος κάποιωνπραγμάτων σε bytes. Αυτό θα το δούμε καλύτερα μ’ ένα παράδειγμα :

/* prog08.c – τυπώνει τα μεγέθη των τύπων δεδομένων */

#include <stdio.h>

main()

{

printf("Ο τύπος int έχει μέγεθος %d bytes. \n", sizeof(int));

printf("Ο τύπος char έχει μέγεθος %d bytes. \n", sizeof(char));

printf("Ο τύπος long έχει μέγεθος %d bytes. \n", sizeof(long));

printf("Ο τύπος double έχει μέγεθος %d bytes. \n", sizeof(double));

}

Το αποτέλεσμα θα είναι :

Ο τύπος int έχει μέγεθος 2 bytes.

Ο τύπος char έχει μέγεθος 1 bytes.

Ο τύπος long έχει μέγεθος 4 bytes.

Ο τύπος double έχει μέγεθος 8 bytes.

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

/* prog09.c – ζητούνται στοιχεία χρήστη */

#include <stdio.h>

main()

{

float weight;

int size, letters;

char name[40];

Page 21: Glossa Programmatismou C 1 Eisagogi

printf("Γεια σου! Πώς λέγεσαι; \n");

scanf("%s", name);

printf("%s, Ποιο είναι το βάρος σου σε κιλά; \n", name);

scanf("%f", &weight);

size = sizeof name;

letters = strlen(name);

printf("Γεια σου, %s, το βάρος σου είναι %2.2f κιλά. \n", name,volume);

printf("Επίσης, το σου όνομά σου έχει %d γράμματα, \n", letters);

printf("και χρειάζονται %d bytes για την αποθήκευσή του.\n", size);

}

Τρέχοντας αυτό το πρόγραμμα, παίρνουμε τα εξής αποτελέσματα :

Γεια σου! Πώς λέγεσαι;

Κώστας

Κώστας, ποιο είναι το βάρος σου σε κιλά;

100

Γεια σου, Κώστας, το βάρος σου είναι 100,00 κιλά.

Επίσης, το όνομά σου έχει 6 γράμματα,

και χρειάζονται 40 bytes για για την αποθήκευσή του.

Τα κυριότερα νέα χαρακτηριστικά αυτού του προγράμματος είναι τα εξής :

1. Έχουμε χρησιμοποιήσει έναν πίνακα που περιέχει μια συμβολοσειρά καισυγκεκριμένα κάποιο όνομα.

2. Χρησιμοποιήσαμε τον προσδιοριστή μετατροπής %s για να χειριστούμε τηνείσοδο και την έξοδο μιας συμβολοσειράς. Η μεταβλητή name, σε αντίθεση μετην weight, δεν χρησιμοποιεί το πρόθεμα & όταν χρησιμοποιείται με τηνscanf().

4. Χρησιμοποιήσαμε τη συνάρτηση της C strlen() για να βρούμε το μήκος μιαςσυμβολοσειράς.

Τι είναι, όμως, μια συμβολοσειρά;

Page 22: Glossa Programmatismou C 1 Eisagogi

Μια συμβολοσειρά είναι μια σειρά από έναν ή περισσότερους χαρακτήρες,όπως για παράδειγμα : "Το ΙΕΚ Φλώρινας λειτουργεί από το 1993". Τα διπλάεισαγωγικά δεν είναι μέρος της συμβολοσειράς και υπάρχουν για ναοριοθετούν τη συμβολοσειρά, όπως ακριβώς τα απλά εισαγωγικάχρησιμοποιούνται για να οριοθετούν έναν χαρακτήρα. Η C αποθηκεύει τιςσυμβολοσειρές σ’ έναν πίνακα τύπου char με κάθε χαρακτήρα τηςσυμβολοσειράς να είναι αποθηκευμένος σε κάθε κελί. Η C χρησιμοποιεί τονχαρακτήρα \0 στην τελευταία θέση του πίνακα για να σημειώνει το τέλος μιαςσυμβολοσειράς.

Αυτός ο χαρακτήρας δεν είναι το ψηφίο 0, αλλά είναι ο μη απεικονιζόμενοςχαρακτήρας του οποίου ο κώδικας ASCII είναι 0. Ο πίνακας λοιπόν πρέπει ναέχει τουλάχιστον ένα περισσότερο κελί από τον αριθμό των χαρακτήρων πουπρόκειται να αποθηκευτούν. Η δήλωση ενός πίνακα μπορεί να γίνει με τηνεξής εντολή :

char name[40];

απ' όπου καταλαβαίνουμε ότι η μεταβλητή name είναι πίνακας με μέγεθος 40και το κάθε στοιχείο της είναι ένας χαρακτήρας.

Η Χρήση των ΣυμβολοσειρώνΔείτε το παρακάτω πρόγραμμα :

/* prog10.c – πρόγραμμα με συμβολοσειρές */

#include <stdio.h>

#define PRAISE "Έχεις ένα σπουδαίο όνομα!"

main()

{

char name[50];

printf("Πώς σε λένε;\n");

scanf("%s", name);

printf("Γεια σου, %s. %s\n", name, PRAISE);

}

Page 23: Glossa Programmatismou C 1 Eisagogi

Η έξοδος του προγράμματος θα είναι :

Πώς σε λένε;

Μάκη Παπαδόπουλο

Γεια σου, Μάκη. Έχεις ένα σπουδαίο όνομα!

Παρατηρούμε ότι η scanf() διαβάζει μόνο το μικρό όνομα του Παπαδόπουλου.Η συνάρτηση σταματάει λοιπόν μόλις βρει το πρώτο κενό διάστημα. Γενικά, ηscanf() χρησιμοποιούμενη με το %s διαβάζει απλές λέξεις και όχι φράσεις σανσυμβολοσειρές. Η C έχει άλλες συναρτήσεις για διάβασμα εισόδου, όπως τηνgets(), για να χειρίζεται γενικευμένες συμβολοσειρές, που θα τις δούμεαργότερα.

Η συμβολοσειρά "x" δεν είναι το ίδιο με τον χαρακτήρα 'x' και αυτό γιατί η 'x'είναι ένας βασικός τύπος (char), ενώ η "x" είναι ένας παραγόμενος τύπος, έναςπίνακας από στοιχεία τύπου char. Ακόμη, η "x" αποτελείται από δύοχαρακτήρες, τον 'x' και τον μηδενικό χαρακτήρα. Η συνάρτηση srtlen() μαςδίνει το μήκος μιας συμβολοσειράς σε χαρακτήρες, ενώ ο τελεστής sizeofεπιστρέφει τον αριθμό των συνολικών κελιών μνήμης που είχαν δηλωθείαρχικά γι αυτή τη μεταβλητή.

Οι Σταθερές και ο Προεπεξεργαστής της CΞέρουμε από τις άλλες γλώσσες προγραμματισμού τη σημασία που έχει ηδήλωση μιας σταθεράς σ’ ένα πρόγραμμα. Στη C υπάρχουν δύο τρόποι για ναδηλωθεί μια σταθερή τιμή. Ένας τρόπος είναι να ορίσουμε μια μεταβλητή καινα την εξισώσουμε με την επιθυμητή σταθερά, ως εξής :

float taxrate;

taxrate = 0.2;

Μ’ αυτόν τον τρόπο η αντικατάσταση της τιμής της μεταβλητής taxrate θαγίνεται όταν το πρόγραμμα τρέχει. Ο προεπεξεργαστής της C διαθέτει ένανκαλύτερο τρόπο, όπου απλά προσθέτουμε μια γραμμή στην αρχή του αρχείουπου περιέχει το πρόγραμμά μας, ως εξής :

#define TAXRATE 0.2

Όταν το πρόγραμμα μεταγλωττιστεί, η τιμή 0.2 θα αντικατασταθεί παντούόπου έχει χρησιμοποιηθεί η TAXRATE. Έτσι, όταν τρέξουμε το πρόγραμμα,όλες οι αντικαταστάσεις θα έχουν ήδη γίνει. Πρέπει να προσέξουμε τη σύνταξητης #define, στην οποία δεν χρησιμοποιείται το ελληνικό ερωτηματικό (;),αφού δεν είναι μια πρόταση της C και ακόμη αποτελεί παράδοση στη C να

Page 24: Glossa Programmatismou C 1 Eisagogi

γράφονται όλες οι σταθερές με κεφαλαία γράμματα για να τις αναγνωρίζουμεαμέσως και να τις ξεχωρίζουμε έτσι από τις άλλες μεταβλητές.

Ακολουθεί ένα παράδειγμα με χρήση της #define.

/* prog11.c – χρήση της σταθεράς π = 3.14159 */

#include <stdio.h>

#define PI 3.14159

main()

{

float area, circum, radius;

printf("Δώστε την ακτίνα του κύκλου : \n");

scanf("%f", &radius);

area = PI * radius * radius;

circum = 2.0 * PI * radius;

printf("Τα στοιχεία του κύκλου είναι :\n");

printf("Περίμετρος = %1.2f, εμβαδόν = %1.2f\n", circum, area);

}

Το αποτέλεσμα θα είναι :

Δώστε την ακτίνα του κύκλου :

6.0

Τα στοιχεία του κύκλου είναι :

Περίμετρος = 37.70, εμβαδόν = 113.10

Η εντολή #define μπορεί να χρησιμοποιηθεί τόσο για χαρακτήρες όσο και γιασταθερές συμβολοσειρές. Χρησιμοποιούμε απλά εισαγωγικά για την πρώτηπερίπτωση και διπλά για τη δεύτερη. Ακολουθούν παραδείγματα :

#define BEEP '\007'

#define TEE 'T'

#define ESC '\033'

Page 25: Glossa Programmatismou C 1 Eisagogi

#define OOPS "Τώρα το πέτυχες"

Αν κατά λάθος γράψουμε #define TOES = 20, τότε η TOES θα αντικατασταθείμε το = 20 και όχι με το 20.

Οι Δυνατότητες της #defineΜπορούμε να μαζέψουμε όλες τις προτάσεις #define σ’ ένα αρχείο και να τοονομάσουμε, π.χ. const.h. Μετά, στην αρχή κάθε προγράμματος μπορούμε ναεισάγουμε την πρόταση #include "const.h" και όταν τρέξει το πρόγραμμα, οπροεπεξεργαστής θα διαβάσει το αρχείο const.h και θα χρησιμοποιήσει όλεςτις προτάσεις #define που θα βρει εκεί.

Χρησιμοποιούμε την ονομασία "const.h" για να ψάξει πρώτα στον τρέχοντακατάλογο και μετά στους καταλόγους του συστήματος, ενώ η ονομασία<const.h> σημαίνει να ψάξει στον κανονικό κατάλογο πρώτα. Μια άλλησπουδαία δυνατότητα της #define είναι ότι μπορούμε να κάνουμε τέτοιεςαντικαταστάσεις, ώστε τα προγράμματα της C να θυμίζουν Pascal, ως εξής :

#define program main()

#define begin {

#define end }

#define times *

Έτσι, όπου ο προεπεξεργαστής βρει τους αριστερούς όρους, τους αντικαθιστάμ’ ό,τι είναι δεξιά, δηλ. με εντολές της C, αλλά εμείς γράφουμε σαν να είμαστεστην Pascal.

Τυπώνοντας Μεγάλες ΣυμβολοσειρέςΑν θέλουμε να κόψουμε μια συμβολοσειρά που είναι πολύ μεγάλη για ναχωρέσει σε μια γραμμή, υπάρχουν τρεις τρόποι, όπως φαίνεται στο παρακάτωπαράδειγμα :

/* prog12.c – τυπώνοντας μεγάλες συμβολοσειρές */

#include <stdio.h>

main()

{

Page 26: Glossa Programmatismou C 1 Eisagogi

printf("Να ένας τρόπος να τυπώσετε μια ");

printf("μεγάλη συμβολοσειρά.\n");

printf("Να ένας άλλος τρόπος να τυπώσετε μια \

μεγάλη συμβολοσειρά.\n");

printf("Να ο πιο καινούργιος τρόπος να τυπώσετε μια "

" μεγάλη συμβολοσειρά.\n");

}

Το αποτέλεσμα θα είναι :

Να ένας τρόπος να τυπώσετε μια μεγάλη συμβολοσειρά.

Να ένας άλλος τρόπος να τυπώσετε μια μεγάλη συμβολοσειρά.

Να ο πιο καινούργιος τρόπος να τυπώσετε μια μεγάλη συμβολοσειρά.