ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών Ακαδηµαϊκό έτος 2010 2011, Χειµερινό εξάµηνο Ασκήσεις Επανάληψης Ενδιάµεσης Εξέτασης Κεφάλαιο 1: Εισαγωγή ( ιάλεξη 1) 1. Τι είναι η µαθηµατική µοντελοποίηση και ποια τα στάδια της? Κεφάλαιο 2: Αφηρηµένοι Τύποι εδοµένων ( ιάλεξη 1) 1. Να υλοποιηθεί προγραµµατιστικά µια δοµή (στατική δέσµευση µνήµης) η οποία να παριστάνει ένα φοιτητή και να περιέχει συγκεκριµένα τα εξής πεδία: i. Name ii. Surname iii. Age iv. Sex v. Date of Birth Να υλοποιηθεί επίσης η συνάρτηση main() η οποία να χρησιµοποιεί την δοµή, να ορίζει/αρχικοποιεί τα στοιχεία/πεδία ενός φοιτητή και να τα τυπώνει. 2. Ας υποθέσουµε ότι έχουµε την παρακάτω δήλωση δοµής: typedef struct{ char a[12]; int b; int c3; typos_egrafis; typos_egrafis egr; Ας υποθέσουµε ότι ένας ακέραιος αποθηκεύεται σε µια λέξη µνήµης και τρεις χαρακτήρες σε µια λέξη µνήµης. Αν τώρα δώσουµε τις εξής τιµές στο κάθε στοιχείο (a = abcdefghijkl ; b = 11; c3 = 12), να υπολογίσετε την διεύθυνση(egr.c3) και να υλοποιήσετε (παραστήσετε γραφικά) την δοµή καταγράφοντας τις διευθύνσεις όλων των µελών της.
3. ίνεται ο εξής αραιός πίνακας i/j 0 1 2 3 0 1 0 2 0 1 2 1 6 0 2 3 0 1 5 7 3 0 3 8 Να αποθηκευθεί ανά τριάδες της µορφής (i ; j ; τιµή).
Κεφάλαιο 3: Πολυπλοκότητα Αλγορίθµων ( ιάλεξη 2-3) 1. Αποδείξτε ότι ο χρόνος εκτέλεσης των ακόλουθων συναρτήσεων έχει ως εξής: 3 4 α) 2n + n + n + 1 είναι O n ) β) 6n 2είναι O (n) ( 4 Να δώσετε και την επαλήθευση για καθεµία από τις πιο πάνω συναρτήσεις. 2. ώστε το χρόνο εκτέλεσης χείριστης περίπτωσης (µε σύντοµη επεξήγηση) των πιο κάτω προγραµµάτων σαν συνάρτηση του n (Big Oh): 1. int sum=0; for(i=0; i<n; i++){ sum++; for(j=1;j<n; j++){ sum=sum+j; 2. int sum=0; while(i<n){ sum = sum +2; for(int j = 0; j < n; j++){ sum++; i++; 3. int sum=0; for(int i = 0; i < 6*n; i++){ for( int j = 1; j < n * n; j++) sum++; Κεφάλαιο 4: Συµβολοσειρές ( ιάλεξη 4) 1. ίνονται τα ακόλουθα προγράµµατα a και b. Ποια είναι τα αποτελέσµατα που παίρνουµε από την εκτέλεση των εντολών εκτύπωσης; a. int main(){ char s1[] = "Hello World"; char s2[11] = ; strcpy(b, &a[3]); printf("%s\n", b); printf("%d\n", strlen(b)); strcat(a, b); printf("%s\n", a); printf("%d", strlen(a));
b. int main(){ char s1[11] = "Cat"; char s2[12] = "Cut"; printf("%d\n", strcmp(s1, s2)); strcat(s1, s2); printf("%s\n", s1); printf("%s\n", s2); printf("%d", strcmp(s1, s2)); 2. Ποια από τις ακόλουθες συνθήκες θα είχε ως αποτέλεσµα να καλεστεί η συνάρτηση dosomething µόνο αν οι συµβολοσειρές a και b ήταν ίσες; a. if (strcmp(a,b)) dosomething(); b. if (strcmp(a,b)==0) dosomething(); c. if (a==b) dosomething (); d. if (a[]==b[]) dosomething (); 3. Έχοντας υπόψη τις πιο κάτω δηλώσεις: char s1[10], s2[20]; char saturday[9]= Saturday ; char sunday[7]= Sunday ; εξηγήστε τι γίνεται µε την εκτέλεση των πιο κάτω εντολών: a. strcpy(s1, & sunday[3]); printf("%s\n", s1); b. printf("%d\n", strlen(saturday)); c. strcpy(s2, sunday); printf("%s\n", s2); d. strcat(s2, saturday); printf("%s\n", s2); 4. ίνεται µια συµβολοσειρά name[10]= Jonathan ; Γράψτε µια συνάρτηση που θα τυπώνει τη συµβολοσειρά αυτή αντίστροφα. ηλαδή θα τύπωνε στην έξοδο: nahtanoj Πρότυπο συνάρτησης: void reverse_print(char name[]);
Κεφάλαιο 5: είκτες και Πίνακες ( ιάλεξη 5-6) Να υλοποιήσετε τη συνάρτηση main() και µία συνάρτηση η οποία µε δεδοµένο εισόδου ακέραιο i, επιστρέφει το όνοµα της i-οστής ηπείρου. Για οποιοδήποτε άλλο ακέραιο να επιστρέφει οτι δεν υπάρχει. Πρότυπο συνάρτησης: char *getcontinent(char *continents[], int i); Hint: char *continents[]={"does not exist", "Europe", "America", "Africa", "Australia", "Asia"; Κεφάλαιο 6: οµές και Ενώσεις ( ιάλεξη 7) Να υλοποιήσετε µια δοµή στοίβας µε στατική δεύσµευση µνήµης και να υλοποιήσετε συνάρτηση η οποία θα υλοποιεί την ίδια λειτουργία µε την συνάρτηση Decimal2Binary (Κεφάλαιο 8 Άσκηση 1) αλλά θα είναι µη αναδροµική και θα κάνει χρήση της στοίβας. Πρότυπο συνάρτησης: void stackdecimal2binary(int number) Κεφάλαιο 7: Memory Allocation (malloc) ( ιάλεξη 8) 1. Ποιο σύνολο εντολών είναι ορθότερο όσο αφορά την δυναµική δεύσµευση µνήµης και γιατί? a. int *nump; nump = (int *) malloc(4); *nump = 17; free(nump); b. int *nump; nump = (int *) malloc(sizeof(int)); *nump = 17; free(nump); c. int *nump; nump = (int *) malloc(sizeof(20)); *nump = 17; free(nump); Κεφάλαιο 8: Αναδροµή ( ιάλεξη 9) 1. Να υλοποιήσετε µια αναδροµική συνάρτηση η οποία να εκτυπώνει την δυαδική αναπαράσταση ενός ακέραιου θετικού αριθµού που δίδεται ως παράµετρος της συνάρτησης. Πρότυπο συνάρτησης: void Decimal2Binary(int number) int2binary(16) τυπώνει στην οθόνη 10000 int2binary(7) τυπώνει στην οθόνη 111
int2binary(69) τυπώνει στην οθόνη 1000101 Η δυαδική μορφή ενός αριθμού, π.χ. 6, μπορεί να βρεθεί με τον ακόλουθο τρόπο, αν διαβάσετε τα υπόλοιπα από κάτω προς τα πάνω: 6:2 => Πηλίκο: 3, Υπόλοιπο:0 3:2 => Πηλίκο: 1, Υπόλοιπο:1 1:2 => Πηλίκο:0, Υπόλοιπο:1 6=110 102 Κεφάλαιο 9: Αφηρηµένοι Τύποι εδοµένων (ΑΤ ), Λίστες, ΑΤ Στοίβα και Ουρά ( ιάλεξη 10) 1. Ευθύγραμμη Απλά Συνδεδεμένη Λίστα: A) Ορίστε τη δομή μιας ευθύγραμμης απλά συνδεδεμένης λίστας που δημιουργείται με στατική δέσμευση μνήμης και θα περιέχει ακέραιους αριθμούς. B) Γράψετε μια μέθοδο που θα προσθέτει τα στοιχεία μιας συνδεδεμένης λίστας με τη χρήση της δομής στατικής μνήμης και θα επιστρέφει το συνολικό άθροισμα τους. Πρότυπο συνάρτησης: int addition(list *L) Κεφάλαιο 10: Στοίβες ( ιάλεξη 11) 1. Δίνεται η υλοποίηση μερικών πράξεων του ΑΤΔ στοίβας. Να ορίσετε τη δομή της στοίβας, να υλοποιήσετε της συναρτήσεις Push and Top και να ορίσετε τις αναγκαίες μεταβλητές, ώστε η συνάρτηση Push να προσθέτει το στοιχείο που εισάγεται και να επιστρέφει κάθε φορά το νέο άθροισμα. void MakeEmpty(Stack *S){ S->Length = 0; int IsEmpty(Stack *S){ return (S->Length == 0); void Pop(Stack *S){ if (!IsEmpty(S)) (S->Length)--;
Κεφάλαιο 11: Λίστες ( ιάλεξη 12) 1. Θεωρήστε πως έχουμε μια ευθύγραμμη απλά συνδεδεμένη λίστα (με δυναμική δέσμευση μνήμης) που κάθε κόμβος της περιέχει έναν ακέραιο αριθμό. Θεωρήστε ακόμα πως η λίστα είναι ταξινομημένη ώστε οι αριθμοί των κόμβων να πηγαίνουν από τον μικρότερο ως το μεγαλύτερο. Γράψτε μια μέθοδο που θα αφαιρεί από τη λίστα σας τους κόμβους με τους αριθμούς που επαναλαμβάνονται. Για παράδειγμα, αν η λίστα σας περιείχε τους κόμβους με αριθμούς: 1, 3, 5, 5, 5, 6, 7, 7, 9, 10 η συνάρτηση σας θα αφαιρούσε τους κόμβους με τα επαναλαμβανόμενα στοιχεία και θα είχαμε την εξής λίστα: 1, 3, 5, 6, 7, 9, 10. Δίνεται η δομή της ευθύγραμμης απλά συνδεδεμένης λίστας (με δυναμική δέσμευση μνήμης) η οποία να ακολουθηθεί στην υλοποίηση: typedef struct node { int data; struct node *next; NODE; typedef struct stack { NODE *head; int size; STACK;