MYY502 Προγραμματισμός Συστημάτων Β. Δημακόπουλος dimako@cse.uoi.gr http://www.cse.uoi.gr/~dimako
Ρρογραμματιςμόσ Συςτθμάτων - Αντικείμενο Αντικείμενο μακιματοσ: Εκμάκθςθ βαςικϊν εργαλείων, τεχνικϊν και μεκόδων για προχωρθμζνο προγραμματιςμό που ςτοχεφει περιςςότερο ςτο «ςφςτθμα» παρά ςτθν «εφαρμογι» Η γλϊςςα C είναι μονόδρομοσ ςτον προγραμματιςμό ςυςτθμάτων Με μεγάλθ προγραμματιςτικι βάςθ και ςτο χϊρο των εφαρμογϊν Ρρογραμματιςμόσ ςυςτιματοσ: «κάτω» από το επίπεδο εφαρμογϊν (υποςτθρίηει τισ εφαρμογζσ) Ανάμεςα ςτισ εφαρμογζσ και το hardware π.χ. μεταφραςτζσ, λειτουργικά ςυςτιματα, ςυςτιματα υποςτιριξθσ εκτζλεςθσ, ενςωματωμζνα ςυςτιματα κλπ. Το UNIX/POSIX και τα «POSIX-οειδι» περιβάλλοντα είναι θ ςθμαντικότερθ και πιο ολοκλθρωμζνθ πλατφόρμα για εργαςία ςε επίπεδο ςυςτιματοσ Βαςικζσ γνϊςεισ χριςιμεσ και ςε επόμενα μακιματα (π.χ. λειτουργικά ςυςτιματα, παράλλθλα ςυςτιματα, μεταφραςτζσ κλπ) 2
Ρρογραμματιςμόσ Συςτθμάτων - Φλθ Φλθ μακιματοσ (από τον οδθγό ςπουδϊν): Η γλϊςςα προγραμματιςμοφ C: ςτοιχειϊδθσ C (βαςικοί τφποι δεδομζνων, εκφράςεισ, τελεςτζσ, δομζσ ελζγχου ροισ, ςυναρτιςεισ), προχωρθμζνα ςτοιχεία (πίνακεσ, δείκτεσ, δομζσ), δυναμικι διαχείριςθ μνιμθσ, είςοδοσ/ζξοδοσ, προεπεξεργαςτισ. Βαςικζσ κλιςεισ UNIX (διεργαςίεσ, Ι/Ο, ςιματα). Διαδιεργαςιακι επικοινωνία (κοινόχρθςτθ μνιμθ, sockets). Ειςαγωγι ςτον παράλλθλο προγραμματιςμό (νιματα, mapreduce). Ρροχωρθμζνα κζματα (αςφάλεια, γλϊςςα μθχανισ, εργαλεία ανάπτυξθσ μεγάλων προγραμμάτων). 3
Ρρογραμματιςμόσ Συςτθμάτων Διάρκρωςθ κεμάτων Δφο μζρθ: Γλϊςςα προγραμματιςμοφ C Υποκζτει γνϊςθ προγραμματιςτικϊν τεχνικϊν Υποκζτει γνϊςθ γλωςςϊν προγραμματιςμοφ «ςυγγενϊν» με τθν C (π.χ. Java) Καλφπτονται από τισ «Τεχνικζσ Αντικειμενοςτραφοφσ Ρρογραμματιςμοφ» και «Ανάπτυξθ Λογιςμικοφ» Ρ1: Ρερίπου 50% τθσ φλθσ Ρρογραμματιςμόσ ςυςτθμάτων POSIX και προχωρθμζνα κζματα Εμβάκυνςθ ςε προχωρθμζνεσ δυνατότθτεσ τθσ C Γνωριμία με διαδικαςίεσ και εργαλεία ανάπτυξθσ εφαρμογϊν ςυςτιματοσ Βαςικζσ κλιςεισ POSIX (διεργαςίεσ, ςιματα, επικοινωνίεσ, νιματα κλπ) Άλλα προχωρθμζνα κζματα και τεχνικζσ Ρ2: Ρερίπου 50% τθσ φλθσ 4
Συγγράμματα Υπάρχουν πολλά βιβλία για C Και πάρα πολφ υλικό ςτο διαδίκτυο Για προγραμματιςμό ςυςτθμάτων (POSIX) όχι τόςα πολλά μεταφραςμζνα Συνικωσ κεωροφν δεδομζνθ τθ γνϊςθ τθσ C Ρολλά που είναι για χριςθ / διαχείριςθ του UNIX, όχι προγραμματιςμό Δεν μασ αφοροφν 5
Εφδοξοσ ΡΟΓΑΜΜΑΤΙΣΜΟΣ ΣΕ UNIX, M.J. Rochkind (2007) Εξαιρετικό βιβλίο για προγραμματιςμό ςυςτθμάτων UNIX Υποκζτει γνϊςθ τθσ C UNIX ΓΙΑ ΡΟΓΑΜΜΑΤΙΣΤΕΣ ΚΑΙ ΧΗΣΤΕΣ, G.Glass, K. Ables (2005) Χριςθ, διαχείριςθ, εςωτερικά του UNIX <=""> Δφο κεφάλαια αφιερϊνονται ςτα εργαλεία προγραμματιςμοφ και ςτισ κλιςεισ ςυςτιματοσ του UNIX και υποκζτει γνϊςθ τθσ C C ΑΡΟ ΤΗ ΘΕΩΙΑ ΣΤΗΝ ΡΑΞΗ, Γ. Τςελίκθσ, Ν. Τςελίκθσ (2016) Ράρα πολφ καλό βιβλίο C (ελλθνικό!) Η ΓΛΩΣΣΑ ΡΟΓΑΜΜΑΤΙΣΜΟΥ C, B.W. Kernighan, D.M. Ritchie (2008) «Ευαγγζλιο» τθσ C (C90) Κςωσ όχι το καλφτερο για εκμάκθςθ. 6
Ιςτοςελίδεσ Ρολλζσ ιςτοςελίδεσ για C Ρολλζσ ιςτοςελίδεσ για προγραμματιςμό ςε UNIX/Linux/POSIX κλπ. Ρολφ καλό βοικθμα ςτο διάβαςμά ςασ: Programming in C; Unix System Calls and Subroutines using C., A. D. Marshall http://www.cs.cf.ac.uk/dave/c/ce.html Καλφπτει και εκμάκθςθ τθσ C αλλά και αρκετό προγραμματιςμό ςυςτθμάτων POSIX 7
Ώρεσ μακιματοσ Διαλζξεισ: Δευτζρα: 12:00 14:00 Τετάρτθ: 12:00 14:00 (*) Αίκουςα: Ι5 Εργαςτιρια: Τρίτθ: 14:00 18:00 (20:00) ΡΕΡ Ι, ΡΕΡ ΙΙ, ΡΕΛΣ 08:00 09:00 10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 Δε Τρ Τε Πε Πα Γρ Δ Δ Εργ Εργ Ώρεσ γραφείου διδάςκοντα: Τρίτθ: 09:00 11:00 Β33 18:00 19:00 Εργ Ιςτοςελίδα μακιματοσ: http://www.cse.uoi.gr/~dimako/teaching/ 8
Εργαςτιρια (αν εγγράφεςτε ΡΩΤΗ ΦΟΑ ΣΤΟ ΜΑΘΗΜΑ) Σκοπόσ/λειτουργία εργαςτθρίων: «Φροντιςτηριακοφ» τφπου για ενίςχυςη διδαςκαλίασ Σχεδιαςμόσ προγράμματοσ και υλοποίθςθ «επί τόπου» (Ρολφ) ζμπειροι μεταπτυχιακοί και προςωπικό για να ςασ βοθκιςουν Οργανωτικά: Ξεκινοφν (λογικά) ςε 2 εβδομάδεσ θα ςασ ενημερώςω εγκαίρωσ Θα εργάηεςτε δφο ςε κάκε κζςθ (λόγω χϊρου) 14:00 18:00 (2 ςειρζσ των 2 ωρϊν) Σχεδόν κάκε εβδομάδα Ραρουςίεσ Βακμόσ εργαςτθρίου: Θα βγει από τθ ςυμμετοχι ςασ και από 2 προόδουσ 20% οι παρουςίεσ + 40% πρόοδοσ1 + 40% πρόοδοσ2 Κάκε απουςία ςασ αφαιρεί 10%. Από 2 και μετά δεν ζχει διαφορά Πςοι ΡΕΑΣΟΥΝ το εργαςτήριο, το κατοχυρώνουν για πάντα Και ζρχονται μόνο ςτισ τελικζσ εξετάςεισ. 9
Τι ςθμαίνει «ΡΕ ΝΑΩ» το εργαςτιριο Για να ΡΕ ΑΣΕΙ κάποιοσ το εργαςτιριο, κα πρζπει ο βακμόσ του (20% οι παρουςίεσ + 40% πρόοδοσ1 + 40% πρόοδοσ2) να είναι 4,5. Πποιοσ το περάςει, το κατοχυρϊνει για ΡΑΝΤΑ. FAQ Ε ΩΤΗΣΗ: Αν κάνω όλεσ τισ παρουςίεσ περνάω; ΑΡΑΝΤΗΣΗ: ΟΧΙ, πρζπει να περάςετε και τισ προόδουσ Ε ΩΤΗΣΗ: Αν ΔΕΝ περάςω για κάποιο λόγο, μπορώ να ξαναπαρακολουκιςω το εργαςτιριο του χρόνου; ΑΡΑΝΤΗΣΗ: ΟΧΙ, δείτε τθν επόμενθ διαφάνεια Ε ΩΤΗΣΗ: Δεν με βολεφει θ θμ/νια τθσ προόδου / ζχω κανονίςει να λείπω / ζχω πλθρώςει ειςιτιρια / κα είμαι άρρωςτοσ εκείνθ τθν θμζρα. Μπορώ να δώςω κάποια άλλθ μζρα; ΑΡΑΝΤΗΣΗ: ΟΧΙ 10
Εργαςτιρια (για όςουσ είχαν ΕΓΓΑΦΕΙ ΡΑΛΑΙΟΤΕΑ) Αφορά μόνο όςουσ: 1. Ζχουν ξαναεγγραφεί ςτο μάκθμα κατά το παρελκόν ΚΑΙ 2. Δεν ζχουν περάςει το εργαςτιριο ποτζ Εγγραφή ςτα εργαςτήρια: Υποχρεωτική, πλιρθσ (θλεκτρονικι) εγγραφι όπωσ όλοι Αλλιώσ ΔΕΝ ΘΑ ΜΡΟΕΣΟΥΝ ΝΑ ΕΞΕΤΑΣΤΟΥΝ λόγω χϊρου Εξζταςη και βαθμόσ εργαςτηρίων: Εξζταςθ ςτισ 2 προόδουσ του εργαςτθρίου, όπωσ όλοι. Απαραίτθτθ επικοινωνία με διδάςκοντα πριν από κάκε πρόοδο Ο βακμόσ κα βγει ωσ εξισ: 50% πρόοδοσ1 + 50% πρόοδοσ2 11
Εργαςτιρια (για όςουσ είχαν ΕΓΓ ΑΦΕΙ ΡΑΛΑΙΟΤΕ Α) Για να ΡΕ ΑΣΕΙ κάποιοσ παλιόσ το εργαςτιριο, κα πρζπει ο βακμόσ του (50% πρόοδοσ1 + 50% πρόοδοσ2) να είναι 4,5. FAQ Ε ΩΤΗΣΗ: Είχα κάνει παρουςίεσ παλιά. Μπορώ να πάρω το 20% από αυτζσ; ΑΡΑΝΤΗΣΗ: ΟΧΙ, οι παρουςίεσ μετροφν μόνο τθν 1θ φορά που εγγράφεςτε ςτο μάκθμα Ε ΩΤΗΣΗ: Μπορώ να ξαναπαρακολουκιςω το εργαςτιριο να πάρω το 20% από τισ παρουςίεσ; ΑΡΑΝΤΗΣΗ: ΟΧΙ Ε ΩΤΗΣΗ: Μπορώ να ξαναπαρακολουκιςω το εργαςτιριο ΧΩΡΙΣ να πάρω το 20% από τισ παρουςίεσ; ΑΡΑΝΤΗΣΗ: Ρολφ δφςκολο, και μόνο αν υπάρχουν ελεφκερεσ κζςεισ. Αν όμωσ κζλετε να αςχολθκείτε μόνοι ςασ κα υπάρχουν και οι αςκιςεισ και οι απαντιςεισ και οι βοθκοί. 12
Βακμολόγθςθ Επιτυχία ςτο μάκθμα προχποκζτει: 1. Επιτυχία ςτο εργαςτιριο (Βακμόσ εργαςτθρίων >= 4,5) Πςοι δεν επιτφχουν ςτο εργαςτιριο, δεν ζχουν δικαίωμα εξετάςεων 2. Τουλάχιςτον βακμό 4,5 ςτισ εξετάςεισ Πςοι ζχουν βακμό < 4 ςτισ εξετάςεισ, δεν περνοφν ακόμα και άριςτα να πιγαν ςτο εργαςτιριο. Τελικόσ βακμόσ (το πικανότερο): 40% εργαςτήριο + 60% τελικζσ εξετάςεισ 13
Το σημερινό μάθημα Ειςαγωγικά ςτοιχεία για τη C
Η γλϊςςα C D. Ritchie, Bell Labs, 1972 Με βάςθ προθγοφμενθ γλϊςςα (B) Χρθςιμοποιικθκε για τθν υλοποίθςθ του λειτουργικοφ ςυςτιματοσ UNIX Ευρεία διάδοςθ από τότε. Από αυτιν προζκυψαν / επθρεάςτθκαν οι περιςςότερεσ από τισ πιο δθμοφιλείσ γλϊςςεσ: Ρ.χ. C++, Java, PHP κλπ. Σε κάποιουσ τομείσ (π.χ. ενςωματωμζνα ςυςτιματα) θ C είναι ουςιαςτικά θ μοναδικι επιλογι Δυνατι, μικρι, εφκολα μεταφράςιμθ γλϊςςα 15
Δθμοτικότθτα τθσ C (ΤΙΟΒΕ index, 2019) Πλεσ οι κορυφαίεσ με βάςθ τθν C! 16
Κατάταξθ γλωςςϊν προγραμματιςμοφ (IEEE Spectrum) ΙΕΕΕ, Αυγ. 2016 http://spectrum.ieee.org/computing/software/the-2016-topprogramming-languages 17
Στα ενςωματωμζνα ςυςτιματα 18
Κι άλλα Το UNIX γράφτθκε ςε C Ο πυρινασ του Linux είναι γραμμζνοσ ςε C Σχεδόν όλεσ οι εφαρμογζσ ςυςτιματοσ είναι ςε C Η πλειονότθτα εφαρμογϊν ανοιχτοφ κϊδικα είναι ςε C Ρροςοχή: Η C ΔΕΝ είναι πανάκεια «Επικίνδυνθ» αν κάποιοσ δεν τθν ξζρει καλά «Χαμθλότερου» επιπζδου από άλλεσ γλϊςςεσ (π.χ. Java) Δεν βολεφει πάντα για εφαρμογζσ χριςτθ, ειδικά όταν υπάρχει γραφικι αλλθλεπίδραςθ 21
Εισαγωγή στη C C για προγραμματιςτέσ Java
Hello world public class hello { public static void main (String args []) { System.out.println ("Hello world"); #include <stdio.h> int main() { puts("hello world"); return 0; 23
Η C δεν ζχει Κλάςεισ Μόνο δεδομζνα (μεταβλθτζσ) και ςυναρτιςεισ Η ςυνάρτθςθ main() είναι αυτι που εκτελείται αρχικά Boolean Με ακεραίουσ «προςομοιϊνουμε» τα boolean To 0 κεωρείται FALSE Οτιδιποτε μθ-μθδενικό κεωρείται TRUE Strings (τουλάχιςτον όπωσ τα χειρίηεται θ Java) Χειριςμόσ μζςω πινάκων και δεικτϊν try catch μπλοκ (exceptions) Δεν υπάρχει ανάλογο, μόνο μζςω ςυναρτιςεων ςυςτιματοσ 24
Η C ζχει Pointers (δείκτεσ)! Πχι μόνο απλό πζραςμα με αναφορά «Ελευκερία» ςτουσ τφπουσ των δεδομζνων (π.χ. int/short/char είναι πάνω-κάτω ίδιοι) και δεν γίνεται πλιρθσ ζλεγχοσ κατά τθ χριςθ τουσ. «Ελευκερία» ςτθ διαχείριςθ τθσ μνιμθσ Επαφίεται πλιρωσ ςτον προγραμματιςτι Η java ζχει garbage collector που αυτόματα αποδεςμεφει άχρθςτθ μνιμθ 25
Java vs C Η Java είναι (βαςικά) ερμθνευόμενθ (interpreted) Συνικωσ μετατρζπεται (javac) ςε bytecode, ο οποίοσ ερμθνεφεται από μία εικονικι μθχανι (JVM), θ οποία εκτελείται (java) ςτθν πραγματικι μθχανι prog.java prog.class javac java Η C είναι (βαςικά) μεταφραηόμενθ (compiled) Μετατρζπεται απευκείασ ςε εντολζσ assembly τθσ πραγματικισ μθχανισ που κα εκτελζςει το πρόγραμμα Το πρόγραμμα εκτελείται αυτόνομα prog.c a.out gcc 26
Το πρϊτο πρόγραμμα ςε C (hello.c) #include <stdio.h> HEADER (αρχείο επικεφαλίδων) Θυμίηει το import τθσ java int main() Συνάρτθςθ εκκίνθςθσ { /* Just show a simple message */ printf("hello, World\n"); Σχόλιο Οκόνθ Τερματιςμόσ προγράμματοσ Αλλαγι γραμμισ 28
Μετάφραςθ του προγράμματοσ hello.c a.out gcc Στο τερματικό: % ls hello.c % gcc hello.c % ls a.out hello.c Ο μεταφραςτισ (gcc) ονομάηει το εκτελζςιμο a.out 29
Μετάφραςθ του προγράμματοσ με δικό μασ όνομα hello.c firstprog gcc Στο τερματικό: % ls hello.c % gcc o firstprog hello.c % ls firstprog hello.c Με το o ο μεταφραςτισ αντί για a.out ονομάηει το εκτελζςιμο με ότι όνομα μασ αρζςει. 30
Εκτζλεςθ του προγράμματοσ hello.c a.out gcc Στο τερματικό: % ls hello.c % gcc hello.c % ls a.out hello.c %./a.out Hello, World % To./ εννοεί το τρζχον directory ίςωσ και να μθν χρειάηεται. 31
Ειςαγωγικά Ρρόγραμμα = {δεδομζνα + {κϊδικασ (ςυναρτιςεισ) Συναρτιςεισ = {main, Δεδομζνα = {μεταβλθτζσ, ςτακερζσ Στακερζσ = ποςότθτεσ που δεν μεταβάλλονται κατά τθν εκτζλεςθ του προγράμματοσ Ρ.χ. Pi = 3.14 Μεταβλθτζσ = ποςότθτεσ που μεταβάλλονται Ι/Ο, υπολογιςμοί 32
Ειςαγωγικά Τα δεδομζνα αποκθκεφονται ςτθ μνιμθ του υπολογιςτι Δθλϊνοντασ μια μεταβλθτι δεςμεφω κζςεισ ςτθ μνιμθ και κακορίηω ζνα όνομα που χρθςιμοποιϊ για να αναφερκϊ ςε αυτι τθ κζςθ μνιμθσ π.χ. int const n = 10; int a; 33
Ειςαγωγικά Και οι εντολζσ αποκθκεφονται ςτθ μνιμθ του υπολογιςτι Ρ.χ. εντολι Ι1: πρόςκεςε τθν τιμι τθσ μεταβλθτισ a με αυτι τθσ b πρόςκεςε τα περιεχόμενα τθσ κζςθσ 100 ςτα περιεχόμενα τθσ κζςθσ 104 I1 I2 I3 Εντολές a b 100 104 Δεδομένα 34
Μεταβλθτζσ & τφποι δεδομζνων Κάκε μεταβλθτι, ςτακερά ζχει ζνα τφπο Ο τφποσ κακορίηει το μζγεκοσ του «κελιοφ» που κα δεςμευτεί ςτθ μνιμθ char: 1 byte int: 4 bytes (ςυνικωσ) float: 4 bytes double: 8 bytes Ρροςδιοριςτζσ short int: 2 bytes long int: 8 bytes long double:? bytes (>=10) 35
Μεταβλθτζσ & τφποι δεδομζνων Ρροςδιοριςτζσ: unsigned Χωρίσ πρόςθμο (μόνο κετικοί) όλα τα bits για τθν τιμι του αρικμοφ unsigned int, unsigned short int, unsigned char 32 bits, 16 bits, 8 bits 0, 1,, 4294967295 0, 1,, 65535 0, 1,, 255 int, short int, char 31 bits, 15bits, 7 bits (ςυν 1 για το πρόςθμο) -2147483648,, 2147483647-32768,, 32767-128,, 127 36
Εκτυπϊνοντασ τισ τιμζσ των μεταβλθτϊν Η βαςικότερθ και γενικότερθ ςυνάρτθςθ εκτφπωςθσ είναι θ printf. Αρχικά πρζπει να δϊςω ωσ πρϊτο όριςμα μια ςυμβολοςειρά με το ΤΙ ΤΥΡΟ κα εκτυπϊςει Στθ ςυνζχεια, τα επόμενα ορίςματα είναι οι αντίςτοιχεσ μεταβλθτζσ ι εκφράςεισ Ραράδειγμα: int main() { int x = 5; float y = 1.2; printf("%d", x); /* %d ή %i για ακεραίουσ */ printf("%f", y); /* %f για πραγματικούσ */ printf("x = %d and y = %f", x, y); return 0; 37
Κακολικζσ / τοπικζσ μεταβλθτζσ Πςεσ μεταβλθτζσ βρίςκονται εντόσ ενόσ μπλοκ εντολϊν (π.χ. μζςα ςε μία ςυνάρτθςθ) είναι τοπικζσ (local) και μποροφν να χρθςιμοποιθκοφν μόνο εντόσ του μπλοκ. Πςεσ είναι εκτόσ των ςυναρτιςεων είναι καθολικζσ (global) και μποροφν να χρθςιμοποιθκοφν παντοφ. Ρεριςςότερα αργότερα 38
Χαρακτιρεσ Πλα τα δεδομζνα ςε ζνα υπολογιςτι κωδικοποιοφνται ωσ ακολουκίεσ 0, 1 Ζνασ χαρακτιρασ κωδικοποιείται ωσ ακολουκία 0, 1 Άρα ςτθν ουςία ο υπολογιςτισ τον αντιλαμβάνεται ςαν ζνα αρικμό Ο χαρακτιρασ 0 αντιςτοιχεί ςτον αρικμό 48 char ch ='x'; Λζγοντασ ch = 'x' είναι ςαν να λζμε: βάλε ςτθ μεταβλθτι ch τθν τιμι (αρικμό) που αντιςτοιχεί ςτο χαρακτιρα x ch++; Αρικμθτικι τιμι = κωδικόσ ASCII 39
Ραράδειγμα με printf #include <stdio.h> int main() { char ch = 'x'; /* Τοπική μεταβλητή τύπου χαρακτήρα */ printf("ch = %d, ch = %c\n", ch, ch); return 0; 40
Ακζραιοι ςε διάφορεσ μορφζσ int main() { int x = 95; /* 000 0 0101 1111 */ printf("%d", x); /* 95 */ printf("%x", x); /* 5f */ printf("%o", x); /* 137 */ printf("%c", x); /* _ */ x = 95; /* Καταχωρώντασ τo 95 ςε διάφορεσ μορφέσ */ x = 0x5F; x = 0137; x = 'd'; /* Ποιοσ αριθμόσ είναι αυτόσ; */ printf("%d", x); /* 100 */ printf("%x", x); /* 64 */ printf("%o", x); /* 144 */ printf("%c", x); /* d */ return 0; 41
Τελεςτζσ Αρικμθτικοί τελεςτζσ +, -, *, /, % (το τελευταίο μόνο για ακεραίουσ) Συγκριτικοί τελεςτζσ >, <, <=, >=, ==,!= Λογικοί τελεςτζσ &&,,! Υπάρχουν και κάποιοι άλλοι τελεςτζσ που κα μασ απαςχολιςουν αργότερα Bitwise operators: ~, &,, ^, >>, << 42
Ρράξεισ και μετατροπζσ Αρικμθτικοί τελεςτζσ για δεδομζνα ίδιου τφπου κυρίωσ (π.χ. πρόςκεςθ δφο ακεραίων) Πμωσ, μποροφμε να κάνουμε και πράξεισ με μεταβλθτζσ διαφορετικοφ τφπου, π.χ. int x; float f; f = f+x; Γίνεται εςωτερικι μετατροπι των «κατϊτερων» τφπων ςε «ανϊτερουσ» Και το αποτζλεςμα ανϊτερου τφπου Τζτοιεσ μετατροπζσ γίνονται αυτόματα αλλά μποροφμε να τισ ηθτιςουμε και εμείσ ςε ζνα πρόγραμμα με το μθχανιςμό των type casts f + x f + ((float) x) (το x μετατρζπεται αυτόματα ςε float) (cast του προγραμματιςτι) 43
Τελεςτζσ Τελεςτζσ ςφντμθςθσ: ++, --, +=, -=, *=, /= Ραράδειγμα ++i και i++ (pre-increment, post-increment) i=i+1 και i+=1 Ραράδειγμα i = 3; x = ++i; /* πρώτα γίνεται η αύξηςη και μετά η αποτίμηςη τησ έκφραςησ */ x = i++; /* πρώτα γίνεται η αποτίμηςη τησ έκφραςησ και μετά η αύξηςη */ i = i++ + ++i; /* εδώ τι τιμή θα πάρει τελικά το i? */ 44
Ο «τριαδικόσ» τελεςτισ μεταβλητή = συνθήκη? τιμή1 : τιμή2; Η εκτζλεςθ ιςοδυναμεί με: if (ςυνθήκη) μεταβλητή = τιμή1; else μεταβλητή = τιμή2; Ραράδειγμα: x = (y > 0)? 1 : 0; 45
2 «ςτυλ» ςτακερϊν Στθ java το final μπορεί να χρθςιμοποιθκεί για να ορίςει «ςτακερζσ» Στθ C υπάρχουν 2 τρόποι να οριςτοφν ςτακερζσ: 1. Με προςκικθ του «const» ςτον τφπο τθσ διλωςθσ, π.χ. const int x = 5; /* Δεν μπορεί να αλλάξει τιμή */ 2. Με οριςμό ςτακεράσ προεπεξεργαςτι (#define) #define M 10 /* Το ςύνηθεσ */ #define PI 3.14 #define NEWLINE '\n' Διαφορά: Οι const καταλαμβάνουν μνιμθ για αποκικευςθ Οι #define ΑΝΤΙΚΑΘΙΣΤΑΝΤΑΙ ΡΙΝ ΓΙΝΕΙ Η ΜΕΤΑΦΑΣΗ του προγράμματοσ (και άρα δεν υπάρχουν ςτο εκτελζςιμο) 46
Διάβαςμα (scanf) / εκτφπωςθ (printf) #include <stdio.h> /* Απαραίτητο */ char c; /* Καθολική μεταβλητή */ int main() { /* Συνάρτηςη main */ int i; /* Τοπικέσ δηλώςεισ ΠΑΝΤΑ ςτην αρχή τησ ςυνάρτηςησ */ float f; printf("dwse 1 xaraktira, 1 akeraio kai enan pragmatiko\n"); scanf("%c", &c); scanf("%d%f", &i, &f); /* Η scanf ΘΕΛΕΙ & στις μεταβλητές */ printf("c = %c, i = %d, f = %f\n", c, i, f); return 0; 47
Εισαγωγή στη C Εντολέσ
Εντολζσ ελζγχου ροισ Ππωσ και ςτθν java: if if-else switch for while do-while break Επιπλζον: goto 49
if & if-else if (condition) { statements; if (condition) { statements; else { statements; Αν υπάρχει ΜΟΝΟ ΖΝΑ statement, όπωσ και ςτθν Java, δε χρειάηονται οι αγκφλεσ. Ρ.χ. ο παρακάτω κϊδικασ if (x == 3) x++; y++; z = x+y; είναι ιςοδφναμοσ με: if (x == 3) { x++; y++; z = x+y; 50
switch switch (variable) { case const1: statements; break; case const2: statements; break;... default: statements; break; 51
Εντολζσ ελζγχου switch switch (variable) { case const1: statements; break; case const2: statements; break;... default: statements; break; switch ( choice ) { case 'a': case 'A': do_thing_1(); break; Ρροςοχι: Αν δεν υπάρχει break, θ εκτζλεςθ ενόσ case ςυνεχίηεται με τον κϊδικα του επόμενου case case 'b': case 'B': do_thing_2(); break;... default: printf("wrong choice."); 52
while & do-while while (condition) { statements; x = 0; while (x < 10) x++; x = 0; while (x < 10); x++; do { statements; while (condition); Αν υπάρχει ΜΟΝΟ ΖΝΑ statement, όπωσ και ςτθ Java, δε χρειάηονται οι αγκφλεσ. 53
for (I) for (initialization; condition; iteration) { statements; /* Ιςοδύναμοσ κώδικασ: */ initialization; while (condition) { statements; iteration; Αν υπάρχει ΜΟΝΟ ΖΝΑ statement, όπωσ και ςτθν Java, δε χρειάηονται οι αγκφλεσ. Τα initialization / iteration μποροφν να περιζχουν πολλζσ εκφράςεισ, χωριςμζνεσ με κόμμα. 54
for (II) Τα initialization / iteration μποροφν να περιζχουν πολλζσ εκφράςεισ, χωριςμζνεσ με κόμμα. Ρ.χ. int i, sum; sum = 0; for (i = 1; i <= 10; i++) { sum += i; for (i = 1, sum = 0; i <= 10; sum += (i++)) ; 55
for (III) Δεν υπάρχει το for each for (δήλωςη : ςυλλογή) τθσ Java. 56
break Ζξοδοσ από switch ι από βρόχουσ for/while/do, π.χ. while (1) { if (w == 3) { break; /* Βγαίνει αμέςωσ μετά το while */... Δεν υπάρχει ονοματιςμζνο break (τφπου break <label>) 57
goto Η εκτζλεςθ μεταπθδά ςε ςυγκεκριμζνθ ετικζτα, π.χ. if (x == 1) { goto before; y = 2; goto after; before: y = 1; after:... Επικίνδυνθ / μθ-προβλζψιμθ εντολι, π.χ. while (1) { if (w == 3) { Strange: x=1;...... if (condition) goto Strange; «Ακατάλλθλθ» δια ανθλίκουσ. Κακι προγραμματιςτικι τεχνικι. Δεν πρζπει να χρθςιμοποιείται ςχεδόν ποτζ. 58
Αγκφλεσ και μπλοκ κϊδικα Γράψτε τον παρακάτω κϊδικα ΧΩΙΣ αγκφλεσ, όπου γίνεται: if (i >= 81) { x = 3; if (row >= 1 && col<= 9) { q = 5; y = x; else { for (S[row][col] = 1; S[row][col] <= 9; S[row][col]++) { if ( sudoku_solve(i) ) { return (1); 59
Αγκφλεσ και μπλοκ κϊδικα Ρρϊτθ προςπάκεια: if (i >= 81) { x = 3; if (row >= 1 && col<= 9) { q = 5; y = x; else { for (S[row][col] = 1; S[row][col] <= 9; S[row][col]++) { if ( sudoku_solve(i) ) { return (1); 60
Αγκφλεσ και μπλοκ κϊδικα Δεφτερθ προςπάκεια: if (i >= 81 x = 3; if (row >= 1 && col<= 9) { q = 5; y = x; else { for (S[row][col] = 1; S[row][col] <= 9; S[row][col]++) { if ( sudoku_solve(i) ) return (1); 61
Αγκφλεσ και μπλοκ κϊδικα Τρίτθ προςπάκεια: if (i >= 81 x = 3; if (row >= 1 && col<= 9) { q = 5; y = x; else { for (S[row][col] = 1; S[row][col] <= 9; S[row][col]++) if ( sudoku_solve(i) ) return (1); 62
Αγκφλεσ και μπλοκ κϊδικα Τελικόσ κϊδικασ: if (i >= 81 x = 3; if (row >= 1 && col<= 9) { q = 5; y = x; else for (S[row][col] = 1; S[row][col] <= 9; S[row][col]++) if ( sudoku_solve(i) ) return (1); ΡΑΝΤΑ ΝΑ ΒΑΖΕΤΕ ΑΓΚΥΛΕΣ, ΑΚΟΜΑ ΚΑΙ ΠΤΑΝ ΔΕΝ ΧΕΙΑΖΕΤΑΙ 63