Θεωρία

Τα Βασικά Συστατικά ενός Προγράμματος της Pascal

Το κάθε πρόγραμμα που γράφουμε σε Pascal αποτελείται από τα εξής τρία συστατικά:

  • Επικεφαλίδα προγράμματος (Program heading) : program identifier(input, output); Είναι πιθανώς το μοναδικό αναγνωριστικό (identifier) που το γράφουμε μία μόνο φορά και με μήκος έως 64 χαρακτήρες. Άρα, μπορούμε να το κάνουμε να είναι αρκετά περιγραφικό.
  • Τμήμα δηλώσεων (Declaration section) : var const. Πρόκειται για μεταβλητές και σταθερές που τις δηλώνουμε εδώ και που θα τις χρησιμοποιήσουμε αργότερα στο πρόγραμμά μας. Εδώ δεν γίνεται καμία ενέργεια, αλλά απλά ενημερώνουμε την Turbo Pascal για το τι μεταβλητές και σταθερές θα χρειασθούμε αργότερα μέσα στο κυρίως πρόγραμμα.

Εκτελέσιμο τμήμα (Executable section) : begin … end. Βλέπουμε ότι η λέξη end ακολουθείται από μια τελεία, που υποδηλώνει και το τέλος ενός προγράμματος της Pascal. Ανάμεσα στα begin και end βρίσκονται όλες οι εντολές του προγράμματος, οι οποίες μπορούν να κάνουν εργασίες όπως λήψη (διάβασμα) στοιχείων, τροποποίησή τους και εμφάνισή τους (εκτύπωση) στην οθόνη (screen) ή στον εκτυπωτή (printer).

 

Οι Εκτελέσιμες Εντολές

Μια εκτελέσιμη εντολή (executable statement) αποτελείται από έγκυρα αναγνωριστικά (identifiers), δεσμευμένες λέξεις (reserved words), αριθμούς ή/και χαρακτήρες με την κατάλληλη στίξη. Κατά μια άποψη, μια εκτελέσιμη εντολή θυμίζει πολύ μια φράση μέσα σε μια πρόταση. Η κάθε εκτελέσιμη εντολή πρέπει να τερματίζει με τον χαρακτήρα ; (semicolon). Υπάρχει μία μόνο εξαίρεση σ’ αυτόν τον κανόνα όταν η εντολή ακολουθείται από τη δεσμευμένη λέξη END.

Η Turbo Pascal δεν απαιτεί από τις εκτελέσιμες εντολές να χωρίζονται με αλλαγές γραμμών αλλά μόνο η παρουσία του χαρακτήρα ; είναι απαραίτητη για να μπορούν να ξεχωρίζουν οι εντολές. Κάτι άλλο πολύ βασικό που πρέπει να τηρούμε είναι οι εσοχές (indentation) στις δομές των εντολών. Οι εσοχές δεν σημαίνουν τίποτα για την Pascal αλλά είναι πολύ βασικές για να μπορούμε να καταλάβουμε τον τρόπο λειτουργίας ενός προγράμματος.

 

Το Πρώτο Πρόγραμμα σε Pascal

Στη σύντομη ιστορία του προγραμματισμού των υπολογιστών έχει δημιουργηθεί μια παράδοση που λέει ότι το πρώτο πρόγραμμα που γράφουμε σε μια καινούργια γλώσσα που μαθαίνουμε είναι πάντα το “Hello, world”. Έτσι, δεν έχουμε παρά να αντιγράψουμε τον παρακάτω κώδικα σ’ έναν κειμενογράφο (text editor), να τον αποθηκεύσουμε ως αρχείο με όνομα για παράδειγμα prog01.pas, να τον μεταγλωττίσουμε (compile) και να τον εκτελέσουμε (run) :

 

program Hello;begin (* Κυρίως πρόγραμμα – αρχή *)

writeln(‘Hello, world.’)

end. (* Κυρίως πρόγραμμα – τέλος *)

 

Η έξοδος που θα δημιουργηθεί θα είναι ως εξής :

Hello, world.

 

Δομή ενός Προγράμματος σε Pascal

Η βασική δομή (structure) ενός προγράμματος σε Pascal έχει ως εξής :

Program ProgramName (FileList);

Const (* Δηλώσεις Σταθερών – Constant declarations *)

Type (* Δηλώσεις Τύπων Δεδομένων – Type declarations *)

Var (* Δηλώσεις Μεταβλητών – Variable declarations *)

(* Ορισμοί Υποπρογραμμάτων – Subprogram definitions *)

Begin (* Εκτελέσιμες Εντολές *)

End.

 

Οι Μεταβλητές και οι Τύποι Δεδομένων

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


var IdentifierList1 : DataType1;

IdentifierList2 : DataType2;

IdentifierList3 : DataType3

;

Η IdentifierList είναι μια σειρά από αναγνωριστικά (identifiers), χωρισμένα με κόμματα. Όλα τα αναγνωριστικά της ίδιας λίστας δηλώνονται ότι ανήκουν στον ίδιο τύπο δεδομένων (data type).

Οι βασικοί τύποι δεδομένων της Pascal είναι οι εξής :

  • integer
  • real
  • char
  • Boolean

Περισσότερα στοιχεία για τους τύπους δεδομένων της Pascal :

  • Ο ακέραιος τύπος δεδομένων (integer) περιέχει ακέραιες τιμές από –32768 έως και 32767.
  • Ο πραγματικός τύπος δεδομένων (real) περιέχει θετικές τιμές από 3.4 x 10-38 έως και 3.4 x 1038.
  • Οι πραγματικές τιμές μπορούν να γραφούν είτε με τον συμβολισμό της σταθερής υποδιαστολής (fixed-point notation) είτε με τον επιστημονικό συμβολισμό (scientific notation), με τον χαρακτήρα Ε να διαχωρίζει τη βάση (mantissa) από τον εκθέτη (exponent). Έτσι, το 452.13 είναι το ίδιο με το 4.5213e2.
  • Ο τύπος δεδομένων χαρακτήρα (char) περιέχει χαρακτήρες (characters), τους οποίους θα πρέπει να περικλείσουμε με μονές αποστρόφους, ως εξής : ‘a’ ‘B’ ‘+’.
  • Ο τύπος δεδομένων Boolean έχει μόνο δύο δυνατές τιμές : TRUE και FALSE.

Ακολουθεί ένα παράδειγμα δήλωσης μεταβλητών :

var

age, year, bathmos : integer;

circumference : real;

LetterGrade : char;

Epityxia : Boolean;

Εκχωρήσεις και Τελεστές

Εφόσον έχουμε δηλώσει μια μεταβλητή, μπορούμε να αποθηκεύσουμε κάποια τιμή σ’ αυτήν. Η διαδικασία απόδοσης τιμής σε μια μεταβλητή αποκαλείται εκχώρηση (assignment). Για να εκχωρήσουμε μια τιμή σε μια μεταβλητή, χρησιμοποιούμε την εξής σύνταξη :

όνομα_μεταβλητής := έκφραση;

Αντίθετα μ’ άλλες γλώσσες προγραμματισμού, όπου ο τελεστής εκχώρησης είναι απλά το σύμβολο =, η Pascal χρησιμοποιεί τα σύμβολα :=. Ένας βασικός λόγος για τη χρήση και του συμβόλου : στην εκχώρηση των τιμών είναι για να μην μπερδεύουν οι αρχάριοι χρήστες της γλώσσας την εκχώρηση τιμής με τη σύγκριση δύο τιμών.

Επίσης, ο συμβολισμός := θυμίζει το σχήμα του συμβόλου ß  (βελάκι) και κάνει έτσι πιο κατανοητή την διαδικασία απόδοσης (εκχώρησης) μιας τιμής από τις πράξεις που γίνονται στο δεξί μέρος (έκφραση) και την καταχώρηση του αποτελέσματος στην μεταβλητή που βρίσκεται στο αριστερό μέρος.

Η έκφραση (expression) μπορεί να είναι μία μόνο τιμή :

apotelesma := 385.385837;

ή μπορεί να είναι μια πολύπλοκη αριθμητική παράσταση ;

apotelesma := 37573.5 * 37593 + 385.8 / 367.1;

Οι αριθμητικοί τελεστές της Pascal είναι οι εξής :

Τελεστής Πράξη Τελεστέοι Αποτέλεσμα
+ Πρόσθεση real ή integer real ή integer
Αφαίρεση real ή integer real ή integer
* Πολλαπλασιασμός real ή integer real ή integer
/ Πραγματική διαίρεση real ή integer real
div Πηλίκο ακέραιης διαίρεσης integer integer
mod Υπόλοιπο ακέραιης διαίρεσης integer integer

Οι τελεστές div και mod εργάζονται μόνο με ακέραιες τιμές. Ο τελεστής / εργάζεται και με ακέραιες και με πραγματικές τιμές αλλά έχει πάντα ως αποτέλεσμα μια πραγματική τιμή. Οι υπόλοιποι τελεστές εργάζονται και με ακέραιες και με πραγματικές τιμές. Για τους τελεστές που δέχονται και ακέραιες και πραγματικές τιμές, το αποτέλεσμα θα είναι ακέραιος αριθμός μόνο αν όλοι οι τελεστέοι είναι ακέραιοι, ενώ θα είναι πραγματικός αριθμός αν έστω και ένας από τους τελεστέους είναι πραγματικός.

Έτσι, το αποτέλεσμα της παρακάτω πράξης

3857 + 68348 * 38 div 56834

θα είναι ακέραιος αριθμός (integer), ενώ το αποτέλεσμα της παρακάτω πράξης

38573 div 34739 mod 372 + 35730 – 38834 + 1.1

θα είναι πραγματικός αριθμός, επειδή ο 1.1 είναι πραγματικός.

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

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

var

some_int : integer;

some_real : real;

Τότε, όταν εκτελεσθούν οι παρακάτω εντολές :

some_int := 375;

some_real := some_int;

η μεταβλητή some_real θα έχει την τιμή 375.0 ή 3.75e2.

Στην Pascal μπορούμε να χρησιμοποιήσουμε το σύμβολο – για να δηλώσουμε έναν αρνητικό αριθμό και παρόμοια μπορούμε να χρησιμοποιήσουμε το σύμβολο + για να δηλώσουμε έναν θετικό αριθμό.

Δεν είναι σωστό να χρησιμοποιούμε δύο τελεστές δίπλα-δίπλα, όπως εδώ :

some_real := 37.5 * –2;

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

some_real := 37.5 * (-2);

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

  • * / div mod + –

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

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

Έτσι, για παράδειγμα, η τιμή της έκφρασης 3.5 * (2 + 3) θα είναι ίση με 17.5. Δηλαδή γίνεται πρώτα η πράξη της πρόσθεσης μέσα στην παρένθεση και μετά ο πολλαπλασιασμός.

 

Παραδείγματα Προγραμμάτων σε Pascal

Program prostesi;    { όνομα ή επικεφαλίδα ή τίτλος του προγράμματος } (* αυτό το πρόγραμμα προσθέτει δύο αριθμούς *)

Uses

            Crt;     { δήλωση της μονάδας Crt, που περιέχει συναρτήσεις οθόνης }

Var      { τμήμα δηλώσεων του προγράμματος }

a, b, c : Real; { δήλωση τριών αριθμητικών μεταβλητών }

Begin  { αρχή του κυρίου προγράμματος, δηλ. των εντολών }

Read(a, b);     { διάβασμα τιμών για δύο μεταβλητές }

c := a+b;       { υπολογισμός του αθροίσματος σε μια τρίτη μεταβλητή }

Write(c)          { εμφάνιση της τιμής της μεταβλητής στην οθόνη }

End. { τέλος του προγράμματος }

(* ο χαρακτήρας ; χρησιμοποιείται για να δηλώσει το τέλος μιας εντολής και έχει λίγες μόνο εξαιρέσεις και το σύμβολο := χρησιμοποιείται για να καταχωρούμε τιμές σε μεταβλητές *)

 

Program fahr_cel;

(* πρόγραμμα μετατροπής θερμοκρασίας Φαρενάιτ σε Κελσίου *)

(* ο τύπος μετατροπής είναι ο εξής : CEL = ((FAHR – 32) * 5) / 9 *)

Uses

Crt;

Const

factor = 32.0;            { δήλωση μιας σταθεράς }

Var

bath_fahr, bath_cel : Real;

{ bath_fahr είναι οι βαθμοί Φαρενάιτ και bath_cel είναι οι βαθμοί Κελσίου }

Begin

Writeln(‘Μετατροπή θερμοκρασίας από βαθμούς Φαρενάιτ ‘);

Writeln(‘σε βαθμούς Κελσίου’);

Writeln;         { αφήνει μια κενή γραμμή στην οθόνη }

Write(‘Δώσε τη θερμοκρασία σε βαθμούς Φαρενάιτ : )’;

Readln(bath_fahr);  { διάβασμα της θερμοκρασίας σε Φαρενάιτ }

{ υπολογισμός της θερμοκρασίας σε βαθμούς Κελσίου }

bath_cel := ((bath_fahr-factor)*5.0)/9.0;

Writeln(‘Αντιστοιχεί σε ‘, bath_cel, ‘βαθμούς Κελσίου’);

Writeln;         { αφήνει μια κενή γραμμή στην οθόνη }

End.

 

Program misthos;

(* αυτό το πρόγραμμα κάνει υπολογισμό μισθοδοσίας *)

Uses

            Crt;

Var

HM, ME, MA, KP, KA : Real;

{ ΗΜ είναι το ημερομίσθιο, ΜΕ είναι οι μέρες εργασίας, ΜΑ είναι οι μικτές αποδοχές, ΚΡ είναι οι κρατήσεις και ΚΑ είναι οι καθαρές αποδοχές }

Begin

Read(HM, ME);

MA := ME*HM;

KP := 0.20*MA;

KA := MA-KP;

Write(MA, KP, KA)

End.