Πληροφοριακές και Τηλεπικοινωνιακές Τεχνολογίες

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Εισαγωγή στο μάθημα και ιστορική αναδρομή

Καλώς ήρθατε

Πληροφοριακές και Τηλεπικοινωνιακές Τεχνολογίες

Τι περιλαμβάνει το μάθημα

  1. Εισαγωγή στο μάθημα και ιστορική αναδρομή
  2. Παράσταση δεδομένων
  3. Δομικά στοιχεία υπολογιστών
  4. Βασικά στοιχεία αρχιτεκτονικής
  5. Προγραμματισμός σε επίπεδο μηχανής
  6. Δίκτυα δεδομένων, το διαδίκτυο, εφαρμογές
  7. Λειτουργικά συστήματα
  8. Αλγόριθμοι, δεδομένα και διαδικασίες
  9. Γλώσσες και εργαλεία προγραμματισμού
  10. Παραλληλία και προγραμματιστικά παραδείγματα
  11. Τεχνολογία λογισμικού
  12. Στοιχεία θεωρητικής πληροφορικής
  13. Εφαρμοσμένη πληροφορική
  14. Η γλώσσα Java, το πρώτο πρόγραμμα
  15. Υπολογισμοί με μεταβλητές, είσοδος και έξοδος
  16. Τελεστές σύγκρισης, λογικής και επαναλήψεις
  17. Προγραμματισμός με χαρακτήρες, αποφάσεις
  18. Πρόσθετες δομές ελέγχου: switch for break continue
  19. Ορισμός συναρτήσεων
  20. Προγραμματισμός με αντικείμενα
  21. Πίνακες
  22. Η βιβλιοθήκη της Java

Τρόπος διδασκαλίας

Οι σημειώσεις

Βιβλία του μαθήματος

Θα διανεμηθούν τα βιβλία: 'Αλλα βιβλία σχετικά με το μάθημα είναι:

Βαθμολογία

Ο τελικός βαθμός κάθε φοιτητή θα βασίζεται σε 2 κριτήρια: Απαραίτητη προϋπόθεση για να περάσει ο φοιτητής το μάθημα είναι η απόδοσή του σε κάθε κατηγορία να καλύπτει τουλάχιστον τη βάση. Η συμμετοχή κάθε κριτηρίου στη διαμόρφωση του τελικού βαθμού είναι περίπου ως εξής:
Ασκήσεις
30%
Τελικές Εξετάσεις
70%

Το σημερινό μάθημα

Πρόδρομοι της πληροφορικής

Ο αλγόριθμος ΜΚΔ του Ευκλείδη

Θέλουμε να βρούμε το μέγιστο κοινό διαιρέτη των Α και Β, Α > Β (Π.χ. ΜΚΔ των 18 και 24 είναι το 6, ΜΚΔ των 378 και 216 είναι το 54)
  1. Διαιρούμε ακέραια το Α με το Β και έχουμε ένα υπόλοιπο Υ
  2. Αν το Υ είναι 0 τότε ο Β είναι ο ΜΚΔ
  3. Αν το Υ δεν είναι 0 τότε υπολογίζουμε ως ΜΚΔ τον ΜΚΔ του Β και Υ

Ο αστρολάβος των Αντικηθύρων


Μηχανικός υπολογιστής του William von Schickard


Η διαφορική μηχανή του Charles Babbage


Η αναλυτική μηχανή του Charles Babbage


Διάτρητη κάρτα (1950)

Η βάση της διαφορικής μηχανής

Υπολογισμοί με πολυώνυμα

f(x) = x2

1
     3
4         2
     5
9         2
     7
16        2
     9
25        2
     11
36

f(x) = 3x2 + 2x + 5

10
     11
21        6
     17
38        6
     23
61        6
     29
90

Το παράδειγμα με τα ρολόγια

Clock A      Clock B      Clock C
1            3            2
+3           +2
4            5            2
+5           +2
9            7            2
+7           +2
16           9            2

Ακαδημαϊκές προσπάθειες Η/Υ


ENIAC (1946-1955)


Colossus Mark I (1943)


Ο πίνακας οργάνων του υπολογιστή Whirlwind (1947)

Πρώτοι εμπορικοί Η/Υ


Ένα από τα 4000 αρθρώματα του IBM 704

Θεωρητικό υπόβαθρο

Τεχνολογική εξέλιξη


Από αριστερά:


Μνήμη φερριτικού πυρήνα


Λογικό κύκλωμα με λυχνία (IBM Pluggable Units - 1950)


Λογικό κύκλωμα με τρανζίστορ (1960)


Εξέλιξη επεξεργαστών της Intel (1978-1999)

Η επιστήμη της πληροφορικής

(Βασισμένο στο σύστημα ταξινόμησης ACM Computing Reviews.)

Γενική βιβλιογραφία

Γενικές πηγές στο διαδίκτυο

Βιβλιογραφία

Πηγές στο διαδίκτυο

Θέματα για σκέψη

  1. Πόσοι ηλεκτρονικοί υπολογιστές υπάρχουν στο Πανεπιστήμιο; Πως χρησιμοποιούνται; (Μην ξεχάσετε τους υπολογιστές που αποτελούν τμήματα συσκευών ή ολοκληρωμένων εφαρμογών.)
  2. Ποιά είναι η σχέση της πληροφορικής με τη διοικητική επιστήμη;
  3. Ποιά είναι η σχέση της διοικητικής επιστήμης με την πληροφορική;
  4. Πως συνδέονται οι εφαρμογές της πληροφορικής με την παραγωγικότητα και την ανεργία;

Παράσταση δεδομένων

Φυσικός κόσμος και πληροφορική

Φυσικός κόσμος

  1. Αντικείμενα
  2. Ενέργειες

Πληροφορική

  1. Δεδομένα (data)
  2. Αλγόριθμοι (algorithms)

Χάρτης καιρού


Εύρεση του κυρτού φλοιού

Αλφάβητα και κωδικοποίηση

Ορολογία

Bit
0 ή 1
Byte
8 bit - 28 = 256 τιμές
Word
φυσική ομάδα από bit(π.χ. 16, 32, 36, 48, 64). Στους υπολογιστές που χρησιμοποιούμε 32.
K
Kilo - 1024 (210)
M
Mega - 1.028.576 (220)
G
Giga - 1.073.741.824 (230)
T
Tera - 1.099.511.627.776 (240)

Παραδείγματα κωδικοποίησης

Παράσταση χαρακτήρων

Παράσταση των χαρακτήρων "HELLO, WORLD! ABCDEFGHIJKLM 0123456789" σε διάτρητη κάρτα.

 ________________________________________________
/HELLO, WORLD! ABCDEFGHIJKLM 0123456789          |
|]]         ]  ]]]]]]]]]                         |
|  ]]]   ]]]            ]]]]                     |
|     ] ]    ]               ]                   |
|11111111111111]11111111]11111]111111111111111111|
|222222222222222]22222222]22222]22222222222222222|
|33]]3]3333]33333]33333333]33333]3333333333333333|
|44444444444]44444]44444444]44444]444444444444444|
|5]5555555555555555]55555555555555]55555555555555|
|6666]66]]6666666666]66666666666666]6666666666666|
|777777777777]7777777]77777777777777]777777777777|
|]8888]888888]88888888]88888888888888]88888888888|
|999999999]999999999999]99999999999999]9999999999|
|________________________________________________|

Παράσταση των χαρακτήρων "HELLO, WORLD! ABCDEFGHIJKLM 0123456789" σε διάτρητη ταινία.

___________
| o  o.   |
| o   .o o|
| o  o.o  |
| o  o.o  |
| o  o.ooo|
|  o o.o  |
|  o  .   |
| o o .ooo|
| o  o.ooo|
| o o . o |
| o  o.o  |
| o   .o  |
|  o  .  o|
|  o  .   |
| o   .  o|
| o   . o |
| o   . oo|
| o   .o  |
| o   .o o|
| o   .oo |
| o   .ooo|
| o  o.   |
| o  o.  o|
| o  o. o |
| o  o. oo|
| o  o.o  |
| o  o.o o|
|  o  .   |
|  oo .   |
|  oo .  o|
|  oo . o |
|  oo . oo|
|  oo .o  |
|  oo .o o|
|  oo .oo |
|  oo .ooo|
|  ooo.   |
|  ooo.  o|
___________

Ιστορία αριθμητικών συστημάτων

Συστήματα παράστασης

Το δυαδικό σύστημα

Ακέραιοι αριθμοί

Μετατροπές

Πρόσθεση και πολλαπλασιασμός

Πρόσθεση

Ψηφίο 1Ψηφίο 2'AθροισμαΚρατούμενο
0000
0110
1010
1101

Παράδειγμα:

  1110
+10111
------
100101
Δηλαδή 11102 + 101112 = 1001012 ή 1410 + 2310 = 3710

Πολλαπλασιασμός

Παράδειγμα:
  1011
X   11
------
  1011
+1011
------
100001
Δηλαδή 10112 + 112 = 1000012 ή 1110 + 310 = 3310

Αρνητικοί αριθμοί και αφαίρεση

Αφαίρεση με το μέθοδο του συμπληρώματος

Παράδειγμα 1
X      = 4 - 3        <=>
X + 10 = 4 + (10 - 3) <=>
X + 10 = 4 + 7        <=>
X      = 4 + 7 - 10   <=>
X      = 11 - 10      <=>
X      = 1
Παράδειγμα 2
X       = 45 - 23         <=>
X + 100 = 45 + (100 - 23) <=>
X + 100 = 45 + 77         <=>
X       = 45 + 77 - 100   <=>
X       = 122 - 100       <=>
X       = 22
Η εύρεση του συμπληρώματος (complement) ως προς ένα ΒN (π.χ. 10 - 3 ή 100 - 23) και η απαλειφή του όρου ΒN στο τέλος είναι πράξεις εύκολες. Αν θεωρήσουμε πως όλοι οι αριθμοί μας είναι μικρότεροι από ΒN/2 και στο τέλος κάθε πράξης απαλείφουμε τον όποιο όρο ΒN τότε μπορούμε να παριστάνουμε τους αρνητικούς αριθμούς ως θετικούς με βάση το συμπλήρωμά τους από το ΒN (π.χ. το -3 ως 7 για ΒN = 101 ή το -23 ως 77 για ΒN = 102) και να κάνουμε πρόσθεση αντί για αφαίρεση.

Εύρεση του συμπληρώματος στο δυαδικό σύστημα

Παράδειγμα για τον αριθμό 01002 και ΒN = 24 (100002):
10000
-0100
-----
 1100
Στο δυαδικό σύστημα το αποτέλεσμα της αφαίρεσης του αριθμού Α από το ΒN (δηλαδή η παράσταση του -Α με το μέθοδο του συμπληρώματος) μπορεί να υπολογιστεί εύκολα με δύο ισοδύναμους τρόπους:
  1. Αντιστρέφουμε τα 0 σε 1 και 1 σε 0 και προσθέτουμε 1:
    0100 -> 1011
    1011 + 1 = 1100
    
  2. Αντιγράφουμε από δεξιά προς τα αριστερά όλα τα 0 και το πρώτο 1 και αντιστρέφουμε τα υπόλοιπα 0 σε 1 και 1 σε 0:
    0 -> 0 (αντιγραφή)
    0 -> 0 (αντιγραφή)
    1 -> 1 (αντιγραφή)
    0 -> 1 (αντιστροφή)
    

Παράδειγμα παράστασης

Για ΒN = 24 οι αριθμοί που μπορούν να παρασταθούν είναι οι -8...7:
 0 0000
 1 0001
 2 0010
 3 0011
 4 0100
 5 0101
 6 0110
 7 0111
-8 1000
-7 1001
-6 1010
-5 1011
-4 1100
-3 1101
-2 1110
-1 1111
Παρατηρούμε πως οι θετικοί αριθμοί έχουν ως πρώτο ψηφίο 0 και οι αρνητικοί αριθμοί έχουν ως πρώτο ψηφίο 1.

Παράδειγμα αφαίρεσης

Το αποτέλεσμα του 510 - 210 θα βρεθεί ως 0101 + 1110:
 0101
+1110
-----
10011
Με την απαλειφή του όρου 100002 το αποτέλεσμα είναι 112 δηλαδή 310.

Αριθμοί κινητής υποδιαστολής

Το πρότυπο IEEE-488

Ο τρόπος παράστασης του αριθμού κινητής υποδιαστολής μπορεί να διαφέρει σε πολλά σημεία από υπολογιστή σε υπολογιστή (μήκος σημαινόμενου και εκθέτη, παράσταση αρνητικού σημαινόμενου και εκθέτη, κανονικοποίηση του σημαινόμενου). Σήμερα οι περισσότεροι υπολογιστές παριστάνουν τους αριθμούς κινητής υποδιαστολής σύμφωνα με το πρότυπο IEEE-488. Για αριθμούς διπλής ακρίβειας π.χ. Έτσι ο αριθμός καταλαμβάνει συνολικά 64 bit:
Π ΕΕΕΕΕΕΕΕΕΕΕ ΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣ
Για παράδειγμα το π στο δυαδικό σύστημα εφράζεται ως:
11.0010 0100 0011 1111 0110 1010 1000 1000 1000 0101 1010 0011 0000 10.... και στο πρότυπο ΙΕΕΕ-488 με εκθέτη 1 (που παριστάνεται ως 1024) ως:
Π ΕΕΕΕΕΕΕΕΕΕΕ ΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣ
0 10000000000 1001001000011111101101010100010001000010110100011000

Προγράμματα

Συμπίεση δεδομένων

Για τη συμπίεση δεδομένων (data compression) χρησιμοποιούνται οι παρακάτω τρόποι: Εφαρμογές:

Ανίχνευση και διόρθωση λαθών

Έλεγχος λαθών

Διόρθωση λαθών

Απόσταση Hamming είναι ο αριθμός των bit κατά τον οποίο διαφέρουν δύο λέξεις.
Α	000000
Β	001111
Γ	010011
Δ	011100
Ε	100110
Ζ	101001
Θ	110101
Ι	111010
Αν η απόσταση είναι N μπορούμε να διαπιστώσουμε λάθη N-1 bit και να διορθώσουμε λάθη N-2 bit.

Βιβλιογραφία

Ασκήσεις

  1. Μετατρέψτε τους αριθμούς 15, -7 και 24 σε δυαδικό σύστημα 4 bit.
  2. Μετατρέψτε τους αριθμούς 1010 και 0101 από παράσταση 4 bit (με αρνητικούς) στο δεκαδικό σύστημα.
  3. Υπολογίστε 01101 + 01111. Μετατρέψτε τα στοιχεία και σε δεκαδικό σύστημα.
  4. Υπολογίστε 11010 + 11011. Θεωρήστε πως οι αριθμοί παριστάνουν αρνητικούς αριθμούς με τη μέθοδο του συμπληρώματος. Μετατρέψτε τα στοιχεία και σε δεκαδικό σύστημα.
  5. Υπολογίστε 1101 - 1. Μετατρέψτε τα στοιχεία και σε δεκαδικό σύστημα.
  6. Εκτελέστε την πράξη 12 - 7 στο δυαδικό σύστημα παριστάνοντας τον αρνητικό αριθμό με τη μέθοδο του συμπληρώματος.
  7. Υπολογίστε 1010 * 101. Εκτιμήστε (σε βήματα) το χρόνο που απαιτεί ο πολλαπλασιασμός σε σχέση με την πρόσθεση σε έναν ηλεκτρονικό υπολογιστή. Μπορεί να υπάρξει τρόπος ο πολλαπλασιασμός να εκτελεστεί ταχύτερα; Η πρόσθεση;
  8. Μετατρέψτε τους αριθμούς 53, -543 από το οκταδικό σύστημα στο δεκαεξαδικό.
  9. Εκφράστε τον αριθμό 262150 στο δυαδικό σύστημα. Με πόσα bit μπορεί να παρασταθεί ως βάση και εκθέτης του 2;
  10. Τι παριστάνουν οι παρακάτω δεκαεξαδικοί αριθμοί ως χαρακτήρες ASCII;
    22 41 74 68 65 6e 73 20 55 6e 69 76 65 72 73 69
    74 79 20 6f 66 20 45 63 6f 6e 6f 6d 69 63 73 20
    61 6e 64 20 42 75 73 69 6e 65 73 73 22 20 0d 0a
    
  11. Η μουσική σε CD ήχου αποθηκεύεται με ρυθμό 44.100 δείγματα των 16 bit ανά κανάλι ήχου και δευτερόλεπτο. Πόσος χώρος χρειάζεται για να αποθηκευτεί στερεοφωνική μουσική (δύο κανάλια ήχου) διάρκειας 74 λεπτών;
  12. Συμπιέστε την παρακάτω ακολουθία με βάση τις διαφορές ανάμεσα στους αριθμούς. Πόσα bit χρειάζονται για την ασυμπίεστη ακολουθία και πόσα για τη συμπισμένη;
    2
    5
    9
    12
    15
    20
    22
    18
    13
    7
    
  13. Με βάση τον πίνακα παράστασης χαρακτήρων που επιτρέπει τη διόρθωση
    Α	000000
    Β	001111
    Γ	010011
    Δ	011100
    Ε	100110
    Ζ	101001
    Θ	110101
    Ι	111010
    
    ποια λέξη παριστάνει η παρακάτω ακολουθία;
    001011
    001000
    011101
    101010
    101101
    100010
    

Παράρτημα: ο πίνακας ASCII

Ο παρακάτω πίνακας εμφανίζει τους χαρακτήρες του πίνακα ASCII που μπορούν να εμφανιστούν στην οθόνη μαζί με την τιμή τους σε δεκαεξαδικό σύστημα και την αντίστοιχη περιγραφή.
        20    Space
 !      21    Exclamation mark
 "      22    Quotation mark
 #      23    Number sign
 $      24    Dollar sign
 %      25    Percent sign
 &      26    Ampersand
 '      27    Apostrophe
 (      28    Left parenthesis
 )      29    Right parenthesis
 *      2a    Asterisk
 +      2b    Plus sign
 ,      2c    Comma
 -      2d    Hyphen-minus
 .      2e    Full stop
 /      2f    Solidus
 0      30    Digit zero
 1      31    Digit one
 2      32    Digit two
 3      33    Digit three
 4      34    Digit four
 5      35    Digit five
 6      36    Digit six
 7      37    Digit seven
 8      38    Digit eight
 9      39    Digit nine
 :      3a    Colon
 ;      3b    Semicolon
 <      3c    Less-than sign
 =      3d    Equals sign
 >      3e    Greater-than sign
 ?      3f    Question mark
 @      40    Commercial at (papaki)
 A      41    Latin capital letter a
 B      42    Latin capital letter b
 C      43    Latin capital letter c
 D      44    Latin capital letter d
 E      45    Latin capital letter e
 F      46    Latin capital letter f
 G      47    Latin capital letter g
 H      48    Latin capital letter h
 I      49    Latin capital letter i
 J      4a    Latin capital letter j
 K      4b    Latin capital letter k
 L      4c    Latin capital letter l
 M      4d    Latin capital letter m
 N      4e    Latin capital letter n
 O      4f    Latin capital letter o
 P      50    Latin capital letter p
 Q      51    Latin capital letter q
 R      52    Latin capital letter r
 S      53    Latin capital letter s
 T      54    Latin capital letter t
 U      55    Latin capital letter u
 V      56    Latin capital letter v
 W      57    Latin capital letter w
 X      58    Latin capital letter x
 Y      59    Latin capital letter y
 Z      5a    Latin capital letter z
 [      5b    Left square bracket
 \      5c    Reverse solidus
 ]      5d    Right square bracket
 '      5e    Circumflex accent
 _      5f    Low line
 `      60    Grave accent
 a      61    Latin small letter a
 b      62    Latin small letter b
 c      63    Latin small letter c
 d      64    Latin small letter d
 e      65    Latin small letter e
 f      66    Latin small letter f
 g      67    Latin small letter g
 h      68    Latin small letter h
 i      69    Latin small letter i
 j      6a    Latin small letter j
 k      6b    Latin small letter k
 l      6c    Latin small letter l
 m      6d    Latin small letter m
 n      6e    Latin small letter n
 o      6f    Latin small letter o
 p      70    Latin small letter p
 q      71    Latin small letter q
 r      72    Latin small letter r
 s      73    Latin small letter s
 t      74    Latin small letter t
 u      75    Latin small letter u
 v      76    Latin small letter v
 w      77    Latin small letter w
 x      78    Latin small letter x
 y      79    Latin small letter y
 z      7a    Latin small letter z
 {      7b    Left curly bracket
 |      7c    Vertical line
 }      7d    Right curly bracket
 ~      7e    Tilde

Παράρτημα: οι νεοελληνικοί χαρακτήρες στο πρότυπο Unicode

Ο παρακάτω πίνακας εμφανίζει τους νεοελληνικούς χαρακτήρες στο πρότυπο κωδικοποίησης Unicode μαζί με την τιμή τους σε δεκαεξαδικό σύστημα και την αντίστοιχη περιγραφή.
'Α  0386 Capital alpha with acute
 Έ  0388 Capital epsilon with acute
 Ή  0389 Capital eta with acute
 Ί  038a Capital iota with acute
 Ό  038c Capital omicron with acute
 Ύ  038e Capital upsilon with acute
 Ώ  038f Capital omega with acute
 ΐ  0390 Small iota with acute and diaeresis
 Α  0391 Capital alpha
 Β  0392 Capital beta
 Γ  0393 Capital gamma
 Δ  0394 Capital delta
 Ε  0395 Capital epsilon
 Ζ  0396 Capital zeta
 Η  0397 Capital eta
 Θ  0398 Capital theta
 Ι  0399 Capital iota
 Κ  039a Capital kappa
 Λ  039b Capital lamda
 Μ  039c Capital mu
 Ν  039d Capital nu
 Ξ  039e Capital xi
 Ο  039f Capital omicron
 Π  03a0 Capital pi
 Ρ  03a1 Capital rho
 Σ  03a3 Capital sigma
 Τ  03a4 Capital tau
 Υ  03a5 Capital upsilon
 Φ  03a6 Capital phi
 Χ  03a7 Capital chi
 Ψ  03a8 Capital psi
 Ω  03a9 Capital omega
 ϊ  03aa Capital iota with diaeresis
 ϋ  03ab Capital upsilon with diaeresis
 ά  03ac Small alpha with acute
 έ  03ad Small epsilon with acute
 ή  03ae Small eta with acute
 ί  03af Small iota with acute
 ΰ  03b0 Small upsilon with acute and diaeresis
 α  03b1 Small alpha
 β  03b2 Small beta
 γ  03b3 Small gamma
 δ  03b4 Small delta
 ε  03b5 Small epsilon
 ζ  03b6 Small zeta
 η  03b7 Small eta
 θ  03b8 Small theta
 ι  03b9 Small iota
 κ  03ba Small kappa
 λ  03bb Small lamda
 μ  03bc Small mu
 ν  03bd Small nu
 ξ  03be Small xi
 ο  03bf Small omicron
 π  03c0 Small pi
 ρ  03c1 Small rho
 ς  03c2 Small final sigma
 σ  03c3 Small sigma
 υ  03c4 Small tau
 υ  03c5 Small upsilon
 φ  03c6 Small phi
 χ  03c7 Small chi
 ψ  03c8 Small psi
 ω  03c9 Small omega
 ϊ  03ca Small iota with diaeresis
 ϋ  03cb Small upsilon with diaeresis
 ό  03cc Small omicron with acute
 ύ  03cd Small upsilon with acute
 ώ  03ce Small omega with acute

Δομικά στοιχεία υπολογιστών

Λογικές πύλες

Μερικές φορές θα συναντήσετε και παλαιότερα σύμβολα για τις ίδιες πύλες όπως αυτά που απεικονίζονται στο διάγραμμα που ακολουθεί:

Αθροιστές

Με βάση τις πύλες μπορούν να κατασκευστούν κυκλώματα που κάνουν υπολογισμούς.

Αριθμητική και λογική μονάδα

Η αριθμητική και λογική μονάδα (arithmetic and logical unit (ALU)) εκτελεί αριθμητικές και λογικές πράξεις ανάμεσα σε δύο τελεστέους.
Πράξεις που εκτελεί η ALU 74AS181


Υλοποίηση της ALU 74AS181

Δισταθή κυκλώματα

Τεχνολογία ημιαγωγών


Τεχνολογία CMOS 7S και έξι επιστρώματα χαλκού


Ο επεξεργαστής 750 της αρχιτεκτονικής IBM Power PC υλοποιημένος με την τεχνολογία χαλκού CMOS 7S


Πυρίτιο σε γερμάνιο (τομή)


Κύκλωμα κατασκευασμένο με την τεχνολογία πυριτίου σε μονωτικό υλικό (silicon on insulator (SOI)) σε ηλεκτρονικό μικροσκόπιο

Οι εικόνες προέρχονται από τον τόπο IBM Microelectronics Gallery (http://www.chips.ibm.com/gallery/index.html).

Τεχνολογία μνημών


Ακροδέκτες δυναμικής μνήμης 64M bit (16 M word * 4 bit)


Εσωτερική διάταξη της μνήμης


Κύκλος ανάγνωσης από δυναμική μνήμη

Μικροεπεξεργαστές

Η κεντρική μονάδα επεξεργασίας (Central Processing Unit) (ΚΜΕ (CPU)) αποτελείται από τις παρακάτω βασικές ενότητες: Η ΚΜΕ διαβάζει δεδομένα και εκτελεί εντολές από την κεντρική μνήμη του υπολογιστή. Υπάρχουν ΚΜΕ που περιέχουν και άλλα στοιχεία όπως μονάδες εισόδου / εξόδου για να επιτρέψουν την υλοποίηση υπολογιστών με λίγα δομικά στοιχεία. Οι πιο εξειδικευμένες από αυτές λέγονται μικροελεγκτές (microcontrolers).


Διάγραμμα εσωτερικής δομής και εξωτερικής επικοινωνίας του επεξεργαστή 16 bit (υψηλής ολοκλήρωσης για ενσωματωμένες εφαρμογές) 80186.

Προδιαγραφές και πηγές στο Internet

Βιβλιογραφία

Αλληλεπίδραση με πύλες

No support for JDK 1.2 applets found! </comment>

Ασκήσεις

  1. Σχεδιάστε με τη χρήση πυλών NAND (Negative AND) τις παρακάτω πύλες:
  2. Σχεδιάστε έναν αθροιστή 2 bit.
  3. Πόσες πύλες AND, OR, NOT χρειάζονται για την κατασκευή ενός αθροιστή 32 bit; Αν για την κατασκευή κάθε πύλης AND και OR χρειάζονται δύο τρανζίστορ και για κάθε πύλη NOT ένα, πόσα τρανζίστορ χρειάζονται για την κατασκευή του αθροιστή 32 bit;
  4. Σχεδιάστε με τη βοήθεια δισταθών κυκλωμάτων έναν μετρητή 3 bit.
  5. Ο επεξεργαστής Alpha DECchip 21064 περιέχει 1.680.000 τρανζίστορ σε chip διαστάσεων 1.4 x 1.7 cm. Υπολογίστε κατά προσέγγιση τις διαστάσεις ενός τρανζίστορ.

Βασικά στοιχεία αρχιτεκτονικής

Δομή ενός υπολογιστή


Κεντρική μονάδα επεξεργασίας


O κύκλος εντολών

  1. Ανάκληση εντολής (Instruction fetch)
  2. Αποκωδικοποίηση εντολής (Instruction decode)
  3. Εκτέλεση εντολής (Instruction execution)
  4. Πρόσβαση μνήμης (Memory access)
  5. Εγγραφή

Κύρια μνήμη


Περιφερειακή μνήμη


Μονάδα σκληρού δίσκου


Μονάδα ταινίας

Συσκευές εισόδου


Συσκευές εξόδου


Καθοδικός σωλήνας


Σχεδιογράφος

Συσκευές επικοινωνίας


MODEM


Τερματισμός οπτικών ινών

Βιβλιογραφία

Ασκήσεις

Προγραμματισμός σε επίπεδο μηχανής

Οικογένειες επεξεργαστών

Οικογένειες επεξεργαστών

Η αρχιτεκτονική εντολών ενός επεξεργαστή σχεδιάζεται γύρω από τους παρακάτω άξονες:

Η οικογένεια επεξεργαστών iAPX86

Φωτογραφίες

Οι παρακάτω φωτογραφίες προέρχονται από το δικτυακό τόπο της Intel (http://www.intel.com/intel/intelis/museum/exhibit/hist_micro/hof/hof_main.htm>). Προσοχή, δεν είναι στην ίδια κλίμακα!


8080


8086/8088


80286


80486


Pentium


Pentium II


Pentium III


Pentium 4

Καταχωρητές

Προσδιορισμός τελεστέων

Συνδιασμοί τελεστών:

Ενδείκτης διακλάδωσης

CF:
(Carry flag)
Κρατούμενο (Carry):
1 αν η πράξη δημιούργησε κρατούμενο.
ZF:
(Zero flag)
Μηδέν:
1 αν το αποτέλεσμα της πράξης είναι 0.
SF:
(Sign flag)
Πρόσημο (sign)
1 αν το αποτέλεσμα είναι αρνητικός αριθμός.
PF:
(Parity flag)
Ισοτιμία
1 αν το αποτέλεσμα έχει μονό αριθμό από bit που είναι 1.
OF:
(Overflow flag)
Υπερχείλιση:
1 αν το αποτέλεσμα δε μπορεί να παρασταθεί ως θετικός η αρνητικός αριθμός.

Εντολές μεταφοράς δεδομένων

MOV προορισμός, πηγή
(Move)
Μεταφορά
προορισμός <- πηγή
PUSH πηγή
Μεταφορά στη στοίβα
SP <- SP - 2
[SP] <- πηγή
POP προορισμός
Μεταφορά από τη στοίβα
προορισμός <- [SP]
SP <- SP + 2
XCHG προορισμός, πηγή
(Exchange)
Εναλλαγή
προορισμός <- πηγή
πηγή <- προορισμός
(ταυτόχρονα)

Αριθμητικές εντολές

ADD προορισμός, πηγή
(Add)
Πρόσθεση
προορισμός <- προορισμός + πηγή
INC προορισμός
(Increment)
Αύξηση κατά ένα
προορισμός <- προορισμός + 1
SUB προορισμός, πηγή
(Subtract)
Αφαίρεση
προορισμός <- προορισμός - πηγή
DEC προορισμός
(Decrement)
Μείωση κατά ένα
προορισμός <- προορισμός - 1
NEG προορισμός
(Negate)
Αλλαγή προσήμου
προορισμός <- - προορισμός
CMP προορισμός, πηγή
(Compare)
Σύγκριση
Εκτελείται η πράξη προορισμός - πηγή και ενημερώνονται οι ενδείκτες διακλάδωσης.
MUL πηγή
(Multiply)
Πολλαπλασιασμός
DX:AX <- AX * πηγή
DIV πηγή
(Divide)
Διαίρεση
AX <- AX / πηγή
DX <- AX mod πηγή

Εντολές δυαδικών ψηφίων

AND προορισμός, πηγή
Σύζευξη
προορισμός <- προορισμός & πηγή
OR προορισμός, πηγή
Διάζευξη
προορισμός <- προορισμός | πηγή
XOR προορισμός, πηγή
Αποκλειστική διάζευξη
προορισμός <- προορισμός ^ πηγή
NOT προορισμός
Αντιστροφή
προορισμός <- ~ προορισμός
TEST προορισμός, πηγή
Έλεγχος
SHL προορισμός, αριθμός
(Shift left)
Ολίσθηση (Shift) αριστερά
προορισμός <- προορισμός << πηγή
SHR προορισμός, αριθμός
(Shift right)
Ολίσθηση δεξιά
προορισμός <- προορισμός >> πηγή
SAR προορισμός, αριθμός
(Shift arithmetic right)
Αριθμητική ολίσθηση δεξιά
προορισμός <- προορισμός >> πηγή
ROL προορισμός, αριθμός
(Rotate left)
Περιστροφή αριστερά
ROR προορισμός, αριθμός
(Rotate right)
Περιστροφή δεξιά

Εντολές άλματος

JMP προορισμός
'Αλμα
CALL προορισμός
Κλήση
RET
(Return)
Επιστροφή
JA/JNBE προορισμός
(Jump above)
'Αλμα αν μεγαλύτερο (χωρίς πρόσημο)
JAE/JNB προορισμός
(Jump above or equal)
'Αλμα αν μεγαλύτερο ή ίσο (χωρίς πρόσημο)
JB/JNAE προορισμός
(Jump bellow)
'Αλμα αν μικρότερο (χωρίς πρόσημο)
JBE/JNA προορισμός
(Jump below or equal)
'Αλμα αν μικρότερο ή ίσο (χωρίς πρόσημο)
JC προορισμός
(Jump carry)
'Αλμα αν κρατούμενο
JNC προορισμός
(Jump no carry)
'Αλμα αν όχι κρατούμενο
JE/JZ προορισμός
(Jump equal)
'Αλμα αν ίσο
JNE/JNZ προορισμός
(Jump not equal)
'Αλμα αν όχι ίσο
JG/JNLE προορισμός
(Jump greater)
'Αλμα αν μεγαλύτερο (με πρόσημο)
JGE/JNL προορισμός
(Jump greater or equal)
'Αλμα αν μεγαλύτερο ή ίσο (με πρόσημο)
JL/JNGE προορισμός
(Jump less)
'Αλμα αν μικρότερο (με πρόσημο)
JLE/JNG προορισμός
(Jump less or equal)
'Αλμα αν μικρότερο ή ίσο (με πρόσημο)
JO προορισμός
(Jump overflow)
'Αλμα αν υπερχείλιση
JNO προορισμός
(Jump no overflow)
'Αλμα αν όχι υπερχείλιση
JS προορισμός
(Jump sign)
'Αλμα αν πρόσημο
JNS προορισμός
(Jump no sign)
'Αλμα αν όχι πρόσημο

Παράσταση εντολών

Κωδικοποίηση εντολών σε επεξεργαστές της Intel


Βασική κωδικοποίηση εντολών


Κωδικοποίηση εντολών ενός byte


Το byte ModR/M προσδιορίζει τις διευθύνσεις των εντολών


Το byte SIB (scale, index, base) επιτρέπει τον ορθόγωνο προσδιορισμό κλίμακας, δείκτη και βάσης.

Βιβλιογραφία

Ασκήσεις

Εργαστηριακές ασκήσεις

1. Αθροίζοντας αριθμούς

  1. Ανοίξτε παράθυρο εντολών (run - command) ή φορτώστε το λειτουργικό σύστημα MS-DOS
  2. Δώστε την εντολή debug
    C:>debug
    
  3. Δώστε την εντολή Α (assemble)
    -a
    
  4. Γράψτε τις συμβολικές εντολές (mov ax, 0) κλπ. Οι διευθύνσεις μνήμης εμφανίζονται μόνες τους. Τα σχόλια που ακολουθούν το ; δε χρειάζεται να γραφούν.
    0C20:0100 mov ax,0		; Βάλε (move) στον καταχωρητή ΑΧ την τιμή 0
    0C20:0103 mov bx,0		; Βάλε (move) στον καταχωρητή ΒΧ την τιμή 0 
    0C20:0106 add bx, ax		; Πρόσθεσε στον ΒΧ τον ΑΧ
    0C20:0108 inc ax		; Αύξησε (increment) τον ΑΧ κατά 1
    0C20:0109 cmp ax, a		; Σύγκρινε (compare) τον ΑΧ με το 10
    0C20:010C jbe 106		; 'Αλμα αν το αποτέλεσμα είναι μικρότερο ή ίσο (jump below or equal) στη διεύθυνση 106
    0C20:010E int 3			; Διακοπή της λειτουργίας
    0C20:010F			; Πατήστε ENTER εδώ
    
  5. Δείτε την κωδικοποίηση των εντολών με την εντολή U (unassemble):
    -u100
    Διεύθυνση Κωδικοποίηση  Συμβολική εντολή
    0C20:0100 B80000        MOV     AX,0000
    0C20:0103 BB0000        MOV     BX,0000
    0C20:0106 01C3          ADD     BX,AX
    0C20:0108 40            INC     AX
    0C20:0109 3D0A00        CMP     AX,000A
    0C20:010C 76F8          JBE     0106
    0C20:010E CC            INT     3
    
  6. Εκτελέστε το πρόγραμμά σας και εξετάστε το αποτέλεσμα στον καταχωρητή ΒΧ. Είναι αυτό που περιμένατε;
    -g=100
    
    AX=000B  BX=0037  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C20  ES=0C20  SS=0C20  CS=0C20  IP=010E   NV UP EI PL NZ NA PO NC
    0C20:010E CC            INT     3
    
  7. Εκτελέστε το πρόγραμμά σας βήμα βήμα με την εντολή T (trace):
    -t=100
    AX=0000  BX=0000  CX=0000  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    Καταχωρητές
    
    DS=0C1C  ES=0C1C  SS=0C1C  CS=0C1C  IP=0103   NV UP EI PL ZR NA PE NC
                                        ^^^^^^^   ^^^^^^^^^^^^^^^^^^^^^^^
    				    |         Ενδείκτες διακλάδωσης
    				    Μετρητής προγράμματος
    
    0C1C:0103 BB0000        MOV     BX,0000
         ^^^^               ^^^^^^^^^^^^^^^
         Διεύθυνση μνήμης   Επόμενη εντολή που θα εκτελεστεί
    -t
    
    AX=0000  BX=0000  CX=0000  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C1C  ES=0C1C  SS=0C1C  CS=0C1C  IP=0106   NV UP EI PL ZR NA PE NC
    0C1C:0106 01D8          ADD     AX,BX
    -t
    
    AX=0000  BX=0000  CX=0000  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C1C  ES=0C1C  SS=0C1C  CS=0C1C  IP=0108   NV UP EI PL ZR NA PE NC
    0C1C:0108 40            INC     AX
    -t
    
    AX=0001  BX=0000  CX=0000  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C1C  ES=0C1C  SS=0C1C  CS=0C1C  IP=0109   NV UP EI PL NZ NA PO NC
    0C1C:0109 3D0A00        CMP     AX,000A
    -t
    
    AX=0001  BX=0000  CX=0000  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C1C  ES=0C1C  SS=0C1C  CS=0C1C  IP=010C   NV UP EI NG NZ AC PO CY
    0C1C:010C 76F8          JBE     0106
    -t
    
    AX=0001  BX=0000  CX=0000  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C1C  ES=0C1C  SS=0C1C  CS=0C1C  IP=0106   NV UP EI NG NZ AC PO CY
    0C1C:0106 01D8          ADD     AX,BX
    
    ...
    
  8. Αυξήστε το όριο της άθροισης από 10 σε 100:
    -a109
    0C20:0109 cmp ax, 64		; Σύγκρινε τον καταχωρητή ΑΧ με το 100
    0C20:010C			; Πατήστε ENTER εδώ
    -g=100
    
  9. Εκτελέστε το πρόγραμμά σας και εξετάστε το αποτέλεσμα στον καταχωρητή ΒΧ. Είναι αυτό που περιμένατε;
    AX=0065  BX=13BA  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C20  ES=0C20  SS=0C20  CS=0C20  IP=010E   NV UP EI PL NZ NA PO NC
    0C20:010E CC            INT     3
    
  10. Βγήτε από το πρόγραμμα debug
    -q
    C:>
    

2. Εμφάνιση των χαρακτήρων του πίνακα ASCII

  1. Γράψτε το πρόγραμμα:
    C:\>debug
    -a
    0C1C:0100 mov dl,20		; Πρώτος χαρακτήρας ASCII (το κενό)
    0C1C:0102 mov ah,2		; Εντολή για εμφάνιση του χαρακτήρα στην οθόνη
    0C1C:0104 int 21		; Εκτέλεση της εντολής του DOS
    0C1C:0106 add dl,1		; Αύξησε το χαρακτήρα κατά 1
    0C1C:0109 cmp dl,80		; Είναι ο τελευταίος; (128)
    0C1C:010C jne 102		; Αν όχι πήγαινε στη διεύθυνση 102 (jump not equal)
    0C1C:010E int 3			; Διακοπή του προγράμματος
    0C1C:010F			; Πατήστε ENTER εδώ
    
  2. Δείτε την κωδικοποίηση των εντολών με την εντολή U (unassemble):
    -u100
    0C1C:0100 B220          MOV     DL,20
    0C1C:0102 B402          MOV     AH,02
    0C1C:0104 CD21          INT     21
    0C1C:0106 80C201        ADD     DL,01
    0C1C:0109 80FA80        CMP     DL,80
    0C1C:010C 75F4          JNZ     0102
    0C1C:010E CC            INT     3
    
  3. Εκτελέστε το πρόγραμμά σας και δείτε το αποτέλεσμα στην οθόνη σας.
    -g=100
     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno
    pqrstuvwxyz{|}~¦
    AX=027F  BX=0000  CX=0000  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C1C  ES=0C1C  SS=0C1C  CS=0C1C  IP=010E   NV UP EI PL ZR NA PE NC
    0C1C:010E CC            INT     3
    

3. Συνεχίζοντας

Δοκιμάστε να γράψετε και να εκτελέσετε και άλλα μικρά προγράμματα ή παραλλαγές αυτών που γράψατε.

Παράδειγμα κύκλου εντολών

Το πρόγραμμα

Διεύθυνση Κωδικός εντολής   Συμβολική παράσταση εντολής
     0100 B80100            MOV     AX,0001
     0103 050400            ADD     AX,0004
     0106 A31000            MOV     [0010],AX
     0109 3D0500            CMP     AX,0000
     010C 74F2              JZ      0100

Ο κύκλος των εντολών (επανάληψη)

  1. Ανάκληση εντολής (Instruction fetch)
  2. Αποκωδικοποίηση εντολής (Instruction decode)
  3. Εκτέλεση εντολής (Instruction execution)
  4. Πρόσβαση μνήμης (Memory access)
  5. Εγγραφή
Ο τρόπος που θα εκτελεστούν οι παραπάνω εντολές από την ΚΜΕ σύμφωνα με το κύκλο των εντολών είναι ο εξής:

0100 B80100 MOV AX,0001

ΜΠΚΔιΜΚΔεΜΚΕΑΧΑBΓ
Ανάκληση100100-B80100----
Αποκωδικοποίηση103100-B80100-0001--
Εκτέλεση103100-B80100-0001-0001
Εγγραφή103100-B8010000010001-0001

0103 050400 ADD AX,0004

ΜΠΚΔιΜΚΔεΜΚΕΑΧΑBΓ
Ανάκληση103103-0504000001---
Αποκωδικοποίηση106103-050400000100010004-
Εκτέλεση106103-0504000001000100040005
Εγγραφή106103-0504000005000100040005

0106 A31000 MOV [0010],AX

ΜΠΚΔιΜΚΔεΜΚΕΑΧΑBΓ
Ανάκληση106106-A310000005---
Αποκωδικοποίηση109106-A31000000500000010-
Εκτέλεση10900100005A310000005000000100010
Πρόσβαση μνήμης10900100005A310000005000000100010

0109 3D0500 CMP AX,0005

ΜΠΚΔιΜΚΔεΜΚΕΑΧΑBΓ
Ανάκληση109109-3D05000005---
Αποκωδικοποίηση10C109-3D0500000500050005-
Εκτέλεση10C109-3D05000005000500050000

010C 74F2 JZ 0100

ΜΠΚΔιΜΚΔεΜΚΕΑΧΑBΓ
Ανάκληση10C10C-74F20005---
Αποκωδικοποίηση10E10C-74F20005010EFFF2-
Εκτέλεση10E10C000574F20005010EFFF20100
Πρόσβαση μνήμης10010C000574F20005010EFFF20010

Λειτουργικά συστήματα

Ορισμός και λειτουργίες

Το λειτουργικό σύστημα (operating system) είναι το βασικό πρόγραμμα συστήματος ενός ηλεκτρονικού υπολογιστή. Ελέγχει τη διαχείριση των πόρων του υπολογιστή και θέτει τα θεμέλεια για τη λειτουργία των προγραμμάτων εφαρμογών.

Βασικά στοιχεία

Διεργασίες

Είσοδος και έξοδος στοιχείων

Διαχείριση μνήμης

Σύστημα αρχείων

Βιβλιογραφία

Ασκήσεις

Δίκτυα δεδομένων, το διαδίκτυο, εφαρμογές

Εισαγωγή, το μοντέλο αναφοράς OSI

Φυσικό επίπεδο

Επίπεδο σύνδεσης

Επίπεδο δικτύου

Επίπεδο μεταφοράς

Επίπεδο συνόδου

Επίπεδο παρουσίασης

Επίπεδο εφαρμογής

Τα πρωτόκολλα του Internet

Εφαρμογή

Το επίπεδο εφαρμογής στο Internet καλύπτει τα επίπεδα εφαρμογής και παρουσίασης του OSI. Τα πιο συχνά πρωτόκολλα που χρησιμοποιούνται από τους χρήστες είναι:
Telnet
χρήση από απόσταση
FTP
μεταφορά αρχείων
SMTP
μεταφορά email
POP/IMAP
ανάγνωση email
HTTP/HTML
πρόσβαση στο Web

Μια σειρά από πρωτόκολλα στο επίπεδο αυτό υποστηρίζουν τη λειτουργία και τη διαχείριση του δικτύου:

DNS
Κατανεμημένος κατάλογος ονομάτων
SNMP
Διαχείριση από απόσταση
BOOTP
Αρχικό φόρτωμα κώδικα
RARP
Αντίστροφη μετατροπή διευθύνσεων

Μεταφορά

Στο επίπεδο της μεταφοράς χρησιμοποιούνται δύο πρωτόκολλα:
TCP
Transmission Control Protocol
UDP
User Datagram Protoco

Δίκτυο

Στο επίπεδο του δικτύου το Internet Protocol (IP) μαζί με το Internet Control Message Protocol εξασφαλίζουν τη μεταφορά δεδομένων από τον αποστολέα στον παραλήπτη. Το παρακάτω σχήμα παριστάνει τη σχέση ανάμεσα στα διάφορα πρωτόκολλα του internet:
                                    
	 +------+ +-----+ +-----+     +-----+  
	 |Telnet| | FTP | | TFTP| ... | ... |  
	 +------+ +-----+ +-----+     +-----+  
	       |   |         |           |     
	      +-----+     +-----+     +-----+  
	      | TCP |     | UDP | ... | ... |  
	      +-----+     +-----+     +-----+  
		 |           |           |     
	      +--------------------------+----+
	      |    Internet Protocol & ICMP   |
	      +--------------------------+----+
			     |                 
		+---------------------------+  
		|   Local Network Protocol  |  
		+---------------------------+  
Σημείωση: Τα σχήματα της ενότητας αυτής προέρχονται από τα έντυπα RFC που αναφέρονται στη βιβλιογραφία.

IP

Πακέτα στο επίπεδο του δικτύου internet έχουν την παρακάτω μορφή:
    0                   1                   2                   3   
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Version|  IHL  |Type of Service|          Total Length         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         Identification        |Flags|      Fragment Offset    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Time to Live |    Protocol   |         Header Checksum       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Source Address                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Destination Address                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Options                    |    Padding    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Οι διευθύνσεις αποστολέα και παραλήπτη περιγράφονται με 32 bit που παριστάνονται για ευκολία με 4 δεκαδικούς αριθμούς (π.χ. 192.168.135.4). Ένας αρχικός αριθμός από bit (π.χ. 24) παριστάνει το δίκτυο στο οποίο ανήκει ένας συγκεκρικένος υπολογιστής, ενώ τα υπόλοιπα ξεχωρίζουν τον υπολογιστή από τους υπόλοιπους στο ίδιο δίκτυο.

TCP

Το πρωτόκολλο TCP (Transmission Control Protocol) επιτρέπει τη σύνδεση δύο διεργασιών και τη μεταξύ τους επικοινωνία. Το TCP θεωρεί ότι το δίκτυο στο οποίο βασίζεται παρέχει τη δυνατότητα μεταφοράς πακέτων χωρίς εγγυήσεις σχετικά με τη σειρά που θα παραδοθούν, την απώλεια πακέτων ή τη διπλή παράδοσή τους. Πάνω από ένα τέτοιο δίκτυο το TCP παρέχει αξιόπιστη μεταφορά δεδομένων. Οι βασικές υπηρεσίες που παρέχει το TCP είναι οι παρακάτω: Η μορφή της επικεφαλίδας του TCP είναι η παρακάτω:
    0                   1                   2                   3   
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Source Port          |       Destination Port        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Sequence Number                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Acknowledgment Number                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Data |           |U|A|P|R|S|F|                               |
   | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
   |       |           |G|K|H|T|N|N|                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Checksum            |         Urgent Pointer        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Options                    |    Padding    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Τα bit URG...FIN έχουν τους παρακάτω ρόλους:
URG
Το πεδίο Urgent Pointer περιέχει δεδομένα
ACK
Το πεδίο Acknowledgment περιέχει δεδομένα
PSH
Λειτουργία Push
RST
Επαναρύθμιση της σύνδεσης
SYN
Συγχρονισμός των αριθμών της σειράς
FIN
Δεν υπάρχουν άλλα δεδομένα από τον αποστολέα

Αρχιτεκτονική του παγκόσμιου ιστού

Προσδιορισμός στοιχείων με URI

Ο προσδιορισμός στοιχείων στο Web γίνεται με τη χρήση των Uniform Resource Locators. Διακρίνονται σε απόλυτα (π.χ. http://www.amazon.com) και σχετικά (π.χ. info.gif). Αποτελούνται από Η χρήση τους επιτρέπει τον προσδιορισμό άλλων σελίδων τοπικά, σε άλλα μηχανήματα, καθώς και ερωτήσεων:
    http://www.spinellis.gr/
index.html
http://sourceforge.net/softwaremap/trove_list.php?form_cat=187&discrim=165

Το πρωτόκολλο HTTP

Το πρωτόκολλο HTTP υποστηρίζει τις παρακάτω μεθόδους επικοινωνίας: Παράδειγμα:
GET /pub/WWW/TheProject.html HTTP/1.1
Host: www.w3.org

Περιγραφή σελίδων με HTML

H HTML είναι μια εφαρμογή της SGML για την περιγραφή σελίδων στο Web. Περιοχές του κειμένου σημειώνονται με ετικέτες (tags). Κάθε ετικέτα περιλαμβάνει το όνομά της και παραμέτρους. Οι ετικέτες γράφονται ως εξής:
<όνομα ετικέτας παράμετροι>
Μια περιοχή του κειμένου μπορεί να σημειωθεί ως εξής:
<ετικέτα>
περιοχή που σημειώνεται
</ετικέτα>
Βασικές ετικέτες που υποστηρίζει η HTML είναι οι παρακάτω:
HTML
περιγραφή ολόκληρης σελίδας
HEAD
επικεφαλίδα της σελίδας
BODY
κείμενο της σελίδας
H1-H6
επικεφαλίδες του κειμένου
P
αλλαγή παραγράφου
UL
λίστα με τελείες
OL
αριθμημένη λίστας
LI
στοιχείο λίστας
BR
αλλαγή γραμμής
HR
οριζόντια γραμμή
IMG
εικόνα
A
(anchor) σημείο πρόσβασης από ή σε υπερκείμενο
PRE
προστοιχειοθετημένο κείμενο
DL, DT, DD
λίστα περιγραφών, περιγραφές
I
πλάγιοι χαρακτήρες
B
έντονοι χαρακτήρες
Παράδειγμα σελίδας:
<!doctype html public "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<TITLE>Τίτλος της σελίδας</title>

<META NAME="GENERATOR" CONTENT="thread.pl">
<META NAME="AUTHOR" CONTENT="Diomidis Spinellis">
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=ISO-8859-7">
<LINK REV="made" HREF="mailto:dspin@aegean.gr"> 
<LINK REL="ToC" href="./web/index.htm">
<LINK REV="Subdocument" href="./web/index.htm">
<LINK REL="previous" href="./web/http.htm">
<LINK REL="next" href="./web/cgi.htm">

</HEAD>

<BODY> <H1>Επικεφαλίδα πρώτου επιπέδου</H1><HR>
Κείμενο που περιέχει ένα σημείο κατάληξης υπερκειμένου
<a name="G42"> (<em>με έντονο κείμενο</em>)</a> 
και μια λίστα:
<ul>
<li> στοιχείο 1
<li> στοιχείο 2
</ul>

<p>
Νέα παράγραφος με ένωση υπερκειμένου στο
<A HREF="http://www.aueb.gr">Οικονομικό Πανεπιστήμιο Αθηνών</A>

<HR>
</BODY>

</HTML>

Ενεργό περιεχόμενο

Υπάρχουν διάφορες τεχνολογίες για να εμφανίσουμε ενεργό περιεχόμενο (active content) στο Web όπως: Προγράμματα που χρησιμοποιούν τις τεχνολογίες αυτές δημιουργούν δυναμικά τις σελίδες HTML ανάλογα με τα στοιχεία του χρήστη.

Αναζήτηση πληροφοριών στον παγκόσμιο ιστό

Οι σελίδες στον παγκόσμιο ιστό μετριούνται σε εκατομμύρια. Για την αποδοτική χρήση τους χρησιμοποιούμε διάφορες προσεγγίσεις.

Ασκήσεις

Δίκτυα δεδομένων

  1. Ποια είναι τα επίπεδα του προτύπου OSI; Γράψτε ένα παράδειγμα τεχνολογίας για το κάθε επίπεδο.
  2. Πως μετατρέπεται ένα όνομα όπως www.slashdot.org σε διεύθυνση του Internet;
  3. Σε τι διαφέρει το πρότυπο HTTP από το πρότυπο HTML;
  4. Πως μπορεί η ίδια σελίδα του ιστού (π.χ. http://www.amazon.com) να εμφανίζεται με διαφορετικά στοιχεία σε διαφορετικούς χρήστες;
  5. Εκτιμήστε τον αριθμό των μηχανημάτων και των σελίδων web που υπάρχουν σήμερα στο Internet. Ξεκινήστε από στοιχεία που ξέρετε για εσάς, τους συμφοιτητές σας και τη σχολή.

Εργαστηριακή άσκηση

Κατασκευάστε την προσωπική σας σελίδα σε HTML

  1. Φορτώστε τη σελίδα αυτή στον Internet Explorer και δώστε την εντολή View - Source για να δείτε το περιεχόμενό της.
  2. Φυλάξτε τη σελίδα αυτή στον προσωπικό σας φάκελα με την εντολή File - Save As.
  3. Ξεκινήστε το πρόγραμμα Notepad (Start - Programs - Accessories - Notepad).
  4. Φορτώστε τη σελίδα που φυλάξατε στο προηγούμενο βήμα (File - Open).
  5. Αλλάξτε στοιχεία της σελίδας έτσι ώστε να μοιάζει με το πως θα θέλατε να είναι η προσωπική σας σελίδα. Προσθέστε λίγα λόγια για τον εαυτό σας, τους δικούς σας δεσμούς (http://www.slashdot.org) υπερκειμένου ή και εικόνες από αγαπημένες σας δραστηριότητες. Μπορείτε να αναζητήσετε φωτογραφίες με τη μηχανή αναζήτησης Google (http://www.google.com). Μπορείτε να διαβάσετε πληροφορίες για τις εντολές της HTML από τον τόπο http://www.w3schools.com/html/ (http://www.w3schools.com/html/) ή το αντίστοιχο πρότυπο (http://www.ietf.org/rfc/rfc1866.txt) καθώς και από άλλους τόπους στο διαδίκτυο. Μην αλλάξετε στοιχεία που δεν ξέρετε τι κάνουν.
  6. Φυλάξτε τη νέα σελίδα με την εντολή File - Save.
  7. Φορτώστε τη σελίδα στον Internet Explorer με την εντολή File - Open - Browse.
  8. Όταν κάνετε αλλαγές στη σελίδα μπορείτε να τις δείτε στον Explorer με την εντολή View - Refresh.
Καλή διασκέδαση!

Βιβλιογραφία

Αλγόριθμοι, δεδομένα και διαδικασίες

Ορισμός

Αλγόριθμος (algorithm) είναι μια διαδικασία που επεξεργαζόμενη ορισμένα στοιχεία με πεπερασμένο αριθμό βημάτων παράγει ένα συγκεκριμένο επιθυμητό αποτέλεσμα. Κάθε βήμα της διαδικασίας αποτελείται από μονοσήμαντα εκτελέσιμες πράξεις.

Εύρεση ν!

Παραγοντικό του Ν στο Χ

Πριν: Ν: φυσικός αριθμός
Μετά: Χ = Ν!
Είσοδος:
   Ν : Φυσικός αριθμός

Εξοδος:
   Χ : Φυσικός αριθμός

Κ : Φυσικός αριθμός

Χ <- 1
Κ <- Ν
Οσο Κ > 0
    Χ <- Χ * Κ
    Κ <- Κ - 1
Τέλος (όσο)

Ψευδοκώδικας

Ο ψευδοκώδικας (pseudocode) επιτρέπει την περιγραφή των αλγορίθμων.
Στοιχεία εισόδου, εξόδου και μεταβλητές
Είσοδος:
πλευρά_α, πλευρά_β, πλευρά_γ : Φυσικός αριθμός

Εξοδος:
εμβαδό : Φυσικός αριθμός

αριθμός_πλακών : Φυσικός αριθμός
συνολικό_βάρος : Πραγματικός αριθμός
είναι_ισοσκελές : Λογική τιμή
Προϋποθέσεις και μετά-συνθήκες
Πριν: Ν Φυσικός αριθμός
Μετά: Χ = Ν!
Εκχωρήσεις
ύψος <- συν(κλίση) * πλευρά
μέσο <- ύψος / 2
Βρόχοι
Οσο υπόλοιπο_χρημάτων > 0
   δώσε_χαρτονόμισμα
Τέλος (όσο)

Επανάλαβε
  μείωσε_αέρα
Οσο στροφές_κινητήρα < 900

Για πάντα
  έλεγξε_παραμέτρους_λειτουργίας_εργοστασίου
Τέλος (για πάντα)
Αποφάσεις
Αν ζωές_παίκτη > 0 Τότε
  ξεκίνα_νέο_παιγνίδι
Αλλιώς
  εμφάνισε "Game Over"
Τέλος (Αν)

Αν στροφές > 8700 Τότε
  διάκοψε_την_τροφοδοσία
Τέλος (Αν)

Αν ομάδα ΠΑΟ Τότε
  χρώμα <- πράσινο
Αλλιώς Αν ομάδα Ολυμπιακός Τότε
  χρώμα <- κόκκινο
Αλλιώς Αν ομάδα ΑΕΚ Τότε
  χρώμα <- κίτρινο
Τέλος (Αν)

Γλώσσες προγραμματισμού

Γλώσσα μηχανής

89 D9 
B8 01 00 
83 F9 00 
74 05 
F7 E1 
49 
EB F6

Συμβολική γλώσσα

; Παραγοντικό του BX στο AX
        MOV  CXBX             ; Μετρητής στο CX
        MOV  AX1              ; Αρχική τιμή 1
LOOP:   CMP  CX0              ; Τέλος;
        JZ   DONE               ; Ναι, έξοδος
        MUL  CX                 ; Όχι, πολλαπλασίασε ΑΧ με CX
        DEC  CX                 ; Επόμενη τιμή του CX
        JMP  LOOP               ; Πίσω στο βρόχο
DONE:

Fortran 77

C Return factorial of N
C
      FUNCTION IFACTORIAL(N)
      INTEGER N
      INTEGER IFACTORIAL
      INTEGER IRESULT, I

      IRESULT = 1
      DO I = 1, N
        IRESULT = IRESULT * I
      END DO
      IFACTORIAL = IRESULT

      END

Fortran 95

! Return factorial of n
function factorial(n) result (nfac)
        integerintent(in) :: n
        integer :: factorial
        integer :: i

        nfac = 1
        do i = 1, n
                nfac = nfac * i
        end do
end function factorial

C

/* Παραγοντικό */
int
factorial(int n)
{
        int result;
        int count;

        count = n;
        result = 1;
        while (count > 0) {
                result = result * count;
                count = count - 1;
        }
        return (result);
}

/* Παραγοντικό (με λιγότερες εντολές) */
int
factorial(int n)
{
        int result = 1;

        for (; n; n--)
                result *= n;
        return (result);
}

Prolog

factorial(0, 1).

% To N_Factorial είναι ισοδύναμο με Ν!
factorial(N, N_Factorial) :-
        N > 0,
        M is N - 1,
        factorial(M, M_Factorial),
        N_Factorial is M_Factorial * N.

Lisp

;; Επιστρέφει το παραγοντικό του n
(define (factorial n)
  (if (= n 1)
    1
    (* n (factorial (- n 1)))))

Basic

500 REM Return factorial of N in variable FACT
510 FACT = 1
520 FOR I = 1 TO N
530 FACT = FACT * I
540 NEXT I
550 RETURN

Visual Basic

' Παραγοντικό του Ν
FUNCTION Factorial(N AS INTEGER) AS INTEGER
        DIM Count AS INTEGER
        DIM Result AS INTEGER

        Count = N
        Result = 1
        WHILE Count > 0
                Result = Result * Count
                Count = Count - 1
        WEND

END FUNCTION

Pascal

(* Παραγοντικό του Ν *)
function factorial(N : Integer) : Integer;
var
  Count, Result : Integer;
begin
     Count := N;
     Result := 1;
     While Count > 0 Do
     begin
           Result := Result * Count;
           Count := Count - 1
     end;
     Factorial := Result
end (* Factorial *);

Java

// Υπολογισμός ν παραγοντικού
public int παραγοντικό(int ν) {
        int αποτέλεσμα;
        int μετρητής;

        μετρητής = ν;
        αποτέλεσμα = 1;
        while (μετρητής > 0) {
                αποτέλεσμα = αποτέλεσμα * μετρητής;
                μετρητής = μετρητής - 1;
        }
        return (αποτέλεσμα);
}

Πίνακες

Παράδειγμα

class Sum {
        static int sum(int a[]) {
                int i, sum = 0;

                for (i = 0; i < a.length; i++)
                        sum += a[i];
                return sum;
        }

        static int testdata[] = {12345};

        public static void main(String args[]) {
                System.out.println(sum(testdata));
        }
}

Εγγραφές

Παράδειγμα

struct point {
        double x;       /* X coordinate */
        double y;       /* Y coordinate */
};

struct customer {
        char name[50];  /* Customer name */
        int balance;    /* Account balance */
};

struct customer customer_list[100];

main()
{
        struct point a, b;

        a.x = 5;
        a.y = 9;
        b.x = 12;
        b.y = 19;
}

Δομές με δείκτη

Παράδειγμα (C)

struct s_int_list {
	int val;
	struct s_int_list *next;
};

Διαδικασίες, συναρτήσεις και τάξεις

Παράδειγμα συνάρτησης και διαδικασίας σε Pascal

program fun;

(* Παραγοντικό του Ν *)
function factorial(N : Integer) : Integer;
var
  Count, Result : Integer;
begin
     Count := N;
     Result := 1;
     While Count > 0 Do
     begin
           Result := Result * Count;
           Count := Count - 1
     end;
     Factorial := Result
end (* Factorial *);

procedure clear_screen;
const number_of_lines = 24;
var i : integer;

begin
  for i := 0 to number_of_lines do
      writeln('');
end (*clear_screen*);

begin
  clear_screen;
  writeln(factorial(5));
end.

Παράδειγμα κλάσης σε Java

class Point extends Object {
   private int x;
   private int y;

   public void MoveTo(int x, int y) {
     this.x = x;
     this.y = y;
  }

  public int GetX() {
    return (x);
  }
}

Αναδρομικές τεχνικές

Παράδειγμα

class Recurse {
        static void russian_doll(int size) {
                int i;

                System.out.print("[");
                for (i = 0; i < size; i++)
                        System.out.print("-");
                System.out.println("]");
                if (size > 1)
                        russian_doll(size - 1);
        }

        static int factorial(int n) {
                if (n == 0)
                        return (1);
                else
                        return (n * factorial(n - 1));
        }

        public static void main(String args[]) {
                System.out.println(factorial(5));
                russian_doll(10);
        }
}

Αποτελέσματα

120
[----------]
[---------]
[--------]
[-------]
[------]
[-----]
[----]
[---]
[--]
[-]

Βιβλιογραφία

Ασκήσεις

Γλώσσες και εργαλεία προγραμματισμού

Ιστορική ανασκόπηση

Χαρακτηριστικές αλγοριθμικές γλώσσες

Σε μια αλγοριθμική (imperative) (ή προστακτική ή επιτακτική ή διαδικαστική (procedural)) γλώσσα το πρόγραμμα εκφράζει άμεσα τα βήματα που επιθυμούμε να εκτελέσει ο υπολογιστής.

Χαρακτηριστικές δηλωτικές γλώσσες

Σε μια δηλωτική (declarative) ή εφαρμοστική (applicative) γλώσσα το πρόγραμμα εκφράζει τη δομή του προβλήματος που θέλουμε να επιλύσουμε. Η γλώσσα προγραμματισμού παρέχει τον κατάλληλο μηχανισμό ελέγχου ο οποίος χρησιμοποιόντας τη δομή που έχουμε ορίσει καταλήγει στο επιθυμητό αποτέλεσμα.

Γλώσσες βασισμένες στη λογική

Γλώσσες βασισμένες σε συναρτήσεις

Τυπική περιγραφή γλωσσών

Σύνταξη (Syntax)
Ο τρόπος με τον οποίο τοποθετούνται στη σειρά τα συστατικά στοιχεία της γλώσσας για να αποτελέσουν ένα πρόγραμμα.
Σημασιολογία (Semantics)
Η σημασία που αποδίδεται στα συστατικά στοιχεία ενός προγράμματος κατά τη μετάφραση και την εκτέλεσή του.

Παράδειγμα γραμματικής BNF

Μια αριθμητική έκφραση μπορεί να αποτελείται από: Ο τρόπος που αυτά συνδυάζονται μεταξύ τους εκφράζεται σε BFN ως εξής:
ΑΔ ::= ΑΔ + ΠΓ | ΑΔ - ΠΓ | ΠΓ
ΠΓ ::= ΠΓ * Β | ΠΓ / Β | Β
Β ::= αριθμός | (ΑΔ)

Βασικά γλωσσικά εργαλεία

Προετοιμαστής/Διορθωτής (Editor)
Επιτρέπει τη συγγραφή και την αλλαγή του προγράμματος.
Προεπεξεργαστής (Preprocessor)
Επεξεργάζεται το πρόγραμμα εκτελώντας απλούς συμβολικούς μετασχηματισμούς και παράγει ένα αντίστοιχο πρόγραμμα. Χρησιμοποιείται σε συμβολικές γλώσσες, τη Fortran (Ratfor), τη C, και τη C++.
Συμβολομεταφραστής (Assembler)
Μετατρέπει τη συμβολική γλώσσα του επεξεργαστή σε γλώσσα μηχανής.
Μεταγλωττιστής (Compiler)
Μεταφράζει μια γλώσσα υψηλού επιπέδου σε γλώσσα επιπέδου μηχανής.
Διερμηνευτής (Interpreter)
Εκτελεί άμεσα ένα πρόγραμμα σε γλώσσα υψηλού επιπέδου.
Συνδέτης (Linker)
Συρράφει τμήματα ενός προγράμματος που έχουν μεταγλωττιστεί ξεχωριστά σε ένα συνεχές πρόγραμμα.
Φορτωτής (Loader)
Φορτώνει το πρόγραμμα στη μνήμη του επεξεργαστή διορθώνοντας αναφορές σε σχετικές θέσεις μνήμης. Συνήθως τμήμα του λειτουργικού συστήματος.
Αποσφαλματωτής (Debuger)
Επιτρέπει την εκτέλεση του προγράμματος βήμα-βήμα, την εξέταση και αλλαγή μεταβλητών του και γενικά ενέργειες που αποσκοπούν στην ανίχνευση λαθών που μπορεί να περιέχει το πρόγραμμα.

Δομή του μεταγλωττιστή

Λεκτική ανάλυση (Lexical analysis)
Αναγνώριση βασικών λεκτικών τμημάτων του προγράμματος όπως αριθμών, ονόματα μεταβλητών και λέξεων-κλειδιών της γλώσσας.
Συντακτική ανάλυση (Parsing)
Η δημιουργία από τα λεξικά τμήματα του συντακτικού δέντρου του προγράμματος.
Πίνακας συμβόλων (Symbol table)
Χώρος αποθήκευσης των χαρακτηριστικών όλων των ονομάτων που χρησιμοποιούνται στο πρόγραμμα.
Έλεγχος τύπων (Type checking)
Έλεγχος του τύπου των μεταβλητών, των συναρτήσεων και των εκφράσεων.
Βελτιστοποίηση (Optimization)
Αλλαγές στη δομή του κώδικα που αυξάνουν την ταχύτητα με την οποία θα εκτελεστεί, χωρίς όμως να επηρεάζουν το αποτέλεσμα.
Παραγωγή κώδικα (Code generation)
Παραγωγή συμβολικής γλώσσας ή γλώσσας μηχανής.

Η διεργασία του προγραμματισμού

Βιβλιογραφία

Ασκήσεις

Παραλληλία και προγραμματιστικά παραδείγματα

Παραλληλία σε επίπεδο υλικού

Παραλληλία με τη χρήση αγωγών

Παραδείγματα

Ανάγνωση αποτελεσμάτων
υπολογισμός |
μετατροπή σε λέξη |
φωνητική ανάγνωση

bc | 
number | 
speak
Συχνότητα λέξεων
Μετατροπή κειμένου σε λέξεις |
φιλτράρισμα λέξεων |
ταξινόμηση |
μέτρηση κοινών γραμμών |
ταξινόμηση

tr -cs A-Za-z '\012' | 
grep '^A-Za-z' | 
sort | 
uniq -c | 
sort -rn

Ιδιότητες ζωτικότητας

Η ιδιότητα της ζωτικότητας (liveness) σε μια σειρά από παράλληλες (concurrent) διεργασίες σχετίζεται με το ρυθμό της προόδου που επιτυγχάνεται. Ένα σύνολο διεργασιών βρίσκεται σε αδιέξοδο (deadlock) αν κάθε διεργασία του συνόλου περιμένει ένα γεγονός που μόνο μια άλλη διεργασία του συνόλου μπορεί να προκαλέσει. (Tanenbaum)

Τα αδιέξοδα δημιουργούνται ως αποτέλεσμα της διαχείρισης των πόρων από τις διαδικασίες. Κάθε πόρος (resource) μπορεί να είναι προεκχωρήσιμος (preemptable) δηλαδή να αποδεσμευτεί από μια διεργασία που τον κατέχει χωρίς παρενέργιες ή μη προεκχωρήσιμος (nonpreemptable). Παραδείγματα της πρώτης κατηγορίας είναι ο δίσκος και η μνήμη. Παραδείγματα της δεύτερης κατηγορίας είναι ο εκτυπωτής και η μονάδα ταινίας. Τυπικά μια διεργασία χρησιμοποιεί έναν πόρο ως εξής:

  1. Ζητά τον πόρο από το λειτουργικό σύστημα (αίτηση χρήσης).
  2. Χρησιμοποιεί τον πόρο.
  3. Ενημερώνει το λειτουργικό σύστημα ότι δε χρειάζεται άλλο τον πόρο (αποδέσμευση).
Οι παρακάτω συνθήκες πρέπει να ικανοποιούνται για να δημιουργηθεί αδιέξοδο:
Αμοιβαίος αποκλεισμός
Κάθε πόρος είναι δεσμευμένος ή διαθέσιμος.
Δέσμευση και αναμονή
Διεργασίες που δεσμεύουν πόρους μπορούν να ζητούν και νέους.
Μη προεκχώρηση
Μόνο η διεργασία που έχει δεσμεύσει τους πόρους μπορεί να τους αποδεσμεύσει.
Κυκλική αναμονή
Οι διαδικασίες που ζητούν πόρους πρέπει να σχηματίζουν κύκλο.
Οι τρόποι με τους οποίους αντιμετωπίζονται τα αδιέξοδα έχουν να κάνουν με την άρση μιας από τις παραπάνω συνθήκες.

Οι δειπνούντες φιλόσοφοι

Αδιέξοδο
Επανάλαβε
    Πιάσε το αριστερό πηρούνι
    Πιάσε το δεξί πηρούνι
    Φάε
    Άφησε τα πηρούνια
    Σκέψου
Τέλος
Ζωντανό αδιέξοδο (Livelock)
Επανάλαβε
    Πιάσε το αριστερό πηρούνι
    Αν δεν υπάρχει δεξί πηρούνι 
        Άσε το αριστερό πηρούνι 
        Επανάλαβε
    Τέλος
    Πιάσε το δεξί πηρούνι
    Φάε
    Άφησε τα πηρούνια
    Σκέψου
Τέλος
Δικαιοσύνη (Fairness)
Επανάλαβε
    Περίμενε να ελευθερωθούν και τα δύο πηρούνια
    Πιάσε το αριστερό και το δεξί πηρούνι
    Φάε
    Άφησε τα πηρούνια
    Σκέψου
Τέλος

Ιδιότητες ασφάλειας

Η ιδιότητα της ασφάλειας (safety) σε μια σειρά από παράλληλες διεργασίες σχετίζεται με την επίτευξη του σωστού αποτελέσματος.

Κράτηση εισιτηρίων

Αν υπάρχει θέση
   Κράτησε ένα εισητήριο
Τέλος

Αλληλοαποκλεισμός (Mutual exclusion) με βάση σηματοφόρο (semaphore)

P(Κράτηση)
    Αν υπάρχει θέση
       Κράτησε ένα εισητήριο
    Τέλος
V(Κράτηση)

Προγραμματισμός με βάση τη λογική

Προγραμματισμός με βάση τις συναρτήσεις

Προγραμματισμός με βάση τα αντικείμενα

class σχήμα {
        int χρώμα;

        void χρωμάτισε(int χρώμα) {
                this.χρώμα = χρώμα;
                ζωγράφισε();
        }
};

class τετράγωνο extends σχήμα {
        int x1, y1, x2, y2;

        void ζωγράφισε(void) {
                line(x1, y1, x1, y2, χρώμα);
                line(x1, y1, x2, y1, χρώμα);
                line(x2, y2, x1, y2, χρώμα);
                line(x2, y2, x2, y1, χρώμα);
        }
        int εμβαδό(void) {
                return (abs(x2 - x1) * abs(y2 - y1));
        }
}

class κύκλος extends σχήμα {
        int x, y, ακτίνα;

        void ζωγράφισε(void) {
                circle(x, y, ακτίνα, χρώμα);
        }
        int εμβαδό(void) {
                return (2 * π * ακτίνα * ακτίνα);
        }
}

Βιβλιογραφία

Ασκήσεις

Η γλώσσα Java, το πρώτο πρόγραμμα

Χαρακτηριστικά της Java

Ιστορία της Java

Χρονολογίες

1990
James Gosling, Patrick Naughton, Mike Sheridan: Project Green
1991
OAK, *7
1993
Εφαρμογές Video on Demand
1995
Java, HotJava browser

Γενεαλογία

Το πρώτο μου πρόγραμμα

Το παρακάτω πρόγραμμα τυπώνει "hello, world" στην οθόνη.
class Hello { 
        public static void main(String args[]) { 
                System.out.println("Hello, world."); 
        }
}
Μπορούμε να το αλλάξουμε για να τυπώσει:

Μεταγλώττιση και εκτέλεση

Μηχανισμός μεταγλώττισης και εκτέλεσης

  1. Ο μεταγλωττιστής της Java (javac) μετατρέπει το πηγαίο πρόγραμμα από Java σε εντολές της ιδεατής μηχανής Java (Java virtual machine) (JVM)
  2. Το περιβάλλον εκτέλεσης της Java (java)

Συνάρτηση σε Java

// Return n!
static public int factorial(int n) {
        int result;
        int counter;

        counter = n;
        result = 1;
        while (counter > 0) {
                result = result * counter;
                counter = counter - 1;
        }
        return (result);
}

Αντίστοιχες εντολές JVM

Method int factorial(int)
   0 iload_0
   1 istore_2
   2 iconst_1
   3 istore_1
   4 goto 15
   7 iload_1
   8 iload_2
   9 imul
  10 istore_1
  11 iload_2
  12 iconst_1
  13 isub
  14 istore_2
  15 iload_2
  16 ifgt 7
  19 iload_1
  20 ireturn

Στοιχεία του προγράμματος

Τα προγράμματα της Java αποτελούνται από ορισμένες βασικές τάξεις στοιχείων:

Ορισμός απλών συναρτήσεων

Ασκήσεις

Εξοικείωση με το μεταγλωττιστή και τη διαδικασία προγραμματισμού

  1. Να πληκτρολογήσετε, μεταγλωττίσετε και να εκτελέσετε ένα πρόγραμμα σε Java που να τυπώνει "I am learning Java"
  2. Πειραματιστείτε αλλάζοντας διάφορα στοιχεία του προγράμματος. (Το πιθανότερο είναι οι περισσότερες αλλαγές σας να καταλήγουν σε λάθη.)
  3. Φτιάξτε ένα πρόγραμμα το οποίο να τυπώνει με * ένα τετράγωνο στην οθόνη σαν το παρακάτω:
    ***************
    *             *
    *             *
    *             *
    *             *
    *             *
    *             *
    ***************
    
    Για να επαναλαμβανόμενα στοιχεία του τετραγώνου να ορίσετε δύο συναρτήσεις οι οποίες να τα τυπώνουν και να τις καλέσετε όσες φορές και με τη σειρά που χρειάζεται.

Βιβλιογραφία

Πηγές στο Internet

Γενική βιβλιογραφία

Υπολογισμοί με μεταβλητές, είσοδος και έξοδος

Σταθερές

Εκτύπωση τιμών

Απλές πράξεις

Οι αριθμητικές τιμές της Java μπορούν να συνδυαστούν με τη χρήση των παρακάτω τελεστών (operands):
Πράξη Τελεστής της Java
Πρόσθεση +
Αφαίρεση -
Πολλαπλασιασμός *
Διαίρεση /
Υπόλοιπο ακέραιας διαίρεσης %

Παραδείγματα

 BIO.println("one plus one = " + (1 + 1));
 BIO.println("The room's area is " + (3 * 5) + " sq. m");
 BIO.println(36.7 + " degrees Celsius = " + (32 + 9.0 / 5.0 * 36.7) + " degrees Fahrenheit.");
 BIO.println(1 + 2 * 3); /* Prints 7 */
 BIO.println((1 + 2) * 3); /* Prints 9 */

Μεταβλητές

Είσοδος στοιχείων

Ασκήσεις

Είσοδος έξοδος και υπολογισμοί

  1. Να γράψετε ένα πρόγραμμα που θα διαβάζει από το χρήστη το αρχικό ποσό μιας κατάθεσης και το ετήσιο επιτόκιο και θα τυπώνει το τελικό ποσό της κατάθεσης μετά από την πάροδο ενός έτους. Παράδειγμα της εκτέλεσης του πρόγραμματος:
    Initial capital = 1000000
    Interest rate = 3.2
    Th capital at the end of year 1 will be 1032000
    

Βιβλιογραφία

Τελεστές σύγκρισης, λογικής και επαναλήψεις

Τελεστές σύγκρισης

Οι αριθμητικές τιμές της Java μπορούν να συγκριθούν με τη χρήση των παρακάτω τελεστών:
Σύγκριση Τελεστής της Java
Ίσο ==
Διάφορο !=
Μικρότερο <
Μεγαλύτερο >
Μικρότερο ή ίσο <=
Μεγαλύτερο ή ίσο >=

Παράδειγμα

import gr.aueb.dds.BIO;

class TestCompare {
        public static void main(String args[]) {
                BIO.println(1 + 1 == 2);        /* Τυπώνει true */
                BIO.println(1 > 2);             /* Τυπώνει false */
                BIO.println(5 != 5);            /* Τυπώνει false */
                BIO.println(1 <= 5);            /* Τυπώνει true */
                BIO.println(1 <= 1);            /* Τυπώνει true */
                BIO.println(1 <= 0);            /* Τυπώνει false */
        }
}

Βρόχοι με την εντολή while

Βρόχοι με την εντολή do while

Λογικοί τελεστές

Τα λογικά αποτελέσματα στη Java μπορούν να συνδυαστούν με τη χρήση των παρακάτω λογικών τελεστών:
Λογική πράξη Τελεστής της Java
Λογική σύζευξη (boolean and) (και) &&
Λογική διάζευξη (boolean or) (ή) ||
Λογική άρνηση (boolean not) (όχι) !

Παράδειγμα

Ο παρακάτω βρόχος μπορεί να αποτελεί τμήμα του προγράμματος ελέγχου ενός τραπεζικού μηχανήματος αυτομάτων συναλλαγών:
{
        int secret, pin, tries;

        secret = 1234;                  /* Customer's secret PIN */
        tries = 0;
        do {
                BIO.print("Δώστε το PIN σας: ");
                pin = BIO.getInt();
                tries = tries + 1;
        } while (pin != secret && tries < 4);
        /* Correct PIN entered or number of tries exhausted */
}

Βιβλιογραφία

Ασκήσεις

Βρόχοι

  1. Να γράψετε ένα πρόγραμμα που να τυπώνει τον πίνακα της προπαίδειας όπως στο παρακάτω παράδειγμα:
       1    2    3    4    5    6    7    8    9   10 
       2    4    6    8   10   12   14   16   18   20 
       3    6    9   12   15   18   21   24   27   30 
       4    8   12   16   20   24   28   32   36   40 
       5   10   15   20   25   30   35   40   45   50 
       6   12   18   24   30   36   42   48   54   60 
       7   14   21   28   35   42   49   56   63   70 
       8   16   24   32   40   48   56   64   72   80 
       9   18   27   36   45   54   63   72   81   90 
      10   20   30   40   50   60   70   80   90  100 
    

Προγραμματισμός με χαρακτήρες, αποφάσεις

Η εντολή if-else

Τελεστές μοναδιαίας αύξησης και μείωσης, αποτέλεσμα ανάθεσης

Ο τύπος του χαρακτήρα

Είσοδος και έξοδος χαρακτήρων

Βιβλιογραφία

Ασκήσεις

If, char

  1. Να γράψετε ένα πρόγραμμα που να διαβάζει χαρακτήρες από την είσοδό του μέχρι να τερματιστεί το αρχείο εισόδου. Στο τέλος να τυπώνει τον αριθμό των χαρακτήρων, γραμμών, ψηφίων (0-9), πεζών χαρακτήρων (a-z) και κεφαλαίων χαρακτήρων (A-Z) που διάβασε.
    Σημείωση 1: Οι χαρακτήρες στο σύστημα που χρησιμοποιούμε είναι ταξινομημένοι αλφαβητικά. Η παράσταση c >= 'a' && c <= 'z' είναι αληθής για πεζούς χαρακτήρες στη μεταβλητή c.
    Σημείωση 2: Οι γραμμές τερματίζονται με το χαρακτήρα διαφυγής '\n'.
  2. Παράδειγμα:
    C:>java CharCount
    This is a test
    of my input! (02 lines)
    ^Z
    41 character(s)
    2 line(s)
    2 digit(s)
    24 lowercase (a-z)
    1 uppercase (A-Z)
    
  3. Εκτελέστε το πρόγραμμά σας με είσοδο τον εαυτό του.

Μαθηματικές συναρτήσεις, πέντε παραδείγματα

Η βιβλιοθήκη μαθηματικών

Το παρακάτω απόσπασμα είναι η τεκμηρίωση της βιβλιοθήκης της Java για τις διαθέσιμες μαθηματικές σταθερές και συναρτήσεις. Όλες χρησιμοποιούνται με το πρόθεμα "Math.". Παράδειγμα:
        double x = Math.cos(Math.PI / 2.);

Field Summary
static double E
          The double value that is closer than any other to e, the base of the natural logarithms.
static double PI
          The double value that is closer than any other to pi, the ratio of the circumference of a circle to its diameter.
 
Method Summary
static double abs(double a)
          Returns the absolute value of a double value.
static float abs(float a)
          Returns the absolute value of a float value.
static int abs(int a)
          Returns the absolute value of an int value.
static long abs(long a)
          Returns the absolute value of a long value.
static double acos(double a)
          Returns the arc cosine of an angle, in the range of 0.0 through pi.
static double asin(double a)
          Returns the arc sine of an angle, in the range of -pi/2 through pi/2.
static double atan(double a)
          Returns the arc tangent of an angle, in the range of -pi/2 through pi/2.
static double atan2(double a, double b)
          Converts rectangular coordinates (ba) to polar (r, theta).
static double ceil(double a)
          Returns the smallest (closest to negative infinity) double value that is not less than the argument and is equal to a mathematical integer.
static double cos(double a)
          Returns the trigonometric cosine of an angle.
static double exp(double a)
          Returns the exponential number e (i.e., 2.718...) raised to the power of a double value.
static double floor(double a)
          Returns the largest (closest to positive infinity) double value that is not greater than the argument and is equal to a mathematical integer.
static double IEEEremainder(double f1, double f2)
          Computes the remainder operation on two arguments as prescribed by the IEEE 754 standard.
static double log(double a)
          Returns the natural logarithm (base e) of a double value.
static double max(double a, double b)
          Returns the greater of two double values.
static float max(float a, float b)
          Returns the greater of two float values.
static int max(int a, int b)
          Returns the greater of two int values.
static long max(long a, long b)
          Returns the greater of two long values.
static double min(double a, double b)
          Returns the smaller of two double values.
static float min(float a, float b)
          Returns the smaller of two float values.
static int min(int a, int b)
          Returns the smaller of two int values.
static long min(long a, long b)
          Returns the smaller of two long values.
static double pow(double a, double b)
          Returns of value of the first argument raised to the power of the second argument.
static double random()
          Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0.
static double rint(double a)
          Returns the double value that is closest in value to a and is equal to a mathematical integer.
static long round(double a)
          Returns the closest long to the argument.
static int round(float a)
          Returns the closest int to the argument.
static double sin(double a)
          Returns the trigonometric sine of an angle.
static double sqrt(double a)
          Returns the correctly rounded positive square root of a double value.
static double tan(double a)
          Returns the trigonometric tangent of an angle.
static double toDegrees(double angrad)
          Converts an angle measured in radians to the equivalent angle measured in degrees.
static double toRadians(double angdeg)
          Converts an angle measured in degrees to the equivalent angle measured in radians.
 

Επίλυση δευτεροβάθμιας εξίσωσης

import gr.aueb.dds.BIO;

/*
 * Solve a qudratic equation ax^2 + bx + c = 0
 * Demonstrates the use of math calculations, functions, case analysis
 */
class Quadratic {
        public static void main(String args[]) {
                double a, b, c;         // Equation factors
                double d;               // Discriminant

                BIO.print("a=");
                a = BIO.readDouble();
                BIO.print("b=");
                b = BIO.readDouble();
                BIO.print("c=");
                c = BIO.readDouble();

                if (a == 0) {
                        if (b == 0) {
                                BIO.println("No solutions");
                        } else {
                                // Not really quadratic; one root
                                BIO.print("r=");
                                BIO.println(-c / b);
                        }
                } else {
                        // One complex, one, or two roots
                        d = b * b - 4 * a * c;
                        if (d < 0) {
                                // Complex root
                                BIO.print("r=");
                                // Real part
                                BIO.print(-b / 2 / a);
                                BIO.print("+");
                                // Imaginary part
                                BIO.print(Math.sqrt(-d) / 2 / a);
                                BIO.println("i");
                        } else if (d == 0) {
                                // Two equal roots
                                BIO.print("r1=r2=");
                                BIO.println(-b / 2 / a);
                        } else {
                                // Two different real roots
                                BIO.print("r1=");
                                BIO.println((-b + Math.sqrt(d)) / 2 / a);
                                BIO.print("r2=");
                                BIO.println((-b - Math.sqrt(d)) / 2 / a);
                        }
                }
        }
}

Σημείωση

Στην πράξη ο παραπάνω κώδικας είναι αριθμητικά ασταθής. Για να λύσουμε τη δευτεροβάθμια εξίσωση:
a x2 + b x + c = 0
αν η τιμή του a ή του c ή και των δύο είναι πολύ μικρή τότε μια από τις ρίζες περιλαμβάνει την αφαίρεση δύο σχεδόν ίσων αριθμών (του β και της διακρίνουσας) και το αποτέλεσμα δε θα είναι ακριβές. Για το λόγο αυτό υπολογίζουμε τις δύο ρίζες ως εξής:
double sign , q;

if (b < 0) {
        sign = -1.0;
else {
        sign = 1.0;
}
q = -(b + sign * d) / 2.0;
x1 = q / a;
x2 = c / q;

Εύρεση του μέγιστου αριθμού

import gr.aueb.dds.BIO;

/*
 * Read numbers until 0 is entered.
 * Print the maximum number read.
 * Demonstrates the use of a variable to hold the temporary maximum value
 */
class FindMax {
        public static void main(String args[]) {
                double val;
                double maxVal = -1e308;         // Very small number

                while ((val = BIO.readDouble()) != 0)
                        if (val > maxVal)
                                maxVal = val;
                BIO.println(maxVal);
        }
}

Μετρητής λέξεων

import gr.aueb.dds.BIO;

/*
 * Count number of words.
 * We define a word as a sequence of latin alphabetic characters.
 * Demonstrates the use of toggle variables to hold state.
 */
class WordCount {
        public static void main(String args[]) {
                int code;
                char c;
                boolean inWord = false;         // True when scanning a word
                int count = 0;

                while ((code = BIO.readChar()) != -1) {
                        c = (char)code;
                        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                                // Word character
                                if (!inWord)
                                        inWord = true;
                        } else {
                                // Non word character
                                if (inWord) {
                                        // A word just finished
                                        inWord = false;
                                        count++;
                                }
                        }
                }
                BIO.println(count);
        }
}

Έλεγχος ISBN

import gr.aueb.dds.BIO;

/*
 * Read an ISBN number and verify if its checksum is ok.
 * Demonstrates conversion of characters to integers, post-decrement,
 * checksums.
 */
class Isbn {
        public static void main(String args[]) {
                int count = 10;         // Digit count and weight
                int sum = 0;            // Checksum
                int code, value;
                char c;

                while (count > 0) {
                        code = BIO.readChar();
                        if (code == -1) {
                                BIO.println("Short ISBN");
                                return;
                        }
                        c = (char)code;
                        // Integer representation of the digit
                        if (c == 'X')
                                value = 10;
                        else
                                // Should use Character.digit(c, 10)
                                value = c - '0';
                        if (value < 0 || value > 10) {
                                BIO.println("Bad ISBN character");
                                return;
                        }
                        sum = sum + value * count--;
                }
                if (sum % 11 == 0)
                        BIO.println("ISBN checks ok");
                else
                        BIO.println("ISBN is wrong");
        }
}

Εξηγήσεις

Ζάρια

import gr.aueb.dds.BIO;

/*
 * Dice thrower
 * Demonstrates random number, functions, character graphics
 */
class Dice {

        /*
         * Calculate a random dice throw and display it as follows:
         * 1-3:
         *        #            #
         *   #                 #
         *             #       #
         * 4-6:
         * #   #   #   #     #    #
         *           #       #    #
         * #   #   #   #     #    #
         */
        static void dice() {
                int n = (int)(Math.random() * 6) + 1;

                BIO.println("[" + n + "]");
                BIO.println();
                // Top row
                // Left
                if (n == 2 || n >= 4) BIO.print("* "); else BIO.print("  ");
                // Middle
                if (n == 3) BIO.print("* "); else BIO.print("  ");
                // Right
                if (n >= 4) BIO.println("* "); else BIO.println("  ");

                // Middle row
                // Left
                if (n == 6) BIO.print("* "); else BIO.print("  ");
                // Middle
                if (n % 2 == 1) BIO.print("* "); else BIO.print("  ");
                // Right
                if (n == 6) BIO.println("* "); else BIO.println("  ");

                // Bottom row
                // Left
                if (n >= 4) BIO.print("* "); else BIO.print("  ");
                // Middle
                if (n == 3) BIO.print("* "); else BIO.print("  ");
                // Right
                if (n == 2 || n >= 4) BIO.println("* "); else BIO.println("  ");
                BIO.println();
        }

        /*
         * Clear the screen by displaying 25 empty lines
         */
        static void clearScreen() {
                int i;

                i = 0;
                while (i < 25) {
                        BIO.println();
                        i++;
                }
        }

        public static void main(String args[]) {
                int code;

                while ((code = BIO.readChar()) != -1) {
                        clearScreen();
                        dice();
                        BIO.println();
                        BIO.println();
                        BIO.println();
                        dice();
                        BIO.println();
                }
        }
}

Αποσφαλμάτωση

Όσο τα προγράμματα που γράφουμε γίνονται πιο περίπλοκα αναγκαζόμαστε να χρησιμοποιούμε διάφορες τεχνικές για την αποσφαλμάτωσή τους. Μερικές από αυτές είναι: Το παρακάτω πρόγραμμα περιέχει εντολές εκτύπωσης κάτω από τον έλεγχο της μεταβλητής debug.
import gr.aueb.dds.BIO;

/*
 * Solve a qudratic equation ax^2 + bx + c = 0
 * Demonstrates the use of debug print statements
 */
class Quadratic {
        public static void main(String args[]) {
                double a, b, c;         // Equation factors
                double d;               // Discriminant
                boolean debug;          // True during development, false in production

                debug = false;

                BIO.print("a=");
                a = BIO.readDouble();
                BIO.print("b=");
                b = BIO.readDouble();
                BIO.print("c=");
                c = BIO.readDouble();

                if (debug == true) {
                        BIO.println("a=" + a);
                        BIO.println("b=" + b);
                        BIO.println("c=" + c);
                }
                if (a == 0) {
                        if (debug)
                                BIO.println("a == 0");
                        if (b == 0) {
                                BIO.println("No solutions");
                        } else {
                                // Not really quadratic; one root
                                BIO.print("r=");
                                BIO.println(-c / b);
                        }
                } else {
                        // Zero or two roots
                        if (debug)
                                BIO.println("a != 0");
                        d = b * b - 4 * a * c;
                        if (debug)
                                BIO.println("d=" + d);
                        if (d < 0) {
                                // Complex root
                                BIO.print("r=");
                                // Real part
                                BIO.print(-b / 2 / a);
                                BIO.print("+");
                                // Imaginary part
                                BIO.print(Math.sqrt(-d) / 2 / a);
                                BIO.println("i");
                        } else if (d == 0) {
                                // Two equal roots
                                BIO.print("r1=r2=");
                                BIO.println(-b / 2 / a);
                        } else {
                                BIO.print("r1=");
                                BIO.println((-b + Math.sqrt(d)) / 2 / a);
                                BIO.print("r2=");
                                BIO.println((-b - Math.sqrt(d)) / 2 / a);
                        }
                }
        }
}

Ασκήσεις

  1. Να γράψετε ένα πρόγραμμα που να αφαιρεί τους κωδικούς επισημείωσης (ακολουθίες της μορφής <tag options>) από αρχεία HTML. Το πρόγραμμα θα δέχεται στην είσοδό του HTML και θα παράγει απλό κείμενο χωρίς τις ακολουθίες επισημείωσης.
  2. Εκτελέστε το πρόγραμμα με είσοδο τη σελίδα αυτή, όπως θα την έχετε φυλλάξει από το Web.
  3. Γράψτε ένα πρόγραμμα που να διαβάζει αριθμούς από την είσοδό του μέχρι να συναντήσει το 0. Στο τέλος το πρόγραμμα πρέπει να εμφανίσει τον μέγιστο, τον ελάχιστο και τον μέσο όρο των αριθμών που διάβασε.
  4. Να γράψετε ένα πρόγραμμα που να λύνει ένα σύστημα δύο εξισώσεων με δύο αγνώστους.
    Προτείνετε στοιχεία εισόδου και αναμενόμενα αποτελέσματα για να ελέγξετε το πρόγραμμα.
  5. Να γράψετε ένα πρόγραμμα που να σας επιτρέπει να παίζετε ρουλέτα με τον υπολογιστή. Στην αρχή ξεκινάτε με ένα συγκεκριμένο ποσό στα χέρια σας. Σε κάθε γύρο το πρόγραμμα σας ρωτάει πόσα χρήματα θέλετε να ποντάρετε και σε ποιο νούμερο θέλετε να τα βάλετε (χρησιμοποιήστε -1 για όλα τα μαύρα και -2 για όλα τα κόκκινα). Στη συνέχεια το πρόγραμμα τυπώνει το σημείο που έπεσε η μπίλια (χρησιμοποιήστε γραφικά και τη φαντασία σας για να δείξετε την κίνηση αυτή) καθώς και το αποτέλεσμα για τον παίκτη (κερδισμένος / χαμένος) και τα χρήματα που έχει τώρα στη διάθεσή του. Το παιγνίδι τελειώνει όταν τελειώσουν τα χρήματα του παίκτη.

Πρόσθετες δομές ελέγχου: switch for break continue

Η εντολή for

Η εντολή break

Η εντολή switch

Η εντολή continue

Δομές με ετικέτες

Βιβλιογραφία

Ασκήσεις

switch, for

  1. Να γράψετε ένα πρόγραμμα που να διαβάζει χαρακτήρες από την είσοδό του μέχρι να συναντήσει την τελεία. Οι χαρακτήρες που διαβάζει να εκτυπώνονται σύμφωνα με το διεθνές φωνητικό αλφάβητο: Alpha Bravo Charlie Delta Echo Foxtrot Golf Hotel India Juliet Kilo Lima Mike November Oscar Papa Quebec Romeo Sierra Tango Uniform Victor Whiskey Xray Yankee Zulu. Τα ψηφία 1-9 να εκτυπώνονται με επαναλαμβανόμενα αστέρια (*) αντίστοιχα με το ψηφίο. Χαρακτήρες για τους οποίους δεν υπάρχει αντιστοιχία να εκτυπώνονται ως έχουν. Παράδειγμα:
    Είσοδος:
    Hello 2 you!.
    
    Αποτέλεσμα:
    Hotel Echo Lima Lima Oscar ** Yankee Oscar Uniform!
    

Ορισμός συναρτήσεων

Δήλωση συναρτήσεων

Παράμετροι τιμής

Μεταβλητές κλάσης

Σταθερές και τοπικές μεταβλητές

Ασκήσεις

  1. Να υλοποιήσετε σε Java ένα πρόγραμμα που να τυπώνει σχήματα σαν το παρακάτω:
             *
            ***
           *****
          *******
         *********
        ***********
       *************
      ***************
     *****************
    *******************
             *
             *
             *
    
  2. Το πλάτος του δέντρου και το ύψος του κορμού να ορίζονται στην κλάση με τη μορφή σταθερών.
  3. Στο πρόγραμμα να ορίσετε και να χρησιμοποιήσετε μια διαδικασία space(int n) που να τυπώνει n χαρακτήρες κενού στην έξοδό της.

Βιβλιογραφία

Προγραμματισμός με αντικείμενα

Ορισμός κλάσεων

Χρήση αντικειμένων

Χωρισμός κλάσεων σε αρχεία

Ορατότητα

Μέθοδοι κατασκευής και καταστροφής

Ιδιότητες και μέθοδοι της κλάσης

Σε μια κλάση μπορούν να δηλωθούν (με τον προσδιορισμό static) μεταβλητές οι οποίες υπάρχουν μόνο μια φορά για όλη την κλάση, καθώς και συναρτήσεις που μπορούν να κληθούν με τη σύνταξη κλάση.συνάρτηση. Οι μεταβλητές αυτές χρησιμοποιούνται για την επεξεργασία στοιχείων που αφορούν ολόκληρη την κλάση και όχι τα αντικείμενά της. Οι συναρτήσεις που έχουν οριστεί static δεν έχουν πρόσβαση σε μη static μεταβλητές ούτε στη μεταβλητή this. Το παρακάτω παράδειγμα ορίζει έναν μετρητή numPoints που μετρά πόσα σημεία είναι ενεργά καθώς και την αντίστοιχη συνάρτηση πρόσβασης getNumPoints:
import gr.aueb.dds.BIO;

class Point {
        private int x, y;
        // Count number of points used
        private static int numPoints;

        // Point constructor
        Point(int ix, int iy) {
                x = ix;
                y = iy;
                numPoints++;            // Adjust points counter
        }
        // Point constructor
        Point(int xy) {
                x = y = xy;
                numPoints++;            // Adjust points counter
        }

        // Point destructor
        public void finalize() {
                BIO.println("Another point bites the dust");
                BIO.print("The point was at ");
                display();
                numPoints--;            // Adjust points counter
        }

        // Return number of points currently used
        public static int getNumPoints() {
                return numPoints;
        }

        public void display() {
                BIO.print("(x=" + x);
                BIO.println(", y=" + y + ")");
        }

        static public void main(String args[]) {
                Point a = new Point(12);
                Point b = new Point(58);
                Point c = new Point(7);
                c.display();
                a = b;
                BIO.println(getNumPoints() + " points are alive now");
                BIO.println("Garbage collecting");
                // Force the garbage collector to run
                System.gc();
                BIO.println(Point.getNumPoints() + " points are alive now");
        }
}

Φροντιστηριακή άσκηση

Να υλοποιηθεί σε Java μια κλάση που να παριστάνει αντικείμενα σε κίνηση με ιδιότητες την αρχική τους θέση και την ταχύτητά τους στους άξονες x και y και τις παρακάτω μεθόδους:
void setInitialPosition(double x, double y)
Θέτει την αρχική θέση του αντικειμένου.
void setVelocity(double x, double y)
Θέτει την ταχύτητα x, y του αντικειμένου.
double GetXPosition(int t)
Επιστρέφει τη θέση x του αντικειμένου κατά τη χρονική στιγμή t.
double GetYPosition(int t)
Επιστρέφει τη θέση y του αντικειμένου κατά τη χρονική στιγμή t.
Με βάση το παραπάνω να υλοποιηθεί πρόγραμμα που
  1. Ορίζει δύο αντικείμενα.
  2. Για κάθε ένα από τα αντικείμενα ζητάει από το χρήστη την αρχική του θέση, την ταχύτητά του και ένα χρόνο t και εμφανίζει στην οθόνη τη θέση του κατά το χρόνο t.
Σημείωση: η θέση κάθε αντικειμένου υπολογίζεται μόνο με βάση την αρχική του θέση και την ταχύτητά του.

Παράδειγμα:

A1x=6
A1y=12
A1 vx=1
A1 vy=1
t=2

A1x=8 A1y=14

A2x=6
A2y=67
A2 vx=10
A2 vy=10
t=1

A2x=16 A2y=77

Ασκήσεις

  1. Να υλοποιηθούν σε Java οι κλάσεις andgate, orgate, notgate. Οι κλάσεις αυτές θα προσομοιάζουν τις αντίστοιχες λογικές πύλες. Κάθε κλάση να έχει μεθόδους που να θέτουν τις εισόδους (π.χ. setA, setB) και μέθοδο που να επιστρέφει την τιμή της εξόδου (π.χ. getOutput).
  2. Με τη χρήση των παραπάνω κλάσεων (και μόνο) να υλοποιήσετε μια κλάση που να προσομοιάζει έναν ημιαθροιστή. Η κλάση αυτή να έχει μεθόδους που να θέτουν τις δύο εισόδους και μεθόδους που να επιστρέφουν το άθροισμα και το κρατούμενο.
  3. Να γράψετε ένα πρόγραμμα σε Java που να τυπώνει τους πίνακες αλήθειας για τις παραπάνω κλάσεις.
  4. (Προαιρετικά) Με τη χρήση των παραπάνω κλάσεων να υλοποιήσετε μια κλάση που να προσομοιάζει έναν πλήρη αθροιστή. Η κλάση αυτή πρέπει να έχει μεθόδους που να θέτουν τις δύο εισόδους και το κρατούμενο εισόδου καθώς και μεθόδους που να επιστρέφουν το άθροισμα και το κρατούμενο εξόδου.

Βιβλιογραφία

Πίνακες

Ορισμός και χρήση πινάκων

Πίνακες πολλαπλών διαστάσεων

Πίνακες ως ορίσματα

Αρχικοποίηση πινάκων

Πρόσθετοι τελεστές

Οι τελεστές που δεν έχουμε εξετάσει μέχρι τώρα είναι (με σειρά προτεραιότητας) οι παρακάτω:
<<
ολίσθηση προς τα αριστερά
>>
ολίσθηση προς τα δεξιά
>>
ολίσθηση προς τα δεξιά με εισαγωγή μηδενικών
&
δυαδική ή λογική σύζευξη
|
δυαδική ή λογική διάζευξη
^
δυαδική ή λογική αποκλειστική διάζευξη
?:
υπολογισμός υπό συνθήκη
*= /= %= += -= <<= >>= >>>= &= ^= |=
ανάθεση με τελεστή

Ασκήσεις

Πίνακες

  1. Γράψτε ένα πρόγραμμα το οποίο διαβάζει χαρακτήρες από την είσοδό του μέχρι το τέλος του αρχείου (EOF). Στη συνέχεια τυπώνει ένα ραβδόγραμμα με αστεράκια για κάθε έναν από τους εμφανιζόμενους χαρακτήρες. Επιπλέον για τους χαρακτήρες που εμφανίζονται στην είσοδο του προγράμματος τις μέγιστες και τις ελάχιστες φορές εμφανίζει τον αντίστοιχο χαρακτήρα καθώς και τον αριθμό των φορών που εμφανίστηκε.

    Παράδειγμα εξόδου:

    a ********
    b ****
    e ************
    z *
    Most frequent: e; 12 time(s).
    Least frequent: z; 1 time(s).
    
    Σημείωση: Αν η είσοδος του προγράμματος δεν περιέχει ελληνικούς χαρακτήρες, τότε μπορείτε να φυλάξετε τη συχνότητα του κάθε χαρακτήρα σε έναν πίνακα 128 θέσεων με δείκτη τον ίδιο το χαρακτήρα.

Βιβλιογραφία

Παράδειγμα χρήσης κλάσεων: γιορτινή κάρτα

Κλάση Tree

import gr.aueb.dds.BIO;

class Tree {
        // Tree properties
        private int treeWidth;          // Width of the tree
        private int trunkWidth;         // Width of the trunk
        private int trunkHeight;        // Height of the trunk
        private char treeFill;          // Fill character

        // Constructor
        // ew : Tree body width
        // uw : Trunk width
        // uh : Trunk heigth
        // f : fill character
        Tree(int ew, int uw, int uh, char f) {
                treeWidth = ew;
                trunkWidth = uw;
                trunkHeight = uh;
                treeFill = f;
        }

        // Draw a tree
        public void draw() {
                body();
                trunk();
        }

        // Draw the tree's body
        private void body() {
                int i;

                for (i = 1; i < treeWidth; i = i + 2) {
                        DrawChar.space((treeWidth - i) / 2);
                        fill(i);
                        BIO.println();
                }
        }

        // Draw the tree's trunk
        private void trunk() {
                int j;

                for (j = 0; j < trunkHeight; j = j + 1) {
                        DrawChar.space((treeWidth - trunkWidth) / 2);
                        fill(trunkWidth);
                        BIO.println();
                }
        }

        // Display n space characters
        static private void space(int n) {
                DrawChar.repeatChar(n, ' ');
        }

        // Display n treeFill characters
        private void fill(int n) {
                DrawChar.repeatChar(n, treeFill);
        }

        public static void main(String args[]) {
                Tree t = new Tree(822'!');
                Tree bigt = new Tree(1334'#');

                DrawChar.repeatChar(79'*');
                BIO.println();
                t.draw();
                bigt.draw();
                t.draw();
        }
}

Κλάση Snow

import gr.aueb.dds.BIO;

class Snow {
        private double density;         // Snow density: 0 very dense, 1 no snow
        private char symbol;            // Symbol to use for snowflakes
        private int lines;              // Lines to draw

        // Constructor
        Snow(double d, char s, int l) {
                density =  d;
                symbol = s;
                lines = l;
        }

        // Draw the snow
        public void draw() {
                int i;

                for (i = 0; i < lines; i++) {
                        if (Math.random() > density)
                                snowFlakes();
                        BIO.println();
                }
        }

        // Draw a line of random snowflakes
        private void snowFlakes() {
                int width = 70;

                while (width > 0) {
                        int s = (int)(Math.random() * 10 * density);
                        DrawChar.space(s);
                        BIO.print(symbol);
                        width = width - s - 1;
                }
        }

        // Test the class
        public static void main(String args[]) {
                Snow s = new Snow(0.1'*'4);
                s.draw();
        }
}

Κλάση DrawChar

import gr.aueb.dds.BIO;

// Character drawing functions
class DrawChar {
        // Repeat character c, n times on screen
        public static void repeatChar(int n, char c) {
                int k;

                for (k = 0; k < n; k++)
                        BIO.print(c);
        }

        // Display n space characters
        public static void space(int n) {
                repeatChar(n, ' ');
        }

        public static void main(String args[]) {
                repeatChar(79'*');
        }
}

Κλάση που τις χρησιμοποιεί: Xmas.java

/*
 * Draw a christmas card
 * Uses classes Snow and Tree
 */
class Xmas {
        public static void main(String args[]) {
                // Three types of snow
                Snow top = new Snow(0.2'*'5);
                Snow middle = new Snow(0.3','7);
                Snow bot = new Snow(0.4'.'7);

                // And three different trees
                Tree small = new Tree(822'!');
                Tree big = new Tree(1834'#');
                Tree tiny = new Tree(612'!');

                top.draw();
                middle.draw();
                bot.draw();
                small.draw();
                big.draw();
                tiny.draw();
        }
}

Αποτέλεσμα

 * *** ** *** ** * * * ** ** * **** * ** **** * * *** *** **** * * * *
* * ***** ** ***** ** ** * *** ** * * * ** ** *** * *** ** * * * ** * *
* ** * * * ** * * ** ** * ** **** * **** ** * * * ** * * *** * ** * **
 * ** * * ** ***** ** * *** ** * * *** ** * * * ** ** ** * * * ** * * *
* ** ******* * * **** * * **** ***** ** **** ** ** * * ** ** * ** * * *

, , , , ,  , ,  ,,,, , , ,  ,  , ,,,, ,, ,  , ,  , ,,  ,,  ,,  ,,  ,,,
  ,  ,,  , ,, , , ,, , ,  ,  ,,,  ,  , , , , ,, ,, , ,, ,, ,,,,  ,,,  ,

 ,  , , ,,, , , , ,,  ,,,  , ,  ,,  , ,,,  , , ,  ,  , ,  ,  ,,  , ,,  ,


 .  .  .   . .. . ...  . ....  .  ...  .  . .  ..   . .  .   ...   . .

  .   . . .   . . ...   . .  ..   .  .   .   .   .   .   .  .. .   .  .

 .   .  .  .  .   .... .. . .  .....  ...  .   .  .  . .  . ..   .  . .

   ..  .   ......   ..  .  .   .   .. . .  . .  ..   .... . ...  .  .   .
   !
  !!!
 !!!!!
!!!!!!!
   !!
   !!
        #
       ###
      #####
     #######
    #########
   ###########
  #############
 ###############
#################
       ###
       ###
       ###
       ###
  !
 !!!
!!!!!
  !
  !

Κληρονομικότητα

Εισαγωγή

Οι σχέσεις αυτών των κλάσεων μπορούν να παρασταθούν στο παρακάτω διάγραμμα.

Κάθε κλάση κληρονομεί τις ιδιότητες της μητρικής της κλάσης.

Κληρονομικότητα σε κλάσεις

Δυναμική διεκπεραίωση

Αφηρημένες κλάσεις

Για παράδειγμα, ένας σχεδιασμός του πληροφοριακού συστήματος του Πανεπιστημίου μπορεί να ορίσει την ιδεατή κλάση person ως βασική κλάση για τις υποκλάσεις student, employee και visitor. Αν και δε θα μπορεί να ένα νέο αντικείμενο με βάση την αφηρημένη κλάση person, αυτή μπορεί να περιέχει ορισμένα βασικά χαρακτηριστικά όπως birth_date και να επιβάλει την υλοποίηση συγκεκριμένων μεθόδων όπως home_page_URL() ορίζοντάς τις ως ιδεατές.

Παράδειγμα

Το παρακάτω παράδειγμα ορίζει τη βασική κλάση Shape και τις υποκλάσεις της Circle και Rectangle. Η μέθοδος area μπορεί να οριστεί για τις υποκλάσεις και κατά την εκτέλεση του προγράμματος να εκτελεστεί η σωστή έκδοσή της. Η συνάρτηση toString της Shape εκμεταλλεύεται τη δυνατότητα αυτή και μπορεί να κληθεί (και να δουλέψει σωστά) με όρισμα οποιαδήποτε από τις υποκλάσεις της shape.
import gr.aueb.dds.BIO;

abstract class Shape {
        private double x, y;            // Position
        protected double getX() { return x; }
        protected double getY() { return y; }
        public void setposition(double px, double py) {
                x = px;
                y = py;
        }
        public abstract double area();
        public String toString() {
                return "Shape(x=" + x + ", y=" + y + ", area=" + area() + ")";
        }
}

class Circle extends Shape {
        private double radius;
        public void setradius(double r) {
                radius = r;
        }
        public double area() {
                return 2 * Math.PI * radius * radius;
        }
        public String toString() {
                return super.toString() + ": Circle(" + radius + ")";
        }
}

class Rectangle extends Shape {
        private double height, width;
        public void setdimensions(double h, double w) {
                height = h;
                width = w;
        }
        public double area() {
                return height * width;
        }
        public String toString() {
                return super.toString() + ": Rectangle(" + height + " x " + width + ")";
        }
}

class Test {
        static public void main(String args[])
        {
                Circle c = new Circle();
                Rectangle r = new Rectangle();
                Shape s[] = new Shape[2];

                s[0] = r;
                r.setposition(12);
                r.setdimensions(5050);

                s[1] = c;
                c.setposition(34);
                c.setradius(10);
                for (int i = 0; i < s.length; i++)
                        BIO.println(s[i]);
        }
}
Το παραπάνω πρόγραμμα θα τυπώσει:
Shape(x=1.0, y=2.0, area=2500.0): Rectangle(50.0 x 50.0)
Shape(x=3.0, y=4.0, area=628.3185307179587): Circle(10.0)

Ασκήσεις

  1. Να υλοποιηθούν σε Java οι κλάσεις AndGate, OrGate, NotGate. Οι κλάσεις αυτές θα προσομοιάζουν τις αντίστοιχες λογικές πύλες. Κάθε κλάση να έχει μεθόδους που να θέτουν τις εισόδους (π.χ. setA, setB) και μέθοδο που να επιστρέφει την τιμή της εξόδου (π.χ. getOutput).
  2. Με τη χρήση των παραπάνω κλάσεων (και μόνο) να υλοποιήσετε μια κλάση που να προσομοιάζει έναν ημιαθροιστή. Η κλάση αυτή να έχει μεθόδους που να θέτουν τις δύο εισόδους και μεθόδους που να επιστρέφουν το άθροισμα (getSum) και το κρατούμενο (getCarryOut).
  3. Να γράψετε ένα πρόγραμμα σε Java που να τυπώνει τους πίνακες αλήθειας για τις παραπάνω κλάσεις.
  4. (Προαιρετικά) Με τη χρήση των παραπάνω κλάσεων να υλοποιήσετε μια κλάση που να προσομοιάζει έναν πλήρη αθροιστή. Η κλάση αυτή πρέπει να έχει μεθόδους που να θέτουν τις δύο εισόδους και το κρατούμενο εισόδου (setCarryIn) καθώς και μεθόδους που να επιστρέφουν το άθροισμα και το κρατούμενο εξόδου. Με τη χρήση του πλήρη αθροιστή και τους τελεστές bit της Java μπορεί να υλοποιηθεί μια κλάση αθροιστή ακεραίων αριθμών (wordadder) με τον παρακάτω τρόπο:
    /*
     * wordadder.java
     *
     * D. Spinellis, February 2000, December 2001
     */

    import gr.aueb.dds.BIO;

    class WordAdder {
            private int a, b;
            public void setA(int v) { a = v;}
            public void setB(int v) {b = v;}
            public int getSum() {
                    FullAdder fa[] = new FullAdder[32];
                    int i, bit;
                    int result = 0;

                    for (i = 0; i < 32; i++)
                            fa[i] = new FullAdder();

                    fa[0].setCarryIn(false);
                    // bit is the bit position to add
                    for (i = 0, bit = 1; i < 32; bit <<= 1, i++) {
                            fa[i].setA((a & bit) != 0);
                            fa[i].setB((b & bit) != 0);
                            // Propagate carry
                            if (i < 31)
                                    fa[i + 1].setCarryIn(fa[i].getCarryOut());
                            // Merge adder output into result
                            if (fa[i].getSum())
                                    result |= bit;
                    }
                    return (result);
            }

            // Test harness
            public static void main(String args[]) {
                    int a, b;
                    WordAdder wa = new WordAdder();

                    BIO.print("a=");
                    wa.setA(a = BIO.readInt());
                    BIO.print("b=");
                    wa.setB(b = BIO.readInt());
                    BIO.println(a + " + " + b + " = " + wa.getSum());
            }
                                    
    }
    Δοκιμάστε το!

Βιβλιογραφία

Τεχνολογία λογισμικού

Εισαγωγή

Η τεχνολογία λογισμικού (software engineering) είναι ο κλάδος αυτός της πληροφορικής που έχει ως σκοπό την εξεύρεση τεχνικών και εργαλείων που η χρησιμοποίησή τους στην παραγωγή λογισμικού να εξασφαλίζει για το παραγόμενο προϊόν:
  1. συμμόρφωση με τις προδιαγραφές,
  2. παράδοση στο προδιαγεγραμμένο χρόνο,
  3. κατασκευή στο προδιαγεγραμμένο κόστος,
  4. προσιτή συντήρηση.

Ο κύκλος ζωής του λογισμικού

Το μοντέλο του καταρράκτη (waterfall model)

'Αλλα μοντέλα

Προσδιορισμός απαιτήσεων

Ο προσδιορισμός των απαιτήσεων διαχωρίζεται Το έγγραφο προδιαγραφών απαιτήσεων από το σύστημα (system requirements document) περιέχει τα παρακάτω στοιχεία (Σκορδαλάκης 1991, σ. 54):
  1. Ορισμός του προβλήματος
  2. Αιτιολόγηση του προβλήματος
  3. Σκοπός του συστήματος και του έργου
  4. Σκοπός του συστήματος και του έργου
  5. Περιορισμοί στο σύστημα και στο έργο
  6. Λειτουργίες ανά συνιστώσα του προβλήματος
    1. Υλικό
    2. Λογισμικό
    3. Άνθρωποι
  7. Χαρακτηριστικά χρηστών
  8. Περιβάλλοντα
    1. ανάπτυξης,
    2. λειτουργίας και
    3. συντήρησης
  9. Στρατηγική λύσης του προβλήματος
  10. Προτεραιότητες στα χαρακτηριστικά του συστήματος
  11. Κριτήρια αποδοχής του συστήματος
  12. Πηγές πληροφοριών
  13. Λεξιλόγιο
Αντίστοιχα το έγγραφο προδιαγραφών απαιτήσεων από το λογισμικό (software requirements document) περιέχει τα παρακάτω στοιχεία (Σκορδαλάκης 1991, σ. 63):
  1. Εισαγωγή
    1. Σκοπός
    2. Έκταση
    3. Ορισμοί, ακρονυμίες και συντομογραφίες
    4. Αναφορές
    5. Γενική εικόνα
  2. Γενική περιγραφή
    1. Προοπτική του προϊόντος
    2. Λειτουργίες
    3. Χαρακτηριστικά των χρηστών
    4. Γενικοί περιορισμοί
    5. Παραδοχές και εξαρτήσεις
  3. Ειδικές απαιτήσεις
    1. Λειτουργικές απαιτήσεις
      1. Λειτουργική απαίτηση 1
        1. Εισαγωγή
        2. Είσοδοι
        3. Επεξεργασία
        4. Έξοδοι
      2. Λειτουργική απαίτηση 1
      3. ...
      4. Λειτουργική απαίτηση ν
    2. Απαιτήσεις εξωτερικών διαπροσωπειών
      1. Διαπροσωπείες χρήστη (user interfaces)
      2. Διαπροσωπείες υλικού (hardware interfaces)
      3. Διαπροσωπείες λογισμικού (software interfaces)
      4. Διαπροσωπείες επικοινωνιών (communication interfaces)
    3. Απαιτήσεις επίδοσης
    4. Περιορισμοί σχεδίασης
      1. Συμμόρφωση με τα πρότυπα
      2. Περιορισμοί από το υλικό
    5. Ιδιώματα
      1. Διαθεσιμότητα
      2. Ασφάλεια
      3. Συντηρισιμότητα
      4. Μεταφερσιμότητα
    6. Άλλες απαιτήσεις
      1. Βάση δεδομένων
      2. Τρόποι λειτουργίας
      3. Προσαρμογή στο χώρο εγκατάστασης
  4. Παραρτήματα
  5. Ευρετήριο

Ανάλυση

Για την κατανόηση, τον προσδιορισμό και την έκφραση των απαιτήσεων από το λογισμικό είναι απαραίτητο ένα ιδεατό μοντέλο (conceptual model) των διεργασιών του συστήματος στο οποίο θα λειτουργήσει το λογισμικό. Τα μοντέλα αυτά χρησιμοποιούν τις παρακάτω τεχνικές παράστασης:
  1. Ροή δεδομένων (data flow)
  2. Μηχανή πεπερασμένων καταστάσεων (finite state machine)
  3. επικοινωνούσες ταυτόχρονες διεργασίες (communicating concurrent processes)
  4. Μοντέλο οντοτήτων σχέσεων (entity relationship models)
  5. Εξομοίωση (simulation)
  6. Λειτουργική σύνθεση (functional composition)

Σχεδίαση

Κωδικοποίηση

Έλεγχος

Διοίκηση, οργάνωση και κοστολόγηση

Διασφάλιση ποιότητας

Περιβάλλοντα και γλώσσες ανάπτυξης

Παραδείγματα

Τα παραδείγματα που ακολουθούν προέρχονται από το περιβάλλον Microsoft Visual Studio.


Διαλογικός σχεδιασμός διεπαφής χρήστη


Ολοκληρωμένο σύστημα βοήθειας


Οδηγός δημιουργίας της εφαρμογής


Διαλογική μεταγλώττιση


Αποσφαλμάτωση


Φυλλομέτρηση κλάσεων

Βιβλιογραφία

Ασκήσεις

Θέματα εξετάσεων

Πιλοτικά θέματα

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ

Τμήμα Δοικητικής Επιστήμης και Τεχνολογίας
ΠΛΗΡΟΦΟΡΙΑΚΕΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑΚΕΣ ΤΕΧΝΟΛΟΓΙΕΣ Πιλοτικά Θέματα

Διδάσκων: Επικ. Καθ. Διομήδης Σπινέλλης

Θέμα 1ο:

  1. Μετατρέψτε τον αριθμό που απαρτίζεται από το πρώτο και τα δύο τελευταία ψηφία του αριθμού μητρώου σας από το δεκαδικό στο δυαδικό σύστημα. Στη μετατροπή πρέπει να φαίνεται ο τρόπος με τον οποίο φτάσατε στο συγκεκριμένο αποτέλεσμα.
  2. Δώστε τον πίνακα τιμών για τη διαφορά (δ) και το κρατούμενο (κ) που προκύπτει από τον υπολογισμό της διαφοράς δύο bit x, y: (δ, κ) = x - y. Χρησιμοποιώντας πύλες σύζευξης, διάζευξης και άρνησης σχεδιάστε το λογικό κύκλωμα που υπολογίζει τα (δ, κ) από τα (x, y).

Θέμα 2ο:

  1. Ποια βασικά δομικά στοιχεία απαρτίζουν ένα μηχάνημα αυτομάτων συναλλαγών (ATM); Πως επικοινωνούν αυτά μεταξύ τους;
  2. Τι ρόλους επιτελεί στο παραπάνω μηχάνημα το λειτουργικό του σύστημα;

Θέμα 3ο:

  1. Περιγράψτε διαγραμματικά τον κύκλο ζωής του λογισμικού.
  2. Εξηγήστε πως είναι δυνατή η εκτέλεση από τον υπολογιστή προγραμμάτων γραμμένων στη συμβολική γλώσσα του επεξεργαστή καθώς και σε γλώσσες υψηλού επιπέδου όπως η Java.

Θέμα 4ο:

  1. Για να επιλύσετε ένα πρόβλημα που αναφέρεται σε ένα πολύ μεγάλο πλήθος στοιχείων έχετε να επιλέξετε ανάμεσα σε αλγορίθμους πολυπλοκότητας Α: O(n3), Β: Ο(log n), Γ: O(2n), Δ: Ο(1), Ε: O(n), και ΣΤ: O(n5). Ταξινομήστε τους αλγορίθμους με βάση το θεωρητικό χρόνο εκτέλεσής τους και εξηγήστε ποιόν αλγόριθμο θα επιλέγατε.
  2. Γράψτε ποιες εντολές του επεξεργαστή Intel IA-32 θα εκτελεστούν από τη στιγμή που ο μετρητής προγράμματος αποκτήσει την τιμή 100 μέχρι τη στιγμή που θα αποκτήσει την τιμή 10D. Δώστε τις τιμές των καταχωρητών μετά την εκτέλεση κάθε εντολής.
0100	mov	eax, 3		; Move / Ανάθεση τιμής
0103	mov	esi, 0		; Move / Ανάθεση τιμής
0106	add	esi, eax	; Add / Πρόσθεση
0108	sub	eax, 1		; Subtract / Αφαίρεση
010B	jnz	106		; Jump if Not Zero / Άλμα υπό συνθήκη (διάφορο του 0)
010D	...		

Θέμα 5ο:

Γράψτε σε Java ένα πρόγραμμα που θα διαβάζει από την είσοδό του ποσά εκφρασμένα σε δραχμές και θα τυπώνει το αντίστοιχο ποσό σε ευρώ. Το πρόγραμμα θα τερματίζει τη λειτουργία του όταν διαβάζει το ποσό 0. Στο τέλος θα εμφανίζει σε δραχμές και σε ευρώ το σύνολο των ποσών που μετέτρεψε.

Θέμα 6ο:

Η γλώσσα επισημείωσης HTML χρησιμοποιεί την ακολουθία "<tag ...>" για να προσδιορίσει χαρακτηριστικά του κειμένου. Να γράψετε ένα πρόγραμμα σε Java που να διαβάζει HTML ως χαρακτήρες από την είσοδό του μέχρι να τερματιστεί το αρχείο εισόδου. Το πρόγραμμα θα εμφανίζει στην έξοδό του το κείμενο της εισόδου χωρίς τις ακολουθίες επισημείωσης. Παράδειγμα: Είσοδος:
<html>
<body>
<h1>Εισαγωγή</h1> 
Κείμενο της εισαγωγής
</body>
</html>
Έξοδος:
Εισαγωγή
Κείμενο της εισαγωγής
Το πρόγραμμα δε χρειάζεται να ελέγχει μη κανονικά σχηματισμένη HTML (π.χ. επισημειώσεις μέσα σε επισημειώσεις).

Διάρκεια εξέτασης 3 ώρες. Καλή επιτυχία!

Απάντηση στο 6ο θέμα

import gr.aueb.dds.BIO;

class Detag {
        public static void main(String args[]) {
                int c;
                boolean print = true;

                while ((c = BIO.readChar()) != -1) {
                        if ((char)c == '<')
                                print = false;
                        if (print) 
                                BIO.print((char)c);
                        if ((char)c == '>')
                                print = true;
                }
        }
}


Εξεταστική περιόδος Ιανουαρίου 2002

Τα θέματα σε μορφή PDF.

Εξεταστική περιόδος Σεπτεμβρίου 2002

Τα θέματα σε μορφή PDF.

Εξεταστική περιόδος Ιανουαρίου 2003

Τα θέματα σε μορφή PDF.

Εξεταστική περιόδος Νοεμβρίου 2003

Τα θέματα σε μορφή PDF.

Η βιβλιοθήκη BIO της Java

Εισαγωγή

Η βιβλιοθήκη BIO παρέχει εύκολες, αποδοτικές και σωστές μεθόδους για την είσοδο και έξοδο στοιχείων σε εφαρμογές που εκτελούνται από τη γραμμή εντολών. Δουλεύει σωστά και αποδοτικά τόσο όταν το πρόγραμμα διαβάζει στοιχεία από το χρήστη, όσο και όταν τα στοιχεία προέρχονται από κάποιο αρχείο. Η βιβλιοθήκη BIO εξασφαλίζει: Για να πετύχει τους παραπάνω στόχους η βιβλιοθήκη BIO συνδέεται απλοϊκά με τις υπόλοιπες βιβλιοθήκες της Java και κάνει μια σειρά από υποθέσεις για λογαριασμό του προγραμματιστή. Έτσι, η βιβλιοθήκη BIO είναι κατάλληλη μόνο για εκπαιδευτικούς σκοπούς και όχι για κώδικα παραγωγής.

Εγκατάσταση

Πηγαίος κώδικας και τεκμηρίωση

Η βιβλιοθήκη BIO παρέχεται ελεύθερα για κάθε χρήση σύμφωνα με την παρακάτω άδεια:
(C) Copyright 2001 Diomidis Spinellis.  All rights reserved.
Permission to use, copy, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.