Μετάβαση στο περιεχόμενο

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών — Σεπτέμβριος 2021 — Θέμα 3

Μεταγραφή από τη φωτογραφία 207706269_922958481597331_1641107443109661469_n.jpg.

207706269_922958481597331_1641107443109661469_n.jpg

ΘΕΜΑ 3

Δίνονται τα παρακάτω δύο προγράμματα μιας γλώσσας προγραμματισμού η οποία όσον αφορά το συντακτικό και τη γενική δομή των προγραμμάτων της είναι τύπου Pascal, ενώ υιοθετεί τις τεχνικές μεταβίβασης παραμέτρων καθώς και τη σημειογραφία και τη λειτουργικότητα δεικτών (pointers) της C. Τα προγράμματα εκτελούνται σε έναν compiler ο οποίος στην εντολή ανάθεσης προσδιορίζει πρώτα την l-value (αν χρειάζεται να προσδιοριστεί).

a. Ποιες είναι οι ομοιότητες και οι διαφορές των δύο προγραμμάτων, ιδιαίτερα όσον αφορά τον τρόπο μεταβίβασης παραμέτρων, τις μεταβλητές και τις σχέσεις τους; b. Ποια είναι τα περιβάλλοντα αναφοράς των P και MAIN στο Πρόγραμμα A; c. Στα παραπάνω δύο προγράμματα υπάρχει μία εντολή η οποία δεν είναι σωστή από σημασιολογική άποψη και θα προκαλέσει error. Ποια είναι και γιατί; Σβήστε την εντολή από τον κώδικα. d. Ποια είναι η έξοδος των δύο προγραμμάτων κατά την εκτέλεσή τους; Εξηγείστε τις αλλαγές τιμών όλων των μεταβλητών κατά τη διαδικασία υπολογισμού. e. Ποια θα ήταν η έξοδος του Προγράμματος A κατά την εκτέλεσή του, αν υποθέταμε ότι η μεταβίβαση παραμέτρων γινόταν με τους παρακάτω δύο τρόπους (παρουσιάστε και εξηγείστε τις αλλαγές τιμών όλων των μεταβλητών κατά τη διαδικασία υπολογισμού): i. Κλήση με τιμή – αποτέλεσμα (call by value – result) ii. Κλήση με όνομα (call by name)

Πρόγραμμα A

program MAIN;
    var n: integer;
        a: array [0..10] of integer;

    function P(x: integer): integer;
    begin
        write(x);
        n:= n + 2;
        write(x);
        x:= x + 5;
        P:= x;
    end;

BEGIN
    n:= 0;
    a[0]:= 0; a[1]:= 1; a[2]:= 2;
    a[3]:= 3; a[4]:= 4; a[5]:= 5;
    a[6]:= x;
    a[n+4]:= P(a[n+3]);
    write(a[1]);
    write(a[2]);
    write(a[3]);
    write(a[4]);
    write(a[5]);
END.

Πρόγραμμα B

program MAIN;
    var n: integer;
        a: array [0..10] of integer;

    function P(*x: integer): integer;
    begin
        write(*x);
        n:= n + 2;
        write(*x);
        *x:= *x + 5;
        P:= *x;
    end;

BEGIN
    n:= 0;
    a[0]:= 0; a[1]:= 1; a[2]:= 2;
    a[3]:= 3; a[4]:= 4; a[5]:= 5;
    a[6]:= x;
    a[n+4]:= P(&a[n+3]);
    write(a[1]);
    write(a[2]);
    write(a[3]);
    write(a[4]);
    write(a[5]);
END.
Λύσεις (⚪ AI, μη επαληθευμένο)

Κατάσταση: ⚪ AI, μη επαληθευμένο Πηγή: λύσεις AI (gemini-3.7-flash, sonnet), ανεξάρτητη επανάληψη και αντιπαραβολή· καμία δεν έχει ελεγχθεί από άνθρωπο

Προσοχή

Λύση από AI — ελέγξτε την· δεν έχει επαληθευτεί από άνθρωπο. Η ένδειξη «δύο λύσεις συμφωνούν» δεν σημαίνει ότι η απάντηση είναι σωστή.

AI λύσεις — 2021-09

Οι λύσεις γράφτηκαν από μοντέλα AI και δεν έχουν ελεγχθεί από άνθρωπο. Η αρίθμηση ακολουθεί το αρχείο θεμάτων.

Θέμα 3

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: μέτρια

Η εντολή a[6]:= x στο MAIN χρησιμοποιεί το x, που δεν δηλώνεται στο MAIN (είναι παράμετρος της P και δεν φαίνεται εκεί) ⇒ σημασιολογικό λάθος (αδήλωτη μεταβλητή) και στα δύο προγράμματα· διαγράφεται. Άρα \(n=0\) και \(a[i]=i\) για \(i=0..5\).

Η ανάθεση a[n+4]:= P(…) ορίζει πρώτα την l-value: με \(n=0\) είναι το \(a[4]\) (πριν η P αλλάξει το \(n\)). Το όρισμα είναι το στοιχείο \(a[n+3]=a[3]=3\).

a. Ομοιότητες/διαφορές: Ίδια δομή και ίδια λογική στη συνάρτηση: διαβάζει την παράμετρο, αυξάνει το καθολικό n κατά 2, την ξαναδιαβάζει, προσθέτει 5 και επιστρέφει. Στο Α η παράμετρος x περνά με τιμή (αντίγραφο του \(a[3]\))· η αύξηση του x δεν επηρεάζει τον πίνακα. Στο Β περνά δείκτης &a[n+3] (εξομοίωση κλήσης με αναφορά)· το *x είναι ο ίδιος ο \(a[3]\) και η αύξηση φαίνεται στον πίνακα. Το n και ο πίνακας a είναι καθολικά και κοινά.

b. Περιβάλλοντα αναφοράς (Πρόγραμμα Α): - MAIN: τοπικά {n, a, P}, μη τοπικά κανένα, καθολικά {n, a, P}. - P: τοπικά {x}, μη τοπικά {n, a, P}, καθολικά {n, a, P}.

c. Σημασιολογικά λάθος: η a[6]:= x (αδήλωτο x στο MAIN), και στα δύο προγράμματα.

d. Έξοδος.

Πρόγραμμα Α (τιμή): \(x=3\). write(x)→3. \(n:=2\). write(x)→3. \(x:=8\). \(P:=8\). \(a[4]:=8\). Γράφονται \(a[1..5]=1,2,3,8,5\). Έξοδος: 3 3 1 2 3 8 5.

Πρόγραμμα Β (δείκτης): x=&a[3]. write(*x)→3. \(n:=2\). write(*x)→3 (ο δείκτης δείχνει ακόμα στο \(a[3]\)). *x:=8 ⇒ \(a[3]=8\). \(P:=8\). \(a[4]:=8\). Γράφονται \(a[1..5]=1,2,8,8,5\). Έξοδος: 3 3 1 2 8 8 5.

e. Πρόγραμμα Α με άλλες μεταβιβάσεις:

i. Τιμή–αποτέλεσμα: η διεύθυνση του πραγματικού (\(a[3]\), με \(n=0\)) καθορίζεται στην κλήση. \(x=3\): write→3, \(n:=2\), write→3, \(x:=8\). Στην έξοδο το \(x\) αντιγράφεται στο \(a[3]\) ⇒ \(a[3]=8\). \(a[4]:=8\). Γράφονται 1, 2, 8, 8, 5. Έξοδος: 3 3 1 2 8 8 5. (Αν η διεύθυνση υπολογιζόταν στην έξοδο με \(n=2\) θα γινόταν \(a[5]=8\) και η έξοδος θα ήταν 3 3 1 2 3 8 8· η συνήθης σύμβαση είναι στην κλήση.)

ii. Κλήση με όνομα: το x αντικαθίσταται από a[n+3] και υπολογίζεται σε κάθε χρήση. write(x) με \(n=0\): \(a[3]=3\). \(n:=2\). write(x): \(a[5]=5\). x:=x+5 ⇒ \(a[5]:=10\). \(P:=x=a[5]=10\). \(a[4]:=10\). Γράφονται \(a[1..5]=1,2,3,10,10\). Έξοδος: 3 5 1 2 3 10 10.

✔ Επιβεβαίωσε · ✖ Βρήκα λάθος


✖ Βρήκα λάθος στη μεταγραφή