ΣΕΤ ΑΣΚΗΣΕΩΝ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2010-2011 Προθεσµία: 5/12/10, 23:59 Στόχοι structs Πίνακες Συναρτήσεις Συµβολοσειρές Χρήση µεταβλητών και σταθερών Χρήση τελεστών Χρήση δοµών ελέγχου Φορµαρισµένη είσοδος και έξοδος δεδοµένων Χρήση σχολίων και αναγνωσιµότητα προγράµµατος Πριν ξεκινήσετε Διαβάστε ΟΛΗ την εκφώνηση προσεκτικά και σχεδιάστε το πρόγραµµά σας στο χαρτί. Μην προσπαθήσετε να γράψετε το πρόγραµµα µια κι έξω. Για κάθε στάδιο που ολοκληρώνετε, βεβαιωθείτε ότι κάνει compile και λειτουργεί σωστά και µετά να προχωράτε στο επόµενο στάδιο. Σε κάθε στάδιο σας δίνουµε µια εκτίµηση της δυσκολίας του (διαβάθµιση από 1 έως 4). Μη διστάζετε να ζητήσετε βοήθεια! Μπορείτε να χρησιµοποιήσετε το forum προγραµµατισµού (http://inf-server.inf.uth.gr/courses/coding/) και φυσικά email. Η εργασία αυτή µπορεί να γίνει είτε ατοµικά είτε σε οµάδες των 2 ατόµων. Μπορείτε να συζητάτε τις ασκήσεις µε συµφοιτητές σας εκτός οµάδας αλλά δεν επιτρέπεται η ανταλλαγή κώδικα µε οποιοδήποτε τρόπο. Δεν είναι απαραίτητο να είστε στην ίδια οµάδα από το πρώτο σετ ασκήσεων. Ξεκινήστε νωρίς! Ο προγραµµατισµός είναι πάντα ΠΟΛΥ πιο χρονοβόρος από ό,τι περιµένετε. Εκπρόθεσµες ασκήσεις δε γίνονται δεκτές.
Άσκηση: Spell-checker Εισαγωγή Θα γράψετε ένα πρόγραµµα το οποίο βοηθά το χρήστη να εντοπίσει αν µια λέξη βρίσκεται ή όχι στο λεξικό, κι αν όχι, προτείνει εναλλακτικές λέξεις θεωρώντας πως έχει γίνει ορθογραφικό λάθος. Το πρόγραµµα διαβάζει από το πληκτρολόγιο ένα αριθµό από λήµµατα, διαβάζει τη λέξη-στόχο που ενδιαφέρει το χρήστη, βρίσκει κατά πόσο η λέξη-στόχος είναι διαφορετικά γραµµένη από κάθε ένα λήµµα του λεξικού και δίνει κατάλληλες πληροφορίες στο χρήστη. Ακολουθούν λεπτοµερείς οδηγίες για το πώς πρέπει να λειτουργεί το πρόγραµµά σας και στάδια κατασκευής του. ΜΗΝ προσπαθήσετε να γράψετε όλο το πρόγραµµα σε ένα βήµα γιατί θα κάνετε λάθη και θα σας πάρει πολύ περισσότερο χρόνο. Όταν προσδιορίζουµε ότι κάποια λειτουργία πρέπει να γίνει µε χρήση συνάρτησης, είναι υποχρεωτικό να το κάνετε. Πρέπει να αποφασίσετε εσείς τι παραµέτρους χρειάζεται κάθε συνάρτηση, κι αν πρέπει να επιστρέφει κάτι, µε βάση την περιγραφή που σας δίνουµε. Υπάρχουν επιπλέον λειτουργίες στο πρόγραµµα που είναι καλύτερα να γίνουν µέσω συναρτήσεων που θα έχετε κατασκευάσει εσείς. Πρέπει να κρίνετε εσείς πότε είναι καλύτερα να γίνει κάτι µέσω συνάρτησης. Γενικά στα προγράµµατα που γράφετε στον Προγραµµατισµό 1 (στα εργαστήρια, σετ ασκήσεων και εξετάσεις) απαγορεύεται η χρήση καθολικών µεταβλητών, εκτός αν το έχουµε επιτρέψει ρητά. Στο σετ ασκήσεων 3 δεν επιτρέπεται η χρήση καθολικών µεταβλητών. Στάδιο 1: Εισαγωγή δεδοµένων ( ) Κατασκευάστε ένα struct το οποίο αναπαριστά µια καταχώρηση στο λεξικό. Μια καταχώρηση περιέχει ένα λήµµα και έναν ακέραιο ο οποίος θα εκφράζει την απόσταση του λήµµατος από τη λέξη-στόχο. Δηλώστε στη main ένα πίνακα από καταχωρήσεις, µεγέθους NUMWORDS. Γράψτε και καλέστε µια συνάρτηση η οποία διαβάζει από το πληκτρολόγιο µια σειρά από λήµµατα και τα αποθηκεύει στον πίνακα. Αρχικά δε γνωρίζουµε τη λέξη-στόχο. Κάθε λήµµα δίνεται σε νέα γραµµή. Το µέγεθος ενός λήµµατος είναι WORDSIZE. Μπορείτε να υποθέσετε ότι δε θα δοθούν ποτέ περισσότερα από NUMWORDS λήµµατα, αλλά υπάρχει περίπτωση να δοθούν λιγότερα. Αν το πλήθος των ληµµάτων είναι µικρότερο από NUMWORDS τότε το τέλος τους σηµατοδοτείται από τη λέξη "XXX". Η "ΧΧΧ" δε θεωρείται λήµµα και δεν αποθηκεύεται στον πίνακα. Αν το πλήθος των ληµµάτων είναι ακριβώς NUMWORDS τότε δεν εµφανίζεται η "ΧΧΧ" στο τέλος. Επαλήθευση: Γράψτε κώδικα που εκτυπώνει τα περιεχόµενα του πίνακα και επιβεβαιώστε ότι όλες οι λέξεις έχουν διαβαστεί σωστά. Σας δίνονται δύο αρχεία ελέγχου, στο φάκελο tests/stadio1. Μπορείτε να θέσετε το NUMWORDS σε 100 και το WORDSIZE σε 15 (περιλαµβάνοντας το null χαρακτήρα στο τέλος του string). Αποθηκεύστε το πρόγραµµά σας σε ένα αρχείο µε όνοµα hw3_version1.c
Στάδιο 2: Υπολογισµός αποστάσεων ( ) Κατασκευάστε ένα αντίγραφο του hw3_version1.c και δώστε του το όνοµα hw3_version2.c. Κάντε τις νέες αλλαγές στον κώδικα στο αρχείο hw3_version2.c. Με αυτό τον τρόπο, αν γίνουν λάθη, θα µπορείτε να επανέλθετε στη λύση από το στάδιο 1. Εκτυπώστε στην οθόνη το µήνυµα "Enter target word: " και διαβάστε τη λέξη που θα γράψει ο χρήστης στην ίδια γραµµή. Η λέξη-στόχος έχει µέγεθος WORDSIZE (περιλαµβάνοντας το null). Κατασκευάστε µια συνάρτηση η οποία διατρέχει τον πίνακα και για κάθε λήµµα υπολογίζει και αποθηκεύει την απόστασή του από τη λέξη-στόχο. Η απόσταση ανάµεσα σε δύο συµβολοσειρές ορίζεται ως το πλήθος των γραµµάτων που βρίσκονται σε αντίστοιχες θέσεις και είναι διαφορετικά. Παραδείγµατα: Λέξη 1 baseball baseball baseball BaseBall Λέξη 2 soccer basket ballpark baseballer Απόσταση 8 5 5 2 Επαλήθευση: Προσθέστε κώδικα που εκτυπώνει τα περιεχόµενα του πίνακα και επιβεβαιώστε ότι όλες οι αποστάσεις έχουν υπολογιστεί σωστά. Σας δίνονται δύο αρχεία ελέγχου, στο φάκελο tests/stadio2. Αποθηκεύστε το πρόγραµµά σας στο αρχείο µε όνοµα hw3_version2.c Στάδιο 3: Ταξινόµηση ( 1/2) Κατασκευάστε ένα αντίγραφο του hw3_version2.c και δώστε του το όνοµα hw3_version3.c. Κάντε τις νέες αλλαγές στον κώδικα στο αρχείο hw3_version3.c. Με αυτό τον τρόπο, αν γίνουν λάθη, θα µπορείτε να επανέλθετε στη λύση από το στάδιο 2. Γράψτε και καλέστε µια συνάρτηση η οποία ταξινοµεί τα περιεχόµενα του πίνακα σε αύξουσα σειρά µε βάση την απόσταση κάθε λήµµατος. Μπορείτε να χρησιµοποιήσετε οποιοδήποτε αλγόριθµο ταξινόµησης επιθυµείτε από αυτούς που έχουν γίνει στην τάξη ή στο φροντιστήριο. Επαλήθευση: Προσθέστε κώδικα που εκτυπώνει τα περιεχόµενα του πίνακα µετά την ταξινόµηση και επιβεβαιώστε ότι η ταξινόµηση έχει γίνει σωστά. Χρησιµοποιήστε τα αρχεία ελέγχου του σταδίου 2. Αποθηκεύστε το πρόγραµµά σας στο αρχείο µε όνοµα hw3_version3.c
Στάδιο 4: Τελικά αποτελέσµατα και εκτύπωση αυτών ( 1/2) Κατασκευάστε ένα αντίγραφο του hw3_version3.c και δώστε του το όνοµα hw3.c. Κάντε τις νέες αλλαγές στον κώδικα στο αρχείο hw3.c. Με αυτό τον τρόπο, αν γίνουν λάθη, θα µπορείτε να επανέλθετε στη λύση από το στάδιο 3. Σε αυτό το στάδιο θέλουµε να δούµε αν η λέξη-στόχος βρίσκεται στο λεξικό, κι αν όχι να εκτυπώνονται όσες λέξεις έχουν απόσταση από τη λέξη-στόχο εντός κάποιου ορίου. Αν η λέξη-στόχος βρίσκεται στο λεξικό, τότε το πρόγραµµα εκτυπώνει το µήνυµα "Correct", µια κενή γραµµή, και τερµατίζει. Αν η λέξη-στόχος δε βρίσκεται στο λεξικό, τότε: Εκτυπώστε στην οθόνη το µήνυµα "Minimum distance from target: Μ " όπου Μ είναι η µικρότερη από τις αποστάσεις που υπολογίστηκαν στο προηγούµενο στάδιο. Στην επόµενη γραµµή εκτυπώστε το µήνυµα "Enter threshold: ". Το threshold είναι το όριο στην απόσταση των ληµµάτων από τη λέξη-στόχο πάνω από το οποίο δε δεχόµαστε τα αντίστοιχα λήµµατα ως εναλλακτικές λύσεις. Για παράδειγµα, αν η λέξη-στόχος είναι baseball, τα λήµµατα είναι αυτά που αναφέρονται στο παράδειγµα του σταδίου 2 και το threshold είναι 4, τότε θέλουµε το πρόγραµµα να εκτυπώσει ως εναλλακτική λέξη µόνο το baseballer. Αν το threshold είναι 5, τότε θέλουµε το πρόγραµµα να εκτυπώσει ως εναλλακτικές λέξεις τις ballpark, baseballer και basket. Διαβάστε το threshold που θα δώσει ο χρήστης και επιβεβαιώστε ότι είναι µη-αρνητικός αριθµός. Αν είναι αρνητικός, πρέπει να εκτυπώνετε το µήνυµα "Threshold must be positive", µετά "Enter threshold" και να διαβάζετε νέο αριθµό µέχρι να δοθεί µη-αρνητικός. Κατασκευάστε µια συνάρτηση η οποία διατρέχει τον ταξινοµηµένο πίνακα και εκτυπώνει όλες τις λέξεις που έχουν απόσταση µικρότερη από ή ίση µε το threshold. Για την ακρίβεια, εκτυπώνει σε κάθε γραµµή : λήµµα κόµµα κενό απόσταση Καλέστε τη συνάρτηση στο κατάλληλο σηµείο του προγράµµατος. Αποθηκεύστε το πρόγραµµά σας στο αρχείο µε όνοµα hw3.c Στάδιο 5: Έλεγχος ορθότητας Το πρόγραµµά σας πρέπει να λειτουργεί σωστά και να εκτυπώνει όλα τα µηνύµατα και αποτελέσµατα µε τον τρόπο που σας περιγράφουµε. Για να µπορέσετε να ελέγξετε την ορθότητα θα σας δώσουµε ενδεικτικά αρχεία εισόδου και εξόδου. Δείτε το φάκελο tests/stadio5 Κάθε αρχείο µε όνοµα test.? περιέχει µια ενδεικτική είσοδο για το πρόγραµµα και κάθε αρχείο µε όνοµα test.?.std περιέχει την αντίστοιχη έξοδο. Το πρόγραµµά σας πρέπει να έχει την ίδια έξοδο µε το δικό µας. Χρησιµοποιήστε ανακατεύθυνση και την εντολή diff όπως και στα προηγούµενα σετ ασκήσεων για να συγκρίνετε την έξοδό σας µε τη δική µας.
Πριν παραδώσετε: Αν δεν έχετε ολοκληρώσει όλα τα στάδια, τότε µην αφαιρέστε από το πρόγραµµά σας τον κώδικα που είχατε γράψει για την επαλήθευση του τελευταίου σταδίου που ολοκληρώσατε. Απλά ονοµάστε το αρχείο hw3.c πριν το παραδώσετε. Αν έχετε ολοκληρώσει όλα τα στάδια, τότε αφαιρέστε από το πρόγραµµά σας των κώδικα που είχατε γράψει για την επαλήθευση των ενδιάµεσων σταδίων. Αρχεία προς παράδοση: hw3.c Πώς να παραδώσετε τη δουλειά σας (Ακολουθείστε τις οδηγίες ακριβώς αλλιώς µπορεί να µη δούµε τα αρχεία σας) Οµάδα ενός ατόµου: Κατασκευάστε ένα φάκελο µε όνοµα επώνυµο_αεμ και αντιγράψτε µέσα σε αυτόν το hw2.c Πηγαίνετε στο φάκελο µέσα στον οποίο βρίσκεται το επώνυµο_αεμ που κατασκευάσατε και γράψτε την παρακάτω εντολή: tar czf epwnumo_aem.tgz epwnumo_aem Στείλτε email στη διεύθυνση ce120lab@gmail.com και ένα αντίγραφο (CC) στον εαυτό σας µε θέµα (subject) "CE120 hw3" και επικολληµένο αρχείο το epwnumo_aem.tgz Οµάδα δύο ατόµων: Κατασκευάστε ένα φάκελο µε όνοµα επώνυµο1_αεμ1_επώνυµο2_αεμ2 και αντιγράψτε µέσα σε αυτόν το hw3.c Πηγαίνετε στο φάκελο µέσα στον οποίο βρίσκεται το επώνυµο_αεμ που κατασκευάσατε και γράψτε την παρακάτω εντολή: tar czf επώνυµο1_αεμ1_επώνυµο2_αεμ2.tgz επώνυµο1_αεμ1_επώνυµο2_αεμ2 Στείλτε email στη διεύθυνση ce120lab@gmail.com και στα δύο µέλη της οµάδας, µε θέµα "CE120 hw3" και επικολληµένο αρχείο το epwnumo1_aem1_epwnumo2_aem2.tgz