Skip to content

Latest commit

 

History

History
345 lines (209 loc) · 12.6 KB

Macros.el.md

File metadata and controls

345 lines (209 loc) · 12.6 KB

PROGRAM

Αυτή η εντολή ορίζει το σημείο εκκίνησης του προγράμματος. Επομένως, ο κύριος κώδικάς σου θα πρέπει να περικλείεται από ένα μπλοκ PROGRAM {}.

#include "pzhelp"

PROGRAM {
  WRITELN("Hello world!");
}

PROC

Δηλώνει μία διαδικασία, δηλαδή μία συνάρτηση που δεν επιστρέφει τιμή.

PROC hello_world() {
  WRITELN("Hello world!");
  // δεν επιστρέφει τιμή
}

FUNC

Δηλώνει μία συνάρτηση.

FUNC int square(int x) {
  return x * x;
}

READ_INT

Διαβάζει έναν ακέραιο αριθμό από τον χρήστη και επιστρέφει την τιμή του.

int age = READ_INT();

READ_REAL

Διαβάζει έναν πραγματικό αριθμό από τον χρήστη και επιστρέφει την τιμή του.

REAL height = READ_REAL();

READ_STRING

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

char * name;
READ_STRING(20, name);

ή συντομότερα,

char * name = READ_STRING(20, name);

SKIP_LINE

Παραλείπει μία γραμμή από την είσοδο του χρήστη, διαβάζοντας και αγνοώντας χαρακτήρες μέχρι να διαβάσει new line ή να φτάσει στο τέλος του αρχείου (EOF).

SKIP_LINE();

WRITE

Δέχεται μία λίστα παραμέτρων, οι οποίες μπορούν να είναι μεταβλητές οποιουδήποτε τύπου, και τις τυπώνει στον χρήστη διαχωρισμένες με κενά. Οι τύποι μεταβλητών που υποστηρίζονται είναι τα int (περιλαμβάνονται και τα unsigned, long ή long long), τα REAL, τα float, τα double, τα character, τα string και τα boolean.

Τα REAL, τα float και τα double τυπώνονται πάντοτε με ακρίβεια έξι δεκαδικών ψηφίων.

WRITE(42, 3.14, ',', "no man is an island");

WRITELN

Επιτελεί την ίδια λειτουργία με την WRITE, μόνο που μετά το τέλος της εξόδου τυπώνει και μία νέα γραμμή.

WRITELN("This string will be printed on its own line");

INPUT

Ανοίγει το αρχείο που αντιστοιχεί στο path που δίνεται ως παράμετρος, και ανακατευθύνει το stdin σε αυτό το αρχείο. Αυτό σημαίνει ότι κάθε μέθοδος εισόδου, όπως είναι η READ_INT, η READ_STRING κλπ. στο εξής θα διαβάζει από το αρχείο αντί να διαβάζει από το standard input.

INPUT("grades.csv");
char * first_entry = READ_STRING(100, first_entry);

OUTPUT

Ανοίγει το αρχείο που αντιστοιχεί στο path που δίνεται ως παράμετρος, και ανακατευθύνει το stdout σε αυτό το αρχείο. Αυτό σημαίνει ότι κάθε μέθοδος εξόδου, όπως είναι η WRITE, η WRITELN κλπ. στο εξής θα τυπώνει σε αυτό το αρχείο αντί να τυπώνει στο standard output.

OUTPUT("results.txt");
WRITELN("This will be stored in the results.txt file");

Επανάληψη FOR

Εκτελεί ένα μπλοκ κώδικα για έναν δεδομένο αριθμό επαναλήψεων. Ελέγχει επίσης αν η μεταβλητή ελέγχου ή το όριο του loop μεταβάλλονται μέσα στο μπλοκ, οπότε και εμφανίζει κατάλληλο σφάλμα.

Χρειάζεται να ορίσεις τις εξής παραμέτρους:

  • Μεταβλητή ελέγχου: Η μεταβλητή που χρησιμοποιείται για να ελέγχονται τα όρια του loop, και η οποία θα αλλάζει σε κάθε επανάληψη. Πρέπει να έχει δηλωθεί πριν από το μπλοκ επανάληψης.
  • Τιμή έναρξης: Αυτή θα είναι η αρχική τιμή της μεταβλητής ελέγχου, δηλαδή η τιμή που θα πάρει στην πρώτη επανάληψη.
  • Τιμή λήξης: Αυτή θα είναι η τελική τιμή της μεταβλητής ελέγχου, δηλαδή η τιμή που θα πάρει στην τελευταία επανάληψη. Προσέξτε ότι το loop δεν τερματίζεται μόλις η μεταβλητή ελέγχου πάρει αυτήν την τιμή, αλλά μόλις τελειώσει η σχετική επανάληψη.
  • Τιμή βήματος: Αυτό θα είναι το βήμα κατά το οποίο η μεταβλητή ελέγχου θα αυξάνεται ή θα μειώνεται. Αν το βήμα είναι τέτοιο ώστε η μεταβλητή ελέγχου να μην μπορεί να πάρει ακριβώς την τελική τιμή, το loop θα τερματιστεί μόλις ξεπεραστεί η τελική τιμή.

Η σύνταξη της επανάληψης FOR είναι αρκετά απλή. Ακολουθούν παραδείγματα:

int i;
// Χρησιμοποίησε "TO" μεταξύ της αρχικής και της τελικής τιμής όταν η μεταβλητή ελέγχου αυξάνεται
FOR(i, 1 TO 10) {
    WRITE(i, ' '); // αποτέλεσμα: 1 2 3 4 5 6 7 8 9 10
}
int i;
// Χρησιμοποίησε "DOWNTO" όταν η μεταβλητή ελέγχου μειώνεται
FOR(i, 10 DOWNTO 1) {
    WRITE(i, ' '); // αποτέλεσμα: 10 9 8 7 6 5 4 3 2 1
}
int i;
// αυτό θα τυπώσει όλους τους ζυγούς αριθμούς από το 2 μέχρι το 20
FOR(i, 2 TO 20 STEP 2) {
    WRITE(i, ' '); // αποτέλεσμα: 2 4 6 8 10 12 14 16 18 20
}
int i;
// συνδυασμός των παραπάνω
FOR(i, 17 DOWNTO -5 STEP 4) {
    WRITE(i, ' '); // αποτέλεσμα: 17 13 9 5 1 -3
}

MOD

Επιστρέφει το υπόλοιπο της Ευκλείδιας διαίρεσης μεταξύ δύο τελεστέων. Αν χρησιμοποιηθούν αρνητικοί αριθμοί, τότε το πρόσημο του υπολοίπου θα είναι το ίδιο με αυτό του διαιρετέου.

int r = 42 MOD 17;

AND

Επιστρέφει το αποτέλεσμα της πράξης AND μεταξύ δύο boolean τελεστέων. Επομένως, επιστρέφει true αν και μόνο αν και οι δύο τελεστέοι έχουν boolean τιμή ίση με true.

if(hour >= 5 AND hour < 12) {
    WRITELN("Good morning!");
}

OR

Επιστρέφει το αποτέλεσμα της πράξης OR μεταξύ δύο boolean τελεστέων. Επομένως, επιστρέφει true αν και μόνο αν τουλάχιστον ένας από τους δύο τελεστέους έχει boolean τιμή ίση με true.

if(day == 6 OR day == 7) {
    WRITELN("It's weekend, let's PaRtY!");
}

NOT

Επιστρέφει το αρνητικό της boolean τιμής μιας έκφρασης.

if(NOT(month == 12 AND day == 7)) {
    WRITELN("It's not Noam Chomsky's birthday yet");
}

min

Επιστρέφει το ελάχιστο δύο αριθμών που δίνονται ως παράμετροι.

int answer = min(17, 42);

max

Επιστρέφει το μέγιστο δύο αριθμών που δίνονται ως παράμετροι.

int true_answer = max(17, 42);

NEW

Δεσμεύει δυναμικά μνήμη. Χρειάζεται να περάσεις ως πρώτη παράμετρο τον τύπο μεταβλητής που θα αποθηκευτεί, ώστε να δεσμευτεί ο σωστός αριθμός bytes.

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

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

int * shoe_size = NEW(int);
*shoe_size = 42;
// αυτό σου επιτρέπει να δηλώσεις έναν πίνακα του οποίου το μέγεθος ίσως να μην είναι γνωστό κατά τη μεταγλώττιση
int len = READ_INT();
int * shoe_sizes = NEW(int, len);

int i;
FOR(i, 0 TO len - 1) {
    shoe_sizes[i] = 42;
}

DELETE

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

DELETE(arr);

REAL

Το PZHelp ορίζει τον τύπο μεταβλητής REAL, ο οποίος χρησιμοποιείται για την αποθήκευση πραγματικών αριθμών. Οι μεταβλητές REAL μπορούν να κρατήσουν μέχρι 15 ή 16 ψηφία, συμπεριλαμβανομένων αυτών που βρίσκονται πριν την υποδιαστολή αλλά και μετά από αυτήν.

REAL pi = 3.14159265358979;

REAL_DIG

Το πλήθος των ψηφίων ακρίβειας στο δεκαδικό σύστημα για τον τύπο μεταβλητής REAL.

REAL_MIN

Ο ελάχιστος θετικός πραγματικός αριθμός που μπορεί να αναπαρασταθεί στον τύπο μεταβλητής REAL.

REAL_MAX

Ο μέγιστος αριθμός που μπορεί να αναπαρασταθεί στον τύπο μεταβλητής REAL.

REAL_EPSILON

Η διαφορά μεταξύ του αριθμού 1 και του ελάχιστου αριθμού που μπορεί να αναπαρασταθεί στον τύπο μεταβλητής REAL, ο οποίος είναι μεγαλύτερος του 1.