ΕΡΓΑΣΤΗΡΙΟ 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. Διαβάστε όλη την εκφώνηση της άσκησης πριν αρχίσετε να γράφετε κώδικα, και ειδικά τα σηµεία που µαρκάρονται "ΠΡΟΣΟΧΗ". Η εκφώνηση της άσκησης συνεχίζει στην επόµενη σελίδα. Σε αυτή την άσκηση θα γράψετε ένα πρόγραµµα το οποίο διαβάζει τους βαθµούς των φοιτητών µιας τάξης και κατασκευάζει ένα ιστόγραµµα. Οι βαθµοί δίνονται ως γράµµατα (Α έως και F) και είναι αποθηκευµένοι σε ένα αρχείο µε όνοµα grades.txt. Σε κάθε γραµµή του αρχείου βρίσκεται ένας βαθµός. Στην τελευταία γραµµή βρίσκεται ο χαρακτήρας '-' (παύλα) ο οποίος µαρκάρει το τέλος των βαθµών. Δηµιουργήστε ένα πίνακα µεγέθους όσοι είναι και οι δυνατοί βαθµοί. Στη θέση 0 του πίνακα θα αποθηκευτεί το συνολικό πλήθος των Α, στη θέση 1 το πλήθος των Β κτλ. Διαβάστε από το πληκτρολόγιο βαθµούς έως ότου δοθεί - και ταυτόχρονα υπολογίστε τον αριθµό φοιτητών που πήραν τον κάθε βαθµό. Μην εµφανίσετε µήνυµα προς το χρήστη. Οι βαθµοί στην πραγµατικότητα θα παρθούν από αρχείο, µε ανακατεύθυνση. ΠΡΟΣΟΧΗ: Πρέπει να χρησιµοποιήσετε οπωσδήποτε δοµή επανάληψης για να γεµίσετε τον πίνακα. Αυτό σηµαίνει πως πρέπει να σκεφτείτε ένα τύπο αριθµητικής χαρακτήρων ο οποίος θα σας δίνει τη θέση 0 αν ο βαθµός είναι Α, τη θέση 1 αν ο βαθµός είναι Β κ.ο.κ. Αφού έχουν διαβαστεί όλοι οι βαθµοί, ζωγραφίστε ένα ιστόγραµµα στην οθόνη το οποίο θα δείχνει πόσοι φοιτητές βαθµολογήθηκαν µε κάθε βαθµό. Για κάθε ένα βαθµό εκτυπώστε στην οθόνη: το βαθµό ένα κενό άνω-κάτω τελεία τον αριθµό φοιτητών που βαθµολογήθηκαν µε αυτό το βαθµό, φορµαρισµένο µε τέτοιο τρόπο ώστε να καταλαµβάνει 3 θέσεις ένα κενό τόσα αστεράκια όσες και οι δεκάδες του παραπάνω αριθµού ακολουθούµενα από παύλες για κάθε µια επιπλέον µονάδα. ένα χαρακτήρα αλλαγής γραµµής. Στο παρακάτω σχήµα µπορείτε να δείτε την έξοδο της δικής µας λύσης για µια τάξη 120 φοιτητών όπου από 21 άτοµα βαθµολογήθηκαν µε Α, Β και Ε, 26 µε C, 18 µε D και 13 µε F. 2
ΠΡΟΣΟΧΗ!! Το πρόγραµµα πρέπει να είναι γραµµένο µε τέτοιο τρόπο ώστε να είναι εύκολο να λειτουργήσει και για περισσότερες επιλογές βαθµών. Αυτό σηµαίνει πως (α) το πλήθος των δυνατών βαθµών (το οποίο στη συγκεκριµένη περίπτωση είναι 6) πρέπει να είναι δηλωµένο ως σταθερά και να χρησιµοποιείται αναλόγως και (β) πρέπει να χρησιµοποιήσετε επανάληψη για να προσπελάσετε τα στοιχεία του πίνακα. Άσκηση 2 Το πρόγραµµα που θα γράψετε για την άσκηση 1 πρέπει να το αποθηκεύσετε σε αρχείο µε όνοµα lab5b.c µέσα στο φάκελο lab5. Γράψτε ένα πρόγραµµα το οποίο διαβάζει µια σειρά από λέξεις και κατασκευάζει δύο σύνθετες συµβολοσειρές έτσι ώστε η µία να περιέχει όλες τις λέξεις άρτιου µήκους και η άλλη όλες τις λέξεις περιττού µήκους. Για την ακρίβεια, το πρόγραµµά σας πρέπει να: 1. Κατασκευάζει δύο πίνακες χαρακτήρων µεγέθους SIZE. Ένας θα είναι για τις λέξεις άρτιου µήκους κι ένας για τις λέξεις περιττού µήκους. Ας τους πούµε evenwords και oddwords αντίστοιχα. Αρχικά και οι δύο πίνακες αντιστοιχούν σε κενές συµβολοσειρές. 2. Εκτυπώνει το µήνυµα "Odd : X" όπου X ο πίνακας oddwords, ένα χαρακτήρα αλλαγής γραµµής και µετά το µήνυµα "Even: X" όπου X ο πίνακας evenwords. 3. Εκτυπώνει ένα tab και µετά το µήνυµα "Enter word: ", και διαβάζει από το πληκτρολόγιο µια συµβολοσειρά µεγέθους το πολύ SIZE (συµπεριλαµβανοµένου του null). 4. Αν η συµβολοσειρά έχει άρτιο µήκος, και αν υπάρχει αρκετός χώρος στο evenwords, τότε προσθέτει στο evenwords µια παύλα και µετά τη συµβολοσειρά, κι επαναλαµβάνει τα βήµατα 2-4. Αν δεν υπάρχει αρκετός χώρος ή αν έχει δοθεί η λέξη "STOP", τότε η λέξη δεν εισάγεται και η επανάληψη τερµατίζει. Το πρόγραµµα λειτουργεί µε αντίστοιχο τρόπο αν η λέξη έχει περιττό µήκος (οπότε προστίθεται στο oddwords). Χρησιµοποιήστε την τιµή 20 για το SIZE για να ελέγξετε την ορθότητα του προγράµµατός σας, αλλά πρέπει να είναι γραµµένο µε τέτοιο τρόπο ώστε να λειτουργεί σωστά για οποιαδήποτε θετική τιµή του SIZE. Στο παρακάτω σχήµα µπορείτε να δείτε την έξοδο της δικής µας λύσης για διάφορες λέξεις. 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 (αντί να τερµατίζετε την επανάληψη). Τρέξτε το πρόγραµµά σας δίνοντας µεγάλες λέξεις. Τι παρατηρείτε? Τι πιστεύετε ότι προκάλεσε την περίεργη συµπεριφορά του προγράµµατος και πώς µπορούµε να λύσουµε το πρόβληµα? Σηµείωση: Αν η άσκηση 4 δε σας παρουσιάζει πρόβληµα, τότε κάτι δεν έχετε κάνει σωστά στην άσκηση 2 :) Αποστολή του προγράµµατος για διόρθωση και σχολιασµό Η αποστολή γίνεται από τον οδηγό. Για να στείλετε το πρόγραµµά σας για βαθµολόγηση, ανοίξτε ένα τερµατικό (ή χρησιµοποιήστε αυτό του 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