40
ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 1 - Εργαστήριο: Προγραμματισμός Η/Υ Παραδείγματα απλών προγραμμάτων σε Turbo Pascal Β. Ν. Νικολαϊδης Πρόσθετες εκφωνήσεις από: Σ. Οικονομόπουλο, Β. Καψάλη, Μ. Κεσόγλου. Ver.0.2.6

Παραδείγματα απλών προγραμμάτων σε Turbo Pascalusers.sch.gr/sidmakis/programming/examples_pascal.pdf · 2010. 12. 19. · Η Pascal είναι μια

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 1 -

    Εργαστήριο: Προγραμματισμός Η/Υ

    Παραδείγματα απλών προγραμμάτων σε Turbo Pascal

    Β. Ν. Νικολαϊδης

    Πρόσθετες εκφωνήσεις από: Σ. Οικονομόπουλο, Β. Καψάλη, Μ. Κεσόγλου.

    Ver.0.2.6

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 2 -

    Εισαγωγή  Η Pascal είναι μια γλώσσα που σχεδιάστηκε από τον N. Wirth το 1968, για να χρησιμοποιηθεί στην εκμάθηση προγραμματισμού υπολογιστών. Παρά την ηλικία της, η Pascal είναι ένα καλό εργαλείο εκπαίδευσης στις βασικές αρχές του προγραμματισμού γιατί:

    • Είναι σχετικά απλή.

    • Όπως πολλές πιο σύγχρονες γλώσσες, είναι αυστηρή στην εφαρμογή κανόνων που σχετίζονται με τον τύπο των μεταβλητών (είναι “strongly typed”).

    • Όπως πολλές πιο σύγχρονες γλώσσες, προσανατολίζεται στην χρήση υπορουτίνων (είναι “δομημένη γλώσσα - structured language”).

    • Υπάρχουν και χρησιμοποιούνται ακόμα σύγχρονες μετεξελίξεις της Pascal, όπως το Delphi, που υποστηρίζουν αντικειμενοστραφή προγραμματισμό, γραφικά, προγραμματισμό για παραθυρικό περιβάλλον ή βάσεις δεδομενων κλπ.

    • Λόγω της κοινής καταγωγής τους από την γλώσσα προγραμματισμού Algol, στη Pascal οι βασικές εντολές είναι παρόμοιες με αυτές άλλων δημοφιλών γλωσσών προγραμματισμού όπως η C, C++, C#, Java κλπ.

    Κάθε πρόγραμμα Pascal ακολουθεί πάντα μια τυποποιημένη μορφή παρόμοια με την παρακάτω:

    program atest (input, output) Τίτλος const pi=3.14; Ορισμός σταθερών type HMEPA=(DEYTEPA,TPITH,TETAPTH); Ορισμός τύπων var a,b:integer; day:HMEPA; s:string;

    Ορισμός μεταβλητών

    begin end.

    Κύριο μέρος

    Στα ονόματα σταθερών, τύπων, ή μεταβλητών επιτρέπεται η χρήση λατινικών χαρακτήρων, αριθμών, κλπ αλλά δεν επιτρέπεται η χρήση κενών και κάποιων συμβόλων. Οι εντολές (reserved words) της Pascal είναι οι:

    Absolute And Array Begin Case Const Div Do Downto Else End External File For Forward Function Goto If In Inline Label Mod Nil Not Of Or Overlay Packed Procedure Program Record Repeat Set Shl Shr String Then To Type Until Var While With Xor

    Επιπρόσθετα στην Turbo Pascal υπάρχουν τυπικές συναρτήσεις όπως οι Abs, ClrScr, Eof, Sqrt, Write, WriteLn που παρέχουν συνήθεις λειτουργίες που απαιτούνται από τον προγραμματιστή. Περισσότερες πληροφορίες για αυτές υπάρχουν στη βοήθεια της Turbo Pascal (πατώντας F1), ή και στο internet (όπως για παράδειγμα στη διεύθυνση http://www.clipx.net/ng/pascal/index.php)

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 3 -

    Η Pascal και άλλες παρεμφερείς γλώσσες προγραμματισμού  H Pascal μπορεί να είναι αρχή για την εξερεύνηση άλλων γλωσσών. Το παρακάτω παράδειγμα είναι ένα απλό πρόγραμμα (τυπώνει τη διαίρεση του 1 με όλους τους αριθμούς από το 1 έως το 100) γραμμένο σε διάφορες παραλλαγές. Φαινομενικά υπάρχουν πολλές διαφορές, όπως και πολλές ομοιότητες στα ουσιαστικά σημεία.

    Pascal Javascript program unitdiv; uses wincrt; var i:integer; r:real; begin for i:=1 to 100 do begin r:=1/i; write('Ενα δια ',i,' ίσον ',r); writeln; end; end.

    var i=0 var r=0 for (i=1;i

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 4 -

    Παράδειγμα 1:  Θέλουμε να δημιουργήσουμε ένα πρόγραμμα που να διαβάζει από το πληκτρολόγιο το όνομα, το επώνυμο και την ηλικία σας, και θα τα εμφανίζει στην οθόνη. Για τα ονόματα θα επιτρέπουμε μήκος έως 20 χαρακτήρες. Παρατήρηση: Στο παράδειγμα βλέπουμε τις εντολές read και readln που μας επιτρέπουν να πάρουμε τιμή για κάποια μεταβλητή από το πληκτρολόγιο. Έτσι τη στιγμή που ο υπολογιστής εκτελεί μία εντολή read(x), ότι πληκτρολογήσει ο χρήστης αποθηκεύεται στην μεταβλητή x. Η Οι εντολές write και writeln μας επιτρέπουν να «γράψουμε» δεδομένα στη οθόνη. Το επίθεμα -ln στις εντολές αντιστοιχεί στη λέξη line (γραμμή), και χρησιμοποιείται όταν θέλουμε το πρόγραμμα να διαβάζει από (readln) ή γράψει σε (writeln) μία νέα γραμμή μετά την εκτέλεση της εντολής. Πρόγραμμα:  Ένα πρόγραμμα που κάνει όσα ζητάμε είναι το παρακάτω program name; uses wincrt; var ono,epo : string[20]; var ili : integer; begin clrscr; write('DWSE ONOMA:'); readln(ono); write('DWSE EPONYMO:'); readln(epo); write('DWSE HLIKIA:'); readln(ili); writeln('ONOMA: ',ono); writeln('EPWNYMO:',epo); writeln('HLIKIA: ',ili,’ ETWN’); end. Εκτέλεση του προγράμματος  Ενδεικτικά, η έξοδος μίας εκτέλεσης («τρεξίματος») του προγράμματος είναι: DWSE ONOMA:Bond DWSE EPONYMO:James DWSE HLIKIA:33 ONOMA: Bond EPWNYMO: James HLIKIA: 33 ETWN

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 5 -

    Επεξήγηση  του προγράμματος  program name; Όνομα προγράμματος 

    uses wincrt; Χρησιμοποιεί την οθόνη (αυτό επιτρέπει την χρήση εντολών όπως η clrscr παρακάτω) Προσοχή: Αν δεν χρησιμοποιείτε την Borland Turbo Pascal για windows (TPW) δίνετε: uses crt; 

    var ono,epo : string[20]; Ορισμός 2 μεταβλητών που είναι string (= σειρά χαρακτήρων κειμένου, κείμενο) με μήκος έως 20 χαρακτήρες (για το όνομα και επώνυμο) 

    var ili : integer; Ορισμός 1 μεταβλητής που είναι ακέραιος αριθμός (για την ηλικία) 

    begin (Αρχίζει το κύριο μέρος του προγράμματος) 

    clrscr; Καθαρίζει την οθόνη 

    write('DWSE ONOMA:'); Εμφανίζει οδηγία (το κείμενο ‘DWSE ONOMA’)  στο χρήστη 

    readln(ono); Διαβάζει από το πληκτρολόγιο ότι όνομα δώσει ο χρήστης και το βάζει στη μεταβλητή ono. 

    write('DWSE EPONYMO:'); Εμφανίζει οδηγία στο χρήστη 

    readln(epo); Διαβάζει από το πληκτρολόγιο ότι όνομα δώσει ο χρήστης και το βάζει στη μεταβλητή epo. 

    write('DWSE HLIKIA:'); Εμφανίζει οδηγία στο χρήστη 

    readln(ili); Διαβάζει από το πληκτρολόγιο ότι αριθμό δώσει ο χρήστης και το βάζει στη μεταβλητή ili 

    writeln('ONOMA: ',ono); Εμφανίζει ένα μήνυμα επεξήγησης (το κείμενο ʹONOMA:  ʹ ), ακολουθούμενο από την τιμή πού έχει αποθηκευτεί στη μεταβλητή ono 

    writeln('EPWNYMO:',epo); Όπως παραπάνω, εμφανίζει ένα μήνυμα επεξήγησης μαζί με την μεταβλητή epo  

    writeln('HLIKIA: ',ili,’ ETWN’); Όπως παραπάνω, εμφανίζει ένα μήνυμα επεξήγησης μαζί με την μεταβλητή epo  

    end. (Τέλος κύριου μέρος του προγράμματος) 

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 6 -

    Παράδειγμα 2:  Πρόγραμμα που διαβάζει από το πληκτρολόγιο την τιμή ενός πραγματικού αριθμού x και υπολογίζει την τιμή της συνάρτησης

    Πρόγραμμα:  Ένα πρόγραμμα που κάνει όσα ζητάμε είναι το παρακάτω: program expression; uses wincrt; var x,y : real; begin clrscr; write('DWSE ARI8MO:'); readln(x); y := ( exp(-x)+sqr(x)+sqrt(x) ) / ( ln(x)+abs(x) ); writeln('TO APOTELESMA THS EXISWSHS EINAI ', y:0:2); end. Εκτέλεση του προγράμματος  Ενδεικτικά, η έξοδος μίας εκτέλεσης («τρεξίματος») του προγράμματος είναι: DWSE ARI8MO:4 TO APOTELESMA THS EXISWSHS EINAI 3.35

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 7 -

    Επεξήγηση  του προγράμματος  program expression; Όνομα προγράμματος, στο όνομα 

    του προγράμματος δεν επιτρέπονται κενά 

    uses wincrt; Χρησιμοποιεί τη βιβλιοθήκη wincrt (που περιέχει υπορουτίνες για την οθόνη και το πληκτρολόγιο σε windows) 

    var x,y : real; Ορισμός 2 μεταβλητών που είναι πραγματικοί αριθμοί. Στο όνομα των μεταβλητών δεν επιτρέπονται κενά 

    begin (Αρχίζει το κύριο μέρος του προγράμματος) 

    clrscr; Καθαρίζει την οθόνη 

    write('DWSE ARI8MO:'); Εμφανίζει οδηγία στο χρήστη 

    readln(x); Διαβάζει από το πληκτρολόγιο ότι αριθμό δώσει ο χρήστης και το βάζει στο x 

    y := ( exp(-x)+sqr(x)+sqrt(x) ) / ( ln(x)+abs(x) ); Υπολογίζει την εξίσωση και βάζει το αποτέλεσμα στο y 

    writeln('TO APOTELESMA THS EXISWSHS EINAI ', y:0:2); Εμφανίζει το y μαζί με ένα μήνυμα επεξήγησης. Το y εμφανίζεται με μόνο 2 δεκαδικά ψηφία  

    end. (Τέλος κύριου μέρος του προγράμματος) 

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 8 -

    Παράδειγμα 3:  Θέλουμε να δημιουργήσουμε ένα πρόγραμμα που να διαβάζει από το πληκτρολόγιο έναν αριθμό δευτερόλεπτων και να εμφανίζει τις ώρες, λεπτά, δευτερόλεπτα που αντιστοιχούν στον αριθμό αυτό. Πρόγραμμα:  Ένα πρόγραμμα που κάνει όσα ζητάμε είναι το παρακάτω: program seconds; uses wincrt; var secs,o,l,d : integer; begin clrscr; write('DWSE DEYTEROLEPTA POY 0ES NA METATRAPOYN: '); readln(secs); o := secs DIV 3600; d := secs MOD 3600; l := d DIV 60; d := d MOD 60; write('TA ',secs,' DEYTEROLEPTA ANTISTOIXOYN SE '); writeln(o,' WRES ',l,' LEPTA KAI ',d,' DEYTERA'); end. Εκτέλεση του προγράμματος  Ενδεικτικά, η έξοδος μίας εκτέλεσης («τρεξίματος») του προγράμματος είναι: DWSE DEYTEROLEPTA POY 0ES NA METATRAPOYN: 4001 TA 4001 DEYTEROLEPTA ANTISTOIXOYN SE 1 WRES 6 LEPTA KAI 41 DEYTERA

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 9 -

    Επεξήγηση  του προγράμματος  program seconds; Όνομα προγράμματος 

    uses wincrt; Χρησιμοποιεί την οθόνη 

    var secs,o,l,d : integer; Ορισμός 4 μεταβλητών (ακέραιων αριθμών). 

    begin (Αρχίζει το κύριο μέρος του προγράμματος) 

    clrscr; Καθαρίζει την οθόνη 

    write('DWSE DEYTEROLEPTA POY 0ES NA METATRAPOYN: ');

    Εμφανίζει οδηγία στο χρήστη 

    readln(secs); Διαβάζει από το πληκτρολόγιο ότι αριθμό δώσει ο χρήστης και το βάζει στο secs. Έτσι το secs έχει το συνολικό αριθμό δευτερολέπτων 

    o := secs DIV 3600; Χρησιμοποιούμε την εντολή ακέραιης διαίρεσης (DIV). Διαιρεί (ακέραια) το συνολικό αριθμό δευτερολέπτων με 3600 και έτσι βρίσκει τις ώρες (που βάζει στο o). 

    d := secs MOD 3600; Βρίσκει το υπόλοιπο της διαίρεσης του συνολικό αριθμό δευτερολέπτων με 3600 και το βάζει στο d. Ο αρχικός μας χρόνος είναι o ωρεςκαι d δευτερα. 

    l := d DIV 60; Μετά, διαιρεί (ακέραια) τα δευτερόλεπτα d με 60 και βρίσκει τα λεπτά (που βάζει στο l). 

    d := d MOD 60; Βρίσκει το υπόλοιπο της παραπάνω διαίρεσης αντικαθιστώντας τη τιμή στο d. Ο αρχικός μας χρόνος είναι o ώρες l λεπτά και d δεύτερα. 

    write('TA ',secs,' DEYTEROLEPTA ANTISTOIXOYN SE '); Εμφανίζει τα αποτελέσματα μαζί με επεξήγηση 

    writeln(o,' WRES ',l,' LEPTA KAI ',d,' DEYTERA'); ‐//‐ 

    end. (Τέλος κύριου μέρος του προγράμματος) 

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 10 -

    Παράδειγμα 4:  Θέλουμε να δημιουργήσουμε ένα πρόγραμμα που να διαβάζει από το πληκτρολόγιο τρεις αριθμούς και να εμφανίζει στην οθόνη τον μεγαλύτερο από αυτούς Παρατήρηση: Στο παράδειγμα βλέπουμε την εντολή IF που μας επιτρέπει να αλλάξουμε τη ροή των εντολών που εκτελούνται ανάλογα με κάποιο κριτήριο. Οι συνηθισμένες μορφές της IF είναι:

    IF THEN ; IF THEN < εντολή 1> ELSE < εντολή 2>; (μετάφραση: EAN (ΥΣΧΙΕΙ TO) < κριτήριο > TOTE ΑΛΛΙΩΣ ;)

    Το αποτέλεσμα του ελέγχου του κριτηρίου μπορεί να είναι μόνο true (αληθές) ή false (αναληθές). Αν το κριτήριο (ή αλλιώς «η συνθήκη») είναι αληθές, η εντολή 1 εκτελείται, αλλιώς παρακάμπτεται και (αν υπάρχει ELSE) εκτελείται η εντολή 2. Αν πρέπει να εκτελεστεί παραπάνω από μια εντολή χρησιμοποιούμε το BEGIN…END για να ορίσουμε μπλοκ εντολών. Όπως πάντα στη Pascal, χρησιμοποιούμε το σύμβολο ; για να ορίσουμε που τελειώνει η εντολή IF. Το ; είναι αντίστοιχο της άνω τελείας και σημαίνει ότι το συγκεκριμένο κομμάτι κειμένου τελείωσε. Στην IF δεν μπαίνει ; πριν το ELSE αφού το κείμενο που αφορά την εντολή IF δεν έχει ολοκληρωθεί παρά μετά το ELSE και την εντολή 2. Πρόγραμμα:  Ένα πρόγραμμα που κάνει όσα ζητάμε είναι το παρακάτω: program findmax; uses wincrt; var a,b,c,max: integer; begin clrscr; writeln('Dwste 3 ari0moys kai meta RETURN'); readln(a,b,c); max:=0; if (a>=b) then max:=a else max:=b; if (c>=max) then max:=c; writeln('Megalyteros = ',max); end. Εκτέλεση του προγράμματος  Ενδεικτικά, η έξοδος μίας εκτέλεσης («τρεξίματος») του προγράμματος είναι: Dwste 3 ari0moys kai meta RETURN -34 -324 -43 Megalyteros = -34

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 11 -

    Επεξήγηση  του προγράμματος  program findmax; Όνομα προγράμματος 

    uses wincrt; Χρησιμοποιεί την οθόνη (αυτό επιτρέπει την χρήση εντολών όπως η clrscr παρακάτω) 

    var a,b,c,max: integer; Ορισμός 4 μεταβλητών 

    begin (Αρχίζει το κύριο μέρος του προγράμματος) 

    clrscr; Καθαρίζει την οθόνη 

    writeln('Dwste 3 ari0moys kai meta RETURN'); Εμφανίζει οδηγία στο χρήστη 

    readln(a,b,c); Διαβάζει τους 3 αριθμόυς που δίνει ο χρήστης από το πληκτρολόγιο και τους  βάζει στις μεταβλητές  a, b, και c αντίστοιχα 

    if (a>=b) then max:=a else max:=b; Συγκρίνει τα a και b και βάζει στο max τη τιμή του μεγαλύτερου από τα δύο. 

    if (c>=max) then max:=c; Συγκρίνει τα c και max και βάζει στο max τη τιμή του μεγαλύτερου από τα δύο. 

    writeln('Megalyteros = ',max); Εμφανίζει το αποτέλεσμα. 

    end. (Τέλος κύριου μέρος του προγράμματος) 

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 12 -

    Παράδειγμα 5:  Θέλουμε να δημιουργήσουμε ένα πρόγραμμα που να βρίσκει τη λύση εξισώσεων της μορφής a x + b = 0. (Παρατήρηση: η λύση είναι x = -b/a, εκτός αν α=0. Αν α=0 και b=0 η εξίσωση είναι αόριστη, ενώ αν α=0 και b≠0 η εξίσωση είναι αδύνατη) Πρόγραμμα:  Ένα πρόγραμμα που κάνει όσα ζητάμε είναι το παρακάτω: program eksisosh; uses wincrt; var a:real; b:real; x:real; begin clrscr; writeln('EPILYSH EKSISWSHS ax+b = 0'); writeln('DWSE a '); read (a); writeln('DWSE b '); read (b); if (a0) then begin x:=-b/a; writeln('Yparxei lysh gia x = ',x:10:4); end else if (b=0) then writeln ('aoristh') else writeln('adynath'); end. Εκτέλεση του προγράμματος  Ενδεικτικά, η έξοδος μίας εκτέλεσης («τρεξίματος») του προγράμματος είναι: EPILYSH EKSISWSHS ax+b = 0 DWSE a 34 DWSE b 65 Yparxei lysh gia x = -1.9118

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 13 -

    Επεξήγηση  του προγράμματος  program eksisosh; Όνομα προγράμματος 

    uses wincrt; Χρησιμοποιεί την οθόνη (αυτό επιτρέπει την χρήση εντολών όπως η clrscr παρακάτω) 

    var Ορισμός 3 μεταβλητών: 

    a:real; (η μεταβλητή a της ax+b) 

    b:real; (η μεταβλητή b της ax+b) 

    x:real; (το x όπου θα υπολογιστεί η λύση) 

    begin (Αρχίζει το κύριο μέρος του προγράμματος) 

    clrscr; Καθαρίζει την οθόνη 

    writeln('EPILYSH EKSISWSHS ax+b = 0'); Εμφανίζει μήνυμα στο χρήστη 

    writeln('DWSE a '); Εμφανίζει οδηγία στο χρήστη 

    read (a); Διαβάζει τη τιμή του a από το πληκτρολόγιο 

    writeln('DWSE b '); Εμφανίζει οδηγία στο χρήστη 

    read (b); Διαβάζει τη τιμή του β από το πληκτρολόγιο 

    if (a0) then Εάν το a≠0 τότε βρίσκει και εμφανίζει τη λύση. (Επειδή θέλουμε να εκτελεστούν παραπάνω από μια εντολές αν a≠0, ενώνουμε τις εντολές αυτές μέσω  begin … end) 

    begin ‐//‐ 

    x:=-b/a; ‐//‐ 

    writeln('Yparxei lysh gia x = ',x:10:4); ‐//‐ 

    end ‐//‐ 

    else Αλλίως (αν το α=0)... 

    if (b=0) then ... αν το b=0 η εξίσωση είναι αόριστη 

    writeln ('aoristh') ‐//‐ 

    else ... αν το b≠0 η εξίσωση είναι αδύνατη 

    writeln('adynath'); ‐//‐ 

    end. (Τέλος κύριου μέρος του προγράμματος) 

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 14 -

    Παράδειγμα 6:  Θέλουμε να δημιουργήσουμε ένα πρόγραμμα που να παίρνει 2 αριθμούς να εμφανίζει ποίος είναι ο μεγαλύτερος (ή μήνυμα αν είναι ίσοι) και μετά να εμφανίζει το μέσο όρο τους. Πρόγραμμα:  Ένα πρόγραμμα που κάνει όσα ζητάμε είναι το παρακάτω: PROGRAM MAX_AVE; VAR A,B : REAL; BEGIN WRITELN('DWSE ENA ARITHMO'); READLN(A); WRITELN('DWSE ENA ARITHMO'); READLN(B); IF (A=B) THEN WRITELN('OI ARITMOI EINAI ISOI') ELSE IF(A>B) THEN WRITELN('MEGALYTERO TO ',A :0:2) ELSE WRITELN('MEGALYTERO TO ',B :0:2); WRITELN('MESOS OROS ',(A+B)/2 :0:2); END. Εκτέλεση του προγράμματος  Ενδεικτικά, η έξοδος μίας εκτέλεσης («τρεξίματος») του προγράμματος είναι: DWSE ENA ARITHMO 65 DWSE ENA ARITHMO 23 MEGALYTERO TO 65.00 MESOS OROS 44.00

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 15 -

    Επεξήγηση  του προγράμματος  PROGRAM MAX_AVE; Όνομα προγράμματος 

    VAR A,B : REAL; Ορισμός 2 μεταβλητών (οι αριθμοί που θα δοθούν από το χρήστη) 

    BEGIN (Αρχίζει το κύριο μέρος του προγράμματος) 

    WRITELN('DWSE ENA ARITHMO'); Εμφανίζει οδηγία στο χρήστη 

    READLN(A); Διαβάζει τη τιμή του A από το πληκτρολόγιο 

    WRITELN('DWSE ENA ARITHMO'); Εμφανίζει οδηγία στο χρήστη 

    READLN(B); Διαβάζει τη τιμή του B από το πληκτρολόγιο 

    IF (A=B) THEN Εάν οι αριθμοί είναι ίσοι εμφανίζει μήνυμα 

    WRITELN('OI ARITMOI EINAI ISOI')  

    ELSE Αλλιώς (εάν οι αριθμοί δεν είναι ίσοι)... 

    IF(A>B) THEN ... αν το A>B εμφανίζει το Α 

    WRITELN('MEGALYTERO TO ',A :0:2)  

    ELSE .. αλλιώς( αν το A≤B) εμφανίζει το Β 

    WRITELN('MEGALYTERO TO ',B :0:2);  

    WRITELN('MESOS OROS ',(A+B)/2 :0:2); Τέλος (σε κάθε περίπτωση), υπολογίζει και εμφανίζει τον μέσο όρο των A και Β, δηλαδή το (A+B)/2 

    END. (Τέλος κύριου μέρος του προγράμματος) 

    Όπως συμβαίνει συχνά, υπάρχουν πολλοί τρόποι να λυθεί προγραμματιστικά ένα πρόβλημα. Για παράδειγμα, ο παρακάτω κώδικας λειτουργεί παρόμοια με τον παραπάνω (έχοντας όμως την ιδιαιτερότητα να ανταλλάσει τις τιμές των Α και Β αν Α

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 16 -

    Παράδειγμα 7:  Δίνεται συνάρτηση f(t) η οποία ορίζεται ως εξής: Εάν t>2 τότε f(t)=2(t2+t)+3lnt-6 Εάν t=2 τότε f(t)=1 Εάν t2) then f := 2 * (sqr(t) + t) + 3 * ln(t) - 6; if(t

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 17 -

    Επεξήγηση  του προγράμματος  program if_equat; Όνομα προγράμματος 

    var t,f :real; Ορισμός 2 μεταβλητών  

    begin (Αρχίζει το κύριο μέρος του προγράμματος) 

    writeln('Parakalw dwste to t'); Εμφανίζει οδηγία στο χρήστη 

    read(t); Διαβάζει τη τιμή του t  από το πληκτρολόγιο 

    if(t>2) then f := 2 * (sqr(t) + t) + 3 * ln(t) - 6; Αν το t>2 υπολογίζουμε τον αντίστοιχη εξίσωση και βάζουμε το αποτέλεσμα στην μεταβλητή f 

    if(t

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 18 -

    Παράδειγμα 8:  Γράψτε πρόγραμμα με όνομα CONVERT το οποίο θα διαβάζει από το πληκτρολόγιο την τιμή έντασης ηλεκτρικού ρεύματος σε Amperes και θα τα μετατρέπει σε :

    μA (αν η τιμή είναι μικρότερη από 0.001Α) mA (αν η τιμή είναι μικρότερη από 1Α) kA (αν η τιμή είναι μεγαλύτερη ή ίση με 1000 Α)

    ενώ θα εμφανίζει μήνυμα αν η τιμή είναι αρνητική. Πρόγραμμα:  Ένα πρόγραμμα που κάνει όσα ζητάμε είναι το παρακάτω: program CONVERT; VAR A: REAL; BEGIN WRITELN ('DWSE ENTASE SE Amperes (A)'); READLN (A); WRITE('TA Amperes POY DWSATE ANTOISTIXOYN SE '); IF (A>=1000) THEN WRITELN (A/1000:8:2,'kA') ELSE IF(A>=1) THEN WRITELN (A:8:2,'A') ELSE IF(A>=0.001) THEN WRITELN (A*1000:8:2,'mA') ELSE IF (a

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 19 -

    Επεξήγηση  του προγράμματος  program CONVERT; Όνομα προγράμματος 

    VAR A: REAL; Ορισμός μεταβλητής A στην οποία θα διαβάσουμε την τιμή που θα δώσει ο χρήστης (τα amperes)  

    BEGIN (Αρχίζει το κύριο μέρος του προγράμματος) 

    WRITELN ('DWSE ENTASE SE Amperes (A)'); Εμφανίζει οδηγία στο χρήστη 

    READLN (A); Διαβάζει τη τιμή του A  από το πληκτρολόγιο 

    WRITE('TA Amperes POY DWSATE ANTOISTIXOYN SE '); Εμφανίζει μέρος της εξόδου ( είναι κοινό σε κάθε περίπτωση) 

    IF (A>=1000) THEN WRITELN (A/1000:8:2,'kA') Αν το Α>1000 εμφανίζει  τη μετατροπή του Α σε κΑ (δηλ. το Α/1000). 

    ELSE IF(A>=1) THEN WRITELN (A:8:2,'A') Το πρόγραμμα φτάνει στο σημείο αυτό αν το Α=1 τότε δεν χρειάζεται μετατροπή. 

    ELSE IF(A>=0.001) THEN WRITELN (A*1000:8:2,'mA') Το πρόγραμμα φτάνει στο σημείο αυτό αν το Α=0.001  εμφανίζει  τη μετατροπή του Α σε mΑ.. 

    ELSE IF (a

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 20 -

    Παράδειγμα 9:  Γράψτε πρόγραμμα με όνομα average το οποίο θα διαβάζει από το πληκτρολόγιο ένα αριθμό n , και θα υπολογίζει το n! δηλαδή το 1·2·3·…·n. Επίσης να υπολογίζει το 1!+2!+3!..+n! Παρατήρηση: Στο παράδειγμα βλέπουμε την εντολή FOR που μας επιτρέπει να επαναλάβουμε μια εντολή (ή σειρά εντολών) για συγκεκριμένο αριθμό επαναλήψεων. Οι συνηθισμένες μορφές της FOR είναι:

    FOR := ΤΟ DO ; (αν η αρχική τιμή είναι μεγαλύτερη της τελικής τιμής) FOR := DOWNΤΟ DO ; (αν η τελική τιμή είναι μεγαλύτερη της αρχικής τιμής)

    (μετάφραση: ΓΙΑ := ΕΩΣ ΚΑΝΕ ;>;)

    Η μεταβλητή είναι συνήθως integer (δεν μπορεί να είναι real). Για παράδειγμα αν έχουμε ορίσει μία μεταβλητή x που είναι ακέραιος αριθμός, το FOR x:=5 ΤΟ 15 DO writeln(x); δίνει στη μεταβλητή x την αρχική τιμή (5), εκτελεί την εντολή writeln, αυξάνει την τιμή της μεταβλητής x κατά 1, εκτελεί πάλι την εντολή writeln, αυξάνει την τιμή της μεταβλητής x κατά 1, κλπ μέχρι το x να γίνει μεγαλύτερο του 15. Αν πρέπει να εκτελεστεί παραπάνω από μια εντολή χρησιμοποιούμε το BEGIN…END για να ορίσουμε μπλοκ εντολών. Πρόγραμμα:  Ένα πρόγραμμα που κάνει όσα ζητάμε είναι το παρακάτω: PROGRAM PARAG; VAR I,N,P,SUM:INTEGER; BEGIN P:=1; SUM:=0; WRITE('#'); READLN(N); FOR I:=1 TO N DO BEGIN P:=P*I; SUM:=SUM+P; END; WRITELN('TO ',N,' PARAGONTIKO EINAI ',P); WRITELN('TO A8POISMA TWN PARAGONTIKWN EINAI ',SUM); END.

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 21 -

    Εκτέλεση του προγράμματος  Ενδεικτικά, η έξοδος μίας εκτέλεσης («τρεξίματος») του προγράμματος είναι: #4 TO 4 PARAGONTIKO EINAI 24 TO A8POISMA TWN PARAGONTIKWN EINAI 33 Επεξήγηση  του προγράμματος  PROGRAM PARAG; Όνομα προγράμματος 

    VAR I,N,P,SUM:INTEGER; Ορισμός μεταβλητών 

    BEGIN  

    P:=1;  

    SUM:=0; Εδώ θα υπολογίσουμε το άθροισμα 

    WRITE('#'); Ζητα τον αριθμό  n 

    READLN(N); Διαβάζει το n από το πληκρολογιο 

    FOR I:=1 TO N DO Και ξεκινάμε μία επαναληπτική διαδικασία ( n επαναλήψεις)... 

    BEGIN .. όπου το Ι γίνεται 1, μετά 2 κλπ 

    P:=P*I; ...και το p γίνεται 1*1, ενώ στη δεύτερη επανάληψη γίνεται (1*1)*2, στην τρίτη γίνεται  (1*1*2)*3, μετά (1*1*2*3)*4 κλπ. Δηλαδή στο  p είναι το εκάστοτε  i! 

    SUM:=SUM+P; ... οπότε το προσθέτουμε στην τρέχουσα τιμή του sum και αποθηκεύουμε το αποτέλεσμα πάλι στην sum. 

    END; (τέλος της επαναληπτικής διαδικασίας) 

    WRITELN('TO ',N,' PARAGONTIKO EINAI ',P); Εμφάνιση αποτελεσμάτων. Το τελευταίο  I για το οποίο έτρεξε η επαναληπτικής διαδικασία είναι το n άρα το p έχει το n! 

    WRITELN('TO A8POISMA TWN PARAGONTIKWN EINAI ',SUM); Και το sum έχει το 1!+2!+...+n! 

    END. Τέλος προγράμματος 

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 22 -

    Παράδειγμα 10:  Γράψτε πρόγραμμα με όνομα average το οποίο θα διαβάζει από το πληκτρολόγιο n αριθμούς, και θα εκτυπώνει τον μικρότερο, την θέση του μικρότερου, και το μέσο όρο όλων των αριθμών. Πρόγραμμα:  Ένα πρόγραμμα που κάνει όσα ζητάμε είναι το παρακάτω: program average; uses wincrt; var n,x,min,minpos,sum,i:integer; begin clrscr; writeln('Posoi ari8moi?'); readln (n); if(n>0) then begin writeln('dose 1o arithmo'); readln (x); sum:=x; min:=x; minpos:=1; for i:=2 to n do begin writeln('dose ',i,'o arithmo'); readln (x); if min>x then begin min:=x; minpos:=i; end; sum:=sum+x; end; writeln('o mesos oros einai', sum/n :6:2); writeln('o mikroteros einai o ',minpos,'os ari0mos dhladh to ',min); end; end. Εκτέλεση του προγράμματος  Ενδεικτικά, η έξοδος μίας εκτέλεσης («τρεξίματος») του προγράμματος είναι: Posoi ari8moi? 3 dose 1o arithmo 34 dose 2o arithmo -3 dose 3o arithmo 23 o mesos oros einai 18.00 o mikroteros einai o 2os ari0mos dhladh to -3

    Αυτό το κάνουμε για να δώσουμε μια σωστή αρχική τιμή στο min (που θα θέλαμε να είναι αρχικά ίσο με +∞, μεγαλύτερο από κάθε αριθμό). Αντί αυτού και αφού δεν θα υπάρχει min για να γίνει σύγκριση όταν «διαβάσουμε» από το χρήστη τον πρώτο αριθμό, αυτός ο αριθμός γίνεται απευθείας το νέο min.

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 23 -

    Επεξήγηση  του προγράμματος  program average; Όνομα προγράμματος 

    uses wincrt;  

    var n,x,min,minpos,sum,i:integer; Ορισμός μεταβλητών 

    begin  

    clrscr; Καθαρίζει την οθόνη 

    writeln('Posoi ari8moi?'); Ερ: Πόσοι θα είναι οι αριθμοι? 

    readln (n); Απ:  n 

    if(n>0) then Αν το  n είναι 0 ή λιγότερο δεν κάνουμε τίποτα. 

    begin Αν το n είναι μεγαλύτερο από 0... 

    writeln('dose 1o arithmo'); ...διαβάζουμε τον πρώτο αριθμό 

    readln (x); ... δηλαδή τον x 

    sum:=x; … και τον προσθέτουμε στο σύνολο των αριθμών sum 

    min:=x; ... και επειδή είναι ο μόνος αριθμός μέχρι στιγμής, είναι και ο μικρότερος. 

    minpos:=1; ... ενώ  η θέση του μέχρις στιγμής μικρότερου αριθμού είναι το 1 (ο πρώτος που διαβάσαμε) 

    for i:=2 to n do Έχουμε άλλους n‐1 αριθμούς να διαβάσουμε οπότε ξεκινάμε μία επαναληπτική διαδικασία... 

    begin  

    writeln('dose ',i,'o arithmo'); ...διαβάζουμε τον αριθμό 

    readln (x); ... δηλαδή τον νέο x 

    if min>x then ... συγκρίνουμε με την τρέχουσα ελάχιστη τιμη (το min) και αν το x είναι μικρότερο τότε έχουμε μία νέα ελάχιστη τιμή, οπότε... 

    begin  

    min:=x; ...κρατάμε την τιμή στο min 

    minpos:=i; ....και τη θέση της στο minpos 

    end; (Τέλος του IF (γραμμή19)) 

    sum:=sum+x; Σε κάθε περίπτωση προσθέτουμε τον νέο αριθμό στο sum. 

    end; (Τέλος του FOR (γραμμή15)) 

    writeln('o mesos oros einai', sum/n :0:2); Στο τέλος το sum έχει το άθροισμα όλων των αριθμών, οπότε ο μέσος όρος είναι sum/n. Το εμφανίζουμε, 

    writeln('o mikroteros einai o ',minpos,'os ari0mos dhladh to ',min); ... μαζί με τα άλλα  αποτελέσματα. 

    end; (Τέλος του IF (γραμμή 8)) 

    end. Τέλος προγράμματος 

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 24 -

    Παράδειγμα 11:  Γράψτε πρόγραμμα το οποίο θα διαβάζει από το πληκτρολόγιο 5 βαθμολογίες μαθητών και θα εμφανίζει το βαθμό του μαθητή με τον μεγαλύτερο βαθμό καθως και τον αριθμό των μαθητών με βαθμό ≥18.5.Το πρόγραμμα πρέπει να επιτρέπει την εισαγωγή μόνο έγκυρων βαθμών (δηλαδή απο 0 έως 20). Αν εισαχθεί βαθμός εκτός ορίων εμφανίζει μήνυμα λάθους και ζητά πάλι το βαθμό από το χρήστη. Παρατήρηση: Στο παράδειγμα βλέπουμε την εντολή WHILE που μας επιτρέπει να επαναλάβουμε μια εντολή (ή σειρά εντολών) εφόσον μία συνθήκη είναι αληθής. Η μορφή της WHILE είναι:

    WHILE DO ; (μετάφραση: ΟΣΟ (ΥΣΧΙΕΙ ΤΟ) ΚΑΝΕ )

    Όπως και στην IF, το αποτέλεσμα του ελέγχου του μπορεί να είναι μόνο true (αληθές) ή false (αναληθές). Ο έλεγχος του κριτηρίου γίνεται πρίν την εκτέλεση των εντολών. Αν και όσο το κριτήριο είναι αληθές, η εντολή εκτελείται. Η διαδικασία επαναλαμβάνεται μέχρι το κριτήριο να γίνει αναληθές. Αν πρέπει να εκτελεστεί παραπάνω από μια εντολή χρησιμοποιούμε το BEGIN…END για να ορίσουμε μπλοκ εντολών. Πρόγραμμα:  Ένα πρόγραμμα που κάνει όσα ζητάμε είναι το παρακάτω: program ba0moi; var ba0mos, best : real; pli0os, i : integer; begin best:=0; pli0os:=0; for i:=1 to 5 do begin write ('Dwse ba0mo gia ',i,'o ma0hth:'); readln (ba0mos); while(ba0mos20) do begin write ('Akyros ba8mos, parakalw dwse swsto ba0mo:'); readln (ba0mos); end; if(ba0mos>best) then best:=ba0mos; if(ba0mos>=18.5) then pli0os:=pli0os+1; end; writeln('O kalyteros ba0mos einai to ',best:2:1); writeln(pli0os,' ma8htes eixan 18.5 kai panw'); end.

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 25 -

    Εκτέλεση του προγράμματος  Dwse ba0mo gia 1o ma0hth:17 Dwse ba0mo gia 2o ma0hth:18.9 Dwse ba0mo gia 3o ma0hth:-3 Akyros ba8mos, parakalw dwse swsto ba0mo:43 Akyros ba8mos, parakalw dwse swsto ba0mo:542 Akyros ba8mos, parakalw dwse swsto ba0mo:19.1 Dwse ba0mo gia 4o ma0hth:14 Dwse ba0mo gia 5o ma0hth:15 O kalyteros ba0mos einai to 19.1 2 ma8htes eixan 18.5 kai panw Επεξήγηση  του προγράμματος  program ba0moi; Όνομα  

    var ba0mos, best : real; Ορισμός μεταβλητών 

    pli0os, i : integer;  

    Begin  

    best:=0; Ο καλύτερος βαθμός είναι 0 

    pli0os:=0; Ο αριθμός μαθητων με 18.5 και πάνω είναι 0. 

    for i:=1 to 5 do Επανέλαβε για 5 μαθητες... 

    Begin  

    write ('Dwse ba0mo gia ',i,'o ma0hth:'); Ζήτα και.. 

    readln (ba0mos); ...διάβασε το βαθμό 

    while(ba0mos20) do και όσο ο βαθμός είναι εκτός ορίων 

    begin …επανέλαβε την διαδικασία: 

    write ('Akyros ba8mos, parakalw dwse swsto ba0mo:');  ζήτα ένα σωστό  

    readln (ba0mos); … και διάβασέ τον μετά, από το πληκτρολόγιο. 

    end;  

    if(ba0mos>best) then best:=ba0mos; Σώσε τον καλύτερο βαθμό 

    if(ba0mos>=18.5) then pli0os:=pli0os+1; Μέτρα τους αριστούχους 

    end;  

    writeln('O kalyteros ba0mos einai to ',best:2:1); writeln(pli0os,' ma8htes eixan 18.5 kai panw');

    Δείξε τα αποτελέσματα 

    end.  

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 26 -

    Παράδειγμα 12:  Το ίδιο πρόγραμμα (το οποίο διαβάζει από το πληκτρολόγιο 5 βαθμολογίες μαθητών κλπ) μπορεί να γίνει και χρησιμοποιώντας την εντολή REPEAT. Παρατήρηση: Στο παράδειγμα βλέπουμε την εντολή REPEAT που (όπως και η WHILE) μας επιτρέπει να επαναλάβουμε μια εντολή (ή σειρά εντολών) όσο μία συνθήκη είναι αληθής. Η μορφή της REPEAT είναι:

    REPEAT UNTIL ; (μεταφραση: ΕΠΑΝΕΛΑΒΕ ΕΩΣ (ΟΤΟΥ ΝΑ ΥΣΧΙΕΙ ΤΟ) )

    Αντίθετα από την WHILE, εδώ οι εντολές εκτελούνται τουλάχιστον μια φορά και ο έλεγχος του κριτηρίου γίνεται μετά την εκτέλεση των εντολών. Όπως και στις IF/WHILE, το αποτέλεσμα του ελέγχου του μπορεί να είναι μόνο true (αληθές) ή false (αναληθές). Οι επαναλήψεις συνεχίζονται έως ότου να ισχύσει (να γίνει αληθές) το κριτήριο. Έτσι εάν μετά την πρώτη εκτέλεση των εντολών το κριτήριο είναι αναληθές οι εντολές εκτελούνται πάλι και η διαδικασία επαναλαμβάνεται μέχρι το κριτήριο να γίνει αληθές (να ισχύει). Σημείωση: η REPEAT δεν χρειάζεται απαραίτητα BEGIN…END (μπλοκ εντολών) για να εκτελέσουμε πολλές εντολές. Πρόγραμμα:  Ένα πρόγραμμα που κάνει όσα ζητάμε είναι το παρακάτω: program ba0moi; var ba0mos, best : real; pli0os, i : integer; begin best:=0; pli0os:=0; for i:=1 to 5 do begin repeat write ('Dwse ba0mo gia ',i,'o ma0hth:'); readln (ba0mos); if (ba0mos20) then write ('Akyros ba8mos.'); until (ba0mos>=0) and (ba0mosbest) then best:=ba0mos; if(ba0mos>=18.5) then pli0os:=pli0os+1; end; writeln('O kalyteros ba0mos einai to ',best:2:1); writeln(pli0os,' ma8htes eixan 18.5 kai panw'); end.

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 27 -

    Εκτέλεση του προγράμματος  Dwse ba0mo gia 1o ma0hth:14 Dwse ba0mo gia 2o ma0hth:19 Dwse ba0mo gia 3o ma0hth:12 Dwse ba0mo gia 4o ma0hth:032 Akyros ba8mos.Dwse ba0mo gia 4o ma0hth:322 Akyros ba8mos.Dwse ba0mo gia 4o ma0hth:-3 Akyros ba8mos.Dwse ba0mo gia 4o ma0hth:15 Dwse ba0mo gia 5o ma0hth:8 O kalyteros ba0mos einai to 19.0 1 ma8htes eixan 18.5 kai panw Επεξήγηση  του προγράμματος  program ba0moi; Όνομα 

    προγράμματος 

    var ba0mos, best : real; Ορισμός μεταβλητών 

    pli0os, i : integer;  

    begin  

    best:=0; Ο καλύτερος μέχρι στιγμής  βαθμός είναι 0 

    pli0os:=0; Ο αριθμός μαθητων με 18.5 και πάνω είναι 0. 

    for i:=1 to 5 do Επανέλαβε για 5 μαθητες... 

    begin  

    repeat Επανέλαβε τα παρακάτω... 

    write ('Dwse ba0mo gia ',i,'o ma0hth:'); Διάβασε βαθμό 

    readln (ba0mos);  

    if (ba0mos20) then write ('Akyros ba8mos.');

    Αν είναι λάθος δείξε μήνυμα 

    until (ba0mos>=0) and (ba0mosbest) then best:=ba0mos; Σώσε τον καλύτερο βαθμό 

    if(ba0mos>=18.5) then pli0os:=pli0os+1; Μέτρα τους αριστούχους 

    end;  

    writeln('O kalyteros ba0mos einai to ',best:0:1); writeln(pli0os,' ma8htes eixan 18.5 kai panw');

    Δείξε τα αποτελέσματα 

    end.  

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 28 -

    Παράδειγμα 13:  Να γραφτεί πρόγραμμα το οποίο διαβάζει από το πληκτρολόγιο 10 λέξεις και μετά να τις εμφανίζει με αντίστροφη σειρά (από αυτή με την οποία τις δώσαμε). Παρατήρηση: Για να ορίσουμε μια μεταβλητή που είναι μονοδιάστατος πίνακας από 10 string (σειρά χαρακτήρων κειμένου, κείμενο) γράφουμε: onoma_pinaka : array [1..10] of string; στην περιοχή που ορίζουμε μεταβλητές. Αντίστοιχα, για να ορίσουμε μια μεταβλητή που είναι μονοδιάστατος πίνακας από 10 ακέραιους αριθμους γράφουμε: var onoma_pinaka : array [1..10] of integer; Το onoma_pinaka είναι ο πίνακας, το onoma_pinaka[1] το πρώτο στοιχείο του, το onoma_pinaka[10] το τελευταίο. Για να ορίσουμε μια μεταβλητή που είναι δισδιάστατος πίνακας 10x10 ακέραιων αριθμών γράφουμε: var onoma_pinaka : array [1..10,1..10] of integer; Το onoma_pinaka είναι ο πίνακας, το onoma_pinaka [1][1] το πρώτο στοιχείο της πρώτης γραμμής, το onoma_pinaka [10][10] το τελευταίο στοιχείο της τελευταίας γραμμής. Πρόγραμμα:  Ένα πρόγραμμα που κάνει όσα ζητάμε είναι το παρακάτω: program reverse; const n=10; var w:array[1..n] of string; i:integer; begin for i:=1 to n do begin write ('Dwse le3h :'); readln(w[i]); end; for i:=n downto 1 do writeln(w[i]); end.

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 29 -

    Εκτέλεση του προγράμματος  Dwse le3h :computer Dwse le3h :pascal Dwse le3h :program Dwse le3h :error Dwse le3h :loop Dwse le3h :test Dwse le3h :data Dwse le3h :class Dwse le3h :object Dwse le3h :number number object class data test loop error program pascal computer Επεξήγηση  του προγράμματος  program reverse; Όνομα προγράμματος 

    const Ορισμός σταθερών: 

    n=10; Ορισμος σταθεράς n (πάντοτε ίση με 10) 

    var Ορισμός μεταβλητών: 

    w:array[1..n] of string; Ορισμός ενός πίνακα 10x1 από strings (για να αποθηκεύσουμε τις λέξεις) 

    i:integer;  

    begin  

    for i:=1 to n do Για i = 1,2,3,..,10 επανέλαβε... 

    begin  

    write ('Dwse le3h :');  

    readln(w[i]); ... διάβασε μια λέξη και σώσε τη στο w[i]  

    end;  

    for i:=n downto 1 do Για i = 10,9,8,..,1 επανέλαβε... 

    writeln(w[i]); …δειξε το w[i] 

    end.  

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 30 -

    Παράδειγμα 14:  Να γραφτεί πρόγραμμα το οποίο θα διαβάζει τα αποτελέσματα σε 5 αγώνες ποδοσφαίρου, τα οποία θα αποθηκεύει σε πίνακα, και μετά θα τα εκτυπώνει με σχόλιο που αφορά αν υπήρξε ισοπαλία, νίκη γηπεδούχου ή επισκέπτη. Πρόγραμμα:  Μία τέτοια λύση είναι η παρακάτω: program scores; uses wincrt; var s,g:integer; score:array [1..5,1..2] of integer; begin for g:=1 to 5 do for s:=1 to 2 do begin write('DWSE GOALS ',s,'hs OMADAS STON ',g,'o AGWNA:'); readln(score[g,s]); end; writeln; writeln(' APOTELESMATA:'); writeln(' 1o 2o Sxolio'); writeln; for g:=1 to 5 do begin for s:=1 to 2 do write(score[g,s]:4); write(' '); if score[g,1] = score[g,2] then write ('ISOPALIA') else if score[g,1] > score[g,2] then write ('NIKH GHPEDOYXOY') else write ('NIKH EPISKEPTH'); writeln; end; end. Εκτέλεση του προγράμματος  DWSE GOALS 1hs OMADAS STON 1o AGWNA:1 DWSE GOALS 2hs OMADAS STON 1o AGWNA:0 DWSE GOALS 1hs OMADAS STON 2o AGWNA:0 DWSE GOALS 2hs OMADAS STON 2o AGWNA:0 DWSE GOALS 1hs OMADAS STON 3o AGWNA:2 DWSE GOALS 2hs OMADAS STON 3o AGWNA:2 DWSE GOALS 1hs OMADAS STON 4o AGWNA:2 DWSE GOALS 2hs OMADAS STON 4o AGWNA:1 DWSE GOALS 1hs OMADAS STON 5o AGWNA:0 DWSE GOALS 2hs OMADAS STON 5o AGWNA:3 APOTELESMATA: 1o 2o Sxolio 1 0 NIKH GHPEDOYXOY 0 0 ISOPALIA 2 2 ISOPALIA 2 1 NIKH GHPEDOYXOY 0 3 NIKH EPISKEPTH

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 31 -

    Επεξήγηση  του προγράμματος  program scores; uses wincrt;

    Όνομα προγράμματος κλπ 

    var Ορισμός μεταβλητών: 

    s,g:integer; s για στήλη (αγώνες), g για γραμμή (ομάδες). 

    score:array [1..5,1..2] of integer; …και ο πίνακας των σκορ. 

    begin  

    for g:=1 to 5 do Πρώτα διαβάζουμε τους τα γκολ της κάθε ομάδας και γεμίζουμε τον πίνακα. Για 5 αγώνες… 

    for s:=1 to 2 do … και 2 αντίπαλες ομάδες 

    begin ‐//‐ 

    write('DWSE GOALS ',g,'hs STON ',s,'o AGWNA:'); …διαβάζουμε το σκορ του γηπεδούχου στη στήλη 1 

    readln(score[g,s]); ενώ του επισκέπτη στη στήλη 2  

    end;  

    writeln; Μετά εμφανίζουμε μερικές επικεφαλίδες… 

    writeln(' APOTELESMATA:'); ‐//‐ 

    writeln(' 1o 2o Sxolio'); ‐//‐ 

    writeln; ‐//‐ 

    for g:=1 to 5 do Μετά εμφανίζουμε τον ίδιο τον πίνακα. Για κάθε αγώνα… 

    Begin  

    for s:=1 to 2 do …εμφάνισε το αποτελεσμα  

    write(score[g,s]:4); των δύο ομάδων 

    write(' '); .. ένα κενό… 

    if score[g,1] = score[g,2] then write ('ISOPALIA')

    …και δίπλα ένα σχόλιο σχετικά με τον νικητή. Ήταν το σκορ στη πρώτη στήλη ίσο με το δεύτερο (ισοπαλία)?  

    else if score[g,1] > score[g,2] then write ('NIKH GHPEDOYXOY')

    …η μήπως μεγαλύτερο? (νίκη γηπεδούχου) 

    else write ('NIKH EPISKEPTH'); ...αν τίποτε από τα παραπάνω τότε νίκησε ο επισκέπτης.  

    writeln; Τέλος πάμε στην επόμενη γραμμή της οθόνης (και στον επόμενο αγώνα αν υπάρχει) 

    end;  

    end. Τέλος προγράμματος 

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 32 -

    Παράδειγμα 15:  Να γραφτεί πρόγραμμα το οποίο διαβάζει από το πληκτρολόγιο 10 αριθμούς και τους ταξινομεί από το μικρότερο στον μεγαλύτερο (sorting). Πρόγραμμα:  Υπάρχουν πολλοί τύποι sorting, ένα τέτοιο πρόγραμμα (bubblesort) είναι το παρακάτω: program sort; uses wincrt; const n = 10; var i, j, temp : integer; pinakas : array [1..n] of integer; begin for i:= 1 to n do begin write ('Dwse ',i,'o ari8mo :'); readln(pinakas[i]); end; for i := 1 to n do for j := (i+1) to n do if pinakas[j] < pinakas[i] then begin temp := pinakas[j]; pinakas[j] := pinakas[i]; pinakas[i] := temp; end; for i := 1 to n do write(pinakas[i],' '); end. Εκτέλεση του προγράμματος  Dwse 1o ari8mo :39 Dwse 2o ari8mo :72 Dwse 3o ari8mo :323 Dwse 4o ari8mo :53 Dwse 5o ari8mo :2 Dwse 6o ari8mo :5 Dwse 7o ari8mo :-35 Dwse 8o ari8mo :634 Dwse 9o ari8mo :-34 Dwse 10o ari8mo :2305 -35 -34 2 5 39 53 72 323 634 2305

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 33 -

    Επεξήγηση  του προγράμματος  program sort; uses wincrt;

    Όνομα προγράμματος κλπ 

    const Ορισμός σταθερών: 

    n = 10; Ορισμος σταθεράς n (πάντοτε ίση με 10) 

    var Ορισμός μεταβλητών: 

    i, j, temp : integer;  

    pinakas : array [1..n] of integer; Ορισμός ενός πίνακα 10x1 από integer (για να αποθηκεύσουμε τους αριθμούς) 

    begin  

    Πρώτα διαβάζουμε τους αριθμούς και γεμίζουμε τον πίνακα 

    for i:= 1 to n do Για i = 1,2,3,..,10 επανέλαβε... 

    begin  

    write ('Dwse ',i,'o ari8mo :'); ... διάβασε ενα αριθμό και σώσε το στο pinakas[i]  

    readln(pinakas[i]); ‐//‐ 

    end;  

    Μετά ταξινομούμε... 

    for i := 1 to n do Για i = 1,2,3,..,10 .... 

    for j := (i+1) to n do ...και για j να ξεκινά από το επόμενο στοιχείο του εκάστοτε i έως το τέλος του πίνακα, επανέλαβε... 

    if pinakas[j] < pinakas[i] then ... αν το στοιχείο στο j (δεξιά του στοιχείου στο i) είναι μικρότερο από το στοιχείο στο i… 

    begin  

    temp := pinakas[j]; ...άλλαξε το στοιχείο στο j με το στοιχείο στο i. 

    pinakas[j] := pinakas[i]; ‐//‐ 

    pinakas[i] := temp; ‐//‐ 

    end;  

     

    for i := 1 to n do Εμφάνισε τον τελικό πίνακα 

    write(pinakas[i],' ');  

    end.  

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 34 -

    Το πρόγραμμα για κάθε στοιχείο i του πίνακα, βρίσκει το μικρότερο στοιχείο του πίνακα δεξια του i, και αλλάζει τα δύο. Καθώς τρέχει, ο πίνακας αλλάζει όπως βλέπουμε παρακάτω: Βήμα pinak

    as[1] pinakas[2]

    pinakas[3]

    pinakas[4]

    pinakas[5]

    pinakas[6]

    pinakas[7]

    pinakas[8]

    pinakas[9]

    pinakas[10]

    Αρχή 39 72 323 53 2 5 -35 634 -34 2305 i=1 2 72 323 53 39 5 -35 634 -34 2305 i=1 -35 72 323 53 39 5 2 634 -34 2305 i=2 -35 53 323 72 39 5 2 634 -34 2305 i=2 -35 39 323 72 53 5 2 634 -34 2305 i=2 -35 5 323 72 53 39 2 634 -34 2305 i=2 -35 2 323 72 53 39 5 634 -34 2305 i=2 -35 -34 323 72 53 39 5 634 2 2305 i=3 -35 -34 72 323 53 39 5 634 2 2305 i=3 -35 -34 53 323 72 39 5 634 2 2305 i=3 -35 -34 39 323 72 53 5 634 2 2305 i=3 -35 -34 5 323 72 53 39 634 2 2305 i=3 -35 -34 2 323 72 53 39 634 5 2305 i=4 -35 -34 2 72 323 53 39 634 5 2305 i=4 -35 -34 2 53 323 72 39 634 5 2305 i=4 -35 -34 2 39 323 72 53 634 5 2305 i=4 -35 -34 2 5 323 72 53 634 39 2305 i=5 -35 -34 2 5 72 323 53 634 39 2305 i=5 -35 -34 2 5 53 323 72 634 39 2305 i=5 -35 -34 2 5 39 323 72 634 53 2305 i=6 -35 -34 2 5 39 72 323 634 53 2305 i=6 -35 -34 2 5 39 53 323 634 72 2305 i=7 -35 -34 2 5 39 53 72 634 323 2305 i=8 -35 -34 2 5 39 53 72 323 634 2305

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 35 -

    Παράδειγμα 16:  Να γραφτεί πρόγραμμα το οποίο υπολογίζει το τετράγωνο των αριθμών από το 1 έως το 10. Χρησιμοποιούμε υπορουτίνα (function) για τον υπολογισμό των τετραγώνων. Πρόγραμμα:  Ένα πρόγραμμα που κάνει όσα ζητάμε είναι το παρακάτω: program tetragwna; uses wincrt; var i : integer; function tetragwno (x: Real): Real; begin tetragwno := x*x; end; begin for i := 1 to 10 do Writeln ('to tetragwno toy ',i,' einai ',tetragwno (i):6:2); WriteLn; end. Εκτέλεση του προγράμματος  to tetragwno toy 1 einai 1.00 to tetragwno toy 2 einai 4.00 to tetragwno toy 3 einai 9.00 to tetragwno toy 4 einai 16.00 to tetragwno toy 5 einai 25.00 to tetragwno toy 6 einai 36.00 to tetragwno toy 7 einai 49.00 to tetragwno toy 8 einai 64.00 to tetragwno toy 9 einai 81.00 to tetragwno toy 10 einai 100.00

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 36 -

    Επεξήγηση  του προγράμματος  program tetragwna; uses wincrt;

    Όνομα προγράμματος 

    var i : integer; Ορισμός μεταβλητών 

     

    function tetragwno (x: Real): Real; Ορισμός μιας υπορουτίνας με όνομα tetragwno για τον υπολογισμό του τετραγώνου. Η ρουτίνα δέχεται (σαν «παράμετρο») έναν αριθμό x και επιστρέφει πάλι αριθμό. 

    Begin Αρχή υπορουτίνας 

    Tetragwno := x*x; Υπολόγισε το x*x και επέστρεψε το. Χρησιμοποιούμε το όνομα της υπορουτίνας για να επιστρέψουμε το αποτέλεσμα 

    end; Τέλος υπορουτίνας 

     

    Begin (Αρχίζει το κύριο μέρος του προγράμματος) 

    for i := 1 to 10 do Για i = 1,2,3,..,10 επανέλαβε... 

    Writeln ('to tetragwno toy ',i,' einai ',tetragwno (i):6:2);

    ... κάλεσε την tetragwno με παράμετρο το i και δείξε το αποτέλεσμα  

    WriteLn; ‐//‐ 

    end. (Τέλος κύριου μέρος του προγράμματος) 

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 37 -

    Παράδειγμα 17:  Να γραφτεί πρόγραμμα το οποίο να παίζει τρίλιζα (tic-tac-toe ή Χ-Ο). Χρησιμοποιούμε διαδικασίες (procedures) για κάποια σημαντικά μέρη του προγράμματος, πίνακες, και διάφορες άλλες χρήσιμες τεχνικές που εξηγούνται παρακάτω. Πρόγραμμα:  (Δες επεξήγηση του προγράμματος, παρακάτω) Εκτέλεση του προγράμματος  ___ ___ ___ Dialexe grammi:33 Dialexe stili:3 ** LA0OS EPILOGH ** 3anadialexe grammi:3 3anadialexe stili:3 SKEFTOMAI... _O_ ___ __X Dialexe grammi:3 Dialexe stili:1 SKEFTOMAI... _O_ ___ XOX Dialexe grammi:1 Dialexe stili:1 SKEFTOMAI...... XO_ O__ XOX Dialexe grammi:2 Dialexe stili:2 XO_ OX_ XOX KERDISES!

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 38 -

    Επεξήγηση  του προγράμματος  program tictactoe; Όνομα προγράμματος uses wincrt; Βιβλιοθήκη   {-------------------- STA0ERES -----------------} (Σχόλιο προγραμματιστή)   const Σταθερές  KANENAS = 0; 0 συμβολίζει κανέναν και 

    ισοπαλία  COMPUTER = 1; 1 το computer  AN0ROPOS = 2; 2 τον άνθρωπο‐παίχτη  AGNWSTOS = 3; 3 άγνωστος νικητής (δηλαδή 

    το παιχνίδι συνεχίζεται)   {------------- KA0OLIKES METABLHTES ------------} (Σχόλιο προγραμματιστή)   var   t : array [1..3,1..3] of integer; Ο πίνακας του παιχνιδιού  nikiths : integer; Μεταβλητή που περιέχει  το νικητή αν υπάρχει. {-----------------------------------------------} (Σχόλιο προγραμματιστή)   procedure ARXIKOPOIHSE_PINAKA; Διαδικασία που αρχικοποιεί 

    τον πίνακα. Χρησιμοποιεί var g,s:integer; τοπικές μεταβλητές: g για  begin γραμμή, s για στήλη.  for g := 1 to 3 do Για κάθε γραμμή…  for s := 1 to 3 do και στήλη…  t[g][s]:=KANENAS; …θέσε τη θέση ως κενή  end;    {-----------------------------------------------} (Σχόλιο προγραμματιστή)  Διαδικασία που εμφανίζει  procedure EMFANISE_PINAKA; τον πίνακα: var g,s:integer; Τοπικές μεταβλητές: g για  begin γραμμή, s για στήλη.  writeln; Άφησε μία κενή γραμμή.  for g := 1 to 3 do Μετά για κάθε γραμμή  begin του πίνακα και…  for s := 1 to 3 do για κάθε μια στήλη της 

    γραμμής  Begin   if t[g][s]=KANENAS then write('_'); Γράψε κενό, Χ ή Ο ανάλογα  if t[g][s]=AN0ROPOS then write('X'); με το τι περιέχει ο πίνακας  if t[g][s]=COMPUTER then write('O'); μένοντας όμως στην ίδια   end; γραμμή της οθόνης.  writeln; Μετά πήγαινε στην επόμενη 

    γραμμή της οθόνης.  end;   writeln; Τέλος άφησε μια ακόμα  end; κενή γραμμή οθόνης.   {-----------------------------------------------} (Σχόλιο προγραμματιστή)   procedure PARE_KINHSH_XRHSTH; Διαδικασία που ζητά μία  var g,s:integer; έγκυρη θέση για να βάλει το   begin X του άνθρωπου‐παίχτη  write('Dialexe grammi:'); Ζήτα γραμμή  readln(g); Διάβασε γραμμή 

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 39 -

    write('Dialexe stili:'); Ζήτα στήλη  readln(s); Διάβασε στήλη  while (g3) or ή η στήλη που δόθηκε είναι  (s3) or ή   (t[g][s]KANENAS) do η θέση δεν είναι κενή…  begin   writeln('** LA0OS EPILOGH **'); … εμφανίζει μήνυμα και  write('3anadialexe grammi:'); ζητά μία νέα  readln(g); θέση για να βάλει το   write('3anadialexe stili:'); X του άνθρωπου‐παίχτη  readln(s);   end;   t[g][s]:=AN0ROPOS; Τέλος μαρκάρει τη θέση.  end;    {-----------------------------------------------} (Σχόλιο προγραμματιστή)  Διαδικασία που βρίσκει μία  procedure BRES_KINHSH_YPOLOGISTH; τυχαία έγκυρη θέση για να  var g,s:integer; βάλει το Ο του computer‐

    παίχτη.  begin [Όχι και η καλύτερη 

    στρατηγική βέβαια]  g:=random(3)+1; Ψευδοτυχαία γραμμή από το 

    1 έως το 3  s:=random(3)+1; Ψευδοτυχαία στήλη  από το 

    1 έως το 3  write('SKEFTOMAI...');   while (t[g][s]KANENAS) do Όσο η θέση δεν είναι κενή  begin   write('.'); … δοκιμάζει νέα  g:=random(3)+1; … ψευδοτυχαία γραμμή  s:=random(3)+1; … και στήλη.  end;   writeln;   t[g][s]:=COMPUTER; Τέλος μαρκάρει τη θέση.  end;    {-----------------------------------------------} (Σχόλιο προγραμματιστή)  Διαδικασία που ερευνά αν  procedure BRES_NIKHTH; υπάρχει νικητής στο 

    παιχνίδι (καλείται μετά από κάθε κίνηση)  

    var g,s,c:integer;   begin   Αρχικά θεώρησε ότι δεν  nikiths := AGNWSTOS; υπάρχει νικητής..    for g:=1 to 3 do Για κάθε γραμμή…  begin βάλε στο c τον παίχτη που  c:= t[g][1]; έχει καταλάβει την πρώτη 

    στήλη της γραμμής.  if (cKANENAS) and Αν η  θέση δεν είναι κενή..  (t[g][2]=c) and …και στη 2η στήλη είναι ό   (t[g][3]=c) then ίδιος … όπως και στην 3η  nikiths := c; …τότε ο παίχτης νίκησε.  end;     for s:=1 to 3 do Για κάθε στήλη…  begin Βάλε στο c τον παίχτη που  c:= t[1][s]; έχει καταλάβει την πρώτη 

  • ΑΤΕΙ ΠΑΤΡΑΣ Τμ. Ηλεκτρολογίας - 40 -

    γραμμή  της στήλης.  if (cKANENAS) and Αν η  θέση δεν είναι κενή..  (t[2][s]=c) and …και στη 2η στήλη είναι ό   (t[3][s]=c) then ίδιος… όπως και στην 3η  nikiths := c; …τότε ο παίχτης νίκησε.  end;   Βάλε στο c τον παίχτη που  c:= t[1][1]; έχει καταλάβει την θέση 1,1.  if (cKANENAS) and Αν η  θέση δεν είναι κενή..  (t[2][2]=c) and …και η θέση 2,2 είναι του   (t[3][3]=c) then ίδιου…όπως και η 3,3…  nikiths := c; τότε νίκησε (διαγώνιος).    c:= t[1][3]; Βάλε στο c τον παίχτη που  if (cKANENAS) and έχει καταλάβει την θέση 1,3.  (t[2][2]=c) and Αν η  θέση δεν είναι κενή..  (t[3][1]=c) then …και η θέση 2,2 είναι του   nikiths := c; ίδιου…όπως και η 3,1…  τότε νίκησε (2η διαγώνιος).  if nikiths = AGNWSTOS then Αν παρόλα αυτά δεν 

    βρέθηκε νικητής, τότε  begin   nikiths:= KANENAS; Θεώρησε ισοπαλία, αλλά  for g:=1 to 3 do για κάθε γραμμή και στήλη  for s:=1 to 3 do έλεγξε αν υπάρχει κενή   if t[g][s]=KANENAS then θέση, οπότε το παιχνίδι   nikiths:=AGNWSTOS; συνεχίζεται και ο νικητής  end; είναι ακόμα άγνωστος. end;    {-----------------------------------------------} (Σχόλιο προγραμματιστή) {-----------TO KYRIWS PROGRAMMA-----------------} Το κυρίως πρόγραμμα… {-----------------------------------------------}    begin    nikiths:=AGNWSTOS; Αρχικά δεν υπάρχει νικητής ARXIKOPOIHSE_PINAKA; Καλεί/τρέχει την διαδικασία while nikiths=AGNWSTOS do Όσο δεν υπάρχει νικητής…  begin   EMFANISE_PINAKA; Καλεί διαδικασία εμφάνισης  if nikiths=AGNWSTOS then PARE_KINHSH_XRHSTH; Παίζει ο χρήστης  BRES_NIKHTH; Καλεί διαδικασία νικητή  if nikiths=AGNWSTOS then BRES_KINHSH_YPOLOGISTH; Παίζει ο υπολογιστής  BRES_NIKHTH; Καλεί διαδικασία νικητή  end;   Το παιχνίδι τελείως … EMFANISE_PINAKA; εμφάνισε πίνακα και if(nikiths=KANENAS) then writeln('ISOPALIA!'); ..αποτελέσματα. if(nikiths=AN0ROPOS) then writeln('KERDISES!');  if(nikiths=COMPUTER) then writeln('EXASES!');    end.   Θέματα για παραδείγματα που απευθύνονται σε πιο προχωρημένα επίπεδα :

    Εντολή CASE, Σύνολα (SET) , Εγγραφές (RECORD) , Μονο/πολυδιάστατοι πίνακες που περιέχουν εγγραφές , Εγγραφές που περιέχουν μονο/πολυδιάστατους πίνακες, Δείκτες , Δομές δεδομένων που χρησιμοποιούν τα παραπάνω.