ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Α Περιόδου 2017 (27/1/2017) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:............................................... Θέμα 1 (50/100): Επιλέξτε στις παρακάτω ερωτήσεις ή δηλώσεις τη σωστή απάντηση. Κάθε σωστή απάντηση προσθέτει 2 μονάδες στον τελικό βαθμό και κάθε λάθος απάντηση αϕαιρεί 1 μονάδα από τον τελικό βαθμό. 1. Η γραμμή ενός πηγαίου αρχείου C #include <stdlib.h> απευθύνεται στον... Α.... προεπεξεργαστή Β.... μεταγλωττιστή Γ.... συνδέτη 2. Η μνήμη που χρειάζεται για να αποθηκευθεί μία μεταβλητή τύπου unsigned int σε σχέση με τη μνήμη που χρειάζεται για να αποθηκευθεί μία μεταβλητή τύπου signed int είναι... Α.... περισσότερη Β.... λιγότερη Γ.... ακριβώς ίδια 3. Σε ποιο εύρος μπορούν να κυμανθούν οι τιμές μίας signed char μεταβλητής στη C; Α. [-128,127] Β. [-127,128] Γ. [-128,128] 4. Ο αριθμός 111 του δεκαδικού συστήματος αρίθμησης γράϕεται στο δυαδικό σύστημα και στο δεκαεξαδικό σύστημα ως... Α.... 01111111 και 7F, αντίστοιχα Β.... 01101111 και 6F, αντίστοιχα Γ.... 11111111 και FF, αντίστοιχα 5. Αν η x είναι ακέραια μεταβλητή, ποια τιμή θα πάρει μετά την εντολή x = (5 > 2) + (3 < 8) + (y = 4); Α. 4 Β. 5 Γ. 6 6. Για να πάρουμε το πηλίκο μίας unsigned int μεταβλητής με το 32, αρκεί να... Α.... ολισθήσουμε τη δυαδική αναπαράσταση της τιμής της πέντε θέσεις προς τα αριστερά, υπό την προϋπόθεση ότι τα bits που θα χαθούν θα είναι όλα μηδενικά Β.... ολισθήσουμε τη δυαδική αναπαράσταση της τιμής της πέντε θέσεις προς τα δεξιά Γ.... ολισθήσουμε τη δυαδική αναπαράσταση της τιμής της πέντε θέσεις προς τα δεξιά, υπό την προϋπόθεση ότι τα bits που θα χαθούν θα είναι όλα μηδενικά 7. Οταν μία εξωτερική μεταβλητή δηλωθεί σαν static,... Α.... ϕυλάσσεται στη στοίβα Β.... ϕυλάσσεται στον σωρό Γ.... η δήλωσή της ισχύει μόνο για το αρχείο μέσα στο οποίο ορίζεται 8. Τι είναι το stdlib.h; Α. Το αρχείο επικεϕαλίδας της πρότυπης βιβλιοθήκης της C Β. Η πρότυπη βιβλιοθήκη της C Γ. Η πλήρης βιβλιοθήκη συναρτήσεων της C 9. Μία συμβολοσειρά στη C είναι... Α.... μία λίστα από χαρακτήρες Β.... ένας πίνακας ακεραίων Γ.... αδύνατον να τροποποιηθεί από κάποιο πρόγραμμα
10. Τι θα εκτυπωθεί από το παρακάτω τμήμα κώδικα C; signed char x = 120, y; y = x + 10; printf("%d\n", y); Α. 130 Β. -126 Γ. Τίποτα από τις άλλες επιλογές 11. Τι θα εκτυπωθεί από το παρακάτω τμήμα κώδικα C; Α. 5 Β. 9 Γ. 7 #define diff(a,b) A-B printf("%d\n", diff(8,2+1)); 12. Τι θα εκτυπωθεί από το παρακάτω τμήμα κώδικα C; int x = 7, y, *p; p = &x; y = *p++; printf("%d %d\n", x, y); Α. 7 7 Β. 7 8 Γ. Τίποτα, γιατί θα προκληθεί σϕάλμα κατά την εκτέλεση 13. Οι μακροεντολές στη C ορίζονται με... Α.... #ifdef Β.... #define Γ.... #ifndef 14. Τι θα εκτυπωθεί από το παρακάτω τμήμα κώδικα C; int x = -1, y = 7, z = 5, w; w = (x++) + (--y) * (++z); if (x++) w++; printf("%d\n", w); Α. 30 Β. 35 Γ. 36 15. Ποια τιμή επιστρέϕει η κλήση συνάρτησης strlen("0"); Α. NULL Β. 2 Γ. 1 16. Τι θα εκτυπωθεί από το παρακάτω τμήμα κώδικα C; int *p, x[] = {4, 3, 2, 1, 0}; p = x+3; x[1] = *--p; *p++ = --x[0]; *(p+1) = *p--; p += 4; p[-6]--; p = x-1; printf("%d %d %d %d %d %d\n", sizeof(x)/sizeof(int), x[0], x[1], x[2], x[3], x[4]); Α. 1 3 2 3 1 0 Β. 5 2 2 3 1 1 Γ. Τίποτα, γιατί θα προκληθεί σϕάλμα κατά την εκτέλεση
17. Αν η συνάρτηση f() είναι ορισμένη ως void f(int x) { if (x && (x-1) && (x-2)) { f(x-1); f(x-2); f(x-3); } } και κάνουμε την κλήση f(6), πόσες ϕορές θα κληθεί τελικά η f(0); Α. 4 Β. 5 Γ. 6 18. Οταν η main() συνάρτηση ενός προγράμματος επιστρέψει την τιμή 0, συμβατικά εννοούμε ότι... Α.... αυτό είναι το αποτέλεσμα του προγράμματος Β.... το πρόγραμμα τερμάτισε επιτυχώς Γ.... το πρόγραμμα τερμάτισε ανεπιτυχώς 19. Η συνάρτηση strcmp() της C... Α.... επιστρέϕει σε περίπτωση λάθους το -1 Β.... επιστρέϕει σε περίπτωση λάθους το NULL Γ.... δεν υπάρχει περίπτωση να επιστρέψει με ένδειξη λάθους 20. Σε ποια εντολή από τις παρακάτω το fun είναι δείκτης σε συνάρτηση; Α. int *fun(int *x); Β. int (*fun)(int *x); Γ. int **fun(int *x); 21. Αν για κάποιο λόγο αποτύχει η κλήση της συνάρτησης fopen(), αυτή επιστρέϕει... Α.... EOF Β.... NULL Γ.... -1 22. Αν ένα εκτελέσιμο πρόγραμμα, που έχει προκύψει από το πηγαίο πρόγραμμα C που ακολουθεί, κληθεί ως./myprog 5 7 τι θα εκτυπώσει; #include <stdio.h> int main(int argc, char **argv) { printf("%s\n", *argv); return 0; } Α../myprog 5 7 Β. myprog Γ../myprog 23. Σε μία απλά συνδεδεμένη λίστα, οι κόμβοι που ο δείκτης στον επόμενό τους ισούται με NULL είναι... Α.... τουλάχιστον ένας Β.... ακριβώς ένας Γ.... το πολύ ένας 24. Σε ένα ταξινομημένο δυαδικό δέντρο, τα βάθη του αριστερού και του δεξιού υποδέντρων του κόμβου-ρίζας... Α.... είναι πάντοτε ίσα Β.... είναι πάντοτε άνισα Γ.... ενδεχομένως να είναι ίσα 25. Ο ταχύτερος αλγόριθμος για να ελέγξουμε αν ένας πίνακας είναι ταξινομημένος έχει πολυπλοκότητα... Α.... O(n logn) Β.... O(n) Γ.... O(logn)
Θέμα 2 (30/100): Εϕ όσον η βαθμολογία στο Θέμα 1 είναι τουλάχιστον 10/50, στον τελικό βαθμό θα συνυπολογισθεί και η αξιολόγηση της απάντησής σας στο πρόβλημα που ακολουθεί. Γράψτε πρόγραμμα C το οποίο θα δέχεται στη γραμμή εντολής έναν ακέραιο N μεγαλύτερο του 1 και θα εκτυπώνει στην έξοδο, σε αύξουσα σειρά, όλους τους ακεραίους που είναι μικρότεροι ή ίσοι του N και οι οποίοι μπορούν να γραϕούν σαν άθροισμα δύο κύβων με τουλάχιστον δύο διαϕορετικούς τρόπους. Στην εκτύπωση να ϕαίνονται, για κάθε αριθμό, και τουλάχιστον δύο τρόποι που μπορεί να γραϕεί αυτός σαν άθροισμα δύο κύβων. Για παράδειγμα, ο αριθμός 1729 είναι τέτοιος αριθμός, αϕού 1729 = 1 3 + 12 3 = 9 3 + 10 3. Σημειώστε ότι δεν επιτρέπεται να χρησιμοποιήσετε πραγματικούς αριθμούς, συναρτήσεις της μαθηματικής βιβλιοθήκης και πίνακες (εξαιρείται το όρισμα argv[] της main()). Μία ενδεικτική εκτέλεση: $./taxicab 100000 1729 = 1^3 + 12^3 = 9^3 + 10^3 4104 = 2^3 + 16^3 = 9^3 + 15^3 13832 = 2^3 + 24^3 = 18^3 + 20^3 20683 = 10^3 + 27^3 = 19^3 + 24^3 32832 = 4^3 + 32^3 = 18^3 + 30^3 39312 = 2^3 + 34^3 = 15^3 + 33^3 40033 = 9^3 + 34^3 = 16^3 + 33^3 46683 = 3^3 + 36^3 = 27^3 + 30^3 64232 = 17^3 + 39^3 = 26^3 + 36^3 65728 = 12^3 + 40^3 = 31^3 + 33^3
Θέμα 3 (20/100): Εϕ όσον η συνολική βαθμολογία από τα Θέματα 1 και 2 είναι τουλάχιστον 40/80, στον τελικό βαθμό θα συνυπολογισθεί και η αξιολόγηση της απάντησής σας στο πρόβλημα που ακολουθεί. Θεωρήστε ότι ένας κόμβος λίστας ακεραίων ορίζεται, κατά τα γνωστά, ως: typedef struct listnode *Listptr; struct listnode { int value; Listptr next; }; Η ελλιπής συνάρτηση που δίνεται στη συνέχεια δέχεται ως όρισμα έναν ακέραιο n και τη διεύθυνση μίας θέσης μνήμης listaddr στην οποία είναι καταχωρημένη η διεύθυνση του πρώτου κόμβου μίας λίστας ακεραίων. Η λειτουργία της συνάρτησης είναι να διαγράψει τον n-οστό κόμβο της λίστας, αποδεσμεύοντας και την αντίστοιχη μνήμη (η αρίθμηση των κόμβων ξεκινά από το 1). Αν η λίστα έχει λιγότερους από n κόμβους, ή το n δεν είναι θετικό, η συνάρτηση δεν διαγράϕει κανένα. Συμπληρώστε τις θέσεις με τις τελείες (όχι κατ ανάγκη όλες, αλλά, σίγουρα, όχι περισσότερες από όσες δίνονται) ώστε η συνάρτηση να λειτουργεί με τον τρόπο που περιγράϕηκε. Δεν επιτρέπεται να χρησιμοποιήσετε άλλες μεταβλητές, πέραν αυτών που ορίζονται ήδη στη συνάρτηση. void pdelnth(int n, Listptr *listaddr) { Listptr templist; while (...) if (...) {......... return; } else... } Επίσης, υλοποιήστε μία παραλλαγή της συνάρτησης αυτής (είτε επαναληπτικά, είτε αναδρομικά), με πρωτότυπο Listptr delnth(int n, Listptr list), με την οποία να διαγράϕεται ο n-οστός κόμβος της λίστας που η διεύθυνση του πρώτου κόμβου της είναι η τιμή της μεταβλητής list, αποδεσμεύοντας την αντίστοιχη μνήμη, και επιστρέϕοντας τη νέα λίστα στο όνομα της συνάρτησης. Αν η λίστα έχει λιγότερους από n κόμβους, ή το n δεν είναι θετικό, η συνάρτηση δεν διαγράϕει κανένα και επιστρέϕει τη λίστα που της δόθηκε. Δεν επιτρέπεται να υλοποιήσετε την delnth() απλώς καλώντας κατάλληλα την pdelnth(). Πώς θα πρέπει να κληθούν οι συναρτήσεις pdelnth() και delnth() από τη main() συνάρτηση ενός προγράμματος για να διαγράψουν, η πρώτη, το τρίτο στοιχείο και, η δεύτερη, το πέμπτο στοιχείο μίας λίστας ακεραίων, η διεύθυνση του πρώτου κόμβου της οποίας είναι η τιμή της μεταβλητής alist, τύπου Listptr;
Θέμα 4 (20/100): Εϕ όσον η συνολική βαθμολογία από τα Θέματα 1, 2 και 3 είναι τουλάχιστον 80/100, στον τελικό βαθμό θα συνυπολογισθεί και η αξιολόγηση της απάντησής σας στο πρόβλημα που ακολουθεί. Ο τελικός βαθμός δεν μπορεί να υπερβαίνει το 100/100. Ορίστε δύο συναρτήσεις C με πρωτότυπα unsigned int add(unsigned int a, unsigned int b) και unsigned int mult(unsigned int a, unsigned int b) οι οποίες να επιστρέϕουν το άθροισμα και το γινόμενο, αντίστοιχα, των ορισμάτων που τους δίνονται. Μία λεπτομέρεια είναι ότι δεν επιτρέπεται να χρησιμοποιήσετε στον κώδικα των συναρτήσεων τους χαρακτήρες +, -, *, /, %, [ και ].