C
Η C θεωρείται γενικά γλώσσα μέσου επιπέδου και αυτό γιατί συνδυάζει στοιχεία των γλωσσών υψηλού επιπέδου (high level languages) και η Pascal και στοιχεία των γλωσσών χαμηλού επιπέδου (low level languages), όπως είναι η Assembly.
Διαφορά μεταξύ C και C++
- C++ αναπτύχθηκε ως επέκταση του C, και οι δύο γλώσσες έχουν σχεδόν την ίδια σύνταξη
- Η κύρια διαφορά μεταξύ του, ότι το C++ υποστηρίζει class και αντικείμενα, ενώ το C δεν το κάνει
Γράψιμο Προγράμματος
#include <stdio.h>
int main() {
printf("GrCode Club!");
return 0;
}Η C επιβάλλει τον καταμερισμό του προγράμματος σε ενότητες, που ονομάζονται συναρτήσεις (functions). Εάν είναι απαραίτητο, οι συναρτήσεις μπορούν να χωριστούν και σε μικρότερες συναρτήσεις. Επίσης, στη C το κύριο πρόγραμμα είναι κι αυτό μια συνάρτηση, που ονομάζεται main().
Τύποι δεδομένων
| Τύπος δεδομένων | Size | Εύρος Τιμών | Περιγραφή |
|---|---|---|---|
| boolean | 8 bit | Αποθηκεύει αληθείς ή ψευδείς τιμές | |
| char | 8 bit | -128 έως 127 (ή 0 έως 255 για unsigned) | Αποθηκεύει έναν χαρακτήρα/γράμμα/αριθμό ή τιμές ASCII |
| short int | 16 bit | -32,768 έως 32,767 | Αποθηκεύει ακέραιους αριθμούς |
| unsigned short int | 16 bit | -32,768 έως 32,767 | Αποθηκεύει μη αρνητικούς ακέραιους αριθμούς |
| int | 32 bit | -2,147,483,648 έως 2,147,483,647 | Αποθηκεύει ακέραιους αριθμούς |
| unsigned int | 32 bit | 0 έως 4,294,967,295 | Αποθηκεύει μη αρνητικούς ακέραιους αριθμούς |
| long int | 32 bit | -2,147,483,648 έως 2,147,483,647 | Αποθηκεύει μεγάλους ακέραιους αριθμούς |
| unsigned long int | 32 bit | 0 έως 4,294,967,295 | Αποθηκεύει μη αρνητικούς μεγάλους ακέραιους αριθμούς |
| signed long int | 16 bit | -2,147,483,648 έως 2,147,483,647 | Αποθηκεύει μεγάλους ακέραιους αριθμούς |
| float | 32 bit | περίπου -3.4E38 έως 3.4E38 | Αποθηκεύει κλασματικούς αριθμούς με 6-7 δεκαδικά ψηφία |
| double | 64 bit | περίπου -1.7E308 έως 1.7E30 | Αποθηκεύει κλασματικούς αριθμούς με 15 δεκαδικά ψηφία |
| long double | 64 bit | περίπου -3.4E4932 έως 1.1E4932 | Αποθηκεύει κλασματικούς αριθμούς με πολύ μεγαλύτερη ακρίβεια |
Compiling
gcc main.cpp -o my_programBιβλιοθήκες
| Βιβλιοθήκη | Περιγραφή |
|---|---|
| stdio.h | Βιβλιοθήκη εισόδου/εξόδου που παρέχει συναρτήσεις όπως printf() και scanf(). |
| stdlib.h | Βιβλιοθήκη που παρέχει συναρτήσεις για τη διαχείριση μνήμης, δυναμική ανάθεση μνήμης και άλλες γενικές λειτουργίες. |
| math.h | Βιβλιοθήκη μαθηματικών που παρέχει συναρτήσεις όπως το τετραγωνικό ρίζωμα, η εκθετική συνάρτηση, οι τριγωνομετρικές συναρτήσεις και άλλες. |
| string.h | Βιβλιοθήκη για λειτουργίες σχετικές με τις συμβολοσειρές, όπως αντιγραφή, συγκατάθεση, σύγκριση και άλλες. |
| ctype.h | Βιβλιοθήκη για τον έλεγχο και τη μετατροπή χαρακτήρων, όπως οι συναρτήσεις isalpha(), isdigit() και toupper(). |
| time. | Βιβλιοθήκη που παρέχει συναρτήσεις για την εργασία με την χρονολογία και την ώρα, όπως η time() και η strftime(). |
| stdbool. | Βιβλιοθήκη που παρέχει τον τύπο δεδομένων bool και τις τιμές true και false για λογικές εκφράσεις. |
| limits.h | Περιέχει σταθερές που παρέχουν πληροφορίες για τα όρια των διάφορων τύπων δεδομένων, όπως το μέγιστο και ελάχιστο τιμή. |
| assert.h | Χρησιμοποιείται για την υλοποίηση ελέγχων της προϋπόθεσης και της ασφάλειας του προγράμματος. |
| stdarg.h | Χρησιμοποιείται για τη δημιουργία συναρτήσεων που δέχονται μεταβλητό αριθμό ορισμάτων. |
| signal.h | Παρέχει τις δυνατότητες επικοινωνίας με το λειτουργικό σύστημα μέσω σημάτων. |
| errno.h | Χρησιμοποιείται για τη διαχείριση σφαλμάτων που σχετίζονται με λειτουργίες συστήματος. |
| pthread.h | Χρησιμοποιείται για τα threads. |
| unistd.h | Χρησιμοποιείται για διάφορες λειτουργίες συστήματος, όπως sleep. |
| curl/curl.h | |
| winsock2.h | Επιτρέπει τη δημιουργία και διαχείριση δικτυακών συνδέσεων (Windows Sockets). |
| arpa/inet.h | Περιέχει δηλώσεις για συναρτήσεις που χρησιμοποιούνται για τη μετατροπή διευθύνσεων δικτύου και port από την αναπαράσταση δικτύου στην αναπαράσταση μηχανής και αντίστροφα. |
| arpa/tftp.h | Αυτή η επικεφαλίδα περιλαμβάνει δηλώσεις που αφορούν το TFTP (Trivial File Transfer Protocol), που χρησιμοποιείται για τη μεταφορά αρχείων μέσω δικτύου. |
| arpa/nameser.h | Αυτές οι επικεφαλίδες περιλαμβάνουν δηλώσεις που αφορούν το πρωτόκολλο DNS (Domain Name System), που χρησιμοποιείται για τη μετάφραση ονομάτων κειμένου σε διευθύνσεις IP και αντίστροφα. |
| arpa/nameser_compat.h | Αυτές οι επικεφαλίδες περιλαμβάνουν δηλώσεις που αφορούν το πρωτόκολλο DNS (Domain Name System), που χρησιμοποιείται για τη μετάφραση ονομάτων κειμένου σε διευθύνσεις IP και αντίστροφα. |
| arpa/inetd.h | Αυτή η επικεφαλίδα περιέχει δηλώσεις και συναρτήσεις που σχετίζονται με τον διαχειριστή υπηρεσιών (inetd), που είναι υπεύθυνος για την εκκίνηση δικτυακών υπηρεσιών όταν αυτές ζητούνται από το δίκτυο. |
| arpa/ftp.h | Αυτή η επικεφαλίδα περιλαμβάνει δηλώσεις που αφορούν το FTP (File Transfer Protocol), ένα πρωτόκολλο που χρησιμοποιείται για τη μεταφορά αρχείων μεταξύ δικτυακών συστημάτων. |
| windows.h | |
| sys/sysinfo.h | |
| sys/types.h | |
| fenv.h | Χειρισμός του περιβάλλοντος αριθμητικών πράξεων κινητής υποδιαστολής (floating-point environment). |
| locale.h | Διαχείριση χειρίζεται τις τοπικότητες (locales), δηλαδή κανόνες που εξαρτώνται από τη γλώσσα/χώρα: |
| setjmp.h | Υλοποιεί μη τοπικά jumps (χρήσιμο για error handling). |
| stddef.h | Ορισμοί τύπων και μακροεντολών όπως size_t, NULL, offsetof. |
| stdint.h | Σταθερού μεγέθους ακέραιοι τύποι (int8_t, uint64_t κ.λπ.). |
| complex.h | Υποστήριξη για μιγαδικούς αριθμούς. |
| sys/stat.h | Πληροφορίες για αρχεία (permissions, τύπος αρχείου). |
| sys/socket.h | Δημιουργία sockets για επικοινωνία μέσω δικτύου. |
| netinet/in.h | Δομές και συναρτήσεις για IPv4/IPv6 sockets. |
| netdb.h | Συναρτήσεις για DNS lookups (π.χ. gethostbyname). |
| pwd.h | Πληροφορίες για χρήστες στο UNIX σύστημα (user accounts). |
| grp.h | Πληροφορίες για ομάδες χρηστών. (POSIX / UNIX) |
| dirent.h | Διαχείριση και ανάγνωση φακέλων (directories). (POSIX / UNIX) |
| sys/wait.h | Χειρισμός διεργασιών (processes). (POSIX / UNIX) |
| sys/resource.h | Χρήση και όρια πόρων διεργασιών. |
| mqueue.h | POSIX message queues. |
| sys/mman.h | Διαχείριση μνήμης (memory mapping). |
| netinet/in.h | Δομές και συναρτήσεις για IPv4/IPv6 (π.χ. sockaddr_in). |
| netinet/ip.h | Δομές για πακέτα IP. |
Μεταβλητές
Στην C, οι μεταβλητές είναι βασικά στοιχεία προγραμματισμού που χρησιμοποιούνται για να αποθηκεύουν δεδομένα σε μια συγκεκριμένη θέση μνήμης του υπολογιστή, τα οποία μπορούν να μεταβληθούν κατά τη διάρκεια της εκτέλεσης του προγράμματος. Κάθε μεταβλητή έχει ένα όνομα, έναν τύπο δεδομένων και μία τιμή.
Βασικές Δηλώσεις
int age = 25;
float price = 12.99;
double pi = 3.14159;
char initial = 'A';
char name[] = "John";Είσοδος (Input) & Έξοδος (Output)
Με την printf() μπορούμε να εκτυπώσουμε ένα μήνυμα ή την τιμή μιας μεταβλητής στην οθόνη του user.
#include
int main() {
printf("GrCode Club!");
return 0;
}Με την εντολή scanf() μπορούμε να διαβάσουμε από το πληκτρολόγιο, δεδομενα που έδωσε ο user.
#include
int main() {
int x;
printf("Πληκτρολογήστε έναν αριθμό και πατήστε enter: \n");
scanf("%d", &x);
printf("Ο αριθμός είναι: %d", x);
return 0;
}Δομές ελέγχου
Η εντολή if στην C (και σε πολλές άλλες γλώσσες προγραμματισμού) είναι μια δομή ελέγχου που επιτρέπει στο πρόγραμμα να εκτελέσει ένα συγκεκριμένο μπλοκ κώδικα μόνο εάν μια συνθήκη είναι αληθής (true).
- Λιγότερο από: a < b Λιγότερο ή ίσο με: a <= b Μεγαλύτερο από: a > b
- Μεγαλύτερη ή ίση με: a >= b
- Ίση με a == a
- Όχι ίση με: a!= b
Μπορείτε να χρησιμοποιήσετε αυτές τις συνθήκες για να εκτελέσετε διαφορετικές ενέργειες για διαφορετικές αποφάσεις.
Χρήση if για να καθορίσετε ένα μπλοκ κώδικα που πρόκειται να εκτελεστεί, εάν η συνθήκη είναι true
int number = 10;
if (number > 5) {
printf("Ο αριθμός είναι μεγαλύτερος από 5.\n");
}Χρήση else if για να καθορίσετε ένα μπλοκ κώδικα που θα εκτελεστεί, εάν η συνθήκη της if είναι false.
int number = 10;
if (number == 5) {
printf("Ο αριθμός είναι 5.\n");
}
else if (number == 10) {
printf("Ο αριθμός είναι 10.\n");
}Χρήση else για να καθορίσετε ένα μπλοκ κώδικα που θα εκτελεστεί, εάν η συνθήκη της if ή και της else if είναι false
int number = 10;
if (number == 5) {
printf("Ο αριθμός είναι 5.\n");
}
else if (number == 10) {
printf("Ο αριθμός είναι 10.\n");
}
else{
printf("Ο αριθμός δεν είναι ουτε 5 ουτε 10.");
}Η εντολή switch στην C είναι μια δομή ελέγχου που χρησιμοποιείται για να διαχειρίζεται πολλαπλές συνθήκες με έναν οργανωμένο και εύχρηστο τρόπο. Είναι ιδιαίτερα χρήσιμη όταν χρειάζεται να ελεγχθεί η τιμή μιας μεταβλητής και να εκτελεστούν διαφορετικές ενέργειες ανάλογα με αυτήν την τιμή.
int day = 2;
switch (day) {
case 1:
printf("Δευτέρα");
break;
case 2:
printf("Τρίτη");
break;
case 3:
printf("Τετάρτη");
break;
case 4:
printf("Πέμπτη");
break;
case 5:
printf("Παρασκευή");
break;
case 6:
printf("Σάββατο");
break;
case 7:
printf("Κυριακή");
break;
}Επανάληψη
Η δομή επανάληψης (ή βρόχος, loop στα Αγγλικά) είναι ένας τρόπος να εκτελούνται οι ίδιες εντολές πολλές φορές μέχρι να ικανοποιηθεί μια συγκεκριμένη συνθήκη. Αυτές οι δομές χρησιμοποιούνται για να επαναλάβουν ένα σύνολο εντολών χωρίς να χρειάζεται να τις γράφουμε πολλές φορές.Οι πιο κοινές δομές επανάληψης είναι:
Η εντολή while στην C είναι μια δομή επανάληψης που εκτελεί ένα μπλοκ κώδικα επανειλημμένα όσο μια συνθήκη είναι αληθής. Χρησιμοποιείται όταν θέλουμε να επαναλάβουμε μια ενέργεια πολλές φορές, αλλά δεν γνωρίζουμε εκ των προτέρων τον αριθμό των επαναλήψεων.
int i = 1;
while (i <= 5) {
printf("%d\n", i);
i++;
}Η εντολή for στην C είναι μια άλλη δομή επανάληψης, όπως η while, αλλά χρησιμοποιείται όταν γνωρίζουμε εκ των προτέρων τον αριθμό των επαναλήψεων που θέλουμε να εκτελέσει το πρόγραμμα. Η εντολή for είναι ιδιαίτερα χρήσιμη για βρόχους που αφορούν μετρημένες επαναλήψεις και προσφέρει μια πιο συμπυκνωμένη σύνταξη.
for (int j = 0; j < 3; j++) {
printf("Επανάληψη %d\n", j);
}do/while:Αυτός ο βρόχος θα εκτελεί πρώτα τον κωδικά και μετά θα ελέγχει αν η συνθήκη είναι αληθής. Την πρώτη φορά θα εκτελεστεί ο βρόχος ακόμα και αν η συνθήκη είναι ψευδής.
int i = 0;
do {
printf("%d\n", i);
i++;
}
while (i < 5);Συναρτήσεις
Στη γλώσσα προγραμματισμού C, τα functions είναι τμήματα κώδικα που εκτελούν μια συγκεκριμένη εργασία. Επιτρέπουν την οργάνωση του κώδικα σε μικρότερα, διαχειρίσιμα κομμάτια, προάγοντας την επαναχρησιμοποίηση του κώδικα και την ευκολία συντήρησης.
int add(int a, int b) {
return a + b;
}Δείκτες (Pointers)
Διεύθυνση Μνήμης
- Όταν μια μεταβλητή δημιουργείται στη C, μια διεύθυνση μνήμης εκχωρείται στη μεταβλητή.
- Η διεύθυνση μνήμης είναι η θέση στην μνήμη του υπολογιστή, όπου αποθηκεύεται η μεταβλητή.
- Όταν ορίζουμε μια τιμή στην μεταβλητή , στην πραγματικότητα η τιμή αποθηκεύετε στην συγκεκριμένη διεύθυνση μνήμης.
- Όταν χρησιμοποιούμαι το & μπροστά από μια μεταβλητή, στην πραγματικότητα μιλάμε για την διεύθυνση μνήμης που δείχνει η συγκεκριμένη μεταβλητή.
int x = 43;
printf("%p", &x);Σημείωση: Η διεύθυνση μνήμης είναι σε δεκαεξαδική μορφή (0x.).
Οι pointers στην C είναι μια από τις πιο ισχυρές και χαρακτηριστικές έννοιες της γλώσσας. Ένας δείκτης είναι μια μεταβλητή που αποθηκεύει τη διεύθυνση μνήμης μιας άλλης μεταβλητής. Με τους δείκτες μπορούμε να έχουμε άμεση πρόσβαση στη μνήμη και να διαχειριζόμαστε δεδομένα με πολύ ευέλικτο και αποτελεσματικό τρόπο.
int number = 42;
int *ptr = &number;
//Εκτύπωση της τιμής που δείχνει ο δείκτης
printf("Value: %d\n", *ptr); const
Εάν δεν θέλετε να αλλάξει η τιμή μια μεταβλητής κατά την διάρκεια που εκτελείτε το πρόγραμμα, μπορείτε να χρησιμοποιήσετε το const λέξη-κλειδί.
Θα δηλώσει τη μεταβλητή ως “σταθερή”, που σημαίνει αμετάβλητη και μόνο για ανάγνωση
const int x = 1;
x = 5; // error: assignment of read-only variable 'x'Αρχεία
Άνοιγμα και Κλείσιμο αρχείου
| Συνάρτηση | Λειτουργία |
|---|---|
| fopen() | Ανοιγεί ένα αρχείο |
| fclose() | Κλείνει ένα αρχείο |
| feof() | Επιστρέφει true(1) όταν έχουμε ξεπεράσει το τέλος ενός αρχείου |
| ferror() | Επιστρέφει true(1) αν προκύψει κάποιο σφάλμα |
| clearerr() | Καθαρίζει τη κατάσταση σφάλματος για ένα συγκεκριμένο αρχείο. |
| fflush() | Αδειάζει την περιοχή προσωρινής αποθήκευσης εισόδου/εξόδου ενός αρχείου. |
| fflushall() | Αδειάζει την περιοχή προσωρινής αποθήκευσης εισόδου/εξόδου όλων των αρχείων. |
Δομές (Specific Structures)
Η δομή (structure) στην C επιτρέπει τη δημιουργία σύνθετων τύπων δεδομένων που μπορούν να περιέχουν πολλές μεταβλητές διαφορετικών τύπων, π.χ., ακέραιους, πραγματικούς αριθμούς, χαρακτήρες κ.λπ. Αυτό είναι χρήσιμο για την αναπαράσταση πραγματικών οντοτήτων, όπως αντικείμενα, άτομα ή αρχεία.
Stuct tm: Χρησιμοποιείται για την αναπαράσταση ημερομηνιών και ωρών.Η δομή struct tm ορίζεται στο αρχείο κεφαλίδας και έχει την εξής μορφή
struct tm {
int tm_sec; // Αναπαριστά τα δευτερόλεπτα (0-59)
int tm_min; // Αναπαριστά τα λεπτά (0-59)
int tm_hour; // Αναπαριστά τις ώρες (0-23)
int tm_mday; // Αναπαριστά την ημέρα του μήνα (1-31)
int tm_mon; // Αναπαριστά τον μήνα (0-11, 0 = Ιανουάριος)
int tm_year; // Αναπαριστά το έτος (έτος - 1900)
int tm_wday; // Αναπαριστά την ημέρα της εβδομάδας(0-6, 0 = Κυριακή)
int tm_yday; // Αναπαριστά την ημέρα του έτους (0-365)
int tm_isdst; // Aναπαριστά την ένδειξη θερινής ώρας
// (1 = θερινή ώρα, 0 = μη θερινή ώρα, -1 = άγνωστο)
}; Struct timeval: Χρησιμοποιείται για την αναπαράσταση χρονικών διαστημάτων με ακρίβεια μέχρι τα μικροδευτερόλεπτα. Η δομή struct timeval ορίζεται στο αρχείο κεφαλίδας και έχει την εξής μορφή
struct timeval {
time_t tv_sec; // Αναπαριστά τον αριθμό των δευτερολέπτων
long tv_usec; // Αναπαριστά τον αριθμό των μικροδευτερολέπτων
};