ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 05: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών Ακαδηµαϊκό έτος 010 011, Χειµερινό εξάµηνο ΕΝ ΕΙΚΤΙΚΕΣ ΛΥΣΕΙΣ ΕΡΓΑΣΙΑ 1 0/09/010 Ηµεροµηνία Παράδοσης: Τετάρτη 0/10/010 ΘΕΜΑΤΙΚΕΣ ΕΝΟΤΗΤΕΣ: ΑΦΗΡΗΜΕΝΟΙ ΤΥΠΟΙ Ε ΟΜΕΝΩΝ, ΑΛΓΟΡΙΘΜΟΙ, ΣΥΜΒΟΛΟΣΕΙΡΕΣ Θεωρητική Άσκηση 1 (0 µονάδες) Αποδείξτε ότι ο χρόνος εκτέλεσης των ακόλουθων συναρτήσεων έχει ως εξής: α) + 9 + + 7 είναι O ( ) β) 6 + είναι O ( ) γ) + 10 είναι Ω ( ) Να δώσετε και την επαλήθευση για καθεµία από τις πιο πάνω συναρτήσεις. Λύση: α) Απόδειξη: Πρέπει να δείξουµε ότι υπάρχει c > 0, 0 1 έτσι ώστε, 9 7 + 9 + + 7 c * => + + + c => 9 7 1 + + + c => Για c = 1, 0 = 1 η παραπάνω ανισότητα ικανοποιείτε, εποµένως η συνάρτηση T ( ) = + 9 + + 7είναι O ( ).
Επαλήθευση: (c = 1, = 1) (c = 1, = ) (c = 1, = ) + 9 + + 7 c * => 1 1 + 9 + + 7 c * => 59 168 + 9 + + 7 c * => 17 567 β) Απόδειξη: Πρέπει να δείξουµε ότι υπάρχει c > 0, 0 1 έτσι ώστε, 6 6 + c * => 6 + + c => Για c = 11, 0 = 1 η παραπάνω ανισότητα ικανοποιείτε, εποµένως η συνάρτηση T ( ) = 6 + είναι O ( ). + 6 + c * => + + c => Επαλήθευση: (c = 11, = 1) (c = 11, = ) (c = 11, = ) 6 + c * => -1 11 6 + c * => 6 + c * => 11 99 γ) Απόδειξη: Πρέπει να δείξουµε ότι δεν υπάρχει c > 0, 0 1 έτσι ώστε, 10 10 + 10 c * => + c => + c => Η αριστερή πλευρά της ανισότητας έχει την µικρότερη τιµή 8.9 για = 10 =. 15. Εποµένως η συνάρτηση T ( ) = + 10 είναι Ω ( ) για 0 = και c. Μεγαλύτερες τιµές του 0 έχουν ως αποτέλεσµα µεγαλύτερες τιµές για τη σταθερά c, αλλά σε κάθε περίπτωση η πιο πάνω δήλωση ισχύει.
Επαλήθευση: (c =, = ) (c =, = ) (c =, = ) (c =, = 5) + 10 c * => 6 + 10 c * => 111 108 + 10 c * => 96 56 + 10 c * => 675 500 Θεωρητική Άσκηση (10 µονάδες) (Α) Περιγράψετε τον σκοπό των πιο κάτω συναρτήσεων. ηλώστε επίσης τον τύπο των παραµέτρων που δέχεται η καθεµία σαν είσοδο καθώς και τον τύπο των παραµέτρων που επιστρέφει η καθεµία σαν έξοδο. (8 µονάδες) 1. Συνάρτηση strle. Συνάρτηση strcpy. Συνάρτηση strcat. Συνάρτηση strcmp (Β) ώστε τα αποτελέσµατα που θα επιστρέψουν οι πιο κάτω ( µονάδες) it mai(){ char x[5] = "1_@abc"; pritf("strle: %d", strle(x)); it mai(){ char to[8]; char from[8]="protos"; strcpy(to, from); pritf("to=%s ad from=%s", to, from); Λύση: (Α) 1. Συνάρτηση strle it strle(s1): Δέχεται σαν είσοδο μία συμβολοσειρά. Επιστρέφει το μέγεθος του strig χωρίς να μετράει το \0, το ull.
. Συνάρτηση strcpy strcpy(s1,s): Αντιγράφει ένα strig s (πίνακα) σε ένα άλλο strig s1 (πίνακα). ηλαδή δέχεται σαν είσοδο συµβολοσειρές και αντιγράφει το δεύτερο στο πρώτο. Είναι void συνάρτηση.. Συνάρτηση strcat strcat(s1,s) : Αντιγράφει το strig s (πίνακα) στο τέλος του strig s1 (πίνακα). Είναι void συνάρτηση.. Συνάρτηση strcmp strcmp(s1,s): Συγκρίνει συµβολοσειρές χαρακτήρα χαρακτήρα µε βάση τον κώδικα ASCII. Αν ο πίνακας s1 αλφαβητικά είναι µεγαλύτερος από τον πίνακα strig s επιστρέφει θετικό αριθµό. Αν είναι ίσοι επιστρέφει 0, και αν ο s1 είναι µικρότερος αλφαβητικά από τον s επιστρέφει αρνητικό αριθµό. Επιστρέφει it. (Β) Strle: 8 to=protos ad from=protos Θεωρητική Άσκηση (10 µονάδες) ώστε το χρόνο εκτέλεσης χείριστης περίπτωσης των πιο κάτω προγραµµάτων σαν συνάρτηση του (Big Oh): 1. sum=0; for(i=0; i<; i++){ for(j=0; j<; j++){ sum++;. sum=0; for(i=0; i<; i++){ for(j=0; j<; j++){ sum++;. sum=0; for(i=0; i<; i++){ sum=sum+i; for(j=1; j< *; j++){ sum=sum+j;. sum=0; for(i=0; i<*; i++){ sum=sum+i;
Λύση: 1. Outer loop is:, Ier loop is: => * => O(^). Outer loop is:, Ier loop is: => * (we drop the costats) => O(). First loop is:, Secod loop is: ^ => +^ (drop lower terms) => O(^). Loop is: * => Although we iterate * times, we drop the costats => O() Mathematically, they are the same sice i ay case it will eed to iterate for elemets. Θεωρητική Άσκηση (10 µονάδες) Ας υποθέσουµε ότι έχουµε την παρακάτω δήλωση δοµής: typedef struct{ char a[8]; it b; it c; typos_egrafis; typos_egrafis egr; Ας υποθέσουµε ότι ένας ακέραιος αποθηκεύεται σε δύο λέξεις µνήµης και δύο χαρακτήρες σε µια λέξη µνήµης. Αν τώρα δώσουµε τις εξής τιµές στο κάθε στοιχείο (a = abcdefgh ; b = 69; c = 0), να υπολογίσετε την διεύθυνση(egr.c) και να υλοποιήσετε (παραστήσετε γραφικά) την δοµή καταγράφοντας τις διευθύνσεις όλων των µελών της. Λύση: διεύθυνση (egr.c) = διεύθυνση (egr.a) + + = 0 + 6 = 6 b = 0 egr.a egr.b egr.c b b+1 b+ b+ b+ b+5 b+6 b+7
Πρακτική Άσκηση 1 (10 µονάδες) Η βιβλιοθήκη <strig.h> περιέχει την συνάρτηση strcat η οποία εξυπηρετεί ένα συγκεκριµένο σκοπό (βλέπε Θεωρητική Άσκηση ). Υλοποιήστε ένα πρόγραµµα το οποίο περιέχει την δική σας συνάρτηση void mystrcat(char to[], char from[]) η οποία εξυπηρετεί τον ίδιο σκοπό µε την συνάρτηση της παραπάνω βιβλιοθήκης. οκιµάστε τη συνάρτηση σας µε τα ακόλουθα δεδοµένα: ΠΡΙΝ: to H E L L O \0???????? from W O R L D \0??? META: to H E L L O W O R L D \0?? from W O R L D \0???
Λύση: #iclude <stdio.h> void mystrcat(char to[], char from[]){ it i = 0, k = 0; // Evresi NULL character \0 sto to while (to[k]!= '\0') { k++; // atigrafi stoixeiw while (from[i]!= '\0') { to[k+i]=from[i]; i++; to[k+i]= \0 ; // prosthiki NULL character \0 sto to it mai(){ char to[] = "HELLO"; char from[] = " WORLD"; mystrcat(to, from); pritf("result: \"); pritf("%s \", to); pritf("%s \", from); Πρακτική Άσκηση (0 µονάδες) Γράψτε ένα πρόγραµµα το οποίο περιέχει µια συνάρτηση grammar η οποία επιστρέφει 1 (true) αν το Strig argumet που παίρνει τελειώνει σε able και το µέγεθος ολόκληρου του Strig είναι µεγαλύτερο από 6. Αλλιώς η συνάρτηση πρέπει να επιστρέφει 0 (false). Για παράδειγµα η λέξη acceptable πρέπει να επιστρέψει 1 καθώς τελειώνει σε able και το µέγεθος ολόκληρου του Strig είναι µεγαλύτερο από 6. Οι τιµές 1 και 0 πρέπει να αποθηκευτούν σε ένα µονοδιάστατο πίνακα ακεραίων. οκιµάστε τη συνάρτηση σας µε τα ακόλουθα δεδοµένα (mai) τα οποία πρέπει να αποθηκευτούν σε ένα δισδιάστατο πίνακα ο οποίος αποτελεί την η παράµετρο της συνάρτησης grammar(it row, char words[rows][cols]). admirable, able, egligible, stable, affordable, cable, feasible, acceptable, doable, permissible Πρότυπο συνάρτησης: void grammar(it row, char words[rows][cols]);
Λύση: #iclude <stdio.h> #defie ROWS 10 #defie COLS 1 #defie BIT 10 it bits[bit]; it grammar(it row, char strig[rows][cols]){ it legth; legth = strle(strig[row]); if (legth > 6){ if(strig[row][legth-] == 'a' && strig[row][legth-] == 'b' && strig[row][legth-] == 'l' && strig[row][legth-1] == 'e') retur 1; else retur 0; retur 0; it mai(){ char words[rows][cols] = {"admirable", "able", "egligible", "stable", "affordable", "cable", "feasible", "acceptable", "doable", "permissible"; it i; for (i=0; i<rows; i++){ it result = grammar(i, words); pritf("word: %s \", words[i]); bits[i] = result; for (i=0; i<bit; i++){ pritf("result: %d \", bits[i]);
Πρακτική Άσκηση (0 µονάδες) Γράψτε ένα πρόγραµµα το οποίο περιέχει µια συνάρτηση reverse(char *letters) η οποία µετατρέπει όλα τα κεφαλαία γράµµατα του Strig σε µικρά και όλα τα µικρά γράµµατα του Strig σε κεφαλαία. Σηµειώστε ότι το πρόγραµµα σας πρέπει να αλλάξει το ίδιο Strig iput το οποίο θα περάσετε στην συνάρτηση σαν τιµή εισόδου, χωρίς να κάνετε χρήση νέας µεταβλητής. Η έννοια µικρών και µεγάλων χαρακτήρων ορίζεται µόνο για τους χαρακτήρες Α-Ζ και a-z. Παράδειγµατα: iput=achievable µας επιστρέφει iput=achievable iput=cable µας επιστρέφει iput=cable οκιµάστε τη συνάρτηση σας ζητώντας καταρχάς από τον χρήστη να εισαγάγει τον αριθµό των λέξεων που θα µετατραπούν (π.χ. ) και στη συνέχεια να εισαγάγει µία προς µία τις λέξεις εκτυπώνοντας κάθε φορά το αποτέλεσµα. Χρησιµοποιήστε τις ακόλουθες λέξεις για να ελέξετε το πρόγραµµα σας: iput=doable iput=affordable iput=acceptable Πρότυπο συνάρτησης: void reverse(char *letters); Υπόδειξη: Χρησιµοποιήστε τον πίνακα ASCII.
Λύση: #iclude <stdio.h> #defie CHARS 10 void reverse(char *letters){ it i = 0; it legth = strle(letters); for (i=0; i <= legth; i++){ if(letters[i]>=97 && letters[i] <=1) { letters[i] = letters[i] ; else if(letters[i]>=65 && letters[i] <=90) { letters[i] = letters[i] + ; it mai(){ it i, = 0; pritf("how may words? \"); scaf("%d", &); for (i=0; i<; i++){ char iput[chars]; pritf("eter word to reverse it: \"); scaf("%s", iput); reverse(iput); pritf("result: %s \", iput);