ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

Σχετικά έγγραφα
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ Η/Υ (ΟΜΑΔΑ ΘΕΜΑΤΩΝ A)

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

ΠΡΟΓΡΜΜΑΤΑ ΣΕ C. Γράψτε σε γλώσσα προγραμματισμού C τη συνάρτηση:

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

Λογική Σχεδίαση Ψηφιακών Συστημάτων

Γλώσσα Προγραμματισμού C

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Αριθμητικά Συστήματα

Ελίνα Μακρή

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

ΠΛΗΡΟΦΟΡΙΚΗ I. 4 η ΔΙΑΛΕΞΗ Αριθμητικά Συστήματα

Εισαγωγή στην Επιστήμη των Υπολογιστών

ΘΕΜΑΤΑ ΕΞΕΤΑΣΗΣ ΚΑΙ ΑΠΑΝΤΗΣΕΙΣ

! Εάν ο αριθμός διαθέτει περισσότερα bits, χρησιμοποιούμε μεγαλύτερες δυνάμεις του 2. ! Προσοχή στη θέση του περισσότερο σημαντικού bit!

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

Πράξεις με δυαδικούς αριθμούς

ΘΕΜΑΤΑ ΕΞΕΤΑΣΗΣ ΚΑΙ ΑΠΑΝΤΗΣΕΙΣ ΤΟΥΣ

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

Εισαγωγή στον Προγραμματισμό

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Υπολογισμός - Εντολές Επανάληψης

Απλά Προγράμματα. Βήματα: 1. Καθορισμός παράστασης δεδομένων στη μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ ΕΞΕΤΑΣΗ IOYNIOY 2018 ΘΕΜΑΤΑ Α ΟΝΟΜΑΤΕΠΩΝΥΜΟ:... ΑΕΜ: ΕΞΑΜΗΝΟ:

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

Δομημένος Προγραμματισμός (ΤΛ1006)

Συστήματα αρίθμησης. = α n-1 *b n-1 + a n-2 *b n-2 + +a 1 b 1 + a 0 όπου τα 0 a i b-1

ΘΕΜΑΤΑ ΚΑΙ ΛΥΣΕΙΣ. 1) Έστω η λογική συνάρτηση F = A' + Β'. D + B. C' + C. D' (όπου οι τόνοι δηλώνουν συμπληρώματα).

Λογική Σχεδίαση Ι - Εξεταστική Φεβρουαρίου 2013 Διάρκεια εξέτασης : 160 Ονοματεπώνυμο : Α. Μ. Έτος σπουδών:

Πληροφορική 2. Αλγόριθμοι

ΠΛΗ111. Ανοιξη Μάθηµα 7 ο. έντρο. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

1. ΣΥΣΤΗΜΑΤΑ ΑΡΙΘΜΩΝ. α i. (α i β i ) (1.3) όπου: η= το πλήθος ακεραίων ψηφίων του αριθμού Ν. n-1

Διασυνδεδεμένες Δομές. Δυαδικά Δέντρα. Προγραμματισμός II 1

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ ΠΡΟΓΡΑΜΜΑ ΣΠΟΥΔΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ: ΠΛΗ-21

Βήματα: μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων. Δομές Δεδομένων + Αλγόριθμοι = Προγράμματα

Εργαστηριακή Άσκηση 1

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ ΠΑΝΕΛΛΑΔΙΚΩΝ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ

Η γλώσσα προγραμματισμού C

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΕΠΛ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Εισαγωγή στον Προγραμματισμό

Δομημένος Προγραμματισμός (ΤΛ1006)

Αθροιστές. Ημιαθροιστής

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων

11/23/2014. Στόχοι. Λογισμικό Υπολογιστή

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Αριθµητική υπολογιστών

ΤΕΙ ΙΟΝΙΩΝ ΝΗΣΩΝ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ - ΕΙΣ

Δυαδικη παρασταση αριθμων και συμβολων

ΠΛΗ111. Ανοιξη Μάθηµα 2 ο. Αλγόριθµοι και Αφηρηµένοι Τύποι εδοµένων. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

Δυαδικό Σύστημα Αρίθμησης

Εισαγωγή στον Προγραμματισμό

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

1. Πότε χρησιμοποιούμε την δομή επανάληψης; Ποιες είναι οι διάφορες εντολές (μορφές) της;

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Γλώσσα Προγραμματισμού C. Προγραμματισμός HY: Γλώσσα Προγραμματισμού C. Γρήγορος Πίνακας Αναφοράς Σύνταξης. Εισήγηση #4. Επαναληπτικές δομές:

Κεφάλαιο 2 ο Βασικές Έννοιες Αλγορίθμων (σελ )

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Δομημένος Προγραμματισμός (ΤΛ1006)

Υπολογισμός - Εντολές Ελέγχου

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

ΗΜΥ 100 Εισαγωγή στην Τεχνολογία

Ουρά Προτεραιότητας (priority queue)

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 2 η

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 3 Επανάληψη Γ μέρος

Πανεπιστήμιο Πατρών Τμήμα Φυσικής Εργαστήριο Ηλεκτρονικής. Ψηφιακά Ηλεκτρονικά. Αριθμητικά Συστήματα. Επιμέλεια Διαφανειών: Δ.

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Ασκήσεις Επανάληψης

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Συστήματα Αρίθμησης. Συστήματα Αρίθμησης 1. PDF created with FinePrint pdffactory Pro trial version

Διαδικασιακός Προγραμματισμός

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Εισαγωγή στην Πληροφορική & τον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

Ψηφιακά Συστήματα. 6. Σχεδίαση Συνδυαστικών Κυκλωμάτων

Η γλώσσα προγραμματισμού C

Προγραμματισμός Ι. Εγγραφές. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Ψηφιακά Συστήματα. 1. Συστήματα Αριθμών

4.1 Θεωρητική εισαγωγή

d k 10 k + d k 1 10 k d d = k i=0 d i 10 i.

Κεφάλαιο 2. Συστήματα Αρίθμησης και Αναπαράσταση Πληροφορίας. Περιεχόμενα. 2.1 Αριθμητικά Συστήματα. Εισαγωγή

Η γλώσσα προγραμματισμού C

ΦΥΛΛΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ 1

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

Εισαγωγή στην Επιστήμη των Υπολογιστών

1 η Θεµατική Ενότητα : Δυαδικά Συστήµατα

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

Transcript:

ΟΔΗΓΙΕΣ: ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ - ΠΛΗ10 ΤΕΛΙΚΕΣ ΕΞΕΤΑΣΕΙΣ - 15 ΙΟΥΝΙΟΥ 2014 Τα θέματα που έχετε στα χέρια σας είναι τρεις (3) σελίδες. Επιβεβαιώστε το και αν λείπει κάποια σελίδα ή δεν είναι καλά φωτοτυπημένη ενημερώστε άμεσα τον επιτηρητή. Η άριστη απάντηση σε κάθε θέμα βαθμολογείται με δύο (2) μονάδες. Τα ερωτήματα κάθε θέματος (α, β, κλπ.) δεν είναι απαραίτητα ισοδύναμα μεταξύ τους. Απαντήστε και στα πέντε (5) θέματα που ακολουθούν. Γράψτε στο γραπτό σας ΚΑΘΑΡΑ ΚΑΙ ΜΕ ΕΥΚΡΙΝΕΙΑ το θέμα και το ερώτημα στο οποίο απαντάτε κάθε φορά. Προσπαθήστε να απαντάτε όλα τα ερωτήματα κάθε θέματος μαζί. Η αναγραφή σχολίων όπου απαιτείται (προγράμματα σε C, ψευδοκώδικας) είναι υποχρεωτική. Ο συνολικός χρόνος εξέτασης είναι τρεις (3) ώρες ακριβώς. Θέμα 1 (2,0 μονάδες) α) Να γραφεί στη γλώσσα προγραμματισμού C η συνάρτηση: int win(int nums[], int n) που δέχεται ως όρισμα τον πίνακα nums[], ο οποίος περιέχει n ακεραίους αριθμούς. Η συνάρτηση να επιστρέφει: 1, αν στον πίνακα οι θετικοί αριθμοί είναι περισσότεροι από τους αρνητικούς αριθμούς -1, αν στον πίνακα οι αρνητικοί αριθμοί είναι περισσότεροι από τους θετικούς αριθμούς 0, αν το πλήθος των θετικών αριθμών στον πίνακα είναι ίσο με το πλήθος των αρνητικών β) Για τους 4-ψήφιους δυαδικούς αριθμούς (d 3 d 2 d 1 d 0 ) <2>, όπου τα d 3, d 2, d 1 και d 0 είναι δυαδικά ψηφία, θεωρούμε τη λογική συνάρτηση: 1, αν η τιμή του (d 3d 2 d 1 d 0 ) <2> στο δεκαδικό σύστημα είναι πολλαπλάσιο του 5 F(d 3 d 2 d 1 d 0 ) = 0, αλλιώς Για τη συνάρτηση αυτή, με εισόδους τα 4 δυαδικά ψηφία d 3, d 2, d 1 και d 0, να δοθούν: (i) ο πίνακας αληθείας, (ii) η λογική συνάρτηση και (iii) το αντίστοιχο κύκλωμα. Σημείωση: Θεωρήστε ότι το μηδέν δεν είναι πολλαπλάσιο του 5. ΘΕΜΑΤΑ ΤΕΛΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΝΙΟΣ 2014 σελ. 1 από 3

Θέμα 2 (2,0 μονάδες) α) Σε αρχικά κενή στοίβα, εισάγουμε διαδοχικά τις τιμές 4, 6, 5, 1, 3 και 2. Σχεδιάστε το δέντρο - σωρό (μεγίστων) που σχηματίζεται αν διαγράψουμε ένα - ένα τα στοιχεία από τη στοίβα και τα εισάγουμε στο δέντρο (που αρχικά είναι κενό). Στην απάντησή σας να φαίνεται η μορφή του δέντρου - σωρού που σχηματίζεται μετά από κάθε εισαγωγή. β) Δώστε (i) την ενδο-διατεταγμένη και (ii) τη μετα-διατεταγμένη διαπέραση του δέντρου-σωρού που σχηματίστηκε στο ερώτημα α. γ) Διαγράψτε δύο φορές το στοιχείο στη ρίζα του δέντρου - σωρού που σχηματίστηκε στο ερώτημα α και σχεδιάστε τα δέντρα που θα προκύψουν μετά την πρώτη και τη δεύτερη διαγραφή, αντίστοιχα. δ) Έστω ένα δέντρο - σωρός με 20 στοιχεία. Ποιο είναι το ύψος του δέντρου; Τεκμηριώστε την απάντησή σας. ε) Σε αρχικά κενή ουρά, εισάγουμε διαδοχικά τις τιμές 4, 6, 5, 1, 3 και 2. Σχεδιάστε το δυαδικό δέντρο αναζήτησης που σχηματίζεται αν διαγράψουμε ένα - ένα τα στοιχεία από την ουρά και τα εισάγουμε στο δέντρο (που αρχικά είναι κενό). Στην απάντησή σας να φαίνεται η τελική μορφή του δυαδικού δέντρου αναζήτησης που σχηματίζεται. Θέμα 3 (2,0 μονάδες) α) Μετατρέψτε τον οκταδικό αριθμό (32.2) <8> στο δεκαδικό σύστημα και στη συνέχεια το δεκαδικό αριθμό που θα βρείτε μετατρέψτε τον στο δυαδικό σύστημα, δείχνοντας όλα τα βήματα της μετατροπής. β) Να γίνει η αφαίρεση (27) <10> - (48) <10> στο δυαδικό σύστημα, χρησιμοποιώντας τη μέθοδο του συμπληρώματος ως προς 2. Θεωρήστε ότι οι δυαδικοί αριθμοί αναπαριστώνται με 8 δυαδικά ψηφία (bits). γ) Να γραφεί πρόγραμμα στη γλώσσα προγραμματισμού C, το οποίο διαβάζει διαφορετικές μεταξύ τους ακέραιες τιμές σε έναν πίνακα 100 θέσεων και στη συνέχεια υπολογίζει και εκτυπώνει τη μέγιστη και την ελάχιστη τιμή του πίνακα, τη διαφορά αυτών των δύο τιμών και την απόσταση μεταξύ τους (δηλαδή πόσες θέσεις διαφορά έχουν στον πίνακα). Σημείωση: Δεν απαιτείται αμυντικός προγραμματισμός κατά την είσοδο των τιμών στον πίνακα. ΘΕΜΑΤΑ ΤΕΛΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΝΙΟΣ 2014 σελ. 2 από 3

Θέμα 4 (2,0 μονάδες) α) Να γραφεί σε ψευδοκώδικα αλγόριθμος για τον υπολογισμό του αθροίσματος: 1 1 1 S 1..., όπου N! 1*2*3*...* N 3! 5! 19! β) Να γραφεί στη γλώσσα προγραμματισμού C η συνάρτηση: int sum_pos(struct nodelist *start) η οποία δέχεται ως όρισμα μια απλά συνδεδεμένη λίστα ακεραίων αριθμών και επιστρέφει το άθροισμα εκείνων των στοιχείων της λίστας που είναι θετικοί ακέραιοι αριθμοί. Αν η λίστα είναι κενή, η συνάρτηση επιστρέφει -1. Η δομή των κόμβων της λίστας δίνεται από τη δήλωση: struct nodelist int number; struct nodelist *next; ; Θέμα 5 (2,0 μονάδες) α) Να γραφεί πρόγραμμα στη γλώσσα προγραμματισμού C, στο οποίο να δηλώνεται δομή πελάτη µε τα στοιχεία code (ακέραιος αριθμός), onomateponymo (πίνακας χαρακτήρων 30 θέσεων) και ypoloipo (μη αρνητικός πραγματικός αριθμός), να διαβάζονται σε έναν πίνακα δομών οι αντίστοιχες τιμές για 100 πελάτες (με αμυντικό προγραμματισμό κατά την ανάγνωση του στοιχείου ypoloipo) και να εκτυπώνεται το ονοματεπώνυμο των πελατών που έχουν υπόλοιπο μεγαλύτερο από 10,000, καθώς και το συνολικό υπόλοιπο όλων των πελατών. β) Να γραφεί στη γλώσσα προγραμματισμού C η συνάρτηση: void sum_dig(int a[], int b[], int N) που δέχεται ως ορίσματα τους πίνακες a και b και το μέγεθός τους N (κάθε πίνακας περιέχει N ακεραίους αριθμούς με τιμές 0 ή 1 που αντιπροσωπεύουν τα ψηφία ενός δυαδικού αριθμού), η οποία υπολογίζει και εκτυπώνει το άθροισμα των δύο δυαδικών αριθμών στο δυαδικό σύστημα. Θεωρήστε ότι το πιο σημαντικό ψηφίο κάθε δυαδικού αριθμού βρίσκεται στη θέση 0 του αντίστοιχου πίνακα. ΚΑΛΗ ΕΠΙΤΥΧΙΑ! ΘΕΜΑΤΑ ΤΕΛΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΝΙΟΣ 2014 σελ. 3 από 3

ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ - ΠΛΗ10 ΤΕΛΙΚΕΣ ΕΞΕΤΑΣΕΙΣ - ΙΟΥΝΙΟΣ 2014 ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ Θέμα 1 α) int win (int nums[], int n) int i, p1=0, p2=0; /* p1: μετρητής θετικών όρων */ /* p2: μετρητής αρνητικών όρων */ for (i=0; i<n; ++i) /* Ελέγχουμε κάθε στοιχείο του πίνακα nums[] */ if (nums[i]>0) ++p1; /*... αν είναι θετικό, αυξάνεται το p1 */ else if (nums[i]<0) ++p2; /* αν είναι αρνητικό, αυξάνεται το p2 */ if (p1 > p2) return(1); /* Έξοδος +1, -1 ή 0 κατά περίπτωση */ else if (p1 < p2) return(-1); else return(0); /* όταν p1 = p2 */ β) Έστω d 3, d 2, d 1, d 0 τα 4 ψηφία του δυαδικού αριθμού με d 3 να αναπαριστά το περισσότερο σημαντικό ψηφίο του αριθμού: d 3 d 2 d 1 d 0 Τιμή στο δεκαδικό σύστημα 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 2 0 0 0 1 1 3 0 0 1 0 0 4 0 F ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΤΕΛΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΝΙΟΣ 2014 1

d 3 d 2 d 1 d 0 Τιμή στο δεκαδικό σύστημα 0 1 0 1 5 1 0 1 1 0 6 0 0 1 1 1 7 0 1 0 0 0 8 0 1 0 0 1 9 0 1 0 1 0 10 1 1 0 1 1 11 0 1 1 0 0 12 0 1 1 0 1 13 0 1 1 1 0 14 0 1 1 1 1 15 1 F F = d 3 '. d 2. d 1 '. d 0 + d 3. d 2 '. d 1. d 0 ' + d 3. d 2. d 1. d 0 ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΤΕΛΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΝΙΟΣ 2014 2

Θέμα 2 α) 2 3 3 5 6 2 2 1 3 1 5 1 2 2 3 6 5 4 2 3 1 β) Ενδο-διατεταγμένη Διαπέραση: 2-5 - 3-6 - 1-4 Μετα-διατεταγμένη Διαπέραση: 2-3 - 5-1 - 4-6 γ) 5 4 3 4 3 1 2 1 2 δ) Το ύψος του δέντρου είναι 4. Εφόσον πρόκειται για δέντρο - σωρό, είναι πλήρες δέντρο, άρα έχει 1 κόμβο στο πρώτο επίπεδο, 2 κόμβους στο δεύτερο επίπεδο, 4 κόμβους στο τρίτο επίπεδο, 8 κόμβους στο τέταρτο επίπεδο και τους υπόλοιπους 5 κόμβους στο πέμπτο επίπεδο. ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΤΕΛΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΝΙΟΣ 2014 3

ε) Το δυαδικό δέντρο αναζήτησης που σχηματίζεται είναι το ακόλουθο: 4 1 6 3 5 2 Θέμα 3 α) Μετατροπή οκταδικού σε δεκαδικό: 32.2 <8> = 3*8 1 + 2*8 0 + 2*8-1 = 24 + 2 + 0.25= 26.25 <10> Μετατροπή δεκαδικού σε δυαδικό - Ακέραιο μέρος (26): Βάση Πηλίκο Υπόλοιπο 26:2 = 13 + 0 13:2 = 6 + 1 6:2 = 3 + 0 3:2 = 1 + 1 1:2 = 0 + 1 1 1 0 1 0 Μετατροπή δεκαδικού σε δυαδικό - Κλασματικό μέρος (0.25): Πράξη Αποτέλεσμα Κλασματικό μέρος Βάση Γινόμενο Ακέραιο Μέρος Κλασματικό μέρος 0.25 2 = 0.5 0 0.5 0.5 2 = 1.0 1 0.0 Επομένως, 26.25 <10> = 11010.01 <10> ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΤΕΛΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΝΙΟΣ 2014 4

β) 27 <10> = 00011011 <2> 48 <10> = 00110000 <2> Συμπλ. ως προς 1: 11001111 <2> Συμπλ. ως προς 2: 11010000 <2> Αρκεί να προσθέσουμε τον μειωτέο 00011011 <2> στο συμπλήρωμα ως προς 2 του αφαιρετέου. 00011011 + 11010000 11101011 Το αποτέλεσμα της αφαίρεσης είναι 11101011 <2>. Για να επαληθεύσουμε το αποτέλεσμα βρίσκουμε την αντίστοιχη τιμή στο δεκαδικό σύστημα. Αφού το αριστερά δυαδικό ψηφίο είναι 1 πρόκειται για αρνητικό αριθμό. Η διαδικασία που θα ακολουθήσουμε είναι η παρακάτω: (i) Υπολογίζω το συμπλήρωμα ως προς 2 του αποτελέσματος: 11101011 <2> Συμπλ. ως προς 1: 00010100 <2> Συμπλ. ως προς 2: 00010101 <2> (ii) Μετατρέπω τον δυαδικό αριθμό που προκύπτει σε δεκαδικό αριθμό: 00010101 <2> = 21 <10> (iii) Συνεπώς, το αποτέλεσμα της αφαίρεσης είναι ίσο με: -21 <10> ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΤΕΛΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΝΙΟΣ 2014 5

γ) #include <stdio.h> #define N 100 main() int i, a[n], max, min, max_pos, min_pos, dis; /* καταχώριση τιμών */ for (i=0; i<n; ++i) /* Εισαγωγή στοιχείων στον πίνακα a[] */ printf("δώσε το %dο στοιχείο του πίνακα: ", i+1); scanf("%d", &a[i]); max = a[0]; /* Αρχικά θεωρούμε ότι το 1ο στοιχείο είναι το μεγαλύτερο */ max_pos = 0; /*... και αυτή η θέση του */ min = a[0]; /* Παρομοίως και για το ελάχιστο */ min_pos = 0; /*... και για τη θέση του */ for (i=1; i<n; ++i) /* Για κάθε επόμενο στοιχείο... */ if (a[i] > max) /* ελέγχουμε αν είναι μεγαλύτερο από το τρέχον max */ max = a[i]; /*... και αν ναι, αναθεωρούμε το max */ max_pos = i; /*... και τη θέση του */ if (a[i] < min) /* Παρομοίως και για το min */ min = a[i]; min_pos = i; /* Μετά την επανάληψη, έχουν υπολογιστεί τα max, min και οι θέσεις τους */ printf("η μέγιστη τιμή του πίνακα είναι: %d\n", max); printf("η ελάχιστη τιμή του πίνακα είναι: %d\n", min); printf("η διαφορά μέγιστης και ελάχιστης τιμής είναι: %d\n", max - min); dis = max_pos - min_pos; if (dis<0) /* Σε περίπτωση που το max προηγείται του min... */ dis = (-1)*dis; /*... αλλάζουμε το πρόσημο στην απόσταση */ /*... πριν την τυπώσουμε */ printf("η απόσταση μέγιστης και ελάχιστης τιμής είναι: %d\n", dis); ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΤΕΛΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΝΙΟΣ 2014 6

Θέμα 4 α) ΑΛΓΟΡΙΘΜΟΣ S ΔΕΔΟΜΕΝΑ i, i_parag, j: INTEGER; S: REAL; /* Το άθροισμα θα είναι πραγματικός αριθμός */ ΑΡΧΗ /* Κυρίως Πρόγραμμα */ S:= 0.0; /* Αρχικοποίηση αθροίσματος */ ΓΙΑ i:=1 ΕΩΣ 19 ME-ΒΗΜΑ 2 ΕΠΑΝΑΛΑΒΕ i_parag:=1; ΓΙΑ j:=1 ΕΩΣ i ΕΠΑΝΑΛΑΒΕ i_parag:=i_parag*j /* Υπολογισμός του i! */ ΓΙΑ-ΤΕΛΟΣ; S:=S + 1.0/i_parag ΓΙΑ-ΤΕΛΟΣ; ΤΥΠΩΣΕ ("Το άθροισμα είναι: ", S) ΤΕΛΟΣ /* Τέλος Προγράμματος */ β) int sum_pos(struct nodelist *start) struct nodelist *cur; int result = 0; if (start == NULL) /* αν η λίστα είναι κενή */ return (-1); cur = start; /* πρώτος κόμβος της λίστας */ while (cur!= NULL) /* όσο δεν έχουμε φτάσει στο τέλος της λίστας */ if (cur->number > 0) result += cur->number; /* αθροίζω τους θετικούς όρους */ cur = cur->next; /* επόμενος κόμβος της λίστας */ return (result); ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΤΕΛΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΝΙΟΣ 2014 7

Θέμα 5 α) #include <stdio.h> #define N 100 struct pelates int code; char onomateponymo[30]; float ypoloipo; ; main() int i; float balance, sum=0.0; struct pelates pel[n]; for (i=0; i<n; ++i) /* Εισαγωγή στοιχείων */ printf("δώστε τα στοιχεία του %dου πελάτη\n", i+1); printf("κωδικός: "); scanf("%d", &pel[i].code); fflush(stdin); printf("ονοματεπώνυμο: "); gets(pel[i].onomateponymo); do printf("δώσε Υπόλοιπο: "); scanf("%f", &balance); if (balance < 0.0) printf("το υπόλοιπο δεν μπορεί να είναι αρνητικός αριθμός.\n"); while (balance < 0.0); /* Αμυντικός Προγραμματισμός */ pel[i].ypoloipo = balance; for (i=0; i<n; ++i) /* Έλεγχος υπολοίπου για κάθε πελάτη */ if (pel[i].ypoloipo > 10000.0) printf("ο %s έχει υπόλοιπο μεγαλύτερο των 10.000 Ευρώ\n", pel[i].onomateponymo); sum += pel[i].ypoloipo; /*... και άθροιση όλων των υπολοίπων */ printf("το συνολικό υπόλοιπο των πελατών είναι: %f\n", sum); ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΤΕΛΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΝΙΟΣ 2014 8

β) void sum_dig(int a[n], int b[n]) int i, carry=0, temp; int result[n]; for (i = N-1; i>=0; --i) /* Ξεκινάμε από το τελευταίο ψηφίο (θέση N-1) */ temp = a[i] + b[i] + carry; /* Το άθροισμα των 2 bits + κρατούμενο */ if (temp > 1) /* Σε αυτήν την περίπτωση δημιουργείται κρατούμενο */ carry = 1; /* Όταν σημειώνουμε κρατούμενο... */ temp -= 2; /*... η αξία του αθροίσματος μειώνεται κατά 2 */ else carry = 0; result[i] = temp; /* Το άθροισμα μεταφέρεται... */ /*... στο bit του αποτελέσματος */ printf("το άθροισμα των αριθμών είναι:\n"); if (carry == 1) printf("1"); /* Γράφουμε τυχόν τελικό κρατούμενο */ for (i = 0; i<n; ++i) /*... και μετά τα υπόλοιπα ψηφία */ printf("%d", result[i]); printf("\n"); ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΤΕΛΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΝΙΟΣ 2014 9

ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ - ΠΛΗ10 ΕΠΑΝΑΛΗΠΤΙΚΕΣ ΕΞΕΤΑΣΕΙΣ - 9 ΙΟΥΛΙΟΥ 2014 ΟΔΗΓΙΕΣ: Τα θέματα που έχετε στα χέρια σας είναι τέσσερις (4) σελίδες. Επιβεβαιώστε το και αν λείπει κάποια σελίδα ή δεν είναι καλά φωτοτυπημένη ενημερώστε άμεσα τον επιτηρητή. Η άριστη απάντηση σε κάθε θέμα βαθμολογείται με δύο (2) μονάδες. Τα ερωτήματα κάθε θέματος (α, β, κλπ.) δεν είναι απαραίτητα ισοδύναμα μεταξύ τους. Απαντήστε και στα πέντε (5) θέματα που ακολουθούν. Γράψτε στο γραπτό σας ΚΑΘΑΡΑ ΚΑΙ ΜΕ ΕΥΚΡΙΝΕΙΑ το θέμα και το ερώτημα στο οποίο απαντάτε κάθε φορά. Προσπαθήστε να απαντάτε όλα τα ερωτήματα κάθε θέματος μαζί. Η αναγραφή σχολίων όπου απαιτείται (προγράμματα σε C, ψευδοκώδικας) είναι υποχρεωτική. Ο συνολικός χρόνος εξέτασης είναι τρεις (3) ώρες ακριβώς. Θέμα 1 (2,0 μονάδες) α) Μετατρέψτε τον δεκαεξαδικό αριθμό (1C2.B2) <16> σε οκταδικό μέσω του δυαδικού συστήματος, δείχνοντας όλα τα βήματα της μετατροπής. β) Εκτελέστε τις ακόλουθες πράξεις στα συστήματα που αναφέρονται για κάθε πράξη: (10.101) <2> + (11.101) <2> (74.141) <8> + (21.764) <8> (F1.12) <16> + (6F.E2) <16> γ) Μετατρέψτε το δυαδικό αριθμό (10010.111) <2> στον αντίστοιχο δεκαδικό, δείχνοντας όλα τα βήματα της μετατροπής. δ) Γράψτε στη γλώσσα προγραμματισμού C τη συνάρτηση: void bitwise_xor(int a[], int b[], int N) που δέχεται ως είσοδο τους πίνακες a[] και b[], ο καθένας από τους οποίους περιέχει N ακέραιους αριθμούς με τιμές 0 και 1 που αντιπροσωπεύουν τα ψηφία ενός δυαδικού αριθμού, και εμφανίζει στην οθόνη το αποτέλεσμα της λογικής πράξης XOR μεταξύ των αντίστοιχων ψηφίων των δύο δυαδικών αριθμών, ξεκινώντας από τα ψηφία στην αρχή του κάθε πίνακα. ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΛΙΟΣ 2014 σελ. 1 από 4

Θέμα 2 (2,0 μονάδες) α) Να γραφεί πρόγραμμα στη γλώσσα προγραμματισμού C που διαβάζει τα στοιχεία ενός πίνακα ακεραίων αριθμών int a[2*n] και αντιγράφει το πρώτο μισό του πίνακα a[] (στοιχεία από τις θέσεις 0 έως και Ν-1) στον πίνακα int b[n] με την ίδια σειρά (δηλαδή, το πρώτο στοιχείο του πίνακα a[] στην πρώτη θέση του πίνακα b[] κ.ο.κ.) και το δεύτερο μισό του πίνακα a[] (στοιχεία από τις θέσεις Ν έως και 2*Ν-1) στον πίνακα int c[n], αλλά με αντίστροφη σειρά (δηλαδή, το τελευταίο στοιχείο του a[] στην πρώτη θέση του c[] κ.ο.κ.). β) Δώστε το Διάγραμμα Ροής Προγράμματος για τον υπολογισμό του κάτωθι αθροίσματος: S = 1! - 2! + 3! - 4! + - 100!, όπου N! = 1*2*3* *Ν Θέμα 3 (2,0 μονάδες) α) Δίνονται κατά σειρά οι ακέραιες τιμές: 4, 5, 7, 1, 6, 2, 8, 3. i. Σχηματίστε το πλήρες δυαδικό δένδρο αναζήτησης, οι κόμβοι του οποίου έχουν τις τιμές αυτές. ii. Δώστε την προ-διατεταγμένη και τη μετα-διατεταγμένη διαπέραση του δέντρου. β) Για ένα Δυαδικό Δέντρο, η προ-διατεταγμένη και η ενδο-διατεταγμένη διαπέραση έχουν τα εξής αποτελέσματα: ΠΡΟ-ΔΙΑΤΕΤΑΓΜΕΝΗ: 5, 3, 2, 6, 1, 4, 7 ΕΝΔΟ-ΔΙΑΤΕΤΑΓΜΕΝΗ: 3, 5, 4, 1, 6, 2, 7 Σχεδιάστε το Δυαδικό Δέντρο. γ) Τι τυπώνει το ακόλουθο πρόγραμμα; Αιτιολογήστε την απάντησή σας. #include <stdio.h> void main() int table[]=1, 2, 4, 6, *p, *q; p = table; q = p+2; printf("%d %d %d %d\n", table[1], *p, *(q+1), *q+1); ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΛΙΟΣ 2014 σελ. 2 από 4

Θέμα 4 (2,0 μονάδες) α) Γράψτε μια συνάρτηση στη γλώσσα προγραμματισμού C που θα δέχεται ως ορίσματα 3 πραγματικούς αριθμούς A, B, C και θα επιστρέφει το εμβαδόν του τριγώνου με μήκη πλευρών A, B, C. Ο υπολογισμός του εμβαδού θα γίνεται με τον τύπο του Ήρωνα: E T(T A)(T B)(T C), όπου T A B C 2 Η συνάρτηση θα πρέπει να ελέγχει τα εξής: Αν τα A, B, C είναι θετικοί αριθμοί (εάν δεν είναι, η συνάρτηση θα επιστρέφει -1). Αν τα A, B, C αποτελούν μήκη πλευρών τριγώνου. Ο έλεγχος γίνεται με την τριγωνική ανισότητα: το μήκος κάθε πλευράς πρέπει να είναι μικρότερο από (ή ίσο με) το άθροισμα των μηκών των άλλων δύο πλευρών (σημειώστε ότι σε περίπτωση ισότητας το τρίγωνο έχει εμβαδόν 0, αλλά συνεχίζει να θεωρείται τρίγωνο). Σε περίπτωση που τα A, B, C είναι θετικά αλλά δεν μπορούν να αποτελούν πλευρές τριγώνου, η συνάρτηση να επιστρέφει -2. Υπόδειξη: Για τον υπολογισμό της τετραγωνικής ρίζας μπορείτε να χρησιμοποιήσετε τη συνάρτηση βιβλιοθήκης sqrt(). β) Δίνεται η παρακάτω δήλωση για κόμβους δυαδικού δένδρου: struct treenode int data; struct treenode *left; struct treenode *right; ; όπου το left δείχνει στο αριστερό παιδί και το right δείχνει στο δεξί παιδί του κόμβου. Να γραφεί συνάρτηση struct treenode *split_left_subtree(struct treenode *t) στη γλώσσα προγραμματισμού C που αποκόπτει το αριστερό υποδένδρο της ρίζας του δυαδικού δένδρου t και επιστρέφει δείκτη στη ρίζα του υποδέντρου που έχει αποκοπεί. Η ρίζα του δένδρου t μετά την ολοκλήρωση της συνάρτησης δεν πρέπει να έχει αριστερό παιδί (δηλαδή το αριστερό παιδί να είναι NULL). Θεωρήστε πως η παράμετρος t δεν είναι ποτέ NULL και έτσι δεν χρειάζεται σχετικός έλεγχος για αμυντικό προγραμματισμό. ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΛΙΟΣ 2014 σελ. 3 από 4

Θέμα 5 (2,0 μονάδες) α) Έστω η συνάρτηση F = A'. D + B. C + B' + C'. D' (όπου οι τόνοι δηλώνουν συμπληρώματα). i) Σχεδιάστε το κύκλωμα. ii) Υπολογίστε για ποια είσοδο η F έχει έξοδο 0. iii) Αλλάξτε το κύκλωμα ώστε η F να γίνεται 1 μόνο για την είσοδο του υπο-ερωτήματος ii (και 0 σε κάθε άλλη περίπτωση). β) Έστω η παρακάτω αναδρομική συνάρτηση: int fn(int v) if (v==1) return 1; if (v%2==0) return fn(v/2)+6; else return fn(v-1)+8; Ποιες είναι οι τιμές που επιστρέφουν οι fn(4), fn(5) και fn(6); Τεκμηριώστε την απάντησή σας, αναφέροντας και τις ενδιάμεσες κλήσεις της fn() σε κάθε περίπτωση. ΚΑΛΗ ΕΠΙΤΥΧΙΑ! ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΛΙΟΣ 2014 σελ. 4 από 4

ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ - ΠΛΗ10 ΕΠΑΝΑΛΗΠΤΙΚΕΣ ΕΞΕΤΑΣΕΙΣ - ΙΟΥΛΙΟΣ 2014 ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ Θέμα 1 α) (1C2.B2) <16> = 0001 1100 0010. 1011 0010 <2> = 000 111 000 010. 101 100 100 <2> = (702.544) <8> β) Η εκτέλεση των προσθέσεων γίνεται ως ακολούθως: μεταφορά: 111 1. 10.101 + 11.101 110.010 και τελικό αποτέλεσμα: (110.010) <2> μεταφορά: 1 1 1 74.141 + 21.764 116.125 και τελικό αποτέλεσμα: (116.125) <8> μεταφορά: 11 F1.12 + 6F.E2 160.F4 και τελικό αποτέλεσμα: (160.F4) <16> ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΕΠΑΝΑΛΗΠΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΛΙΟΣ 2014 1

γ) Μετατροπή δυαδικού σε δεκαδικό (10010.111) <2> = 1*2 4 +0*2 3 +0*2 2 +1*2 1 +0*2 0 +1*2-1 +1*2-2 +1*2-3 = 16+2+0.5+0.25+0.125 = 18.875 Επομένως, (10010.111) <2> = (18.875) <10> δ) void bitwise_xor(int a[], int b[], int N) int i; for (i=0; i<n; ++i) /* Επανάληψη για διαπέραση των πινάκων */ if (a[i]!=b[i]) printf("1"); /* Βάσει του πίνακα αληθείας της XOR, όταν οι είσοδοι είναι διαφορετικές, η έξοδος είναι 1 */ else printf("0"); Θέμα 2 α) #include <stdio.h> #define N 10 main() int i, a[2*n], b[n], c[n]; for (i=0; i<2*n; ++i) printf("δώσε το %dο στοιχείο του πίνακα a: ", i+1); scanf("%d", &a[i]); /* Διάβασμα πίνακα */ for (i=0; i<n; ++i) /* Από την αρχή προς το μέσον του πίνακα a */ b[i] = a[i]; /* ο πίνακας b ενημερώνεται με την ίδια σειρά */ for (i=n; i<2*n; ++i) /* Από το μέσον προς το τέλος του πίνακα a */ c[(2*n-1)-i] = a[i]; /* ο πίνακας c ενημερώνεται με αντίστροφη σειρά */ ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΕΠΑΝΑΛΗΠΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΛΙΟΣ 2014 2

β) Στο ανωτέρω Διάγραμμα Ροής Προγράμματος αξιοποιούμε το γεγονός ότι κάθε παραγοντικό είναι ίσο με το προηγούμενό του πολλαπλασιαζόμενο με τον τρέχοντα παράγοντα, δηλαδή: Κ! = (Κ-1)! * Κ Έτσι, το P σε κάθε επανάληψη πολλαπλασιάζεται με το Ι για να δώσει το νέο παραγοντικό, το οποίο στη συνέχεια προστίθεται στο S για να προκύψει το τελικό άθροισμα. Για να επιτύχουμε την εναλλαγή του προσήμου σε κάθε βήμα, το P προκύπτει κάθε φορά από τον πολλαπλασιασμό του (θετικού) Ι με το προηγούμενο P και αλλάζει πρόσημο, δίνοντας κάθε φορά διαφορετικό πρόσημο από την προηγούμενη. Για να ξεκινήσει με θετικό πρόσημο (το 1!), το P αρχικοποιείται σε -1 ώστε στη συνέχεια ο πολλαπλασιασμός -P*I να δώσει +1. Το τμήμα αυτό θα μπορούσε να υλοποιηθεί και με έλεγχο του I, ώστε αν το Ι είναι άρτιος το S να γίνεται S+P, ενώ αν το Ι είναι περιττός το S να γίνεται S-P. Κάτι τέτοιο, βέβαια, παρ ότι είναι σωστό, θα δημιουργούσε ένα πιο πολύπλοκο Διάγραμμα Ροής Προγράμματος. ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΕΠΑΝΑΛΗΠΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΛΙΟΣ 2014 3

Θέμα 3 α) i. Για το σχηματισμό του πλήρους δυαδικού δέντρου αναζήτησης, κατασκευάζουμε αρχικά ένα πλήρες δέντρο 8 κόμβων, χωρίς τιμές στους κόμβους του. Τα τρία πρώτα επίπεδα θα είναι πλήρη, άρα θα έχουν 1 + 2 + 4 = 7 κόμβους, και το τελευταίο θα έχει έναν κόμβο αριστερά. Δεδομένου ότι η ενδο-διατεταγμένη διαπέραση ενός δυαδικού δέντρου αναζήτησης δίνει τα στοιχεία ταξινομημένα σε αύξουσα διάταξη και ότι οι τιμές που δίνονται σε αύξουσα διάταξη είναι 1, 2, 3, 4, 5, 6, 7, 8, το δέντρο είναι: 5 3 7 2 4 6 8 1 ii. Προ-διατεταγμένη διαπέραση: 5, 3, 2, 1, 4, 7, 6, 8 Μετα-διατεταγμένη διαπέραση: 1, 2, 4, 3, 6, 8, 7, 5 ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΕΠΑΝΑΛΗΠΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΛΙΟΣ 2014 4

β) Κατασκευή δυαδικού δέντρου βάσει της προ-διατεταγμένης (5, 3, 2, 6, 1, 4, 7) διαπέρασης και της ενδο-διατεταγμένης (3, 5, 4, 1, 6, 2, 7) διαπέρασης. Το 5 είναι στη ρίζα, αφού είναι πρώτο στην προ-διατεταγμένη διαπέραση. Έτσι, από την ενδοδιατεταγμένη διαπέραση προκύπτει αριστερό υποδέντρο που αποτελείται μόνο από το 3 και δεξί υποδέντρο με όλα τα υπόλοιπα, για τα οποία η προ-διατεταγμένη διαπέραση δίνει 2, 6, 1, 4, 7 και η ενδο-διατεταγμένη διαπέραση δίνει 4, 1, 6, 2, 7. Παρόμοια με πριν, από την προ-διατεταγμένη διαπέραση το δεξί υποδέντρο έχει ρίζα το 2 και από την ενδο-διατεταγμένη διαπέραση έχει ως αριστερό παιδί υποδέντρο (με προ-διατεταγμένη διαπέραση 6, 1, 4 και ενδο-διατεταγμένη διαπέραση 4, 1, 6) και δεξί υποδέντρο το 7 μόνο του. Το αριστερό υποδέντρο του 2 έχει ως ρίζα το 6 (λόγω της προ-διατεταγμένης διαπέρασης), το οποίο δεν έχει δεξί παιδί (λόγω της ενδο-διατεταγμένης διαπέρασης) και έχει αριστερό παιδί το 1 που με τη σειρά του έχει αριστερό παιδί το 4. Το δέντρο που σχηματίζεται είναι το ακόλουθο: 5 3 2 6 7 1 4 γ) Η έξοδος του προγράμματος είναι 2 1 6 5. Το αποτέλεσμα μπορεί να ερμηνευθεί παρατηρώντας ότι οι μεταβλητές p, q είναι μεταβλητές δείκτη οι οποίες αρχικοποιούνται έτσι ώστε η p να δείχνει στη θέση μνήμης που αντιστοιχεί στο πρώτο κελί του πίνακα table και η q να δείχνει στο τρίτο κελί του πίνακα. Οπότε η τιμή του table[1] είναι το περιεχόμενο του δεύτερου κελιού του πίνακα (2), η τιμή του *p είναι η τιμή του πρώτου κελιού του πίνακα (1), η τιμή του *(q+1) είναι η τιμή του 4ου κελιού του πίνακα (6) και η τιμή *q+1 είναι η τιμή του 3ου κελιού (4) αυξημένη κατά ένα (5). ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΕΠΑΝΑΛΗΠΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΛΙΟΣ 2014 5

Θέμα 4 α) float emvadon(float A, float B, float C) float T, E; if (A <= 0 B <= 0 C <= 0) return(-1); if ((A > B + C) (B > A + C) (C > A + B)) return(-2 ); T = (A + B + C)/2; /* Υπολογισμός ημιπεριμέτρου */ E = sqrt(t*(t - A)*(T - B)*(T - C)); /* Υπολογισμός εμβαδού */ return(e); β) struct treenode *split_left_subtree(struct treenode * t) struct treenode *arist; /* μεταβλητή για την προσωρινή αποθήκευση του */ /* αριστερού παιδιού */ arist = t->left; /* φύλαξη στο δείκτη του αριστερού παιδιού */ t->left = NULL; /* αποκοπή του αριστερού παιδιού από το δένδρο */ return arist; /* επιστροφή του αποκομμένου αριστερού παιδιού */ Θέμα 5 α.i) Το κύκλωμα που προκύπτει από τη λογική συνάρτηση είναι το ακόλουθο: ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΕΠΑΝΑΛΗΠΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΛΙΟΣ 2014 6

Εναλλακτικά, θα μπορούσαμε να κατασκευάσουμε το κύκλωμα από τον πίνακα αληθείας, αλλά σε αυτήν την περίπτωση το κύκλωμα θα ήταν εξαιρετικά περίπλοκο (11 πύλες AND 4 εισόδων και μια OR με 11 εισόδους). α.ii) Α B C D Α' B' C' D' A' D B C C' D' F 0 0 0 0 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0 1 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 0 1 1 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 0 1 Όπως φαίνεται από τον πίνακα αληθείας, η έξοδος F γίνεται 0 για το συνδυασμό εισόδων A=1, B=1, C=0, D=1. ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΕΠΑΝΑΛΗΠΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΛΙΟΣ 2014 7

α.iii) Με άλλα λόγια, θέλουμε να δημιουργήσουμε την F'. Ο πιο απλός τρόπος είναι να προσθέσουμε μια πύλη NOT στην έξοδο του κυκλώματος του ερωτήματος (α.i): β) fn(1) = 1 fn(2) = fn(1) + 6 = 1 + 6 = 7 fn(3) = fn(2) + 8 = 7 + 8 = 15 fn(4) = fn(2) + 6 = (fn(1) + 6) + 6 = 1 + 6 + 6 = 13 fn(5) = fn(4) + 8 = 13 + 8 = 21 fn(6) = fn(3) + 6 = (fn(2) + 8) + 6 = ((fn(1) + 6) + 8) + 6 = 21 ΕΝΔΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΕΠΑΝΑΛΗΠΤΙΚΩΝ ΕΞΕΤΑΣΕΩΝ ΙΟΥΛΙΟΣ 2014 8