Ε.Α.Π./ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ 3η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟΥ ΕΤΟΥΣ 2012-2013 4ος Τόμος ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ 19/01/2013 Ημερομηνία παράδοσης εργασίας: Παρασκευή 1/3/2013 Καταληκτική ημερομηνία παραλαβής: Τρίτη 5/3/20131 Ημερομηνία ανάρτησης ενδεικτικών λύσεων: Πέμπτη 7/3/2013 Καταληκτική ημερομηνία αποστολής σχολίων στον φοιτητή: Παρασκευή 22/3/2013
ΥΠΟΕΡΓΑΣΙΑ 1.
(βαθμοί 25)
ΥΠΟΕΡΓΑΣΙΑ 2.
(βαθμοί 25)
ΥΠΟΕΡΓΑΣΙΑ 3.
(βαθμοί 25)
ΥΠΟΕΡΓΑΣΙΑ 4.
(βαθμοί 25)
ΣΥΝΟΛΟ
1
(βαθμοί 100)
Σύμφωνα με τον Κανονισμό Σπουδών, η καταληκτική ημερομηνία για την παραλαβή της Γ.Ε. από το μέλος ΣΕΠ είναι η επόμενη Τρίτη από το τέλος της εβδομάδας παράδοσης Γ.Ε.
3η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ
ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2012-2013
ΥΠΟΕΡΓΑΣΙΑ 1. 1.
(βαθμοί 25)
Έστω το παρακάτω απόσπασμα κώδικα στη γλώσσα προγραμματισμού C: int i1, i2; int *p1, *p2; i1 = 5; p1 = &i1; i2 = *p1 / 2 + 10; p2 = p1;
Τι θα τυπωθεί στην οθόνη μετά την εκτέλεση της παρακάτω εντολής: printf("i1 = %i, i2 = %i, *p1 = %i, *p2 = %i\n", i1, i2, *p1, *p2);
Τεκμηριώστε την απάντησή σας. 2.
H ακόλουθη συνάρτηση στη γλώσσα προγραμματισμού C λαμβάνει ως παράμετρο μια συμβολοσειρά ψηφίων (δηλ. αλφαριθμητικό που αποτελείται μόνο από τα ψηφία 0-9), τη μετατρέπει στον αντίστοιχο αριθμό στο δεκαδικό σύστημα αρίθμησης και επιστρέφει τον αριθμό αυτό. Συμπληρώστε τη συνάρτηση στο σημείο που συμβολίζεται με ??? ώστε να λειτουργεί σωστά. int strToInt (char string[]) { int i, intValue, result = 0; for (i = 0; string[i] >= '0' && string[i] <= '9'; ++i) { intValue = string[i] - '0'; result = ??? } return result; }
3.
Η ακόλουθη συνάρτηση στη γλώσσα προγραμματισμού C αθροίζει τα στοιχεία ενός μονοδιάστατου πίνακα ακεραίων αριθμών και επιστρέφει το άθροισμά τους. Ο μονοδιάστατος πίνακας ακεραίων (array) καθώς και το μέγεθος του πίνακα (n) δίνονται ως παράμετροι στη συνάρτηση. Συμπληρώστε τη συνάρτηση στα δύο σημεία που συμβολίζονται με ??? ώστε να λειτουργεί σωστά. int arraySum (int array[], int n) { int sum = 0, *ptr; for (ptr = array; ???; ++ptr) sum += ??? return sum; }
Σελίδα 2 από 8
3η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ 4.
ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2012-2013
Να γραφεί πρόγραμμα στη γλώσσα προγραμματισμού C, το οποίο:
διαβάζει δύο ακέραιες τιμές και τις εκχωρεί σε δύο ακέραιες μεταβλητές.
καλεί µια συνάρτηση τύπου void, η οποία δέχεται ως παραμέτρους τις δύο παραπάνω ακέραιες μεταβλητές και επιστρέφει στον πρώτο ακέραιο το γινόμενο των δύο ακεραίων και στο δεύτερο ακέραιο το πηλίκο της ακέραιας διαίρεσης των δύο ακεραίων.
εμφανίζει στην οθόνη τις νέες τιμές των δύο ακέραιων μεταβλητών.
ΥΠΟΕΡΓΑΣΙΑ 2. 1.
(βαθμοί 25)
Να γραφεί πρόγραμμα στη γλώσσα προγραμματισμού C, που διαβάζει δυο λέξεις και ελέγχει εάν η μία λέξη είναι αναγραμματισμός της άλλης. Διευκρινίζεται ότι μια λέξη w1 είναι αναγραμματισμός μιας λέξης w2, αν οι w1 και w2 έχουν ακριβώς τα ίδια γράμματα και ίδιο πλήθος εμφανίσεων για κάθε γράμμα. Υποθέτουμε πως ο χρήστης εισάγει μόνο λέξεις που αποτελούνται από τουλάχιστον έναν (1) και το πολύ 30 πεζούς χαρακτήρες του αγγλικού αλφαβήτου. Ακολουθεί ένα σχετικό παράδειγμα (Εικόνα 1):
Εικόνα 1 2.
Σε μια ειδική κατηγορία ακεραίων αριθμών ικανοποιείται το ακόλουθο κριτήριο: Για κάθε αριθμό της κατηγορίας αυτής, το άθροισμα των μεμονωμένων ψηφίων του, υψωμένων εις τον κύβο, είναι ίσο με τον ίδιο τον αριθμό. Για παράδειγμα: το 1 ικανοποιεί το κριτήριο αυτό, αφού 13 = 1. Ομοίως, το ίδιο ισχύει για τον αριθμό 371, αφού 33 + 73 + 13 = 371. Να γραφεί πρόγραμμα στη γλώσσα προγραμματισμού C, που να τυπώνει τους αριθμούς από το 1 μέχρι και το 500 που ικανοποιούν το ανωτέρω κριτήριο.
3.
Να γραφεί πρόγραμμα στη γλώσσα προγραμματισμού C, το οποίο να διαβάζει έναν θετικό ακέραιο αριθμό το πολύ 9 ψηφίων (εφαρμόστε σχετικό αμυντικό προγραμματισμό) και να εμφανίζει, κάνοντας χρήση αναδρομικής συνάρτησης, το άθροισμα των ψηφίων του αριθμού. Για παράδειγμα, ο αριθμός 462459 έχει άθροισμα ψηφίων: 4+6+2+4+5+9=30.
Σελίδα 3 από 8
3η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ 4.
ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2012-2013
Να γραφεί πρόγραμμα στη γλώσσα προγραμματισμού C, που διαβάζει μια ημερομηνία (π.χ. 31/12/2012) και εμφανίζει στην οθόνη την επόμενη ημερομηνία (δηλ. 1/1/2013). Για να μπορεί να εφαρμοστεί αμυντικός προγραμματισμός κατά την είσοδο της ημερομηνίας, ο χρήστης θα δίνει πρώτα το έτος (απαιτείται να είναι 4ψήφιος αριθμός), μετά το μήνα (σε αριθμητική μορφή) και μετά την ημέρα. Ιδιαίτερη προσοχή χρειάζεται για τα δίσεκτα έτη. Για να προσδιορίσουμε αν ένα έτος είναι δίσεκτο εφαρμόζουμε τα εξής: α. Ένα έτος είναι δίσεκτο όταν διαιρείται με το 4 άλλα δεν διαιρείται με το 100. β. Κατ’ εξαίρεση του παραπάνω κανόνα, ένα έτος που διαιρείται με το 400 είναι δίσεκτο. To πρόγραμμα να αρχίζει ως εξής: #include struct date { int day; int month; int year; }; const int daysPerMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
Ακολουθεί ένα σχετικό παράδειγμα (Εικόνα 2):
Εικόνα 2
ΥΠΟΕΡΓΑΣΙΑ 3.
(βαθμοί 25)
Υποθέτουμε ότι μια μηχανή προσφέρει τέσσερα διαφορετικά είδη ροφημάτων (καφέ, καφέ με γάλα, σοκολάτα και σοκολάτα με γάλα), που κοστίζουν 1.5, 1.8, 2.1 και 2.4 ευρώ αντίστοιχα. Η μηχανή δέχεται κέρματα των 10, 20 και 50 λεπτών, του ενός ευρώ και των 2 ευρώ, καθώς και χαρτονομίσματα των 5 και 10 ευρώ, και επιστρέφει ρέστα χρησιμοποιώντας μόνο κέρματα. Να υλοποιηθεί πρόγραμμα στη γλώσσα προγραμματισμού C, το οποίο: 1. Εμφανίζει κατάλογο επιλογής (μενού) των προσφερόμενων ειδών (αριθμούμενα από το 1 έως το 4) με το αντίστοιχο αντίτιμο για το καθένα, την επιλογή 0 για έξοδο από το πρόγραμμα και στη συνέχεια διαβάζει την επιλογή του χρήστη (είδος που προτιμά ή έξοδος), εφαρμόζοντας αμυντικό προγραμματισμό προκειμένου να διασφαλιστεί ότι ο χρήστης εισάγει τιμή μεταξύ 0 και 4. Σελίδα 4 από 8
3η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ
ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2012-2013
2. Στη συνέχεια διαβάζει το ποσό που απαιτείται για την πληρωμή του είδους που επέλεξε ο χρήστης. Κατά την εισαγωγή του ποσού να χρησιμοποιηθεί αμυντικός προγραμματισμός, ώστε το ποσό που εισάγει ο χρήστης να αντιστοιχεί σε αποδεκτό κέρμα ή χαρτονόμισμα. Το πρόγραμμα να ελέγχει εάν το ποσό που εισήχθη είναι μεγαλύτερο ή ίσο με το ποσό που απαιτείται. Στην περίπτωση που έχει εισαχθεί ποσό μικρότερο από το απαιτούμενο, το πρόγραμμα τυπώνει κατάλληλο μήνυμα με το επιπλέον ποσό που πρέπει να εισαχθεί και προτρέπει το χρήστη να εισάγει το υπολειπόμενο ποσό. Αυτή η διαδικασία συνεχίζεται μέχρι να εισαχθεί ποσό ίσο με ή μεγαλύτερο από το ποσό που απαιτείται για την αγορά του είδους που επελέγη από το χρήστη. 3. Υπολογίζει το υπόλοιπο (ρέστα) που πρέπει να επιστρέψει και τυπώνει κατάλληλο μήνυμα που ενημερώνει το χρήστη για το ποσό που θα του επιστραφεί. 4. Υπολογίζει το ελάχιστο πλήθος κερμάτων που θα επιστραφούν στο χρήστη ως υπόλοιπο (ρέστα) και τυπώνει μήνυμα με πόσα και ποιας αξίας κέρματα πραγματοποιείται αυτό. Το πρόγραμμα θα δέχεται από το χρήστη τα ποσά σε ευρώ με ακρίβεια ενός δεκαδικού ψηφίου, αλλά θα χειρίζεται τα ποσά σε λεπτά. Ακολουθεί σχετικό παράδειγμα (Εικόνα 3), όπου ο χρήστης για το είδος 2, που κοστίζει 1.8 ευρώ, εισάγει διαδοχικά κέρματα των 1, 0.5 και 0.5 ευρώ και λαμβάνει ρέστα 0.2 ευρώ, ενώ στη συνέχεια επιλέγει 0 για έξοδο από το πρόγραμμα.
Εικόνα 3 Σελίδα 5 από 8
3η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ
ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2012-2013
ΥΠΟΕΡΓΑΣΙΑ 4.
(βαθμοί 25)
Μία από τις χρήσεις της γλώσσας προγραμματισμού C είναι η διαχείριση και επεξεργασία αλφαριθμητικών. Σκοπός της συγκεκριμένης υποεργασίας είναι η μελέτη αυτών των δυνατοτήτων, για τον αποτελεσματικό χειρισμό ενός συνόλου αλφαριθμητικών. Θεωρήστε λοιπόν έναν πίνακα Ν στοιχείων, όπου σε κάθε στοιχείο αποθηκεύεται το περιεχόμενο μίας μεταβλητής τύπου δομής με δύο μέλη: ένα αλφαριθμητικό και μία ακέραια τιμή, που υποδηλώνει το μήκος του αλφαριθμητικού. Θεωρήστε επίσης ότι κάθε αλφαριθμητικό έχει μέγιστο μήκος Μ-1 και αποτελείται μόνο από αριθμητικούς και αλφαβητικούς χαρακτήρες (πεζοί ή κεφαλαίοι του αγγλικού αλφαβήτου), χωρίς κενά. Έστω word_table το όνομα του πίνακα, με τη δήλωσή του να δίνεται ως εξής: struct word_pair { char word[Μ];
//το αλφαριθμητικό
int length;
//το μήκος του αλφαριθμητικού
}; struct word_pair word_table[N]; //ο πίνακας αλφαριθμητικών και μηκών
Ζητείται να γραφούν οι εξής συναρτήσεις στη γλώσσα προγραμματισμού C: 1.
Μία συνάρτηση στην οποία θα ζητείται από το χρήστη η είσοδος αλφαριθμητικών σε όλα τα στοιχεία του πίνακα word_table, ενώ για κάθε αλφαριθμητικό θα υπολογίζει και θα αποθηκεύει στην αντίστοιχη θέση το μήκος του. Κατά την ανάγνωση των αλφαριθμητικών να εφαρμοστεί αμυντικός προγραμματισμός για το αν κάθε αλφαριθμητικό αποτελείται μόνο από αριθμητικούς και αλφαβητικούς χαρακτήρες (πεζοί ή κεφαλαίοι του αγγλικού αλφαβήτου), χωρίς κενά. Τέλος, η συνάρτηση να εκτυπώνει τη λίστα των αλφαριθμητικών του πίνακα μαζί με τα μήκη τους. Η συνάρτηση να δηλωθεί ως void initialize(struct word_pair word_table[], int size), (με size συμβολίζεται ο αριθμός των στοιχείων του πίνακα word_table).
2.
Μία συνάρτηση που θα ταξινομεί σε φθίνουσα διάταξη τον πίνακα word_table με βάση το μήκος των αλφαριθμητικών που περιέχει. Σε περίπτωση που έχουμε στοιχεία του πίνακα με αλφαριθμητικά ίδιου μήκους, η διάταξη μεταξύ τους θα γίνεται σε φθίνουσα λεξικογραφική διάταξη των αλφαριθμητικών. Προτείνεται η διάταξη του πίνακα να γίνει με χρήση του αλγορίθμου ταξινόμησης φυσαλίδας (σελ. 205-206 τόμου Β). Η συνάρτηση στο τέλος να εκτυπώνει την ταξινομημένη λίστα των αλφαριθμητικών του πίνακα. Η συνάρτηση να δηλωθεί ως void table_sort(struct word_pair word_table[], int size), (με size συμβολίζεται ο αριθμός των στοιχείων του πίνακα word_table). Σελίδα 6 από 8
3η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ 3.
ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2012-2013
Μία συνάρτηση που δοθέντος ενός αλφαριθμητικού εισόδου θα εντοπίζει και θα εκτυπώνει όλες τις θέσεις του πίνακα που το αλφαριθμητικό τους το εμπεριέχει σαν υποσυμβολοσειρά. Ένα αλφαριθμητικό x καλείται υποσυμβολοσειρά ενός άλλου αλφαριθμητικού y, αν το x εμφανίζεται ως ακολουθία διαδοχικών συμβόλων του y. Η συνάρτηση να δηλωθεί ως void sub_string(struct word_pair word_table[], int size, char search_string[M]), (με size συμβολίζεται ο αριθμός των στοιχείων του πίνακα word_table, και με search_string το αλφαριθμητικό που αναζητούμε).
Ελέγξτε τον κώδικά σας με ένα κυρίως πρόγραμμα το οποίο καλεί τις ανωτέρω συναρτήσεις με τη σειρά με την οποία ορίστηκαν και στο οποίο οι τιμές Ν και Μ δηλώνονται ως συμβολικές σταθερές.
Υποδείξεις: Για τον αμυντικό προγραμματισμό κατά την ανάγνωση των αλφαριθμητικών, προτείνεται η χρήση της συνάρτησης int isalnum(int ch) της βιβλιοθήκης που επιστρέφει μη μηδενική τιμή (δηλαδή μια λογικά «Αληθή» τιμή) αν το όρισμα της ch είναι αριθμητικός χαρακτήρας ή γράμμα (πεζό ή κεφαλαίο) του αλφαβήτου, διαφορετικά επιστρέφει 0 (δηλαδή μια λογικά «Ψευδή» τιμή). Το αλφάβητο είναι τo αγγλικό στην προεπιλεγμένη ρύθμιση παραμέτρων (locale) της C. Το όρισμα ch μπορεί να είναι είτε χαρακτήρας, είτε η τιμή τέλους αρχείου (EOF) γι αυτό και δηλώνεται ως int στη βιβλιοθήκη . Για τη λεξικογραφική διάταξη των αλφαριθμητικών προτείνεται η χρήση της συνάρτησης int strcmp(const char* cs, const char* ct) της βιβλιοθήκης , η οποία επιστρέφει θετική τιμή αν το αλφαριθμητικό cs είναι λεξικογραφικά μεγαλύτερο από το αλφαριθμητικό ct, 0 αν τα αλφαριθμητικά είναι ακριβώς ίδια, και αρνητική τιμή αν το αλφαριθμητικό cs είναι λεξικογραφικά μικρότερο από το αλφαριθμητικό ct.
Σελίδα 7 από 8
3η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ
ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2012-2013
Γενικές Υποδείξεις: Ι)
Αμυντικός προγραμματισμός και σχολιασμός κώδικα Ο κώδικάς σας θα πρέπει να είναι καλά σχολιασμένος και να χρησιμοποιεί στοιχεία αμυντικού προγραμματισμού, όπου αυτό ζητείται. Ειδικά για τον αμυντικό προγραμματισμό, θα πρέπει ο κώδικάς σας να εντοπίζει και να απορρίπτει λανθασμένες εισόδους του χρήστη (εμφανίζοντάς του το ανάλογο μήνυμα) και να τον προτρέπει να εισάγει αποδεκτή είσοδο. Για την εφαρμογή του αμυντικού προγραμματισμού αρκεί να γίνεται έλεγχος ως προς το εάν μία τιμή που εισάγεται από το χρήστη του προγράμματος βρίσκεται εντός αποδεκτών ορίων (π.χ. να είναι θετική, διαφορετική από το 0, μεγαλύτερη από 20 κλπ.). Δεν απαιτείται έλεγχος ως προς το εάν η τιμή ανήκει στο σωστό τύπο δεδομένων (π.χ. ακέραιος, πραγματικός αριθμός, χαρακτήρας κλπ.) σύμφωνα με τον τύπο της μεταβλητής στην οποία θα αποθηκευτεί η τιμή αυτή.
ΙΙ) Τρόπος παράδοσης εργασίας α) Στα ερωτήματα που ζητείται υλοποίηση κώδικα σε γλώσσα C, για να θεωρηθούν οι απαντήσεις σας ολοκληρωμένες θα πρέπει:
Ο κώδικας (όπου ζητείται) να είναι επαρκώς σχολιασμένος και ενσωματωμένος μέσα στο .doc αρχείο του Word, καθώς και σε ξεχωριστό .c αρχείο.
Το όνομα κάθε .c αρχείου να περιλαμβάνει το επώνυμό σας με λατινικούς χαρακτήρες, το χαρακτήρα της υπογράμμισης και τον αριθμό του συγκεκριμένου υποερωτήματος (π.χ. αν το επώνυμό σας είναι Γεωργίου, τότε ο κώδικας για την υποεργασία 1Β θα έχει το όνομα Georgiou_1b.c, ενώ για την υποεργασία 4Α θα έχει το όνομα Georgiou_4a.c)
Κάθε αρχείο C που θα παραδοθεί θα πρέπει τουλάχιστον να περνάει τη φάση της μεταγλώττισης χωρίς λάθη.
β) Οι απαντήσεις πρέπει να είναι γραμμένες με χρήση επεξεργαστή κειμένου (π.χ. Word) σε σελίδες διαστάσεων Α4, με περιθώρια για παρατηρήσεις / σχόλια από τον Καθηγητή - Σύμβουλο. Το σύνολο των σελίδων των απαντήσεων καλό είναι να μην υπερβαίνει τις 12 σελίδες. γ) Τα .c αρχεία με τον πηγαίο κώδικα και το .doc αρχείο κειμένου να αναρτηθούν στο moodle όλα μαζί σε συμπιεσμένη μορφή σε ένα αρχείο τύπου .zip. ***********************************************************************************
Σελίδα 8 από 8