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

Σχετικά έγγραφα
Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

2ο σετ σημειώσεων. 1 Εντολές εκτέλεσης υπό συνθήκη. 19 Μαρτίου 2012

5ο σετ σημειώσεων - Δείκτες

Συμβολοσειρές. 1 Συμβολοσειρές. 6 Απριλίου 2014

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

Εντολές ελέγχου ροής if, for, while, do-while

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

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

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

Κεφάλαιο ΙV: Δείκτες και πίνακες. 4.1 Δείκτες.

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

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

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

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

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

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

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

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

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

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

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

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

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

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

Συναρτήσεις. Εισαγωγή

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

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

ΦΥΛΛΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ 1

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

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

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

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

7. ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΣΥΝΑΡΤΗΣΕΙΣ

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7) Είσοδος/ Έξοδος

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού

Pascal. 15 Νοεμβρίου 2011

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

Απλά Προγράμματα. Βήματα: 1. Καθορισμός παράστασης δεδομένων στη μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7)

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

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

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

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

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

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

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

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

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

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

ΑΣΚΗΣΗ 7: ΑΛΦΑΡΙΘΜΗΤΙΚΑ

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων

ΚΕΦΑΛΑΙΟ 9 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Σύντομες εισαγωγικές σημειώσεις για την. Matlab

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

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

Ασκηή σεις 12ο Μαά θημα - Λυύ σεις

Εισαγωγή στις Συναρτήσεις

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Γραφικά υπολογιστών Εργαστήριο 4 Εισαγωγή στις λίστες

Βήματα: μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων. Δομές Δεδομένων + Αλγόριθμοι = Προγράμματα

Υπολογισμός - Συλλογή Δεδομένων - Πίνακες

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

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

Τι είναι υποπρόγραμμα; Τμήμα προγράμματος το οποίο επιτελεί ένα αυτόνομο υπολογιστικό έργο (γράφεται χωριστά από το υπόλοιπο πρόγραμμα)

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

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

Η βασική συνάρτηση προγράμματος main()

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

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 3 Επανάληψη Γ μέρος

Σημειώσεις για πρόοδο στο εργαστήριο

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

Ινστιτούτο Επαγγελµατική Κατάρτιση Κορυδαλλού "ΤΕΧΝΙΚΟΣ ΣΥΣΤΗΜΑΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ" (Ερωτήσεις Πιστοποίησης στην γλώσσα προγραµµατισµού C)

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

Συναρτήσεις και διαδικασίες

printf Οι κωδικοί (format codes) του printf για διάφορους τύπους δεδοµένων είναι:

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

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

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

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

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

4. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Α' μέρος: for)

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

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

Στόχοι και αντικείμενο ενότητας. Τύπος πίνακα. Τύπος πίνακα (συν.) #6. Πίνακες και Δείκτες

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

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

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

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

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

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

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

Ηβασικήσυνάρτηση προγράμματος main()

Transcript:

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις 5 Απριλίου 01 1 Πίνακες Είδαμε ότι δηλώνοντας μία μεταβλητή κάποιου συγκεκριμένου τύπου δεσμεύουμε μνήμη κατάλληλη για να αποθηκευτεί μία οντότητα του συγκεκριμένου τύπου. Στην περίπτωση που θέλουμε να δεσμεύσουμε μνήμη για να αποθηκευτούν περισσότερες από μία ομοειδείς μεταβλητές μπορούμε να χρησιμοποιήσουμε πίνακες (arrays). Η δήλωση ενός πίνακα είναι όπως και η δήλωση μίας μεταβλητής με τη διαφορά ότι μετά το όνομα του πίνακα δηλώνουμε το μέγεθός του μέσα σε αγκύλες (brackets) []. Για παράδειγμα οι παρακάτω δηλώσεις δηλώνουν έναν πίνακα ακεραίων a με δέκα θέσεις, έναν πίνακα αριθμών κινητής υποδιαστολής b με 5 και έναν πίνακα χαρακτήρων c με 100: Η αρίθμηση των επιμέρους στοιχείων του πίνακα ξεκινάει από το μηδέν, δηλαδή σε έναν πίνακα με 100 στοιχεία αυτά είναι αριθμημένα από το μηδέν μέχρι και το 99 όχι όμως το 100. 1 int a[10]; float b[5]; 3 char c[100]; Αφού δηλώσουμε τον πίνακα μπορούμε να αναφερθούμε στα επιμέρους στοιχεία του με το όνομα του πίνακα ακολουθούμενο από τον αύξοντα αριθμό του στοιχείου μέσα σε αγκύλες. Π.χ. σύμφωνα με τις παραπάνω δηλώσεις οι παρακάτω εντολές σημαίνουν τα εξής: 1 a[0] = b[10]; Διάβασε το υπ αριθμόν 10 στοιχείο του πίνακα b και αποθήκευσέ το στο υπ αριθμόν 0 στοιχείο του πίνακα a. 1 b[1] = a[10] + a[11]; Διάβασε τα υπ αριθμόν 10 και 11 στοιχεία του πίνακα a, πρόσθεσέ τα και αποθήκευσε το αποτέλεσμα στο υπ αριθμόν 1 στοιχείο του πίνακα b. Χρειάζεται προσοχή όταν αναφερόμαστε στα επιμέρους στοιχεία ενός πίνακα για να μη βγούμε έξω από τα όριά του. Αν π.χ. σε έναν πίνακα a 10 στοιχείων εμείς ζητήσουμε να διαβάσουμε ή να γράψουμε στο υπ αριθμό 45, η C δεν μας εμποδίζει αλλά αυτό σίγουρα θα έχει άσχημα (έως καταστροφικά) αποτελέσματα καθώς θα πειράζουμε τμήματα μνήμης που δε θα θέλαμε να τροποποιήσουμε. Προσοχή λοιπόν ειδικά στο σημείο ότι ένας πίνακας 100 θέσεων έχει στοιχεία αριθμημένα από το μηδέν μέχρι το 99 και όχι το 100. Γενικά σε έναν πίνακα n θέσεων τα επιμέρους στοιχεία αριθμούνται από το μηδέν μέχρι το n-1. 1

1.1 Παραδείγματα 1. Ένα πρόγραμμα που δηλώνει έναν πίνακα a πέντε ακεραίων, ζητάει από το χρήστη να δώσει τιμές για αυτούς και στη συνέχεια τους τυπώνει. 5 int a[5]; 7 8 for (i = 0; i < 5; ++i) { Listing 1: Τιμές σε πίνακα και εκτύπωση 9 printf(" Dose to #% d stoixeio to pinaka: ", i); 10 scanf("%d", &a[i]); 11 } 1 13 for (i = 0; i < 5; ++i) { 14 printf(" To #% d stoixeio toy pinaka einai %d\n", i, a[i]); 15 } 16 17 return 0; 18 }. Ένα πρόγραμμα όπως το παραπάνω το οποίο βρίσκει το μικρότερο στοιχείο του πίνακα. Listing : Μικρότερο στοιχείο πίνακα 5 int a[5]; 7 int mikr; 8 9 for (i = 0; i < 5; ++i) { 10 printf(" Dose to #% d stoixeio to pinaka: ", i); 11 scanf("%d", &a[i]); 1 } 13 14 mikr = a[0]; 15 for (i = 1; i < 5; ++i) { 16 if (a[i] < mikr) 17 mikr = a[i]; 18 }

19 printf(" To mikrotero stoixeio einai to %d\n", mikr); 0 1 return 0; } 3. Ένα πρόγραμμα όπως το παραπάνω το οποίο αθροίζει τα στοιχεία του πίνακα. 5 int a[5]; 7 int sum; 8 9 for (i = 0; i < 5; ++i) { Listing 3: Άθροισμα στοιχείων πίνακα 10 printf(" Dose to #% d stoixeio to pinaka: ", i); 11 scanf("%d", &a[i]); 1 } 13 14 sum = 0; 15 for (i = 0; i < 5; ++i) { 16 sum += a[i]; 17 } 18 printf(" To athroisma einai %d\n", sum); 19 0 return 0; 1 } 4. Ένα πρόγραμμα το οποίο δημιουργεί έναν πίνακα αντιστοίχισης θερμοκρασιών βαθμών Κελσίου σε βαθμούς Φαρενάιτ. Δηλαδή οι αύξοντες αριθμοί των στοιχείων του πίνακα θα είναι οι βαθμοί Κελσίου και το αντίστοιχο στοιχείο θα είναι η θερμοκρασία σε βαθμούς Φαρενάιτ. Π.χ. το a[5] θα πρέπει να έχει τη θερμοκρασία Φαρενάιτ που αντιστοιχεί στους 5 βαθμούς Κελσίου. Αν T C είναι η θερμοκρασία σε βαθμούς Κελσίου, τότε η αντίστοιχη θερμοκρασία Φαρενάιτ είναι T F = (9/5) T C + 3. Listing 4: Πίνακας Κελσίου-Φαρενάιτ 5 float t[15]; 7 3

8 for (i = 0; i < 15; ++i) { 9 t[i] = (9./5)* i + 3; 10 } 11 1 printf("oc of\n"); 13 printf("---+------\n"); 14 for (i = 0; i < 15; ++i) { 15 printf("%-d %5.f\n", i, t[i]); 16 } 17 18 return 0; 19 } 1. Συμβολοσειρές Μια ειδική χρήση των πινάκων είναι αυτή της παράστασης κειμένων. Η επεξεργασία κειμένου είναι μια διαδεμόνη υπολογιστική εφαρμογή. Τα κείμενα παριστάνονται στη μνήμη του υπολογιστή ως διαδοχικοί χαρακτήρες. Είναι φυσικό λοιπόν στη C να αποθηκεύονται σε πίνακες χαρακτήρων. Στο παράδειγμα 5 βλέπουμε πώς μπορούμε να αποθηκεύσουμε τους διαδοχικούς χαρακτήρες της λέξης Hello! σε έναν πίνακα και στη συνέχεια τυπώνοντάς τους έναν προς έναν να έχουμε το οπτικό αποτέλεσμα της εκτύπωσης μιας λέξης. Listing 5: Πίνακας χαρακτήρων 5 char p[6]; 7 p[0] = 'H'; p[1] = 'e'; p[] = 'l'; 8 p[3] = 'l'; p[4] = 'o'; p[5] = '!'; 9 10 for (i = 0; i < 6; ++i) 11 printf("%c", p[i]); 1 13 return 0; 14 } Βέβαια, στο συγκεκριμένο παράδειγμα βλέπουμε διάφορες λεπτομέρειες που θα μπορούσαν να ενοχλήσουν κάποιον όπως για παράδειγμα το ότι ο πίνακας p δηλώθηκε να έχει τόσο μέγεθος όσο και η λέξη που θέλαμε να αποθηκεύσουμε. Αυτό όμως είναι πρακτικά ανεφάρμοστο, δηλαδή δεν μπορούμε να ξέρουμε εκ των προτέρων πόσο μεγάλα θα είναι τα κείμενα που θα χρειαστεί να επεξεργαστούμε. Συνήθως λοιπόν δηλώνουμε τους πίνακες που θα χρησιμοποιήσουμε αρκετά μεγάλους για να χωράνε την πλειοψηφία των κειμένων που θα μπορούσαν να προκύψουν στην πράξη, π.χ. στο παραπάνω παράδειγμα θα δηλώναμε τον πίνακα p ως πίνακα 100 θέσεων. Αμέσως προκύπτει 4

το επόμενο ζήτημα, ότι εφόσον δηλώνουμε τους πίνακες αρκετά μεγαλύτερους από όσο συνήθως χρειάζεται, πώς μπορούμε να γνωρίζουμε πόσους ακριβώς χαρακτήρες περιέχει το κείμενο που αποθηκεύεται εκεί. Στη C το τέλος του κειμένου που αποθηκεύεται σε έναν πίνακα δηλώνεται με έναν ειδικό χαρακτήρα, το χαρακτήρα τερματισμού συμβολοσειράς ο οποίος ως χαρακτήρας είναι ο '\0' και έχει την αριθμητική τιμή 0. Έτσι, μπορούμε να γράψουμε συναρτήσεις χειρισμού κειμένου οι οποίες να δουλεύουν χωρίς να χρειάζεται να γνωρίζουν εκ των προτέρων το μήκος του κειμένου. Στη C αυτή η δομή, δηλαδή μία σειρά χαρακτήρων της οποίας το τέλος δηλώνεται με τον ειδικό χαρακτήρα '\0' ονομάζεται συμβολοσειρά (string). Πολλές συναρτήσεις των βιβλιοθηκών της C, δουλεύουν πάνω σε τέτοιου τύπου δομές. Μία από αυτές είναι η συνάρτηση printf η οποία αν της δοθεί ως παράμετρος μία συμβολοσειρά την τυπώνει στην οθόνη. Δηλαδή αναλαμβάνει να κάνει αυτό που κάναμε εμείς με το χέρι στο προηγούμενο παράδειγμα στις γραμμές 10 και 11 τυπώνοντας τους χαρακτήρες έναν προς έναν. Χρησιμοποιούμε την printf για να τυπώνουμε συμβολοσειρές όπως στο παρακάτω παράδειγμα, δίνοντας τον πίνακα στον οποίο είναι αποθηκευμένη η συμολοσειρά ως παράμετρο στην printf και χρησιμοποιώντας τον προσδιοριστή %s: 1 char s[100]; p[0] = 'H'; p[1] = 'e'; p[] = 'l'; 3 p[3] = 'l'; p[4] = 'o'; p[5] = '!'; 4 p[6] = '\0'; 5 printf("%s", p); Επίσης υπάρχουν διάφορες συναρτήσεις για την αντίστροφη δουλειά, δηλαδή που γεμίζουν έναν άδειο πίνακα με μία συμβολοσειρά. Π.χ. η συνάρτηση gets ¹ δέχεται παράμετρο έναν πίνακα χαρακτήρων και βάζει σε αυτόν έναν προς έναν τους χαρακτήρες που έγραψε ο χρήστης στο πληκτρολόγιο μέχρι να πατήσει το enter. Επίσης, προσθέτει το χαρακτήρα τερματισμού συμβολοσειράς. Π.χ. το παρακάτω παράδειγμα τυπώνει στην οθόνη ό,τι έγραψε ο χρήστης στο πληκτρολόγιο. 1 char p[100]; gets(p); 3 printf(" Egrpases %s", p); Συναρτήσεις Η C δίνει τη δυνατότητα ορισμού συναρτήσεων (functions) δηλαδή υποπρογραμμάτων με παραμετροποιήσιμη συμπεριφορά τα οποία μπορούν προαιρετικά να επιστρέφουν μία τιμή. Για να ορίσουμε μία συνάρτηση μπορούμε να χρησιμοποιήσουμε το παρακάτω απλουστευμένο ² συντακτικό 1 return_type function_name( argument_list) { ¹Η gets είναι μία συνάρτηση που δεν πρέπει να χρησιμοποιείται γιατί έχει κάποια σοβαρή σχεδιαστική ατέλεια. Θα δούμε στη συνέχεια ποιες συναρτήσεις θα έπρεπε κανείς να χρησιμοποιεί για αυτή τη δουλειά. Λόγω της απλότητάς της όμως θα την χρησιομοποιήσουμε προς το παρόν για τα παραδείγματά μας, τονίζοντας βέβαια ότι δεν πρέπει να χρησιμποιείται σε πραγματικές συνθήκες. ²Υπάρχουν και άλλα στοιχεία που μπορούν να χρησιμποιηθούν σε έναν ορισμό συνάρτησης αλλά δεν είναι αναγκαία για τους σκοπούς της πιστοποίησης οπότε τα αφήνουμε για αργότερα. 5

3 declarations; 4 5 commands; 6 } Τα άγκιστρα και οι παρενθέσεις αναφέρονται κυριολεκτικά, δηλαδή πρέπει κανείς τα γράψει όπως φαίνονται παραπάνω. Για τα υπόλοιπα τμήματα: return_type Ο τύπος της επιστρεφόμενη τιμής ή η λέξη void αν η συνάρτηση δεν επιστρέφει κάποια τιμή. function_name Το όνομα που δίνουμε στη συνάρτηση. Μπορεί να είναι οποιοδήποτε νόμιμο όνομα δηλαδή μια ακολουθία χαρακτήρων (πεζών ή/και κεφαλαίων), ψηφίων και της κάτω παύλας _ η οποία δεν ξεκινάει όμως με αριθμητικό ψηφίο ³. argument_list Είναι η λίστα των τυπικών παραμέτρων η οποία μπορεί να είναι και κενή, δηλαδή η συνάρτηση να μην παίρνει καμία παράμετρο. Η λίστα παραμέτρων είναι μια λίστα ζευγαριών της μορφής type argname τα οποία ζευγάρια χωρίζονται με κόμμματα, όπου argname είναι το όνομα της παραμέτρου και type είναι ο τύπος της. declarations, commands Είναι οι δηλώσεις τοπικών μεταβλητών και οι εντολές της συνάρτησης αντίστοιχα, όπως τις έχουμε ήδη δει στη συνάρτηση main. Για να καλέσουμε μία συνάρτηση γράφουμε το όνομά της ακολουθούμενο από τη λίστα των πραγματικών παραμέτρων κλεισμένων μέσα σε παρενθέσεις. Ακόμα και αν η συνάρτηση δεν παίρνει παραμέτρους οι παρενθέσεις πρέπει να αναγράφονται. Οι πραγματικές παράμετροι είναι εκφράσεις οι οποίες ταιριάζουν στο πλήθος των τυπικών παραμέτρων και είναι του ανάλογου τύπου. Π.χ. αν μία συνάρτηση είναι ορισμένη ως void fun(int a, char b) οι παρακάτω είναι νόμιμες κλήσεις 1 fun(5, 'a'); fun(5.4, 'b'); 3 fun(6*4, 'c'); ενώ οι παρακάτω δεν είναι 1 fun(); fun(5); 3 fun('c'); 4 fun(5, 6, 7, 'a', 'b'); Η διαβίβαση των παραμέτρων μιας συνάρτησης γίνεται κατ αξία (by-value) δηλαδή στη συνάρτηση μεταερεται η τιμή της παραμέτρου και όχι η θέση της στη μνήμη του υπολογιστή. Έτσι μία συνάρτηση δεν μπορεί να τροποποιήσει τα ορίσματά της ⁴. Δείτε το παρακάτω παράδειγμα: ³????? Νόμιμοι χαρακτήρες????? ⁴Υπάρχει μηχανισμός για να μπορέσει μία συνάρτηση να τροποποιήσει τα ορίσματά της τον οποίο θα δούμε αργότερα όταν μιλήσουμε για δείκτες. Στην περίπτωση των πινάκων των πινάκων ως παραμέτρων σε μία συνάρτηση μπορεί να δημιουργηθεί η εντύπωση ότι η συνάρτηση μπορεί και τροποποιεί τον πίνακα που της δίνεται ως όρισμα αλλά αυτό συμβαίνει γιατί στην πραγματικότητα οι πίνακες είναι δείκτες. 6

Listing 6: Κλήση κατ αξία 3 void fun(int a) 5 a++; 6 printf("a is %d\n", a); 7 } 8 9 int main() 10 { 11 int b = 5; 1 printf("b is %d\n", b); 13 fun(b); 14 printf("b is %d\n", b); 15 16 return 0; 17 } Αν το τρέξετε θα εμφανιστεί στην οθόνη το παρακάτω b is 5 a is 6 b is 5 δηλαδή παρά το γεγονός ότι η μεταβλητή b περνιέται στη συνάρτηση ως πραγματική παράμετρος που αντιστοιχίζεται στην τυπική παράμετρο a και παρά το γεγονός ότι η a αλλάζει μέσα στη συνάρτηση, η μεταβλητή b τελικά δεν μεταβάλεται. Η λόγος είναι ότι όταν δίνουμε την b ως παράμετρο στη συνάρτηση, δεν περνιέται η η θέση μνήμης στην οποία είναι αποθηκευμένη η b αλλά υπολογίζεται η τιμή της τη στιγμή της κλήσης και αυτή η τιμή αποθηκεύεται στην τοπική μεταβλητή a. 7