Παραδείγματα Κώδικα

Στον παρακάρω πίνακα παρατίθενται προγράμματα που περιέχουν τον κώδικα που έχει γραφτεί στις διαλέξεις.

Ημερομηνία Αρχείο Περιγραφή
15 Φεβ 2012 empty-for.c Ένα πολύ απλό πρόγραμμα στο οποίο φαίνεται ένα for-loop που δεν περιέχει εντολές. Το πρόγραμμα αυτό δεν σταματά ποτέ.
for-loop1.c
for-loop2.c
Αυτά τα δύο προγράμματα έχουν ως σκοπό να δείξουν την επίδραση που μπορεί να έχει ο προθεματικός και επιθεματικός τελεστής ++. Στην περίπτωσή μας χρησιμοποιούνται οι δύο αυτοί τελεστές στο κομμάτι ελέγχου ενός for-loop με αποτέλεσμα ο αριθμός των επαναλήψεων του for-loop να είναι διαφορετικός στα δύο προγράμματα.
for-dowhile.c Το πρόγραμμα αυτό έχει σκοπό να «δείξει» την ισοδυναμία ανάμεσα στο for-loop και το do-while-loop. Κάθε κομμάτι του κώδικα αντιστοιχεί σε ένα γράμμα, και δείχνουμε πώς μπορούμε να υλοποιήσουμε ένα for-loop μέσω ενός do-while-loop (και το ανάποδο) ώστε τα προγράμματα να έχουν την ίδια συμπεριφορά, δηλαδή να εκτελούνται τα ίδια κομμάτια κώδικα (που αντιπροσωπεύουν τα γράμματα) με την ίδια σειρά.
for-while.c Όπως και το παραπάνω αλλά για for-loop και while-loop.
while-dowhile.c Όπως και το παραπάνω αλλά για while-loop και do-while-loop.
switch-example1.c
switch-example2.c
switch-example3.c
switch-example4.c
Διάφορα παραδείγματα χρήσης της εντολής switch. Τρέξτε τα για να δείτε τό γίνεται κάθε φορά. Κοιταξτε τον κώδικα και προσπαθήστε να εξηγήσετε το αποτέλεσμα κάθε προγράμματος.
16 Φεβ 2012 seq-recursive.c
seq-for_loop.c
Προγράμματα που υπολογίζουν τους πρώτους 15 όρους της ακολουθίας:
an=2 an-1+5 an-2
όπου a0=0 και a1=1. Το πρόγραμμα seq-recursive.c υπολογίζει τους όρους αναδρομικά, ενώ το seq-for_loop.c υπολογίζει τους σειριακά (με ένα for-loop).
20 Φεβ 2012 twomins.c Το πρόγραμμα περιέχει συνάερτηση που υπολογίζει το μικρότερο και το δεύτερο μικρότερο στοιχείο ενός πίνακα ακεραίων a με n στοιχεία. Στην main θα δείτε πώς χρησιμοποιούμε την συνάρτηση αυτή.
22 Φεβ 2012 arrays_and_pointers.c Στο πρόγραμμα αυτό δείχνουμε πώς (μέσω συναρτήσεων) μπορούμε να αρχικοποιήσουμε στοιχεία ενός πίνακα, αλλά και πώς να αντιγράψουμε στοιχεία ενός πίνακα σε έναν άλλο.
func_with_pointers.c Στο πρόγραμμα αυτό δείχνουμε την επίδραση που έχει η χρήση δεικτών όταν τους δίνουμε ως ορίσματα σε συναρτήσεις. Οι τιμές των *x, y και *z εκτυπώνονται πριν και μετά την κλήση της συνάρτησης f. Για να καταλάβετε τί γίνεται θυμηθείτε ότι όταν καλούμε μία συνάρτηση, τα ορίσματα πάντα αντιγράφονται.
29 Φεβ 2012 symmetric_toeplitz.c Στο πρόγραμμα αυτό κατασκευάζουμε (με δυναμική διαχείρηση μνήμης) έναν συμμετρικό πίνακα Toeplitz από ένα διάνυσμα από doubles. Επίσης παρουσιάζονται συναρτήσεις για την αποδέσμευση της μνήμης του πίνακα Toeplitz αλλά και για την όμορφη εμφάνισή του στην οθόνη.
1 Μαρ 2012 extremal_element.c Στο πρόγραμμα αυτό φαίνεται η χρησιμότητα των δεικτών σε συναρτήσεις. Η συνάρτηση extremal_element βρίσκει τη θέση του «ακραίου» (ελάχιστου) στοιχείου του πίνακα a αν ταξινομήσουμε τα στοιχεία του βάσει της συνάρτησης σύγκρισης *cmp. Στο πρόγραμμα αυτό ο δείκτης συνάρτησης cmp παίρνει διαδοχικά τις διευθύνσεις των συναρτήσεων cmp_min και cmp_max (οι οποίες αντιστοιχούν σε ταξινόμιση σε αύξουσα και φθίνουσα σειρά), με αποτέλεσμα την εύρεση του ελαχίστου και του μεγίστου του πίνακα a μέσω της συνάρτηση extremal_element.
pascal_triangle.c Το πρόγραμμα αυτό περιέχει συνάρτηση που κατασκευάζει (με δυναμική διαχείρηση μνήμης) το n x n τρίγωνο του Pascal. Στην main υπολογίζονται και εκτυπώνονται τα τρίγωνα του Pascal για n από 1 έως 35. Παρατηρήστε ότι σε κάθε επανάληψη του for-loop στη main, ο χώρος μνήμης που δεσμεύεται για το τρίγωνο Pascal, αποδεσμεύεται αμέσως μετά την εκτύπωσή του.
pt-memory_leak.c
pt-no_memory_leak.c
Στα δύο αυτά προγράμματα υπολογίζουμε 2 εκατομμύρια φορές το 40 x 40 τρίγωνο του Pascal. Η διαφορά ανάμεσα στα δύο προγράμματα είναι ότι στο πρώτο δεν απελευθερώνεται η μνήμη που δεσμεύεται για κάθε τρίγωνο, ενώ στο δεύτερο απελευθερώνεται (στο πρώτο η σχετική γραμμή είναι σε σχόλια). Αν τα τρέξετε θα δείτε ότι το δεύτερο εκτελείται κανονικά (παίρνει μερικά δευτερόλεπτα), ενώ στο πρώτο έχουμε πρόβλημα μνήμης (στον υπολογιστή μου ενεργοποιείται η μνήμη swap, με αποτέλεσματα να επιβραδύνεται η όλη απόδοση του συστήματος). Τα δύο προγράμματα αυτά δείχνουν πόσο σημαντικό είναι να γίνεται σωστά η δυναμική διαχείρηση μνήμης και να μην ξεχνάμε να αποδεσμεύουμε μνήμη που έχουμε δεσμεύσει δυναμικά.
5 Μαρ 2012 select.c Στο παράδειγμα αυτό φαίνεται για μία ακόμη φορά η σημαντική χρησιμότητα της χρήσης δεικτών σε συναρτήσεις. Η συνάρτηση select δέχεται ως δεδομένα ένα πίνακα ακεραίων και μία συνάρτηση επιλογής, και επιστρέφει (με δυναμική δέσμευση μνήμης) το υποσύνολο των στοιχείων του πίνακα που πληρούν το κριτήριο της συνάρτησης επιλογής. Στο πρόγραμμα αυτό έχουν υλοποιηθεί οκτώ διαφορετικές συναρτήσεις επιλογής (είναι οι συναρτήσεις is_*). Στην main, οι διευθύνσεις στις συναρτήσεις αυτές χρησιμοποιούνται για την αρχικοποίηση πίνακα του οποίου τα στοιχεία είναι δείκτες σε συναρτήσεις, και στη συνέχεια με ένα for-loop κάνουμε την επιλογή των στοιχείων του πίνακα των ακεραίων βάσεις της κάθε συνάρτησης επιλογής.
7 Μαρ 2012 complex.c Στο πρόγραμμα αυτό δείχνουμε πώς μπορούμε να ορίσουμε έναν δικό μας τύπο/δομή (struct) για μιγαδικούς αριθμούς, και πώς μπορούμε να υλοποιήσουμε το άθροισμα, γινόμενο και διαίρεση δύο μιγαδικών αριθμών, αλλά και τον υπολογισμό του συζυγή, του αντίστροφου, και του τετραγώνου του μέτρου ενός μιγαδικού αριθμού. Στην main φαίνεται πώς μπορούν να χρησιμοποιηθούν οι συναρτήσεις που υλοποιήθηκαν.
points.c Άλλο ένα πρόγραμμα για τη χρήση δομών. Εδώ έχουμε πολυδιάστατα σημεία, και συναρτήσεις που μας επιτρέπουν να βρούμε την Ευκλείδεια νόρμα τους και να τα προσθέσουμε. Στη main δείχνουμε πώς μπορούμε να αρχικοποιήσουμε τα σημεία και να χρησιμοποιήσουμε της συναρτήσεις αθροίσματος και νόρμας.
8 Μαρ 2012 list.c Στο πρόγραμμα αυτό υλοποιούμε μία αυτοαναφερόμενη δομή. Πρόκειται για μία διπλά συνδεδεμένη λίστα. Στην main δείχνουμε πώς να κατασκευάσουμε μία λίστα, να προσθέσουμε στοιχεία σε αυτήν και να αφαιρέσουμε στοιχεία από αυτήν.
12 Μαρ 2012 list2.c Στο πρόγραμμα αυτό έχει προστεθεί μία ακόμη συνάρτηση διαχείρησης της διπλής λίστας: η συνάρτηση remove, με την οποία μπορούμε να διαγράφουμε οποιονδήποτε κόμβο της λίστας και όχι μόνο τον πρώτο ή τον τελευταίο όπως στο πρόγραμμα list.c. Επίσης στο πρόγραμμα αυτό δείχνουμε πώς να βρούμε τη θέση του ελάχιστου στοιχείου στη διπλή λίστα, όπου θεωρούμε ότι τα στοιχεία της λίστας περιέχουν, ως δεδομένα, δείκτες σε ακεραίους αριθμούς.
void1.c
casting1.c
casting2.c
Τα τρία αυτά προγράμματα δείχνουν πώς μπορούμε να χρησιμοποιήσουμε δείκτες τύπου void*, αλλά και πώς μπορούμε να αναθέσουμε την τιμή ενός δείκτη κάποιου τύπου με την τιμή ενός δείκτη κάποιου άλλου τύπου. Ειδικότερα, στο πρόγραμμα casting1.c δείχνουμε πώς μπορούμε να αναθέσουμε δείκτη τύπου unsigned long* (τη διεύθυνση του l) σε unsigned int* (τον i1), με αποτέλεσμα ο δείκτης i1 να «βλέπει» τα πρώτα 4 από τα 8 bytes του l, ενώ ο δείκτης i2 τα δεύτερα 4 bytes από τα 8 bytes του l. Ομοίως στο πρόγραμμα casting2.c δείχνουμε πώς μπορούμε να αναθέσουμε δείκτη τύπου unsigned short* (τη διεύθυνση του s) σε unsigned char* (τον c1), με αποτέλεσμα ο δείκτης c1 να «βλέπει» το πρώτο από τα 2 bytes του s, ενώ ο δείκτης c2 το δεύτερο από τα 2 bytes του s. Δείτε και τις σχετικές καταχωρήσεις στο Wikipedia για: