Τµήµα Πληροφορικής Πανεπιστήµιο Κύπρου ΕΠΛ132 – Αρχές Προγραµµατισµού II Διάλεξη 1: Εισαγωγή - C για Προγραµµατιστές JAVA (Κεφάλαια 1-2, KNK-2ED) Δηµήτρης Ζεϊναλιπούρ http://www.cs.ucy.ac.cy/courses/EPL132 EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-1 Στόχοι Μαθήµατος • ΕΠΛ131: Αρχές Προγραµµατισµού Ι – Ανάπτυξη δεξιοτήτων στην επίλυση προβληµάτων µε αλγοριθµικό τρόπο, µέσω διαδικαστικού και αντικειµενοστρεφούς προγραµµατισµού – Θεµελίωση της αλγοριθµικής σκέψης και των βασικών αρχών προγραµµατισµού • ΕΠΛ132: Αρχές Προγραµµατισµού ΙΙ – Ενδιάµεσες και προχωρηµένες αρχές προγραµµατισµού µέσω µιας χαµηλού επιπέδου γλώσσας – Ανάπτυξη µεγάλων εύρωστων προγραµµάτων / βιβλιοθηκών τα οποία θα επιλύνουν πολύπλοκα προβλήµατα. – Προχωρηµένα θέµατα διαχείρισης της κύριας και δευτερεύουσας µνήµης από τη γλώσσα προγραµµατισµού, θέµατα µεταγλώττισης, ολοκληρωµένα εργαλεία ανάπτυξης, µεθόδους αποσφαλµάτωσης και βελτιστοποίησης του κώδικα EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-2 Συµβόλαιο Μαθήµατος • Επίπεδο: Προπτυχιακό – Υποχρεωτικό Μάθηµα • Πίστωση: 7.5 µονάδες ECTS • Προαπαιτούµενα: – ΕΠΛ131: Αρχές Προγραµµατισµού Ι • Προαπαιτούµενο: – Σχεδόν όλα τα κατοπινά µαθήµατα στηρίζονται στην επιτυχή ολοκλήρωση του ΕΠΛ132. • Μέθοδοι Διδασκαλίας – Διαλέξεις & Φροντιστήρια (5 1/2 ώρες εβδοµαδιαίως): Συνδυασµένη Παράδοση Διδακτέας Ύλης και Θεωρητική Εµπέδωση – Εργαστήριο (4 ώρες εβδοµαδιαίως): Πρώτο Εβδ. Εργαστήριο (Εκµάθηση Εργαλείων), Δεύτερο Εβδ. Εργαστήριο: Διαγνωστικό 1-3 EPL132: Principles II - Demetris Zeinalipour © (University of Cyprus) Τεστ Programming (πρώτα 45”) και Πρακτική Εξάσκηση. Συµβόλαιο Μαθήµατος • Αξιολόγηση – 50% Τελική Εξέταση (1) – 20% Ενδιάµεση Εξέταση (1) • Ηµερ.: Δευτέρα, 16 Μαρτίου 2015! (9η Εβδ.) – 30% Ασκήσεις & Διαγνωστικά • Προγραµµατιστικές Ασκήσεις (5) • Διαγνωστικά Tέστ (3) EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-4 Βιβλιογραφία Βασική Βιβλιογραφία • K.N. King, C Programming: A Modern Approach, Second Edition, ISBN-10: 0393979504, ISBN-13: 978-0393979503, 832 pages, W. W. Norton & Company, 2008. Βοηθητική Βιβλιογραφία • Σηµειώσεις Μαθήµατος και Συνοδευτικό Υλικό • Problem Solving and Program Design in C, 7/e, Hanly & Koffman, Addison-Wesley, ISBN-10: 0132936496 ISBN-13: 978-0132936491, 2013 • Νικόλαος Μισυρλής, Εισαγωγή στον Προγραµµατισµό µε την C, ISBN 960-92031-0-8, 2005. EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-5 Ιστοσελίδα EΠΛ132 • Όλες οι πληροφορίες σχετικά µε το µάθηµα βρίσκονται στο ακόλουθο URL http://www.cs.ucy.ac.cy/courses/EPL132 EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-6 Πλατφόρµα Τηλεκπαίδευσης • Για τις εκπαιδευτικές δραστηριότητες του µαθήµατος (υποβολή εργασιών, φόρουµ ανακοινώσεων, ερωτηµατολόγια, βαθµολογίες εργασιών, κτλ) θα χρησιµοποιηθεί το Moodle: http://moodle.cs.ucy.ac.cy/ / EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-7 Πλατφόρµα Τηλεκπαίδευσης Εγγραφείτε σήµερα κάνοντας χρήση του Κλειδιού Εγγραφής που θα δοθεί στην τάξη! EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-8 Αριθµός Αναζητήσεων (TuringComplete) Γλωσσών στο WWW Δηµοτικότητα Γλωσσών Προγραµµατισµού http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-9 Καλοκαιρινή Εφαρµογή Οµάδας 2012 για iOS (σε Objective-C) SmartLib EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-10 Γιατί µαθαίνουµε C (µετά την Java); • Α) Για να κατανοήσουµε σε βάθος τον κύκλο εκτέλεσης των προγραµµάτων (Διαχείριση Μνήµης, Εισόδου/Εξόδου, Δεδοµένα στη Δευτερεύουσα Μνήµη, κτλ). – Η αρχιτεκτονική Von Neumann αποτελεί το υπόβαθρο ΟΛΩΝ των σύγχρονων υπολογιστών. Περιγράψετε τι γίνεται όταν εκτελέσουµε ένα πρόγραµµα επεξεργασίας δεδοµένων. EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-11 Γιατί µαθαίνουµε C (µετά την Java); • Γνωρίζοντας το Von Neumann µηχάνηµα, θα µπορούµε να εξηγήσουµε σε βάθος την συµπεριφορά ενός προγράµµατος και του συστήµατος • Ιδιαίτερα, θα εκτιµήσουµε πως αλληλό-συµπληρώνονται τα µαθήµατα του προγράµµατος σπουδών – Χαµηλού Επίπεδου / Υλικό • ΕΠΛ121 Ψηφιακά Συστ. / ΕΠΛ370 Αρχιτεκ. / ΕΠΛ470 Ενσ. Συστ • ΕΠΛ221 Οργάνωση Υπολογιστών και Συµβολικός Προγραµµατισµός – Ενδιάµεσου Επιπέδου / Συστήµατα • Βάσεις Δεδοµένων (ΕΠΛ342 και ΕΠΛ446) • Λειτουργικά Συστήµατα (ΕΠΛ222), • Προγραµµατισµός Συστηµάτων (ΕΠΛ371) • Δίκτυα (ΕΠΛ324 & 375) και Ασφάλεια (ΕΠΛ475) EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-12 Γιατί µαθαίνουµε C (µετά την Java); • Β) Φιλοσοφικοί Λόγοι: Η πολυγλωσσία είναι καλή στις µέρες µας. • Δεν είναι όλες οι γλώσσες αντικειµενοστρεφείς…. – Συναρτησιακές Γλώσσες (αποκλειστική χρήση συναρτήσεων): Haskell, Erlang, «SQL» κτλ. – Λογικές Γλώσσες (αποκλειστική χρήση κανόνων και καταστάσεων): π.χ., Prolog, Datalog Querying, R++ – Διαδικαστικές Γλώσσες (αποκλειστική χρήση διαδικασιών): C, Javascript, Fortran, Matlab, Python, Perl, Visual Basic, VB Scripting, Occam, Go, Eiffel, κτλ. • Πολλές γλώσσες σήµερα παρέχουν διαχείριση αντικειµένων (object-based, π.χ., Obj.name), αλλά όχι αντικειµενοστρέφια. – Εποµένως είναι καλό να εξασκηθούµε σε ένα διαφορετικό και διαδεδοµένο µοντέλο προγραµµατισµού. EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-13 Γιατί µαθαίνουµε C (µετά την Java); • Γ) Άλλοι Λόγοι: – Η C είναι αποδοτική (efficient)! – Η C είναι η γλώσσα του Unix/Linux, πλατφόρµες που λειτουργούν το µεγαλύτερο ποσοστό των παγκόσµιων υποδοµών στις µέρες µας. – Η C είναι προτυποποιηµένη (standard), φορητή (portable), αρθρωτή (modular) και επιτρεπτική (permissive). • Κατάλληλη για προχωρηµένους προγραµµατιστές… – Η C είναι η βάση της C++, της Java/C#, της Οbj.-C • Δες επόµενες διαφάνειες – Η C είναι Χαµηλού Επιπέδου και Ψηλού Επιπέδου • από GUI µέχρι Συµβολικό Κώδικα (Assembly)! EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-14 Γλώσσες Βασισµένες στη C Obj-C EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-15 Γλώσσες Βασισµένες στην C «Όταν µάθετε C όλες οι άλλες γλώσσες θα είναι εύκολες» • C++ περιλαµβάνει όλα τα πλεονεκτήµατα της C, αλλά περιλαµβάνει κλάσεις (classes) και άλλες έννοιες για Αντικειµενοστρεφή προγραµµατισµό. – π.χ., Windows Systems & Applications, Libraries, κτλ. • Java βασίζεται στην C++ αλλά την απλοποιεί εισάγοντας απλουστευµένη σύνταξη, διαχειριστή µνήµης (garbage collector), κ.α. – Web Applets, Enterprise Progr. (DBs), Android, etc. • C# είναι πιο πρόσφατη γλώσσα της Microsoft βασισµένη στο µοντέλο της Java. – Microsoft .NET εφαρµογές. Window Phone, Cloud, κτλ. • Objective-C είναι η γλώσσα για πλατφόρµες Apple – Ουσιαστικά πρόκειται για C µε απλή αντικειµενοστρέφια – EPL132: Π.χ., Εφαρµογές για Apple Mac, IPhone, IPad, IPod, of κτλ. Programming Principles II - Demetris Zeinalipour © (University Cyprus) 1-16 Γλώσσες Βασισµένες στην C «Οµοιότητα σύνταξης γλωσσών µε την C. Απλά άλλες γλώσσες δίνουν περισσότερες βιβλιοθήκες και ΟΟ έννοιες» C (GNU, Cross-Platform) - Procedural C# (Microsoft) - OO // hello.c #import <stdio.h> int main(int argc, const char *argv[] ) { printf( "hello world\n" ); return 0; } // Hello1.cs public class Hello1 { public static void Main() { System.Console.WriteLine("Hello, World!"); } } Objective-C (Apple) – Proc. ή ΟΟ C++ (GNU, Cross-Platform) – Obj. Orie. // hello.cpp #include <iostream> using namespace std; int main () { cout << "Hello World!"; return 0; } JAVA (Sun/Oracle, Cross-Platform) - OO // hello.java public class hello { public static void main (String args []) { System.out.println(“Hello world”); } } // hello.m #import <stdio.h> int main( int argc, const char *argv[] ) { printf( "hello world\n" ); return 0; } JAVA (Servlet) package hall; import java.io.*; import javax.servlet.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("Hello World"); } } EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-17 Η Παράδοση της C στο Τµήµα µας • Το 2006 δυο οµάδες φοιτητών µας κατατάσσονται 3η και 10η στο παγκόσµιο διαγωνισµό IEEE Extreme Programming: – 16 αλγοριθµικά προβλήµατα σε C (ή C++). – To 2008 άλλη οµάδα κατατάσσεται και πάλι 3η κάνοντας χρήση C! • Το 2009 µια οµάδα προπτυχιακών φοιτητών µας κατατάσσεται 2η στον παγκόσµιο διαγωνισµό ασύρµατων και κινητών δικτύων MANIAC Challenge. – Γλώσσα υλοποίησης κώδικα C! • Το 2009 δυο οµάδες προπτυχιακών φοιτητών µας κατατάσσονται 9η και 10η στον παγκόσµιο διαγωνισµό βάσεων δεδοµένων ACM SIGMOD Programming Contest (οι υπόλοιπες ήταν µεταπτυχιακοί). – Γλώσσα υλοποίησης κώδικα C! – To 2010 άλλη οµάδα κατατάσσεται 6η ενώ το 2013 10η µε C/C++. EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-18 To πρώτο πρόγραµµα C #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } • Το πιο πάνω πρόγραµµα αποθηκεύεται σε αρχείο µε όνοµα hello.c. • Το όνοµα του αρχείου µπορεί να είναι οτιδήποτε, αλλά η κατάληξη.c συχνά απαιτείται από τους µεταγλωττιστές. EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-19 Μεταγλώττιση & Σύνδεση • Πριν εκτελεστεί ένα πρόγραµµα, τρία βήµατα είναι συνήθως απαραίτητα: – Προεπεξεργασία (Preprocessing). επεξεργασία εντολών αρχείου που ξεκινάνε µε #, γνωστά ως οδηγίες προεπεξεργαστή (directives) – Μεταγλώττιση (Compiling). Μεταγλώττιση του αρχείου σε γλώσσα µηχανής (object code). – Σύνδεση (Linking). Ο linker συνθέτει το object code των επί µέρους αρχείων µε οτιδήποτε επιπλέον κώδικα απαιτείται για να παραχθεί ένα εκτελέσιµο αρχείο. • Ο preprocessor είναι συνήθως µέρος του compiler και όλα τα πιο πάνω εκτελούνται µε µια 1-20 όπως δούµε στηνII - επόµενη διαφάνεια. EPL132: θα Programming Principles Demetris Zeinalipour © (University of Cyprus) Μεταγλώττιση & Σύνδεση • Ο µεταγλωττιστής C του UNIX είναι ο CC. % cc hello.c (όπου % η γραµµή εντολών UNIX) • Το Linking γίνεται αυτόµατα (εάν και µπορεί να γίνει επιλεκτικά µε τη ld εντολή, θα το δουµε αργότερα) • To αποτέλεσµα είναι το a.out αρχείο το οποίο είναι το εκτελέσιµο πρόγραµµα (executable) – Το όρισµα -o επιτρέπει τον προσδιορισµό του ονόµατος του εκτελέσιµου % cc -o hello hello.c ; ./hello • Στο µάθηµα θα χρησιµοποιήσουµε ΜΟΝΟ τον GNU GCC µεταγλωττιστή Εάν το µονοπάτι µεταγλώττισης δεν είναι στην % gcc -o hello hello.c µεταβλητή περιβάλλοντος PATH, τότε απαιτείται το «./» 1-21 EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) Μεταγλώττιση & Σύνδεση • H C αποτελείται από ένα σύνολο συντακτικών κανόνων. • Για να εκτελεστεί ένα πρόγραµµα C πρέπει να χρησιµοποιηθεί ένας µεταγλώττισης (compiler), ο οποίος κατασκευάζεται από διάφορες εταιρείες και οργανισµούς. • Η American National Standard Institutes (ANSI) δηµιούργησε το πρότυπο ANSI C για λόγους µεταφερσιµότητας (portability) του κώδικα το οποίο καλούνται οι διάφορες εταιρείες να ακολουθούν. – Εµείς θα χρησιµοποιήσουµε τον GNU GCC ο οποίος είναι συµβατός µε την ANSI C99 έκδοση, ενώ αρκετοί άλλοι υποστηρίζουν µόνο C89 και άλλες προεκτάσεις εκτός προτύπου. Microsoft Διάγραµµα VENN για µεταγλωττιστές C ΑΝSI C GCC, CC Others Borland EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-22 To δεύτερο πρόγραµµα C Εύρεση Χιλιοµέτρων από Μίλια Οδηγίες προεπεξεργαστή Δήλωση σταθεράς Ορισµός συνάρτησης main Δήλωση µεταβλητών Ακολουθία εντολών (αναγνωριστικό) EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-23 Μεταγλώττιση µε GCC (Σύνοψη) stdio.h hello.c Αρχεία επικεφαλίδας (header files) Μεταγλωττιστής C (compiler) Πηγαίος κώδικας (source) Object code hello.o Εκτελέσιµο πρόγραµµα (executable) Συνδέτης (linker) hello printf Υλοποιήση Βιβλιοθηκών (Shared Libaries) Standard C libc.a (statically linked) ή libc.so (dynamically linked) libm.(so|a) => Math libdbg.(so|a) => Debug … 1-24 EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) Μεταγλώττιση µε GCC • H συµπεριφορά του µεταγλωττιστή µπορεί να αλλάξει µε εκατοντάδες ορίσµατα (δείτε εντολή: man gcc). -o file output file for object or executable -Wall -W all warnings – use always!, -W: issues additional warnings beyond those produced by –WALL (use both anyway …) -c compile single module (that has no main()) -pedantic Causes programs using nonstandard features to be rejected -g insert debugging code (gdb, µελλοντικά) -p insert profiling code (gprof, µελλοντικά) -l Library, π.χ., lpthread -lssl –lcrypto -lm (math) -E Stop after the preprocessing stage and output the preprocessed source code (µελλοντικά) -O optimization for code size and execution time (free() problems) gcc -Wall -Wuninitialized -Wunreachable-code –pedantic file.c EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-25 Μεταγλώττιση µε GCC • Μεταγλώττιση σε δυο φάσεις – pre-process & compile: gcc –c hello.c – link: gcc –o hello hello.o // output to file “hello” • Linking πολλαπλών µονάδων (modules): à a.o b.c à b.o gcc –c a.c gcc –c gcc –o hello a.o b.o • Χρήση της βιβλιοθήκης math gcc –o calc calc.c –lm – Δίνουµε οδηγία του Linker να ψάξει για τις βιβλιοθήκες που περιέχουν την υλοποίηση των µαθηµατικών συναρτήσεων (libm.so ή libm.a) - π.χ., εάν χρησιµοποιείται το sqrt(), pow(), … EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-26 Μεταγλώττιση µε GCC (Αναλυτικά Βήµατα) gcc -o hello hello.c gcc –E hello.c > hello.i Οι ορισµοί των βιβλιοθηκών που περιλαµβάνονται στο #include, τοποθετούνται µαζί µε το .c κώδικα στο .i αρχείο. gcc –S hello.c Παράγεται αρχείο hello.s που περιέχει τον συµβολικό κώδικα του προγράµµατος. gcc –c hello.c as -arch x86_64 –o hello.o hello.s O συµβολοµεταφραστής (assembler) ΑS ή GAS (GNU), µεταφράζει το συµβ. κώδικα σε κώδικα µηχανής x86_64 ld -e _main –o hello -lc hello.o O αυνδέτης (linker) παράγει το τελικό εκτελέσιµο. EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-27 Σφάλµατα Μεταγλώττισης • Υπάρχουν πολλαπλοί Λόγοι – Pre-Processor (Προεπεξεργαστή, gcc -E) • Π.χ., #include <non-existent-library.h> – Parser (Συντακτικός Αναλυτής): • Π.χ., ξεχνάµε να κλείσουµε µια παρένθεση. – Assembler (Συµβολοµεταφραστή, as): • Mετατρέπει την συµβολική γλώσσα (assembly) σε αντικειµενικό κώδικα (object code) • Σπάνια λάθη που σχετίζονται µε τον As – Linker (ld): Σύνδεση µε µη-υπαρκτή συνάρτηση EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-28 Σφάλµατα Μεταγλώττισης • Εάν ο gcc µπερδευτεί, τότε παρουσιάζονται εκατοντάδες µηνύµατα: – Διορθώστε το πρώτο, µετά δοκιµάστε ξανά – αγνοώντας τα υπόλοιπα. • Ο gcc θα δηµιουργήσει ένα εκτελέσιµο µε προειδοποιήσεις (warnings), αρκεί να µην υπάρχει λάθος (error) – Μην αγνοείτε τις προειδοποιήσεις! – Κάνετε χρήση του gcc –Wall για να παρουσιάσετε ΌΛΕΣ τις προειδοποιήσεις, π.χ., : – if (x = 0) vs. if (x == 0) – example.c:3: warning: suggest parentheses around assignment used as truth value EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-29 Σφάλµατα Μεταγλώττισης • Ο GCC δηµιουργεί object code για κάθε αρχείο. • Θεώρει ότι αναφορές σε συναρτήσεις και άλλες µεταβλητές θα επιλυθούν αργότερα κατά το linking • Εάν το πρόγραµµα σας αναφέρεται σε συνάρτηση (Π.χ., print) που δεν υπάρχει ορισµένη στο πρόγραµµα σας θα πάρετε λάθος κατά την σύνδεση (linking) : undefined symbol first referenced in file _print program.o ld fatal: Symbol referencing errors No output written to file. EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-30 Ολοκληρωµένα Περιβάλλοντα Ανάπτυξης (Integrated Development Environments) • Ένα Integrated Development Environment (IDE) είναι ένα λογισµικό το οποίο επιτρέπει τη συγγραφή, µεταγλώττιση, εκτέλεση και αποσφαλµάτωση ενός προγράµµατος. • Για αρχή θα χρησιµοποιήσουµε τον συνδυασµό κελύφους µε κάποιο κειµενογράφο για προγραµµατιστές και στη συνέχεια του µαθήµατος θα λειτουργούµε µόνο µε το IDE. Άσκηση 1 Από Άσκηση 2 Το πρόγραµµα σας ΠΡΕΠΕΙ να µεταγλωττίζεται στις µηχανές του εργαστηρίου εναλλακτικά θα µηδενίζεται η άσκηση σας!!! EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-31 Σύγκριση C έναντι Java (Σύνοψη) • Πρόγραµµα Java – Συλλογή από κλάσεις – Κάθε κλάση περιέχει µια main µέθοδο η οποία είναι µέθοδος εκκίνησης • Εκτελώντας java StartClass ενεργοποιεί την µέθοδο StartClass.main • Το Java Virtual Machine (JVM), που περιλαµβάνεται ως µέρος του JRE (Java Runtime Environment) ή JDK (Java Development Kit) φορτώνει τις υπόλοιπες κλάσεις οπότε χρειάζεται EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-32 Σύγκριση C έναντι Java (Σύνοψη) • Συλλογή από συναρτήσεις (functions) • Μια συνάρτηση µε όνοµα – main() – είναι η συνάρτηση εκκίνησης • Εκτελώντας το πρόγραµµα (εξ’ ορισµού όνοµα a.out) εκκινεί την συνάρτηση main • Συνήθως, όλος ο κώδικας ενός προγράµµατος περιλαµβάνεται στον εκτελέσιµο κώδικα (στατική σύνδεση) – Εναλλακτικά, µπορεί να περιλαµβάνεται ο κώδικας αυτός µε δυναµική σύνδεση (π.χ., .dll, .so) – Στατική σύνδεση: library.a (κατά µεταγλώττιση) – EPL132: Δυναµική σύνδεση: library.so (κατά εκτέλεση) Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-33 Σχόλια • /*from to comment*/ • // C99 και C++-style σχόλιο! • Σύµβαση για µακρύτερα σχόλια: Καλύτερη ευκρίνεια ότι υπάρχει σχόλιο σε αυτή τη γραµµή /* * AverageGrade() * Given an array of grades, compute the average. */ Θα υπάρχει εξειδικευµένο εργαστήριο για συστάσεις πάνω σε Στυλ γραφής σχολίων και κώδικα! • Αποφεύγετε την χρήση περιέργων κουτιών **** – Το βιβλίο εισηγείται το ακόλουθο πλάτους 60 χαρακ. /********************************************************** * print_result: Notifies the user of the result, using * * the external variables set by * * analyze_hand. * **********************************************************/ – Επίσης, µη χρησιµοποιείτε ΠΟΤΕ ΤΑΒ αλλά 3 SPACES στη θέση κάθε ΤΑΒ εφόσον αυτά δεν αλλάζουν πλάτος µεταξύ κειµενογράφων EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-34 Αριθµητικοί Τύποι Δεδοµένων Τι γνωρίζαµε µέχρι σήµερα; Σε Αρχιτεκτονική 32 bit (x86) Τύπος Bytes Εύρος Τιµών char (χαρακτήρας) 1 -128 … 127 unsigned char 1 0..255 short (ακέραιος) 2 -65536…65535 int, long [int] (ακέραιος) 4,4 (x86) -2,147,483,648 to 2,147,483,647 long long [int] (ακέραιος) 8 264 float (πραγµατικός)* 4 3.4E+/-38 (7 digits) double (πραγµατικός) 8 1.7E+/-308 (15 digits) * Εάν αποθηκεύσω πραγµατικό µε τιµή 0.1 µπορεί αργότερα να βρώ ότι έχει 1-35 τιµή 0.09999999999999999987, λόγω λάθους στρογγυλοποίησης EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) Αριθµητικοί Τύποι Δεδοµένων (Επισηµάνσεις) • Επίσης, το unsigned υποδηλεί µηπροσηµασµένη τιµή. – δηλ., παίρνει µη-αρνητικές τιµές – Συνεπώς, χρησιµοποιούνται τα ίδια bits, τα οποία ωστόσο έχουν διαφορετική σηµασία στο πρόγραµµα • unsigned char = 1 “character”, µπορεί να υποστηρίξει µόνο ASCII (8-bit), δηλαδή 256 χαρακτήρες (0..255) – Το Unicode (16-bit ή 32 bit) υποστηρίζεται στη C µέσω κάποιων επιπλέον βιβλιοθηκών (δες Κεφ. 25: <locale.h>, <wchar.h> και <wctype.h>) EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-36 Ο Πίνακας ASCII (πρώτοι 127 χαρακτήρες µόνο) EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-37 Αριθµητικοί Τύποι Δεδοµένων (32/64-bit Προγραµ. Μοντέλα) • Λίγα λόγια για τύπους δεδοµένων µε τους 2 πιο διαδεδοµένα µοντέλα δεδοµένων – I(ntegers) L(ong) P(ointer) 32 => x86 Model – L(ong) P(ointer) 64 => x64 Model Datatype ILP32 Model LP64 Model char short int long pointer H µνήµη µπορεί να έχει ΜΟΝΟ µέχρι 2^32 = ~4x109 (δηλ., 4GB) διευθύνσεις L! 8 16 32 32 (4 bytes) 32 (4 bytes) H µνήµη µπορεί να έχει µέχρι 16 Exa (x1018) διευθύνσειςJ! 8 16 32 64 (8 bytes) 64 (8 bytes) Δοκιµάστε στο σπίτι το ακόλουθο: printf("%d, %d, %d", sizeof(int), sizeof(long), sizeof(void *)); EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-38 Εκτυπώνοντας µια Μεταβλητή • printf("%d", variable) – %d integer, %ld (64 bit), %x hex., %o octal – %f float (6 δεκ. ψηφ.), %.2f (2 δεκ. ψηφ.) – %c char – %s string (πίνακας char µε τελικό NUL (\0)) • Υπάρχουν εκατοντάδες ορίσµατα κάποια εκ’ των οποίων θα δούµε συνοπτικά στην ερχόµενη διάλεξη. – το Κεφ. 22 καλύπτει το θέµα σε περισσότερο βάθος το οποίο δε θα χρειαστεί για αυτό το µάθηµα. EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-39 Διαβάζοντας µια Μεταβλητή • scanf("%f", &x); – %d integer, %ld (64 bit), %x hex., %o octal – %f float – %c char – %s string (πίνακας char µε τελικό NUL (\0)) • Και πάλι, υπάρχουν εκατοντάδες ορίσµατα κάποια εκ’ των οποίων θα δούµε συνοπτικά στην ερχόµενη διάλεξη. – το Κεφ. 22 καλύπτει το θέµα σε περισσότερο βάθος το οποίο δε θα χρειαστεί για αυτό το µάθηµα. EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-40 Αναγνωριστικά της C (Identifiers) • Τα ονόµατα µεταβλητών, συναρτήσεων, µακρο-εντολών και οντοτήτων ονοµάζονται αναγνωριστικά (identifiers). – Η C όπως και η JAVA και C# (αντίθετα µε π.χ., VB) είναι ευαίσθητη στο τύπο χαρακτήρα (case sensitive) – Ένα αναγνωριστικό µπορεί να περιέχει letters, digits, και underscores, αλλά πρέπει πάντα να ξεκινά µε letter ή underscore: times10 get_next_char 10times get-next-char _done ΟΚ ERROR • Επιβάλλεται ένα οµοιόµορφο στυλ, π.χ., – symbol_table ή symbolTable – 3 κενά spaces ανά εµφωλευµένη έκφραση (όχι tabs) – 80 στήλες ΜΟΝΟ. (περισσότερα στο εργαστήριο 3) EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-41 Δεσµευµένα Αναγνωριστικά • Οι ακόλουθες λέξεις κλειδιά (keywords) ΔΕΝ µπορούν να χρησιµοποιηθούν για αναγνωριστικά στην C: auto break case char const continue default do double else *C99 only enum extern float for goto if inline* int long register restrict* return short signed sizeof static struct switch typedef union unsigned void volatile while _Bool* _Complex* _Imaginary* EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-42 Λεπτοµερέστερη Σύγκριση C έναντι Java Java object-oriented strongly-typed C function-oriented can be overridden polymorphism (+, ==) very limited (integer/float) classes for name space (mostly) single name space, fileoriented macros are external, rarely used macros common (preprocessor) layered I/O model byte-stream I/O EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-43 Λεπτοµερέστερη Σύγκριση C έναντι Java Java C automatic memory management function calls (C++ has some support) no pointers pointers (memory addresses) common by-reference, by-value by-value parameters exceptions, exception handling if (f() < 0) {error} OS signals concurrency (threads) library functions <pthread> EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-44 Λεπτοµερέστερη Σύγκριση C έναντι Java Java C length of array on your own string as type just bytes (char []), with \0 end dozens of common libraries OS-defined EPL132: Programming Principles II - Demetris Zeinalipour © (University of Cyprus) 1-45
© Copyright 2024 Paperzz