ΕΙΣΑΓΩΓΗ. Ένας interpreter µεταφράζει σε γλώσσα µηχανής την εντολή άµεσα την στιγµή που εισάγεται.

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

Download "ΕΙΣΑΓΩΓΗ. Ένας interpreter µεταφράζει σε γλώσσα µηχανής την εντολή άµεσα την στιγµή που εισάγεται."

Transcript

1 ΕΙΣΑΓΩΓΗ Οι γλώσσες προγραµµατισµού έκαναν την εµφάνιση τους κατά την διάρκεια του ου παγκόσµιου πολέµου σε αριθµητικά προβλήµατα του πυροβολικού (υπολογισµό καµπυλών βολών). Εκείνες τις µέρες χρησιµοποιούνταν η πιο κατώτερη γλώσσα προγραµµατισµού η γλώσσα µηχανής (machine language). Οι εντολές ήταν ακολουθίες από 0 και 1 (01-patterns). Στην συνέχεια έκαναν την εµφάνιση τους οι assemblers που χρησιµοποιούσαν mnemonics και απευθύνονταν άµεσα στην CPU. Στην συνέχεια παρουσιάστηκαν οι ανωτέρου επιπέδου γλώσσες όπως η Basic και η Fortran και µεταγενέστερα η γλώσσα C (που εξέλιξη της αποτελεί η C++ καθώς και οι Visual εκδόσεις της). Οι ανωτέρου επιπέδου γλώσσες έχουν σύνταξη και λεξιλόγιο (keywords) που προσεγγίζουν την ανθρώπινη γλώσσα. Μετά ο πηγαίος κώδικας µεταφράζεται σε γλώσσα µηχανής από interpreters είτε compilers. Ένας interpreter µεταφράζει σε γλώσσα µηχανής την εντολή άµεσα την στιγµή που εισάγεται. Ο compiler µεταφράζει όλο τον κώδικα πρώτα σε µια ενδιάµεση κατάσταση δίνοντας σαν αποτέλεσµα το object αρχείο (αρχεία µε κατάληξη *.obj). Στην συνέχεια είναι η σειρά του linker που µετατρέπει το object αρχείο σε εκτελέσιµο (αρχεία µε κατάληξη *.exe). Παράγοντας έτσι τον κώδικα µηχανής. Αρχικά ο προγραµµατιστής έπρεπε να γραφεί µικρά προγράµµατα λόγω: έλλειψης µνήµης (RAM), πανάκριβης υπολογιστικής ισχύς. Σήµερα τίποτα από αυτά δεν ισχύει, το πραγµατικό κόστος σε µια επιχείρηση που αναπτύσσει εφαρµογές, είναι µόνο ο µισθός του προγραµµατιστή. Η C είναι µια ανώτερη γλώσσα προγραµµατισµού. ηλαδή µπορεί να την χρησιµοποιήσει κάποιος για να δηµιουργήσει µια λίστα από εντολές (το πρόγραµµα ή τον κώδικα) που ο υπολογιστής θα ακολουθήσει σειριακά (υπάρχουν και παράλληλες εκδόσεις της γλώσσας σε platforms µε περισσότερες από µια CPU s) για την λύση κάποιου προβλήµατος. 1

2 H C/C++ δεν σηµαίνει ότι είναι η καλύτερη υπάρχουσα γλώσσα προγραµµατισµού, σίγουρα όµως είναι πλήρης και ευρύτατα διαδεδοµένη. Για περισσότερα από 30 χρόνια εξελίσσεται και έχει γίνει πλήρως αποδεκτή από την κοινότητα των προγραµµατιστών. Χρησιµοποιείται παντού από την δηµιουργία προγραµµάτων για τον έλεγχο οικιακών συσκευών (micro-controllers) έως και την δηµιουργία λειτουργικών συστηµάτων1 (operating systems) όπως τα Windows XP το Linux ή το Unix. Με την C/C++ µπορεί να αποκτήσει κάποιος πλήρη έλεγχο πάνω σε υπολογιστικά συστήµατα. Είναι αποτελεσµατική στην λύση αριθµητικών ή όχι προβληµάτων. Τρέχει κάτω από όλα σχεδόν τα λειτουργικά συστήµατα. Υπάρχουν όµως και άλλες δυνατές και ευκίνητες γλώσσες προγραµµατισµού Η Visual Basic που είναι συνδυασµός compiled και interpreted γλώσσας µε πολύ έξυπνη διαχείριση βάσεων δεδοµένων και µε πολλές εφαρµογές στο internet (VbScript). Η Java που χρησιµοποιείται περισσότερο για εφαρµογές στο internet (JavaScript). Η Java κατά κύριο λόγο αναπτύχθηκε σαν µια γλώσσα που ένα εκτελέσιµο αρχείο της µπορεί να τρέχει κάτω από διαφορετικές πλατφόρµες χωρίς όµως να µπορεί να τις επηρεάσει (δυστυχώς οι ζηµιογόνες εφαρµογές στο internet είναι γραµµένες σε C). Γιατί να µάθω πρώτα C και όχι C++? Η C++ είναι υπερσύνολο της C. ηλαδή η C++ περιέχει τον πυρήνα της ANSI C (American National Standards Institute) µαζί µε την αντικειµενοστραφή (object oriented) του εξέλιξη (το ++ κοµµάτι). Ο Bjarne Stourstrup που ανέπτυξε µαζί µε την ερευνητική του οµάδα 1 Ο σκοπός ύπαρξης ενός λειτουργικού συστήµατος είναι στο να οργανώνει και να ελέγχει το υλικό µέρος της συσκευής (hardware) καθώς και το λογισµικό (software) έτσι ώστε η συσκευή µέσα την οποία βρίσκεται να έχει ευκίνητη και προβλέψιµη συµπεριφορά.

3 το αντικειµενοστραφές κοµµάτι, συµφωνεί ότι για να µάθει κανείς C++ πρέπει και ο προγραµµατιστής να ακολουθήσει µια αντίστοιχη πορεία, να µάθει να προγραµµατίζει πρώτα σε C. ιαφωνούν συνήθως µεµονωµένοι συγγραφείς και εκδοτικές εταιρείες που προσπαθούν έτσι να προωθήσουν τους τίτλους βιβλίων τους για C++, σε ένα πιο ευρύ αγοραστικό κοινό. Παρακάτω παραθέτουµε τις 4 βασικές αρχές του object oriented προγραµµατισµού: 1. Η αντικειµενοστραφείς γλώσσα πρέπει να προσφέρει προς χρήση αυτόνοµες µονάδες κώδικα (encapsulation units). Αυτές είναι τα αντικείµενα που ο προγραµµατιστής χρησιµοποιεί για να επιτύχει την ανάπτυξη πιο πολύπλοκων δοµών πληροφορίας.. Οι αυτόνοµες µονάδες πρέπει να είναι ικανές να κρύβουν από τον προγραµµατιστή (να κάνουν δηλαδή data hidding) τον τρόπο µε τον οποίο φέρνουν σε πέρας την λειτουργία τους έτσι ώστε να µικραίνουν την πολυπλοκότητα του κώδικα. 3. Πρέπει να µπορεί να γίνεται επαναχρησιµοποίηση των προγραµµατιστικών µονάδων µέσω κληρονοµικότητας (inheritance and reuse). Πρέπει να µπορεί δηλαδή κάποιος να φτιάξει νέες προγραµµατιστικές µονάδες χρησιµοποιώντας τις υπάρχουσες µαζί µε νέα χαρακτηριστικά Οι παλιές µονάδες να κληρονοµούν τα χαρακτηριστικά τους στις καινούργιες. 4. Μέσο του πολυµορφισµού (function and class polymorphism) οι µονάδες µπορούν να παίρνουν διαφορετικές µορφές ανάλογα µε το είδος των δεδοµένων πάνω στα οποία επιδρούν. Στην C δουλεύουµε µε αντικείµενα συναρτήσεις (functions) που έχουν µέχρι ενός σηµείου τις πρώτες 3 ιδιότητες. Στην C++ όµως γίνεται η εξέλιξη τους σε κλάσεις (classes). Η συνάρτηση στην C και την C++ είναι ένα block κώδικα που εκτελεί συγκεκριµένες εργασίες, για παράδειγµα εκτυπώνει κάτι στην οθόνη ή υπολογίζει κάποιο άθροισµα. Η κλάση είναι ένα σύνολο από συναρτήσεις µαζί µε δεδοµένα που σχετίζονται µε αυτές τις συναρτήσεις. 3

4 Παρακάτω δίνουµε απλοποιηµένα ένα παράδειγµα δηµιουργίας προγράµµατος σε C/C++: Πιο συγκεκριµένα ο κύκλος ανάπτυξης θα είναι σχηµατικά: 4

5 Η κατηγορία run time errors (σφάλµατα κατά τον χρόνο εκτέλεσης) µπορεί να αναλυθεί σε 3 ειδών σφάλµατα 1. Αριθµητικά σφάλµατα, για παράδειγµα διαίρεση µε το 0.. Σφάλµατα υπερχείλισης (overflow) που δηµιουργούνται µε τη λάθος χρησιµοποίηση του εύρους αναπαράστασης των µεταβλητών. 3. Εννοιολογικά σφάλµατα. Ναι µεν το πρόγραµµα τρέχει χωρίς τεχνικά λάθη αλλά ο αλγόριθµος (ο τρόπος δηλαδή που επιλύουµε το εν λόγω πρόβληµα) είναι λανθασµένος. 5

6 Ξεκινάµε µε το απλούστερο πρόγραµµα σε C. Προσοχή η αρίθµηση των εντολών στα αριστερά υπάρχει µόνο για να διευκολύνει την επεξήγηση των εντολών. Πρόγραµµα 01 1 #include <stdio.h> int main( ) 3 4 printf( "Hello world\n" ); 5 return 0; 6 Όταν ο υπολογιστής εκτελέσει (τρέξει) το προηγούµενο πρόγραµµα (που στον σκληρό δίσκο θα το είχαµε σώσει µε το όνοµα ας πούµε simple.cpp) παίρνουµε στην οθόνη του υπολογιστή µας την εκτύπωση: Ας αρχίσουµε να εξηγούµε γραµµή προς γραµµή τις εντολές του simple.cpp 1 η γραµµή: #include <stdio.h> Η εντολή #include <stdio.h>, στην πρώτη γραµµή δίνει την οδηγία να συµπεριληφθεί στο πρόγραµµα το αρχείο κεφαλίδας (header file) stdio.h (standard I/O library) το οποίο βρίσκεται ήδη εγκατεστηµένο στο σκληρό δίσκο, στον folder INCLUDE µαζί µε τα υπόλοιπα αρχεία του compiler της C++. Ένα αρχείο κεφαλίδας περιέχει βοηθητικές συναρτήσεις, όπως η printf( ), που είναι απαραίτητες για να γίνει αντιληπτό το πρόγραµµα από τον µεταγλωττιστή. Η εντολή #include <stdio.h> πρέπει να τίθεται οπωσδήποτε στην πρώτη γραµµή κάθε προγράµµατος µας. Το σύµβολο # σηµαίνει ότι τη γραµµή αυτή τη διαχειρίζεται ο προ-επεξεργαστής (pre-processor) της C, o οποίος διαχειρίζεται εργασίες (όπως την εισαγωγή των ορισµών έτοιµων συναρτήσεων της C/C++) πριν τον 6

7 µεταγλωττιστή. Το συγκεκριµένο αρχείο stdio.h περιέχει τις συναρτήσεις βιβλιοθήκης (ορισµούς αντικειµένων) που αφορούν τις εντολές εισόδου (standard in) και εξόδου δεδοµένων (standard out). Αν δεν βάλουµε στην πρώτη γραµµή του προγράµµατος την εντολή #include <stdio.h>, τότε οι εντολές εισόδου - εξόδου δεν θα γίνονται αντιληπτές από το µεταγλωττιστή και κατά τη φάση της µεταγλώττισης του προγράµµατος θα πάρουµε µήνυµα λάθους. Τα σύµβολα <.> λένε στον προεπεξεργαστή να ψάξει το stdio.h στον folder µε την ονοµασία include. Η γλώσσα C\ C++ έχει µεγάλο αριθµό από τυποποιηµένες βιβλιοθήκες όπως για παράδειγµα τις stdio.h, math.h, time.h, string.h, iostream.h (που είναι µετεξέλιξη της stdio) και άλλες. η γραµµή: int main() Η εντολή στη δεύτερη γραµµή int main( ) πρέπει επίσης να συµπεριλαµβάνεται απαραίτητα σε κάθε µας πρόγραµµα. Η εντολή αυτή ορίζει την έναρξη της συνάρτησης main που είναι τύπου int. Με τον όρο συνάρτηση εννοούµε χονδρικά ένα αυτοτελές σύνολο κώδικα που εκτελεί µία συγκεκριµένη εργασία. Προς το παρόν θα πρέπει να θυµόµαστε ότι: Η συνάρτηση main έχει ιδιαίτερη σηµασία, διότι είναι η συνάρτηση από την οποία ξεκινάει πάντα να τρέχει ένα πρόγραµµα σε C. Κάθε συνάρτηση στην γλώσσα C έχει ορίσµατα (arguments) είτε είναι κενή ορισµάτων όπως η main( ) = main(void). Κάθε συνάρτηση στην γλώσσα C επιστρέφει ένα είδος αριθµητικού αποτελέσµατος είτε δεν επιστρέφει τίποτα και τότε είναι void (κενή). Εδώ η main έχει ορισθεί σαν µια συνάρτηση που θα επιστρέψει ακέραια τιµή (πρόθεµα: int από το integer = ακέραιος) 3 η γραµµή: (το ανοιχτό άγκιστο) Στην 3η γραµµή υπάρχει ένα ανοιχτό άγκιστρο, το οποίο συνδυάζεται µε το κλειστό άγκιστρο, της 6ης γραµµής. Οτιδήποτε βρίσκεται ανάµεσα στο ανοιχτό άγκιστρο και το κλειστό άγκιστρο είναι το κυρίως πρόγραµµα. 4η γραµµή: printf("hello world\n"); Η εντολή (print function) printf( ) είναι µία εντολή εξόδου. Τυπώνει το περιεχόµενο της στην οθόνη. Οτιδήποτε υπάρχει µέσα στα διπλά 7

8 εισαγωγικά (αποτελεί την µεταβλητή της συνάρτησης), στην προκειµένη περίπτωση µια αλφαριθµητική ακολουθία, τυπώνεται στην οθόνη. Το \n είναι ένας χαρακτήρας ελέγχου (the newline character) που δεν εκτυπώνεται αλλά έχει σαν αποτέλεσµα την αλλαγή γραµµής εκτύπωσης. 5η γραµµή: return 0 Το return 0 επιστρέφει την ακέραια τιµή 0 και σηµατοδοτεί το τέλος της συνάρτησης main. Συνοψίζοντας: Κάθε πρόγραµµα σε C αποτελείται από ένα σύνολο συναρτήσεων κατάλληλα συνδεδεµένων µεταξύ τους ώστε να επιτυγχάνουν το ζητούµενο τελικό αποτέλεσµα επεξεργασίας. Μια από τις συναρτήσεις του προγράµµατος θα πρέπει να είναι η main( ). Η συνάρτηση main( ) είναι αυτό που σε άλλες γλώσσες προγραµµατισµού ονοµάζεται κύριο πρόγραµµα. Οι υπόλοιπες συναρτήσεις (εάν υπάρχουν) αποτελούν τα υπο-προγράµµατα ή τις υπο-ρουτίνες (sub-programs ή modules) του κυρίως προγράµµατος. Η είσοδος και έξοδος της main συνδέεται µε το λειτουργικό σύστηµα του υπολογιστή (στην περίπτωση µας µε τα Windows). Όταν το πρόγραµµα αρχίζει να τρέχει στην CPU η εκτέλεση αρχίζει πάντα από την πρώτη γραµµή της main( ). Πρόγραµµα 01b Μια ισοδύναµη void έκδοση του προγράµµατος 01 θα ήταν: #include <stdio.h> void main() printf("hello world!\n"); return ; Παρατηρήστε ότι: Εδώ η main είναι κενή και δεν επιστρέφεται τίποτα. Έχουµε δηλαδή κενό return. Αυτό γιατί έχουµε ήδη ορίσει την main σαν void. 8

9 Μια ισοδύναµη int C++ έκδοση του προγράµµατος 01 θα ήταν: Πρόγραµµα 01c #include <iostream.h> int main() cout << Hello world!" << endl; return ( 1 ); Παρατηρήστε ότι: Εδώ αντί για την printf( ) χρησιµοποιούµε την cout( ) του header file: iostream.h το << είναι ο χαρακτήρας κατεύθυνσης (insertion character) το endl είναι µεταβλητή χαρακτήρα ίση µε τον newline character \n. Άσκηση 01 Γράψτε και εκτελέσετε την ισοδύναµη void C++ έκδοση του προγράµµατος 01. Τι θα γίνει εάν παραλείψουµε την δήλωση int της main στο πρόγραµµα 01? Μπορείτε να σκεφθείτε ένα ακόµα πιο εύκολο πρόγραµµα σε C++? ΜΕΤΑΒΛΗΤΕΣ Το πρόγραµµα 01 ήταν ένα απλό πρόγραµµα που µας έδειξε πως να εκτυπώνουµε στην οθόνη του υπολογιστή µας ένα συγκεκριµένο µήνυµα. Συχνά ζητάµε από ένα πρόγραµµα να «θυµάται» µια αριθµητική τιµή (ή ένα σύνολο από τιµές). Για παράδειγµα αν το πρόγραµµα ζητάει µια τιµή από τον χρήστη ή γίνεται κάποιος ενδιάµεσος υπολογισµός, θα θέλαµε ο υπολογιστής να θυµάται αυτές τις τιµές έτσι ώστε να µπορούµε να τις χρησιµοποιήσουµε και σε άλλα κοµµάτια του κώδικα. Το πρόγραµµα «θυµάται» χρησιµοποιώντας µεταβλητές (variables). 9

10 Για παράδειγµα double a1; η εντολή αυτή δεσµεύει στην µνήµη του υπολογιστή ένα σύνολο από θέσεις 8 διαδοχικές θέσεις µνήµης (8 bytes) που τις ονοµάζει a1 και είναι τύπου πραγµατικού αριθµού (δηλαδή αριθµού µε δεκαδικό µέρος) διπλής όµως ακρίβειας. Εάν θέλαµε να κάνουµε δήλωση απλής ακρίβειας (µόνο 4 bytes) θα κάναµε την δήλωση: float a1; Η µεταβλητή είναι ένα µέρος όπου αποθηκεύουµε πληροφορία. ηλαδή είναι ένα σύνολο από θέσης µνήµης στον RAM όπου µπορούµε να αποθηκεύσουµε τιµές (κωδικοποιηµένες στο δυαδικό σύστηµα) τις οποίες µετέπειτα µπορούµε να ξαναχρησιµοποιήσουµε. Τα ονόµατα των µεταβλητών: εν πρέπει να αρχίζουν µε αριθµό. εν πρέπει να υπάρχει κενός χαρακτήρας (space) ενδιάµεσα. Το µήκος του ονόµατος είναι αυθαίρετο. Υπάρχει διάκριση µεταξύ πεζών και κεφαλαίων (λέµε ότι η C/C++ είναι case sensitive γλώσσα) Συνήθης πρακτική θεωρείτε το όνοµα της µεταβλητής να είναι «εκφραστικό». Για παράδειγµα αν σε µια µεταβλητή έχουµε εκχωρήσει το εµβαδόν ενός τριγώνου καλό θα είναι να την ονοµάσουµε area είτε embadon. Για παράδειγµα οι µεταβλητές 1xy και ab cd δεν είναι νόµιµες. Οι area και Area είναι νόµιµες αλλά διαφορετικές. Πρόγραµµα 0: 1 #include <stdio.h> int main() 10

11 3 4 double a1; 5 a1=5.78; 6 printf( O arithmos einai %lf, a1); 7 return 0; 8 Οι τρεις πρώτες και οι δύο τελευταίες γραµµές και αυτού του προγράµµατος είναι ίδιες µε αυτές του προγράµµατος 01. Αυτό πρέπει να µας γίνει συνήθεια, πριν να ξεκινήσουµε να γράφουµε οτιδήποτε σε κάθε πρόγραµµα πρέπει να υπάρχουν τουλάχιστον οι γραµµές αυτές. Αλλιώς κατά τη µεταγλώττιση θα εµφανιστεί µήνυµα λάθους. 4 η γραµµή: double a1; Στη γραµµή αυτή ορίζεται ο τύπος των µεταβλητών. Γενικά ορίζουµε στην αρχή του προγράµµατος (αν και οι ορισµοί των µεταβλητών µπορούν να µπουν σε οποιαδήποτε θέση µέσα στο πρόγραµµα αρκεί η µεταβλητή που ορίζεται να χρησιµοποιείται µετά τον ορισµό της) το είδος όλων των µεταβλητών που θα χρησιµοποιήσουµε στο πρόγραµµα µας. Στην περίπτωση αυτή έχουµε ορίσει την µεταβλητή a1 σαν double. 5η γραµµή: a1=5.78; Στη γραµµή αυτή αρχικοποιούµε την a1 στο Προφανώς η συγκεκριµένη τιµή είναι τυχαία και στη θέση της θα µπορούσε να υπάρχει ένας άλλος πραγµατικός αριθµός. Έµµεσα η C έχει κρατήσει 8 διαδοχικά bytes µνήµης για την a1 έτσι στη συνέχεια του προγράµµατος, όποτε θα χρησιµοποιείται η µεταβλητή a1 θα είναι σαν να χρησιµοποιούµε τον αριθµό τον οποίο της έχουµε καταχωρήσει. 6η γραµµή: printf( O arithmos einai %lf, a1); Στη γραµµή αυτή συναντάµε και πάλι την εντολή εξόδου printf η οποία όµως παρουσιάζει κάποιες διαφορές σε σχέση µε τον τρόπο που την είχαµε χρησιµοποιήσει στο προηγούµενο πρόγραµµα 1. Τυπώνει δηλαδή την φράση: O arithmos einai στη συνέχεια όµως, στο πρόγραµµα, η φράση αυτή ακολουθείται από το πεδίο µορφοποίησης εξόδου %lf. Η σύνταξη αυτή σηµαίνει ότι στη θέση του %lf θα τυπωθεί η τιµή της µεταβλητής που βρίσκεται αµέσως µετά τα διπλά εισαγωγικά, δηλαδή, στην προκείµενη περίπτωση, η τιµή της a1. Στην εντολή αυτή τα σύµβολα που ακολουθούν το % (percent) θα µπορούσε να είναι διαφορετικό από το lf (long float). Αυτό εξαρτάται από τον τύπο της µεταβλητής που έχουµε ορίσει αλλά και από τον τρόπο µε το οποίο 11

12 θέλουµε να παρασταθούν τα αποτελέσµατα στην έξοδο, π.χ. σε απλή δεκαδική µορφή, σε δυνάµεις του 10 (εκθετική), σε οκταδική ή σε δεκαεξαδική. Στην περίπτωση που είναι double και θέλουµε δεκαδική µορφή, χρησιµοποιούµε το %lf. Παρατηρήσεις: 1. Το = δεν υποδηλώνει εξίσωση: Η εντολή a1=5.78 δεν είναι µία εξίσωση αλλά η εκχώρηση στην µεταβλητή a1 του αριθµού 5.78 µέσο του τελεστή εκχώρησης ( = ) (του assignment operator). Ως εκ τούτου το κοµµάτι κώδικα: double a1; a1=5.78; a1=a1-1.78; (ή αλλιώς a1 -= 1.78) printf( O arithmos einai %lf, a1); είναι απόλυτα λογικό εφόσον µας λεει ότι η νέα τιµή της a1 (στα αριστερά) θα είναι η παλαιά τιµή (στα δεξιά) µειωµένη κατά Στο τέλος θα πάρουµε την εκτύπωση O arithmos einai 4.0. ήλωση και αρχικοποίηση µπορούν να γίνουν ταυτόχρονα Στην γλώσσα C υπάρχουν πολλοί τρόποι γραφής κώδικα που δίνουν το ίδιο αποτέλεσµα. Για παράδειγµα οι γραµµές 4 και 5 του προγράµµατος 0 µπορούν να γραφτούν σε µια µόνο γραµµή, µε ταυτόχρονη δήλωση και αρχικοποίηση, σαν double a1=5.78; Στη συνέχεια θα αναφερθούµε στα είδη των µεταβλητών που µπορούµε να δηλώσουµε σε ένα πρόγραµµα. Στον επόµενο πίνακα, αναγράφονται οι κυριότεροι τύποι των µεταβλητών που χρησιµοποιούµε συνήθως, σε ένα πρόγραµµα της γλώσσας C/C++, και τα αντίστοιχα πεδία µορφοποίησης (format fields) σε µια εντολή εξόδου (όπως η printf που είδαµε) ή σε µια εντολή εξόδου (όπως η scanf που θα δούµε στη συνέχεια). 1

13 ήλωση Τύπος Μεταβλητής Πεδίο µορφοποίησης int, short int Ακέραιος απλής, και µικρής ακρίβειας %d long int Ακέραιος διπλής ακρίβειας %ld float Πραγµατικός απλής ακρίβειας %f, %e (σε απλή δεκαδική και εκθετική αναπαράσταση ) double Πραγµατικός διπλής ακρίβειας %lf, %le ( σε διπλή δεκαδική και εκθετική αναπαράσταση ) char Χαρακτήρας %c Περισσότερες από µια µεταβλητές θέλουµε να ορίσουµε και στη συνέχεια να τυπώσουµε περισσότερες από µία µεταβλητές; Έστω λοιπόν ότι θέλουµε να ορίσουµε τρεις µεταβλητές και στη συνέχεια να τυπώσουµε την τιµή τους στην οθόνη. Η περίπτωση αυτή είναι ποιο σύνθετη οπότε πρέπει να σκεφτούµε τον τρόπο και τα βήµατα που θα ακολουθήσουµε ώστε να υλοποιήσουµε το σκελετό του προγράµµατος ή αλλιώς να σκεφτούµε τον αλγόριθµο για την υλοποίηση του προγράµµατος. Ορίζουµε τις µεταβλητές (εδώ πρέπει να αποφασίσουµε αν θέλουµε οι µεταβλητές να είναι ακέραιες, πραγµατικές, χαρακτήρα ή οποιουδήποτε άλλου τύπου) Πρέπει να αποφασίσουµε τον τρόπο που θα εκτυπωθούν τα αποτελέσµατα στην οθόνη (το ένα κάτω από το άλλο ή το ένα δίπλα στο άλλο, κλπ) Αφού έχουµε καταλήξει στον αλγόριθµο του προγράµµατος µπορούµε τώρα να προχωρήσουµε στο κυρίως πρόγραµµα µια µορφή του οποίου θα µπορούσε να είναι: Πρόγραµµα 03: 1 #include <stdio.h> int main() 3 4 double a1,a; 5 long int Z; 6 a1 = 5.78; 7 a = 6.97; 8 Z = 1000; 9 printf( Oi arithmoi einai: a1= %lf, a= %lf, %ld \n, a1, a, a3); 10 return 0; 11 13

14 Γραµµές 4 και 5 Στις γραµµές 4 και 5 γίνεται ο ορισµός του τύπου των µεταβλητών. Από την στιγµή που επιλέγουµε ότι µεταβλητές θα είναι τύπου double µπορούµε να τις βάλουµε στην ίδια γραµµή και να χωρίζονται µεταξύ τους µε τον τελεστή κόµµα (, ). Στο τέλος όµως της εντολής βάζουµε πάντα ελληνικό ερωτηµατικό. Γραµµές 6 έως 8 Αρχικοποίηση των µεταβλητών a1, a και Z. Γραµµή 9 Στην 9η γραµµή του Προγράµµατος 03 βλέπουµε την εντολή εξόδου printf να συντάσσεται µε έναν τρόπο που µας επιτρέπει να εκτυπώνουµε στην οθόνη και τις τρεις µεταβλητές που έχουµε ορίσει. Ο αριθµός των ορισµάτων της συνάρτησης printf( ) είναι γενικά αυθαίρετος. Εδώ έχουµε 4 ορίσµατα που συνδέονται µεταξύ τους ως εξής: Έτσι στην οθόνη τυπώνεται η έκφραση: (Oi arithmoi einai:) ακολουθούµενη από τις τιµές των τριών µεταβλητών. Οι τιµές των µεταβλητών αυτών θα τυπωθούν στην οθόνη, στην ίδια γραµµή και η µία δίπλα στην άλλη µε κενό ανάµεσα τους. 14

15 Στην περίπτωση που θα θέλαµε να τυπώσουµε τις τιµές των µεταβλητών την µία κάτω από την άλλη τότε θα έπρεπε να χρησιµοποιήσουµε στην συνάρτηση printf( ) τον τελεστή αλλαγής γραµµής \n. Στην περίπτωση αυτή η 9η γραµµή θα ήταν: printf("oi arithmoi einai:\n a1 = %lf\n a = %lf\n Z = %lf\n", a1, a, Z); και θα έδινε το αποτέλεσµα ηλαδή, όταν τυπώνει την τιµή της κάθε µεταβλητής αλλάζει και γραµµή οπότε γράφει την τιµή της κάθε µεταβλητής την µία κάτω από την άλλη. Εκτός από τον τελεστή αλλαγής γραµµής υπάρχουν και άλλοι τελεστές που συντάσσονται µε τον ίδιο τρόπο αλλά µεταβάλλουν το σηµείο εκτύπωσης µε διαφορετικό τρόπο. Οι πιο σηµαντικοί απ αυτούς φαίνονται στον ακόλουθο πίνακα. Τελεστές Επεξήγηση \f Αρχίζει µία νέα οθόνη η σελίδα \n Μετακινείται στην αρχή της επόµενης γραµµής \r Μετακινείται στην αρχή της τρέχουσας γραµµής \t Μετακινείται στην επόµενη θέση στήλη (tab) Άσκηση 0: Γράψτε το πρόγραµµα 03 σε συµπαγή µορφή χρησιµοποιώντας void και ταυτόχρονη δήλωση και αρχικοποίηση των µεταβλητών. Μέχρι τώρα στα προγράµµατα που έχουµε επεξεργαστεί χρησιµοποιούµε την συνάρτηση printf( ) για να τυπώνουµε την τιµή της µεταβλητής όπως ακριβώς την εισάγουµε. Υπάρχουν όµως περιπτώσεις, όπου µας ενδιαφέρει να ορίζουµε εµείς τον αριθµό των ψηφίων κάθε αριθµού που θα εµφανίσει η printf. 15

16 Πρόγραµµα 04: 01 #include <stdio.h> 0 void main() double D= ; 05 printf("o arithmos einai: %10.5lf \n", D); 06 printf("o arithmos einai: %10.4lf \n", D); 07 printf("o arithmos einai: %10.3lf \n", D); 08 printf("o arithmos einai: %10.lf \n", D); 09 printf("o arithmos einai: %10.1lf \n", D); 10 printf("o arithmos einai: %10.0lf \n", D); 11 printf("o arithmos einai: %0.10lf \n", D); 1 printf(" \n"); 13 printf("o arithmos einai: %10.5le \n", D); 14 printf("o arithmos einai: %10.4le \n", D); 15 printf("o arithmos einai: %10.3le \n", D); 16 printf("o arithmos einai: %10.le \n", D); 17 printf("o arithmos einai: %10.1le \n", D); 18 printf("o arithmos einai: %10.0le \n", D); 19 printf("o arithmos einai: %0.10le \n", D); 0 printf(" \n"); 1 return; Γραµµές 5 έως 10 Παρατηρούµε ότι δεν έχουµε τον όρο %lf αλλά κάτι πιο σύνθετο. Ο όρος που χρησιµοποιούµε %10.Κlf για Κ=5,4,3,,1,0. Αυτό αναγκάζει τον υπολογιστή να δεσµεύσει χώρο για τουλάχιστον 10 ψηφία (µαζί µε την υποδιαστολή και το αρνητικό πρόσηµο, όταν υπάρχει) στην οθόνη και το µέγιστο Κ=5,4,3,,1,0 δεκαδικά ψηφία µετά την υποδιαστολή. Έτσι στην περίπτωση αυτή το πρόγραµµα θα δώσει έξοδο (εκτύπωση στην οθόνη), Γραµµή 11 ίνουµε στην %lf µορφοποίηση %10.0lf Αυτό αναγκάζει τον υπολογιστή να δεσµεύσει χώρο για τουλάχιστον 10 ψηφία και το µέγιστο 0 δεκαδικά ψηφία µετά την υποδιαστολή Γραµµές 1 και 0 Το µόνο όρισµα στην συνάρτηση printf ( ) είναι ο χαρακτήρας ελέγχου \n. Αυτό σηµαίνει ότι ο υπολογιστής θα εµφανίσει κατά την εκτύπωση µια κενή γραµµή. 16

17 Γραµµές 13 έως και 19 Ότι και στις γραµµές 5 έως και 10 αλλά για «εκθετική» εκτύπωση µε το le (long exponential) Όταν ο υπολογιστής εκτελέσει (τρέξει) το προηγούµενο πρόγραµµα παίρνουµε την εκτύπωση Το µέγεθος σε RAM των µεταβλητών και η συνάρτηση sizeof( ) Στο πρόγραµµα που ακολουθεί χρησιµοποιούµε την συνάρτηση sizeof() που δίνει το µέγεθος του χώρου µνήµης που παρακρατείται µετά την δήλωση µεταβλητών τύπου short int, int, long int Πρόγραµµα 05: 01 #include <iostream.h> 0 void main() short I; int J; long K; 05 cout <<"size of short = " << sizeof(i)<< endl; 06 cout <<"size of int = " << sizeof(j) << endl; 07 cout <<"size of long = " << sizeof(k) << endl; 17

18 08 return; 09 Που σηµαίνει ότι για µεταβλητές τύπου, short int, int και long int διατίθενται από την RAM, 4 και 4 bytes αντίστοιχα. Η µεταβλητή τύπου long int θα έπρεπε να έχουν στην µνήµη διπλάσια χωρητικότητα από την int πράγµα που δεν συµβαίνει γιατί η C αφήνει το λειτουργικό σύστηµα να αποφασίσει για το µέγεθος τους (είναι δηλαδή system dependent). Άσκηση 03: Γράψτε πρόγραµµα που να βρίσκει το µέγεθος στην µνήµη µεταβλητών τύπου char, float και double ΠΡΑΞΕΙΣ Μέχρι στιγµής έχουµε αναφέρει τον τρόπο µε τον οποίο µπορούµε να τυπώσουµε οτιδήποτε θέλουµε στην οθόνη του Η/Υ. Όµως µία από τις βασικές ιδιότητες του Η/Υ είναι ότι έχει την δυνατότητα να εκτελεί (µε πολύ µεγάλη ταχύτητα) αριθµητικές πράξεις. Τα σηµεία που χρησιµοποιούµε για τις βασικές φαίνονται στον ακόλουθο πίνακα Σηµείο Πράξη - Αφαίρεση a - b + Πρόσθεση a + b 18

19 * Πολλαπλασιασµός a * b / ιαίρεση a / b % Υπόλοιπο της ακέραιας διαίρεσης του a µε το b = a % b Pow (.,. ) Ύψωση του double a στο double b = Pow(a, b ) (χρειάζεται το #include της math.h) Ας θεωρήσουµε λοιπόν ότι µας ενδιαφέρει να υπολογίσουµε 1. Το άθροισµα sum τριών πραγµατικών αριθµών x=14., y=1.3, z=3.6.. Στην συνέχεια να βρούµε την ρίζα root του αθροίσµατος 3. Στην συνέχεια να βρούµε ακέραιο µέρος intpart του root. 4. Στην συνέχεια να βρούµε το υπόλοιπο remainder της διαίρεσης του intpart µε τον ακέραιο J=3 Πρόγραµµα 05: 01 #include <stdio.h> 0 #include <math.h> 03 void main() double x = 14., y = 1.3, z = 3.6; 06 double sum, root; 07 int intpart, J=3, remainder; 08 sum = x + y + z; 09 printf("oi arithmoi einai: x= %lf y = %lf z = %lf \n", x, y, z); 10 printf("to athroisma einai: sum = %lf\n", sum); 11 root=pow(sum, 0.5); 1 printf("h riza einai: root = %10.8lf\n", root); 13 intpart= (int) root; 14 remainder = intpart % J; 15 printf("to akeraio meros tis rizas einai: intpart = %d\n", intpart); 16 printf("to ypoloipo tis diairesis toy intpart me to J = %d einai : %d\n", intpart, remainder); 17 return ; 18 Γραµµές 5 έως 7 19

20 Αρχικοποιούµε τα x, y, z και J. Οι µεταβλητές sum, root και remainder θα πάρουν τιµή κατά την εκτέλεση του κώδικα. Γραµµές 8 έως 10 Εκχωρούµε το άθροισµα των x, y και z στην µεταβλητή sum και εκτυπώνουµε. Γραµµές 11 και Βρίσκουµε την ρίζα root = pow(sum, 0.5) του sum χρησιµοποιώντας την συνάρτηση pow( ). Ο ορισµός της οποίας βρίσκεται στο header file: math.h. Το προηγούµενο αρχείο επικεφαλίδας το συµπεριλαµβάνουµε στο πρόγραµµα στην γραµµή. Γραµµές 13 έως 16 Ο τελεστής (int) (. ) αποκόβει το δεκαδικό µέρος του ορίσµατος στην η παρένθεση. Για παράδειγµα (int) ( ) = 3. Ενώ. στη µεταβλητή remainder εκχωρούµε το υπόλοιπο της διαίρεσης του intpart µε το J. Στην συνέχεια εκτυπώνουµε τα ενδιάµεσα αποτελέσµατα. Άσκηση 1) Ξαναγράψτε το πρόγραµµα05 χρησιµοποιώντας την cout( ), για παράδειγµα η γραµµή 09 θα πάρει την µορφή: cout << "Oi arithmoi einai: x=" << x << "y =" << y << "z =" << z << endl; ) Ποία τα αποτελέσµατα του παρακάτω προγράµµατος? #include <iostream.h> 0

21 void main(void) int I=10, J=4; cout <<"I=" << I << " J=" << J<< endl; cout <<"I/J=" << I/J << " (float) I/J=" << (float) I/J << endl; return ; Έστω λοιπόν ότι έχουµε 5 πραγµατικούς αριθµούς και θέλουµε να υπολογίσουµε το µέσο όρο τους. Στη συνέχεια θέλουµε, όλα τα αποτελέσµατα να τυπωθούν κατά οµάδες και κατά γραµµή. Πρόγραµµα 06: 01 #include <stdio.h> 0 int main() double a1=4., a=.3, a3=3.6, a4=.0, a5=7., sum, average; 05 sum = a1 + a +a3 + a4 + a5; 06 average = sum/5; 07 printf( Oi arithmoi einai: %lf %lf %lf %lf %lf\n, a1,a,a3,a4,a5); 08 printf( To auroisma einai: %lf\n, sum); 09 printf( O mesos oros einai: %lf\n, average); 10 return (0); 11 Ορίζουµε και αρχικοποιούµε τις µεταβλητές στη γραµµή 4. Στην γραµµή 05 υπολογίζεται το άθροισµα και καταχωρείται στη µεταβλητή sum Στη γραµµή 06 υπολογίζεται ο µέσος όρος των 5 αριθµών και καταχωρείται στην µεταβλητή average. Στην γραµµή 07 εκτυπώνονται σε µία γραµµή οι µεταβλητές a1, a, a3, a4, και a5. Στην επόµενη το άθροισµα τους και την µεθεπόµενη ο µέσος όρος τους. Ας δούµε µια άλλη έκδοση του προγράµµατος 06, όπου η ενδιάµεση µεταβλητή sum δεν υφίσταται Πρόγραµµα 06b 01 #include <stdio.h> 0 int main() double a1=4., a=.3, a3=3.6, a4=.0, a5=7., average; 05 average = a1 + a +a3 + a4 + a5; 1

22 06 average = average /5; 07 printf( Oi arithmoi einai: %lf %lf %lf %lf %lf\n, a1,a,a3,a4,a5); 08 printf( O mesos oros einai: %lf\n, average); 09 return (0); 10 Στις γραµµές 05 και 06 ενδιάµεσο αποτέλεσµα εκχωρείται στην µεταβλητή average = a1 + a +a3 + a4 + a5; Στην επόµενη γραµµή όµως έχουµε average = average /5; (ή average /= 5) Που σηµαίνει ότι η καινούργια τιµή του average θα είναι η παλιά (αυτή της προηγούµενης γραµµής) διαιρεµένη µε το πλήθος των αριθµών. Άσκηση Υπολογίσετε την τυπική απόκλιση των a1,,a5. Η προτεραιότητα των πράξεων Πρέπει να θυµόµαστε ότι ο πολλαπλασιασµός, η διαίρεση καθώς και ό,τι υπάρχει µέσα στις παρενθέσεις προηγείται της πρόσθεσης και της αφαίρεσης. Έτσι αν θέλουµε λ.χ. να υπολογίσουµε το α*(β+γ) πρέπει να προσέξουµε ώστε να µην υπολογιστεί κάτι άλλο όπως π.χ. το α*β+γ. Αν δηλαδή θέλουµε να υπολογίσουµε πρώτα το άθροισµα β+γ και µετά να το πολλαπλασιάσουµε µε το α, πρέπει το άθροισµα να το βάλουµε σε παρένθεση ώστε να πραγµατοποιηθεί η πράξη αυτή πριν τον πολλαπλασιασµό. Η σειρά µε την οποία ο Η/Υ εκτελεί τις πράξεις των παραστάσεων που του δίνονται από το χρήστη είναι η εξής: 1. Πράξεις µέσα στις Παρενθέσεις.. Πολλαπλασιασµοί, ιαιρέσεις, Ρίζες και υνάµεις. 3. Αθροίσµατα και Αφαιρέσεις. Προτεραιότητα των πράξεων και ο τελεστής (,) Ο τελεστής (,) λειτουργεί σαν διαχωριστικό παραστάσεων. Ήδη το έχουµε δει στις δηλώσεις µεταβλητών λ.χ. int X1=0, X=1; Μπορούµε όµως να τον χρησιµοποιήσουµε αντί του (;) για να διαχωρίσουµε εντολές. average =( a1=4., a=.3, a3=3.6, (a1 + a + a3)/3 );

23 τότε η εκτέλεση θα γίνει από αριστερά προς τα δεξιά και η average θα πάρει την τιµή της τελευταίας παράστασης, δηλαδή της (a1 + a + a3)/3. Έτσι η προηγούµενη εντολή είναι ισοδύναµη µε το group εντολών: a1=4. a=.3; a3=3.6; average =(a1 + a + a3)/3; Κατ αυτή την έννοια είναι δυνατή η πολλαπλή αρχικοποίηση µεταβλητών σε κάποια κοινή τιµή. Για παράδειγµα στην έκφραση a1=( a=.3, a3=3.6); το a1 θα έχει κοινή τιµή µε το a3. Ενώ µπορούµε να γράψουµε a1=a3=3.6; που είναι ισοδύναµο µε την εντολή a1=(a3=3.6); Οι βιβλιοθήκες και ο τρόπος χρήσης τους Μέχρι στιγµής έχουµε αναφερθεί σε απλές πράξεις (πρόσθεση, αφαίρεση, πολλαπλασιασµός, διαίρεση). Μπορεί όµως να χρειαστεί να λύσουµε και κάποιες παραστάσεις οι οποίες µπορεί να περιέχουν ρίζες, απόλυτα κλπ. Στην περίπτωση αυτή, µαζί µε τη δήλωση για την βιβλιοθήκη <stdio.h> που κάνουµε στην αρχή του προγράµµατος πρέπει, οπωσδήποτε να δηλώσουµε και την βιβλιοθήκη που περιέχει τις ρίζες, τα απόλυτα, τις δυνάµεις, κλπ. Η βιβλιοθήκη αυτή είναι η <math.h> και δηλώνεται αµέσως µετά την <stdio.h> όπως φαίνεται στο πρόγραµµα 8. Στον Πίνακα 4 φαίνονται οι πιο συχνά χρησιµοποιούµενες σύνθετες µαθηµατικές συναρτήσεις που περιέχονται στην βιβλιοθήκη <math.h>. Εντολή στη C/C++ abs(x) sqrt(x) pow(x,y) cos(x) sin(x) tan(x) exp(x) log(x) log10(x) Μαθηµατική Συνάρτηση Απόλυτο του x Ρίζα του x ύναµη, x y Συνηµίτονο του x Ηµίτονο του x Εφαπτοµένη του x e x ln(x) log 10 (x) 3

24 asin(x) acos(x) atan(x) Τόξο ηµιτόνου x Τόξο συνηµιτόνου x Τόξο εφαπτοµένης x Πρόγραµµα 07: 01 /* ABS.CPP: This program computes and displays 0 * the absolute values of several numbers. 03 */ 04 #include <stdio.h> 05 #include <math.h> 06 #include <stdlib.h> 07 void main( void ) int ix = -4, iy; 10 long lx = L, ly; 11 double dx = , dy; 1 iy = abs( ix ); 13 printf( "The absolute value of %d is %d\n", ix, iy); 14 ly = labs( lx ); 15 printf( "The absolute value of %ld is %ld\n", lx, ly); 16 dy = fabs( dx ); 17 printf( "The absolute value of %lf is %lf\n", dx, dy ); 18 Output The absolute value of -4 is 4 The absolute value of is The absolute value of is Γραµµές Σχόλια για το πρόγραµµα που ακολουθεί. Ότι αρχίζει µε /* και τελειώνει µε */ αγνοείται τελείως από τον compiler. Γραµµές 1 17 Οι συναρτήσεις abs, labs και fabs επιδρούν σε int, long int και float (ή double) δεδοµένα. Ας θεωρήσουµε ότι γνωρίζουµε το µήκος της πλευράς ενός ισόπλευρου τριγώνου και µας ζητούν να υπολογίσουµε το εµβαδό του. Για να 4

25 κατασκευάσουµε τον αλγόριθµο που λύνει το πρόβληµα αυτό ακολουθούµε τα εξής βήµατα: Πρέπει να δώσουµε το µήκος της πλευράς του τριγώνου και να ορίσουµε τον τύπο της µεταβλητής Πρέπει να ορίσουµε τον τύπο της µεταβλητής για το αποτέλεσµα (εµβαδό) καθώς και τους τύπους των βοηθητικών µεταβλητών, αν χρειάζονται. Πρέπει να λύσουµε την εξίσωση που δίνει το εµβαδό. Το εµβαδό δίνεται από τη σχέση : area = base*height/ Την βάση του τριγώνου την γνωρίζουµε αφού γνωρίζουµε το µήκος της πλευράς του, το ύψος όµως όχι. Οπότε πρέπει να υπολογιστεί. Έτσι είναι: height = sqrt(base*base - (base/)*(base/)) Ονοµάζουµε τη µεταβλητή που θα αντιστοιχεί στο µήκος της πλευράς: base οπότε προκύπτει µία βοηθητική µεταβλητή η height η οποία χρησιµοποιείται στο πρόγραµµα αλλά δεν φαίνεται πουθενά σε καµιά εντολή εξόδου. Πρέπει εδώ να θυµίσουµε ότι, η συνάρτηση sqrt( ) είναι η τετραγωνική ρίζα στη C/C++ και περιέχεται στην βιβλιοθήκη <math.h>. Πρόγραµµα 08: 01 /* equilateral.cpp: Αυτό το πρόγραµµα δοθείσας 0 * πλευράς ισόπλευρου τριγώνου υπολογίζει και 03 * εκτυπώνει το εµβαδό. 04 */ 05 #include <stdio.h> 06 #include <math.h> 07 int main() double base, height, area = 1.5; 10 height = sqrt(base *base - (base/)*(base/)); area = base*height/.0; 11 printf( to mhkos ths pleyras einai: %lf \n, base); 1 printf( To embado einai: %lf\n, area); 5

26 13 return 0; Το πρόγραµµα 8 µοιάζει πολύ µε όλα τα προγράµµατα που έχουµε ήδη δει για να κατανοήσουµε την εντολή εξόδου printf και τις αριθµητικές πράξεις. Έχει όµως µία πολύ σηµαντική διαφορά: Περιέχει µία µαθηµατική συνάρτηση, την sqrt, η οποία δεν περιέχεται στην κλασσική βιβλιοθήκη <stdio.h> αλλα σε µία άλλη, πιο εξειδικευµένη, την <math.h>. Όπως µπορούµε να δούµε την βιβλιοθήκη αυτή την ενσωµατώνουµε στο πρόγραµµα στη η γραµµή µε την εντολή #include <math.h>. Στη συνέχεια ορίζουµε όλες τις µεταβλητές που χρησιµοποιούµε στο πρόγραµµα (γραµµή 5η). Στη συνέχεια ορίζουµε την τιµή της πλευράς (µεταβλητή base) του τριγώνου. Τέλος αφού υπολογίζουµε το εµβαδό το τυπώνουµε στην οθόνη. Θα µπορούσαµε στο πρόγραµµα 8 να είχαµε χρησιµοποιήσει περισσότερες από µία σύνθετες µαθηµατικές συναρτήσεις. Ετσι, λ.χ. η γραµµή 7, height = sqrt(base *base - (base/)*(base/)); θα µπορούσε να έχει τη µορφή, height = sqrt(pow(base,) - pow(base/,)); όπου η εντολή pow(x,y) όπως αναφέρεται στην πίνακα 4 είναι η ύψωση του αριθµού x στη δύναµη y. Μάλιστ χρησιµοποιώντας µόνο την pow το height θα ήταν: height = pow (pow(base,) - pow(base/,), 0.5); Να σηµειωθεί εδώ ότι το µοναδικό «επικίνδυνο» σηµείο του προγράµµατος είναι η πιθανότητα να «ξεχάσουµε» να ενσωµατώσουµε την βιβλιοθήκη <math.h>. Για το λόγο αυτό, κάθε φορά που πιστεύουµε ότι κατά το χτίσιµο ενός προγράµµατος µπορεί να µας χρειαστεί κάποια από τις πιο σύνθετες αριθµητικές πράξεις, πρέπει να ενσωµατώνουµε από την αρχή τη βιβλιοθήκη <math.h>. 6

27 Παράδειγµα Να γραφτεί πρόγραµµα σε C που να εναλλάσει τις τιµές δοθέντων ακεραίων a και b. Οι τιµές των µεταβλητών να εκτυπώνονται πριν και µετά την εναλλαγή Πρόγραµµα 09: #include <stdio.h> int main() int a=10, b=100, temp; printf( Πριν την εναλλαγή a=%d b=%d\n, a, b); temp=b; b=a; a=temp; printf( Μετά την εναλλαγή a=%d b=%d\n, a, b); return 0; Εδώ παρατηρούµε ότι αναγκαστικά θα πρέπει να ορίσουµε την προσωρινή (temporary) µεταβλητή temp. H εντολή temp=b; προστατεύει τα περιεχόµενα της b. H εντολή b=a; θέτει τα περιέχόµενα της a στην b. Τελικά µε την εντολή a=temp; Η µεταβλητή a θα έχει στο τέλος την παλιά τιµή της b. Χρησιµοποιώντας τον τελεστή κόµµα σε µια γραµµή η εναλλαγή θα ήταν: a=(temp=b, b=a, temp); Οι Εντολές εισόδου Η εντολή scanf( ) Όλα τα προγράµµατα που έχουµε δει µέχρι στιγµής έχουν ένα πολύ σηµαντικό µειονέκτηµα: δεν µπορούν να εισαχθούν εξωτερικά (πληκτρολόγιο) από το χρήστη του προγράµµατος οι τιµές των µεταβλητών. Ας δούµε τι ακριβώς σηµαίνει αυτό. Όταν γράφουµε ένα πρόγραµµα, για να µπορέσουµε να δούµε τα αποτελέσµατα στον υπολογιστή, πρέπει να το µεταγλωττίσουµε. Μετά τη µεταγλώττιση, και 7

28 αν το πρόγραµµα δεν έχει κάποιο λάθος, τρέχουµε το αρχείο το οποίο έχει το επίθεµα EXE. Όµως στη µορφή αυτή του προγράµµατος αν θέλουµε να αλλάξουµε την αρχική µεταβλητή πρέπει να αλλάξουµε το πρόγραµµα, να το µεταγλωττίσουµε ξανά, να δηµιουργηθεί το νέο EXE αρχείο και µετά να το τρέξουµε. Προφανώς θα ήταν πολύ πιο απλά τα πράγµατα αν κάθε φορά που τρέχαµε το EXE αρχείο µας ρωτούσε ποια τιµή θα θέλαµε να δώσουµε στην κάθε µεταβλητή. Με τον τρόπο αυτό θα κερδίζαµε πολύ χρόνο, αφού δεν θα χρειαζόταν να αλλάξουµε το πρόγραµµα και δε θα χρειαζόταν ξανά µεταγλώττιση. Πρέπει λοιπόν να δούµε πώς λειτουργεί η κυριότερη εντολή εισόδου από το πληκτρολόγιο: η scanf. Στο πρόγραµµα 9, που ακολουθεί, κάνει ότι ακριβώς το πρόγραµµα 8, βρίσκει δηλαδή το εµβαδό ενός ισόπλευρου τριγώνου που γνωρίζουµε το µήκος της πλευράς του, αλλά το µήκος αυτό δεν το δίνουµε µέσα στο πρόγραµµα αλλά κάθε φορά που το τρέχουµε. Πρόγραµµα 9: 01 #include <stdio.h> 0 #include <math.h> 03 int main() double base, height,surface; 06 printf( \n Dwste thn pleura tou isopleurou trigwnou \n ); 07 scanf( %lf,&base); 08 height = sqrt(base *base - (base/)*(base/)); 09 surface = base*height/.0; 10 printf( to mhkos ths pleyras einai: %lf \n, base); 11 printf( To embado einai: %lf\n, surface); 1 return 0; 13 Το πρόγραµµα 9 διαφέρει από το πρόγραµµα 8 µόνο στις γραµµές 6 και 7. Στις γραµµές αυτές περιλαµβάνεται η εντολή εισόδου scanf. Στην γραµµή 6 βλέπουµε την γνωστή εντολή εξόδου printf. Λόγω της εντολής αυτής, όταν τρέχει το πρόγραµµα θα εµφανισθεί στην οθόνη το µήνυµα: Dwste thn pleura tou isopleurou trigwnou και ο Η/Υ σταµατάει να τρέχει το πρόγραµµα περιµένοντας να πληκτρολογήσουµε µία τιµή που θα είναι το µήκος της πλευράς του ισόπλευρου τριγώνου. Όταν πληκτρολογήσουµε την τιµή τότε, µέσω της εντολής scanf στη γραµµή 7, η τιµή αυτή θα καταχωρηθεί στην µεταβλητή base. 8

29 Στη συνέχεια το πρόγραµµα θα εκτελέσει τις πράξεις που ακολουθούν και θα τυπώσει τα αποτελέσµατα. Στην περίπτωση που θέλουµε να πάρουµε αποτέλεσµα για κάποια άλλη τιµή του µήκους των πλευρών δεν έχουµε παρά να ξανατρέξουµε το πρόγραµµα και να δώσουµε την καινούρια τιµή. Μπορούµε δηλαδή να δώσουµε εξωτερικά τις τιµές των µεταβλητών που µας ενδιαφέρουν χωρίς να χρειάζεται κάθε φορά να αλλάζουµε το πρόγραµµα. Προσοχή η scanf( ) για να διαβάσει την base πρέπει να την καταχωρήσει ακριβώς στην διεύθυνση που αυτόµατα δηµιούργησε στην RAM, κατά τον ορισµό της base. Για αυτό στην scanf χρησιµοποιούµε τον τελεστή της διεύθυνσης (& =address operator) δηλαδή scanf( %lf,&base); Πολλαπλή εισαγωγή από το πληκτρολόγιο Στη συνέχεια θα δούµε ένα απλό πρόγραµµα που υπολογίζει την υποτείνουσα ενός τριγώνου, µε το Πυθαγόρειο θεώρηµα, αφού του δώσουµε τα µήκη των δύο κάθετων πλευρών του. Το πρόγραµµα αυτό ουσιαστικά το χρειαζόµαστε για να δούµε µία περίπτωση όπου η εντολή scanf δίνει τιµή σε περισσότερες από µία µεταβλητές και συγκεκριµένα, στην περίπτωση του προγράµµατος 10, σε δύο. Πρόγραµµα 10: #include <stdio.h> #include <math.h> int main() double pleyra1,pleyra,ypoteinoysa; printf( \n Dwste to mhkos ths 1hs kai hs katheths pleuras tou orthogwnioy trigwnou\n ); scanf( %lf %lf,&pleyra1,&pleyra); ypoteinoysa = sqrt(pleyra1*pleyra1 + pleyra*pleyra); printf( To mhkos kathe mias apo tis kathetes pleyres einai: %lf kai %lf\n, pleyra1,pleyra); printf( H ypoteinoysa einai: %lf\n, ypoteinoysa); return 0; Το Πρόγραµµα 10 είναι ένα απλό πρόγραµµα που, όπως είπαµε, υπολογίζει το µήκος της υποτείνουσας ενός ορθογωνίου τριγώνου αφού δεχθεί εξωτερικά τις τιµές των µηκών των δύο καθέτων πλευρών του. Μπορούµε λοιπόν να δούµε πως συντάσσεται η εντολή scanf όταν πρέπει 9

30 να δώσει τιµή σε περισσότερες από µία µεταβλητές. Βλέπουµε λοιπόν στη γραµµή 7 ότι πρέπει οπωσδήποτε µεταξύ των δύο %lf να υπάρχει κενό. Σε αντίθετη περίπτωση ο Η/Υ δεν αντιλαµβάνεται την ύπαρξη µεταβλητών και προφανώς καταχωρεί λάθος τιµές. Αν αντί για δύο µεταβλητές θέλαµε να καταχωρήσουµε περισσότερες τότε απλά θα γράφαµε, όσες φορές απαιτούνταν, µέσα στα διπλά εισαγωγικά τις εντολές %lf ενώ µετά τα διπλά εισαγωγικά πρέπει να τοποθετήσουµε τις µεταβλητές στις οποίες δίνουµε τιµές. Οι τιµές επιστροφής των συναρτήσεων printf( ) και scanf( ) Γενικά µια συνάρτηση της C έχει µια τιµή επιστροφής που είναι η τιµή που η συνάρτηση υπολογίζει και επιστρέφει στο πρόγραµµα από το οποίο τις έγινε κλήση. Για παράδειγµα η συνάρτηση sqrt( ) παίρνει έναν αριθµό σαν όρισµα και επιστρέφει την τετραγωνική του ρίζα. Η συνάρτηση printf( ) έχει και αυτή µια επιστρεφόµενη τιµή. Επιστρέφει τον αριθµό των χαρακτήρων που τύπωσε. Αν υπάρξει λάθος στην έξοδο η printf( ) επιστρέφει µια αρνητική τιµή. Εάν εκχωρήσουµε την επιστρεφόµενη τιµή της printf( ) σε µια ακέραια µεταβλητή ας πούµε: int rvp; (δηλαδή rvp= return value της printf) τότε η εντολή: rvp = printf("x=%lf y=%lf z=%lf\n", x, y, z); Προκαλεί δύο αποτελέσµατα αφενός η printf( ) θα εκτυπώση το ζητούµενο του ορίσµατος της, αφετέρου η επιστρeφόµενη τιµή της printf( ) (δηλαδή ο αριθµός των χαρακτήρων που εκτυπώθηκαν στην οθόνη +1 για τον χαρακτήρα ελέγχου \n) θα καταχωρηθεί στην rvp. Η συνάρτηση scanf( ) έχει και αυτή µια επιστρεφόµενη τιµή. Επιστρέφει τον αριθµό των µεταβλητών που αρχικοποίησε µε επιτυχία. Αν υπάρξει λάθος (για παράδειγµα τα πεδία µορφοποίησης της scanf( ) έχουν λανθασµένο τύπο επιστρέφεται η τιµή 0. Παράδειγµα Εάν εκχωρήσουµε την επιστρεφόµενη τιµή της scanf( ) σε µια ακέραια µεταβλητή int rvs; 30

31 τότε η εντολή: rvs=scanf("%lf %lf %lf", &x, &y, &z); Προκαλεί δύο αποτελέσµατα αφενός η scanf( ) θα ζητήσει την είσοδο των 3 µετβλητών x, y, z (το ζητούµενο του ορίσµατος της), αφετέρου η επιστρeφόµενη τιµή της scanf ( ) θα καταχωρηθεί στην rvp (εδώ εάν η εισαγωγή είναι επιτυχής στο rvs θα καταχωρηθεί η τιµή 3). Πρόγραµµα 11 #include <stdio.h> void main() double x, y, z; int rvp, rvs; printf("input 3 numbers\n"); rvs=scanf("%lf %lf %lf", &x, &y, &z); printf("the returned value is: %d\n", rvs); rvp=printf("x=%lf y=%lf z=%lf\n", x, y, z); printf("the returned value is: %d\n", rvp); return; 31

32 ΑΝΑΠΑΡΑΣΤΑΣΗ ΤΩΝ Ε ΟΜΕΝΩΝ ΣΕ ΕΝΑ ΥΠΟΛΟΓΙΣΤΙΚΟ ΣΥΣΤΗΜΑ ΘΕΩΡΙΑ ΑΝΑΠΑΡΑΣΤΑΣΗΣ Εδώ θα µελετήσουµε σε γενικές γραµµές τους τρόπους αναπαράστασης των δεδοµένων στην CPU και στα περιφερειακά του υπολογιστικού συστήµατος. Αυτό γιατί ο τρόπος µε τον οποίο κωδικοποιούνται οι αριθµοί στον υπολογιστή καθορίζει και τον τρόπο µε τον οποίο γίνονται οι αριθµητικές πράξεις. Όλα τα δεδοµένα στον υπολογιστή αποθηκεύονται κωδικοποιηµένα. ιαφορετικά υπολογιστικά συστήµατα (platforms) χρησιµοποιούν διαφορετικούς κώδικες, και διαφορετικοί κώδικες χρησιµοποιούνται σε διαφορετικά µέρη του συστήµατος. Όλοι όµως αυτοί οι κώδικες έχουν ένα κοινό: βασίζονται στην δυαδική αναπαράσταση. Και αυτό συµβαίνει επειδή όλες οι συσκευές και τα µέσα αποθήκευσης (οπτικά ή µαγνητικά) αναγνωρίζουν µόνο καταστάσεις 0 και 1 (τα bits). Έτσι οι αριθµητικοί κώδικες σε ένα σύστηµα βασίζονται στην δυαδική αριθµητική. Η τιµή θέσης Σε όλα τα αριθµητικά συστήµατα η τιµή κάθε ψηφίου εξαρτάται από την θέση του µέσα στον αριθµό. Για παράδειγµα: εκαδικός ακέραιος Τιµή θέσης εκαδική αναπαράσταση =573 υαδικός ακέραιος Τιµή θέσης εκαδική αναπαράσταση =11= ( 1011) εκαδικό κλάσµα Τιµή θέσης εκαδική αναπαράσταση =0.478 υαδικό κλάσµα Τιµή θέσης εκαδική αναπαράσταση = = ( ) 3

33 Το ψηφίο µε την µεγαλύτερη τιµή θέσης ονοµάζεται πιό σηµαντικό ψηφίο (most significant digit). Εάν η βάση είναι το ονοµάζεται το πιό σηµαντικό bit Αντίστοιχα το ψηφίο µε την µικρότερη τιµή θέσης ονοµάζεται το λιγότερο σηµαντικό ψηφίο. Οι λ-αδικοί αριθµοί Οι ακέραιοι αριθµοί σε ένα λ-αδικό σύστηµα αρίθµησης είναι της µορφής: n 1 1 ( α Lαα ) α λ L α λ α λ.όπου α 0,1, K, λ 1 0 n = n 1 1 0, λ i λψηφια Οι κλασµατικοί αριθµοί σε ένα λ-αδικό σύστηµα αρίθµησης είναι της µορφής: 1 n ( 0. α Lα α ) α λ L α λ,. όπου α 0,1, K, λ 1 1 n 1 n λ 1 n = + + i λψηφια Το λ συνήθως παίρνει τις τιµές, 8, 10, 16 για δυαδικό, οκταδικό, δεκαδικό και δεκαεξαδικό σύστηµα αρίθµησης αντίστοιχα. Ειδικά για το δεκαεξαδικό σύστηµα αρίθµησης ( λ=16 ), χρειαζόµαστε 5 παραπάνω ψηφία τα Α=11,...,F=15 δηλαδή α 0,1, K,9, A, BCDEF,,,, i Παράδειγµα (i) Μετατροπή του δεκαδικού 107 στην αντίστοιχη δυαδική του µορφή: 107 = = = ( ) 1 ( ) ( ) ( ) = = = = = = (1 1) = = = ( ) (ii) Μετατροπή των δεκαδικών 107, 1007 στην αντίστοιχη δεκαεξαδική τους µορφή: 33

34 ( B) = = B 16 = = F 1 0 = 16 ( E) + F = E 16 + F 16 = 3EF Κώδικες αλφαριθµητικών (bit patterns) 16 ( ) Η µετάδοση των δεδοµένων από και προς τον υπολογιστή (για παράδειγµα από το πληκτρολογιο στον υπολογιστή) γίνετα µε κώδικα χαρακτήρων. Κάποιοι από αυτούς τους χαρακτήρες είναι εκτυπώσιµοι (π.χ. οι χαρακτήρες A, K, Z ή 0,1, K,9) ενώ κάποιοι άλλοι είναι µη εκτυπώσιµοι και ονοµάζονται χαρακτήρες ελέγχου (π.χ. το \n). Τα αλφαριθµητικά που µπορουν να κωδικοποιηθούν ονοµάζονται το set χαρακτήρων του υπολογιστή ή µιας γλώσσας προγραµµατισµού. Η γλώσσα C/C++ καθώς και τα περισσότερα σηµερινά υπολογιστικά συστήµατα χρησιµοποιούν το ASCII (American Standard Code for Information Interchange) set χαρακτήρων. Εδώ κάθε χαρακτήρας 8 κωδικοποιείται µε 1 byte (= 8 bits) και έτσι υπάρχουν =56 τέτοιοι χαρακτήρες µε αντίστοιχους δεκαδικούς κωδικούς από το 0 έως και το 55. Στον επόµενο πίνακα παρατηρούµε ότι οι δεκαδικοί κώδικες ASCII για 0,..., 9 είναι 48,...,57. Για τους κεφαλαίους λατινικούς χαρακτήρες A,, Z είναι 65,...,90 ενώ για τους πεζούς a,, z είναι 97,...,

35 Οι συναρτήσεις getchar() και putchar() Για την εισαγωγή και εκτύπωση χαρακτήρα η γλώσσα C/C++ περιλαµβάνει τις συναρτήσεις βιβλιοθήκης getchar( ) και putchar( ) αντίστοιχα. Η συνάρτηση getchar() καλείται χωρίς όρισµα και επιστρέφει τον ακέραιο αριθµό που αντιστοιχεί στον κωδικό ASCII του χαρακτήρα που διαβάζει από το πληκτρολόγιο. Η συνάρτηση putchar( ) τυπώνει τον χαρακτήρα που αντιστοιχεί στον ακέραιο αριθµό του ορίσµατός της. Το επόµενο πρόγραµµα διαβάζει ένα χαρακτήρα από το πληκτρολόγιο και εµφανίζει τον αµέσως επόµενο του (κατά τον ASCII κώδικα) στην οθόνη 35

36 Πρόγραµµα 1 Version #include <stdio.h> 0 int main() char ch; 05 ch=getchar(); 06 ch=ch+1; 07 putchar(ch); 08 return 0; 09 Γραµµή 05 Κατά την εκτέλεση της γραµµής 05 ο υπολογιστής σταµατάει την εκτέλεση και περιµένει την εισαγωγή ενος χαρακτήρα. Εισάγουµε τον χαρακτήρα και µετά πατάµε enter. Έτσι στη µεταβλητή ch καταχωρείται ο αντίστοιχος κωδικός ASCII του χαρακτήρα. ηλαδή εάν εισάγαµε από το πληκτρολόγιο τον χαρακτήρα W στην ch θα καταχωρούνταν αυτόµατα η τιµή 87. Γραµµή 06 Τα περιεχόµενα του ch αυξάνονται κατά 1. Γραµµή 07 Εκτυπώνεται ο χαρακτήρας που αντιστοιχεί στην νέα τιµή του ch που τώρα έχει την τιµή 88. ηλαδή εκτυπώνεται ο χαρακτήρας X. Πρόγραµµα 1 Version 0 01 #include <stdio.h> 0 int main( ) char ch=getchar( ); 05 ch++; 06 putchar(ch); 07 return 0; 08 Γραµµή 04 ήλωση και παράλληλη αρχικοποίηση της ch µε την getchar( ). Γραµµή 05 Αύξηση της ch κατά 1. 36

37 Πρόγραµµα 1 Version #include <stdio.h> 0 int main( ) char ch=getchar( ) 05 putchar(++ch); 06 return 0; 07 Γραµµή 05 Η γραµµή 05 είναι ισοδύναµη µε τις εντολές: c=c+1; putchar(ch); Η εντολή ++ch είναι προ-αύξηση του ch. ηλαδή πρώτα γίνεται η αύξηση του ch και µετά είναι που εκτελείται η putchar. Προσοχή αν χρησιµοποιούσαµε την εντολή putchar(c++) (δηλαδή putchar και µετα-αύξηση του ch), πρώτα θα εκτελούνταν το putchar και µετά θα γινόταν η αύξηση του c. Πρόγραµµα 1 Version #include <stdio.h> 0 int main( ) char ch=getchar( ), NewLineChar = '\n'; 05 putchar(++ch); 06 putchar(newlinechar); 07 printf("ascii value of \\n is %d\n", NewLineChar); 08 return 0; 09 Γραµµή 4 Παράλληλα µε την αρχικοποίηση της ch ορίζουµε και την µεταβλητή χαρακτήρα NewLineChar που αρχικοποιούµαι στον χαρακτήρα \n. Γραµµή 6 Η εντολή putchar(newlinechar); στέλνει τον χαρακτήρα \n στην οθόνη µε αποτέλεσµα µια κενή γραµµή. Στην γραµµή 7 Το \\n απλώς εκτυπώνει το \n. 37

38 Έξοδος : Εάν τρέξουµε το πρόγραµµα και εισάγουµε τον χαρακτήρα W το αποτέλεσµα θα είναι X ASCII value of \n is 10 Για διάβασµα από το πληκτρολόγιο µεταβλητής χαρακτήρα ισχύουν οι παρακάτω ισοδυναµίες: ch=getchar( ); scanf( % c, &ch); cin >> ch; Για την εκτύπωση στη οθόνη µεταβλητής χαρακτήρα ισχύουν οι παρακάτω ισοδυναµίες: putchar(ch) printf( % c, ch); cout << ch; Ενώ τα αλφαβητικά δεδοµένα παραµένουν σε κώδικα ASCII καθ όλη την διάρκεια της επεξεργασία τους από τον υπολογιστή, τα αριθµητικά δεδοµένα µετατρέπονται περαιτέρω µε την χρήση κάποιου απο τους αριθµητικούς κώδικες που δίνουµε παρακάτω. Κώδικας προσήµου και µεγέθους (sign and magnitude code) Το πρόσηµο και το µέγεθος ενός αριθµού έχουν ξεχωριστή αναπαράσταση. Το πιό σηµαντικό ψηφίο είναι το bit του προσήµου. Θέτουµε 0 για θετικό αριθµό και 1 για αρνητικό Για παράδειγµα Εάν χρησιµοποιείται µια 6-bit αναπαράσταση τότε 13 και 13 θα είχαν την αναπαράσταση: 4 Bit προσήµου = =-13 0 εκαδική αναπαράσταση Με παρόµοιο τρόπο αναπαριστούνται και τα κλάσµατα 13/3 και -13/3 Bit προσήµου εκαδική αναπαράσταση =13/ =-13/3 38

39 Το συµπλήρωµα του ( s complement) Το συµπλήρωµα του ( s complement) είναι ο πιό σύνηθης τρόπος αναπαράστασης ακεραίων σε έναν υπολογιστή (αυτόν τον κώδικα χρησιµοποιεί η c/c++). Σε αυτόν τον αριθµητικό κώδικα χρησιµοποιείται η τυπική δυαδική τιµή θέσης που είδαµε προηγουµένος, όµως σε αυτή την αναπαράσταση το πιό σηµαντικό ψηφίο έχει αρνητική τιµή θέσης. Για n-bit αναπαράσταση θα χρησιµοποιούµε τον συµβολισµό n 1 n 1 0 [ an 1 an La1 a0 ] = an 1( ) + an + La1 + a0 Για παράδειγµα έστω ότι χρησιµοποιείται µια 6-bit αναπαράσταση τότε: Τιµή θέσης εκαδική αναπαράσταση =31 o µεγαλύτερος θετικός = = = = = -3 ο µικρότερος αρνητικός Αυτό µας δείχνει ότι οι 6-bit ακέραιοι x που µπορούν να 5 5 αναπαρασταθούν µε s complement έχουν εύρος x 1. Για n - bit αναπαράσταση θα είχαµε το εύρος: n n 1 r n 1 10 L0 = x 01 L1 = = 1 n n 1 r= 0 1 Ο λόγος που χρησιµοποιείται αυτή η κωδικοποίηση είναι η ευκολία µε την οποία µπορούµε να αλλάξουµε πρόσηµο σε ένα αριθµό και έτσι να κάνουµε στην ουσία την πράξη της αφαίρεσης χρησιµοποιώντας πρόσθεση. 39

40 Για παράδειγµα από το 19 = [ ] µπορούµε να πάρουµε το 19 = [ ] εναλλάσσοντας τα 0 σε 1 και τα 1 σε 0 και µετά προσθέτοντας το 1: Τιµή θέσης εκαδική αναπαράσταση = = = =-19 Αυτή η µέθοδος θα αλλάξει επίσης το 3 = [ ] στο θετικό 3 = [ ] : Τιµή θέσης εκαδική αναπαράσταση = = = =3 Γενικά λοιπόν εάν y είναι η n-bit αναπαράσταση ενός ακεραίου σε s complement και y η αναπαράσταση µε τα εναλλαγµένα ψηφία θα έχουµε: ( ) ( ) n 1 n ( ) L 0 (επειδή ai + a i = 1) n 1 n 1 ( ) ( 1 n 1 n n 1 n y+ y = a n 1 + an + + a 0 + a n 1 + an + + a L L 0 = = + ) = 1 y = y + 1 Έτσι κάνουµε αφαίρεση προσθέτοντας: x y = x+ y

41 Για παράδειγµα εάν θέλουµε να αφαιρέσουµε από το 9 = [ ] το 7 = [ ] θα έχουµε: Τιµή θέσης Παρατηρήστε ότι το κρατούµενο που βγαίνει απο τη πρόσθεση των σηµαντικών ψηφίων του -7 και του 9 δηλαδή το carry out, παραλείπεται. 0 εκαδική αναπαράσταση = = = = = = Το συµπλήρωµα του 1 (1 s complement) Και σε αυτόν τον αριθµητικό κώδικα το πιό σηµαντικό ψηφίο αναπαριστά αρνητική ποσότητα. που είναι όµως κατά 1 µεγαλύτερη από την αντίστοιχη του s complement έχουµε δηλαδή n 1 n 1 0 [ an 1 an La1 a0 ] = an 1( + ) + an + La1 + a0 1 1 Για παράδειγµα έστω ότι χρησιµοποιείται µια 6-bit αναπαράσταση τότε: Τιµή θέσης εκαδική αναπαράσταση = 31 (µεγαλύτερος θετικός) = = = = = = = -31 (µικρότερος αρνητικός) Αυτό το µας δείχνει ότι οι 6-bit ακέραιοι x που µπορούν να 5 1 x 5 1. αναπαρασταθούν έτσι έχουν εύρος ( ) Το 0 έχει δύο αναπαραστάσεις εφόσον 0 = [ ] = [ ]

42 Η κωδικοποίηση 1 s complement υπερέχει στο ότι εάν εναλλάξουµε 0 και 1 σε µια αναπαράσταση ενός ακεραίου, παίρνουµε το αρνητικό του αριθµού. Είναι όµως πιο δύσχρηστη αναπαράσταση από το γεγονός ότι θα πρέπει το κρατούµενο που βγαίνει απο τη πρόσθεση των σηµαντικών ψηφίων όταν είναι 1 (carry out = 1) να προστίθεται στο λιγώτερο σηµαντικό ψηφίο. Για παράδειγµα ;όταν προσθέτουµε το 7 [ ] 1 = στο 9 [ ] 1 (εδώ carry out = 1) χρειάζεται να προσθέσουµε 1 στο λιγώτερο σηµαντικό ψηφίο: =, Τιµή θέσης = = =9 Carry out= = Ενώ όταν προσθέτουµε το -18 στο στο 5 (εδώ carry out = 0) δεν χρειάζεται να προσθέσουµε τίποτα στο λιγώτερο σηµαντικό ψηφίο: Τιµή θέσης = = = 5 Carry out= =-13 Η κωδικοποίηση κινητής υποδιαστολής Ένας αριθµός κινητής υποδιαστολής (floating point number) είναι το γινόµενο µερών κωδικοποιηµένων σε κάποιο δυαδικό κώδικα. Το πρώτο είναι η mantissa (το κλασµατικό µέρος) που είναι ένα κλάσµα στο διάσηµα [1/, 1] και το δεύτερο είναι το exponent (το εκθετικό µέρος). κλασµατικο x = µερος εκθετικο ( µερος ). 4

43 Εάν χρησιµοποιήσουµε κώδικας πρόσηµου και µεγέθους και n-bit αναπαράσταση θα έχουµε: ( ) ( ) 1 ( n ) m 0 1 n 1 n n n 1 m m m e e e m m L 0 1 L = 1 + L + n ( 1) e n L+ e0 0 e n Τα παρακάτω παραδείγµατα έχουν γίνει µε 4-bit αναπαράσταση. mantissa πρόσηµο 1 3 πρόσηµο exponent = = = = Οι αριθµοί σε ένα υπολογιστικό σύστηµα είναι πεπερασµένοι Όπως και να κωδικοποιήσουµε τους αριθµούς σε ένα υπολογιστικό σύστηµα θα υπάρχει πάντα ένα άνω και ένα κάτω όριο στο µέγεθος τους. Για παράδειγµα χρησιµοποιώντας n-bits και s complement κωδικοποίηση το εύρος αναπαράστασης για ακέραιους θα είναι n 1 n n 1 n 1 x ενώ για 1 s complement 1 x ( ) Ο όρος overflow (υπερχείληση) χρησιµοποιείται αν µια πράξη δίνει αποτέλεσµα µεγαλύτερο από το άνω όριο (αντίστοιχα underflow σε σχέση µε το κάτω όριο). Η C/C++ δίνει διαφορετικούς τύπους ακεραίων και πραγµατικών που ο προγραµµατιστής πρέπει κάθε φορά να διαλέγει για να µειώνει την πιθανότητα δηµιουργίας overflow/underflow. ηµιουργία overflow σε κωδικοποίηση s complement To over/underflow συµβαίνει όταν στο πιο σηµαντικό ψηφίο, το εισερχόµενο κρατούµενο (carry in), είναι διαφορετικό από το εξερχόµενο κρατούµενο (carry out). 43

44 Χρησιµοποιώντας 6 bits γνωρίζουµε ότι το εύρος αναπαράστασης θα είναι 3 x 31. Η πράξη Τιµή θέσης σε 6 bits s complement είναι επιτρεπτή: εκαδική αναπαράσταση = = = 3 carry out = 0, carry in=0 αποτέλεσµα σωστό. Η πράξη 5+18>31 σε 6 bits s complement δεν είναι επιτρεπτή Τιµή θέσης εκαδική αναπαράσταση = = =-1 carry out = 0, carry in=1 overflow αποτέλεσµα λανθασµένο. Η πράξη Τιµή θέσης σε 6 bits s complement είναι επιτρεπτή: εκαδική αναπαράσταση = = = 4 carry out = 1, carry in=1 αποτέλεσµα σωστό. Η πράξη -8-31<-3 σε 6 bits s complement δεν είναι επιτρεπτή Τιµή θέσης εκαδική αναπαράσταση = = = 5 carry out = 1, carry in=0 underflow αποτέλεσµα λανθασµένο. 44

45 Στο επόµενο πρόγραµµα προοµοιώνουµε ακέραια under/overflow Πρόγραµµα 13 #include <stdio.h> #include <math.h> int main() char k, l; short int i, j; int m, n; // UNDERFLOW WITH 8-BIT INTEGERS k = - (char) pow(.0, 7.0); l = k - 1; printf("underflow: k=%d, k - 1=%d\n", k, l); // OVERFLOW WITH 8-BIT INTEGERS k = (char) (pow(.0, 7.0) - 1.0); l = k + 1; printf("overflow: k=%d, k + 1=%d\n", k, l); // UNDERFLOW WITH 16-BIT INTEGERS i = - (short int) pow(.0, 15.0) ;// the minimum negative short integer j = i-1; printf("underflow: i=%d, i - 1=%d\n", i, j); // OVERFLOW WITH 16-BIT INTEGERS i = (short int) (pow(.0, 15.0)-1.0);//the maximum positive short integer j = i + 1; printf("overflow: i=%d, i + 1=%d\n", i, j); // UNDERFLOW WITH 3-BIT INTEGERS m = - (int) pow(.0, 31.0) ;// the minimum negative short integer n = m-1; printf("underflow: m=%d, m - 1=%d\n", m, n); // OVERFLOW WITH 3-BIT INTEGERS m = (int) (pow(.0, 31.0)-1.0);//the maximum positive short integer n = m + 1; printf("overflow: m=%d, m + 1=%d\n", m, n); return 0; Στην γραµµή εισάγουµε την βιβλιοθήκη math.h γιατί θα y χρησιµοποιήσουµε την συνάρτηση pow(x, y) που υπολογίζει το x. Θα πρέπει x και y να είναι double ενώ το αποτέλεσµα είναι και αυτό double. 45

46 Στην γραµµή 8 το // δηλώνει ότι θα ακολουθήσουν σχόλια. Στην γραµµή 9 το πρόθεµα (char) µετατρέπει το double αποτέλεσµα pow(.0, 7.0) σε char (δηλαδή σε 8bit ακέραιο). Μετά την εκτέλεση του προγράµµατος παίρνουµε τα αποτελέσµατα: Στον παρακάτω πίνακα δικαιολογούµε το πρώτο «λάθος» της C δηλαδή δικαιολογούµε γιατί σε s complement η αφαίρεση του 1 από το -18 δίνει 17 (υπενθυµίζουµε ότι το εύρος της 8 bit αναπαράστασης είναι = x 1 = 17 Τιµή θέσης εκαδική αναπαράσταση = = = 17 Παρατηρήστε ότι carry in = 0 ενώ carry out = 1 46

47 Οι εντολές #define και const Εάν θέλαµε να υπολογίσουµε τον όγκο (volume) σφαίρας δοσµένης ακτίνας (radius) θα είχαµε: Πρόγραµµα 14 Version01 #include <stdio.h> #include <math.h> double volume(double, double); //Function prototype int main( ) double radius, PI; PI=4.0*atan(1.0); printf("pi=%0.17lf\n", PI); printf("input the radius:"); scanf("%lf", &radius); printf("volume=%0.17lf\n", volume(pi, radius)); return 0; double volume(double pi, double R) return (4.0/3.0)*pi*pow(R, 3.0); Έξοδος: 47

48 Θα µπορούσαµε όµως να έχουµε ορίσει το π = σαν σταθερά Πως θα το κάναµε αυτό? Παραδοσιακά στην C ο ορισµός των σταθερών γίνεται µε την #define πάνω από την main( ). Στην προκειµένη περίπτωση θα είχαµε: #define PI Το directive #define απευθύνεται στον προ-επεξεργαστή της C. Ο προεπεξεργαστής τότε αντικαθιστά παντού µέσα στο πρόγραµµα την «λέξη» PI µε τον αριθµό Πρόγραµµα 14 Version0 #include <stdio.h> #define PI double volume(double); int main( ) double radius; printf("pi=%0.17lf\n", PI); printf("input the radius:"); scanf("%lf", &radius); printf("volume=%0.17lf\n", volume(radius)); return 0; double volume(double R) return (4.0/3.0)*PI*R*R*R; Εάν µάλιστα θέλαµε να αποφύγουµε την περίπτωση που η σταθερά που ορίζουµε είχε από πιο πριν ορισθεί από κάποιο άλλο αρχείο επικεφαλίδας (τότε θα είχαµε conflict των ορισµών) θα δίναµε την πιο γενική directive: #ifndef PI 48

49 #define PI #endif ηλαδή θα λέγαµε στον προ-επεξεργαστή να ορίσει την σταθερά PI µόνο στην περίπτωση που δεν είχε ορισθεί από πριν. Στην C++ χρησιµοποιούµε την const για να ορίσουµε σταθερές Η const είναι ένας καλύτερος τρόπος για να ορίζουµε σταθερές διότι τότε δίνουµε και τον τύπο τους και ο compiler µπορεί να χρησιµοποιεί τις σταθερές ανάλογα µε τον τύπο τους. Αντί λοιπόν για #define PI θα µπορούσαµε να χρησιµοποιήσουµε: const double PI= ; Πρόγραµµα 14 version03 (the C++ version) 01 #include <iostream.h> 0 #include <iomanip.h> 03 const double PI= ; 04 double volume(double); 05 int main() double radius; 08 cout << setprecision(17); 09 cout << "PI=" << PI << endl; 10 cout << "Input the radius:"; 11 cin >> radius; 1 cout << "Volume=" << volume(radius) << endl; 13 return 0; double volume(double R) return ((4.0/3.0)*PI*R*R*R); 18 49

50 Παρατήρηση: 1. Στην γραµµή 08 λέµε στην cout να χρησιµοποιεί ακρίβεια (precision) κατά την εκτύπωση, 17 δεκαδικών. Απαραίτητη προϋπόθεση για να λειτουργήσει το cout << setprecision(17); είναι η εισαγωγή στην αρχή του προγράµµατος (στην γραµµή 0) του αρχείου επικεφαλίδας iomanip.h (input output manipulation.header).. Εάν µεταξύ της γραµµής 08 και 09 παρεµβάλαµε και την γραµµή: cout << setiosflags (ios :: scientific); τα αποτελέσµατα στην εκτύπωση θα έπαιρναν την γνωστή εκθετική µορφοποίηση, ενώ αν είµαστε ήδη στην εκθετική µορφοποίηση θα µπορούµε να πάµε πίσω στην δεκαδική κάνοντας την δήλωση: cout << setiosflags (ios :: fixed); ΟΙ ΣΧΕΣΙΑΚΟΙ ΚΑΙ ΛΟΓΙΚΟΙ ΤΕΛΕΣΤΕΣ ΣΤΗΝ C\C++ Οι σχεσιακοί τελεστές µας επιτρέπουν να ελέγχουµε µεταβλητές και σταθερές για ισότητα (= =), µη ισότητα (!=), ανισότητα (>, <) άνισοισότητα (>=, <=) Στην C και C++ δεν έχουµε τύπο λογικής µεταβλητής (όπως για παράδειγµα στην Visual Basic που έχουµε τον τύπο Boolean). Οι λογικές µεταβλητές ορίζονται έµµεσα µε τον εξής τρόπο: Οι διάφορες του µηδενός τιµές θεωρούνται «αληθείς» Οι µηδενικές τιµές «ψευδείς». Για παράδειγµα θεωρήστε ότι στους ακέραιους x, y και z κάνουµε την αρχικοποίηση 3, 5 και 8. Ενώ στην µεταβλητή χαρακτήρα ch την αρχικοποίηση 'A'. εκχώρηση έλεγχος εκχώρηση r = (x = = y) ; 3 = = 5 r=0; s = (y!= z) ; 5!= 8 s = 1; t = (x > x) ; 3 > 3 t = 0; u = (z <= (x + y)); 8 <= (3 + 5) u = 1; v = (x = 10); - v = x = 10; 50

51 w = (ch = = a ) A = = a w = 0; Πρόγραµµα 15 #include <stdio.h> int main() int x = 3, y = 5, z = 8; char ch = 'A'; int r, s, t, u, v, w; r = (x = = y) ; s = (y!= z) ; t = (x > x) ; u = (z <= (x + y)); v = (x = 10); w = (ch = = a ); printf("\n r=%d, \n s=%d, \n t=%d, r, s, t); printf( \n u=%d, \n v=%d, \n w=%d \n", u, v, w); return 0; Έξοδος: Οι λογικοί τελεστές &&, και! Με τους λογικούς τελεστές && (AND), (OR) και! (NOT) µπορούµε να δηµιουργήσουµε πολύπλοκες λογικές εκφράσεις όπως (a!= b) && (b!= c) && (c!= a) αληθές εάν a b c a (a <= x) && (x <= b) αληθές εάν x [ ab, ] 51

52 !((a <= x) && (x <= b))) αληθές εάν x [ a, b] = (, a) ( b, ) ((a <= x) && (x <= b)) ((c <= x) && (x <= d)) αληθές εάν x ab, U cd, [ ] [ ] ((a <= x) && (x <= b)) && ((c <= x) && (x <= d)) αληθές εάν x ab, cd, [ ] [ ] Οι λογικοί τελεστές ορίζονται µε τον πιο κάτω τρόπο: P && Q = TRUE Εάν P και Q είναι TRUE P && Q = FALSE Εάν τουλάχιστον ένα εκ των P και Q είναι FALSE P Q = TRUE Εάν τουλάχιστον ένα εκ των P και Q είναι TRUE P Q = FALSE Εάν P και Q είναι FALSE! P= TRUE P είναι FALSE! P= FALSE P είναι TRUE Πρόγραµµα 16 #include <stdio.h> int main() int a=, b=3, c=5; int r, s, t, u; r = (a = = b) (b!= c) ; s =!((c - b) = = a); t = ((a+b)!= c) && ((a*b) >= c); u = (a > 0) && ((b!= 3) (a <= c)); printf("\n r=%d, s=%d, t=%d, u=%d\n", r, s, t, u); return 0; 5

53 Έξοδος: ΕΠΕΞΕΡΓΑΣΙΑ ΥΠΟ ΣΥΝΘΗΚΗ I (Conditional processing ) Σε όλα τα προηγούµενα παραδείγµατα ο κώδικας εκτελούνταν από την 1 η εντολή έως και την τελευταία του προγράµµατος µε την σειρά που βρίσκονταν στον κώδικα. Η επεξεργασία υπό συνθήκη επεκτείνει την χρησιµότητα των προγραµµάτων επιτρέποντας την χρήση λογικών test για να καθορίσουµε έτσι ποία κοµµάτια κώδικα θα εκτελεστούν. Το Προγραµµατιστικό «σχήµα» if if(test ) /*ΑΠΛΗ if( ) */ L GROUP L Η οµάδα εντολών L GROUP L εκτελείται µόνο εάν TEST = true if(test ) /*ΑΠΛΗ if( ) else */ L GROUP1 L else GROUP L L Η οµάδα εντολών L GROUP1 L εκτελείται µόνο εάν TEST Η οµάδα εντολών L GROUP L εκτελείται µόνο εάν TEST = true = false 53

54 if( ) /*ΦΩΛΙΑΣΜΕΝΗ if( ) else (DEEPLY NESTED if( ))*/ TEST 1 L GROUP1 L else if( ) TEST L GROUP L else if( ) TEST 3 L GROUP3 L M M else if( TEST K ) L GROUPk L else L GROUP k + 1 L Η οµάδα εντολών L GROUP L εκτελείται µόνο εάν: TEST1 = true Η οµάδα εντολών L TEST1 false, = TEST 1 GROUP L εκτελείται µόνο εάν: = true M Η οµάδα εντολών L GROUPk L εκτελείται µόνο εάν: TEST1 = false, TEST = false,..., TEST = k 1 false, TESTk = true Η οµάδα εντολών L GROUP k + 1 L εκτελείται µόνο εάν: TEST1 = false, TEST = false,..., TEST = k 1 false, TESTk = false Ο ΤΕΛΕΣΤΗΣ ΥΠΟ ΣΥΝΘΗΚΗ (THE CONDITIONAL OPERATOR) Εάν x µεταβλητή τότε στην x µπορούµε να εκχωρήσουµε την τιµή του τελεστή υπό συνθήκη: ( TEST? : ) x= Π Π ; 1 x = το «αποτέλεσµα» της Π 1 εάν TE ST = TRUE x = το «αποτέλεσµα» της Π εάν TE ST = FALSE 54

55 #include <stdio.h> int main() double x; printf("input a real number\n"); scanf("%lf", &x); \\ΑΠΛΗ if -- else. if(x > 0) printf(" +1\n"); else if(x < 0) printf(" -1\n"); else printf("0\n"); \\ ΦΩΛΙΑΣΜΕΝΗ if -- else. if(x > 0) printf(" +1\n"); else if(x < 0) printf("-1\n" ); else printf("0\n"); \\ ΤΕΛΕΣΤΗΣ ΥΠΟ ΣΥΝΘΗΚΗ (x > 0.0)? printf("+1\n") : ((x < 0.0)? printf("-1\n") : printf("0\n" )) ; return 0; Σε όλες τις παραπάνω περιπτώσεις εάν (x > 0.0) = true, στην έξοδο παίρνουµε +1 εάν (x > 0.0) = false και (x < 0.0) = true, στην έξοδο παίρνουµε -1 ενώ εάν (x > 0.0) = false και (x < 0.0) = false, στην έξοδο παίρνουµε 0 Α ς δούµε τον τελεστή υπό συνθήκη χρησιµοποιώντας το iostream.h #include <iostream.h> int main() 55

56 double X; cout << "Input X:"; cin >> X; (X>0.0)? cout << "X is positive" :((X<0.0)? cout << "X is negative" : cout << "X is zero" << endl); return 0; Π αράδειγµα Χρησιµοποιώντας τον τελεστή υπό συνθήκη να γραφτούν οι συναρτήσεις: max x, y ( ) min ( xy, ) ( ) abs x : Απόλυτη τιµή του x sign( x ) : Πρόσηµο του x # include <stdio.h> int main() double X=-1., Y=3.14; double maxxy, minxy, absx; int signx ; maxxy = (X > Y)? X : Y ; minxy = (X > Y)? Y : X ; absx = (X >= 0)? X : -X ; signx = (X > 0)? 1 : ((X < 0)? -1 : 0) ; printf("maxxy=%lf, minxy=%lf, absx=%lf, signx= %d\n", maxxy, minxy, absx, signx); re turn 0; Π αράδειγµα Να γραφτεί πρόγραµµα σε C χρησιµοποιώντας φωλιασµένη if που να αναγνωρίζει εάν ο εισαγόµενος από το πληκτρολόγιο χαρακτήρας είναι digit, capital case letter, lower case letter τίποτα από τα προηγούµενα 56

57 #include <stdio.h> int main() char ch; printf("input a charcter:"); ch = getchar(); if((ch >= '0') && (c <= '9')) printf("the character is a digit\n"); else if((ch >= 'A') && (c <= 'Z')) printf("the character is capital case letter\n"); else if((ch >= 'a') && (c <= 'z')) printf("the character is lower case letter\n"); else printf("not digit, capital or lower case letter\n"); re turn 0; Π αρατήρηση Η εντολή ch=getchar(); είναι ισοδύναµη µε την printf("%c", &ch); Ε ΠΕΞΕΡΓΑΣΙΑ ΥΠΟ ΣΥΝΘΗΚΗ II Απόλυτη διακλάδωση (unconditional branching) Η µεταφορά της ροής εκτέλεσης του κώδικα σε κάποιο άλλο σηµείο του προγράµµατος Παράδειγµα Το επόµενο κοµµάτι κώδικα υπολογίζει το ακέραιο άθροισµα: sum counter = 1; sum = 0; tag: if(counter <= 100) sum += counter*counter; counter++; goto tag; 100 = k= 1 k 57

58 Αρχικοποιούµε counter = 1; sum = 0; Εάν το counter είναι µικρότερο ή ίσο από το 100 προσθέτουµε στην παλιά τιµή του sum το counter*counter (sum = sum + counter*counter;). Στην συνέχεια κάνουµε update την τιµή του µετρητή counter (counter = counter + 1). Στην συνέχεια διακλαδώνουµε τον κώδικα στην ετικέτα (label) tag µε το goto (goto tag;). Ά σκηση Ποία τα αποτελέσµατα του παρακάτω προγράµµατος? #include <stdio.h> int main() double counter, start = 0.5, end = 3.5, step; int n = 6; TAG: step = (end - start)/n; counter = step; if(counter < end) printf("counter = %lf\n", counter); counter += step; goto TAG; return(0); Βρόχοι επανάληψης (Loops) Πολλές φορές θέλουµε να επαναλάβουµε ένα group εντολών στο πρόγραµµα µας. Ένας συµπαγής τρόπος για να το κάνουµε αυτό είναι τα loops επανάληψης Τ ο for - loop Εάν θέλουµε ο αριθµός των επαναλήψεων του group εντολών να είναι προκαθορισµένος χρησιµοποιούµε for. Το for έχει την σύνταξη 58

59 Όπου οι παραστάσεις είναι : Π 1 for ( Π ; Π ; Π ) group 1 3 =οµάδα εντολών αρχικοποίησης µεταβλητών ελέγχου. Π = συνδυασµός λογικών συνθηκών, που εξαρτούνται από τις µεταβλητές ελέγχου. Όταν η παράσταση Π γίνει false το for σταµατάει την διαδοχική εκτέλεση του group α εντολών µέσα στα άγκιστρα. Π3 =οµάδα µετατροπής των µεταβλητών ελέγχου (update) Π αράδειγµα Στο επόµενο παράδειγµα φτιάχνουµε ένα πίνακα µετατροπής µετρήσεων από Fahrenheit σε Celsious # include <stdio.h> #define C(f) (((f) - 3) * 5 / 9) void main() double f; printf("\n Fahrenheit Celsius \n"); printf(" \n"); for (f=0; f <= 100; f += 10) printf(" %5.1lf %5.1lf \n", f, C(f)); printf(" \n\n"); Τ α αποτελέσµατα θα είναι: 59

60 Παράδειγµα Να γραφτεί πρόγραµµα που να υπολογίζει τον µέσο όρο και την τυπική απόκλιση Ν παρατηρήσεων, µε εισαγωγή δεδοµένων από το πληκτρολόγιο. #include <stdio.h> #include <math.h> #define maxcounter 100 int main() int i, counter; double average=0.0, stddev=0.0, A[maxcounter]; counter=0; for( ; ; ) printf("input number %d :", counter+1); if(!scanf("%lf", &A[counter])) break; average += A[counter]; ++counter; if(counter) average /= counter; for(i=0; i<counter; ++i) stddev += pow(a[i]-average,.0); stddev = pow(stddev, 0.5); if(counter>1) stddev /= (counter - 1); printf("counter=%d average=%10.5lf stddev=%10.5lf\n", counter, average, stddev); else printf("there is only 1 number (no stddev)\n"); else printf("there are no numbers (no average and stddev)\n"); return 0; 60

61 Παρατηρήσεις 1. Στην double average=0.0, stddev=0.0, A[maxcounter]; το A[ ] ορίζει διάνυσµα διάστασης maxcounter από double αριθµούς. Το χρειαζόµαστε για να αποθηκεύσουµε τους αριθµούς που εισάγουµε από το πληκτρολόγιο για να υπολογίσούµε την τυπική απόκλιση.. Στην for( ; ; ) δίνουµε την ειδική περίπτωση του κενού for. Οι οµάδα εντολών µέσα στα άγκιστρα θα επαναλαµβάνονται µε ατέρµονα (infinite loop) εάν δεν περιέχουν την εντολή break; Που κάνει ακριβώς αυτό που υπονοεί το όνοµα της. Οδηγεί την ροή του προγράµµατος εκτός του for loop. 3. Η µεταβλητή counter µετά το break θα περιέχει το πλήθος των double που εισάγαµε κατά την εκτέλεση του προγράµµατος. 4. Στην if(!scanf("%lf", &A[counter])) break; λέµε ότι θα σταµατήσουµε να διαβάζουµε από το πληκτρολόγιο (θα βγούµε εκτός του for loop) όταν η scanf γίνει false, δηλαδή επιστρέψει στην C µηδενική τιµή. Αυτό θα γίνει όταν από το πληκτρολόγιο εισάγουµε κάτι διαφορετικό από double. 5. Η if(counter) µας λεει ότι θα µπούµε µέσα στα άγκιστρα της if µόνο εάν counter 0 (θυµηθείτε ότι η C µεταχειρίζεται µεταβλητές που περιέχουν το µηδέν σαν false ενώ µεταβλητές που περιέχουν αριθµό διάφορο του µηδενός σαν true). 6. Την if(counter) την χρειαζόµαστε για την περίπτωση που δεν εισάγουµε κανένα αριθµό από λάθος. 7. Για την µέση τιµή και την τυπική απόκλιση χρησιµοποιούµε: average counter 1 counter K = 1 = A [ K ] counter 1 stddev = A i average counter 1 i= 1 ( ) 61

62 Ασκήσεις Πόσες φορές εκτελούνται και τι εκτυπώνουν τα παρακάτω for loops: for( int i=1, j=5; (i < 10) && (j > 0); i++, j--) printf("i = %d j = %d\n", i, j); for( int i=1, j=5, k=5; (i < 10) && (j > 0) && (k > 5); i++, j--, k -= 5) printf("i = %d j = %d k=%d\n", i, j, k); printf(" \n"); printf(" ASCII TABLE \n"); printf(" \n"); printf(" dec hex chr dec hex chr \n"); printf(" \n"); for(int i=3; i < 16; i += ) printf(" %3d %3X %c ", i, i, i); printf(" %3d %3X %c \n", i+1, i+1, i+1); printf(" \n"); for( x =.4, y = 9.3, z = 5.; x <= 5.7 y > 6.9 z >= 3.; ++x, y -= 0.5, --z) printf("x = %4.1lf y = %4.1lf z = %4.1lf\n", x, y, z); printf("\n"); for( x =.4, y = 9.3, z = 5.; x <= 5.7 && y > 6.9 && z >= 3.; ++x, y -= 0.5, --z) printf("x = %4.1lf y = %4.1lf z = %4.1lf\n", x, y, z); printf("\n"); for (a=1, b=6; a < b; a++, printf("%d\n",a)); Φωλιασµένα (ένθετα) for loops Σε πολλές περιπτώσεις αναγκαζόµαστε λόγω της µορφής του αλγορίθµου που κωδικοποιούµε σε C (για παράδειγµα πράξεις µε πίνακες) να χρησιµοποιήσουµε ένθετα for (δηλαδή for το ένα µέσα στο άλλο). Στην γενική περίπτωση θα έχουµε 6

63 for( I 1 = 1; I 1 < N1 ; I 1 ++) for( I = 1; I < N ; I ++) O O for( I m = 1; I m < Nm ; Group εντολών I m ++) Τότε το group εντολών θα επαναληφθεί NN LN 1 m φορές. Παράδειγµα m n Να γραφτεί πρόγραµµα που να πολλαπλασιάζει τους πίνακες A r s B (όταν φυσικά ο πολλαπλασιασµός ορίζεται). Σαν αριθµητικό παράδειγµα θεωρείστε και A= 4 5 6, B= Οι πίνακες να αρχικοποιηθούν µέσα στην main( ). #include <stdio.h> #define AROWS 3 #define ACOLS 3 #define BROWS 3 #define BCOLS 3 int main() double A[AROWS][ACOLS]=1.0,.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 ; double B[BROWS][BCOLS]=10.0, 0.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0 ; double C[AROWS][BCOLS]; int i, j, k; //Εκτύπωσε τον πίνακα A[][] γραµµή προς γραµµή : printf("a[][]=\n"); for(i = 0; i < AROWS; i++). 63

64 for(j = 0; j < ACOLS; j++) printf("%lf ", A[i][j]); printf("\n"); printf("\n"); printf("b[][]=\n"); //Εκτύπωσε τον πίνακα Β[][] γραµµή προς γραµµή : for(i = 0; i < BROWS; i++) for(j = 0; j < BCOLS; j++) printf("%lf ", B[i][j]); printf("\n"); printf("\n"); if(acols == BROWS) //Εάν το C = ΑΒ ορίζεται τότε: for(i = 0; i < AROWS; i++) for(j = 0; j < BCOLS; j++) for(c[i][j]=0.0, k = 0; k < ACOLS; k++) C[i][j] += A[i][k]*B[k][j]; else printf("tο C = ΑΒ δεν ορίζεται\n"); //Εκτύπωσε τον πίνακα C[][] γραµµή προς γραµµή : printf("c[][]=\n"); for(i = 0; i < AROWS; i++) for(j = 0; j < BCOLS; j++) printf("%7.lf ", C[i][j]); printf("\n"); printf("\n"); return 0; Τα αποτελέσµατα θα είναι: 64

65 Οι βρόχοι while και do while Είδαµε ότι στην τυπική µορφή του ο βρόχος for επαναλαµβάνει το εσωτερικό group εντολών ένα προκαθορισµένο αριθµό φορών. Με τους βρόχους while και do while ο αριθµός των επαναλήψεων του εσωτερικού group εντολών δεν είναι προκαθορισµένος. Η σύνταξη των τελευταίων δύο βρόχων επανάληψης στην τυπική τους µορφή είναι: for ( Π ; Π ; Π ) group 1 3 Π 1 ; while( Π ) group Π ; 3 Π do 1 ; while group Π3 ; ( Π ) ; Παρατηρούµε ότι: Στους βρόχους while και do while η αρχικοποίηση των µεταβλητών ελέγχου γίνεται έξω από τον βρόχο. Η συνθήκη στο βρόχο while ελέγχεται στην αρχή και έτσι αν από την αρχή Π = false ο βρόχος δεν θα δώσει καµία επανάληψη (το ίδιο θα συνέβαινε και µε την for). Στο do while ο έλεγχος γίνεται στο τέλος µε αποτέλεσµα τουλάχιστον µια επανάληψη. Παράδειγµα Να υπολογιστεί το ακέραιο άθροισµα: 100 sum = k, k= 1 65

66 µε τέσσερις διαφορετικούς τρόπους: goto, for, while, do - while #include <stdio.h> int main() int counter, sum; counter = 1; sum = 0; tag: if(counter <= 100) sum += counter*counter; counter++; goto tag; printf("goto : sum = %d\n", sum); for(counter = 1, sum = 0; counter <= 100; counter++) sum += counter*counter; printf("for : sum = %d\n", sum); counter = 1; sum = 0; while(counter <= 100) sum += counter*counter; counter++; printf("while : sum = %d\n", sum); counter = 1; sum = 0; do sum += counter*counter; counter++; while(counter <= 100); printf("do : sum = %d\n", sum); return 0; ΕΠΕΞΕΡΓΑΣΙΑ ΥΠΟ ΣΥΝΘΗΚΗ IIΙ Η δοµή switch Η switch µπορεί να παροµοιαστεί µε µια multiple choice εντολή. Η σύνταξη της είναι: 66

67 switch( X ) case C1 : group1 ; brake; case : group ; brake; M C case C K : group K ; brake; default : group K + 1 ; brake; Όπου X είναι η µεταβλητή ελέγχου κατάλληλα ορισµένη (char, double, int, κ.λ.π. και θα µπορούσε να έχει οποιαδήποτε όνοµα C µεταβλητής). Στον κώδικα µας υποτίθεται ότι παίρνει τιµές σε κάποιο διακριτό σύνολο C C K C. Εάν,,, K 1 X = CJ, για κάποιο 1 J K, τότε εκτελείται η J οµάδα εντολών X C, C, K, CK εκτελείται η εξορισµού (default) group J. Εάν όµως 1 οµάδα. group K + 1 Παράδειγµα Να γραφτεί πρόγραµµα σε C που να µετατρέπει τον υπολογιστή σε calculator. Να µπορούν να εκτελούνται οι εξής πράξεις Πράξη x + y x - y x * y x / y x ^ y x % y y Αποτέλεσµα Άθροισµα των x και y ιαφορά των x και y Πολλαπλασιασµός των x και y ιαίρεση των x και y Η δύναµη του x στην y Το υπόλοιπο της διαίρεσης του x µε y Το µήκος της πλευράς τριγώνου µε κάθετες πλευρές x και y 67

68 #include <stdio.h> #include <math.h> int main() double x, y, result; int flag, loop; char praxi; start_again: flag=1; scanf("%lf %c %lf", &x, &praxi, &y); switch(praxi) case '+' : result = x + y ; break ; case '-' : result = x - y ; break ; case '*' : result = x * y ; break ; case '/' : result = x / y ; break ; case '^' : result = pow(x, y); break ; case '%' : result = (int) x % (int) y; break ; case : result = sqrt(x*x+y*y); break ; default : flag = 0; break ; (flag)? printf(" = %lf\n", result) : printf("wrong entry\n"); printf("to continue 1 to exit 0:"); scanf("%d", &loop); if (loop) goto start_again; printf("user chooses to exit!\n") ; return 0; Παρατηρήσεις Η µεταβλητή χαρακτήρα praxi πρέπει να ανήκει στο σύνολο ' + ', ' ', ' * ', ' / ', ' ^ ', ' % ', '. Για παράδειγµα εάν µε την scanf("%lf %c %lf", &x, &praxi, &y); Εισάγουµε x + y τότε praxi = ' +' και η case(praxi) θα εκτελούσε την 1 η περίπτωση µε αποτέλεσµα result= x + y Εάν praxi ' + ', ' ', ' * ', ' / ', ' ^ ', ' % ', ' τότε εκτελείται η default που κάνει την µεταβλητή flag ίση µε 0. Τότε αντί του αποτελέσµατος εκτυπώνεται «λάθος εισαγωγή» (wrong entry). Το πρόγραµµα σταµατάει την εκτέλεση του µόνο όταν το θέλει ο χρήστης. ηλαδή εάν µετά τις εντολές printf("to continue 1 to exit 0:"); scanf("%d", &loop); 68

69 εισάγουµε το 1, τότε loop=1 και µέσω της if (loop) goto start_again; η εκτέλεση του προγράµµατος διακλαδώνεται στο label start_again. Εάν όµως εισάγουµε 0, τότε loop=0, η εντολή if (loop) goto start_again; δεν εκτελείται. Η εκτέλεση τότε συνεχίζεται µε τις printf("user chooses to exit!\n") ; και return 0; και σταµατάει η εκτέλεση του προγράµµατος. Παράδειγµα (case και while) Στο βιβλίο παρ. 6.3 σελ. 91 Κάνοντας read και write από τον σκληρό δίσκο Όταν αναπτύσσουµε εφαρµογή που απαιτεί την είσοδο µεγάλου αριθµού δεδοµένων ή τα αποτελέσµατα της εφαρµογής είναι πολλά, θα πρέπει η εισαγωγή και η έξοδος να γίνεται στον σκληρό δίσκο. Για να γράψουµε ή να διαβάσουµε δεδοµένα σε ένα file (λογικά οργανωµένη συλλογή πληροφοριών) Ορίζουµε ένα δείκτη (µια µεταβλητή που δείχνει προς µια συγκεκριµένη θέση µνήµης) τύπου FILE. Για παράδειγµα η µεταβλητή fptr θα είναι δείκτης τύπου FILE εάν µέσα στον κώδικα µας υπάρχει η δήλωση FILE * fptr; Εφόσον δηλώσουµε την µεταβλητή fptr στην συνέχεια θα πρέπει µέσα στο πρόγραµµα να «ανοίξουµε» το file (να το κάνουµε fopen( )). Έτσι η C θα αποκτήσει πρόσβαση στα καταχωρηµένα δεδοµένα είτε θα είναι έτοιµη να γράψει δεδοµένα στον σκληρό δίσκο. Όταν τελειώσουµε την διαδικασία ανάγνωσης είτε εγγραφής θα πρέπει να «κλείσουµε» το file που πριν από λίγο «ανοίξαµε» (να το κάνουµε fopen( )). Οι βασικές λειτουργίες που υποστηρίζονται είναι οι: Καταχώρηση εγγραφή w (write). Ανάγνωση r (read). Προσθήκη νέας εγγραφής στο τέλος του ήδη υπάρχοντος file a (append). Παράδειγµα Έστω ότι το file data.txt", περιέχει πραγµατικούς αριθµούς το πλήθος των οποίων δεν είναι γνωστό. Να γραφτεί πρόγραµµα που να διαβάζει τους 69

70 αριθµούς και να τους εκτυπώνει µαζί µε τον µέσο όρο τους στο file dataout.txt #include <stdio.h> int main() FILE *fprin, *fprout; int i; double x, sum, average; //fprin θα δείχνει το αρχείο data.txt fprin=fopen("data.txt", "r"); // fprout θα δείχνει το αρχείο dataout.txt fprout=fopen("dataout.txt", "w"); for(sum=0.0, i=1; i<=0; i++) // ιάβασµα της µεταβλητής x από το data.txt fscanf(fprin, "%lf", &x); //Εγγραφή του i και x στο dataout.txt fprintf(fprout, "x[%d] = %10.5lf\n", i, x); sum = sum + x; average = sum / (i-1); //Εγγραφή της i average στο dataout.txt fprintf(fprout, "average = %lf \n", average); //Κλείσιµο των αρχείων fclose(fprin); fclose(fprout); return 0; Τα αρχεία data.txt και dataout.txt θα έχουν την µορφή: 70

71 71

Πανεπιστήµιο Αιγαίου url: http://www.aegean.gr. Εισαγωγή στις γλώσσες προγραµµατισµού µε τη γλώσσα C

Πανεπιστήµιο Αιγαίου url: http://www.aegean.gr. Εισαγωγή στις γλώσσες προγραµµατισµού µε τη γλώσσα C Πανεπιστήµιο Αιγαίου url: http://www.aegean.gr Εισαγωγή στις Γλώσσες Προγραµµατισµού Βασικά στοιχεία της Γλώσσας C Εισαγωγή στις γλώσσες προγραµµατισµού µε τη γλώσσα C Εντολές Ελέγχου Ροής Προγράµµατος

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

ΧΑΡΙΔΗΜΟΣ Θ. ΒΕΡΓΟΣ ΕΠΙΚΟΥΡΟΣ ΚΑΘΗΓΗΤΗΣ. Πανεπιστημιακές Παραδόσεις στην ΕΙΣΑΓΩΓΗ ΣΤΑ ΣΥΣΤΗΜΑΤΑ ΥΠΟΛΟΓΙΣΤΩΝ

ΧΑΡΙΔΗΜΟΣ Θ. ΒΕΡΓΟΣ ΕΠΙΚΟΥΡΟΣ ΚΑΘΗΓΗΤΗΣ. Πανεπιστημιακές Παραδόσεις στην ΕΙΣΑΓΩΓΗ ΣΤΑ ΣΥΣΤΗΜΑΤΑ ΥΠΟΛΟΓΙΣΤΩΝ ΧΑΡΙΔΗΜΟΣ Θ. ΒΕΡΓΟΣ ΕΠΙΚΟΥΡΟΣ ΚΑΘΗΓΗΤΗΣ Πανεπιστημιακές Παραδόσεις στην ΕΙΣΑΓΩΓΗ ΣΤΑ ΣΥΣΤΗΜΑΤΑ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ & ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΡΓΑΣΤΗΡΙΟ ΤΕΧΝΟΛΟΓΙΑΣ & ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ

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

ΕΙΣΑΓΩΓΗ ΣΤΗ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ JAVA

ΕΙΣΑΓΩΓΗ ΣΤΗ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ JAVA ΕΘΝΙΚΟ ΜΕΤΣΟΒΕΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ ΤΟΜΕΑΣ Επικοινωνιών, Ηλεκτρονικής και Συστημάτων Πληροφορικής ΕΙΣΑΓΩΓΗ ΣΤΗ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ JAVA ΕΡΓΑΣΤΗΡΙΟ ΠΟΛΥΜΕΣΩΝ ΠΕΡΙΕΧΟΜΕΝΑ

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

Τ.Ε.Ι. ΛΑΜΙΑΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΗΛΕΚΤΡΟΝΙΚΗΣ

Τ.Ε.Ι. ΛΑΜΙΑΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΗΛΕΚΤΡΟΝΙΚΗΣ Τ.Ε.Ι. ΛΑΜΙΑΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΗΛΕΚΤΡΟΝΙΚΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Visual Basic Net 2005 ΣΗΜΕΙΩΣΕΙΣ ΘΕΩΡΙΑΣ - ΕΡΓΑΣΤΗΡΙΟΥ Γρηγόρης Τζιάλλας ΛΑΜΙΑ 2007 ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ 1 ΕΙΣΑΓΩΓΗ ΣΤΗΝ VISUAL

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

Εισαγωγή στη C# και το.net 4.0

Εισαγωγή στη C# και το.net 4.0 Εισαγωγή στη C# και το.net 4.0 Σημειώσεις Σεμιναρίου Επιμέλεια: Βασίλης Κόλιας Ενότητα 1 Θεωρητικό Υπόβαθρο Το.NET Framework και η C# To Visual Studio 1.0.0 Πίνακας Περιεχομένων Πίνακας Περιεχομένων...

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

Σηµειώσεις στους πραγµατικούς και µιγαδικούς αριθµούς

Σηµειώσεις στους πραγµατικούς και µιγαδικούς αριθµούς Σηµειώσεις στους πραγµατικούς και µιγαδικούς αριθµούς Τα βασικά αριθµητικά σύνολα Οι πρώτοι αριθµοί που διδάσκεται ο µαθητής στο δηµοτικό σχολείο είναι οι φυσικοί αριθµοί Αυτοί είναι οι 0,,,, 4, κτλ Το

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

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

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

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

ÅÉÓÁÃÙÃÇ ÓÔÇÍ ÁÑÉÈÌÇÔÉÊÇ ÁÍÁËÕÓÇ

ÅÉÓÁÃÙÃÇ ÓÔÇÍ ÁÑÉÈÌÇÔÉÊÇ ÁÍÁËÕÓÇ ÐÁÍÅÐÉÓÔÇÌÉÏ ÉÙÁÍÍÉÍÙÍ ÓïöïêëÞò Ä. ÃáëÜíçò ÁíáðëçñùôÞò ÊáèçãçôÞò ÅÉÓÁÃÙÃÇ ÓÔÇÍ ÁÑÉÈÌÇÔÉÊÇ ÁÍÁËÕÓÇ É Ù Á Í Í É Í Á 0 0 ΠΕΡΙΕΧΟΜΕΝΑ ΠΡΟΛΟΓΟΣ. ΕΙΣΑΓΩΓΙΚΕΣ ΕΝΝΟΙΕΣ. Γενικά. Αλγόριθμος του Συμπληρώματος 6.3

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

Πρόλογος. Η νέα έκδοση των παρόντων σημειώσεων θα ολοκληρωθεί κατά το εαρινό εξάμηνο του ακαδημαϊκού έτους 2008-2009. Αύγουστος 2008.

Πρόλογος. Η νέα έκδοση των παρόντων σημειώσεων θα ολοκληρωθεί κατά το εαρινό εξάμηνο του ακαδημαϊκού έτους 2008-2009. Αύγουστος 2008. Πρόλογος Οι παρούσες σημειώσεις αποτελούν το μεγαλύτερο μέρος του υλικού που διδάχτηκε στις παραδόσεις του προπτυχιακού μαθήματος της Αριθμητικής Ανάλυσης, το εαρινό εξάμηνο 7-8, στο Μαθηματικό τμήμα του

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

Εργασία στα Λειτουργικά Συστήματα Θέμα:

Εργασία στα Λειτουργικά Συστήματα Θέμα: 1 Εργασία στα Λειτουργικά Συστήματα 2007 Εργασία στα Λειτουργικά Συστήματα Θέμα: Επιλέξτε ένα οποιοδήποτε RTOS μπορείτε να βρείτε (και να προσομειώσετε ή να εκτελέσετε) και να εκτελέσετε σε αυτό μια εργασία

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

Βάσεις, Αποθήκες και Εξόρυξη Δεδομένων με τον SQL Server

Βάσεις, Αποθήκες και Εξόρυξη Δεδομένων με τον SQL Server ΠΑΝΑΓΙΩΤΗΣ ΣΥΜΕΩΝΙΔΗΣ Διδάκτωρ Τμήματος Πληροφορικής Αριστοτέλειο Πανεπιστήμιο Θεσσαλονίκης Βάσεις, Αποθήκες και Εξόρυξη Δεδομένων με τον SQL Server Εργαστηριακός Οδηγός ΕΛΛΗΝΙΚΑ ΑΚΑΔΗΜΑΪΚΑ ΗΛΕΚΤΡΟΝΙΚΑ

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

ΗΛΕΚΤΡΟΝΙΚΟ ΕΓΧΕΙΡΙΔΙΟ ΤΗΣ JAVA

ΗΛΕΚΤΡΟΝΙΚΟ ΕΓΧΕΙΡΙΔΙΟ ΤΗΣ JAVA ΗΛΕΚΤΡΟΝΙΚΟ ΕΓΧΕΙΡΙΔΙΟ ΤΗΣ JAVA ΠΑΠΑΔΟΠΟΥΛΟΥ ΜΑΡΙΑ Τ-1854 Τ Μ Η Μ Α Τ Ε Χ Ν Ο Λ Ο Γ Ι Α Σ Π Λ Η Ρ Ο Φ Ο Ρ Ι Κ Η Σ & Τ Η Λ Ε Π Ι Κ Ο Ι Ν Ω Ν Ι Ω Ν Λ Α Ρ Ι Σ Α 2 0 1 2 ebooks4greeks.gr ΑΝΩΤΑΤΟ ΤΕΧΝΟΛΟΓΙΚΟ

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

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

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

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

ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ Α] ΑΠΟ ΤΟ ΒΙΒΛΙΟ: ΟΙ ΙΣΤΟΡΙΚΕΣ ΡΙΖΕΣ ΤΩΝ ΣΤΟΙΧΕΙΩΔΩΝ ΜΑΘΗΜΑΤΙΚΩΝ

ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ Α] ΑΠΟ ΤΟ ΒΙΒΛΙΟ: ΟΙ ΙΣΤΟΡΙΚΕΣ ΡΙΖΕΣ ΤΩΝ ΣΤΟΙΧΕΙΩΔΩΝ ΜΑΘΗΜΑΤΙΚΩΝ ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ Α] ΑΠΟ ΤΟ ΒΙΒΛΙΟ: ΟΙ ΙΣΤΟΡΙΚΕΣ ΡΙΖΕΣ ΤΩΝ ΣΤΟΙΧΕΙΩΔΩΝ ΜΑΘΗΜΑΤΙΚΩΝ Β] ΑΠΟ ΤΟ ΒΙΒΛΙΟ: Mathematics The Man Made Universe, SHERMAN K. STEIN, 1963 Α] ΒΑΒΥΛΩΝΙΑΚΑ ΜΑΘΗΜΑΤΙΚΑ 2-1 ΚΑΠΟΙΑ ΙΣΤΟΡΙΚΑ

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

ΕΝΟΤΗΤΑ 1. Βασικές έννοιες. Βασικές έννοιες Α Λυκείου. Συγγραφική ομάδα: Νίκος Μωυσέως Μιχάλης ιονυσίου

ΕΝΟΤΗΤΑ 1. Βασικές έννοιες. Βασικές έννοιες Α Λυκείου. Συγγραφική ομάδα: Νίκος Μωυσέως Μιχάλης ιονυσίου ΕΝΟΤΗΤΑ 1 Βασικές έννοιες Υπουργείο Παιδείας και Πολιτισμού 2006-2007 Βασικές έννοιες Α Λυκείου Συγγραφική ομάδα: Νίκος Μωυσέως Μιχάλης ιονυσίου Εποπτεία: Μάριος Μιλτιάδου ΕΜΕ Πληροφορικής Μιχάλης Τορτούρης

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

Εφαρµογές Πληροφορικής Υπολογιστών. Πέρδος Αθανάσιος Καθηγητής Πληροφορικής

Εφαρµογές Πληροφορικής Υπολογιστών. Πέρδος Αθανάσιος Καθηγητής Πληροφορικής Εφαρµογές Πληροφορικής Υπολογιστών Πέρδος Αθανάσιος Καθηγητής Πληροφορικής Περιεχόµενα Εφαρµογές Πληροφορικής Υπολογιστών...1 Κεφάλαιο 1 ο...3 Γενική Επισκόπηση Των Εφαρµογών Πληροφορικής...3 Εφαρµογές

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

Προτάσεις, Σύνολα, Απεικονίσεις

Προτάσεις, Σύνολα, Απεικονίσεις Κεϕάλαιο 1 Προτάσεις, Σύνολα, Απεικονίσεις Το κεϕάλαιο αυτό είναι εισαγωγικό και έχει σκοπό να υπενθυµίσει και να γενικεύσει κάποιες εν µέρει γνωστές έννοιες καθώς και τη σχετική ορολογία και το συµβολισµό.

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

ιανυσµατική ανάλυση Κεφάλαιο 1 1.1 ιανυσµατική άλγεβρα 1.1.1 Πράξεις µε διανύσµατα

ιανυσµατική ανάλυση Κεφάλαιο 1 1.1 ιανυσµατική άλγεβρα 1.1.1 Πράξεις µε διανύσµατα Κεφάλαιο 1 ιανυσµατική ανάλυση 1.1 ιανυσµατική άλγεβρα 1.1.1 Πράξεις µε διανύσµατα Αν περπατήσετε 4 µίλια προς τον βορρά και µετά 3 µίλια προς την ανατολή (Σχ. 1.1), θα έχετε διανύσει συνολικά 7 µίλια,

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

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

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ ΕΡΩΤΗΣΕΙΣ ΘΕΩΡΙΑΣ ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ ΕΡΩΤΗΣΕΙΣ ΘΕΩΡΙΑΣ Η τεχνική του τµη- µατικού προγραµµατισµού αποτελεί κύριο Είναι η τεχνική σχεδίασης σύµφωνα µε την οποία η ανάπτυξη ε- νός προγράµµατος επιτυγχάνεται αναπτύσσοντας απλούστερα

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

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ ΕΠΙΔΕΙΞΗΣ ΔΙΚΤΥΩΝ TCP/IP ME ΧΡΗΣΗ ΤΟΥ WIRESHARK

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ ΕΠΙΔΕΙΞΗΣ ΔΙΚΤΥΩΝ TCP/IP ME ΧΡΗΣΗ ΤΟΥ WIRESHARK ΤΕΙ ΚΡΗΤΗΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΙΑΣ Πτυχιακή εργασία ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ ΕΠΙΔΕΙΞΗΣ ΔΙΚΤΥΩΝ TCP/IP ME ΧΡΗΣΗ ΤΟΥ WIRESHARK ΕΛΕΥΘΕΡΙΟΣ ΜΑΣΧΑΛΙΔΗΣ ΑΜ 2769 Επιβλέπων Καθηγητής Κώστας

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

ΕΦΑΡΜΟΓΕΣ ΤΗΣ ΓΡΑΜΜΙΚΗΣ ΑΛΓΕΒΡΑΣ. Νώντας Κεχαγιάς Τµήµα Μαθηµατικών, Πανεπιστηµίου Ιωαννίνων

ΕΦΑΡΜΟΓΕΣ ΤΗΣ ΓΡΑΜΜΙΚΗΣ ΑΛΓΕΒΡΑΣ. Νώντας Κεχαγιάς Τµήµα Μαθηµατικών, Πανεπιστηµίου Ιωαννίνων ΕΦΑΡΜΟΓΕΣ ΤΗΣ ΓΡΑΜΜΙΚΗΣ ΑΛΓΕΒΡΑΣ Νώντας Κεχαγιάς Τµήµα Μαθηµατικών, Πανεπιστηµίου Ιωαννίνων Ιωάννινα, 2008 ii Περιεχόµενα 1 ΕΙΣΑΓΩΓΗ...................... vii 1.1 ΠΡΟΛΟΓΟΣ ΕΥΤΕΡΗΣ ΕΚ ΟΣΗΣ......... vii

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 6 ο

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 6 ο Με τι ασχολείται ο προγραμματισμός; Ο προγραμματισμός ασχολείται με την διατύπωση του αλγορίθμου σε κατανοητή μορφή από τον Η/Υ, δηλ. τη δημιουργία του προγράμματος, του συνόλου των εντολών που πρέπει

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

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

ΠΟΛΥΤΕΧΝΕΙΟ ΚΡΗΤΗΣ ΓΕΝΙΚΟ ΤΜΗΜΑ ΠΟΛΥΤΕΧΝΕΙΟ ΚΡΗΤΗΣ ΓΕΝΙΚΟ ΤΜΗΜΑ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ ΕΦΑΡΜΟΣΜΕΝΕΣ ΕΠΙΣΤΗΜΕΣ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑ ΔΙΠΛΩΜΑΤΙΚΗ ΔΙΑΤΡΙΒΗ ΜΕΤΑΠΤΥΧΙΑΚΟΥ ΔΙΠΛΩΜΑΤΟΣ ΕΙΔΙΚΕΥΣΗΣ ΚΑΤΕΥΘΥΝΣΗ : «ΕΦΑΡΜΟΣΜΕΝΑ ΚΑΙ ΥΠΟΛΟΓΙΣΤΙΚΑ

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

2_ Επισκόπηση και δημιουργία προγράμματος σε Visual Basic

2_ Επισκόπηση και δημιουργία προγράμματος σε Visual Basic 2_ Επισκόπηση και δημιουργία προγράμματος σε Visual Basic Σκοπός Κεφαλαίου προσδοκωμενα αποτελεσματα διδακτικοι στοχοι Σκοπός του κεφαλαίου είναι να σας εισάγει σε έννοιες του προγραμματισμού και του περιβάλλοντος

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

ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ. του ΠΕΤΡΟΥ Ι. ΒΕΝΕΤΗ. Καθηγητής Ε..Μ.Π. ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ

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

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

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός Παναγιώτης Σφέτσος sfetsos@it.teithe.gr ΠΡΟΣΑΝΑΤΟΛΙΣΜΟΣ ΣΕ ΑΝΤΙΚΕΙΜΕΝΑ Προσανατολισμός σε αντικείμενα είναι η προσέγγιση που

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

Μηχανικά και Κλασσικά Ανάλογα της Σύγχρονης Φυσικής

Μηχανικά και Κλασσικά Ανάλογα της Σύγχρονης Φυσικής ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ Μεταπτυχιακή Ειδίκευση Καθηγητών Φυσικών Επιστηµών ιπλωµατική Εργασία της Ευθυµίας- Βικτωρίας Σιούτα Σύµβουλος Καθηγητής: ΣΠΥΡΟΣ ΕΥΣΤ. ΤΖΑΜΑΡΙΑΣ Μηχανικά και Κλασσικά Ανάλογα

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

ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ H έννοια της συνάρτησης κατά την πλοήγηση στο χώρο µε τρισδιάστατα ψηφιακά εργαλεία διαχείρισης γεωγραφικής πληροφορίας

ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ H έννοια της συνάρτησης κατά την πλοήγηση στο χώρο µε τρισδιάστατα ψηφιακά εργαλεία διαχείρισης γεωγραφικής πληροφορίας ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ MΑΘΗΜΑΤΙΚΩΝ ΤΜΗΜΑ ΜΕΘΟ ΟΛΟΓΙΑΣ, ΙΣΤΟΡΙΑΣ ΚΑΙ ΘΕΩΡΙΑΣ ΤΗΣ ΕΠΙΣΤΗΜΗΣ ΤΜΗΜΑ ΦΙΛΟΣΟΦΙΑΣ ΠΑΙ ΑΓΩΓΙΚΗΣ & ΨΥΧΟΛΟΓΙΑΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ & ΣΤΑΤΙΣΤΙΚΗΣ ΤΜΗΜΑ ΕΠΙΣΤΗΜΩΝ

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

Εισαγωγή στο PowerPoint

Εισαγωγή στο PowerPoint Εισαγωγή Το PowerPoint είναι ένα πολύ ισχυρό πρόγραµµα παρουσίασης. το οποίο αποτελεί τµήµα του πακέτου Microsoft Office. Σκοπός του είναι να βοηθάει τους χρήστες να δηµιουργούν εύκολα εντυπωσιακές παρουσιάσεις

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

2 Φωτογραφία εξωφύλλου: Κυµατοσυνάρτηση για ένα ηλεκτρόνιο στο άτοµο του Η.

2 Φωτογραφία εξωφύλλου: Κυµατοσυνάρτηση για ένα ηλεκτρόνιο στο άτοµο του Η. ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ ΜΕΤΑΠΤΥΧΙΑΚΗ ΕΞΕΙ ΙΚΕΥΣΗ ΚΑΘΗΓΗΤΩΝ ΦΥΣΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ «ΤΑΛΑΝΤΩΣΕΙΣ ΣΤΟ ΜΙΚΡΟΚΟΣΜΟ» ΜΠΑΚΑΤΣΕΛΟΥ ΑΙΚΑΤΕΡΙΝΗ ΕΠΙΒΛΕΠΩΝ

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