ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΑΛΓΟΡΙΘΜΟΥΣ ΚΑΙ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΤΜΗΜΑ ΠΟΛΙΤΙΣΜΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑΣ Διδάσκουσα Δρ Β. Καβακλή Χειμερινό Εξάμηνο 2001 1
Παράδειγμα Υπολογισμός Μισθού ΑΡΧΗ ΩΡΙΑΙΑ ΑΠΟΖΗΜΙΩΣΗ! 10000 ΠΟΣΟΣΤΟ ΚΡ ΑΣΦΑΛΙΣΗΣ! 10/100 ΠΟΣΟΣΤΟ ΚΡ ΦΟΡΟΥ! 7/100 ΔΙΑΒΑΣΕ ΩΡΕΣ ΕΡΓΑΣΙΑΣ ΜΙΣΘΟΣ! ΩΡΕΣ ΕΡΓΑΣΙΑΣ * ΩΡΙΑΙΑ ΑΠΟΖΗΜΙΩΣΗ ΑΣΦΑΛΙΣΗ! ΜΙΣΘΟΣ * ΠΟΣΟΣΤΟ ΚΡ ΑΣΦΑΛΙΣΗΣ ΚΑΘΑΡΕΣ ΑΠΟΔΟΧΕΣ! ΜΙΣΘΟΣ - ΑΣΦΑΛΙΣΗ ΦΟΡΟΣ! ΚΑΘΑΡΕΣ ΑΠΟΔΟΧΕΣ * ΠΟΣΟΣΤΟ ΚΡ ΦΟΡΟΥ ΠΛΗΡΩΤΕΟ ΠΟΣΟ! ΚΑΘΑΡΕΣ ΑΠΟΔΟΧΕΣ - ΦΟΡΟΣ ΕΜΦΑΝΙΣΕ ΠΛΗΡΩΤΕΟ ΠΟΣΟ ΤΕΛΟΣ 2
Σε Pascal program wromisthios (input, ouput); {υπολογισμός αποδοχών ωρομίσθιου υπαλλήλου} const wriaia_apozhmiwsh = 10000; pososto_kr_asfalishs = 10/100; pososto_kr_foroy = 7/100; var wres_ergasias, asfalish, kathares_apodoxes, misthos, foros, plhrwteo_poso : integer; begin write(output, Poses wres ergasthkate? ); readln(input, wres_ergasias); misthos := wres_ergasias * wriaia_apozhmiwsh; asfalish := misthos * pososto_kr_foroy; kathares_apodoxes := misthos - asfalish; foros := kathares_apodoxes * pososto_kr_foroy; plhrwteo_poso := kathares_apodoxes foros; writeln(output, To plhrvteo poso einai:, plhrwteo _poso); end {vromisthios}. Παρατήρηση: Οι εντολές του προγράμματος εκτελούνται διαδοχικά, η μια μετά την άλλη. Αυτό δεν είναι πάντοτε επιθυμητό. Η σειρά εκτέλεσης των εντολών μπορεί να αλλάξει με τη χρήση εντολών ελέγχου και επιλογής. 3
Υπολογισμός Μισθού 2 ΑΡΧΗ ΩΡΙΑΙΑ ΑΠΟΖΗΜΙΩΣΗ! 10000 ΠΟΣΟΣΤΟ ΚΡ ΑΣΦΑΛΙΣΗΣ! 10/100 ΠΟΣΟΣΤΟ ΚΡ ΦΟΡΟΥ! 7/100 ΕΛΑΧΙΣΤΟ ΟΡΙΟ! 100000 ΔΙΑΒΑΣΕ ΩΡΕΣ ΕΡΓΑΣΙΑΣ ΜΙΣΘΟΣ! ΩΡΕΣ ΕΡΓΑΣΙΑΣ * ΩΡΙΑΙΑ ΑΠΟΖΗΜΙΩΣΗ ΑΣΦΑΛΙΣΗ! ΜΙΣΘΟΣ * ΠΟΣΟΣΤΟ ΚΡ ΑΣΦΑΛΙΣΗΣ ΚΑΘΑΡΕΣ ΑΠΟΔΟΧΕΣ! ΜΙΣΘΟΣ - ΑΣΦΑΛΙΣΗ ΦΟΡΟΣ! 0 ΚΑΘΑΡΕΣ ΑΠΟΔΟΧΕΣ > ΕΛΑΧΙΣΤΟ ΟΡΙΟ; ΦΟΡΟΣ! ΚΑΘΑΡΕΣ ΑΠΟΔΟΧΕΣ * ΠΟΣΟΣΤΟ ΚΡ ΦΟΡΟΥ ΠΛΗΡΩΤΕΟ ΠΟΣΟ! ΚΑΘΑΡΕΣ ΑΠΟΔΟΧΕΣ - ΦΟΡΟΣ ΕΜΦΑΝΙΣΕ ΠΛΗΡΩΤΕΟ ΠΟΣΟ ΤΕΛΟΣ 4
Επιλογή Οι εντολές if Συχνά στον προγραμματισμό θέλουμε να εκτελέσουμε μια από δύο ή περισσότερες ακολουθίες εντολών, αγνοώντας την άλλη Η απόφαση ποιες εντολές θα εκτελεσθούν εξαρτάται συνήθως από κάποια λογική συνθήκη πχ θέλουμε να εκτελεσθεί η εντολή Χ:= Χ / Ν μόνο στην περίπτωση που η τιμή της μεταβλητής n είναι διάφορη από το 0 Αν Ν 0 τότε Χ:= Χ / Ν ή πιο γενικά Αν Π τότε Ε το Π αντιπροσωπεύει κάποια λογική παράσταση που μπορεί να πάρει την λογική τιμή «αληθής» ή «ψευδής» και το Ε οποιαδήποτε εντολή Στη γλώσσα Pascal το παραπάνω σχήμά παίρνει τη μορφή: if <λογική παράσταση> then <εντολή> δηλ. if N <> 0 then X:=X / N 5
Τελεστές Σύγκρισης Ο πιο συνηθισμένος τρόπος υπολογισμού μιας τιμής τύπου boolean είναι μέσω μιας σύγκρισης Οι τιμές που μπορούν να συγκριθούν πρέπει να είναι του ίδιου τύπου Οι συγκρίσεις γράφονται όπως και στα μαθηματικά με τη χρήση των τελεστών σύγκρισης: Μαθηματικά = < > ίσον διάφορο μικρότερο μεγαλύτερο μεγαλύτερο ή ίσο Pascal = <> < > >= μικρότερο ή ίσο <= Παράδειγμα (Κ = 7 και L = 14) Λογική παράσταση 2 * Κ + 5 < 20 3 * K 7 <= L 2 * K <> L K + 7 = L (L-3) >= 12 Τιμή παράστασης True True False True False 6
Παράδειγμα program megalyteros1 (input, output); var x, y, meg: integer; begin writeln(output, dwse 2 arithmoys ); readln(input, x, y); writeln(output, 1os arithmos=, x, 2os arithmos =, y); meg:=y; if x > y then meg:=x; writeln(output, megalyteros einai o arithmos:, meg); end. program megalyteros2 (input, output); var x, y, meg: integer; begin writeln(output, dwse 2 arithmoys ); readln(input, x, y); writeln(output, 1os arithmos=, x, 2os arithmos =, y); if x<= y then meg:=y; if x > y then meg:=x; writeln(output, megalyteros einai o arithmos:, meg); end. 7
Παράδειγμα (συνέχεια ) program megalyteros3 (input, output); var x, y, meg: integer; begin writeln(output, dwse 2 arithmoys ); readln(input, x, y); writeln(output, 1os arithmos=, x, 2os arithmos =, y); if x > y then meg:=x else meg:=y; writeln(output, megalyteros einai o arithmos:, meg); end. Παρατήρηση: Αυτός ο τρόπος είναι ο πιο «φυσιολογικός» τρόπος για τη διατύπωση του αλγόριθμου. Επίσης είναι ο πιο οικονομικός! Το πρόγραμμα megalyteros1 εκτελεί 1 σύγκριση και 1,5 εκχώρηση κατά μέσο όρο Το πρόγραμμα megalyteros2 εκτελεί 2 συγκρίσεις και 1 εκχώρηση Το πρόγραμμα megalyteros2 εκτελεί 1 σύγκριση και 1 εκχώρηση 8
Μισθοδοσία και πάλι program wromisthios (input, ouput); {υπολογισμός αποδοχών ωρομίσθιου υπαλλήλου} const wriaia_apozhmiwsh = 10000; pososto_kr_asfalishs = 10/100; pososto_kr_foroy = 7/100; elaxisto_orio = 100000 var wres_ergasias, asfalish, kathares_apodoxes, misthos, foros, plhrwteo_poso : integer; begin write(output, Poses wres ergasthkate? ); readln(input, wres_ergasias); misthos := wres_ergasias * wriaia_apozhmiwsh; asfalish := misthos * pososto_kr_foroy; kathares_apodoxes := misthos - asfalish; if kathares_apodoxes > elaxisto_orio then foros := kathares_apodoxes * pososto_kr_foroy; else foros := 0; plhrwteo_poso := kathares_apodoxes foros; writeln(output, To plhrvteo poso einai:, plhrwteo _poso); end {vromisthios}. 9
Εκτέλεση εντολών επιλογής Εκτέλεση της εντολής ifthen if <παράσταση> then <εντολή> Υπολογίζεται πρώτα η λογική τιμή της παράστασης που δίνεται μεταξύ των if και then Αν η τιμή αυτή είναι αληθής (True), τότε εκτελείται η εντολή που ακολουθεί το then Αν η τιμή αυτή είναι ψευδής (False) η εντολή που ακολουθεί το then αγνοείται Εκτέλεση της εντολής ifthenelse if <παράσταση> then <εντολή1> else <εντολή2> Υπολογίζεται πρώτα η λογική τιμή της παράστασης που δίνεται μεταξύ των if και then Αν η αυτή είναι αληθής (True), τότε εκτελείται η εντολή1 που βρίσκεται μεταξύ των then και else. Η εντολή2 αγνοείται αλλιώς εκτελείται η εντολή2 που βρίσκεται μετά το else Η εντολή1 αγνοείται 10
Παραστάσεις τύπου Boolean Για να μπορούμε να χρησιμοποιούμε λογικές παραστάσεις που περιέχουν περισσότερες της μιας συνθήκες ή συγκρίσεις, η Pascal παρέχει τρεις boolean τελεστές and (και, λογική σύζευξη, λογικό γινόμενο): a b a and b or (ή διαζευτκτικό, λογική διάζευξη, λογικό άθροισμα): a b a or b not (δεν, λογική άρνηση) a not a 11
Παράδειγμα: Ρύποι Για τη μέτρηση της ποιότητας στην ατμόσφαιρα μιας μεγάλης πόλης μετρούνται συνεχώς τα επίπεδα συγκεκριμένων βλαβερών συστατικών της, γνωστών ως ρύποι. Συγκεκριμένα διοξείδιο του αζώτου (NO 2 ) και το όζον (Ο 3 ). Για τον περιορισμό της ρύπανσης σε περιπτώσεις που σημειώνεται σημαντική αύξηση των τιμών των ρύπων χρησιμοποιούνται τα όρια των έκτακτων μέτρων. Τα όρια αυτά παρουσιάζονται στον παρακάτω πίνακα: Ρύπος Στάδιο Προειδοποίησης Στάδιο λήψης μέτρων Α βαθμίδας Στάδιο λήψης μέτρων Β βαθμίδας NO 2 (μg/m 3 ) 400 500 700 Ο 3 (μg/m 3 ) 250 300 500 Να γραφτεί ένα πρόγραμμα το οποίο να διαβάζει τις τιμές των ρύπων και να τυπώνει το αντίστοιχο μήνυμα σύμφωνα με τον παρακάτω πίνακα: Κάτω από το στάδιο προειδοποίησης Στάδιο προειδοποίησης Στάδιο λήψης μέτρων Α βαθμίδας Στάδιο λήψης μέτρων Β βαθμίδας ΡΥΠΟΙ ΜΕΣΑ ΣΤΑ ΟΡΙΑ ΠΡΟΣΟΧΗ ΕΚΤΑΚΤΑ ΜΕΤΡΑ ΑΠΑΓΟΡΕΥΣΗ ΚΥΚΛΟΦΟΡΙΑΣ 12
Πρόγραμμα Pascal program rypoi (input, output); {Υπολογισμός ατμοσφαιρικών ρύπων} var NO2, O3: integer; begin write(output, DWSE THN TIMH TOY DIOXEIDIOY: ); readln(input, NO2); write(output, DWSE THN TIMH TOY OZONTOS: ); readln(input, Ο3); if (NO2 > 700) or (O3 > 500) then writeln(output. APAGOREYSH KYKLOFORIAS ) else if (NO2 > 500) or (O3 > 300) then writeln(output. EKTAKTA METRA ) else if (NO2 > 400) or (O3 > 250) then writeln(output. PROSOXH ) else writeln(output. RYPOI ENTOS ORIWN ); end. 13
Επανάληψη Η εντολή while Συχνά ορισμένοι υπολογισμοί σε ένα πρόγραμμα είναι αναγκαίο να εκτελούνται περισσότερες από μια φορές Υπάρχουν δύο τύποι επαναλήψεων: προκαθορισμένοι: το πλήθος των επαναλήψεων είναι δεδομένο πριν αρχίσουν οι επαναλήψεις μη προκαθορισμένοι ή απροσδιόριστοι: το πλήθος των επαναλήψεων καθορίζεται κατά τη διάρκεια της εκτέλεσης των εντολών του σώματος της επανάληψης Στην πρώτη περίπτωση χρησιμοποιείται κάποιος μετρητής επαναλήψεων ο μετρητής παίρνει αρχική τιμή έξω από τον κύκλο των επαναλήψεων και αυξάνει κατά 1 στην τελευταία εντολή μέσα στον κύκλο των επαναλήψεων Η δεύτερη περίπτωση χρησιμοποιεί κάποιο γεγονός και η επανάληψη συνεχίζεται μέχρι να συμβεί το γεγονός στη διάρκεια της επανάληψης 14
Η εντολή whiledo while <λογική παράσταση> do εντολή Εκτέλεση της εντολής whiledo: Υπολογίζεται πρώτα η λογική τιμή της παράστασης που δίνεται μεταξύ των while και do Αν η τιμή είναι αληθής (True) τότε, εκτελείται η εντολή που ακολουθεί το do Υπολογίζεται ξανά η λογική τιμή της συνθήκης που δίνεται μεταξύ των while και do Αν η τιμή αυτή είναι (αληθής) True, τότε εκτελείται η εντολή που ακολουθεί το do κ.ο.κ. Αν η τιμή της παράστασης βρεθεί ψευδής (False) τότε η εντολή που ακολουθεί το do δεν εκτελείται και η εκτέλεση συνεχίζεται με την εντολή που ακολουθεί την whiledo Αν η τιμή της παράστασης είναι ψευδής από την πρώτη φορά που θα ελεγχθεί, η εντολή που ακολουθεί το do δεν θα εκτελεστεί ποτέ! 15
Παράδειγμα program Oso (input, output); const N = 10; var M : integer; {Μετρητής των επαναλήψεων} X : integer; {Εδώ αποθηκεύουμε κάθε τιμή που διαβάζουμε} Athr: integer; {Το μερικό (τρέχον) άθροισμα. Στο τέλος έχει το ολικό άθροισμα} MAT: real; {Μέση αριθμητική τιμή} begin Athr := 0; M:= 1; {Αρχικοποίηση μεταβλητών} while M <= N do begin writeln(output, DOSE ENAN ARITHMO ); readln(x); {Διάβασε τον Μ-οστό αριθμό} Athr := Athr + X; {Πρόσθεσε τον στο Athr } M : = M +1; {Ετοιμαζόμαστε για τον επόμενο αριθμό} end {while}; MAT := Athr / N; writeln( ATHROISMA=, Athr, MAT =, ΜΑΤ) end. 16