Τεχνολογία και Προγραμματισμός Υπολογιστών Η γλώσσα προγραμματισμού C
Σειρά Μαθημάτων 1. Βαςικζσ Ζννοιεσ 2. Σφποι δεδομζνων, Σελεςτζσ, και Παραςτάςεισ 3. Ροι Ελζγχου και Εντολζσ Επανάλθψθσ 4. υναρτιςεισ και Δομι του Προγράμματοσ (κατθγορίεσ μεταβλθτϊν) 5. Δείκτεσ και Πίνακεσ 6. Δομζσ και ενϊςεισ 7. Αρχεία 8. Προχωρθμζνα Θζματα ςτθ C 2
Βασικές Έννοιες
Ιστορία της C 1969-1973: AT&T Bell Labs από τον Dennis Ritchie ωσ ςυνζχεια των BCPL, B (ανάπτυξθ νζασ ζκδοςθσ UNIX). 1978: The C Programming Language K&R: Kernighan & Ritchie. 1983: φςταςθ ANSI Standardization Commitee X3J11. 1989-1990: Aποδοχι ΑNSI/ISO Standard (ANSI C) C89 Διάφορα standards 1990: ISO/IEC 9899:1990 Information Technology Programming Language C. 1995: ISO/IEC 9899 AM1 αποτελεί τροποποίθςθ του C πρωτοτφπου. 1995: ISO/IEC 9899 TCOR1 Technical Corrigendum 1. 1996: ISO/IEC 9899 TCOR2 Technical Corrigendum 2. 1999: C99 2011: C11 4
Γιατί C; Είναι ςχετικά μικρι και εφκολθ ςτθν εκμάκθςθ υποςτθρίηοντασ top down/modular ςχεδιαςμό και δομθμζνο προγραμματιςμό Τπάρχει μεγάλθ εγκατεςτθμζνθ βάςθ εφαρμογϊν που αναπτφχκθκαν με τθ γλϊςςα αυτι. Μπορεί να διαχειριςτεί: δυαδικά ψθφία (bits), ψθφιολζξεισ (bytes), ςυμβολοςειρζσ (words), δείκτεσ (pointers). Μπορεί να χρθςιμοποιθκεί για χαμθλοφ επιπζδου προγραμματιςμό επιτρζποντασ άμεςθ πρόςβαςθ ςτουσ πόρουσ του υπολογιςτι. υνεπϊσ είναι κατάλλθλθ γλϊςςα για ανάπτυξθ προγραμμάτων ςυςτιματοσ (systems programs) όπωσ είναι: λειτουργικά ςυςτιματα (operating systems), διερμθνευτζσ (interpreters), ςυντάκτεσ (editors), ςυμβολομεταφραςτζσ (assemblers), μεταγλωττιςτζσ (compilers), διαχειριςτζσ βάςεων δεδομζνων (database managers). Σου «ανοίγει τα μάτια» ςχετικά με το πωσ δουλεφει πραγματικά ο υπολογιςτήσ!! 5
Το πρώτο μου πρόγραμμα σε C Χριςθ Standard I/O library (για τθν printf) Ειδικόσ χαρακτιρασ new line (\n) Βαςικι ςυνάρτθςθ Αρχι προγράμματοσ Σζλοσ προγράμματοσ #include <stdio.h> int main() { printf( Hello World!\n ); } υνάρτθςθ εκτφπωςθσ Παράμετροσ ςυνάρτθςθσ (string) Σζλοσ εντολισ (;) 6
Compiling & Running! Ο κάκε υπολογιςτισ «τρζχει» αποκλειςτικά και μόνο προγράμματα ςε γλώςςα μηχανήσ. Ζνα πρόγραμμα C πρζπει να μεταγλωττιςτεί (compiled) ςε εκτελζςιμο (που είναι ςε γλϊςςα μθχανισ) Αυτό το επιτυγχάνουμε με τον compiler π.χ., gcc GNU C Compiler $ gcc helloworld.c o helloworld $ Και ςτθ ςυνζχεια μποροφμε να «τρζξουμε» το εκτελζςιμο. $./helloworld Hello World! 7
Σχόλια: Μια καλή συνήθεια! Σα ςχόλια κάνουν τον κϊδικά μασ πιο ευανάγνωςτο, κατανοητό ςε τρίτουσ, και εφκολο ςτθ ςυντήρηςη. #include <stdio.h> int main() { // This is a comment. // And this is another comment!! /* Comments are NOT compiled! */ } /* This is a multi-line comment. We can easily comment-out lines of code int x = 2+5; */ printf( Comment!.\n ); // this is a short comment // Let s print the desired output printf( This program demonstrates the use of comments.\n ); 8
Ένα δεύτερο πρόγραμμα σε C #include <stdio.h> Μεταβλθτζσ (variables) Σφποσ δεδομζνων (data type) Αρικμθτικι πράξθ int main() { } int x, y, area; x = 5; y = 4; area = x*y; printf( Το τετράγωνο με πλεσρές %i και %i\n, x, y); printf( έτει εμβαδόν %i.\n, area); return 0; Format specifier 9
Διαδικασία Μεταγλώττισης test.c Πθγαίοσ Κϊδικασ (source code) Compiler Object Κϊδικασ stdio.h Header Files test.o test Linker printf Library Εκτελζςιμοσ Κϊδικασ 10
Στοιχεία Γλώσσας Προγρ/μού Αλφάβητο Οι χαρακτιρεσ από τουσ οποίουσ ςχθματίηονται οι λζξεισ τθσ γλϊςςασ Λεξιλόγιο Οι λζξεισ που χρθςιμοποιεί θ γλϊςςα Συντακτικό Οι κανόνεσ ςφνταξθσ των προτάςεων τθσ γλϊςςασ Σημαςιολογία Οι κανόνεσ ερμθνείασ των προτάςεων τθσ γλϊςςασ 11
Αλφάβητο Αποτελείται από 96 χαρακτιρεσ Space (κενο) Tab (χαρακτιρασ ελζγχου οριηοντίου ςτθλοκζτθ) V-Tab (χαρακτιρασ ελζγχου κακζτου ςτθλοκζτθ) Form feed (χαρακτιρασ αλλαγισ ςελίδασ) New line (χαρακτιρασ νζασ γραμμισ) a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 _ { } [ ] # ( ) < > % : ;.? * + - / ^ & ~ =!, \ 12
Λεξιλόγιο Κατηγορίες Λέξεων Reserved words (δεςμευμζνεσ λζξεισ) Keywords (int, for, if, ) Library functions (printf, scanf, isdigit, ) Preprocessor commands (#include, #define, ) Identifiers (αναγνωριςτζσ) Ονόματα μεταβλθτϊν, ςτακερϊν, ςυναρτιςεων, τφπων δεδομζνων, τα οποία δίνονται από τον προγραμματιςτι Operators (τελεςτζσ) Ειδικά ςφμβολα που παριςτάνουν μία ςυγκεκριμζνθ ςτοιχειϊδθ διεργαςία που εκτελείται ςε δεδομζνα (π.χ., +, -, *, /, &, &&,,,...) 13
C s Reserved Words Keywords auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while Fig. 2.15 C s reserved keywords. 14
Identifiers (αναγνωριστές) Κανόνεσ ονομαςίασ αναγνωριςτϊν Αποτελοφνται από γράμματα, αρικμοφσ, και underscore _. Αρχίηουν πάντα από γράμμα ι _ Δεν μπορεί να είναι ίδια με κάποια δεςμευμζνθ λζξθ (C) Διάκριςθ μικρϊν και κεφαλαίων (case sensitive) Όριο μικουσ (π.χ., 31 για ANSI C) Ερώτηςη: Ποια από τα παρακάτω identifiers επιτρζπονται; 2class class1 Class-1 Class_1 Class#1 CLaSs1 15
Identifiers (αναγνωριστές) Αποφφγετε ονόματα ενόσ χαρακτιρα όπωσ i, j, x, y Χρθςιμοποιιςτε εκφραςτικά ονόματα Χρθςιμοποιιςτε μικρά γράμματα, για ονόματα μεταβλθτϊν Κατά κανόνα χρθςιμοποιοφμε κεφαλαία γράμματα για μακροεντολζσ Διατθριςτε ενιαίο κανόνα όςον αφορά το διαχωριςτικό για μεταβλθτζσ που αποτελοφνται από 2 ι περιςςότερεσ λζξεισ Π.χ., total_salary_increase, first_name, last_name, Ή: totalsalaryincrease, firstname, lastname, 16
Αναγνωσιμότητα Identifiers Αυτό εννοοφμε όταν λζμε χρηςιμοποιήςτε εκφραςτικά ονόματα! x = 20; if (x > y) function1(); else function2(); weight = 20; if (weight > maxweight) decreaseweight(); else increaseweight(); 17
Δεδομένα (Data) Είναι θ είςοδοσ, θ ακατζργαςτθ γνωςτι πλθροφορία, με τθν επεξεργαςία τθσ οποίασ κα παραχκοφν τα αποτελζςματα (θ λφςθ του προβλιματοσ) Δεδομζνα = τιμζσ ι πλειάδεσ τιμϊν που ςχετίηονται με τισ οντότθτεσ του προβλιματοσ. 18
Δεδομένα (Data) Είςοδοσ Επεξεργαςία Ζξοδοσ Ενδιάμεςα Αποτελζςματα Πρόγραμμα Μνιμθ 19
Μεταβλητές (Variables) [1/2] Οι μεταβλητζσ (variables) είναι υπολογιςτικζσ οντότθτεσ μζςω των οποίων χρθςιμοποιοφνται τα δεδομζνα. Σο περιεχόμενο (τιμι) μίασ μεταβλθτισ μπορεί να μεταβάλλεται κατά τθ διάρκεια εκτζλεςθσ ενόσ προγράμματοσ Η χριςθ των μεταβλθτϊν πθγάηει από τθν ανάγκθ για αποκικευςθ δεδομζνων ανάκτθςθ αποκθκευμζνων δεδομζνων 20
Μεταβλητές (Variables) [2/2] Οι μεταβλθτζσ αποτελοφν αναφορά ςε μία κζςθ μνιμθσ ςτο περιεχόμενο μίασ κζςθσ μνιμθσ Χαρακτθριςτικά μεταβλθτισ το όνομά τθσ θ τιμι τθσ Οι μεταβλθτζσ παριςτάνουν οντότθτεσ του προβλιματοσ που επιλφει το πρόγραμμα Π.χ. Πρόβλθμα υπολογιςμοφ τθσ επιφάνειασ ενόσ ορκογωνίου. Οντότθτεσ: μικοσ, πλάτοσ, εμβαδόν Μεταβλθτζσ: length, width, area Ή κατά το Ελλθνικότερον(!): mikos, platos, embadon...αλλά αποφφγετε τα Greeklish!!! 21
Σταθερές (Constants) Τιμές (Literals) Οι ςταθερζσ (constants) είναι υπολογιςτικζσ οντότθτεσ που ζχουν ςτακερι τιμι κατά τθν διάρκεια εκτζλεςθσ ενόσ προγράμματοσ π.χ., PI για το 3.14159265 Οι τιμζσ (lirerals) είναι δεδομζνα που δεν χρειάηονται αποκικευςθ, χρθςιμοποιοφνται όπωσ είναι π.χ., οι αρικμοί 2, 3.5 22
Δήλωση Σταθερών #define <όνομα> <τιμι> #define TRUE 1 #define FALSE 0 #define JANUARY 1 #define PI 3.14159265 23
Σταθερές Απαρίθμησης enum boolean {NO, YES}; enum boolean {TRUE, FALSE}; enum months {JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC}; 24
Τύποι Δεδομένων Σα δεδομζνα δεν ζχουν όλα τισ ίδιεσ ιδιότθτεσ, δεν είναι όλα του ίδιου τφπου Σφποσ δεδομζνων = πεδίο τιμϊν + τρόποι διαχείριςθσ = πεδίο τιμϊν + πράξεισ Σφποι δεδομζνων Primitive (πρωτογενείσ): int, float, double, char, pointers, Composite (ςφνκετοι): arrays, unions, structs, 25
Τύποι Δεδομένων Πρωτογενείσ Ακζραιοσ (short, int, long) Πραγματικόσ (float, double, long double) Χαρακτιρασ (char) Λογικόσ (θ C δεν διακζτει) ε τι ωφελεί ο διαχωριςμόσ ςε διαφορετικοφσ τφπουσ; τον τρόπο αποκικευςθσ οικονομία χϊρου λόγω διαφορετικισ αποκικευςθσ απαιτοφμενθ ακρίβεια ςτθν αναπαράςταςθ τθ χριςθ καλφτεροσ ζλεγχοσ κατά τθ μετάφραςθ και εκτζλεςθ του προγράμματοσ 26
Δήλωση Μεταβλητής <data type> <variables> float length, width, area; ι <data type> <variable>=<value> int i=1; Μεταβλθτζσ που δεν αλλάηουν τιμι (ςτακερζσ) const float pi=3.14; 27
Βασικές Πράξεις Σελεςτισ ανάκεςθσ x=3; Αρικμθτικοί τελεςτζσ (+, -, /, *, %) x=5+3; y=5*6; Διαφορά ςτθν ερμθνεία του τελεςτι διαίρεςθσ μεταξφ ακεραίων και πραγματικϊν. 28
Τύπος «ακέραιος» Αναπαράςταςθ ακεραίων, κετικϊν, ι αρνθτικϊν αρικμϊν Keyword: int Εφροσ: εξαρτάται από το μικοσ λζξθσ του Η/Τ π.χ., για λζξθ 16-bit: -32768 ζωσ 32767 ι 0 ζωσ 65535 Προςδιοριςτζσ short: μικοσ ==16 bit long: μικοσ ==32 bit Unsigned Ακζραιεσ τιμζσ τισ χειρίηεται ςαν ακζραιουσ αρικμοφσ ανάλογα με το μζγεκοσ, π.χ., τθν 125 τθν χειρίηεται ςαν int, ενϊ τθν 135840 ςαν long int μποροφμε όμωσ να επιβάλουμε τον τφπο χειριςμοφ, π.χ., 6524L 29
Τύπος «πραγματικός» Αναπαράςταςθ πραγματικϊν αρικμϊν τακερισ υποδιαςτολισ: 120.52, 0.035 Εκκετικισ ι επιςτθμονικισ μορφισ: 1.2052e+02, 3.5e-2 Keywords float: απλισ ακρίβειασ (6-7 δεκαδικά ψθφία) double: διπλισ ακρίβειασ (14-15 δεκαδ. ψθφία) Προςδιοριςτζσ: long για το double Πραγματικζσ τιμζσ: κεωροφνται ςαν double π.χ., 0.13, 56.48, 8e-3, 15e05, 0.004e-0.4 30
Τύπος «χαρακτήρας» Αναπαράςταςθ απλϊν χαρακτιρων του αλφαβιτου τθσ γλϊςςασ Keyword: char H C χειρίηεται τουσ χαρακτιρεσ ςαν ακζραιουσ. Κάκε χαρακτιρασ κεωρείται ςαν ακζραιοσ με τιμι τον αντίςτοιχο κωδικό ASCII. Οι τιμζσ ςε μία τζτοια μεταβλθτι αποδίδονται όταν ο χαρακτιρασ εμπεριζχεται ςε. Για παράδειγμα: a είναι ο χαρακτιρασ a b είναι ο χαρακτιρασ b c είναι ο χαρακτιρασ c 31
32
Βιβλιογραφία Brian Kernighan, Dennis Ritchie, H Γλϊςςα Προγραμματιςμοφ ANSI C, Κλειδάρικμοσ 1990. Herbert Schildt, Ο οδθγόσ τθσ C, εκδόςεισ Γκιοφρδασ Κλεάνκθσ Θραμπουλίδθσ, Διαδικαςτικόσ Προγραμματιςμόσ: Από τθ C ςτθ JAVA, Εκδόςεισ Σηιόλα, 2002 C How to Program, 5/E (Harvey & Paul) Deitel & Associates, Prentice Hall, 2007 N. Χατηθγιαννάκθσ, Η γλϊςςα C ςε βάκοσ, Κλειδάρικμοσ Γ. Σςελίκθσ, Ν. Σςελίκασ, C από τθ κεωρία ςτθν πράξθ http://software.hpclab.ceid.upatras.gr (εμπεριζχεται αναλυτικι βιβλιογραφία) 33