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