Assignment 1: "Translate" Program

Uoc LogoΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ

CS255 - Programming Lab
Ενότητα: 1 
Άγγελος Μπίλας
Τμήμα Επιστήμης Υπολογιστών



Σκοπός

Ο σκοπός αυτής της άσκησης είναι να σας βοηθήσει να κάνετε επανάληψη (1) των βασικών στοιχείων της γλώσσας προγραμματισμού C, (2) της χρήσης των εργαλείων προγραμματισμού GNU/UNIX, ειδικά gcc, shell, και editing (emacs/vim/nano), και (3) να σχεδιάσετε ένα απλό C πρόγραμμα με ακρίβεια.

Background

Το iso8859 standard ορίζει character sets για διάφορες γλώσσες. Το iso8859-1 (latin-1) είναι το «συνηθισμένο» σετ με τους αγγλικούς χαρακτήρες. Το iso8859-7 περιλαμβάνει τους χαρακτήρες των ελληνικών. Για περισσότερες λεπτομέρειες: RFC 1345.

Η άσκηση

Η άσκηση σας ζητάει να γράψετε ένα πρόγραμμα που μεταφράζει το input από χαρακτήρες του iso8859-7 (αγγλικοί και ελληνικοί χαρακτήρες) σε χαρακτήρες του iso8859-1 (αγγλικοί χαρακτήρες). Το πρόγραμμα θα δουλεύει ως ένα filter του Unix shell, δηλαδή θα δέχεται input από το standard input και θα κάνει output στο standard output και πιθανόν στο standard error. Ειδικότερα το πρόγραμμά σας θα διαβάζει χαρακτήρες κειμένου από το standard input (το οποίο υποθέτουμε είναι κείμενο γραμμένο με ελληνικούς χαρακτήρες iso8859-7), γράφει το ίδιο κείμενο, μεταφρασμένο με βάση τους κανόνες που ακολουθούν στο standard output, και γράφει πιθανά error και warning μηνύματα στο standard error. Τυπικές εκτελέσεις του προγράμματος σας σε command line στο UNIX θα μπορούσε να είναι:

$ cat test.7 | translate
$ translate < test.7 > test.1

Με αυτό τον τρόπο θα μπορείτε να διαβάσετε σε οποιοδήποτε xterm ελληνικά text files που έχουν γραφτεί σε iso8859-7. Επίσης, αν χρησιμοποιείτε κάποιον text-based mail client (e.g. pine), θα μπορείτε να διαβάζετε μηνύματα που σας στέλνουν στα ελληνικά σε οποιοδήποτε τερματικό.

Λεπτομέρειες

Το πρόγραμμα σας πρέπει να αντικαθιστά τους χαρακτήρες του iso8859-7 με χαρακτήρες του iso8859-1 σύμφωνα με τους παρακάτω κανόνες:

  1. Οι απλοί χαρακτήρες αντικαθίστανται ως εξής με έναν ή δύο χαρακτήρες (ο πίνακας δείχνει μόνο τα κεφαλαία αλλά το ίδιο ισχύει και για τους μικρούς χαρακτήρες):

    Α A
    Β V
    Γ G
    Δ D
    Ε E
    Ζ Z
    Η H
    Θ 8
    Ι I
    Κ K
    Λ L
    Μ M
    Ν N
    Ξ KS
    Ο O
    Π P
    Ρ R
    Σ S
    Τ T
    Υ Y
    Φ F
    Χ X
    Ψ PS
    Ω W
  2. Οι χαρακτήρες με τόνους αντικαθίστανται με τους αντίστοιχους αγγλικούς και με ένα quote (δύο χαρακτήρες) αντί για τόνο ως εξής:

    Ά 'A
    Έ 'E
    Ή 'H
    Ί 'I
    Ό 'O
    Ώ 'W
    Ύ 'Y
    ά a'
    έ e'
    ή h'
    ί i'
    ό o'
    ώ w'
    ύ y'
  3. Οι χαρακτήρες που έχουν διαλυτικά αντικαθίστανται με δύο ή τρεις χαρακτήρες ως εξής (ο πίνακας δείχνει μόνο τους μικρούς χαρακτήρες):

    ϊ i”
    ϋ y”
    ΐ i'”
    ΰ y'”
  4. Οι δίφθογγοι ΜΠ/μπ και ΝΤ/ντ αντικαθίστανται με ένα μόνο χαρακτήρα B/b και D/d αντίστοιχα (κεφαλαία και μικρά). Επίσης, το Μπ(Ντ) με Β(D), το μΠ(νΤ) με b(d). Υλοποιήστε αυτόν τον κανόνα με ένα state machine, όπως εξηγήσαμε στην τάξη.

  5. Μπορείτε να αντικαταστήσετε τους υπόλοιπους χαρακτήρες του iso8859-7 με χαρακτήρες του iso8859-1 που νομίζετε ότι κάνουν το μεταφρασμένο κείμενο πιο ευανάγνωστο ή απλά να τους αντιστοιχήσετε στον χαρακτήρα με τον ίδιο κωδικό.

Δεν πρέπει να κάνετε κάποια υπόθεση για το μέγιστο μέγεθος του input.

Συστάσεις

  • Υλοποιήστε τους κανόνες 1,2,3,5, όπου κάθε iso8859-7 χαρακτήρας του input αντικαθίσταται με έναν ή περισσότερους χαρακτήρες του iso8859-1. Χωρίστε το πρόγραμμά σας σε λίγες συναρτήσεις. Πιθανόν θα χρειαστείτε συναρτήσεις για:
    • Την αρχικοποίηση της δομής που αποθηκεύει τα mappings των χαρακτήρων του iso8859-7 σε χαρακτήρες του iso8859-1.
    • Tην αντικατάσταση ενός δεδομένου χαρακτήρα που διαβάστηκε από το standard input με τους προδιαγεγραμμένους από τους κανόνες χαρακτήρες στο standard output.
    • Τη συνάρτηση main που απλά θα καλεί τη συνάρτηση αρχικοποίησης και, σε ένα loop, θα διαβάζει χαρακτήρες από το standard input και θα τους μεταφράζει με την κλήση της κατάλληλης συνάρτησης.
  • Στη συνέχεια υλοποιήστε τον κανόνα 4, όπου 2 χαρακτήρες του iso8859-7 αντικαθίστανται με 1 χαρακτήρα του iso8859-1. Χρησιμοποιήστε μια state machine όπως εξηγήσαμε στο μάθημα. Αυτό μπορεί να γίνει απλά με την αλλαγή της main ώστε να υλοποιεί τη state machine.
  • Προσπαθήστε να μην χρησιμοποιήσετε καθόλου global μεταβλητές στο πρόγραμμά σας.
  • Χρησιμοποιήστε τις συναρτήσεις getchar()/putchar() για character I/O στη C.
  • Χρησιμοποιήστε defines για σταθερές του προγράμματος που εμφανίζονται πολύ συχνά ή που ενδεχομένως θα θέλατε να πειραματιστείτε αλλάζοντάς τες (π.χ. σύμβολο τόνου, διαλυτικά, κλπ).
  • Χρησιμοποιήστε έναν enum τύπο για τις καταστάσεις που θα χρειαστείτε.
  • Ένα αναγνώσιμο πρόγραμμα (περισσότερες λεπτομέρειες στα style guides στη σελίδα των Links):
    • Χρησιμοποιεί ένα συνεπές και καλό σχήμα για indentation του κώδικα. Όλες οι εντολές που είναι nested σε blocks if, switc, while, for, do/while εντολών πρέπει να είναι indented. Τα περισσότερα προγράμματα χρησιμοποιούν 3 ή 4 κενά για κάθε επίπεδο indentation. Ο emacs μπορεί αυτόματα να κάνει indent το πρόγραμμά σας με την χρήση του πλήκτρου tab.
    • Περιέχει περιγραφικά ονόματα. Τα ονόματα μεταβλητών, σταθερών, τύπων, και συναρτήσεων πρέπει να δείχνουν το σκοπό ύπαρξής τους.
    • Περιέχει προσεκτικά γραμμένα σχόλια. Ξεκινήστε κάθε program file με ένα σχόλιο που περιέχει το όνομά σας, το αριθμό της άσκησης, και το όνομα του αρχείου. Κάθε συνάρτηση - ειδικά η main, πρέπει να ξεκινά με ένα σχόλιο που περιγράφει τι κάνει η συνάρτηση όταν τρέχει, αναφέροντας καθαρά τον ρόλο των παραμέτρων της συνάρτησης και των τιμών που επιστρέφει. Επίσης, το σχόλιο πρέπει να αναφέρει τι διαβάζει η συνάρτηση από το standard input (αν διαβάζει κάτι) και τι γράφει στα standard output και error (αν γράφει κάτι), ή σε οποιοδήποτε άλλο stream.
  • Δυο απλά παραδείγματα είναι: hello.c, f2c.c.
  • Προσοχή στις δηλώσεις των μεταβλητών ώστε να έχουν τον κατάλληλο τύπο για τον σκοπό που προορίζονται.
  • Αν έχετε error ή warning κατά το compilation του προγράμματος σας, μην πειραματίζεστε με αλλαγές στον κώδικά σας. Προσπαθήστε να καταλάβετε ακριβώς τι συμβαίνει (πιθανώς ανατρέχοντας σε manual και man pages) και να κάνετε αλλαγές/διορθώσεις με συγκεκριμένο στόχο.

Logistics

Γράψτε το πρόγραμμα σας στα μηχανήματα, αρχιτεκτονικής x86, του τμήματος με λειτουργικό σύστημα GNU/Linux (portokali, milo, rodakino, etc.) χρησιμοποιώντας τον gcc και τον αγαπημένο σας κειμενογράφο (emacs/vim/nano) (περισσότερες λεπτομέρειες στα reference cards στη σελίδα των Links).

Βήμα 1: Γράψτε τον source code

Δημιουργήστε ένα αρχείο translate.c.

Περιορίστε το μέγεθος των γραμμών (πλάτος) στο αρχείο σας σε 78 ή 80 χαρακτήρες. Αυτό σας επιτρέπει να τυπώνετε σε δύο στήλες σε χαρτί και να έχετε ταυτόχρονα ανοιχτά παράθυρα για editing και compilation και execution.

Για αυτή την άσκηση μπορείτε να βάλετε όλο τον κώδικά σας στο αρχείο translate.c. Δεν χρειάζεται να τον χωρίσετε σε περισσότερα αρχεία. Σε επόμενες ασκήσεις θα γράψετε προγράμματα που θα αποτελούνται από περισσότερα αρχεία.

Βήμα 2: Preprocess, Compile, Assemble, and Link

Χρησιμοποιήστε τον gcc με τις command line παραμέτρους -Wall, -ansi, -pedantic για να κάνετε preprocess, compile, assemble, και link το πρόγραμμά σας:

$ gcc -Wall -ansi -pedantic -o translate translate.c

Βήμα 3: Execute

Εκτελέστε το πρόγραμμά σας πολλαπλές φορές με διάφορα input files και δοκιμάστε όλα τα λογικά paths εκτέλεσης του κώδικά σας. Μπορείτε να χρησιμοποιήσετε τα test

αλλά θα πρέπει να κάνετε και άλλα δικά σας test.

Η εντολή (UNIX filter) od δείχνει σε διάφορες μορφές (ανάλογα με τις παραμέτρους της) τους χαρακτήρες που υπάρχουν στο input. H κλήση od -t uC θα σας φανεί πολύ χρήσιμη ώστε να βλέπεται τι περιέχει το κάθε αρχείο που εξετάζετε. Κάντε man od για περισσότερες λεπτομέρειες. Π.χ

$ cat test.7 | od -t uC
$ cat test.7 | translate | od -t uC

θα σας δείξει τους κωδικού για κάθε χαρακτήρα που υπάρχει στο αρχείο test.7 ή στο output του προγράμματος σας.

Βήμα 4: Δημιουργήστε ένα readme file

Χρησιμοποιήστε τον αγαπημένο σας κειμενογράφο (emacs/vim/nano) για να δημιουργήσετεi ένα "readme” text file που περιέχει:

  • Το όνομά σας
  • Πράγματα που χειρίζεστε με διαφορετικό τρόπο από ότι ορίζει η άσκηση.
  • Μια περιγραφή της βοήθειας που είχατε από άλλους στη δημιουργία του προγράμματος σας, και σε συμφωνία με το Policies section του web page του μαθήματος.
  • (Προαιρετικά) Μία ένδειξη του πόσο χρόνο αφιερώσατε για την άσκηση.
  • (Προαιρετικά) Οτιδήποτε άλλο θέλετε να αναφέρετε.

Σχόλια που περιγράφουν τον κώδικά σας δεν πρέπει να υπάρχουν στο readme file. Πρέπει να τα ενσωματώσετε στο κατάλληλο σημείο του προγράμματος σας.

Βήμα 5: Υποβολή

Υποβάλετε την άσκηση σας όπως αναφέρεται στο section Policies του web page του μαθήματος.

Bonus:

Υλοποιήστε την άσκηση σας με την χρήση πίνακα συναρτήσεων. H άσκηση σας θα πρέπει να καλεί "αυτόματα" την κατάλληλη συνάρτηση από τον πίνακα βάση του εκάστοτε state του state machine

Βαθμολογία

Η βαθμολογία θα βασιστεί και στην ορθότητα αλλά και στο σχεδιασμό, όπως αναφέρεται στη σελίδα Policies του μαθήματος. Η κατανόηση της άσκησης αλλά και η αναγνωσιμότητα ενός προγράμματος είναι σημαντικό μέρος του σχεδιασμού.


Last Modified: 22-06-2015 14:36

Άδειες Χρήσης
 •Το παρόν εκπαιδευτικό υλικό υπόκειται στην άδεια χρήσης Creative Commons και
ειδικότερα
Αναφορά - Μη εμπορική Χρήση - Όχι Παράγωγο Έργο 3.0 Ελλάδα
(Attribution - Non Commercial - Non-derivatives 3.0 Greece) 

•Εξαιρείται από την ως άνω άδεια υλικό που περιλαμβάνεται στις διαφάνειες
του μαθήματος, και υπόκειται σε άλλου τύπου άδεια χρήσης. Η άδεια χρήσης
στην οποία υπόκειται το υλικό αυτό αναφέρεται ρητώς.

Χρηματοδότηση
•Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα.
•Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Κρήτης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. 
•Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.


espa

Τελευταία τροποποίηση: Παρασκευή, 10 Ιούλιος 2015, 1:53 μμ