κεφάλαιο * Εσωτερική Παράσταση Δεδομένων

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "κεφάλαιο * Εσωτερική Παράσταση Δεδομένων"

Transcript

1 κεφάλαιο * Εσωτερική Παράσταση Δεδομένων Ο στόχος μας σε αυτό το κεφάλαιο: Να μάθεις πώς παριστάνονται στη μνήμη του ΗΥ οι τιμές διαφόρων τύπων και περιορισμούς και προβλήματα που προκύπτουν από τους τρόπους παράστασης. Προσδοκώμενα αποτελέσματα: Θα μπορείς να γράφεις πιο αξιόπιστα προγράμματα. Έννοιες κλειδιά: παράσταση ακεραίων παράσταση πραγματικών διαχείριση δυαδικών ψηφίων ψηφιοπράξεις σφάλματα παράστασης σφάλματα πράξεων Περιεχόμενα:. Παράσταση Φυσικών.... Παράσταση Ακεραίων - Αρνητικοί Αριθμοί..... * Ακέραιοι Τύποι του C.... Οι Ακέραιοι στο Πρόγραμμα..... Παράμετροι unsigned.... * Απαριθμητοί Τύποι (ξανά).... Ψηφιοπράξεις στη C Ψηφιοχάρτες και Συνηθισμένες Πράξεις..... Τιμή Δυαδικού Ψηφίου..... Βάλε Τιμή σε Δυαδικό Ψηφίο..... Βάλε Τιμή σε Δυαδικό Ψηφίο..... Πλήθος ""..... Μέρος Ψηφιοχάρτη.... Τύποι bitmask.... Αριθμητικές Πράξεις και Ψηφιοπράξεις.... Παράσταση και Πράξεις στον Τύπο float..... Υπολογισμός Περιοδικής Συνάρτησης.... Άλλοι Τύποι Κινητής Υποδιαστολής.... Ο Τύπος float στο Δυαδικό Σύστημα..... Πόλωση..... Άλλες Περιπλοκές - Πρότυπο IEEE..... Οι Τύποι double και long double..... Μερικά Χρήσιμα Εργαλεία από τη C.... Σφάλμα από Μετατροπή Τύπου...

2 Κεφάλαιο. Τα Σφάλματα και πώς Μεταδίδονται..... Το Σφάλμα Παράστασης..... Μετάδοση Σφαλμάτων.... Ισότητα στους Τύπους Κινητής Υποδιαστολής.... Πρακτικές Συμβουλές... Ασκήσεις... Α Ομάδα... Β Ομάδα... Γ Ομάδα... Εισαγωγικές Παρατηρήσεις Αριθμητικά Συστήματα: Ένας από τους πιό γνωστούς τρόπους κωδικοποίησης αριθμητικών πληροφοριών είναι η κωδικοποίηση στο γνωστό δεκαδικό σύστημα, στο οποίο χρησιμοποιούμε δέκα διαφορετικά σύμβολα, τα ψηφία:,,,,,,,,,. Για να παραστήσουμε στο σύστημα αυτό έναν ακέραιο αριθμό (θετικό ή αρνητικό), χρησιμοποιούμε ένδεκα σύμβολα: τα δέκα ψηφία και το πρόσημο - (μείον). Πολλές φορές χρησιμοποιούμε και το πρόσημο + (συν), για να ξεχωρίζουμε ευκολότερα τους θετικούς αριθμούς από τους αρνητικούς (π.χ. -,, +). Ακόμη, στην παράσταση ενός κλασματικού αριθμού χρειαζόμαστε και την υποδιαστολή (ευρωπαϊκές χώρες:,, ΗΠΑ. Μεγ. Βρεττανία:. ), που διαχωρίζει το ακέραιο μέρος του αριθμού από το κλασματικό (π.χ.,). Το κοινό δεκαδικό αριθμητικό σύστημα είναι θεσιακό (positional), διότι η τιμή που παριστάνει κάθε ψηφίο ενός αριθμού εξαρτάται από τη θέση που έχει στην παράσταση του αριθμού. Για παράδειγμα, το πρώτο ψηφίο στον αριθμό σημαίνει την τιμή ( ), ενώ το δεύτερο ψηφίο την τιμή ( ). Εκτός από τα θεσιακά συστήματα αριθμήσεως υπάρχουν και μη θεσιακά συστήματα, όπως είναι το γνωστό προσθετικό (additive) ρωμαϊκό σύστημα (π.χ. ΧΧΧΙΙΙ = = ) ή το Ελληνικό (ρβ = + = ), όπου τα σύμβολα που χρησιμοποιούμε έχουν την ίδια τιμή ανεξαρτήτως της θέσης τους στον αριθμό που παριστάνουν. Σε ένα θεσιακό αριθμητικό σύστημα κάθε φυσικός αριθμός Ν μπορεί να παρασταθεί με ένα πολυώνυμο της εξής μορφής: Ν = ψl-β L- + ψl-β L ψ Β () Ο αριθμός Β λέγεται βάση (base, radix) του αριθμητικού συστήματος και υποθέτουμε γενικώς ότι είναι μεγαλύτερος από το (υπάρχουν όμως και συστήματα με αρνητική βάση). Οι συντελεστές ψ k (k:..l-) που μπορεί να πάρουν τιμές στο [..Β) ( ψ k < Β), αποτελούν τα διαδοχικά ψηφία του αριθμού Ν ο οποίος έχει L θέσεις (ή ψηφία). Έτσι, η βάση Β καθορίζει το πλήθος των διαφορετικών ψηφίων ενός αριθμητικού συστήματος. Στο δεκαδικό αριθμητικό σύστημα έχουμε βάση Β = και τα δέκα διαφορετικά ψηφία είναι:,,,...,. Δηλαδή επιλέγοντας τη βάση, δημιουργούμε ένα αριθμητικό σύστημα. Όταν π.χ. η βάση Β = ή,,,, τότε το σύστημα λέγεται δυαδικό ή αντιστοίχως τριαδικό, οκταδικό, δεκαδικό, δεκαεξαδικό. Έτσι λοιπόν ο αριθμός Ν =, του δεκαδικού θεσιακού συστήματος, μπορεί να γραφτεί με την εξής μορφή: Ν = = όπου ψ =, ψ =, ψ = και ψ =. Στο οκταδικό σύστημα η βάση Β = και τα διάφορα ψηφία αυτού του συστήματος είναι:,,,...,. Επομένως ο αριθμός Ν =, του οκταδικού συστήματος, παριστάνει την τιμή του δεκαδικού αριθμού, επειδή: Ν = = = Βλέπουμε λοιπόν ότι η ίδια ακολουθία ψηφίων (π.χ. ) αντιπροσωπεύει άλλη τιμή στο οκταδικό σύστημα και άλλη στο δεκαδικό. Έτσι, για να μη γίνεται σύγχυση, συχνά γράφουμε σαν κάτω δείκτη, στο δεξιό μέρος της ακολουθίας ψηφίων ενός αριθμού τη βάση του αριθμητικού συστήματος που χρησιμοποιούμε (πάντα στο δεκαδικό συμβολισμό). Στην

3 * Εσωτερική Παράσταση Δεδομένων παρουσίαση των αριθμών στα θεσιακά συστήματα σημειώνουμε, για λόγους απλοποίησης, μόνο τους όρους ψ k (σε κατιούσα σειρά) και παραλείπουμε τις δυνάμεις Β.. Παράσταση Φυσικών Στους ψηφιακούς ΗΥ χρησιμοποιείται το δυαδικό (binary) αριθμητικό σύστημα, για λόγους τεχνολογικής αξιοπιστίας (αλλά και θεωρητικούς). Η Φυσική και η Ηλεκτρονική έχουν να προτείνουν συστήματα δύο καταστάσεων (two state systems), στα οποία μπορούμε να ανιχνεύουμε την κατάσταση που βρίσκεται το σύστημα και να το βάζουμε στην κατάσταση που θέλουμε. Σε ένα τέτοιο σύστημα, «βαφτίζουμε» τη μια κατάσταση και την άλλην παριστάνουμε δηλαδή τα δύο ψηφία του δυαδικού συστήματος (Β = ). Σύμφωνα με αυτά που είπαμε παραπάνω, στο δυαδικό σύστημα κάθε φυσικός αριθμός παριστάνεται ως άθροισμα δυνάμεων του. Για παράδειγμα, ο δεκαδικός αριθμός Ν = ( + = + ), μπορεί να παρασταθεί ως εξής: Ν = = όπου ψ =, ψ =, ψ = και ψ =. Συχνά στα υπολογιστικά συστήματα χρησιμοποιείται και το δεκαεξαδικό (hexadecimal) αιθμητικό σύστημα, για το οποίο Β = και τα ψηφία του είναι:,,,,,,,,,, A, B, C, D, E, F Τα νέα σύμβολα A, B, C, D, E και F (ή a, b, c, d, e, f) αντιστοιχούν στις τιμές των (δεκαδικών) αριθμών: δέκα, ένδεκα, δώδεκα, δεκατρία, δεκατέσσερα και δεκαπέντε. Κατά συνέπεια ο δεκαεξαδικός αριθμός σημαίνει: = + + = + + = και ο δεκαεξαδικός αριθμός AF σημαίνει: AF = + A + + F = = Ο Πίν. - δείχνει την παράσταση των ακεραίων αριθμών από μέχρι σε διάφορα θεσιακά αριθμητικά συστήματα. Από τον Πίν. - φαίνεται ότι όταν μικραίνει η βάση του αριθμητικού συστήματος μεγαλώνει το πλήθος των ψηφίων που χρειάζονται για να παρασταθεί ένας αριθμός. Για παράδειγμα, ο αριθμός χρειάζεται ένα ψηφίο στο -δικό και στο -δικό σύστημα, δυό στο - δικό, τρία στο -δικό και τέσσερα στο -δικό σύστημα. Το πλήθος Π των διαφόρων αριθμών που μπορεί να γραφούν σε L θέσεις ενός αριθμητικού συστήματος βάσεως Β δίνεται από τον τύπο: Π = Β L () Αν, ας πούμε, πάρουμε Β = και L =, τότε μπορούμε να ξεχωρίσουμε (= ) διαφορετικούς δυαδικούς αριθμούς (ή συνδυασμούς), δηλ. τους αριθμούς:,,,.... Αν τώρα γνωρίζουμε το πλήθος των ακεραίων αριθμών Π, που θέλουμε να παραστήσουμε στο αριθμητικό σύστημα με βάση το Β, τότε ο απαιτούμενος αριθμός θέσεων L καθορίζεται από τον τύπο: L = logbπ () Έτσι, για να παραστήσουμε τους πρώτους φυσικούς αριθμούς, από μέχρι, στο δυαδικό σύστημα χρειαζόμαστε log = θέσεις. Ενώ για την παράσταση των πρώτων αριθμών στο τριαδικό σύστημα χρειαζόμαστε log = θέσεις. Μπορείς να ελέγξεις την ορθότητα του τύπου () και από τον Πίν. -. Ακόμη, από τον Πίν. -, μπορείς να δεις ότι το οκταδικό και το δεκαεξαδικό είναι «συμπυκνώσεις» του δυαδικού συστήματος. Π.χ. το στο δυαδικό γράφεται. Αν

4 Κεφάλαιο δικό δικό δικό δικό δικό A B C D E F Πίν. - Παράσταση αριθμών σε διάφορα αριθμητικά συστήματα. δεις αυτήν την παράσταση ως δυο τριάδες: και κάθε μια από αυτές ως ψηφίο του οκταδικού συστήματος, παίρνεις τον. Παρομοίως, αν τη δεις ως δυο τετράδες και τις γράψεις ως ψηφία του δεκαεξαδικού παίρνεις:. Φυσικά, αυτές οι ιδιότητες ξεκινούν από το ότι = και =. Στην. (Πίν. -) είδαμε ότι η C++, για την παράσταση φυσικών αριθμών, μας δίνει τους ακέραιους τύπους χωρίς πρόσημο: unsigned char, unsigned int, unsigned long. Ο unsigned char αποθηκεύει τιμές σε μια ψηφιολέξη των οκτώ δυαδικών ψηφίων σύμφωνα με τον τύπο (), μπορεί να παραστήσει = διαφορετικές τιμές, τους φυσικούς από μέχρι. Ο unsigned short int δουλεύει με μια λέξη (δυο ψηφιολέξεις) με δυαδικά ψηφία και μπορεί να παραστήσει = διαφορετικές τιμές, τους φυσικούς από μέχρι. Τέλος, ο unsigned long μπορεί να παραστήσει = τιμές, από μέχρι. Και ο unsigned int; Μπορεί να σαν τον unsigned long ή σαν τον unsigned short int. Στη συνέχεια θα δούμε έναν τρόπο για να «σκαλίζουμε» τις εσωτερικές παραστάσεις. Στις.. και.. είδαμε ότι η C++ μας δίνει τη δυνατότητα να γράφουμε στο πρόγραμμά μας φυσικούς αριθμούς στο δεκαεξαδικό σύστημα βάζοντας το πρόθεμα "x" ή "X" και στο οκταδικό σύστημα βάζοντας το πρόθεμα "". Π.χ., οι εντολές: k = ; k = XFF; k = xff; k = ; κάνουν ακριβώς το ίδιο πράγμα. Το είναι μια αριθμητική σταθερά στο δεκαδικό σύστημα. Η ίδια τιμή στο δεκαεξαδικό σύστημα γράφεται FF και στο οκταδικό. Στη Οι τιμές των μεγεθών που δίνουμε εδώ δεν είναι υποχρεωτικές, είναι απλώς συνηθισμένες. Θυμίσου ότι όπως λέγαμε στο Κεφ. το υποχρεωτικό είναι ότι: sizeof(char) sizeof(short) sizeof(int) sizeof(long)

5 * Εσωτερική Παράσταση Δεδομένων C++, η δεκαεξαδική τιμή γράφεται XFF και η οκταδική. Πρόσεξε καλά την οκταδική γραφή: Όταν μια αριθμητική σταθερά ακέραιου τύπου αρχίζει με "" (μηδέν) είναι οκταδικός και και όχι δεκαδικός αριθμός.. Παράσταση Ακεραίων - Αρνητικοί Αριθμοί Πώς μπορούμε να παραστήσουμε σε μια ψηφιολέξη ακέραιους θετικούς ή αρνητικούς; Αφού το πρόσημο μπορεί να είναι + ή -, μπορούμε να το παραστήσουμε με ένα δυαδικό ψηφίο: για το + και για το -. Έτσι, θα μας μείνουν άλλα δυαδικά ψηφία για την απόλυτη τιμή, που θα μπορεί να είναι από μέχρι - =. Να λοιπόν ένας τρόπος για να παραστήσουμε ακέραιες τιμές από - μέχρι +. Αυτός ο τρόπος παράστασης λέγεται «πρόσημο - απόλυτη τιμή». Αλλά πρόσεξε: εδώ έχουμε τιμές, ενώ στον τύπο unsigned char παριστάνουμε διαφορετικές τιμές από - μέχρι! Ναί, χάσαμε μια τιμή, διότι το (μηδέν) παριστάνεται με δυο διαφορετικούς τρόπους: ως + () και ως - (). Συνήθως, στους υπολογιστές μας θα βρούμε την παράσταση αρνητικών με το "συμπλήρωμα ως προς " ('s complement). Ας δούμε ένα Παράδειγμα Όπως είδαμε, το παριστάνεται σε μια ψηφιολέξη, ως: Για να βρούμε το συμπλήρωμα ως προς : Βήμα : αλλάζουμε τα σε και τα σε : (αυτό είναι το συμπλήρωμα ως προς ) Βήμα : προσθέτουμε το + Αυτήν την παράσταση χρησιμοποιούμε για να παραστήσουμε το -. Το ότι η τιμή είναι αρνητική φαίνεται όπως και στην «πρόσημο-απόλυτη τιμή» από το στο δυαδικό ψηφίο. Τί κερδίσαμε από όλα αυτά; Ας του προσθέσουμε την παράσταση του () αγνοώντας το ότι το πρώτο ψηφίο είναι πρόσημο: + Αν ξεχάσουμε το πιο σημαντικό ψηφίο, που είναι, τα υπόλοιπα οκτώ ψηφία παριστάνουν το, που είναι σωστό: (-) + =. Ένας άλλος τρόπος για να πούμε το ίδιο πράγμα είναι ο εξής: Το αποτέλεσμα της πράξης ήταν + =. Κρατάμε το υπόλοιπο της διαίρεσής του δια (= ). Γι' αυτό, αυτή η αριθμητική λέγεται αριθμητική υπολοίπων (modulo arithmetic). Δηλαδή: Όταν παριστάνουμε τους αρνητικούς με συμπλήρωμα ως προς κάνουμε πρόσθεση χωρίς να ενδιαφερόμαστε για τα πρόσημα των προσθεταίων. Να λοιπόν πώς δουλεύει ο υπολογιστής στην περίπτωση αυτή: οι αρνητικοί παριστάνονται με συμπλήρωμα ως προς, κατά την πρόσθεση το ψηφίο προσήμου δεν έχει διαφορετική μεταχείριση από τα άλλα,

6 Κεφάλαιο η πρόσθεση γίνεται με αριθμητική υπολοίπων ως προς Ν, όπου Ν το πλήθος δυαδικών ψηφίων που χρησιμοποιούνται για την παράσταση. Ποιος είναι ο μέγιστος αριθμός που μπορούμε να παραστήσουμε; Είναι ο = Η ελάχιστη τιμή είναι - και παριστάνεται ως: = - Μάλλον θα θέλεις κάποια βοήθεια για να βρεις το -. Λοιπόν: αφού έχει στο ψηφίο, είναι αρνητικός. Ας εφαρμόσουμε αντιστρόφως αυτά που κάναμε για να υπολογίσουμε το συμπλήρωμα ως προς : Βήμα : αφαιρούμε το Βήμα : αλλάζουμε τα σε και τα σε : που είναι το =. Το μηδέν παριστάνεται με έναν μοναδικό τρόπο:. Η C++ έχει τρεις τύπους που τους χειρίζεται με τον τρόπο αυτόν: (signed) char, σε ψηφία. Παριστάνει τιμές από - μέχρι με αριθμητική υπολοίπου ως προς =. short int, σε ψηφία. Παριστάνει τιμές από - μέχρι με αριθμητική υπολοίπου ως προς =. int και long int, σε ψηφία. Παριστάνει τιμές από - μέχρι με αριθμητική υπολοίπου ως προς =. Να (ξανα)τονίσουμε ότι τα παραπάνω μεγέθη δεν καθορίζονται από το πρότυπο της γλώσσας. Ας πούμε ότι είναι συνηθισμένες τιμές. Στη συνέχεια θα δούμε και μερικούς ακόμη ακέραιους τύπους. Πού θα μας χρειαστούν όλα αυτά; Το συζητούμε στην συνέχεια. -.. * Ακέραιοι Τύποι του C Στο πρότυπο C (ISO/IEC ) της C εισάγονται ακέραιοι τύποι με δυαδικά ψηφία: long long int και unsigned long long int. Ελάχιστη τιμή του long long int Μέγιστη τιμή του long long int LLONG_MIN: - = -( - ) LLONG_MAX: + = - Μέγιστη τιμή του unsigned long long int ULLONG_MAX: = - Οι long long int και unsigned long long int προβλέπονται και στο C++. Πέρα από αυτούς τους ακέραιους δυαδικών ψηφίων, το C υποδεικνύει και μερικούς ορισμούς-μεταονομασίες τύπων. Η πρώτη οικογένεια περιλαμβάνει ορισμούς ονομάτών της μορφής intn_t και uintn_t. Το N υποδηλώνει το πλήθος δυαδικών ψηφίων. Ο gcc (Dev C++), στο stdint.h, έχει τους εξής σχετικούς ορισμούς: typedef signed char typedef unsigned char typedef short typedef unsigned short typedef int int_t; uint_t; int_t; uint_t; int_t;

7 * Εσωτερική Παράσταση Δεδομένων typedef unsigned uint_t; typedef long long int_t; typedef unsigned long long uint_t; Τι κερδίζουμε με αυτούς; Όταν θέλουμε μια ακέραιη μεταβλητή με ψηφία δεν χρειάζεται να ψάχνουμε αν θα τη δηλώσουμε υποχρεωτικώς long int ή μας κάνει και ο int δηλώνουμε: int_t x; και τελειώνουμε. Μια άλλη οικογένεια περιλαμβάνει ονόματα της μορφής int_leastn_t και uint_leastn_t (υποχρεωτικό για N:,,, ). Για παράδειγμα, ο τύπος int_least_t είναι ο «μικρότερος«ακέραιος τυπος που έχει τουλάχιστον ψηφία. Μια τρίτη οικογένεια περιλαμβάνει ονόματα της μορφής int_fastn_t και uint_fastn_t (υποχρεωτικό για N:,,, ). Ο τύπος int_fast_t είναι ο «ταχύτερος» (ό,τι και αν σημαίνει αυτό) ακέραιος τυπος που έχει τουλάχιστον ψηφία. Τέλος, ο τύπος intmax_t είναι αυτός στον οποίον μπορούμε να παραστήσουμε οποιαδήποτε ακέραιη τιμή μπορεί να παρασταθεί στη συγκεκριμένη υλοποίηση. Ο αντίστοιχος για τιμές χωρίς πρόσημο είναι ο uintmax_t. Ο gcc, στο stdint.h, έχει: typedef long long intmax_t; typedef unsigned long long uintmax_t; Όλοι αυτοί οι ορισμοί προβλέπεται να υπάρχουν στο νέο πρότυπο της C++.. Οι Ακέραιοι στο Πρόγραμμα Δες το παρακάτω πρόγραμμα: #include <iostream> #include <climits> using namespace std; int main() int i( INT_MAX ); i = *i; cout << i << endl; } Αποτέλεσμα: - Ας δούμε τί έγινε: Η (gcc - Dev) C++ παριστάνει τιμές τύπου int σε δυαδικά ψηφία και το INT_MAX παριστάνεται ως εξής: Το αποτέλεσμα του πολλαπλασιασμού υπολογίζεται σε: = Αλλά, στον τύπο int δεν μπορούμε να παραστήσουμε αυτήν την τιμή έχουμε υπερχείλιση (overflow). Δουλεύοντας με αριθμητική υπολοίπων και συμπλήρωμα ως προς, η συνέχεια είναι η εξής: στη μεταβλητή i αποθηκεύονται τελικώς τα ψηφία μέχρι του αποτελέσματος. Όταν έρθει η ώρα να εκτελεσθεί η εντολή cout << i << endl, πρώτα ελέγχεται το ψηφίο προσήμου () αφού έχει τιμή, ο υπολογιστής καταλαβαίνει ότι πρόκειται για αρνητική τιμή! Στη συνέχεια, αφαιρεί : και αλλάζει το σε και τα σε : -

8 Κεφάλαιο που είναι το. Τι δίδαγμα βγαίνει από αυτά; Στις πράξεις του int (και των άλλων ακεραίων τύπων) είναι δυνατόν να έχουμε υπερχείλιση χωρίς καμιά ειδοποίηση από τον υπολογιστή. Αυτό είναι συχνά από τα δυσκολότερα λάθη, τουλάχιστον στην ανίχνευση. Πώς αντιμετωπίζεται αυτό το πρόβλημα; Ας δούμε τί μπορούμε να κάνουμε με την πρόσθεση. Έχουμε δυο μεταβλητές x, y, τύπου int και θέλουμε να υπολογίσουμε το x + y, αν υπολογίζεται. Για τα x, y έχουμε: INT_MIN x INT_MAX INT_MIN y INT_MAX και θα αποπειραθούμε την πρόσθεση μόνον αν ξέρουμε από πριν ότι INT_MIN x + y INT_MAX ή INT_MIN - y x INT_MAX - y Φυσικά, δεν μπορούμε να γράψουμε: if (INT_MIN-y <= x && (x <= INT_MAX-y) s = x + y; else Λάθος διότι οι πράξεις INT_MIN - y και INT_MAX - y δεν είναι ασφαλείς! Π.χ. αν η y έχει αρνητική τιμή, η INT_MAX - y μας δίνει σίγουρα υπερχείλιση. Ας τα ξαναδούμε πιο προσεκτικά. Κατ' αρχάς, αν οι x, y έχουν ετερόσημες τιμές δεν υπάρχει περίπτωση υπερχείλισης με την πρόσθεση. Αν οι x, y έχουν τιμές τότε μας ενδιαφέρει μόνον ο έλεγχος x INT_MAX - y και η πράξη δεξιά είναι ασφαλής. Αν οι x, y έχουν τιμές < τότε μας ενδιαφέρει μόνον ο έλεγχος INT_MIN - y x και η πράξη αριστερά είναι ασφαλής. Μπορούμε λοιπόν να γράψουμε την: int addint( int x, int y ) int fv; if ( x >= ) if ( y < ) fv = x + y; else if ( x <= INT_MAX - y ) fv = x + y; else throw IntOvrflXptn( "addint",, x, y ); } else // x < if ( y >= ) fv = x + y; else if ( INT_MIN - y <= x ) fv = x + y; else throw IntOvrflXptn( "addint",, x, y ); } return fv; } // addint «Δηλαδή», σκέφτεσαι με φρίκη, «θα πρέπει αντί για c = a + b να γράφω c = addint(a, b) και αντί για μια πράξη να καλώ μια συνάρτηση και να διαχειρίζομαι εξαιρέσεις;» Όχι! Σε ένα καλοσχεδιασμένο πρόγραμμα οι περισσότερες πράξεις είναι συνήθως ασφαλείς και αυτές που δεν είναι φαίνονται εύκολα. Φυσικά, δεν υπάρχει συνταγή για το πότε βάζουμε έλεγχο και πότε όχι αλλά, δες δυο παραδείγματα: #include <iostream> #include <string> #include <climits> Και ακόμη: για τις άλλες πράξεις τα πράγματα είναι πολύ πιο απλά.

9 * Εσωτερική Παράσταση Δεδομένων using namespace std; struct IntOvrflXptn char funcname[]; int errcode; int errval; int errval; IntOvrflXptn( const char* fn, int ec, int ev=, int ev= ) strncpy( funcname, fn, ); funcname[] = '\'; errcode = ec; errval = ev; errval = ev; } }; // IntOvrflXptn int addint( int x, int y ); int main() int x, y, z; cout << "Δώσε δύο θετικούς ακέραιους < " << endl; cin >> x >> y; try z = addint( x, y ); cout << z << endl; //... } catch ( IntOvrflXptn& xp ) cout << xp.errval << " + " << xp.errval <<"??? ΣΟΒΑΡΕΨΟΥ!" << endl; } //... do cout << "Δώσε δύο θετικούς ακέραιους < " << endl; cin >> x >> y; } while (x <= < x y <= < y); z = x + y; //... } // main Το μήνυμα που δίνεις πριν από την εντολή ανάγνωσης δεν σου εξασφαλίζει οτιδήποτε. Στην πρώτη περίπτωση δεν σε ενδιαφέρει να δεις αν ο χρήστης υπάκουσε στην οδηγία σου και προχωράς. Η χρήση της addint() θα σε προφυλάξει από μια τιμή της z χωρίς νόημα. Στη δεύτερη περίπτωση, αφού δεν προχωράς παρά μόνο με «σωστές» τιμές των x, y, μπορείς να κάνεις την πρόσθεση χωρίς άλλον έλεγχο... Παράμετροι unsigned Στην. (και στην..) δίναμε τον κανόνα: Μη βάζεις στις συναρτήσεις σου παραμέτρους τιμής τύπου unsigned int, unsigned long int, unsigned short int, unsigned char αλλά, αντιστοίχως: int, long int, short int, char. Μετά βάλε έλεγχο προϋπόθεσης. Στο παράδειγμα παραβίασης του κανόνα που δίναμε καλούσαμε n = -; cout << n << " " << intsqrt(n) << endl; τη συνάρτηση με επικεφαλίδα unsigned int intsqrt( unsigned int x );

10 Κεφάλαιο Και τι βλέπαμε; Στη συνάρτηση περνούσε στη x η τιμή και η συνάρτηση υπολόγιζε την (ακέραιη) τετραγωνική της ρίζα. Τώρα μπορείς να καταλάβεις τι γίνεται. Σε int τεσσάρων ψηφιολέξεων το (= ) παριστάνεται ως: Το - σε συμπλήρωμα ως προς παριστάνεται ως: Αυτή είναι η εσωτερική παράσταση της n και αντιγράφεται ως τιμή της x. Μέσα στη συνάρτηση αυτή η παράσταση ερμηνεύεται ως unsigned int. Έτσι προκύπτει η τιμή. Άσκηση για σένα: η επιβεβαίωση της παράστασης του - και ο υπολογισμός της τιμής.. * Απαριθμητοί Τύποι (ξανά) Πρωτοείδαμε τους απαριθμητούς τύπους πολύ νωρίς (.) και τους χρησιμοποιούμε όπως θα χρησιμοποιούσαμε τους αντίστοιχους της Pascal και πολύ καλά κάναμε. Στη συνέχεια, σε ορισμένες περιπτώσεις, θα πρέπει να τους χρησιμοποιήσουμε όπως τους χρησιμοποιεί η C. Ας ξαναδούμε τον τύπο enum Digit miden =, zero =, one, two, three, four, five, six, seven, eight, nine }; και τη δήλωση: Digit d( ); Ο μεταγλωττιστής θα την απορρίψει: «invalid conversion from int to Digit» (gcc Dev C++). Αν όμως δώσεις: Digit d( static_cast<digit>() ); όλα πάνε μια χαρά. Σωστό! Δοκιμάζουμε όμως και το εξής: d = static_cast<digit>( ); Και αυτό περνάει χωρίς το παραμικρό πρόβλημα, ενώ, με βάση αυτά που ξέρουμε, θα έπρεπε να γίνονται δεκτές τιμές από static_cast<digit>() μέχρι και static_cast <Digit>(). Αυτό που συμβαίνει στην πραγματικότητα είναι το εξής: Αν οι σταθερές που έχουμε στην απαρίθμηση είναι μη αρνητικές η C++ θα δεχτεί ως τιμή μιας σταθεράς κάθε ακέραιη τιμή από μέχρι τη μέγιστη τιμή που μπορεί να παρασταθεί στα δυαδικά ψηφία χωρίς να υπολογίζουμε ψηφίο προσήμου που απαιτούνται για τη μέγιστη τιμή της απαρίθμησης. Στο παράδειγμά μας μέγιστη τιμή της απαρίθμησης είναι η nine που αντιστοιχεί στο =. Η μέγιστη τιμή που μπορεί να παρασταθεί σε έξη δυαδικά ψηφία είναι =. Αν υπάρχουν και αρνητικές τιμές τότε ισχύουν τα ίδια αλλά θα πρέπει να υπολογίζουμε και ψηφίο προσήμου. Για παράδειγμα, αν στην απαρίθμηση του παραδείγματος βάλουμε άλλο ένα στοιχείο neg = -, τότε η περιοχή είναι από - μέχρι (παράσταση σε ψηφία). Αν βάλουμε neg = -, τότε η περιοχή είναι από - μέχρι (παράσταση σε ψηφία). Ο δικός σου μεταγλωττιστής, με ή χωρίς διμαρτυρίες (warnings), τη δέχτηκε! Συμβαίνουν και αυτά...

11 * Εσωτερική Παράσταση Δεδομένων x ~x x & y x y Σχ. - Η ψηφιοπράξη ~ (συμπλήρωμα ως προς ). Σχ. - (and). Ψηφιοπράξη & Πάντως είναι πολύ πιθανό, ο μεταγλωττιστής σου να δεχτεί χωρίς διαμαρτύρίές ως τιμή μεταβλητής τύπου Digit τη static_cast<digit>(n) όπου n τυχούσα τιμή τύπου int.. Ψηφιοπράξεις στη C++ Η C++ προσφέρει ορισμένες πράξεις που επιτρέπουν διαχείριση των τιμών όλων των ακέραιων τύπων της (δυαδικό) ψηφίο προς ψηφίο για τον λόγο αυτόν τις ονομάζουμε ψηφιοπράξεις (bitwise operations). Ας τις δούμε ξεκινώντας από τις πράξεις ολίσθησης (shift). Ας πούμε ότι έχουμε: unsigned char x, y; //... x = ; Στη μνήμη θα αποθηκευτούν σε μια ψηφιολέξη τα εξής: Αν δώσουμε την εντολή y = x << (ολίσθησε αριστερά κατά δυαδικά ψηφία), θα συμβούν τα εξής: οι τιμές όλων των ψηφίων της x θα ολισθήσουν κατά θέσεις προς τα αριστερά, τα πρώτα (από αριστερά, και ) θα χαθούν, τα δυο τελευταία θα γίνουν. Ο τύπος του αποτελέσματος είναι ίδιος με τον τύπο του πρώτου ορίσματος. Έτσι, στη θέση y θα αποθηκευτούν τα εξής: Σχεδόν παρομοίως γίνεται και η ολίσθηση δεξιά. Αν δώσουμε την εντολή y = x >> (ολίσθησε δεξιά κατά δυαδικά ψηφία), θα πάρουμε στη y: Το «σχεδόν» τι αφορά; Το «γέμισμα» με μηδενικά: Αν ο τύπος της x είναι unsigned τότε οι πρώτες θέσεις που «αδειάζουν» θα «γεμίσουν» με μηδενικά. Αν ο τύπος της x δεν είναι unsigned και το ψηφίο προσήμου είναι το πώς θα γεμίσουν οι θέσεις που αδειάζουν μπορεί να αλλάζει από τον έναν μεταγλωττιστή στον άλλον. Ορίζονται και οι σχετικές συντομογραφίες για την εκχώρηση: Αντί για x = x << N μπορείς να γράφεις x <<= N και αντί για x = x >> N μπορείς να γράφεις x >>= N. Στα παραδείγματα αυτά με την ολίσθηση χάνονται. Για να δούμε τι συμβαίνει αν δεν έχουμε τέτοιες απώλειες. Ας πούμε ότι στο x έχουμε βάλει την τιμή, οπότε, όπως είπαμε, η εσωτερική παράσταση είναι:. Μετά τη y = x << η y γίνεται:.που είναι + = =, ενώ μετά τη y = x >> η y γίνεται:.που είναι + = = /, Δηλαδή, μπορούμε να πούμε: x << N σημαίνει x Ν και x >> N σημαίνει x / Ν ; Ναι,

12 Κεφάλαιο x y Σχ. - Ψηφιοπράξη (or). x y x ^ y Σχ. - Ψηφιοπράξη ^ (xor). x y αν δεν έχουμε υπερχείλιση (για τη << ) και αν δεν έχουμε περιπλοκές από τα πρόσημα (char, short, int, long). Αυτές οι δυο πράξεις μας δίνουν τη δυνατότητα να γράφουμε από την C++ δυο εντολές του επεξεργαστή. Είναι λοιπόν πολύ ταχύτερες από τις αντίστοιχες αριθμητικές, αλλά μην αρχίσεις να σκέφτεσαι να κάνεις έτσι πολλαπλασιασμούς και διαιρέσεις ακεραίων: χρειάζονται προσοχή στη χρήση και οι πιθανότητες για λάθη είναι πάρα πολλές. Παρατήρηση: Ο προσεκτικός αναγνώστης, διαβάζοντας για τους τελεστές ολίσθησης, << και >>, θα πρέπει να ανησύχησε: πώς δεν γίνεται μπέρδεμα με τους ίδιους (οπτικώς) τελεστές που χρησιμοποιούμε για γράψιμο και διάβασμα τιμών; Οι τελεστές ολίσθησης περιμένουν δύο ορίσματα που είναι ακέραιοι αριθμοί, ενώ οι τελεστές εισόδου/εξόδου χρειάζονται αριστερά κάποιο ρεύμα. Βεβαίως, σε ορισμένες περιπτώσεις χρειάζεται λίγη προσοχή. Αν γράψεις: int x = ; cout << x << << endl; cout << (x << ) << endl; θα πάρεις αποτέλεσμα: Το προέρχεται από την πρώτη εντολή εκτύπωσης, που λέει: γράψε την τιμή της x, που είναι και στη συνέχεια γράψε και το έτσι παίρνουμε αυτό το. Η δεύτερη εντολή λέει: τύπωσε το αποτέλεσμα της πράξης x <<, που, όπως είδαμε, είναι. Η C++ μας επιτρέπει ακόμη τις πράξεις ~, &, και ^ μεταξύ τιμών ακέραιων τύπων (αντίστοιχες των!, &&, και!= μεταξύ λογικών τιμών). Αν οι x, y είναι τύπου unsigned char: Η ~x (Σχ. -) προκύπτει από τη x με αλλαγή κάθε ψηφίου σε και κάθε ψηφίου σε (συμπλήρωμα ως προς ). Η x & y προκύπτει από τις x και y με and μεταξύ των αντίστοιχων ψηφίων τους. Στο Σχ. - βλέπεις ότι το μοναδικό που προκύπτει είναι στο ψηφίο διότι στη θέση αυτήν έχουν και η x και η y. Η x y προκύπτει από τις x και y με or μεταξύ των αντίστοιχων ψηφίων τους. Στο Σχ. - βλέπεις ότι η x y έχει στις θέσεις που έχουν και η x και η y, όπου έχει η x και όπου έχει η y. Αν δεν έχουμε πρόσημα και στην ίδια θέση τότε το x y είναι το ίδιο με το x + y. Π.χ. αν στη y είχαμε (παράσταση του ) τότε το x y είναι που είναι παράσταση του = +. Η x ^ y προκύπτει από τις x και y με xor μεταξύ των αντίστοιχων ψηφίων τους. Στο Σχ. - βλέπεις ότι η x ^ y έχει στις θέσεις όπου έχει μόνον η x και όπου έχει μόνον η y. Για τους τρεις διμελείς ορίζονται συντομογραφίες εκχώρησης: Αντί για x = x & y μπορείς να γράφεις x &= y,

13 * Εσωτερική Παράσταση Δεδομένων αντί για x = x y μπορείς να γράφεις x = y και αντί για x = x ^ y μπορείς να γράφεις x ^= y. Εδώ όμως χρειάζεται και πάλι προσοχή: Ας πούμε ότι έχεις: short int m( ); char c( - ); και θέλεις να υπολογίσεις το: m = c. Η c έχει εσωτερική παράσταση:. Για να γίνει η ψηφιοπράξη θα πρέπει η m και η c να έχουν εσωτερική παράσταση με το ίδιο πλήθος ψηφίων. Η m «προωθείται» σε short int με εσωτερική παράσταση (= - σε short int)!!! Μάλλον δεν είναι αυτό που θέλεις. Αν είχες δηλώσει: unsigned char c( ); η c θα είχε την ίδια εσωτερική παράσταση () και με την προώθηση θα γίνονταν. Μετά από όσα είπαμε μπορείς να καταλάβεις τη σύσταση του (CERT ): Χρησιμοποίησε τους τελεστές ψηφιοπράξεων μόνο με ορίσματα τύπων unsigned. Ας δούμε τώρα ένα παράδειγμα χρήσης των << και &. Παράδειγμα Θέλουμε να γράψουμε μια: int bitvalue( unsigned char b, int pos ) που θα μας επιστρέφει την τιμή του ψηφίου στη θέση pos της ψηφιολέξης b. Πώς θα σκεφτούμε; Ας πούμε ότι έχουμε δηλώσει: unsigned char t και η t έχει σε όλες τις θέσεις εκτός από την pos όπου έχει. Πώς θα είναι τα ψηφία της b & t; Αφού η t έχει σε όλες τις θέσεις εκτός από την pos και αφού ξέρουμε ότι P && false false, το ίδιο θα ισχύει και για την b & t: θα έχει σε όλες τις θέσεις εκτός από την pos. Στη θέση pos, όπου η t έχει : Αν η b έχει τότε και η b & t θα πάρει και θα έχει τιμή (μηδέν) αφού θα έχει παντού μηδενικά. Αν η b έχει τότε και η b & t θα πάρει και θα έχει τιμή αφού θα έχει ένα μη μηδενικό ψηφίο. Και πώς θα δώσουμε στην t την τιμή που θέλουμε; Έτσι: unsigned char t( ); t = t << pos; δηλαδή: Δίνοντας στην t τιμή βάζουμε στο ψηφίο της t και σε όλα τα άλλα και με την t = t << pos μεταφέρουμε το, κατά pos θέσεις προς τα αριστερά, ενώ σε όλες τις άλλες θέσεις υπάρχουν. Πριν γράψουμε τη συνάρτησή να παρατηρήσουμε ότι ενώ ορίζεται για όλες τις τιμές της b, δεν ορίζεται για τιμές της pos < ή > δηλαδή δεν είναι ολική. Να λοιπόν πώς θα είναι η int bitvalue( unsigned char b, int pos ) if ( pos < < pos ) throw pos; unsigned char t( ); t <<= pos; Σύσταση INT: Use bitwise operators only on unsigned operands. Αν μελετάς σωστά αυτό το κεφάλαιο, θα έχεις ήδη παραβιάσει τη συσταση και θα την παραβιάσεις αρκετές φορές ακόμη για να δεις εσωτερικές παραστάσεις αρνητικών αριθμών. Δεν πειράζει, αφού είναι για εκπαιδευτικούς λόγους!

14 Κεφάλαιο return ( ((b & t)!= )? : ); } // bitvalue ζητάς: Αν θέλεις να δεις την εσωτερική παράσταση του (unsigned char) δηλώνεις unsigned char x( ); for ( int pos(); pos >= ; --pos ) cout << bitvalue( x, pos ); cout << endl; και παίρνεις: Με χρήση της bitvalue() μπορούμε να γράψουμε τη: void display( ostream& tout, unsigned char b ) for ( int pos(); pos >= ; --pos ) tout << bitvalue( b, pos ); } // display που σου είναι χρήσιμη αν μελετάς σοβαρά αυτό το κεφάλαιο. Το παρακάτω πρόγραμμα μας δίνει τις εσωτερικές παραστάσεις των ακεραίων και χρησιμοποιώντας την display(): #include <iostream> using namespace std; int bitvalue( unsigned char b, int pos ); void display( ostream& tout, unsigned char b ); int main() unsigned char x; int k; try x = ; display( cout, x ); cout << endl; x = ; display( cout, x ); cout << endl; } catch ( int& p ) cout << " η bitvalue κλήθηκε με δεύτερο όρισμα " << p << endl; } } // main. Ψηφιοχάρτες και Συνηθισμένες Πράξεις Παρ' όλο που στα παραδείγματά μας, μέχρι τώρα, το τελικό μας ενδιαφέρον φαίνεται να βρίσκεται στην τιμή της ψηφιολέξης ή, γενικώς, της συνολικής παράστασης, η διαχείριση δυαδικών ψηφίων είναι ενδιαφέρουσα καθ εαυτή. Με τη διαχείριση δυαδικών ψηφίων, εκτός άλλων εφαρμογών, μπορούμε να υλοποιήσουμε σύνολα, στα οποία μας ενδιαφέρει μόνον η πληροφορία ανήκει ( ) ή δεν ανήκει ( ). Σε τέτοιες περιπτώσεις χρησιμοποιούμε πίνακες ακέραιων τιμών, π.χ. τύπου unsigned long, που όμως τις βλέπουμε ως ψηφιοσύνολα (bitsets) ή ψηφιοχάρτες (bitmaps). Ο όρος bitmap χρησιμοποιείται και σε έναν τρόπο παράστασης γραφικών (bitmap graphics).

15 * Εσωτερική Παράσταση Δεδομένων Στη συνέχεια δίνουμε μερικές συναρτήσεις για την ακρίβεια: περιγράμματα συναρτησεων για μερικές πολύ συνηθισμένες περιπτώσεις διαχείρισης ψηφιοπινάκων. Μπορεί να κληθούν με τύπο πρώτης παραμέτρου (T) κάποιον από τους int, unsigned int, long, unsigned long, short, unsigned short, char, unsigned char, wchar_t, long long, unsigned long long. Μερικές από αυτές ρίχνουν εξαίρεση τύπου: struct BitmapXptn enum outofrange, paramerr }; char funcname[]; int errorcode; int errval, errval; BitmapXptn( const char* mn, int ec, int v, int v = ) strncpy( funcname, mn, ); funcname[] = '\'; errorcode = ec; errval = v; errval = v; } }; // BitmapXptn Προσοχή! Στα σχόλια τεκμηρίωσης (και μόνο) των περιγραμμάτων που δίνουμε στη συνέχεια θα χρησιμοποιούμε τον συμβολισμό b[pos] για το δυαδικό ψηφίο της b στη θέση pos. Ο συμβολισμός αυτός δεν είναι δεκτός από τη C++ για τέτοια χρήση... Τιμή Δυαδικού Ψηφίου Ξεκινούμε μετατρέποντας σε περίγραμμα τη bitvalue που γράψαμε πιο πριν: template < typename T > int bitvalue( T b, int pos ) Η βασική διαφορά είναι ότι τώρα το τελευταίο δυαδικό ψηφίο δεν βρίσκεται στη θέση, αλλά στη θέση (sizeof b) - Έτσι έχουμε: // bitvalue -- επιστρέφει τη b[pos] // Προϋπόθεση: <= pos < *(sizeof b) template < typename T > int bitvalue( T b, int pos ) if ( pos < *(sizeof b) <= pos ) throw BitmapXptn( "bitvalue", BitmapXptn::outOfRange, pos ); T t( ); t <<= pos; return ( ((b & t)!= )? : ); } // bitvalue Μετατρέπουμε σε περίγραμμα και τη display() για να μπορείς να κάνεις τις δοκιμές σου: template < typename T > void display( ostream& tout, T b ) int lastb( *(sizeof b) - ); for ( int pos(lastb); pos >= ; --pos ) tout << bitvalue( b, pos ); } // display Κανονικώς θα πρέπει να ελέγχουμε αν είναι ανοικτό το ρεύμα, αν το γράψιμο έγινε επιτυχώς και να ρίχνουμε τις αντίστοιχες εξαιρέσεις.

16 Κεφάλαιο.. Βάλε Τιμή σε Δυαδικό Ψηφίο Θέλουμε ένα περίγραμμα συνάρτησης: template < typename T > void setbit( T& b, int pos ) που θα αλλάζει το πρώτο όρισμα ώστε να έχει: στο δυαδικό ψηφίο της θέσης pos. τις τιμές που έχει αρχικώς η b σε όλες τις άλλες θέσεις. Φυσικά θα πρέπει να υπάρχει «δυαδικό ψηφίο της θέσης pos», δηλαδή: <= pos < (sizeof b) Πώς θα πετύχουμε το στόχο μας; Όπως μάθαμε, μετά τις T t( ); t <<= pos; η t έχει σε όλες τις θέσεις εκτός από την pos όπου έχει. Η τιμή της παράστασης b t θα έχει: στο δυαδικό ψηφίο της θέσης pos, αφού η t έχει και ξέρουμε ότι P true true. τις τιμές που έχει αρχικώς η b σε όλες τις άλλες θέσεις, αφού η t έχει παντού και ξέρουμε ότι P false P. Να λοιπόν το περίγραμμα της συνάρτησης: // setbit -- αλλάζει την τιμή της πρώτης παραμέτρου βάζοντας // "" στη θέση pos // Προϋπόθεση: <= pos < *(sizeof b) // Απαίτηση: // bτελ[pos] == && για κάθε k!=pos: bτελ[k]==bαρχ[k] template < typename T > void setbit( T& b, int pos ) if ( pos < *(sizeof b) - < pos ) throw BitmapXptn( "setbit", BitmapXptn::outOfRange, pos ); T t( ); t <<= pos; b = t; } // setbit Ας δούμε δύο παραδείγματα χρήσης: Παράδειγμα Σε μια μεταβλητή si τύπου unsigned short int ( δυαδικά ψηφία) θέλουμε να έχουμε όλα τα ψηφία εκτός από αυτά που βρίσκονται στις θέσεις, και : si = ; setbit( si, ); setbit( si, ); setbit( si, ); display( cout, si ); cout << endl; Αποτέλεσμα: Παράδειγμα Σε μια μεταβλητή si τύπου unsigned short int θέλουμε να εκχωρήσουμε την τιμή μιας άλλης μεταβλητής uc τύπου unsigned char. Θέλουμε ακόμη, το ψηφίο της si να έχει τιμή : display( cout, uc ); cout << endl; si = uc; setbit( si, ); display( cout, si ); cout << endl; Αποτέλεσμα:

17 * Εσωτερική Παράσταση Δεδομένων Παρατήρηση: Ένα εύλογο ερώτημα που μπορεί να έχουν πολλοί είναι το εξής: Γιατί να μην ελέγξουμε αν το συγκεκριμένο ψηφίο είναι ήδη ; Στην περίπτωση αυτή δεν χρειάζεται να κάνουμε οτιδήποτε. Ας το δούμε ο έλεγχος θα γίνει όπως είδαμε στη bitvalue(): T t( ); t <<= pos; if ( (b & t) == ) b = t; Δηλαδή: Σε κάθε περίπτωση έχουμε υπολογισμό της b & t και της if και Όταν το ψηφίο δεν έχει τιμή εκτέλεση και της b = t. Προφανώς ο τρόπος που επιλέξαμε υπολογισμός μόνον της b = t είναι σαφώς πιο συμφέρων... Βάλε Τιμή σε Δυαδικό Ψηφίο Θέλουμε ένα περίγραμμα συνάρτησης: template < typename T > void clearbit( T& b, int pos ) που θα αλλάζει το πρώτο όρισμα ώστε να έχει: στο δυαδικό ψηφίο της θέσης pos. τις τιμές που έχει αρχικώς η b σε όλες τις άλλες θέσεις. Η λύση στο πρόβλημά μας μπορεί να προκύψει από τη λύση στο προηγούμενο πρόβλημα αν εναλλάξουμε τα και καθώς και τα and και or: Πράγματι, ας πούμε ότι η t έχει σε όλες τις θέσεις εκτός από την pos όπου έχει. Η τιμή της παράστασης b & t θα έχει: στο δυαδικό ψηφίο της θέσης pos, αφού η t έχει και ξέρουμε ότι P && false false. τις τιμές που έχει αρχικώς η b σε όλες τις άλλες θέσεις, αφού η t έχει παντού και ξέρουμε ότι P && true P. Και πώς κάνουμε την t να «έχει σε όλες τις θέσεις εκτός από την pos όπου έχει»; Αυτό είναι απλό: T t( ); t <<= pos; t = ~t; Να λοιπόν η // clearbit -- αλλάζει την τιμή της πρώτης παραμέτρου βάζοντας // "" στη θέση pos // Προϋπόθεση: <= pos < *(sizeof b) // Απαίτηση: // bτελ[pos] == && για κάθε k!=pos: bτελ[k]==bαρχ[k] template < typename T > void clearbit( T& b, int pos ) if ( pos < *(sizeof b) - < pos ) throw BitmapXptn( "clearbit", BitmapXptn::outOfRange, pos ); T t( ); t <<= pos; t = ~t; b &= t; } // clearbit

18 Κεφάλαιο Παράδειγμα Σε μια μεταβλητή m τύπου unsigned short int θέλουμε να εκχωρήσουμε την τιμή της si του Παραδ., της προηγούμενης παραγράφου, με τη διαφορά ότι η m θα έχει σε όλες τις άρτιες θέσεις: m = si; for ( int k(); k < *sizeof(m); k += ) clearbit( m, k ); display( cout, m ); cout << endl; Αποτέλεσμα:.. Πλήθος "" Θέλουμε ένα περίγραμμα συνάρτησης: template < typename T > size_t count( T b ) που θα επιστρέφει ως τιμή το πλήθος των δυαδικών ψηφίων της που έχουν τιμή σε τιμή b τύπου T. Θα μπορούσαμε να καλέσουμε (sizeof b) φορές. Αντί για αυτό εξετάζουμε τόσες φορές την τιμή της b & t όπου η t τύπου T έχει μόνο ένα. Κάθε φορά το μετατοπίζεται ώστε να περάσει από όλες τις θέσεις της t. // count -- επιστρέφει το πλήθος των ψηφίων της b με τιμή // Προϋπόθεση: true // Απαίτηση: fv == πληθος ψηφίων της b με τιμή template < typename T > size_t count( T b ) const size_t lastb( *(sizeof b) ); T t( ); size_t fv( ); for ( int k(); k <= lastb; ++k ) if ( (b & t)!= ) ++fv; t <<= ; } return fv; } // count Αν η b υλοποιεί κάποιο σύνολο ( : «ανήκει»), η count μας δίνει τον πληθάριθμο του συνόλου... Μέρος Ψηφιοχάρτη Θέλουμε ένα περίγραμμα συνάρτησης: template < typename T > T part( T b, int pos, int pos ) που θα επιστρέφει ως τιμή τύπου T τα ψηφία της b από pos μέχρι και pos. Να το δούμε με ένα παράδειγμα: Ας πούμε ότι έχουμε ψηφιοχάρτη ψηφίων: Θέλουμε έναν ψηφιοχάρτη με το ίδιο μέγεθος που θα έχει το υπογραμμισμένο κομμάτι δηλαδή τα ψηφία από μέχρι και όλα τα άλλα ψηφία :

19 * Εσωτερική Παράσταση Δεδομένων Πρέπει δηλαδή να μηδενίσουμε τα ψηφία από μέχρι και από μέχρι. Αυτό μπορεί να γίνει με την clearbit μπορεί όμως να γίνει και ταχύτερα με τις πράξεις ολίσθησης. Αν στον αρχικό ψηφιοχάρτη κάνουμε μια ολίσθηση αριστερά και (=-) θέσεις θα πάρουμε: Αν σε αυτό κάνουμε ολίσθηση δεξιά κατά (= - + ) θα πάρουμε: Τέλος, με ολίσθηση αριστερά κατά θέσεις παίρνουμε αυτό που θέλουμε. Αν πάρουμε υπόψη μας ότι: αντί για έχουμε (γενικώς) το (sizeof b), είναι το pos και είναι το pos έχουμε: // part -- επιστρέφει το μέρος της b // με τα ψηφία της από pos μέχρι και pos // Προϋπόθεση: <= pos <= pos < *(sizeof v) // Απαίτηση: για κάθε k:..pos- bτελ[k]== && // για κάθε k: pos..pos bτελ[k]==bαρχ[k] && // για κάθε k: pos+..*(sizeof v)- bτελ[k]== template < typename T > T part( T b, int pos, int pos ) const size_t lastb( *(sizeof b) ); if ( pos < pos ) throw BitmapXptn( "part", BitmapXptn::paramErr, pos, pos ); if ( pos < pos < lastb < pos lastb < pos ) throw BitmapXptn( "part", BitmapXptn::outOfRange, pos, pos ); // <= pos <= pos <= lastb b <<= (lastb - pos); b >>= (lastb - pos + pos); b <<= pos; return b; } // part Παράδειγμα Αν η si είναι τύπου unsigned short int οι δίνουν: display( cout, si ); cout << endl; setbit( si, ); unsigned short int sip( part(si,, ) ); display( cout, sip ); cout << endl; Και δύο λόγια για την πρώτη εξαίρεση: Για ορισμένες εφαρμογές το pos < pos δεν είναι και τόσο παράνομο. Απλώς στην περίπτωση αυτήν η συνάρτηση θα πρέπει να επιστρέφει T(). Διαλέγεις και παίρνεις.. Τύποι bitmask Πρωτοείδαμε τον τελεστή στο Κεφ., όταν συζητούσαμε για άνοιγμα ρεύματος. Ας πούμε ότι είχαμε να γράψουμε εμείς μια συνάρτηση που να ανοίγει ένα ρεύμα προς/από αρχείο. Γυρίζουμε λοιπόν στην. για να θυμηθούμε τα συστατικά του τρόπου ανοίγματος και καταλαβαίνουμε ότι (αν δεν θέλουμε να βάλουμε ξεχωριστές παραμέτρους) θα πρέπει να βάλουμε μια παράμετρο τύπου: struct OpenFlags

20 Κεφάλαιο bool app; bool ate; bool binary; bool in; bool out; bool trunc; }; // OpenFlags Επειδή μια τέτοια παράμετρος πιάνει ψηφιολέξεις μπορούμε να κάνουμε οικονομία χρησιμοποιώντας ψηφιοπεδία: struct OpenFlagsBF bool app: ; bool ate: ; bool binary: ; bool in: ; bool out: ; bool trunc: ; }; // OpenFlagsBF Μια τιμή τύπου OpenFlagsBF δεν χρειάζεται πάνω από μια ψηφιολέξη. Σε αυτό το κεφάλαιο μάθαμε ότι μπορούμε να χειριστούμε το κάθε δυαδικό ψηφίο μιας τιμής ακέραιου τύπου. Και αφού οι τιμές που μπορεί να παίρνει είναι ή μπορούμε να το χειριστούμε ως τιμή τύπου bool. Έτσι, αντί για μεταβλητή τύπου OpenFlagsBF μας αρκεί μια μεταβλητή τύπου unsigned char (τη «μικρότερη» με δυαδικά ψηφία). Πράγματι, ας πούμε ότι σε μια τέτοια τιμή ορίζουμε ότι το δυαδικό ψηφίο ως σημαία για το app, το ψηφίο για το ate,, το ψηφίο για το trunc. Για να αποφύγουμε λάθη δηλώνουμε τις σταθερές: const unsigned char apppos =, atepos =, binarypos =, inpos =, outpos =, truncpos = ; Έτσι, για να πούμε ότι θέλουμε να ανοίξουμε ένα ρεύμα in, out και binary σε μια μεταβλητή: unsigned char om; βάζουμε: om = ; setbit( om, inpos ); setbit( om, outpos ); setbit( om, binarypos ); Ελέγχουμε αν, ας πούμε, το δυαδικό ψηφίο στη θέση binarypos έχει τιμή ελέγχουμε αν bitvalue(om, binarypos) ==. Μπορούμε να τα καταφέρουμε χωρίς τη setbit; Ναι! Δες μια άλλη, διαφορετική, ομάδα σταθερών: const unsigned char app =, ate = (app << ), binary = (app << ), in = (app << ), out = (app << ), trunc = (app << ); Αυτές δεν κρατούν τη θέση του ψηφίου που αντιστοιχεί στην κάθε σημαία αλλά σε εκείνη ακριβώς τη θέση έχουν το μοναδικό. Με αυτές δίνουμε στη om την τιμή που θέλουμε έτσι: om = in out binary; Αφού οι σταθερές έχουν τα σε διαφορετικές θέσεις θα μπορούσαμε να γράψουμε και: om = in + out + binary; Θα μπορούσαμε να είχαμε γράψει: const unsigned char app =, ate = ( << ), binary = ( << ), in = ( << ), out = ( << ), trunc = ( << );

21 * Εσωτερική Παράσταση Δεδομένων αλλά αυτό δεν είναι και πολύ καλή ιδέα! Πάντως μπορούμε να κάνουμε και αυτό που κάνουμε στη setbit: om = ; om = in; om = out; om = binary; Αν δεν έχουμε τη θέση πώς θα ελέγχουμε αν κάποιο ψηφίο έχει τιμή. Για να δούμε, ας πούμε, αν το δυαδικό ψηφίο στη θέση binarypos έχει τιμή ελέγχουμε αν (om & binary)!=. Τα παραπάνω είναι ένας τρόπος υλοποίησης ενός τύπου bitmask. Ένας τύπος bitmask έχει τα εξής χαρακτηριστικά: N+ σταθερές c =, c = ( << ),, cn( << N). Αν v, v τιμές του τύπου τότε και οι v & v, v v, v ^ v, ~v είναι τιμές του τύπου. Εκτός από τις ψηφιοπράξεις &,, ^, ~ ορίζονται και οι «συντομογραφίες» εκχώρησης &=, =, ^=. Μπορούμε να υλοποιήσουμε έναν τέτοιον τύπο με τρεις τρόπους.. Ο πρώτος είναι με κατάλληλο ακέραιο τύπο, δηλαδή τύπο που οι τιμές του να παριστάνονται σε N+ δυαδικά ψηφία τουλάχιστον. Παραπάνω, είδαμε παράδειγμα τέτοιας υλοποίησης. Αφού στην περίπτωσή μας N = οποιοσδήποτε ακέραιος τύπος είναι κατάλληλος. Επιλέγουμε τον «μικρότερο»: typedef unsigned char OpenMode; const OpenMode app =, ate = ( << ), binary = ( << ), in = ( << ), out = ( << ), trunc = ( << ); Όλες οι ψηφιοπράξεις που μας ενδιαφέρουν είναι ήδη ορισμένες.. Ο δεύτερος τρόπος υλοποίησης είναι με κάποιον απαριθμητό τύπο. Για το παράδειγμά μας ορίζουμε: enum OpenMode app =, ate = ( << ), binary = ( << ), in = ( << ), out = ( << ), trunc = ( << ) }; Αν δεν διάβασες την. να πούμε ότι θα πρέπει να ξεχάσεις αυτά που μάθαμε για τους απαριθμητούς τύπους: σε μια μεταβλητή τύπου OpenMode μπορούμε (με ή χωρίς διαμαρτυρίες από τον μεταγλωττιστή) να βάλουμε τιμές που δεν υπάρχουν στην παραπάνω απαρίθμηση. Αν και ορισμένοι μεταγλωττιστές θα δεχτούν με διαμαρτυρίες (warnings) να κάνουν ψηφιοπράξεις με αυτές τις σταθερές, το σωστό είναι να επιφορτώσεις τους τελεστές που είδαμε παραπάνω. Δίνουμε για το παράδειγμά μας την επιφόρτωση των & και &= : OpenMode operator&( OpenMode x, OpenMode y ) return static_cast<openmode>( static_cast<unsigned char>(x) & static_cast<unsigned char>(y) ); } // operator&( OpenMode OpenMode& operator&=( OpenMode& x, OpenMode y ) x = x & y; return x; } // operator&=( OpenMode Όπως βλέπεις, ενώ με τη χρήση της απαρίθμησης δεν χρειάστηκε να επιλέξουμε ακέραιο τύπο, χρειάζεται τώρα για την επιφόρτωση των τελεστών.. Ο τρίτος τρόπος υλοποίησης είναι με χρήση του περιγράμματος bitset της STL. Θα τον δούμε αργότερα. Οι τύποι bitmask χρησιμοποιούνται πολύ συχνά σε προγράμματα και βιβλιοθήκες C++ (και C).

22 Κεφάλαιο. Αριθμητικές Πράξεις και Ψηφιοπράξεις Σε υποσημείωση της. λέγαμε για την ios_base::in ios_base::out «αυτό μπορεί να το δεις και ως: ios_base::in+ios_base::out.» Στην προηγούμενη παράγραφο είδαμε γιατί μπορεί να γραφεί κάτι τέτοιο, τουλάχιστον για τον πρώτο τρόπο υλοποίησης ενός τύπου bitmask. Αλλά, για τον τρίτο τρόπο υλοποίησης, η πρόσθεση δεν είναι δεκτή ενώ για τον δεύτερο τρόπο θα πρέπει να βάλεις τυποθεωρήσεις ώστε να περνάει από όλους τους μεταγλωττιστές. Φυσικά, μπορεί να το δεις γραμμένο κάπου αλλού αλλά εσύ δεν θα πρέπει να το γράφεις με βάση το εξής σκεπτικό: Αφού αυτό που κάνουμε είναι διαχείριση δυαδικών ψηφίων και όχι αριθμητική πράξη γιατί να βάλουμε το + ; Μόνο και μόνο επειδή δουλεύει; Στις προηγούμενες παραγράφους επισημάναμε ότι είναι επικίνδυνο και το αντίστροφο: να προσπαθήσεις να πάρεις αριθμητικά αποτελέσματα με ψηφιοπράξεις. Τα αριθμητικά αποτελέσματα θα τα παίρνεις με αριθμητικές πράξεις. Καταλήγουμε λοιπόν στη σύσταση του (CERT ): Απόφυγε να κάνεις ψηφιοπράξεις και αριθμητικές πράξεις στα ίδια δεδομένα.. Παράσταση και Πράξεις στον Τύπο float Όπως ο int σε σχέση με το σύνολο Z των ακεραίων, έτσι και ο τύπος float, σε σύγκριση με το σύνολο R των πραγματικών, έχει δυο σοβαρούς περιορισμούς: Υπάρχει μέγιστος και ελάχιστος αριθμός τύπου float. Κάθε αριθμός τύπου float παριστάνεται με πεπερασμένο πλήθος ψηφίων. Συνήθως, έναν πραγματικό αριθμό x τον γράφουμε ως: σ ψn ψn-... ψ.ψ- ψ-... και με αυτό εννοούμε ότι: x = σ(ψn n + ψn- n ψ + ψ- - + ψ- -...) όπου σ: πρόσημο ( + ή - ) και ψ k : δεκαδικό ψηφίο. Φυσικά, ο ΗΥ δεν μπορεί να αποθηκεύσει στην μνήμη του τα άπειρα ψηφία ενός άρρητου αριθμού. Κάθε αριθμός παριστάνεται με πεπερασμένο αριθμό ψηφίων. Έχουμε λοιπόν απώλεια σημαντικών ψηφίων (loss of significant digits). Αυτό το σφάλμα, που εισάγεται με την παράσταση των πραγματικών αριθμών, μεγαλώνει με την εκτέλεση των πράξεων μεταξύ τους. Ας υποθέσουμε ότι δουλεύουμε σε έναν δεκαδικό υπολογιστή. Κάθε τιμή τύπου float, για να αποθηκευτεί, μετατρέπεται στη μορφή: Μ e () και αποθηκεύονται η μαντίσα (mantissa) Μ και ο εκθέτης (exponent) e. Η μαντίσα έχει τη μορφή: σ.ψ ψψψψ όπου σ το πρόσημο και ψ k, k =.. τα πέντε πιο σημαντικά ψηφία του αριθμού (με στρογγύλευση). Ο εκθέτης είναι διψήφιος ακέραιος και έχει τη μορφή: σ ε ε Η παράσταση στη μορφή () γίνεται μονοσήμαντη αν κάνουμε τη σύμβαση ότι το ψ δεν μπορεί να είναι μηδέν. Στην περίπτωση αυτήν λέμε ότι η παράσταση είναι κανονικοποιημένη (normalized). Θα παριστάνουμε την αποθηκευμένη πληροφορία, στη μορφή: σψ ψψψψ:σε ε Σύσταση INT: Avoid performing bitwise and arithmetic operations on the same data.

23 * Εσωτερική Παράσταση Δεδομένων Αυτό είναι ένα παράδειγμα αποθήκευσης σε μορφή κινητής υποδιαστολής (floating point). Το γνωστό μας π =..., θα αποθηκευτεί ως: +:+ (Θα γράφουμε π f = +:+ ή π f =.). Η μέγιστη θετική τιμή που μπορεί να αποθηκευτεί είναι η: +:+ ( =. ) και η ελάχιστη θετική τιμή: +:- ( =. - ) Ένα χαρακτηριστικό της υλοποίησης του τύπου float είναι ο ελάχιστος θετικός ε που αν προστεθεί στο μας δίνει τιμή μεγαλύτερη από : ε = min u ( u) } u Στον υπολογιστή μας, το παριστάνεται ως: +:+ και προφανώς η ελάχιστη αλλαγή που μπορούμε να του κάνουμε, είναι στο τελευταίο σημαντικό ψηφίο, κατά : +:+ ( =. =. ) Έχουμε λοιπόν ότι: ε =.. Προσοχή όμως! Αυτό δεν σημαίνει ότι για κάθε x float θα έχουμε και (x + ε) f Χ f. Για παράδειγμα: ( + ε) f = f (Άσκ. -). Πάντως το ε μας δείχνει πόσα σημαντικά ψηφία μπορούμε να παραστήσουμε: εφ' όσον μπορούμε να παραστήσουμε το +ε =. μπορούμε να παραστήσουμε σημαντικά ψηφία. Αν αυτό φαίνεται τετριμμένο τώρα που δουλεύουμε στο δεκαδικό σύστημα, δεν είναι τετριμμένο όταν δουλεύουμε στο δυαδικό ή στα παράγωγά του, που δεν μας είναι και τόσο οικεία. Μπορούμε λοιπόν να πούμε ότι ο τύπος float είναι υποσύνολο του συνόλου των πραγματικών: float R (ακριβέστερα: float Q (ρητοί)) Η αποθήκευση πραγματικών τιμών στον υπολογιστή, είναι μια απεικόνιση από το σύνολο R στο υποσύνολό του float. Μερικές ιδιότητες αυτής της απεικόνισης θα δούμε στη συνέχεια. Όπως φαίνεται από το παράδειγμά μας με το π, η αποθήκευση δεν γίνεται με ακρίβεια. Πάντως, για κάθε υπολογιστή, υπάρχει η εγγύηση ότι δυο τουλάχιστον πραγματικοί αριθμοί παριστάνονται με ακρίβεια: το (μηδέν) και το (ένα)! Το παριστάνεται ως: +:+ και το ως: +:+ ( =. = ) f == και f == Ο δείκτης f υποδηλώνει την παράσταση στο σύνολο float. Αν μια πραγματική τιμή α παριστάνεται στο σύνολο float με την α f, τότε και η -α παριστάνεται στο float και μάλιστα με την -α f : (-α) f == -α f Όπως είδαμε παραπάνω, η τιμή..., θα αποθηκευτεί ως: +:+ Αλλά με τον ίδιο τρόπο θα αποθηκευτεί και η τιμή. και η. κλπ. Γενικά: Αν οι τιμές α, α παριστάνονται στον υπολογιστή με την ίδια τιμή τ float, τότε με την ίδια τιμή παριστάνονται όλες οι τιμές του διαστήματος [α, α ]. f f

24 Κεφάλαιο Από την ιδιότητα αυτή βγαίνουν τα εξής: αν α > β τότε α f β f αν α == β τότε α f == β f αν α < β τότε α f β f Ας δούμε τώρα τι γίνεται με τις πράξεις. Το πρώτο που θα δούμε είναι η υπερχείλιση και η υποχείλιση: είναι δυνατόν το αποτέλεσμα μιας πράξης να μην παριστάνεται γιατί είναι πολύ μεγάλο ή πολύ μικρό. Οι τιμές: +:+ ( =. ) και +:+ ( =. ) παριστάνονται στον υπολογιστή μας χωρίς πρόβλημα. Το άθροισμά τους όμως,. =. δεν μπορεί να παρασταθεί διότι είναι πολύ μεγάλο για τον υπολογιστή μας! 'Εχουμε δηλαδή υπερχείλιση (overflow). Τι θα κάνει ο υπολογιστής σε μια τέτοια περίπτωση; Σίγουρα θα σου δώσει μήνυμα για την κατάσταση που δημιουργήθηκε στις περισσότερες περιπτώσεις θα σταματήσει και την εκτέλεση του προγράμματος. 'Οπως καταλαβαίνεις, τέτοια αποτελέσματα μπορεί να βγουν και από τις τέσσερις πράξεις της αριθμητικής, όταν τις εκτελεί ο υπολογιστής. Δηλαδή: Το σύνολο float δεν είναι κλειστό ως προς τις πράξεις +, -, * και /. Καταλαβαίνεις ακόμη, ότι η υπερχείλιση στον τύπο float είναι λιγότερο επικίνδυνη από αυτήν του int, αφού αποφεύγεις την περίπτωση να συνεχιστεί η εκτέλεση του προγράμματος με τιμές που δεν έχουν νόημα. Έχει νόημα να γράψουμε κάτι σαν addfloat, για ασφαλή πρόσθεση τιμών float; Ναι, διότι συχνά ξέρεις τί πρέπει να κάνεις σε περίπτωση υπερχείλισης και οπωσδήποτε είναι ενοχλητικό να βλέπεις το πρόγραμμα να σταματάει, έστω και αν σου γνωστοποιεί τί έγινε. Αν από τον: +:- ( =. - ) αφαιρέσουμε τον: +:- ( =. - ) το αποτέλεσμα. - =. - δεν μπορεί να παρασταθεί στον υπολογιστή μας, γιατί είναι πολύ μικρό! Στην περίπτωση αυτή λέμε ότι έχουμε υποχείλιση (underflow). Συνήθως, ο υπολογιστής σε μια τέτοια περίπτωση θα βάλει το αποτέλεσμα (μηδέν) χωρίς ειδοποίηση για το τι έγινε. Αλλά, αυτό δεν είναι και τόσο τραγικό! Ας δούμε τώρα ένα άλλο επακόλουθο της πεπερασμένης παράστασης. Έστω ότι θέλουμε να προσθέσουμε με τον υπολογιστή μας τους αριθμούς. και.. Η αποθήκευσή τους θα γίνει με ακρίβεια: +:+ ( =. =. ) και +:+ ( =. =. ) Για να τους προσθέσει ο υπολογιστής θα πρέπει πρώτα να τους μετασχηματίσει ώστε να έχουν τον ίδιο εκθέτη. Για την ακρίβεια μετασχηματίζει την τιμή με το μικρότερο εκθέτη (στρογγυλεύοντας σε πέντε θέσεις) : Συνήθως, η Αριθμητική Μονάδα του υπολογιστή θα κάνει τις πράξεις με μεγαλύτερη ακρίβεια, αλλά η τιμή που θα μας επιστρέψει τελικά είναι σύμφωνη με τη μορφή που έχουμε στην αποθήκευση. Στην περίπτωσή μας, η δεύτερη τιμή θα γίνει: +:+ Στη συνέχεια θα γίνει η πρόσθεση: +:+ Αλλά, το αποτέλεσμα που θα είναι διαθέσιμο στο πρόγραμμά μας θα είναι: +:+

25 * Εσωτερική Παράσταση Δεδομένων +:+ Στη συνέχεια κάνει την πρόσθεση: +:+ Βλέπουμε λοιπόν, ότι και οι πράξεις εισάγουν σφάλματα στρογγύλευσης (roundoff errors). Πρόσεξε ότι, αν προσπαθούσαμε να προσθέσουμε στο. τον., το αποτέλεσμα θα ήταν.! Θα πρέπει να έχει γίνει πια φανερό, ότι όπως ξεχωρίσαμε τις ακέραιες τιμές από τις παραστάσεις τους στον τύπο int, θα πρέπει να ξεχωρίσουμε και τις πράξεις των πραγματικών από αυτές του υπολογιστή για τον τύπο float. Θα παριστάνουμε λοιπόν με: + f - f * f / f τις πράξεις: + - / όπως εκτελούνται στον υπολογιστή. Στη συνέχεια θα δούμε μερικές «αναμενόμενες» ιδιότητες των πράξεων αλλά και μερικές «περίεργες». Το σύμβολο της ισότητας θα έχει πιο γενικό νόημα από ότι συνήθως: π == π, όπου π, π αριθμητικές παραστάσεις, θα σημαίνει ότι: αν μεν οι πράξεις γίνουν χωρίς πρόβλημα (υπερχείλιση ή υποχείλιση) οι τιμές των δύο παραστάσεων θα είναι ίσες θα έχουμε υπερχείλιση ή υποχείλιση αριστερά αν και μόνον αν έχουμε το ίδιο πράγμα και δεξιά. Η αντιμεταθετικότητα της πρόσθεσης και του πολλαπλασιασμού ισχύει στον τύπο float: Αν a, b float τότε a + f b = b + f a και a * f b = b * f a Αυτές οι ισότητες ισχύουν με το γενικευμένο νόημα που δώσαμε πιο πάνω. Η προσεταιριστικότητα της πρόσθεσης δεν ισχύει! Ας δούμε ένα Παράδειγμα Οι αριθμοί a =., b =., c = -. παριστάνονται στον υπολογιστή μας με ακρίβεια. Το άθροισμα: ( a + f b ) + f c = (. + f.) + f (-. ) =. + f (-. ) =. δεν είναι ίσο με το: a + f ( b + f c ) =. + f (. + f. ) =. + f. =. Παρ' όλα αυτά, αν: a, b float και a b, ισχύει η γνωστή μας ιδιότητα: ( a - f b ) + f b == a δηλαδή: η πρόσθεση ακυρώνει την αφαίρεση. Προβλήματα έχουμε και με την προσεταιριστικότητα του πολλαπλασιασμού: Αν πάρουμε: a =., b =., c =. - τότε το γινόμενο: ( a * f b ) * f c = (. * f. ) * f. - =. * f. - (υπερχείλιση!!) δεν είναι ίσο με το: a * f ( b * f c ) =. * f (. * f. - ) =. * f. - =.

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ Γεώργιος Παπαϊωάννου (2013-16) gepap@aueb.gr Περιγραφή: Βασικοί Τύποι Πίνακες (μέρος 1) Συμβολοσειρές Ο Προεπεξεργαστής Τελευταία ενημέρωση: Σεπτέμβριος 2016 Εισαγωγή - 2 short:

Διαβάστε περισσότερα

2. ΑΡΙΘΜΗΤΙΚΗ ΤΟΥ ΥΠΟΛΟΓΙΣΤΗ. 2.1 Αριθμητικά συστήματα

2. ΑΡΙΘΜΗΤΙΚΗ ΤΟΥ ΥΠΟΛΟΓΙΣΤΗ. 2.1 Αριθμητικά συστήματα 2. ΑΡΙΘΜΗΤΙΚΗ ΤΟΥ ΥΠΟΛΟΓΙΣΤΗ 2.1 Αριθμητικά συστήματα Κάθε πραγματικός αριθμός χ μπορεί να παρασταθεί σε ένα αριθμητικό σύστημα με βάση β>1 με μια δυναμοσειρά της μορφής, -οο * = ± Σ ψ β " (2 1) η - ν

Διαβάστε περισσότερα

Διανύσματα στις 3 Διαστάσεις

Διανύσματα στις 3 Διαστάσεις project 2 Διανύσματα στις 3 Διαστάσεις Περιεχόμενα: Prj02.1 Το Πρόβλημα... 485 Prj02.2 Ο Τύπος Vector3 και οι Δημιουργοί... 486 Prj02.3 Οι Τελεστές Σύγκρισης... 487 Prj02.4 Οι Τελεστές +, -, *, ^... 488

Διαβάστε περισσότερα

Προγραμματισμός Υπολογιστών με C++

Προγραμματισμός Υπολογιστών με C++ Προγραμματισμός Υπολογιστών με C++ ( 2012-13 ) 2η διάλεξη Ίων Ανδρουτσόπουλος http://www.aueb.gr/users/ion/ 1 Τι θα ακούσετε σήμερα Βασικοί αριθμητικοί τύποι, μετατροπές τύπων και σταθερές. Πίνακες. Πίνακες

Διαβάστε περισσότερα

Στοιχειώδης προγραμματισμός σε C++

Στοιχειώδης προγραμματισμός σε C++ Στοιχειώδης προγραμματισμός σε C++ Σύντομο Ιστορικό. Το πρόγραμμα Hello World. Ο τελεστής εξόδου. Μεταβλητές και δηλώσεις τους. Αντικείμενα, μεταβλητές, σταθερές. Ο τελεστής εισόδου. Θεμελιώδεις τύποι.

Διαβάστε περισσότερα

1.4 Αριθμητική υπολογιστών και σφάλματα

1.4 Αριθμητική υπολογιστών και σφάλματα Γ. Γεωργίου, Αριθμητική Ανάλυση 1.4 Αριθμητική υπολογιστών και σφάλματα Στην παράγραφο αυτή καλύπτουμε πρώτα γενικά το θέμα της αριθμητικής υπολογιστών και στην συνέχεια διαπραγματευόμαστε την έννοια του

Διαβάστε περισσότερα

3 η Διάλεξη C++ - Βασικοί τύποι δεδομένων. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

3 η Διάλεξη C++ - Βασικοί τύποι δεδομένων. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ 3 η Διάλεξη C++ - Βασικοί τύποι δεδομένων Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ Ο τύπος int Ο τύπος δεδομένων τύπου int αναφέρεται στα ακέραια μεγέθη. Σταθερές, μεταβλητές, παραστάσεις και

Διαβάστε περισσότερα

Εισαγωγή στην Πληροφορική & τον Προγραμματισμό

Εισαγωγή στην Πληροφορική & τον Προγραμματισμό ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Εισαγωγή στην Πληροφορική & τον Προγραμματισμό Ενότητα 3 η : Κωδικοποίηση & Παράσταση Δεδομένων Ι. Ψαρομήλιγκος Χ. Κυτάγιας Τμήμα

Διαβάστε περισσότερα

1 Αριθμητική κινητής υποδιαστολής και σφάλματα στρογγύλευσης

1 Αριθμητική κινητής υποδιαστολής και σφάλματα στρογγύλευσης 1 Αριθμητική κινητής υποδιαστολής και σφάλματα στρογγύλευσης Στη συγκεκριμένη ενότητα εξετάζουμε θέματα σχετικά με την αριθμητική πεπερασμένης ακρίβειας που χρησιμοποιούν οι σημερινοί υπολογιστές και τα

Διαβάστε περισσότερα

! Εάν ο αριθμός διαθέτει περισσότερα bits, χρησιμοποιούμε μεγαλύτερες δυνάμεις του 2. ! Προσοχή στη θέση του περισσότερο σημαντικού bit!

! Εάν ο αριθμός διαθέτει περισσότερα bits, χρησιμοποιούμε μεγαλύτερες δυνάμεις του 2. ! Προσοχή στη θέση του περισσότερο σημαντικού bit! Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 25-6 Πράξεις με δυαδικούς αριθμούς (αριθμητικές ) http://di.ionio.gr/~mistral/tp/csintro/ Αριθμοί Πράξεις με δυαδικούς αριθμούς

Διαβάστε περισσότερα

Πράξεις με δυαδικούς αριθμούς

Πράξεις με δυαδικούς αριθμούς Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 25-6 Πράξεις με δυαδικούς αριθμούς (αριθμητικές πράξεις) http://di.ionio.gr/~mistral/tp/csintro/ Μ.Στεφανιδάκης Πράξεις με δυαδικούς

Διαβάστε περισσότερα

Αριθμητική Ανάλυση & Εφαρμογές

Αριθμητική Ανάλυση & Εφαρμογές Αριθμητική Ανάλυση & Εφαρμογές Διδάσκων: Δημήτριος Ι. Φωτιάδης Τμήμα Μηχανικών Επιστήμης Υλικών Ιωάννινα 2017-2018 Υπολογισμοί και Σφάλματα Παράσταση Πραγματικών Αριθμών Συστήματα Αριθμών Παράσταση Ακέραιου

Διαβάστε περισσότερα

Δύο είναι οι κύριες αιτίες που μπορούμε να πάρουμε από τον υπολογιστή λανθασμένα αποτελέσματα εξαιτίας των σφαλμάτων στρογγυλοποίησης:

Δύο είναι οι κύριες αιτίες που μπορούμε να πάρουμε από τον υπολογιστή λανθασμένα αποτελέσματα εξαιτίας των σφαλμάτων στρογγυλοποίησης: Ορολογία bit (binary digit): δυαδικό ψηφίο. Τα δυαδικά ψηφία είναι το 0 και το 1 1 byte = 8 bits word: η θεμελιώδης μονάδα σύμφωνα με την οποία εκπροσωπούνται οι πληροφορίες στον υπολογιστή. Αποτελείται

Διαβάστε περισσότερα

Διαδικασιακός Προγραμματισμός

Διαδικασιακός Προγραμματισμός Τμήμα ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ Διαδικασιακός Προγραμματισμός Διάλεξη 2 η Τύποι Δεδομένων Δήλωση Μεταβλητών Έξοδος Δεδομένων Οι διαλέξεις βασίζονται στο βιβλίο των Τσελίκη και Τσελίκα

Διαβάστε περισσότερα

Ψηφιακά Συστήματα. 1. Συστήματα Αριθμών

Ψηφιακά Συστήματα. 1. Συστήματα Αριθμών Ψηφιακά Συστήματα 1. Συστήματα Αριθμών Βιβλιογραφία 1. Φανουράκης Κ., Πάτσης Γ., Τσακιρίδης Ο., Θεωρία και Ασκήσεις Ψηφιακών Ηλεκτρονικών, ΜΑΡΙΑ ΠΑΡΙΚΟΥ & ΣΙΑ ΕΠΕ, 2016. [59382199] 2. Floyd Thomas L.,

Διαβάστε περισσότερα

Εισαγωγή στην επιστήμη των υπολογιστών. Υπολογιστές και Δεδομένα Κεφάλαιο 4ο Πράξεις με μπιτ

Εισαγωγή στην επιστήμη των υπολογιστών. Υπολογιστές και Δεδομένα Κεφάλαιο 4ο Πράξεις με μπιτ Εισαγωγή στην επιστήμη των υπολογιστών Υπολογιστές και Δεδομένα Κεφάλαιο 4ο Πράξεις με μπιτ 1 Πράξεις με μπιτ 2 ΑριθμητικέςΠράξειςσεΑκέραιους Πρόσθεση, Αφαίρεση, Πολλαπλασιασμός, Διαίρεση Ο πολλαπλασιασμός

Διαβάστε περισσότερα

ΠΛΗΡΟΦΟΡΙΚΗ I. 4 η ΔΙΑΛΕΞΗ Αριθμητικά Συστήματα

ΠΛΗΡΟΦΟΡΙΚΗ I. 4 η ΔΙΑΛΕΞΗ Αριθμητικά Συστήματα ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ - ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ ΕΙΣΑΓΩΓΙΚΗ ΚΑΤΕΥΘΥΝΣΗ ΤΟΥΡΙΣΤΙΚΩΝ ΕΠΙΧΕΙΡΗΣΕΩΝ ΚΑΙ ΕΠΙΧΕΙΡΗΣΕΩΝ ΦΙΛΟΞΕΝΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗ I 4 η ΔΙΑΛΕΞΗ Αριθμητικά Συστήματα ΧΑΣΑΝΗΣ ΒΑΣΙΛΕΙΟΣ

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομημένος Προγραμματισμός (ΤΛ1006) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής

Διαβάστε περισσότερα

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011 Εισαγωγή στον Προγραµµατισµό Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011 Hello World /* Αρχείο hello.c * Εµφανίζει στην οθόνη το * µήνυµα hello world */ #include

Διαβάστε περισσότερα

1. ΣΥΣΤΗΜΑΤΑ ΑΡΙΘΜΩΝ. α i. (α i β i ) (1.3) όπου: η= το πλήθος ακεραίων ψηφίων του αριθμού Ν. n-1

1. ΣΥΣΤΗΜΑΤΑ ΑΡΙΘΜΩΝ. α i. (α i β i ) (1.3) όπου: η= το πλήθος ακεραίων ψηφίων του αριθμού Ν. n-1 1. ΣΥΣΤΗΜΑΤΑ ΑΡΙΘΜΩΝ 1.1 Εισαγωγή Το δεκαδικό σύστημα (Decimal System) αρίθμησης χρησιμοποιείται από τον άνθρωπο και είναι κατάλληλο βέβαια γι αυτόν, είναι όμως εντελώς ακατάλληλο για τις ηλεκτρονικές

Διαβάστε περισσότερα

Αναπαράσταση Δεδομένων. ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

Αναπαράσταση Δεδομένων. ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική Αναπαράσταση Δεδομένων ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική Αναπαράσταση δεδομένων Κατάλληλη συμβολική αναπαράσταση δεδομένων, για απλοποίηση βασικών πράξεων, όπως πρόσθεση Πόσο εύκολο είναι

Διαβάστε περισσότερα

Εισαγωγή στην επιστήμη των υπολογιστών. Υπολογιστές και Δεδομένα Κεφάλαιο 4ο Πράξεις με μπιτ

Εισαγωγή στην επιστήμη των υπολογιστών. Υπολογιστές και Δεδομένα Κεφάλαιο 4ο Πράξεις με μπιτ Εισαγωγή στην επιστήμη των υπολογιστών Υπολογιστές και Δεδομένα Κεφάλαιο 4ο Πράξεις με μπιτ 1 Πράξεις με μπιτ 2 Αριθμητικές Πράξεις σε Ακέραιους Πρόσθεση, Αφαίρεση, Πολλαπλασιασμός, Διαίρεση Ο πολλαπλασιασμός

Διαβάστε περισσότερα

Εισαγωγή στην επιστήμη των υπολογιστών

Εισαγωγή στην επιστήμη των υπολογιστών Εισαγωγή στην επιστήμη των υπολογιστών Υπολογιστές και Δεδομένα Κεφάλαιο 3ο Αναπαράσταση Αριθμών www.di.uoa.gr/~organosi 1 Δεκαδικό και Δυαδικό Δεκαδικό σύστημα 2 3 Δεκαδικό και Δυαδικό Δυαδικό Σύστημα

Διαβάστε περισσότερα

Πληροφορική. Ενότητα 4 η : Κωδικοποίηση & Παράσταση Δεδομένων. Ι. Ψαρομήλιγκος Τμήμα Λογιστικής & Χρηματοοικονομικής

Πληροφορική. Ενότητα 4 η : Κωδικοποίηση & Παράσταση Δεδομένων. Ι. Ψαρομήλιγκος Τμήμα Λογιστικής & Χρηματοοικονομικής ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Πληροφορική Ενότητα 4 η : Κωδικοποίηση & Παράσταση Δεδομένων Ι. Ψαρομήλιγκος Τμήμα Λογιστικής & Χρηματοοικονομικής Άδειες Χρήσης

Διαβάστε περισσότερα

Κεφάλαιο 2. Συστήματα Αρίθμησης και Αναπαράσταση Πληροφορίας. Περιεχόμενα. 2.1 Αριθμητικά Συστήματα. Εισαγωγή

Κεφάλαιο 2. Συστήματα Αρίθμησης και Αναπαράσταση Πληροφορίας. Περιεχόμενα. 2.1 Αριθμητικά Συστήματα. Εισαγωγή Κεφάλαιο. Συστήματα Αρίθμησης και Αναπαράσταση Πληροφορίας Περιεχόμενα. Αριθμητικά συστήματα. Μετατροπή αριθμών από ένα σύστημα σε άλλο.3 Πράξεις στο δυαδικό σύστημα.4 Πράξεις στο δεκαεξαδικό σύστημα.5

Διαβάστε περισσότερα

Pascal, απλοί τύποι, τελεστές και εκφράσεις

Pascal, απλοί τύποι, τελεστές και εκφράσεις Pascal, απλοί τύποι, τελεστές και εκφράσεις 15 Νοεμβρίου 2011 1 Γενικά Στην standard Pascal ορίζονται τέσσερις βασικοί τύποι μεταβλητών: integer: Παριστάνει ακέραιους αριθμούς από το -32768 μέχρι και το

Διαβάστε περισσότερα

Τμήμα Χρηματοοικονομικής & Ελεγκτικής ΤΕΙ Ηπείρου Παράρτημα Πρέβεζας. Πληροφορική Ι. Αναπαράσταση αριθμών στο δυαδικό σύστημα. Δρ.

Τμήμα Χρηματοοικονομικής & Ελεγκτικής ΤΕΙ Ηπείρου Παράρτημα Πρέβεζας. Πληροφορική Ι. Αναπαράσταση αριθμών στο δυαδικό σύστημα. Δρ. Τμήμα Χρηματοοικονομικής & Ελεγκτικής ΤΕΙ Ηπείρου Παράρτημα Πρέβεζας Πληροφορική Ι Αναπαράσταση αριθμών στο δυαδικό σύστημα Δρ. Γκόγκος Χρήστος Δεκαδικό σύστημα αρίθμησης Ελληνικό - Ρωμαϊκό Σύστημα αρίθμησης

Διαβάστε περισσότερα

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Μεταβλητές,

Διαβάστε περισσότερα

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ Κ. Δεμέστιχας Εργαστήριο Πληροφορικής Γεωπονικό Πανεπιστήμιο Αθηνών Επικοινωνία μέσω e-mail: cdemest@aua.gr, cdemest@cn.ntua.gr 3. ΑΡΙΘΜΗΤΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ ΜΕΡΟΣ Β Παράσταση Προσημασμένων

Διαβάστε περισσότερα

* Το Σωστό Πρόγραμμα. κεφάλαιο

* Το Σωστό Πρόγραμμα. κεφάλαιο κεφάλαιο 3 * Το Σωστό Πρόγραμμα Ο στόχος μας σε αυτό το κεφάλαιο: Να κατανοήσουμε την έννοια της επαλήθευσης προγράμματος και τις βασικές σχετικές διαδικασίες. Προσδοκώμενα αποτελέσματα: Να μπορείς να

Διαβάστε περισσότερα

Η δήλωση πού δηµιουργεί αποθήκευση τών δεδοµένων ονοµαζεται ορισµός τής µεταβλητής.

Η δήλωση πού δηµιουργεί αποθήκευση τών δεδοµένων ονοµαζεται ορισµός τής µεταβλητής. Από το βιβλίο C: Βήµα-Πρός-Βήµα, Κεφάλαιο 3ο Συγγραφείς: Οµάδα Waite, Mitchell Waite και Stephen Prata Εκδότης: Μ. Γκιούρδας Ανατύπωση σε ηλεκτρονική µορφή: Αλέξανδρος Στεφανίδης 3.4 Τύποι εδοµένων τής

Διαβάστε περισσότερα

ΠΛΗΡΟΦΟΡΙΚΗ I Ενότητα 6

ΠΛΗΡΟΦΟΡΙΚΗ I Ενότητα 6 ΠΛΗΡΟΦΟΡΙΚΗ I Ενότητα 6 ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ Bits & Bytes Bit: η μικρότερη μονάδα πληροφορίας μία από δύο πιθανές καταστάσεις (ναι / όχι, αληθές / ψευδές, n / ff) κωδικοποίηση σε 0 ή 1 δυαδικό σύστημα

Διαβάστε περισσότερα

Δυαδικη παρασταση αριθμων και συμβολων

Δυαδικη παρασταση αριθμων και συμβολων Δυαδικη παρασταση αριθμων και συμβολων Ενα αριθμητικο συστημα χαρακτηριζεται απο την βαση r και τα συμβολα a i που παιρνουν τις τιμες 0,1,...,r-1. (a n,,a 1,a 0. a -1,a -2,,a -m ) r = =a n r n + +a 1 r+a

Διαβάστε περισσότερα

Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές

Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές http://courseware.mech.ntua.gr/ml23021/ 3 ο Μάθημα Λεωνίδας Αλεξόπουλος Λέκτορας ΕΜΠ E-mail: leo@mail.ntua.gr URL: http://users.ntua.gr/leo 1 Κωδικοποίηση & Αποκωδικοποίηση

Διαβάστε περισσότερα

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης Γλώσσες Προγραμματισμού Εργαστήριο 2ο Τύποι Δεδομένων - Είσοδος / Έξοδος Εργαστήριο 2ο Περίγραμμα Εργαστηριακής Άσκησης Εργαστήριο 2ο...1 Θεωρία εργαστηρίου...2 Τύποι δεδομένων...2 Η συνάρτηση printf()...3

Διαβάστε περισσότερα

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

Οντοκεντρικός Προγραμματισμός Οντοκεντρικός Προγραμματισμός Ενότητα 5: H ΓΛΩΣΣΑ C++ Δομές Ελέγχου ΔΙΔΑΣΚΟΝΤΕΣ: Ιωάννης Χατζηλυγερούδης, Χρήστος Μακρής Πολυτεχνική Σχολή Τμήμα Μηχανικών Η/Υ & Πληροφορικής Δομές Ελέγχου Εισαγωγή Πριν

Διαβάστε περισσότερα

Κεφάλαιο 2. Οργάνωση και διαχείριση της Πληροφορίας στον. Υπολογιστή

Κεφάλαιο 2. Οργάνωση και διαχείριση της Πληροφορίας στον. Υπολογιστή ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ Κεφάλαιο 2 Οργάνωση και διαχείριση της Πληροφορίας στον Υπολογιστή Δεδομένα και Εντολές πληροφορία δεδομένα εντολές αριθμητικά δδ δεδομένα κείμενο εικόνα Επιλογή Αναπαράστασης

Διαβάστε περισσότερα

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120) Προγραμματισμός Ι (ΗΥ120) Διάλεξη 4: Τελεστές Τελεστές: Τελεστής Ανάθεσης 2 Το σύμβολο της ανάθεσης είναι το = Προσοχή: το σύμβολο ελέγχου ισότητας είναι το ==. Η μορφή των προτάσεων ανάθεσης είναι:

Διαβάστε περισσότερα

Εισαγωγή στην Πληροφορική

Εισαγωγή στην Πληροφορική αρ χή Εισαγωγή στην Πληροφορική Σημειώσεις Παράρτημα 1 Οδηγός μελέτης για τις εξετάσεις 12/1/2017 μπορεί να συμπληρωθεί τις επόμενες μέρες Μάριος Μάντακας Τμήμα Μηχανικών Πληροφορικής Τ.Ε. ΤΕΙ Ηπείρου

Διαβάστε περισσότερα

Συστήματα αρίθμησης. = α n-1 *b n-1 + a n-2 *b n-2 + +a 1 b 1 + a 0 όπου τα 0 a i b-1

Συστήματα αρίθμησης. = α n-1 *b n-1 + a n-2 *b n-2 + +a 1 b 1 + a 0 όπου τα 0 a i b-1 Συστήματα αρίθμησης Δεκαδικό σύστημα αρίθμησης 1402 = 1000 + 400 +2 =1*10 3 + 4*10 2 + 0*10 1 + 2*10 0 Γενικά σε ένα σύστημα αρίθμησης με βάση το b N, ένας ακέραιος αριθμός με n ψηφία παριστάνεται ως:

Διαβάστε περισσότερα

Εισαγωγή στην πληροφορική

Εισαγωγή στην πληροφορική Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Εισαγωγή στην πληροφορική Ενότητα 3: Δυαδικά Συστήματα Αγγελίδης Παντελής Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

Κεφάλαιο 1. Συστήματα αρίθμησης και αναπαράστασης

Κεφάλαιο 1. Συστήματα αρίθμησης και αναπαράστασης Κεφάλαιο 1 Συστήματα αρίθμησης και αναπαράστασης 1.1 Εισαγωγή Οι υπολογιστές αναπαριστούν όλα τα είδη πληροφορίας ως δυαδικά δεδομένα. Έτσι, για την ευκολότερη και ταχύτερη επεξεργασία των διαφόρων πληροφοριών,

Διαβάστε περισσότερα

ΗΜΥ 100 Εισαγωγή στην Τεχνολογία

ΗΜΥ 100 Εισαγωγή στην Τεχνολογία ΗΜΥ 100 Εισαγωγή στην Τεχνολογία Στέλιος Τιμοθέου ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΑ ΘΕΜΑΤΑ ΜΑΣ ΣΗΜΕΡΑ Συστήματα αρίθμησης Δυαδικό αριθμητικό

Διαβάστε περισσότερα

Εισαγωγή στην επιστήμη των υπολογιστών. Πράξεις με μπιτ

Εισαγωγή στην επιστήμη των υπολογιστών. Πράξεις με μπιτ Εισαγωγή στην επιστήμη των υπολογιστών Πράξεις με μπιτ 1 Πράξεις με μπιτ 2 Αριθμητικές Πράξεις σε Ακέραιους Πρόσθεση, Αφαίρεση, Πολλαπλασιασμός, Διαίρεση 3 Πρόσθεση στη μορφή συμπληρώματος ως προς δύο

Διαβάστε περισσότερα

Αριθμητικά Συστήματα = 3 x x x x 10 0

Αριθμητικά Συστήματα = 3 x x x x 10 0 Δεκαδικό Όταν αναφερόμαστε σε μία αριθμητική τιμή, απεικονίζουμε μία ποσότητα με ένα σύμβολο ή έναν συνδυασμό από σύμβολα. Το αριθμητικό σύστημα που χρησιμοποιούμε είναι το δεκαδικό. Αποτελείται από δέκα

Διαβάστε περισσότερα

Εισαγωγή στους Υπολογιστές

Εισαγωγή στους Υπολογιστές Εισαγωγή στους Υπολογιστές Ενότητα 9: Ψηφιακή Αριθμητική Βασίλης Παλιουράς Πολυτεχνική Σχολή Τμήμα Ηλεκτρολόγων Μηχανικών και Τεχνολογίας Υπολογιστών Ψηφιακή Αριθμητική Σκοποί ενότητας 2 Περιεχόμενα ενότητας

Διαβάστε περισσότερα

Αναπαράσταση Δεδομένων (2 ο μέρος) ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

Αναπαράσταση Δεδομένων (2 ο μέρος) ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική Αναπαράσταση Δεδομένων (2 ο μέρος) ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική «Λογικές» πράξεις, μάσκες Πώς βρίσκουμε το υπόλοιπο μιας διαίρεσης με το 4; διαίρεση με 4 = δεξιά ολίσθηση 2 bits Το υπόλοιπο

Διαβάστε περισσότερα

11. Ποιες είναι οι άμεσες συνέπειες της διαίρεσης;

11. Ποιες είναι οι άμεσες συνέπειες της διαίρεσης; 10. Τι ονομάζουμε Ευκλείδεια διαίρεση και τέλεια διαίρεση; Όταν δοθούν δύο φυσικοί αριθμοί Δ και δ, τότε υπάρχουν δύο άλλοι φυσικοί αριθμοί π και υ, έτσι ώστε να ισχύει: Δ = δ π + υ. Ο αριθμός Δ λέγεται

Διαβάστε περισσότερα

Συμβολοσειρές ΣΥΜΒΟΛΟΣΕΙΡΕΣ. Γεώργιος Παπαϊωάννου ( )

Συμβολοσειρές ΣΥΜΒΟΛΟΣΕΙΡΕΣ. Γεώργιος Παπαϊωάννου ( ) ΣΥΜΒΟΛΟΣΕΙΡΕΣ Γεώργιος Παπαϊωάννου (2013-14) gepap@aueb.gr Περιγραφή: Ο τύπος string Μετατροπή από και προς τον τύπο string Βασικές μέθοδοι Χρήση Ελληνικών Συναρτήσεις C εκτύπωσης και ανάγνωσης Τελευταία

Διαβάστε περισσότερα

Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου

Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου Εργαστήριο 2: Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου Ο σκοπός αυτής της εργαστηριακής άσκησης είναι η ανάλυση των βασικών χαρακτηριστικών της Γλώσσας Προγραμματισμού

Διαβάστε περισσότερα

Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές. 3 ο Μάθημα. Λεωνίδας Αλεξόπουλος Λέκτορας ΕΜΠ. url:

Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές. 3 ο Μάθημα. Λεωνίδας Αλεξόπουλος Λέκτορας ΕΜΠ.   url: Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές 3 ο Μάθημα Λεωνίδας Αλεξόπουλος Λέκτορας ΕΜΠ email: leo@mail.ntua.gr url: http://users.ntua.gr/leo Άδεια Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες

Διαβάστε περισσότερα

Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές. 5 ο Μάθημα. Λεωνίδας Αλεξόπουλος Λέκτορας ΕΜΠ. url:

Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές. 5 ο Μάθημα. Λεωνίδας Αλεξόπουλος Λέκτορας ΕΜΠ.   url: στους Ηλεκτρονικούς Υπολογιστές 5 ο Μάθημα Λεωνίδας Αλεξόπουλος Λέκτορας ΕΜΠ email: leo@mail.ntua.gr url: http://users.ntua.gr/leo Άδεια Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative

Διαβάστε περισσότερα

Ψηφιακά Κυκλώματα Ι. Μάθημα 1: Δυαδικά συστήματα - Κώδικες. Λευτέρης Καπετανάκης

Ψηφιακά Κυκλώματα Ι. Μάθημα 1: Δυαδικά συστήματα - Κώδικες. Λευτέρης Καπετανάκης ΤΛ2002 Ψηφιακά Κυκλώματα Ι Μάθημα 1: Δυαδικά συστήματα - Κώδικες Λευτέρης Καπετανάκης ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΚΡΗΤΗΣ ΤΜΗΜΑ ΗΛΕΚΤΡΟΝΙΚΗΣ Άνοιξη 2011 ΤΛ-2002: L1 Slide 1 Ψηφιακά Συστήματα ΤΛ-2002:

Διαβάστε περισσότερα

Αριθμητικές Μέθοδοι σε Προγραμματιστικό Περιβάλλον

Αριθμητικές Μέθοδοι σε Προγραμματιστικό Περιβάλλον Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κεντρικής Μακεδονίας - Σέρρες Τμήμα Μηχανικών Πληροφορικής Αριθμητικές Μέθοδοι σε Προγραμματιστικό Περιβάλλον Δρ. Δημήτρης Βαρσάμης Επίκουρος Καθηγητής Δρ. Δημήτρης Βαρσάμης

Διαβάστε περισσότερα

Αριθμητικά Συστήματα

Αριθμητικά Συστήματα Αριθμητικά Συστήματα Σε οποιοδήποτε αριθμητικό σύστημα, με βάση τον αριθμό Β, ένας ακέραιος αριθμός με πλήθος ψηφίων ν, εκφράζεται ως ακολούθως: α ν-1 α ν-2 α 1 α 0 = α ν-1 Β ν-1 + α ν-2 Β ν-2 + + α 1

Διαβάστε περισσότερα

Master Mind εφαρμογή στη γλώσσα προγραμματισμού C

Master Mind εφαρμογή στη γλώσσα προγραμματισμού C Master Mind εφαρμογή στη γλώσσα προγραμματισμού C Φεβρουάριος/Μάρτιος 2013 v. 0.1 Master-mind: κανόνες παιχνιδιού Στο master mind χρειάζεται να παράγονται κάθε φορά 4 τυχαία σύμβολα από ένα πλήθος 6 διαφορετικών

Διαβάστε περισσότερα

Δυαδικό Σύστημα Αρίθμησης

Δυαδικό Σύστημα Αρίθμησης Δυαδικό Σύστημα Αρίθμησης Το δυαδικό σύστημα αρίθμησης χρησιμοποιεί δύο ψηφία. Το 0 και το 1. Τα ψηφία ενός αριθμού στο δυαδικό σύστημα αρίθμησης αντιστοιχίζονται σε δυνάμεις του 2. Μονάδες, δυάδες, τετράδες,

Διαβάστε περισσότερα

ΣΦΑΛΜΑΤΑ ΑΡΙΘΜΗΤΙΚΩΝ ΥΠΟΛΟΓΙΣΜΩΝ

ΣΦΑΛΜΑΤΑ ΑΡΙΘΜΗΤΙΚΩΝ ΥΠΟΛΟΓΙΣΜΩΝ ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ Εργαστήριο Θερμικών Στροβιλομηχανών Μονάδα Παράλληλης Υπολογιστικής Ρευστοδυναμικής & Βελτιστοποίησης ΑΡΙΘΜΗΤΙΚΗ ΑΝΑΛΥΣΗ (4 ο Εξάμηνο Σχολής Μηχ.Μηχ. ΕΜΠ) ΣΦΑΛΜΑΤΑ ΑΡΙΘΜΗΤΙΚΩΝ

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 ) Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 2015-16

Διαβάστε περισσότερα

2.1. Εντολές. 2.2. Σχόλια. 2.3. Τύποι Δεδομένων

2.1. Εντολές. 2.2. Σχόλια. 2.3. Τύποι Δεδομένων 2 Βασικές Εντολές 2.1. Εντολές Οι στην Java ακολουθούν το πρότυπο της γλώσσας C. Έτσι, κάθε εντολή που γράφουμε στη Java θα πρέπει να τελειώνει με το ερωτηματικό (;). Όπως και η C έτσι και η Java επιτρέπει

Διαβάστε περισσότερα

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07 ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07 Αριθμητική στο δυαδικό σύστημα (γενικά) Συμπληρωματικά για δυαδικό σύστημα Η πρόσθεση στηρίζεται στους κανόνες: 0 + 0 = 0, 0 + 1 = 1, 1

Διαβάστε περισσότερα

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ Μέρος 2ο ΝΙΚΟΛΑΟΣ ΣΤΕΡΓΙΟΥΛΑΣ ΤΜΗΜΑ ΦΥΣΙΚΗΣ ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ 1 ΣΦΑΛΜΑΤΑ ΜΕΤΑΓΛΩΤΤΙΣΗΣ Η γλώσσα C κάνει αυστηρή διάκριση μεταξύ πεζών

Διαβάστε περισσότερα

Περιληπτικά, τα βήματα που ακολουθούμε γενικά είναι τα εξής:

Περιληπτικά, τα βήματα που ακολουθούμε γενικά είναι τα εξής: Αυτό που πρέπει να θυμόμαστε, για να μη στεναχωριόμαστε, είναι πως τόσο στις εξισώσεις, όσο και στις ανισώσεις 1ου βαθμού, που θέλουμε να λύσουμε, ακολουθούμε ακριβώς τα ίδια βήματα! Εκεί που πρεπει να

Διαβάστε περισσότερα

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών - Μηχανικών Υπολογιστών. ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ Νεκτάριος Κοζύρης ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών - Μηχανικών Υπολογιστών. ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ Νεκτάριος Κοζύρης ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών - Μηχανικών Υπολογιστών ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ Νεκτάριος Κοζύρης ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ Άδεια Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες

Διαβάστε περισσότερα

Συστήματα Αρίθμησης. Συστήματα Αρίθμησης 1. PDF created with FinePrint pdffactory Pro trial version

Συστήματα Αρίθμησης. Συστήματα Αρίθμησης 1. PDF created with FinePrint pdffactory Pro trial version Συστήματα Αρίθμησης Στην καθημερινή μας ζωή χρησιμοποιούμε το δεκαδικό σύστημα αρίθμησης. Στο σύστημα αυτό χρησιμοποιούμε δέκα διαφορετικά σύμβολα τα :,, 2, 3, 4, 5, 6,7 8, 9. Για τον αριθμό 32 θα χρειαστούμε

Διαβάστε περισσότερα

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting) Εργαστήριο 3: 3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting) Η C++, όπως όλες οι γλώσσες προγραμματισμού, χρησιμοποιεί τελεστές για να εκτελέσει τις αριθμητικές και λογικές λειτουργίες.

Διαβάστε περισσότερα

Αριθμητική Κινητής Υποδιαστολής Πρόσθεση Αριθμών Κινητής Υποδιαστολής

Αριθμητική Κινητής Υποδιαστολής Πρόσθεση Αριθμών Κινητής Υποδιαστολής ΗΥ 134 Εισαγωγή στην Οργάνωση και στον Σχεδιασμό Υπολογιστών Ι Διάλεξη 11 Αριθμητική Κινητής Υποδιαστολής Πρόσθεση Αριθμών Κινητής Υποδιαστολής Νίκος Μπέλλας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 ) Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 2015-16

Διαβάστε περισσότερα

Εισαγωγή στην επιστήμη των υπολογιστών. ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ και Μετατροπές Αριθμών

Εισαγωγή στην επιστήμη των υπολογιστών. ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ και Μετατροπές Αριθμών Εισαγωγή στην επιστήμη των υπολογιστών ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ και Μετατροπές Αριθμών 1 Αριθμητικό Σύστημα Ορίζει τον τρόπο αναπαράστασης ενός αριθμού με διακεκριμένα σύμβολα Ένας αριθμός αναπαρίσταται διαφορετικά

Διαβάστε περισσότερα

Δύο είναι οι κύριες αιτίες που μπορούμε να πάρουμε από τον υπολογιστή λανθασμένα αποτελέσματα εξαιτίας των σφαλμάτων στρογγυλοποίησης:

Δύο είναι οι κύριες αιτίες που μπορούμε να πάρουμε από τον υπολογιστή λανθασμένα αποτελέσματα εξαιτίας των σφαλμάτων στρογγυλοποίησης: Ορολογία bit (binary digit): δυαδικό ψηφίο. Τα δυαδικά ψηφία είναι το 0 και το 1 1 byte = 8 bits word: η θεμελιώδης μονάδα σύμφωνα με την οποία εκπροσωπούνται οι πληροφορίες στον υπολογιστή. Αποτελείται

Διαβάστε περισσότερα

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128] ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Α Περιόδου 2017 (27/1/2017) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................

Διαβάστε περισσότερα

ΑΡΙΘΜΗΤΙΚΗ ΓΙΑ ΥΠΟΛΟΓΙΣΤΕΣ

ΑΡΙΘΜΗΤΙΚΗ ΓΙΑ ΥΠΟΛΟΓΙΣΤΕΣ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ ΑΡΙΘΜΗΤΙΚΗ ΓΙΑ ΥΠΟΛΟΓΙΣΤΕΣ ΣΗΜΜΥ, 5 Ο ΕΞΑΜΗΝΟ http://www.cslab.ece.ntua.gr/courses/comparch t / / h 1 ΑΡΙΘΜΟΙ Decimal Eύκολο για τον άνθρωπο Ιδιαίτερα για την εκτέλεση αριθμητικών

Διαβάστε περισσότερα

ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ. Κεφάλαιο 3

ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ. Κεφάλαιο 3 ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ Κεφάλαιο 3 Κεντρική Μονάδα Επεξεργασίας Κεντρική Μονάδα Επεξεργασίας Μονάδα επεξεργασίας δεδομένων Μονάδα ελέγχου Μονάδα επεξεργασίας δεδομένων Δομή Αριθμητικής Λογικής Μονάδας

Διαβάστε περισσότερα

Τμήμα Οικιακής Οικονομίας και Οικολογίας. Αναπαράσταση Αριθμών

Τμήμα Οικιακής Οικονομίας και Οικολογίας. Αναπαράσταση Αριθμών Αναπαράσταση Αριθμών Δεκαδικό και Δυαδικό Δεκαδικό σύστημα Δεκαδικό και Δυαδικό Μετατροπή Για τη μετατροπή ενός αριθμού από το δυαδικό σύστημα στο δεκαδικό, πολλαπλασιάζουμε κάθε δυαδικό ψηφίο του αριθμού

Διαβάστε περισσότερα

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις Ενώσεις δεδομένων (union) τι και γιατί Συσκευές με μικρή μνήμη => ανάγκη εξοικονόμησης πόρων Παρατήρηση: αχρησιμοποίητη μνήμη. Έστω

Διαβάστε περισσότερα

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ Κ. Δεμέστιχας Εργαστήριο Πληροφορικής Γεωπονικό Πανεπιστήμιο Αθηνών Επικοινωνία μέσω e-mail: cdemest@aua.gr, cdemest@cn.ntua.gr 1 2. ΑΡΙΘΜΗΤΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ ΜΕΡΟΣ Α 2 Τεχνολογία

Διαβάστε περισσότερα

Εισαγωγή στην Επιστήμη των Υπολογιστών

Εισαγωγή στην Επιστήμη των Υπολογιστών Εισαγωγή στην Επιστήμη των Υπολογιστών Περιεχόμενα Μαθήματος Συστήματα αρίθμησης Πύλες Διάγραμμα ροής-ψευδοκώδικας Python Συστήματα Αρίθμησης Δεκαδικό σύστημα Οι άνθρωποι χρησιμοποιούν το περίφημο «θεσιακό,

Διαβάστε περισσότερα

ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ - ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ

ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ - ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ - ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ ΣΗΜΜΥ, 5 Ο ΕΞΑΜΗΝΟ http://www.cslab.ece.ntua.gr/courses/comparch 1 ΑΡΙΘΜΟΙ Decimal Eύκολο για τον άνθρωπο Ιδιαίτερα για την εκτέλεση αριθμητικών πράξεων

Διαβάστε περισσότερα

Αρχιτεκτονικές Υπολογιστών

Αρχιτεκτονικές Υπολογιστών ΑΡΧΙΤΕΚΤΟΝΙΚΕΣ ΥΠΟΛΟΓΙΣΤΩΝ Μάθηµα: Αρχιτεκτονικές Υπολογιστών Αναπαράσταση εδοµένων ιδάσκων: Αναπλ. Καθ. Κ. Λαµπρινουδάκης clam@unipi.gr Αρχιτεκτονικές Υπολογιστών Aναπλ. Καθ. Κ. Λαµπρινουδάκης 1 εδοµένα

Διαβάστε περισσότερα

Εισαγωγή στην Επιστήμη των Υπολογιστών

Εισαγωγή στην Επιστήμη των Υπολογιστών Εισαγωγή στην Επιστήμη των Υπολογιστών Ενότητα 2: Αποθήκευση Δεδομένων, 2ΔΩ Τμήμα: Αγροτικής Οικονομίας & Ανάπτυξης Διδάσκων: Θεόδωρος Τσιλιγκιρίδης Μαθησιακοί Στόχοι Η Ενότητα 2 διαπραγματεύεται θέματα

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομημένος Προγραμματισμός (ΤΛ1006) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής

Διαβάστε περισσότερα

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δυναμική Διαχείριση Μνήμης Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2011-2012 Ανάγκη για Δυναμική Μνήμη Στατική Μνήμη Μέχρι τώρα χρησιμοποιούσαμε

Διαβάστε περισσότερα

Ανάπτυξη και Σχεδίαση Λογισμικού

Ανάπτυξη και Σχεδίαση Λογισμικού Ανάπτυξη και Σχεδίαση Λογισμικού Η γλώσσα προγραμματισμού C Γεώργιος Δημητρίου Βασικά Στοιχεία Το αλφάβητο της C Οι βασικοί τύποι της C Δηλώσεις μεταβλητών Είσοδος/Έξοδος Βασικές εντολές της C Αλφάβητο

Διαβάστε περισσότερα

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120) Προγραμματισμός Ι (ΗΥ120) Διάλεξη 4: Τελεστές Τελεστές: Τελεστής Ανάθεσης 2 Το σύμβολο της ανάθεσης είναι το = Προσοχή: το σύμβολο ελέγχου ισότητας είναι το ==. Η μορφή των προτάσεων ανάθεσης είναι:

Διαβάστε περισσότερα

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης Η συνάρτηση printf() Η συνάρτηση printf() χρησιμοποιείται για την εμφάνιση δεδομένων στο αρχείο εξόδου stdout (standard output stream), το οποίο εξ ορισμού συνδέεται με την οθόνη Η συνάρτηση printf() δέχεται

Διαβάστε περισσότερα

Εισαγωγή στην επιστήµη των υπολογιστών ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ

Εισαγωγή στην επιστήµη των υπολογιστών ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ Εισαγωγή στην επιστήµη των υπολογιστών ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ 1 Αριθµητικό Σύστηµα! Ορίζει τον τρόπο αναπαράστασης ενός αριθµού µε διακεκριµένα σύµβολα! Ένας αριθµός αναπαρίσταται διαφορετικά σε κάθε σύστηµα,

Διαβάστε περισσότερα

Υπερφόρτωση τελεστών

Υπερφόρτωση τελεστών Υπερφόρτωση τελεστών 19 Νοεμβρίου 2012 1 Γενικά Στα προηγούμενα είδαμε ότι ορίζοντας μία κλάση, ορίζουμε ένα νέο τύπο τον οποίο μπορούμε να χρησιμοποιήσουμε για να δηλώσουμε αντικείμενα αυτής της νέας

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 ) Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 2014-15

Διαβάστε περισσότερα

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομημένος Προγραμματισμός (ΤΛ1006) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής

Διαβάστε περισσότερα

Διαδικασιακός Προγραμματισμός

Διαδικασιακός Προγραμματισμός Τμήμα ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ Διαδικασιακός Προγραμματισμός Διάλεξη 4 η Τελεστές Οι διαλέξεις βασίζονται στο βιβλίο των Τσελίκη και Τσελίκα C: Από τη Θεωρία στην Εφαρμογή Σωτήρης

Διαβάστε περισσότερα

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι κ. ΠΕΤΑΛΙΔΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ 1 Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται

Διαβάστε περισσότερα

Σφάλματα (errors) Σε κάθε υπολογισμό μιας πραγματικής ποσότητας υπάρχει σφάλμα

Σφάλματα (errors) Σε κάθε υπολογισμό μιας πραγματικής ποσότητας υπάρχει σφάλμα Σφάλματα (errors) Σε κάθε υπολογισμό μιας πραγματικής ποσότητας υπάρχει σφάλμα Πηγές σφαλμάτων ανακριβής θεωρία ανακριβείς μετρήσεις παραμέτρων μεταβλητότητα παραμέτρων ανακριβής μέθοδος υπολογισμού (σφάλματα

Διαβάστε περισσότερα

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος http://www.teiser.gr/icd/staff/lantzos lantzos@teiser.gr 1 Πώς δημιουργούμε πρόγραμμα Η/Υ; 1. Ανάλυση του προβλήματος 2. Επινόηση & Σχεδιασμός

Διαβάστε περισσότερα

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δείκτες Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Τι είναι ο δείκτης Ένας δείκτης είναι μια μεταβλητή που περιέχει μια διεύθυνση μνήμης. Θυμηθείτε πως

Διαβάστε περισσότερα

Βρέντζου Τίνα Φυσικός Μεταπτυχιακός τίτλος: «Σπουδές στην εκπαίδευση» ΜEd Email : stvrentzou@gmail.com

Βρέντζου Τίνα Φυσικός Μεταπτυχιακός τίτλος: «Σπουδές στην εκπαίδευση» ΜEd Email : stvrentzou@gmail.com Βρέντζου Τίνα Φυσικός Μεταπτυχιακός τίτλος: «Σπουδές στην εκπαίδευση» ΜEd Email : stvrentzou@gmail.com 1 1.Σύνολα Σύνολο είναι μια ολότητα από σαφώς καθορισμένα και διακεκριμένα αντικείμενα. Τα φωνήεντα

Διαβάστε περισσότερα

Εισαγωγή στη γλώσσα προγραμματισμού C++

Εισαγωγή στη γλώσσα προγραμματισμού C++ Εισαγωγή στη γλώσσα προγραμματισμού C++ Περιβάλλον Εργασίας 2 Περιβάλλον Εργασίας 1. Χρήση απλού κειμενογράφου και Μεταγλωττιστή 2. Ολοκληρωμένα Περιβάλλοντα Εργασίας (Integrated Development Environments)

Διαβάστε περισσότερα

Chapter 3. Αριθμητική Υπολογιστών. Όγδοη (8 η ) δίωρη διάλεξη. Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Chapter 3. Αριθμητική Υπολογιστών. Όγδοη (8 η ) δίωρη διάλεξη. Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L. Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L. Hennessy Chapter 3 Αριθμητική Υπολογιστών Όγδοη (8 η ) δίωρη διάλεξη. Διαφάνειες διδασκαλίας από το πρωτότυπο αγγλικό βιβλίο (4 η έκδοση),

Διαβάστε περισσότερα

1. Το σύστημα κινητής υποδιαστολής 2. Αναπαράσταση πραγματικών δυαδικών αριθμών 3. Το πρότυπο 754 της ΙΕΕΕ

1. Το σύστημα κινητής υποδιαστολής 2. Αναπαράσταση πραγματικών δυαδικών αριθμών 3. Το πρότυπο 754 της ΙΕΕΕ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ ΑΡΙΘΜΟΙ ΚΙΝΗΤΗΣ ΥΠΟ ΙΑΣΤΟΛΗΣ (ΠΡΑΓΜΑΤΙΚΟΙ ΑΡΙΘΜΟΙ) Γ Τσιατούχας Παράρτηµα Β ιάρθρωση 1 Το σύστημα κινητής υποδιαστολής 2 Αναπαράσταση πραγματικών δυαδικών αριθμών 3 Το πρότυπο

Διαβάστε περισσότερα

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή Στόχοι και αντικείμενο ενότητας Η έννοια του Τελεστή #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Εκφράσεις Προτεραιότητα Προσεταιριστικότητα Χρήση παρενθέσεων Μετατροπές Τύπων Υπονοούμενες και ρητές μετατροπές

Διαβάστε περισσότερα

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΧΗΜΙΚΩΝ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΙΚΟ ΚΕΝΤΡΟ Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού Μάθημα 9ο Aντώνης Σπυρόπουλος Σφάλματα στρογγυλοποίησης

Διαβάστε περισσότερα