ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2012-2013 Στόχοι Συµβολοσειρές, πίνακες Πριν ξεκινήσετε Βήµα 1: Πηγαίνετε στο φάκελο ce120 και κατασκευάστε µέσα σε αυτόν ένα φάκελο µε όνοµα lab5. Μέσα σε αυτό το φάκελο θα αποθηκεύσετε τις απαντήσεις σας για το σηµερινό εργαστήριο. Βήµα 2: Ανοίξτε το Kate. Αν δεν έχετε κάνει τις ρυθµίσεις για τη στοίχιση, κάντε τις τώρα. Οδηγίες εδώ. Βήµα 3: Κάντε τις ασκήσεις της εβδοµάδας. Σας θυµίζουµε πως η εντολή για να κάνετε compile ένα αρχείο µε όνοµα lab5.c είναι : gcc -g -Wall lab5.c -o lab5 και αν δεν υπάρχουν λάθη, θα δηµιουργηθεί το εκτελέσιµο αρχείο lab5 το οποίο µπορείτε να τρέξετε γράφοντας./lab5 1
Άσκηση 1 Το πρόγραµµα που θα γράψετε για την άσκηση 1 πρέπει να το αποθηκεύσετε σε αρχείο µε όνοµα lab5a.c µέσα στο φάκελο lab5. Διαβάστε όλη την εκφώνηση της άσκησης πριν αρχίσετε να γράφετε κώδικα, και ειδικά το σηµείο που µαρκάρεται "ΠΡΟΣΟΧΗ". Σε αυτή την άσκηση θα γράψετε ένα πρόγραµµα το οποίο δέχεται πληροφορίες για τη συχνότητα εµφάνισης χαρακτήρων σε ένα κείµενο και µετά τους εµφανίζει όλους ταξινοµηµένους µε αύξουσα σειρά. Το πρόγραµµα ξεκινά διαβάζοντας τα δεδοµένα από το πληκτρολόγιο, τα οποία δίνονται ανά γραµµή στην παρακάτω µορφή: Ένας χαρακτήρας ο οποίος είναι µεταξύ 'a' και 'z' (συµπεριλαµβανοµένων) Ένα κενό Ένας ακέραιος ο οποίος είναι το πλήθος εµφανίσεων του προηγούµενου χαρακτήρα. Αλλαγή γραµµής Δεν είναι απαραίτητο να εµφανίζονται όλοι οι χαρακτήρες ή να εµφανίζονται µε κάποια σειρά. Μπορείτε να υποθέσετε ότι κάθε χαρακτήρας δε µπορεί να έχει περισσότερες από 10 εµφανίσεις. Κατασκευάστε ένα πίνακα στον οποίο θα αποθηκεύσετε τα πλήθη εµφανίσεων έτσι ώστε στη θέση 0 του πίνακα να είναι ο αριθµός εµφανίσεων του 'a', στη θέση 1 ο αριθµός εµφανίσεων του 'b' κ.ο.κ. Αν τα δεδοµένα που θα διαβαστούν είναι 0 - τότε θεωρούµε ότι δεν υπάρχουν άλλα και η ανάγνωση σταµατά. Η πληροφορία 0 - δεν εισάγεται στον πίνακα. Το πρόγραµµα δε χρειάζεται να εκτυπώνει κάποιο µήνυµα προς το χρήστη. Κατασκευάστε ένα δεύτερο πίνακα, στον οποίο θα αποθηκεύσετε µια συµβολοσειρά ως εξής: Για κάθε χαρακτήρα από 'a' έως 'z' γράφετε τόσα αντίγραφα αυτού στη συµβολοσειρά όσο είναι το πλήθος που αποθηκεύσατε στον πίνακα. Ανάµεσα σε διαφορετικούς χαρακτήρες πρέπει να γράψετε ως διαχωριστικό το χαρακτήρα %. Αν ένας χαρακτήρας έχει µηδέν εµφανίσεις, τότε πρέπει να τον παρακάµπτετε και να πηγαίνετε στον επόµενο. Τέλος, εκτυπώστε τη συµβολοσειρά. Παράδειγµα εκτέλεσης: ΠΡΟΣΟΧΗ: Το πρόγραµµα πρέπει να είναι γραµµένο έτσι ώστε να µπορούµε εύκολα να αλλάξουµε το εύρος χαρακτήρων. Αυτό σηµαίνει πως (α) το πλήθος των δυνατών χαρακτήρων, το οποίο στη συγκεκριµένη άσκηση είναι 26 πρέπει να είναι δηλωµένο ως σταθερά και να χρησιµοποιείται αναλόγως, και (β) δεν πρέπει να χρησιµοποιήσετε δοµές ελέγχου για να βρείτε τη θέση του πίνακα που αντιστοιχεί σε κάθε χαρακτήρα. Θα πρέπει να σκεφτείτε ένα τύπο αριθµητικής χαρακτήρων ο οποίος θα σας δίνει τη θέση 0 αν ο χαρακτήρας είναι a, τη θέση 1 αν ο βαθµός είναι b κ.ο.κ. 2
Άσκηση 2 Το πρόγραµµα που θα γράψετε για την άσκηση 2 πρέπει να το αποθηκεύσετε σε αρχείο µε όνοµα lab5b.c µέσα στο φάκελο lab5. Γράψτε ένα πρόγραµµα το οποίο κατασκευάζει έναν αρχικά άδειο πίνακα χαρακτήρων και µετά τον γεµίζει από όσα αντίγραφα µιας συµβολοσειράς χωράνε σε αυτόν. Για την ακρίβεια, το πρόγραµµά σας πρέπει να: 1. Κατασκευάζει ένα πίνακα χαρακτήρων µεγέθους SIZE. Ο πίνακας αρχικά είναι άδειος. 2. Εκτυπώνει το µήνυµα "Enter word :" και διαβάζει από το πληκτρολόγιο µια λέξη µέγιστου µεγέθους SIZE (συµπεριλαµβανοµένου του '\0') 3. Υπολογίζει πόσες φορές χωρά η λέξη στον αρχικό πίνακα και την αντιγράφει σε αυτόν τόσες φορές. Αν περισσεύουν θέσεις στον αρχικό πίνακα, τότε αντιγράφει σε αυτές όσους χαρακτήρες της λέξης χωράνε, λαµβάνοντας υπόψη ότι θα χρειαστεί και µια θέση για το '\0' στον πίνακα χαρακτήρων. 4. Εκτυπώνει τον πίνακα ως συµβολοσειρά. Χρησιµοποιήστε την τιµή 15 για το SIZE για να ελέγξετε την ορθότητα του προγράµµατός σας, αλλά πρέπει να είναι γραµµένο µε τέτοιο τρόπο ώστε να λειτουργεί σωστά για οποιαδήποτε θετική τιµή του SIZE. Το πρόγραµµά σας πρέπει να χρησιµοποιεί συναρτήσεις από το string.h Στο παρακάτω σχήµα µπορείτε να δείτε την έξοδο της δικής µας λύσης για διάφορες λέξεις. ΟΔΗΓΙΕΣ ΓΙΑ ΤΗΝ ΑΠΟΣΤΟΛΗ ΤΩΝ ΑΣΚΗΣΕΩΝ ΒΡΙΣΚΟΝΤΑΙ ΣΤΟ ΤΕΛΟΣ ΤΟΥ ΦΥΛΛΑΔΙΟΥ 3
Συµπληρωµατικές ασκήσεις Άσκηση 3 Αποθηκεύστε το πρόγραµµα που θα γράψετε για την άσκηση 3 σε αρχείο µε όνοµα lab5c.c Γράψτε ένα πρόγραµµα το οποίο: 1. Εκτυπώνει το µήνυµα "Enter word :", διαβάζει µια συµβολοσειρά µήκους το πολύ 50 και την αποθηκεύει σε ένα πίνακα χαρακτήρων. Η συµβολοσειρά αυτή περιέχει γράµµατα και ψηφία. 2. Διατρέχει τη συµβολοσειρά και κάθε φορά που βρίσκει ένα ψηφίο το αντιγράφει σε µια δεύτερη συµβολοσειρά, σβήνοντάς το από την αρχική. 3. Εκτυπώνει το µήνυµα "Letters: X" όπου X είναι η αρχική συµβολοσειρά χωρίς να περιέχει ψηφία 4. Εκτυπώνει ένα χαρακτήρα αλλαγής γραµµής 5. Εκτυπώνει το µήνυµα "Digits: X" όπου X είναι η νεα συµβολοσειρά από ψηφία Τι να προσέξετε: Το πρόγραµµα πρέπει να είναι γραµµένο µε τέτοιο τρόπο ώστε να µπορούµε να αλλάξουµε εύκολα το µέγεθος της αρχικής συµβολοσειράς χωρίς να "σπάσει" το πρόγραµµα. Τον τερµατικό χαρακτήρα '\0'. Επίσης, σηµειώστε πως στο µέγεθος 50 που αναφέρεται πιο πάνω, δεν έχει υπολογιστεί ο τερµατικός χαρακτήρας. Χρησιµοποιήστε κατάλληλη συνάρτηση χαρακτήρων (δείτε εδώ) για την ανίχνευση ψηφίων Σβήνουµε ένα χαρακτήρα από τη συµβολοσειρά µεταφέροντας όλους τους υπόλοιπους µια θέση πριν. Όταν κάνετε έλεγχο ορθότητας δοκιµάστε να δώστε λέξεις που περιέχουν διαδοχικά ψηφία, λέξεις που δεν περιέχουν καθόλου ψηφία και λέξεις που περιέχουν µόνο ψηφία. Στο παρακάτω σχήµα φαίνεται η έξοδος της δικής µας λύσης για διάφορες λέξεις εισόδου: 4
Άσκηση 4 Αποθηκεύστε το πρόγραµµα που θα γράψετε για την άσκηση 4 σε αρχείο µε όνοµα lab5d.c Επαναλάβετε την άσκηση 2, µε τις παρακάτω αλλαγές: Αφού τοποθετηθεί η λέξη στον πίνακα, τα βήµατα 2-4 επαναλαµβάνονται για καινούργια λέξη, µέχρις ότου δοθεί η λέξη STOP. Επίσης, η λέξη προστίθεται κάθε φορά στον πίνακα µόνο αν χωρά ολόκληρη. Αν δε χωράει, τότε το βήµα 3 δεν ολοκληρώνεται και το πρόγραµµα προχωρά στην επόµενη λέξη. Τρέξτε το πρόγραµµά σας δίνοντας µεγάλες λέξεις. Τι παρατηρείτε? Τι πιστεύετε ότι προκάλεσε την περίεργη συµπεριφορά του προγράµµατος και πώς µπορούµε να λύσουµε το πρόβληµα? Σηµείωση: Αν η άσκηση δε σας παρουσιάζει πρόβληµα όταν δίνετε µεγάλες λέξεις, τότε κάτι δεν έχετε κάνει σωστά :) Αποστολή του προγράµµατος για διόρθωση και σχολιασµό Η αποστολή γίνεται από τον οδηγό. Για να στείλετε το πρόγραµµά σας για βαθµολόγηση, ανοίξτε ένα τερµατικό (ή χρησιµοποιήστε αυτό του Kate), πηγαίνετε στο φάκελο lab5, και χρησιµοποιήστε την εντολή mkdir για να κατασκευάσετε ένα νέο φάκελο µε βάση τα ονόµατα των δύο µελών της οµάδας. Για την ακρίβεια, το όνοµα του φακέλου πρέπει να είναι (µε λατινικούς χαρακτήρες) : επώνυµο1_am1_επώνυµο2_αμ2 Για παράδειγµα, mkdir doufexi_1234_antonopoulos_5678 ΑΜ είναι ο τετραψήφιος αριθµός µητρώου σας. Αντιγράψτε το lab5a.c µέσα στο νέο φάκελο (cp lab5a.c doufexi_1234_antonopoulos_5678) Αντιγράψτε το lab5b.c µέσα στο νέο φάκελο (cp lab5b.c doufexi_1234_antonopoulos_5678) Τέλος πακετάρετε και συµπιέστε το φάκελο µε το πρόγραµµά σας. Η εντολή είναι tar czvf επώνυµο1_αμ1_επώνυµο2_αμ2.tgz επώνυµο1_αμ1_επώνυµο2_αμ2 Θα πρέπει να δηµιουργηθεί το αρχείο µε όνοµα επώνυµο1_αμ1_επώνυµο2_αμ2.tgz Αν εµφανιστεί κάποιο µήνυµα λάθους, ζητήστε βοήθεια! Στείλτε ένα email στη διεύθυνση: ce120lab@gmail.com CC στον πλοηγό, µε τίτλο (subject): CE120 lab5 συνηµµένο (attached) το αρχείο: επώνυµο1_αμ1_επώνυµο2_αμ2.tgz Αφού στείλετε το email, επιβεβαιώστε ότι είχε σωστό attachment κι ότι έλαβε αντίγραφο και ο πλοηγός. Ο πλοηγός µπορεί να ξεπακετάρει το tgz αρχείο στο δικό του υπολογιστή από τερµατικό, µε την εντολή tar xzf επώνυµο1_αμ1_επώνυµο2_αμ2.tgz 5