ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ Κεφάλαιο 7 Εισαγωγή στη Γλώσσα Προγραμματισμού C Γιώργος Γιαγλής
Περίληψη Κεφαλαίου 7 Εισαγωγή στη Γλώσσα Προγραμματισμού C Βασική Δομή Προγράμματος Μεταβλητές και Σταθερές Τύποι Δεδομένων Τελεστές Είσοδος και Έξοδος Δεδομένων Εντολές Επιλογής Εντολές Επανάληψης Αποσφαλμάτωση Συναρτήσεις
Βασική δομή προγράμματος Ένα πρόγραμμα C αποτελείται από μια ή περισσότερες συναρτήσεις Συνάρτηση ονομάζεται κάθε τμήμα κώδικα που εκτελεί μια συγκεκριμένη δραστηριότητα παίρνοντας κάποιες παραμέτρους εισόδου και παράγοντας παραμέτρους εξόδου Π.χ.: μία συνάρτηση που υπολογίζει το εμβαδόν ενός ορθογωνίου με πλάτος και μήκος Παράμετροι εισόδου Κώδικας Παράμετροι εξόδου πλάτος = 5 εμβαδόν = 50 πολλαπλασίασε πλάτος x μήκος μήκος = 10
Βασική δομή προγράμματος Κάθε συνάρτηση αποτελείται από εντολές Κάθε εντολή τερματίζεται με το σύμβολο ; ένα ενιαίο μπλοκ εντολών περικλείεται μέσα σε άγκιστρα { και } Κάθε πρόγραμμα C πρέπει να έχει μία μόνο συνάρτηση με το όνομα main αποτελεί την κύρια συνάρτηση του προγράμματος Η εκτέλεση του προγράμματος ξεκινάει από την πρώτη εντολή της συνάρτησης main και τερματίζεται όταν εκτελεστεί και η τελευταία εντολή της συνάρτησης αυτής
Ένα απλό πρόγραμμα #include <stdio.h> main () { char onoma[20]; printf(“Πως σε λένε;”); scanf(“%s”, onoma); printf(“Γειά σου %s!\n”, onoma); } <stdio.h> - βιβλιοθήκη με συναρτήσεις υλοποιημένες σε γλώσσα C Στο συγκεκριμένο πρόγραμμα πρέπει να χρησιμοποιήσουμε δυο συναρτήσεις εισόδου και εξόδου (τις scanf και printf), οι οποίες βρίσκονται ενσωματωμένες στο αρχείο βιβλιοθήκης stdio.h. #include - εντολή για να ενσωματωθεί στο πρόγραμμα η βιβλιοθήκη
Ένα απλό πρόγραμμα #include <stdio.h> main () { char onoma[20]; printf(“Πως σε λένε;”); scanf(“%s”, onoma); printf(“Γειά σου %s!\n”, onoma); } Η επικεφαλίδα μιας συνάρτησης στη συγκεκριμένη περίπτωση η συνάρτηση main Η δήλωση της επικεφαλίδας μιας συνάρτησης γίνεται γράφοντας: τον τύπο του αποτελέσματος που επιστρέφει η συνάρτηση (εδώ κενό, καθώς η συνάρτηση δεν παράγει κάποια έξοδο) το όνομα της συνάρτησης τη λίστα των παραμέτρων εισόδου της συνάρτησης μέσα σε παρενθέσεις (εδώ κενό, καθώς η συνάρτηση δεν παίρνει κάποια είσοδο)
Ένα απλό πρόγραμμα #include <stdio.h> main () { char onoma[20]; printf(“Πως σε λένε;”); scanf(“%s”, onoma); printf(“Γειά σου %s!\n”, onoma); } τα άγκιστρα στη C ορίζουν ένα μπλοκ εντολών. Το αριστερό άγκιστρο ορίζει ότι ξεκινάει το μπλοκ εντολών της συνάρτησης main. Κάθε αριστερό άγκιστρο σε ένα πρόγραμμα πρέπει να αντιστοιχίζεται με ένα δεξί άγκιστρο που ορίζει το τέλος του συγκεκριμένου μπλοκ εντολών.
Ένα απλό πρόγραμμα #include <stdio.h> main () { char onoma[20]; printf(“Πως σε λένε;”); scanf(“%s”, onoma); printf(“Γειά σου %s!\n”, onoma); } ορισμός μεταβλητής τύπος μεταβλητής όνομα μεταβλητής όταν θέλουμε να αποθηκεύσουμε ένα δεδομένο εισόδου ή ένα αποτέλεσμα στη μνήμη του υπολογιστή, πρέπει να ορίσουμε μια μεταβλητή δηλαδή μια θέση μνήμης στην οποία θα αποθηκευτεί το δεδομένο ή το αποτέλεσμα αυτό
Ένα απλό πρόγραμμα #include <stdio.h> main () { char onoma[20]; printf(“Πως σε λένε;”); scanf(“%s”, onoma); printf(“Γειά σου %s!\n”, onoma); } Η συγκεκριμένη εντολή καλεί τη συνάρτηση βιβλιοθήκης printf Η κλήση μιας συνάρτησης γίνεται γράφοντας το όνομα της και τη λίστα των ορισμάτων της μέσα σε παρενθέσεις Η συγκεκριμένη συνάρτηση εμφανίζει στην οθόνη τη λίστα των ορισμάτων της Πως σε λένε; (τα διπλά εισαγωγικά δεν εμφανίζονται).
Ένα απλό πρόγραμμα #include <stdio.h> main () { char onoma[20]; printf(“Πως σε λένε;”); scanf(“%s”, onoma); printf(“Γειά σου %s!\n”, onoma); } Η εντολή αυτή καλεί τη συνάρτηση βιβλιοθήκης scanf η scanf «διαβάζει» μια μεταβλητή από το πληκτρολόγιο Η δήλωση %s μέσα στα διπλά εισαγωγικά λέει στο μεταγλωτιστή ότι αυτό που θα πρέπει να περιμένει να διαβάσει είναι μια σειρά χαρακτήρων (ονομάζεται συμβολοσειρά) και το όνομα της μεταβλητής που ακολουθεί (δηλαδή onoma) είναι οι θέσεις μνήμης στις οποίες θα αποθηκευτούν οι χαρακτήρες που θα δώσει ο χρήστης
Ένα απλό πρόγραμμα #include <stdio.h> main () { char onoma[20]; printf(“Πως σε λένε;”); scanf(“%s”, onoma); printf(“Γειά σου %s!\n”, onoma); } Η εντολή αυτή καλεί τη συνάρτηση printf αν η μεταβλητή onoma έχει τιμή «Μαρία», αυτή η εντολή θα εμφανίσει στην οθόνη Γειά σου Μαρία! και θα αλλάξει γραμμή
Σχόλια και μορφή κώδικα
Μεταβλητές Οι μεταβλητές (variables) αποτελούν μνημονικά ονόματα που δίνουμε σε θέσεις της μνήμης Μια μεταβλητή έχει τρεις σημαντικές ιδιότητες Τύπο Όνομα Τιμή Έγκυρα ονόματα μεταβλητών value _avalue, name123, anOtherName Μη έγκυρα ονόματα μεταβλητών a*value, one@variable, 32.number, int, while
Μεταβλητές Υπάρχουν δυο σημαντικές ενέργειες που πρέπει να γίνουν σε κάθε μεταβλητή: Δήλωση μεταβλητής (τύπος + όνομα) Εκχώρηση τιμής Πρώτα γίνεται η δήλωση μεταβλητής π.χ. και μετά η Ανάθεση τιμής
Μεταβλητές Ή και τα δύο (δήλωση και ανάθεση) σε μία γραμμή π.χ. Στη μνήμη τι γίνεται; Διεύθυνση Περιεχόμενα Αντιστοίχηση με μεταβλητή 0000 00 00 00 00 a 0001 0010 00 00 01 11 ?? 0011 11 00 10 10 0100 b 0101 00 00 00 01 0110 c 0111 00 00 00 10
Σταθερές Οι σταθερές (constants) είναι μνημονικά ονόματα που αποδίδονται, όχι σε θέσεις μνήμης, αλλά σε συγκεκριμένες τιμές ορισμός μιας σταθεράς γίνεται στην αρχή του προγράμματος μπορεί να χρησιμοποιηθεί οπουδήποτε στο πρόγραμμα θα χρησιμοποιούνταν η αντίστοιχη τιμή δεν μπορεί να χρησιμοποιηθεί όπου θα είχε νόημα η χρησιμοποίηση μιας μεταβλητής printf (“ pi = %f ”, pi); pi = (2+x) *r ; scanf(“%f”, &pi);
Σταθερές Αν για κάποιο λόγο θέλουμε να δηλώσουμε μια σταθερά που αποθηκεύεται μεν στη μνήμη αλλά δεν μπορεί να αλλάξει η τιμή της από το πρόγραμμα Π.χ. οι σταθερές, όπως και οι μεταβλητές έχουν κάποιο τύπο, ο οποίος υπονοείται από την τιμή της σταθεράς
Τύποι δεδομένων Κάθε μεταβλητή στη C έχει ένα συγκεκριμένο τύπο, ο οποίος καθορίζει τόσο το σύνολο τιμών που μπορεί να πάρει η μεταβλητή όσο και το σύνολο των πράξεων και λειτουργιών που μπορούν να εφαρμοστούν σε αυτή. Οι βασικοί τύποι στη C είναι: int (ακέραιοι αριθμοί), float (πραγματικοί αριθμοί) και char (χαρακτήρες) void (κενό, ανυπαρξία τύπου)
Παραλλαγές Βασικών Τύπων int (Ακέραιος) float (Δεκαδικός) char (Χαρακτήρας) Οι σταθερές τύπου χαρακτήρα περικλείονται σε μονά εισαγωγικά, για παράδειγμα ‘a’ ή ‘1’. Μια μεταβλητή τύπου char αποθηκεύεται σε ένα byte.
Τελεστές: Βασικοί Αριθμητικοί Τελεστές
Τελεστές: Τελεστές Αύξησης/Μείωσης κατά 1 Οι τελεστές ++ και -- μπορεί να είναι είτε προθεματικοί (δηλαδή να εμφανίζονται πριν το όρισμα τους) είτε μεταθεματικοί (δηλαδή να εμφανίζονται μετά το όρισμα τους)
Τελεστές Σύγκρισης και Λογικοί τελεστές Τελεστές Σύγκρισης: Οι τελεστές αυτοί συγκρίνουν δεδομένα και επιστρέφουν την τιμή 1 ή την τιμή 0, ανάλογα με το αν το αποτέλεσμα της σύγκρισης είναι αληθές ή ψευδές Λογικοί Τελεστές: Τα ορίσματα τους είναι λογικές τιμές (με τιμές αληθές ή ψευδές) και το αποτέλεσμα τους είναι επίσης μια λογική τιμή (αλήθεια ή ψεύδος)
Τελεστής Εκχώρησης Η εκχώρηση στη C γίνεται με τον τελεστή = (ίσο) Η μορφή της εντολής εκχώρησης είναι: ΌνομαΜεταβλητής = Παράσταση; Oι σύνθετοι αριθμητικοί τελεστές (++, --, +=, -=, *=, /= και %=) είναι ουσιαστικά επίσης τελεστές εκχώρησης, καθώς έχουν σαν αποτέλεσμα την εκχώρηση τιμής σε κάποια μεταβλητή μετά την εκτέλεση της πράξης που ο κάθε τελεστής προσδιορίζει.
Σύνθετες παραστάσεις Σε σύνθετες παραστάσεις, οι πράξεις εκτελούνται ανάλογα με την προτεραιότητα των τελεστών. Στη C υπάρχουν εννέα κατηγορίες προτεραιότητας. Μεταξύ τελεστών που είναι στην ίδια κατηγορία, οι πράξεις εκτελούνται από αριστερά προς τα δεξιά (εκτός των εκχωρήσεων που εκτελούνται αντίστροφα). Προτεραιότητες: Υψηλότερη προτεραιότητα: Παρενθέσεις Αύξηση και μείωση κατά ένα (++ και --) Λογική Άρνηση (!), Πρόσημα (+ και -) και Σύνθετες εκχωρήσεις (+=, -=, *=, /= και %=) Υπόλοιπα (%), Πολλαπλασιασμοί (*) και Διαιρέσεις (/) Προσθέσεις (+) και Αφαιρέσεις (-) Συγκρίσεις (<, >, <=, >=, ==, !=) Λογική σύζευξη (&&) Λογική διάζευξη (||) Χαμηλότερη προτεραιότητα: Εκχωρήσεις (=)
Σύνθετες παραστάσεις Αν ένας τουλάχιστον από τους τελεστέους είναι τύπου float/double, το αποτέλεσμα θα είναι του ίδιου τύπου. Αν όλοι οι τελεστές είναι τύπου int, το αποτέλεσμα θα είναι επίσης int (με περικοπή τυχόν κλασματικού μέρους). Υπάρχει δυνατότητα μετατροπής τύπου μόνο για μια πράξη με χρήση του τελεστή (τύπος) Παράδειγμα:
Είσοδος και Έξοδος Δεδομένων Μια από τις σημαντικότερες λειτουργίες των προγραμμάτων είναι να επιτρέπουν την επικοινωνία με το χρήστη τους κατά τη διάρκεια της εκτέλεσης τους. Η επικοινωνία αυτή γίνεται για δυο λόγους: είτε για την τροφοδότηση του προγράμματος με δεδομένα που δίνει ο χρήστης (είσοδος δεδομένων) είτε για την παρουσίαση στο χρήστη αποτελεσμάτων από τις επεξεργασίες του προγράμματος (έξοδος δεδομένων). Η C διαθέτει δυο βασικές συναρτήσεις για την είσοδο και την έξοδο δεδομένων, όπως και αρκετές παραλλαγές τους. Οι δυο βασικές συναρτήσεις είναι η scanf (είσοδος) και η printf (έξοδος).
Οι συναρτήσεις scanf και printf Η συνάρτηση printf έχει την αντίθετη λειτουργία από τη scanf, δηλαδή εμφανίζει στην οθόνη τη λίστα των ορισμάτων της. Τα ορίσματα μπορούν να είναι σταθερές ή τιμές μεταβλητών.
Προσδιοριστές Μετατροπής H printf και η scanf χρησιμοποιούν τους λεγόμενους προσδιοριστές μετατροπής για να καθοριστεί ο τύπος των μεταβλητών που χειρίζονται. Οι προσδιοριστές ξεκινούν με τον ειδικό χαρακτήρα %. Οι προσδιοριστές μετατροπής %d και %f συνήθως περιλαμβάνουν και το εύρος πεδίου ή/και την απαιτούμενη ακρίβεια αναπαράστασης
Μη εκτυπούμενοι χαρακτήρες Κατά την εκτύπωση μηνυμάτων με την εντολή printf χρειαζόμαστε πολύ συχνά να εμφανίσουμε στην οθόνη ειδικούς χαρακτήρες, όπως η αλλαγή γραμμής (enter) και ο στηλοθέτης (tab). Οι μη εκτυπούμενοι χαρακτήρες προσδιορίζονται με τον ειδικό χαρακτήρα \. Οι πιο συνηθισμένοι μη εκτυπούμενοι χαρακτήρες είναι:
Είσοδος και έξοδος δεδομένων χαρακτήρων Οι συναρτήσεις scanf και printf μπορούν να χρησιμοποιηθούν και για δεδομένα τύπου χαρακτήρα με τη χρήση του προσδιοριστή %c. Όμως, σε κάποιες υλοποιήσεις της C οι συναρτήσεις αυτές δε δουλεύουν πάντα σωστά σε αυτή την περίπτωση. Για το λόγο αυτό συνίσταται η χρησιμοποίηση εναλλακτικών συναρτήσεων εισόδου και εξόδου όταν θέλουμε να χειριστούμε δεδομένα χαρακτήρων. Οι συναρτήσεις αυτές είναι: getchar/putchar (για χαρακτήρες), gets/puts (για συμβολοσειρές) και fflush (για καθάρισμα του buffer της μνήμης). Παράδειγμα:
Εντολές Επιλογής Η επιλογή είναι μια από τις τρεις βασικές δομές του διαδικασιακού προγραμματισμού (μαζί με την ακολουθία και την επανάληψη) Επιτρέπει στο πρόγραμμα να εκτελέσει ένα (ή κανένα) από δυο ή περισσότερα τμήματα προγράμματος ανάλογα με την τιμή που έχει κάποια συνθήκη Εντολές επιλογής στη C if-else: επιλογή μεταξύ ενός ή δυο ενδεχομένων switch: επιλογή μεταξύ περισσότερων ενδεχομένων
Εντολές Επιλογής Η εντολή if-else Η εντολή switch ή Δυο τρόποι σύνταξης Το τμήμα else της εντολής είναι προαιρετικό Οι εντολές if-else μπορούν να είναι φωλιασμένες ώστε να υλοποιείται επιλογή μεταξύ περισσότερων των δυο ενδεχομένων. Η εντολή switch if (συνθήκη) ΜπλοκΕντολών; ή ΜπλοκΕντολών1 else ΜπλοκΕντολών2; switch (παράσταση) {case σταθερά1 : ΜπλοκΕντολών1; break; case σταθερά2 : ΜπλοκΕντολών2; ... case σταθεράΝ : ΜπλοκΕντολώνΝ; default : ΜπλοκΕντολών; } Αξιολογείται η παράσταση Αν η τιμή της ισούται με κάποια σταθερά εκτελείται το αντίστοιχο Block εντολών Δεν ισούται με καμία σταθερά ακολουθείται το Block εντολών της δήλωσης default Οι εντολές default και break είναι προαιρετικές Η εντολή switch εκτελεί όλες τις εντολές μέχρι να βρει μια δήλωση Break και να τερματίσει
Εντολές Επανάληψης Η επανάληψη επιτρέπει στο πρόγραμμα να εκτελέσει κάποιο τμήμα προγράμματος εξακολουθητικά για όσο χρονικό διάστημα ικανοποιείται (ή δεν ικανοποιείται) κάποια συνθήκη. Εντολές επανάληψης while: γενική επανάληψη μηδέν ή περισσότερες φορές do-while: ειδική περίπτωση όταν θέλουμε η επανάληψη να εκτελεστεί τουλάχιστον μια φορά for: ειδική περίπτωση όταν ξέρουμε εκ των προτέρων πόσες φορές θέλουμε να εκτελεστεί η επανάληψη
Εντολή while Αξιολογείται η συνθήκη (αληθής ή ψευδής). ΜπλοκΕντολών; Αξιολογείται η συνθήκη (αληθής ή ψευδής). Όσο η συνθήκη είναι αληθής, (α) εκτελείται το μπλοκ εντολών και (β) ο έλεγχος επιστρέφει στη συνθήκη, η οποία αξιολογείται πάλι. Όταν η συνθήκη γίνει ψευδής, η εντολή τερματίζει. ΠΡΟΣΟΧΗ: Κίνδυνος άπειρης επανάληψης
Εντολή do-while Εκτελείται το μπλοκ εντολών. ΜπλοκΕντολών; while (συνθήκη); Εκτελείται το μπλοκ εντολών. Αξιολογείται η συνθήκη επανάληψης. Όσο η συνθήκη είναι αληθής, ο έλεγχος επιστρέφει στο μπλοκ εντολών, το οποίο εκτελείται και στη συνέχεια αξιολογείται πάλι η συνθήκη επανάληψης. Όταν η συνθήκη γίνει ψευδής, η εντολή τερματίζει. ΠΡΟΣΟΧΗ: Κίνδυνος άπειρης επανάληψης
Εντολή for Ο μετρητής παίρνει την αρχική τιμή. ΜπλοκΕντολών; Ο μετρητής παίρνει την αρχική τιμή. Αξιολογείται η συνθήκη επανάληψης. Όσο η συνθήκη είναι αληθής, τότε (α) εκτελείται το μπλοκ εντολών, (β) εκτελείται το βήμα αλλαγής και (γ) αξιολογείται πάλι η συνθήκη. Όταν η συνθήκη γίνει ψευδής, η εντολή τερματίζει. ΠΡΟΣΟΧΗ: Κίνδυνος άπειρης επανάληψης
Αποσφαλμάτωση και αμυντικός Προγραμματισμός Τα προγραμματιστικά λάθη διακρίνονται σε Συντακτικά λάθη: παραβίαση συντακτικών κανόνων της γλώσσας C (π.χ. λάθος γραφή του ονόματος μιας μεταβλητής, παράλειψη ενός ερωτηματικού ή μιας παρένθεσης, κτλ), εντοπίζονται από το μεταγλωττιστή κατά τη μεταγλώττιση Σημασιολογικά λάθη: παραβίαση κανόνων που συμβαίνει κατά την εκτέλεση ενός προγράμματος και έτσι δεν μπορούν να εντοπιστούν από το μεταγλωττιστή (π.χ. κατά την εκτέλεση της προσπάθειας διαίρεσης ενός αριθμού με το μηδέν ). Αντιμετώπιση με αμυντικό προγραμματισμό Λογικά λάθη: το πρόγραμμα φαίνεται να εκτελείται σωστά αλλά δεν παράγει σωστά αποτελέσματα λόγω κάποιου λάθους στον κώδικα του. (π.χ. μια προκαλεί την αφαίρεση δυο αριθμών, αντί για την πρόσθεση τους) Αντιμετώπιση: έλεγχος του προγράμματος με δοκιμαστικά δεδομένα Λάθη εισόδου δεδομένων: λάθη που μπορεί να κάνει ο χρήστης κατά την εισαγωγή δεδομένων (π.χ. ο χρήστης πρέπει να εισάγει ένα θετικό αριθμό και αυτός πληκτρολογεί έναν αρνητικό) Αντιμετώπιση με αμυντικό προγραμματισμό.
Αμυντικός Προγραμματισμός Ο όρος «αμυντικός» υπονοεί ότι ο κώδικας γράφεται με τέτοιο τρόπο ώστε να προβλέπονται και να προλαμβάνονται συνηθισμένα είδη λαθών. Αναφέρεται στη συγγραφή κώδικα έτσι ώστε να ελαχιστοποιείται η πιθανότητα εμφάνισης σημασιολογικών λαθών ή λαθών εισόδου δεδομένων κατά την εκτέλεση του προγράμματος
Αμυντικός Προγραμματισμός - Παραδείγματα Διαίρεση με το μηδέν Ελλιπής Κώδικας int a, b; scanf(“%d%d”, &a, &b); printf(“%d”, a/b); Αν ο χρήστης δώσει τιμή μηδέν στη μεταβλητή b (που δεν είναι λάθος), τότε θα προκληθεί λάθος κατά την εκτέλεση του προγράμματος Βελτιωμένος Κώδικας printf(“Δώσε δυο ακέραιες τιμές (η δεύτερη δεν πρέπει να είναι μηδέν”); Δεν εξασφαλίζει ότι ο χρήστης δε θα δώσει (ηθελημένα ή μη) λανθασμένη τιμή εισόδου. Επίσης, αυτή η προσέγγιση δε θα δούλευε αν η τιμή της μεταβλητής b δημιουργούνταν από το πρόγραμμα και όχι από το χρήστη Αμυντικός Προγραμματισμός if (b!=0) else printf(“Δεν μπορεί να γίνει διαίρεση με το μηδέν!”); Προβλέπεται η περίπτωση λανθασμένης τιμής για το διαιρέτη Υπάρχουν εντολές που καθοδηγούν το πρόγραμμα να συμπεριφερθεί διαφορετικά στην περίπτωση
Αμυντικός Προγραμματισμός - Παραδείγματα Λανθασμένη καταχώρηση από το χρήστη Ελλιπής Κώδικας int a; printf(“Δώσε ένα θετικό ακέραιο: ”); scanf(“%d”, &a); Το πρόγραμμα δεν περιέχει καμία (αμυντική) πρόβλεψη χειρισμού της περίπτωσης εισόδου αρνητικού αριθμού και έτσι θα συνεχίσει προκαλώντας πιθανά λάθη στη συνέχεια. Βελτιωμένος Κώδικας if (a<=0) {printf(“Λάθος εισαγωγή. Παρακαλώ ξαναπροσπαθήστε: ”); } Μετά το διάβασμα, ελέγχεται η τιμή της μεταβλητής και, αν δεν είναι στα επιθυμητά όρια, ζητείται από το χρήστη νέα τιμή. Ο κώδικας δε θα δουλέψει αν ο χρήστης επιμείνει και ξαναδώσει λάθος τιμή Αμυντικός Προγραμματισμός while (a<=0) Αντικαθιστώντας απλά την if με while εξασφαλίζουμε ότι το πρόγραμμα θα ζητάει συνεχώς από το χρήστη νέα τιμή μέχρι αυτός να πληκτρολογήσει θετικό αριθμό. Αν φυσικά ο χρήστης έχει δώσει από την αρχή έγκυρο αριθμό, η επανάληψη δε θα εκτελεστεί καθόλου
Δείκτες Μια μεταβλητή τύπου δείκτη «δείχνει» σε μια άλλη θέση μνήμης του υπολογιστή τα περιεχόμενα της μεταβλητής αυτής είναι μια διεύθυνση μνήμης του υπολογιστή τα περιεχόμενα της διεύθυνσης στην οποία δείχνει ο δείκτης είναι κάποιου συγκεκριμένου τύπου, ο οποίος πρέπει να ορίζεται κατά τη δήλωση της μεταβλητής δείκτη π.χ. η παρακάτω δήλωση ορίζει μια μεταβλητή με το όνομα ptr, η οποία είναι δείκτης (συμβολίζεται με το *) σε ένα ακέραιο (int).
Τελεστές σε Δείκτες Ο τελεστής * συμβολίζει τη θέση μνήμης στην οποία δείχνει ένας δείκτης. Ο τελεστής & συμβολίζει τη διεύθυνση μνήμης. Παράδειγμα (κώδικας και περιεχόμενα μνήμης): Διεύθυνση Περιεχόμενα Μεταβλητή x0000 … x0001 x0002 x0004 ptr x0003 10 num x0005 x0006
Τελεστές σε Δείκτες Συνέχεια στο ίδιο παράδειγμα... Οι τιμές όλων των μεταβλητών που έχουν οριστεί και μπορούν να χρησιμοποιηθούν από το πρόγραμμα σε αυτό το σημείο είναι Μεταβλητή Τιμή Σημασία num 10 Τιμή της ακέραιας μεταβλητής num &num x0004 Διεύθυνση της ακέραιας μεταβλητής num ptr Τιμή της μεταβλητής δείκτη ptr *ptr Περιεχόμενα της διεύθυνσης στην οποία δείχνει η ptr &ptr x0002 Διεύθυνση της μεταβλητής ptr (δε χρησιμοποιείται στο πρόγραμμα)
Συναρτήσεις Όπως είδαμε στην αρχή του κεφαλαίου, ένα Πρόγραμμα C αποτελείται από μια ή περισσότερες συναρτήσεις Πώς ορίζονται και λειτουργούν οι συναρτήσεις; Ορισμός συνάρτησης: Κάθε συνάρτηση πρέπει να οριστεί, δηλαδή να γραφτεί ο κώδικάς της. Ο ορισμός της συνάρτησης περιγράφει την ακριβή λειτουργία της. Δήλωση συνάρτησης: Η δήλωση κάνει γνωστή την ύπαρξη της συνάρτησης στο πρόγραμμα. Είναι απαραίτητη μόνο αν η κλήση της συνάρτησης εμφανίζεται στον πρόγραμμα πριν τον ορισμό της. Κλήση συνάρτησης: Είναι η χρήση της συνάρτησης από κάποια άλλη (ή και την ίδια!) συνάρτηση. Μια συνάρτηση δεν μπορεί να κληθεί αν δεν έχει προηγουμένως οριστεί ή δηλωθεί!
Δήλωση Συνάρτησης Η δήλωση περιλαμβάνει τρία πράγματα: Όνομα της συνάρτησης Τύπο εξόδου (επιστροφής) Τύπους των παραμέτρων εισόδου Πρώτα ορίζεται ο τύπος εξόδου, έπειτα το όνομα και, τέλος, μέσα σε παρένθεση, η λίστα των παραμέτρων της συνάρτησης (τύποι και ονόματα). Η δήλωση τελειώνει με ; ΤύποςΕπιστροφής ΌνομαΣυνάρτησης (Τύπος Παράμετρος, Τύπος Παράμετρος, ...); Πχ. int synartisi1 (); char synartisi2 (int orisma1, float orisma2); void synartisi3 (void);
Δήλωση Συνάρτησης Παράδειγμα: Έστω ότι θέλουμε να δημιουργήσουμε μια συνάρτηση που να προσθέτει δυο αριθμούς. Η συνάρτηση χρειάζεται δυο παραμέτρους, (τους δυο αριθμούς που πρέπει να προσθέσει) Τύπου int, με ονόματα έστω arithmos1 και arithmos2 Θα επιστρέφει ένα αποτέλεσμα τύπου int (δηλαδή το άθροισμα των δυο παραμέτρων της) Έστω ότι το όνομα της συνάρτησης θα είναι prosthese Η δήλωση θα είναι: int prosthese (int arithmos1, int arithmos2);
Ορισμός Συνάρτησης Περιλαμβάνει τον κώδικα της συνάρτησης Αποτελείται από 2 μέρη Επικεφαλίδα (είναι ίδια με τη δήλωση της συνάρτησης, αλλά δεν τελειώνει με ;) Σώμα, δηλαδή ο κώδικας που εκτελεί τη λειτουργία της συνάρτησης ΤύποςΕπιστροφής ΌνομαΣυνάρτησης (Τύπος Παράμετρος, ...) {... μπλοκ εντολών; ... }
Ορισμός Συνάρτησης Παράδειγμα: Έστω ότι θέλουμε να δημιουργήσουμε μια συνάρτηση που να προσθέτει δυο αριθμούς. Η επιστροφή του αποτελέσματος γίνεται με την εντολή return Η τιμή που θα επιστραφεί πρέπει να συμβαδίζει με τον ΤύποΕπιστροφής στην επικεφαλίδα της συνάρτησης int prosthese (int arithmos1, int arithmos2) { return (arithmos1 + arithmos2); }
Κλήση Συνάρτησης Κλήση συνάρτησης ονομάζεται η χρησιμοποίηση της συνάρτησης Προηγουμένως πρέπει να έχει δηλωθεί ή οριστεί η συνάρτηση. Διαδικασία Αντιστοίχιση τυπικών παραμέτρων που έχουν οριστεί στην επικεφαλίδα της καλούμενης συνάρτησης με τις αντίστοιχες πραγματικές παραμέτρους που περιλαμβάνονται στην κλήση της Εκτέλεση κώδικα του σώματος της καλούμενης συνάρτησης Επιστροφή τιμής καλούμενης συνάρτησης (εκτός αν είναι τύπου void όπου δεν επιστρέφει τίποτα) Ας δούμε ένα παράδειγμα...
Κλήση Συνάρτησης /* Δήλωση της συνάρτησης */ /* ΑΠΑΙΤΕΙΤΑΙ ΓΙΑΤΙ Η ΚΛΗΣΗ ΠΡΟΗΓΕΙΤΑΙ ΤΟΥ ΟΡΙΣΜΟΥ */ int prosthese (int arithmos1, int arithmos2); main() {int a=2, b=3, c, d; c = prosthese(a,b); /* 1η κλήση της συνάρτησης */ d = prosthese(c,10) * prosthese(a,a); /* 2η και 3η κλήση της */ printf(“D=%d”, prosthese(d,1)); /* 4η κλήση της συνάρτησης */ } /* Ορισμός της συνάρτησης */ int prosthese (int arithmos1, int arithmos2) { return (arithmos1 + arithmos2);
Μεταβίβαση Παραμέτρων Όσο πιο σύνθετες γίνονται οι συναρτήσεις, τόσο πιο περίπλοκα μπορούν να γίνουν τα πράγματα σε ότι αφορά τις παραμέτρους εισόδου και εξόδου τους Θα εξετάσουμε πως δηλώνουμε μια συνάρτηση στις ακόλουθες περιπτώσεις Μια συνάρτηση που παίρνει μια παράμετρο εισόδου αλλά επιστρέφει δυο παραμέτρους εξόδου. (π.χ. μια συνάρτηση που παίρνει σαν είσοδο ένα ακέραιο και επιστρέφει το τετράγωνό του και τον κύβο του) Μια συνάρτηση που παίρνει δυο εισόδους, οι οποίες όμως είναι ταυτόχρονα και έξοδοι. (π.χ. μια συνάρτηση που δέχεται σαν είσοδο δυο αριθμούς και ανταλλάσσει αμοιβαία τις τιμές τους)
Μεταβίβαση Παραμέτρων με Τιμή Δημιουργείται στην καλούμενη συνάρτηση ένα αντίγραφο της πραγματικής παραμέτρου Οι αλλαγές στην καλούμενη συνάρτηση επηρεάζουν το αντίγραφο και όχι την τιμή της πραγματικής παραμέτρου Παράδειγμα 1: void aykshse (int arithmos) { arithmos++; } main () {int num=2; printf(“Παλιά Τιμή = %d, ”, num); /* Θα τυπώσει 2 */ aykshse(num); printf(“Νέα Τιμή = %d”, num); /* Θα τυπώσει πάλι 2 */
Μεταβίβαση Παραμέτρων με Αναφορά Όποιες αλλαγές τυχόν γίνουν από τη συνάρτηση επηρεάζουν και την πραγματική παράμετρο μεταβιβάζεται η διεύθυνση της παραμέτρου στη μνήμη και όχι η αξία της void aykshse (int *arithmos) { *arithmos++; } main () {int num=2; printf(“Παλιά Τιμή = %d, ”, num); /* Θα τυπώσει 2 */ aykshse(&num); printf(“Νέα Τιμή = %d”, num); /* Θα τυπώσει 3 */ Αλλαγές Στη συνάρτηση aykshse η παράμετρος δεν είναι πια τύπου int αλλά τύπου int * Κατά την κλήση της συνάρτησης δε μεταβιβάζεται ο ακέραιος (num) αλλά η διεύθυνση του ακέραιου (&num)
Συναρτήσεις με πολλές παραμέτρους Τρόποι δήλωσης συναρτήσεων με πολλές παραμέτρους Παράμετροι Εξόδου 1 2+ Η έπιστροφή δηλώνεται ως void, οι τυχόν είσοδοι μεταβιβάζονται με μεταβίβαση αξίας Η επιστροφή δηλώνεται ως int (ή ότι άλλο είναι), οι τυχόν είσοδοι μεταβιβάζονται με μεταβίβαση αξίας Η επιστροφή δηλώνεται ως void. Οι παράμετροι εισόδου μεταβιβάζονται με μεταβίβαση αξίας, ενώ οι παράμετροι εξόδου (ή εισόδου/εξόδου) με μεταβίβαση αναφοράς Παράμετροι Εισόδου void x (void) int x (void) void x (int *c, int *d) void x (int a) int x (int a) void x (int a, int *c, int *d) void x (int a, int b) int x (int a, int b) void x (int a, int b, int *c, int *d)
Συναρτήσεις Βιβλιοθήκης Συναρτήσεις Βιβλιοθήκης : Έτοιμες συναρτήσεις που μπορούν να κληθούν και να χρησιμοποιηθούν σε ένα πρόγραμμα (πχ η printf και η scanf ) Για να χρησιμοποιήσουμε μια συνάρτηση βιβλιοθήκης πρέπει να συμπεριλάβουμε (include) στο πρόγραμμα μας την αντίστοιχη βιβλιοθήκη που την περιέχει Συνήθως συμπεριλαμβάνουμε την <stdio.h> που περιλαμβάνει συναρτήσεις εισόδου-εξόδου (standard input-output, stdio) Άλλες χρήσιμες βιβλιοθήκες Βιβλιοθήκη Συνάρτηση Λειτουργία <math.h> sqrt(x) Επιστρέφει την τετραγωγική ρίζα του x pow(x,y) Επιστρέφει την τιμή xy log(x) Επιστρέφει το φυσικό λογάριθμο του x <stdlib.h> abs(x) Επιστρέφει την απόλυτη τιμή του x