📚 Περιεχόμενα Κεφαλαίου
3.1 Τι είναι οι Μεταβλητές
🔍 Ορισμός Μεταβλητής
Μια μεταβλητή είναι ένας δεσμευμένος χώρος μνήμης του υπολογιστή που μπορεί να αποθηκεύσει δεδομένα. Η τιμή της μπορεί να αλλάξει κατά τη διάρκεια εκτέλεσης του προγράμματος.
Χαρακτηριστικά Μεταβλητών
- Όνομα (Identifier): Το όνομα με το οποίο αναφερόμαστε στη μεταβλητή
- Τύπος (Type): Καθορίζει τι είδος δεδομένων μπορεί να αποθηκεύσει
- Τιμή (Value): Τα δεδομένα που είναι αποθηκευμένα στη μεταβλητή
- Διεύθυνση (Address): Η θέση στη μνήμη όπου αποθηκεύεται
📊 Παράσταση Μεταβλητής στη Μνήμη
int age = 25;
Όνομα Τιμή Διεύθυνση
Bit (Binary Digit)
Το πιο μικρό κομμάτι δεδομένων. Μπορεί να είναι 0 ή 1
Byte
Ένα byte αποτελείται από 8 bits.
Πώς Δουλεύουν τα Δεδομένα
🔸 Βήμα 1: Από bit → σε Byte
➡️ Κάθε κουτάκι είναι 1 bit (0 ή 1).
➡️ 8 τέτοια κουτάκια μαζί = 1 Byte
➡️ Αυτό το Byte μπορεί να αντιπροσωπεύει π.χ. το γράμμα "A".
🔸 Βήμα 2: Από Bytes → σε Kilobyte
| Byte | Binary | Χαρακτήρας |
|---|---|---|
| Byte 1 | 01001000 | "H" |
| Byte 2 | 01100101 | "e" |
| Byte 3 | 01101100 | "l" |
| Byte 4 | 01101100 | "l" |
| Byte 5 | 01101111 | "o" |
Αν ενώσεις αυτά τα 5 Bytes, ο υπολογιστής διαβάζει τη λέξη "Hello".
Μονάδες Μέτρησης
1 Byte (B)
= 8 bits
Μπορεί να αποθηκεύσει 1 χαρακτήρα (π.χ. το γράμμα "A")
1 Kilobyte (KB)
= 1,024 bytes = 210 bytes
Μπορεί να αποθηκεύσει μερικές παραγράφους κειμένου
1 Megabyte (MB)
= 1,024 Kilobytes = 1,048,576 bytes
Μπορεί να αποθηκεύσει μια μικρή φωτογραφία ή μερικά λεπτά μουσικής
1 Gigabyte (GB)
= 1,024 Megabytes
Μπορεί να αποθηκεύσει μια ταινία σε καλή ανάλυση
Τι είναι η διεύθυνση μνήμης στη C;
Κάθε θέση (κελί) της μνήμης του υπολογιστή έχει ένα μοναδικό "νούμερο", δηλαδή μια διεύθυνση. Αυτή δείχνει πού ακριβώς βρίσκεται αποθηκευμένη μια τιμή (π.χ. μιας μεταβλητής) μέσα στη RAM.
🔹 Παράδειγμα: 0x1000
Η τιμή 0x1000 είναι μια διεύθυνση μνήμης, δηλαδή ένας αριθμός που δείχνει το σημείο στη μνήμη όπου υπάρχει κάτι αποθηκευμένο.
Αναλυτικά:
| Στοιχείο | Εξήγηση |
|---|---|
| 0x | Δείχνει ότι ο αριθμός είναι σε δεκαεξαδική μορφή (hexadecimal) |
| 1000 | Η τιμή της διεύθυνσης στη δεκαεξαδική μορφή (αν το μετατρέψουμε σε δεκαδικό είναι 4096) |
Άσκηση: Μνήμη Υπολογιστή
Μελέτησε τον πίνακα μνήμης και απάντησε την ερώτηση
Πίνακας Μνήμης
| Address | Value |
|---|---|
| 0x00 | 01001010 |
| 0x01 | 10111010 |
| 0x02 | 01011111 |
| 0x03 | 00100100 |
| 0x04 | 01000100 |
| 0x05 | 10100000 |
| 0x06 | 01110100 |
| 0x07 | 01101111 |
| 0x08 | 10111011 |
| ... | ... |
| 0xFE | 11011110 |
| 0xFF | 10111011 |
Πληροφορίες:
Στο σχήμα απεικονίζεται μια μνήμη με τις διευθύνσεις κάθε θέσης και τυχαία δεδομένα
Ερώτηση 1: Ποια είναι η χωρητικότητα της μνήμης;
3.2 Βασικοί Τύποι Δεδομένων
Η γλώσσα C παρέχει διάφορους βασικούς τύπους δεδομένων για την αποθήκευση διαφορετικών ειδών πληροφοριών:
🔢 Ακέραιοι Αριθμοί (Integer Types)
| Τύπος | Μέγεθος (bytes) | Εύρος | Παράδειγμα |
|---|---|---|---|
| char | 1 | -128 έως 127 | char grade = 'A'; |
| int | 4 | -2,147,483,648 έως 2,147,483,647 | int age = 25; |
| short | 2 | -32,768 έως 32,767 | short year = 2024; |
| long | 8 | -9,223,372,036,854,775,808 έως 9,223,372,036,854,775,807 | long population = 7800000000L; |
🌊 Αριθμοί Κινητής Υποδιαστολής (Floating Point Types)
| Τύπος | Μέγεθος (bytes) | Ακρίβεια | Παράδειγμα |
|---|---|---|---|
| float | 4 | ~6-7 δεκαδικά ψηφία | float pi = 3.14159f; |
| double | 8 | ~15-17 δεκαδικά ψηφία | double precise = 3.141592653589793; |
| long double | 16 | ~19+ δεκαδικά ψηφία | long double exact = 3.141592653589793238L; |
✅ Λογικός Τύπος (Boolean - από C99)
Για να χρησιμοποιήσετε boolean τύπους, πρέπει να συμπεριλάβετε τη βιβλιοθήκη #include <stdbool.h>
3.3 Δήλωση Μεταβλητών
Σύνταξη Δήλωσης
🔢 Ακέραιοι
🌊 Δεκαδικοί
🔤 Χαρακτήρες
Πολλαπλές Δηλώσεις
Μπορείτε να δηλώσετε πολλές μεταβλητές του ίδιου τύπου στην ίδια γραμμή:
3.4 Αρχικοποίηση Μεταβλητών
💡 Τι είναι η Αρχικοποίηση;
Η αρχικοποίηση είναι η διαδικασία δήλωσης μιας μεταβλητής και ταυτόχρονης ανάθεσης αρχικής τιμής σε αυτήν.
Τρόποι Αρχικοποίησης
1. Αρχικοποίηση κατά τη Δήλωση
2. Αρχικοποίηση μετά τη Δήλωση
3. Αρχικοποίηση Πολλαπλών Μεταβλητών
⚠️ Προσοχή!
Στη C, οι μεταβλητές δεν αρχικοποιούνται αυτόματα. Αν δεν δώσετε αρχική τιμή, μπορεί να περιέχουν τυχαίες τιμές ("garbage values").
3.5 Κανόνες Ονομασίας
📋 Κανόνες για Ονόματα Μεταβλητών
- Πρέπει να ξεκινούν με γράμμα (a-z, A-Z) ή underscore (_)
- Μπορούν να περιέχουν γράμματα, αριθμούς και underscores
- Δεν μπορούν να περιέχουν κενά ή ειδικούς χαρακτήρες
- Δεν μπορούν να είναι δεσμευμένες λέξεις της C
- Είναι case-sensitive (myVar ≠ MyVar ≠ MYVAR)
Παραδείγματα Έγκυρων και Μη Έγκυρων Ονομάτων
| Έγκυρα ✅ | Μη Έγκυρα ❌ | Λόγος |
|---|---|---|
| age | 2age | Ξεκινά με αριθμό |
| student_name | student name | Περιέχει κενό |
| _temp | int | Δεσμευμένη λέξη |
| myVar123 | my-var | Περιέχει παύλα |
| firstName | first@name | Περιέχει ειδικό χαρακτήρα |
Δεσμευμένες Λέξεις της C
📦 Πού γράφει η printf();
Η printf() εμφανίζει τα αποτελέσματα στην οθόνη του υπολογιστή σου. (Αυτό ονομάζεται "standard output" ή stdout — απλώς σημαίνει οθόνη.)
✏️ Πώς τη χρησιμοποιούμε
Η printf() γράφεται έτσι:
Παράδειγμα:
👉 Αυτό θα εμφανίσει:
🔹 Αν θέλουμε να δείξουμε μια μεταβλητή
Αντί να γράφουμε μόνο κείμενο, μπορούμε να δείξουμε και τιμές (όπως αριθμούς ή λέξεις από μεταβλητές).
Γράφουμε:
Το %τύπος λέει στη printf() τι είδους τιμή θα εμφανίσει.
💡 Παραδείγματα
🔸 1. Ακέραιος αριθμός (int)
👉 Εμφανίζει:
Το %d σημαίνει "ακέραιος αριθμός".
🔸 2. Μεγάλος ακέραιος (long)
👉 Εμφανίζει:
Το %ld σημαίνει "μεγάλος ακέραιος (long)".
🔸 3. Δεκαδικός αριθμός (float ή double)
👉 Εμφανίζει:
(Μπορείς να περιορίσεις τα δεκαδικά έτσι: %.2f → 2 δεκαδικά ψηφία.)
🔸 4. Αλφαριθμητικό (λέξη)
👉 Εμφανίζει:
Το %s σημαίνει "string" (δηλαδή λέξη ή πρόταση).
📘 Κάποια χρήσιμα σύμβολα
| Σύμβολο | Τι κάνει |
|---|---|
| \n | πάει σε νέα γραμμή (σαν Enter) |
| \t | κάνει ένα tab (κενό) |
Παράδειγμα:
👉 Εμφανίζει:
Ακολουθίες διαφυγής
🧩 1. \a → Ήχος (beep)
Κάνει έναν μικρό ήχο ειδοποίησης (αν υποστηρίζεται από το σύστημα).
👉 Εμφανίζει:
και (αν το σύστημα το υποστηρίζει) κάνει ένα μπιπ 🔔.
🧩 2. \b → Backspace (διαγραφή ενός χαρακτήρα πίσω)
Σβήνει τον προηγούμενο χαρακτήρα (σαν να πάτησες backspace).
👉 Εμφανίζει:
(το "ε" σβήστηκε από το \b)
🧩 3. \n → Νέα γραμμή (Enter)
Πάει τον δρομέα στην επόμενη γραμμή.
👉 Εμφανίζει:
🧩 4. \r → Επιστροφή στην αρχή της γραμμής (carriage return)
Ο δρομέας γυρίζει στην αρχή της ίδιας γραμμής και γράφει πάνω στα παλιά γράμματα.
👉 Εμφανίζει:
(το "Αντίο" έγραψε πάνω στο "Καλημέρα")
🧩 5. \t → Οριζόντιο tab
Βάζει ένα κενό σαν πίνακα, όπως το πλήκτρο Tab.
👉 Εμφανίζει:
🧩 6. \\ → Εμφάνιση ανάστροφης κάθετης (backslash)
Αν θέλεις να εμφανίσεις το \, πρέπει να γράψεις διπλό \\.
👉 Εμφανίζει:
🧩 7. \" → Εμφάνιση διπλών εισαγωγικών
Για να εμφανίσεις διπλά εισαγωγικά μέσα σε κείμενο, χρησιμοποιείς \".
👉 Εμφανίζει:
🧠 Μικρή σύνοψη
| Ακολουθία | Τι κάνει | Παράδειγμα |
|---|---|---|
| \a | Ήχος beep | printf("Προσοχή!\a"); |
| \b | Διαγράφει 1 χαρακτήρα πίσω | printf("Hello\b!"); |
| \n | Νέα γραμμή | printf("Γεια!\n"); |
| \r | Επιστροφή στην αρχή γραμμής | printf("Καλημέρα\rΑντίο"); |
| \t | Tab (κενό) | printf("Όνομα\tΗλικία"); |
| \\ | Backslash | printf("\\"); |
| \" | Διπλά εισαγωγικά | printf("\"Γεια\""); |
Προσδιοριστικό μετατροπής
🎯 Τι είναι οι προσδιοριστικοί μετατροπής
Όταν γράφουμε printf(), συχνά θέλουμε να εμφανίσουμε μεταβλητές (όχι μόνο κείμενο). Για να ξέρει η printf() πώς να τις δείξει, χρησιμοποιούμε σύμβολα που ξεκινούν με %.
Παράδειγμα:
Το %d λέει στη printf():
"Η μεταβλητή age είναι ακέραιος αριθμός."
📘 Αναλυτικά παραδείγματα
🔹 %c → Εμφανίζει έναν χαρακτήρα
👉 Εμφανίζει:
🔹 %d ή %i → Εμφανίζει έναν ακέραιο
👉 Εμφανίζει:
🔹 %u → Εμφανίζει unsigned ακέραιο (χωρίς πρόσημο)
👉 Εμφανίζει:
🔹 %f → Εμφανίζει πραγματικό αριθμό (float/double)
👉 Εμφανίζει:
(Από προεπιλογή δείχνει 6 δεκαδικά ψηφία — μπορείς να αλλάξεις π.χ. με %.2f για 2 δεκαδικά.)
🔹 %s → Εμφανίζει αλφαριθμητικό (string)
👉 Εμφανίζει:
🔹 %e ή %E → Εμφανίζει επιστημονική μορφή
(όπως 1.23e+05)
👉 Εμφανίζει:
🔹 %g ή %G → Δείχνει τον αριθμό σε απλή ή επιστημονική μορφή, ανάλογα με το μέγεθος
👉 Εμφανίζει:
🔹 %p → Εμφανίζει διεύθυνση μνήμης (pointer)
👉 Εμφανίζει κάτι σαν:
🔹 %x ή %X → Εμφανίζει αριθμό σε δεκαεξαδική μορφή
👉 Εμφανίζει:
🔹 %o → Εμφανίζει αριθμό σε οκταδική μορφή
👉 Εμφανίζει:
(Επειδή το 64 σε οκταδικό είναι 100.)
🔹 %% → Εμφανίζει το ίδιο το σύμβολο %
👉 Εμφανίζει:
✅ Συνοπτικός πίνακας
| Προσδιοριστικό | Εμφανίζει... | Παράδειγμα |
|---|---|---|
| %c | χαρακτήρα | 'A' |
| %d ή %i | ακέραιο (int) | 10 |
| %u | unsigned int | 4000000000 |
| %f | δεκαδικό | 3.14 |
| %s | string | "Γεια" |
| %e, %E | επιστημονική μορφή | 1.23e+05 |
| %g, %G | απλή ή επιστημονική | 12345.7 |
| %p | διεύθυνση μνήμης | 0x7ffee56b8a8c |
| %x, %X | δεκαεξαδικό | ff ή FF |
| %o | οκταδικό | 100 |
| %% | το σύμβολο % | % |
3.6 Σταθερές (Constants)
🔒 Τι είναι οι Σταθερές;
Οι σταθερές είναι τιμές που δεν μπορούν να αλλάξουν κατά τη διάρκεια εκτέλεσης του προγράμματος.
🧩 Τι είναι σταθερές
Μια σταθερά (constant) είναι σαν μια μεταβλητή, αλλά η τιμή της δεν αλλάζει ποτέ όσο τρέχει το πρόγραμμα.
👉 Δηλαδή: τη δηλώνεις μία φορά, της δίνεις τιμή, και μετά δεν μπορείς να τη μεταβάλεις.
🔹 1. Δήλωση σταθερών με const
Η λέξη const σημαίνει "σταθερό". Δηλώνεις μια σταθερά όπως μια μεταβλητή, απλώς βάζεις μπροστά το const.
📘 Παράδειγμα 1 — ακέραια σταθερά
👉 Εμφανίζει:
📘 Παράδειγμα 2 — δεκαδική σταθερά
👉 Εμφανίζει:
📘 Παράδειγμα 3 — χαρακτήρας ή αλφαριθμητικό
👉 Εμφανίζει:
🔹 2. Δήλωση σταθερών με #define
Η οδηγία #define δηλώνει μια σταθερά πριν ξεκινήσει το πρόγραμμα (πριν τη main()).
Δεν χρησιμοποιεί ίσον = και δεν τελειώνει με ;.
📘 Παράδειγμα 1 — απλός αριθμός
👉 Εμφανίζει:
📘 Παράδειγμα 2 — δεκαδικός αριθμός
👉 Εμφανίζει:
📘 Παράδειγμα 3 — συμβολοσειρά (string)
👉 Εμφανίζει:
📘 Παράδειγμα 4 — χρήση και των δύο (const και #define)
👉 Εμφανίζει:
🧠 Διαφορές const και #define
| const | #define | |
|---|---|---|
| Είδος | μεταβλητή σταθερή | μακροεντολή (αντικατάσταση κειμένου) |
| Τύπος δεδομένων | έχει τύπο (π.χ. int, float) | δεν έχει τύπο |
| Έλεγχος από compiler | ναι | όχι (αντικαθίσταται πριν τη μεταγλώττιση) |
| Παράδειγμα | const int a = 5; | #define A 5 |
| Τελειώνει με ; | ✅ ναι | ❌ όχι |
🧩 1️⃣ Τι κάνει το #define
Η εντολή #define είναι εντολή του μεταγλωττιστή (compiler). Λέει στην C:
"Πριν ξεκινήσεις το πρόγραμμα, όπου βλέπεις αυτή τη λέξη, αντικατέστησέ την με αυτή την τιμή."
ΔΕΝ δημιουργεί πραγματική μεταβλητή, απλώς αντικαθιστά κείμενο.
📘 Παράδειγμα με #define
👉 Ο compiler δεν βλέπει "PI". Την αντικαθιστά και βλέπει:
🧩 2️⃣ Τι κάνει το const
Η λέξη const δημιουργεί πραγματική μεταβλητή στη μνήμη, απλώς δεν μπορείς να αλλάξεις την τιμή της.
📘 Παράδειγμα με const
👉 Εδώ η PI ζει στη μνήμη, αλλά είναι μόνιμη — δεν αλλάζει.
🔍 Η βασική διαφορά με απλά λόγια:
| #define | const | |
|---|---|---|
| Είναι | εντολή του μεταγλωττιστή (αντικατάσταση κειμένου) | κανονική μεταβλητή με σταθερή τιμή |
| Υπάρχει στη μνήμη; | ❌ Όχι | ✅ Ναι |
| Έχει τύπο (int, float...); | ❌ Όχι | ✅ Ναι |
| Ελέγχεται από τον compiler; | ❌ Όχι | ✅ Ναι |
| Μπορεί να αλλάξει τιμή; | ❌ Όχι (αλλά είναι απλό κείμενο) | ❌ Όχι (ο compiler το απαγορεύει) |
| Παράδειγμα | #define TAX 0.24 | const float TAX = 0.24; |
🎯 Παράδειγμα για να δεις τη διαφορά καθαρά:
👉 Και οι δύο τυπώνουν το ίδιο αποτέλεσμα:
Αλλά "εσωτερικά" διαφέρουν:
- Το #define TAX1 δεν υπάρχει στη μνήμη — απλώς αντικαθίσταται με "0.24".
- Το const TAX2 υπάρχει στη μνήμη σαν κανονική μεταβλητή, με τύπο float.
💡 Πότε χρησιμοποιώ ποιο;
| Θες να... | Χρησιμοποίησε |
|---|---|
| Ορίσεις κάτι γενικό, σταθερό για όλο το πρόγραμμα (π.χ. μέγιστη τιμή, σταθερό μαθηματικό) | #define |
| Έχεις σταθερά που σχετίζεται με τύπους δεδομένων (π.χ. float, int) ή χρειάζεται έλεγχο τύπου | const |
3.10 Καλές Πρακτικές
✨ Συμβουλές για Καλό Κώδικα
- Χρησιμοποιήστε περιγραφικά ονόματα: studentAge αντί για a
- Αρχικοποιήστε πάντα τις μεταβλητές: Αποφύγετε garbage values
- Χρησιμοποιήστε const για σταθερές: Καθιστά τον κώδικα πιο ασφαλή
- Επιλέξτε τον κατάλληλο τύπο: Μην χρησιμοποιείτε double αν φτάνει float
- Περιορίστε το scope: Δηλώστε μεταβλητές όσο πιο κοντά στη χρήση τους
Παράδειγμα Καλής Πρακτικής
📋 Σύνοψη Κεφαλαίου
Σε αυτό το κεφάλαιο μάθαμε τα θεμέλια των μεταβλητών και των τύπων δεδομένων στη C:
🎯 Κλειδί-Σημεία:
- Μεταβλητές είναι δεσμευμένοι χώροι μνήμης για αποθήκευση δεδομένων
- Βασικοί τύποι: int, float, double, char, bool
- Πάντα αρχικοποιείτε τις μεταβλητές σας
- Κανόνες ονομασίας καθορίζουν έγκυρα ονόματα μεταβλητών
- Type casting επιτρέπει μετατροπές μεταξύ τύπων
- Scope και lifetime καθορίζουν που και πότε υπάρχουν οι μεταβλητές
Στο επόμενο κεφάλαιο θα μάθουμε για τελεστές και εκφράσεις!
🔥 Ασκήσεις για Εξάσκηση
- Δηλώστε μεταβλητές για την αποθήκευση ονόματος, ηλικίας και βαθμού φοιτητή
- Γράψτε πρόγραμμα που υπολογίζει την περίμετρο ενός κύκλου
- Δημιουργήστε πρόγραμμα που μετατρέπει Celsius σε Fahrenheit
- Πειραματιστείτε με sizeof για διαφορετικούς τύπους δεδομένων
- Δοκιμάστε type casting μεταξύ int, float και char
- Δημιουργήστε παραδείγματα με global και local variables