5.1 Πίνακες Μιας Διάστασης
🎯 Τι είναι Πίνακας;
Ένας πίνακας (array) είναι μια συλλογή από πολλές μεταβλητές του ίδιου τύπου, αποθηκευμένες συνεχόμενα στη μνήμη.
Αντί να δηλώσεις 100 ξεχωριστές μεταβλητές, δηλώνεις έναν πίνακα με 100 θέσεις!
Δήλωση Πίνακα
📋 Βασικά Στοιχεία Πινάκων
- Οι θέσεις αριθμούνται από 0 μέχρι μέγεθος-1
- Όλα τα στοιχεία έχουν τον ίδιο τύπο
- Το μέγεθος πρέπει να είναι σταθερό
📘 Παράδειγμα 1 - Δήλωση και Αρχικοποίηση
📘 Παράδειγμα 2 - Αρχικοποίηση κατά τη Δήλωση
5.2 Δισδιάστατοι Πίνακες
🎯 Δισδιάστατοι Πίνακες
Οι δισδιάστατοι πίνακες αποτελούνται από γραμμές και στήλες (όπως ένας πίνακας ή μια μήτρα).
📋 Παράδειγμα Δήλωσης
Πλήθος στοιχείων: γραμμές × στήλες
| Στήλη 0 | Στήλη 1 | Στήλη 2 | |
|---|---|---|---|
| Γραμμή 0 | a[0][0] | a[0][1] | a[0][2] |
| Γραμμή 1 | a[1][0] | a[1][1] | a[1][2] |
| Γραμμή 2 | a[2][0] | a[2][1] | a[2][2] |
📘 Παράδειγμα 3 - Δισδιάστατος Πίνακας
5.3 Συναρτήσεις
🎯 Τι είναι οι Συναρτήσεις;
Μία συνάρτηση είναι ένα ανεξάρτητο τμήμα κώδικα που εκτελεί μία συγκεκριμένη εργασία και προαιρετικά επιστρέφει μία τιμή.
✅ Πλεονεκτήματα Συναρτήσεων
- Διαίρεση του προγράμματος σε μικρότερα, διαχειρίσιμα τμήματα
- Επαναχρησιμοποίηση κώδικα
- Ευκολότερη συντήρηση και έλεγχος
- Καλύτερη οργάνωση και δομή του κώδικα
Δήλωση Συνάρτησης
📘 Παραδείγματα Δηλώσεων
Ορισμός Συνάρτησης
📘 Παράδειγμα 4 - Απλή Συνάρτηση
📘 Παράδειγμα 5 - Συνάρτηση με Παραμέτρους
Κατανόηση Πρωτοτύπων Συναρτήσεων
🔍 Ο Ρόλος των "Πρωτοτύπων Συναρτήσεων"
Αυτός είναι ο λόγος ύπαρξης των γραμμών:
Με αυτές τις δηλώσεις λες στον μεταγλωττιστή:
"Υπάρχουν δύο συναρτήσεις με αυτά τα ονόματα και αυτές τις παραμέτρους — θα τις ορίσω κάπου πιο κάτω."
Έτσι, όταν στη main() βλέπει:
ο μεταγλωττιστής ξέρει:
- ότι υπάρχει η add,
- ότι παίρνει δύο int,
- ότι επιστρέφει int.
Δεν ξέρει ακόμα τι κάνει μέσα, αλλά αυτό δεν χρειάζεται εκείνη τη στιγμή· του αρκεί να γνωρίζει πώς να τη χρησιμοποιήσει (δηλαδή τη "μορφή" της).
🧩 Όταν Φτάσει στους "Ορισμούς"
Αργότερα, όταν "διαβάζει" τις γραμμές:
τότε πλέον βρίσκει την υλοποίηση αυτών των συναρτήσεων — δηλαδή τι κάνουν μέσα. Ο compiler "ενώνει" αυτή την πληροφορία με όσα είχε μάθει από τα πρωτότυπα.
Η Εντολή return
📋 Χρήση της return
Η εντολή return χρησιμοποιείται για:
- Να τερματίσει τη συνάρτηση
- Να επιστρέψει μια τιμή στο σημείο που κλήθηκε η συνάρτηση
⚠️ Εναλλακτικός Τρόπος: Ορισμοί Συναρτήσεων Πριν από τη main()
Μπορείς επίσης να ορίσεις τις συναρτήσεις πριν από τη main() αντί να χρησιμοποιήσεις πρωτότυπα. Έτσι, ο compiler τις "βλέπει" ήδη όταν φτάσει στη main() και δεν χρειάζεται να δηλώσεις πρωτότυπα.
📘 Παράδειγμα - Ορισμοί Συναρτήσεων Πριν από τη main()
📘 Παράδειγμα 6 - Εύρεση Μέγιστου
5.4 Συνδυασμός Πινάκων και Συναρτήσεων
📘 Παράδειγμα 7 - Συναρτήσεις με Πίνακες
✅ Καλές Πρακτικές
- Χρησιμοποίησε περιγραφικά ονόματα για συναρτήσεις
- Κάθε συνάρτηση να εκτελεί μία συγκεκριμένη εργασία
- Δήλωσε πάντα τα πρωτότυπα πριν τη χρήση
- Χρησιμοποίησε σχόλια για να εξηγήσεις τη λειτουργία
🚨 Συνηθισμένα Λάθη
- Πρόσβαση εκτός ορίων πίνακα
- Ξέχασμα της εντολή return σε συναρτήσεις που επιστρέφουν τιμή
- Λάθος αντιστοίχιση τύπων στις παραμέτρους
5.5 Μαθηματικές Συναρτήσεις από <math.h>
🧮 Έτοιμες Μαθηματικές Συναρτήσεις
Η βιβλιοθήκη math.h παρέχει πολλές έτοιμες συναρτήσεις για αριθμητικές πράξεις, όπως τετραγωνικές ρίζες, δυνάμεις, ημίτονα κ.ά.
📘 Παράδειγμα - Μαθηματικές Συναρτήσεις από math.h
🧮 Επεξήγηση Συναρτήσεων
- sqrt(x) → επιστρέφει √x (τετραγωνική ρίζα).
- pow(x, y) → επιστρέφει xy (x στη δύναμη y).
💡 Σημαντική Σημείωση για τη Μεταγλώττιση
Για να δουλέψει σωστά σε όλους τους μεταγλωττιστές, όταν το κάνεις compile γράφεις:
(το -lm λέει στο linker να συμπεριλάβει τη βιβλιοθήκη math).
5.6 Τυχαίοι Αριθμοί με <stdlib.h>
🎲 Παραγωγή Τυχαίων Αριθμών
Η βιβλιοθήκη stdlib.h παρέχει συναρτήσεις για την παραγωγή τυχαίων αριθμών, που είναι χρήσιμες σε παιχνίδια, προσομοιώσεις και πολλές άλλες εφαρμογές.
📘 Παράδειγμα - Τυχαίοι Αριθμοί
🎲 Επεξήγηση Συναρτήσεων
- rand() → παράγει τυχαίο αριθμό.
- srand(seed) → "ορίζει" τη βάση ώστε τα αποτελέσματα να διαφέρουν κάθε φορά.
5.7 Κώδικας ASCII και Συμβολοσειρές
🎯 Στόχος
Να κατανοήσεις:
- Τι είναι ο κώδικας ASCII
- Πώς αποθηκεύονται οι χαρακτήρες και οι συμβολοσειρές στη C
- Πώς μπορούμε να δουλέψουμε με αυτούς στον κώδικα
Ο Κώδικας ASCII
🔠 Τι είναι ο ASCII;
Ο ASCII (American Standard Code for Information Interchange) είναι ένας πίνακας που αντιστοιχεί κάθε χαρακτήρα (γράμμα, αριθμό, σύμβολο) σε έναν αριθμό.
Για παράδειγμα:
| Χαρακτήρας | Τιμή ASCII |
|---|---|
| 'A' | 65 |
| 'a' | 97 |
| '0' | 48 |
| ' ' (κενό) | 32 |
➡️ Στη C, κάθε χαρακτήρας (char) αποθηκεύεται ως ακέραιος αριθμός 0–127 (σύμφωνα με τον πίνακα ASCII).
Παράδειγμα με Χαρακτήρες
📘 Παράδειγμα - Εμφάνιση Χαρακτήρα και ASCII Κώδικα
🟢 Έξοδος:
👉 Το %c εμφανίζει χαρακτήρα, ενώ το %d εμφανίζει τον αριθμό του (τον κώδικα ASCII).
Συμβολοσειρές στη C
🧵 Τι είναι μια Συμβολοσειρά;
Μια συμβολοσειρά (string) είναι πίνακας χαρακτήρων που τελειώνει με τον χαρακτήρα '\0' (τον "τερματιστή").
📘 Παράδειγμα - Βασική Συμβολοσειρά
🟢 Έξοδος:
Ο compiler το αποθηκεύει ως: 'H' 'e' 'l' 'l' 'o' '\0'
📝 Τι Συμβαίνει με τη Γραμμή
Η γραμμή:
δημιουργεί έναν πίνακα χαρακτήρων στη C.
Αναλυτικά Τι Συμβαίνει
Η συμβολοσειρά "Hello" αποθηκεύεται ως εξής στη μνήμη:
| Θέση | Περιεχόμενο | ASCII |
|---|---|---|
| 0 | 'H' | 72 |
| 1 | 'e' | 101 |
| 2 | 'l' | 108 |
| 3 | 'l' | 108 |
| 4 | 'o' | 111 |
| 5 | '\0' | 0 |
Δηλαδή, η συμβολοσειρά έχει 6 χαρακτήρες, γιατί στο τέλος υπάρχει ο ειδικός τερματιστής '\0' που δείχνει πού τελειώνει το string.
🧩 Ισοδύναμος Τρόπος Γραφής
Μπορούμε να γράψουμε το ίδιο πράγμα και έτσι:
Αυτό κάνει ακριβώς το ίδιο με το "Hello". Απλώς η πρώτη μορφή ("Hello") είναι πιο σύντομη και συνηθισμένη.
🧠 Θυμήσου:
- Κάθε συμβολοσειρά στη C είναι πίνακας char.
- Πρέπει πάντα να τελειώνει με '\0', αλλιώς η εκτύπωση με %s θα συνεχίσει να διαβάζει "σκουπίδια" από τη μνήμη.
Πώς Αποθηκεύεται στη Μνήμη
Ας δούμε πώς φαίνεται ο πίνακας name στη μνήμη, byte προς byte, όταν γράφουμε:
🧩 Αναπαράσταση στη Μνήμη
Ας πούμε ότι η μεταβλητή name ξεκινά στη διεύθυνση 1000 (ενδεικτικά). Η C θα αποθηκεύσει κάθε χαρακτήρα σε ένα byte (1 byte = 8 bits).
| Διεύθυνση (παράδειγμα) | Περιεχόμενο | ASCII | Περιγραφή |
|---|---|---|---|
| 1000 | 'H' | 72 | Πρώτος χαρακτήρας |
| 1001 | 'e' | 101 | Δεύτερος χαρακτήρας |
| 1002 | 'l' | 108 | Τρίτος χαρακτήρας |
| 1003 | 'l' | 108 | Τέταρτος χαρακτήρας |
| 1004 | 'o' | 111 | Πέμπτος χαρακτήρας |
| 1005 | '\0' | 0 | Τερματιστής συμβολοσειράς |
📘 Τι Σημαίνει Αυτό
- Ο δείκτης name δείχνει στη διεύθυνση του πρώτου χαρακτήρα (&name[0]).
- Όταν γράφεις printf("%s", name);, η C ξεκινά να τυπώνει χαρακτήρες μέχρι να βρει το '\0'.
- Αν λείπει το '\0', η C θα συνεχίσει να τυπώνει άγνωστα bytes από τη μνήμη → "σκουπίδια" (garbage).
🔍 Παράδειγμα για να το Δεις στην Πράξη
🟢 Παράδειγμα Εξόδου:
🔸 Οι διευθύνσεις διαφέρουν κάθε φορά που τρέχεις το πρόγραμμα, αλλά μπορείς να δεις ότι κάθε χαρακτήρας πιάνει 1 byte και είναι σε συνεχόμενη διεύθυνση στη μνήμη.
ASCII Τιμές Μέσα σε Συμβολοσειρές
📘 Παράδειγμα - Εμφάνιση ASCII Τιμών Συμβολοσειράς
🟢 Έξοδος:
Μικρή Άσκηση
🧠 Άσκηση
✏️ Άσκηση: Γράψε ένα πρόγραμμα που θα διαβάζει έναν χαρακτήρα από το χρήστη και θα εμφανίζει τον ASCII κώδικά του.
🧩 Υπόδειξη:
- Χρησιμοποίησε scanf("%c", &ch);
- Εκτύπωσε τον ASCII αριθμό με %d
🎓 Τέλος Κεφαλαίου 5
Συγχαρητήρια! Τώρα ξέρεις:
- ✓ Πώς να δημιουργείς και να χρησιμοποιείς πίνακες
- ✓ Πώς να δουλεύεις με δισδιάστατους πίνακες
- ✓ Πώς να δημιουργείς και να καλείς συναρτήσεις
- ✓ Πώς να συνδυάζεις πίνακες με συναρτήσεις
Μπάρδης Γιώργος
Τμήμα Ψηφιακών Συστημάτων - Πανεπιστήμιο Πελοποννήσου