C - University of Cyprus

Τµήµα Πληροφορικής
Πανεπιστήµιο Κύπρου
ΕΠΛ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