Εργασίες Αυτοαξιολόγησης

Δίδεται γραμματική σε BNF όπου το αρχικό σύμβολο είναι το E, τα τερματικά είναι με πεζα, τα μη τερματικά με κεφαλαια και οι κανόνες είναι

Ε : Ε Ε O | id
O  :  + | - | * | /

Εξετάστε την συντακτική ορθότητα των συμβολοσειρών που ακολουθούν, εντοπίστε και αιτιολογήστε ΟΛΑ τα λάθη τους.  Δώστε κανόνες παραγωγής ή το συντακτικό δένδρο για τις σωστές συμβολοσειρές.

1)    E : id * id + id
2)    id id + id / id
3)    id id id + *
4)    id id + id id + * id -


Βρείτε θεωρητικά και επιβεβαιώστε πρακτικά τον μικρότερο πραγματικό αριθμό ε (float, double), όπου

α) 0.0+ε >0.0
β) 1.0+ε > 1.0,
και εν γένει
γ) 2n+ε > 2 για n > 2.

2. Υπολογίστε την σειρά Σ (1/n*n) με δυο τρόπους
α) από τον μεγαλύτερο όρο ως τον μικρότερο
β) από τον μικρότερο ως τον μεγαλύτερο.

Σχολιάστε τα αποτελέσματα και συκρίνετε με το μαθηματικό αποτέλεσμα.

3. Υπολογίστε την σειρά
sin(x)=Σ ((-1)n * x (2n+1) / (2n+1)!)
Επιβεβαιώστε τα αποτελέσματα του Cantrell (δες υλικό μαθήματος, αριθμητική) και σχολιάστε.

Υπολογίστε επίσης ως διαφορά 2 αθροισμάτων (θετικών και αρνητικών όρων)

Προσοχή στον τρόπο υπολογισμού των όρων!!!

4. Εντοπίστε τους ακεραίους Ν (1..Maxint) που (1.0/Ν)*Ν != 1.0
Δοκιμάστε με float και double. (Στο υλικό μαθήματος θα βρείτε μερικά έτοιμα προγράμματα)


1. Εξηγήστε τον χρόνο ζωής (lifetime), πρόσβαση (accessibility)
α) μιας κανονικής τοπικής μεταβλητής (local)
β) μιας στατικής τοπικής μεταβλητής (static)
γ) μιας καθολικής μεταβλητής (global)
δ) ενός δυναμικά δημιουργημένου αντικειμένου (heap)
Αναπτύξτε πρόγραμμα(τα) C που να επιδεικνύει/ουν τα ανωτέρω.

2. Αναπτύξτε πρόγραμμα C που να εξαντλεί την stack
α) με δήλωση ενός μεγάλου πίνακα
β) με αναδρομή (χάριν παραδείγματος μπορεί να είναι ατέρμονη)
γ) συνδυασμό των α (μικρός τοπικός πίνακας) και β (αναδρομή)

3. Αναπτύξτε πρόγραμμα που να εξαντλεί την heap
a) φτιάχνοντας μια χρήσιμη δομή (π.χ. συνδεδεμένη λίστα)
β) δημιουργώντας άχρηστη μνήμη (garbage)

4. Κατασκευάστε πρόγραμμα που να εξαντλεί όλη την μνήμη χρησιμοποιώντας static local μεταβλητές. Δείξτε ότι δεν απαιτείται η κλήση των συναρτήσεων που περιέχουν τις static μεταβλητές για να εξαντληθεί ο χώρος μνήμης.

5. Κατασκευάστε πρόγραμμα με αιωρούμενους δείκτες α) στην stack β) στην heap.


1. Αναπτύξτε πρόγραμμα C όπου ένα όνομα αναφέρεται σε ένα ή πολλά αντικείμενα στη μνήμη. Εξηγήστε με πιο αντικείμενο συνδέεται (binded) το όνομα.
2. Αναπτύξτε πρόγραμμα όπου σε ένα αντικείμενο μπορεί να αναφέρονται κανένα, ένα ή πολλά ονόματα.
3. Εξετάστε δηλώσεις σταθερών(με #define και qualifier const). Δώστε παραδείγματα. Μπορείτε να αλλάξετε μια const μεταβλητή εμέσως;
4. Επιδείξτε τον κανόνα της εμβέλειας σε πρόγραμμα.
5. Πότε η εμβέλεια ενός ονόματος δεν είναι ίδια με την διάρκεια ζωής του; Δώστε παραδείγματα.
   

1. Αναπτύξτε 3 υποπρογράμματα με μία by-value παράμετρο, τύπου α) int,
β) pointer to int,
γ) array of int, αντίστοιχα.
Καλέστε κάθε υποπρόγραμμα 3 φορές χρησιμοποιώντας ως πραγματική παράμετρο
ι) μια σταθερά τιμή,
ιι) ένα αντικείμενο στη stack και
ιιι) ένα αντικείμενο στην heap.
Τι τιμές μπορεί να πάρει η παράμετρος στο εσωτερικό της ρουτίνας; (Εξετάστε όλες τις περιπτώσεις). Τι τιμές μπορεί να πάρει η παράμετρος μετά την έξοδο από την ρουτίνα; (Πάλι όλες τις περιπτώσεις)

2. Ως άνω, αλλά με by-reference παραμέτρους.

3. Αναπτύξτε πρόγραμμα που να δείχνει ότι δεν πρέπει να υποθέτουμε ότι οι πραγματικοί παράμετροι (έστω by-value) υπολογίζονται από αριστερά προς τα δεξιά.

4. Υπάρχει τρόπος να αλλάξουμε την τιμή μιας static μεταβλητής έξω από την ρουτίνα που δηλώνεται;