ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσµία: 10/11/12, 22:00

Σχετικά έγγραφα
ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/09, 23:59

ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσµία: 6/11/11, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 25/11/12, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 5/12/10, 23:59

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 27/11/11, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 18/12/12, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ Προθεσµία: 10/12/2014, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 8/1/12, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/10, 23:59

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 7/1/2014, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσµία: Τρίτη 4/11/2014, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσµία: 25/11/13, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσµία: Τρίτη 10/11/2015, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσμία: Τετάρτη 9/11/2016, 21:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: Τετάρτη 25/11/2015, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 13/1/13, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: Πέµπτη 17/12/2015, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 1. Προθεσµία: 3/12/2018, 23:59

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσμία: Τετάρτη 23/11/2016, 21:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 22/12/10, 23:59

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: Τετάρτη 7/12/2016, 21:00

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσμία: 17/1/14, 22:00

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 22/12/2016, 21:00

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 4 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 2 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 4 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ, ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΚΑΙ ΔΙΚΤΥΩΝ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ

Προγραµµατισµός Ι Εργαστήριο 3ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραµµατισµός Ι Εργαστήριο 9ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 9 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραμματισμός Ι Εργαστήριο 9ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 9 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΣΕΤ ΑΣΚΗΣΕΩΝ 4 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ Προθεσµία: 9/1/2015, 22:00

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραμματισμός Ι Εργαστήριο 5ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

abistarakis PASS - Σωστή κατασκευή tgz και ονοµασία αρχείων

ΕΡΓΑΣΙΑ ΕΞΑΜΗΝΟΥ - ΜΕΡΟΣ Γ'

ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ, ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Προγραμματισμός Ι Εργαστήριο 8ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 8 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

scanf() scanf() stdin scanf() printf() int float double %lf float

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

Προγραμματισμός Ι. Χαρακτήρες. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

lab11 - Να εκτυπώνεις πιο κατατοπιστικά µηνύµατα λάθους. Αν είναι όλα ίδια, δεν είναι ξεκάθαρο ποιο αρχείο έχει πρόβληµα.

Προγραμματισμός Ι Εργαστήριο 8ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 8 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Βαθμός Σχόλια. lab5 PASS PASS PASS PASS PASS. Οριακά PASS - Καλή δουλειά

Λύσεις για τις ασκήσεις του lab5

Sheet2 Α.Μ FAIL. οριακό PASS. - Έπρεπε να χρησιµοποιήσετε συναρτήσεις από τη string.h

Δομημένος Προγραμματισμός

lab7: Συμβολοσειρές Συμβολοσειρές Ασφάλεια εισόδου Αναγνωσιμότητα κώδικα (σχόλια, στοίχιση, περιγραφικά ονόματα μεταβλητών, κτλ.)

Βαθμός Σχόλια. lab6 PASS PASS. - Πολύ καλή δουλειά, αλλά προσπάθησε να κάνεις την άσκηση χρησιµοποιώντας συναρτήσεις από το string.

Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων.

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Επεξεργασία Αρχείων Κειµένου

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 131: ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I ΕΡΓΑΣΙΑ 2

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ

CE 120. Φροντιστήριο 14/10/2011

lab2 -Στην printf να βάζεις \n έτσι ώστε να αλλάζει γραµµή όποτε σου εµφανίζει κάποιο µήνυµα.

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά

Δεν έστειλες την άσκηση 1, και αυτό που έστειλες ήταν σκέτο αρχείο, όχι το tgz που ζητούσε η εκφώνηση.

Sheet PASS 1426 PASS 1428 PASS. Page 1

char name[5]; /* define a string of characters */

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Σκοπός. Εργαστήριο 6 Εντολές Επανάληψης Τα Εργαστηριακά Προγράμματα. Η δομή Επιλογής στη PASCAL. H δομή Επανάληψης στη PASCAL. Η εντολή επανάληψης for

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τ Μ Η Μ Α Π Λ Η Ρ Ο Φ Ο Ρ Ι Κ Η Σ

lab5 -Ο κώδικάς σου είναι σωστός αλλά από εδώ και στο εξής προσπάθησε να βάζεις σχόλια στην µορφή που ζητάει το φυλλάδιο

ΕΡΓΑΣΤΗΡΙΟ 11 - Απαντήσεις

- program p_name(input) - uses crt

lab2grades - Στη scanf υπολογίζετε τουλάχιστον 5 χαρακτήρες %5.2f προδιαγραφές που ζητούνται στην εκφώνηση. -

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

ΚΕΦΑΛΑΙΟ 9 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ

Γράψτε ένα πρόγραμμα που θα προσομοιώνει τη ρίψη ενός νομίσματος και θα εμφανίζει στην οθόνη Κορώνα» ή «Γράμματα».

Διάλεξη 18η: Διαχείρηση Αρχείων

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

ΑΕΠΠ 1o Επαναληπτικό Διαγώνισµα

Διαδικασιακός Προγραμματισμός

Εισαγωγή στον προγραμματισμό. Τμήμα Πληροφορικής & Επικοινωνιών ΤΕΙ Σερρών Εργαστήριο 2

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

printf Οι κωδικοί (format codes) του printf για διάφορους τύπους δεδοµένων είναι:

Προγραμματιστικό Περιβάλλον

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

! ΘΕΜΑ A Α2. ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΛΥΚΕΙΟΥ. Ονοµατεπώνυµο:

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Ινστιτούτο Επαγγελµατική Κατάρτιση Κορυδαλλού "ΤΕΧΝΙΚΟΣ ΣΥΣΤΗΜΑΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ" (Ερωτήσεις Πιστοποίησης στην γλώσσα προγραµµατισµού C)

lab7grades -Σωστή χρήση της sprintf -Σωστά ανιχνεύετε τον χαρακτήρα που πρέπει να αφαιρέσετε. -Σωστή µεταφορά στοιχείων µια θέση αριστερά.

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον

2.2.3 Η εντολή Εκτύπωσε

ΑΕΜ ή username. Sheet2

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

Transcript:

ΣΕΤ ΑΣΚΗΣΕΩΝ 1 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2012-2013 Προθεσµία: 10/11/12, 22:00 Περιεχόµενα Διαβάστε πριν ξεκινήσετε Εκφώνηση άσκησης 1 Εκφώνηση άσκησης 2 Οδηγίες αποστολής άσκησης Παράρτηµα Α: Ανακατεύθυνση Παράρτηµα Β: Σύγκριση αρχείων Πριν ξεκινήσετε (ΔΙΑΒΑΣΤΕ ΑΥΤΗ ΤΗΝ ΕΝΟΤΗΤΑ!! ) Διαβάστε ΟΛΗ την εκφώνηση προσεκτικά και σχεδιάστε το πρόγραµµά σας στο χαρτί. Για κάθε στάδιο, αποφασίστε τι µεταβλητές θα χρειαστείτε, τι ονόµατα θα τους δώσετε, αν χρειάζονται σταθερές κι αν ναι για ποιες ποσότητες, και τι δοµές θα χρησιµοποιήσετε για κάθε λειτουργία. Μη διστάζετε να ζητήσετε βοήθεια! Μπορείτε να χρησιµοποιήσετε το forum προγραµµατισµού (http://infserver.inf.uth.gr/courses/coding/) και φυσικά email. Μην προσπαθήσετε να γράψετε το πρόγραµµα µια κι έξω. Για κάθε στάδιο που ολοκληρώνετε, βεβαιωθείτε ότι κάνει compile και λειτουργεί σωστά και µετά να προχωράτε στο επόµενο στάδιο. Κάθε φορά που τελειώνετε ένα στάδιο, να αποθηκεύετε ένα αντίγραφο του προγράµµατος όπως είναι µέχρι εκείνο το σηµείο. Έτσι, αν σε κάποιο επόµενο στάδιο καταστραφεί το αρχείο σας, θα έχετε µια παλιότερη έκδοση από την οποία µπορείτε να συνεχίσετε. Τις επιµέρους "εκδόσεις" να τις ονοµάζετε µε διαφορετικά ονόµατα (πχ. decoderstadio1.c, decoderstadio2.c) Σε κάθε στάδιο σας δίνουµε µια εκτίµηση της δυσκολίας του (διαβάθµιση απο 1 έως 4). Η εργασία αυτή µπορεί να γίνει σε οµάδες µέχρι 2 ατόµων. Δεν είναι απαραίτητο να συνεργαστείτε µε το ίδιο άτοµο που κάνετε τα εβδοµαδιαία εργαστήρια. Μπορείτε να συζητάτε τις ασκήσεις µε συµφοιτητές σας αλλά δεν επιτρέπεται η ανταλλαγή κώδικα µε οποιοδήποτε τρόπο. Ξεκινήστε νωρίς! Ο προγραµµατισµός είναι πάντα ΠΟΛΥ πιο χρονοβόρος από ό,τι περιµένετε. Εκπρόθεσµες ασκήσεις δε γίνονται δεκτές.

'Ασκηση 1: Αποκρυπτογράφηση κειµένου Εισαγωγή Ένας εύκολος αλγόριθµος κρυπτογράφησης αντικαθιστά κάθε εκτυπώσιµο χαρακτήρα µε αυτόν που έπεται κατά κάποιους χαρακτήρες στον πίνακα ASCII. Οι εκτυπώσιµοι χαρακτήρες ASCII ξεκινούν από το ' ' (κωδικός 32) και φτάνουν ως το '~' (κωδικός 126). Σε περίπτωση που περάσουµε τον τελευταίο εκτυπώσιµο χαρακτήρα, συνεχίζουµε κυκλικά από τον πρώτο. Το κλειδί της κρυπτογράφησης είναι η απόσταση του χαρακτήρα που αντικαθίσταται από αυτόν που τον αντικαθιστά. Έτσι, για παράδειγµα, αν το κλειδί είναι 5, η λέξη wizard κρυπτογραφείται ως n fwi. Τυχόν µη εκτυπώσιµοι χαρακτήρες (π.χ. '\n') παραµένουν ως έχουν. Η βασική παρατήρηση για την αποκρυπτογράφηση είναι ότι ο πιο συχνός χαρακτήρας σε ένα κείµενο είναι κατά κανόνα το ' ' (κενό). Άρα, αν κανείς αναλύσει τη συχνότητα εµφάνισης των χαρακτήρων στο κρυπτογραφηµένο κείµενο µπορεί βάσιµα να υποθέσει ότι ο χαρακτήρας µε τη µεγαλύτερη συχνότητα εµφάνισης αντιστοιχεί στο αρχικό κείµενο στο κενό. Υπολογίζοντας την απόσταση αυτού του χαρακτήρα από το ' ' προκύπτει το κλειδί. Το κλειδί χρησιµοποιείται για την αποκρυπτογράφηση όλου του κειµένου, µετακινώντας κάθε χαρακτήρα πίσω (κυκλικά) τόσες θέσεις όσο η τιµή του κλειδιού. Το πρόγραµµά σας θα πρέπει να διαβάζει από την είσοδο (µε ανακατεύθυνση από αρχείο κειµένου) το κρυπτογραφηµένο κείµενο, το οποίο µπορεί να έχει µήκος έως και 1024 χαρακτήρες. Αν το κείµενο περιέχει παραπάνω χαρακτήρες, αυτοί αγνοούνται. Το πρόγραµµα αναλύει τη συχνότητα εµφάνισης των χαρακτήρων στο κρυπτογραφηµένο κείµενο (µετράει δηλαδή πόσες φορές εµφανίζεται κάθε εκτυπώσιµος χαρακτήρας), υπολογίζει και εκτυπώνει το κλειδί και κατόπιν αποκρυπτογραφεί το κείµενο και το εκτυπώνει στην έξοδο (από την οποία οδηγείται σε αρχείο µε ανακατεύθυνση). Ακολουθούν λεπτοµερείς οδηγίες για το πώς πρέπει να λειτουργεί το πρόγραµµά σας και στάδια κατασκευής του. ΜΗΝ προσπαθήσετε να γράψετε όλο το πρόγραµµα σε ένα βήµα γιατί θα κάνετε λάθη και θα σας πάρει πολύ περισσότερο χρόνο. Αποθηκεύστε το πρόγραµµα σε αρχείο µε το όνοµα decoder.c. Χρησιµοποιήστε σαν είσοδο (µε ανακατεύθυνση) το κωδικοποιηµένο αρχείο κειµένου encoded.txt. Στάδιο 1: Εισαγωγή και αρχική επεξεργασία δεδοµένων (éé) Διαβάστε χαρακτήρα-προς-χαρακτήρα από το πληκτρολόγιο ένα κείµενο έως ότου συναντήσετε τον ειδικό χαρακτήρα EOF ή έχετε διαβάσει το ανώτατο όριο χαρακτήρων που επιτρέπεται να περιέχει το κείµενο (όποιο από τα δύο συµβεί πρώτο). Το κείµενο πρέπει να αποθηκευτεί σε κατάλληλο πίνακα. Ταυτόχρονα, για κάθε εκτυπώσιµο χαρακτήρα µετρήστε το πλήθος εµφανίσεων αυτού στο κείµενο και αποθηκεύστε αυτή την πληροφορία σε πίνακα τόσων θέσεων όσοι και οι εκτυπώσιµοι χαρακτήρες ASCII. Προσωρινός κώδικας: Εκτυπώστε τα περιεχόµενα και των δύο πινάκων και επιβεβαιώστε ότι αυτό το στάδιο λειτουργεί σωστά. Το πρόγραµµά σας πρέπει να είναι γραµµένο µε τέτοιο τρόπο ώστε αν κάποια στιγµή αυξηθεί το µέγιστο επιτρεπτό µέγεθος κειµένου, να µπορούν να γίνουν εύκολα και γρήγορα οι κατάλληλες αλλαγές στο πρόγραµµα.

Στάδιο 2: Εντοπισµός κενού ' '( ) Αφαιρέστε τον προσωρινό κώδικα που γράψατε στο στάδιο 1. Εντοπίστε το χαρακτήρα µε τη µεγαλύτερη συχνότητα (πλήθος εµφανίσεων) διατρέχοντας τον πίνακα στον οποίο είναι αποθηκευµένο το πλήθος εµφανίσεων για κάθε εκτυπώσιµο χαρακτήρα. Προσωρινός κώδικας: Εκτυπώστε το χαρακτήρα (ή τη θέση) που βρήκατε και επιβεβαιώστε ότι είναι σωστός. Στάδιο 3: Αποκωδικοποίηση κειµένου ( ) Αφαιρέστε τον προσωρινό κώδικα που γράψατε στο στάδιο 2. Χρησιµοποιήστε τη µέθοδο που περιγράφεται στην εισαγωγή για να υπολογίσετε το κλειδί, κι εκτυπώστε το στην οθόνη σε µήνυµα της µορφής : KEY: k όπου k το κλειδί που υπολογίσατε. Εκτυπώστε δύο χαρακτήρες αλλαγής γραµµής µετά το µήνυµα. Έχοντας υπολογίσει το κλειδί, χρησιµοποιήστε τη µέθοδο που περιγράφεται στην εισαγωγή για να αποκωδικοποιήσετε το κείµενο. Εκτυπώστε το αποκωδικοποιηµένο κείµενο στην οθόνη σε µήνυµα της µορφής: TEXT: t όπου t το αποκωδικοποιηµένο κείµενο. Εκτυπώστε ένα χαρακτήρα αλλαγής γραµµής µετά το µήνυµα. Βοήθεια: Χρησιµοποιήστε τον τελεστή % (υπόλοιπο ακέραιας διαίρεσης modulo) για να κάνετε "κυκλική" διάτρεξη των εκτυπώσιµων χαρακτήρων, αλλά λάβετε υπόψη ότι δεν ξεκινάµε από το 0, αλλά από το χαρακτήρα µε ASCII 32. Θα πρέπει να µετατρέψετε το σύνολο χαρακτήρων µε ASCII 32-126 σε σύνολο που ξεκινά από το 0 πριν µπορέσετε να κάνετε κυκλική διάτρεξη, και µετά να το ξαναµετατρέψετε στη σωστή κλίµακα. Δώστε ιδιαίτερη προσοχή ώστε να µην προκύψει ποτέ αρνητικός αριθµός κατά τη διάρκεια των πράξεών σας. Στάδιο 4: Τελικός έλεγχος ορθότητας Το πρόγραµµά σας πρέπει να λειτουργεί σωστά και να εκτυπώνει όλα τα µηνύµατα και αποτελέσµατα µε τον τρόπο που σας περιγράφουµε. Για να µπορέσετε να ελέγξετε την ορθότητα θα σας δώσουµε ενδεικτικά αρχεία εισόδου και εξόδου. Υπάρχει ένας εύκολος τρόπος να συγκρίνετε τα δικά σας αποτελέσµατα µε τα δικά µας: Ας υποθέσουµε ότι το εκτελέσιµο πρόγραµµά σας λέγεται decoder, το ενδεικτικό αρχείο εισόδου λέγεται encoded.txt και το αντίστοιχο αρχείο εξόδου που σας έχουµε δώσει λέγεται stdout1.txt Η εντολή:./decoder < encoded.txt > myout1.txt εκτελεί το πρόγραµµά σας µε την ενδεικτική είσοδο input1.txt και αποθηκεύει τα αποτελέσµατα στο αρχείο εξόδου myout1.txt

Η εντολή diff -b myout1.txt stdout1.txt συγκρίνει το δικό σας αρχείο εξόδου µε το δικό µας. Αν υπάρχουν διαφορές, τις εµφανίζει (γραµµή-γραµµή). Αν δεν υπάρχουν διαφορές, δεν κάνει τίποτα. Για περισσότερες πληροφορίες δείτε το σχετικό παράρτηµα στο τέλος του φυλλαδίου. Πρέπει το πρόγραµµα που θα µας παραδώσετε να παράγει έξοδο που δεν έχει διαφορές από τη δική µας. Προσθέστε σε σχόλια στην αρχή του αρχείου τα πλήρη ονόµατα και ΑΜ των µελών της οµάδας. Παρακαλούµε να γράφετε τα σχόλια ΜΟΝΟ µε λατινικούς χαρακτήρες. Αρχείο προς παράδοση: decoder.c Άσκηση 2: Λεκτική ανάλυση κειµένου Εισαγωγή Σας ζητείται να φτιάξετε πρόγραµµα το οποίο θα δέχεται από την είσοδο κείµενο έως και 1024 χαρακτήρων. Εάν το κείµενο αποτελείται από παραπάνω χαρακτήρες, αυτοί αγνοούνται. Το πρόγραµµα θα πρέπει να αναγνωρίζει τις διαφορετικές λέξεις του κειµένου και να τις εκτυπώνει. Υποθέστε ότι το κείµενο µπορεί να περιέχει έως 512 λέξεις και ότι κάθε λέξη έχει το πολύ 28 γράµµατα. Αποθηκεύστε το πρόγραµµα σε αρχείο µε το όνοµα scanner.c. Χρησιµοποιήστε σαν είσοδο (µε ανακατεύθυνση) το αρχείο κειµένου words.txt. Στάδιο 1: Εισαγωγή και αρχική επεξεργασία δεδοµένων ( ) Διαβάστε χαρακτήρα-προς-χαρακτήρα από το πληκτρολόγιο ένα κείµενο έως ότου συναντήσετε τον ειδικό χαρακτήρα EOF ή έχετε διαβάσει το ανώτατο όριο χαρακτήρων που επιτρέπεται να περιέχει το κείµενο (όποιο από τα δύο συµβεί πρώτο). Μετρήστε τους χαρακτήρες που διαβάσατε. Η πληροφορία αυτή θα σας φανεί χρήσιµη. Το κείµενο πρέπει να αποθηκευτεί σε κατάλληλο πίνακα. Στάδιο 2: Ανίχνευση λέξεων ( ) Διατρέξτε τον πίνακα µε το κείµενο για να ανιχνεύσετε τις λέξεις. Μια λέξη αποτελείται από συνεχόµενους χαρακτήρες a - z και Α - Ζ. Αν παρεµβληθεί οτιδήποτε άλλο, ξεκινά µια νέα λέξη. Ψάξτε για την αρχή µιας λέξης. Όσο βρίσκετε χαρακτήρες που δεν ανήκουν σε λέξη (δεν είναι δηλαδή a - z και A - Z ) µπορείτε να τους αντικαθιστάτε µε \0. Με αυτό τον τρόπο δηµιουργείτε (εύκολα) strings µέσα στον πίνακα που περιέχει το κείµενο. Κάθε string περιέχει µια λέξη. Αφού βρείτε την αρχή µιας λέξης, πρέπει να βρείτε το τέλος της. Έχοντας κρατήσει την αρχή της σε

κατάλληλη µεταβλητή, συνεχίσετε να διατρέχετε τον πίνακα-κείµενο έως ότου βρείτε χαρακτήρα που δεν είναι γράµµα. Αυτό θα είναι το τέλος της λέξης σας. Έχοντας εντοπίσει τη λέξη, αντιγράψτε τη σε ένα διδιάστατο πίνακα χαρακτήρων (ευρετήριο) ο οποίος έχει τόσες γραµµές όσο είναι το µέγιστο δυνατό πλήθος λέξεων στο κείµενο και τόσες στείλες όσο είναι το µέγιστο δυνατό µέγεθος µιας λέξης. Κάθε νέα λέξη που βρίσκετε πρέπει να τοποθετείται στην επόµενη γραµµή του διδιάστατου πίνακα. Εκτυπώστε τα περιεχόµενα του πίνακα-ευρετήριο, µια-µία λέξη µε χαρακτήρα αλλαγής γραµµής ανάµεσα σε διαδοχικές λέξεις. Στάδιο 3: Τελικός έλεγχος ορθότητας Το πρόγραµµά σας πρέπει να λειτουργεί σωστά και να εκτυπώνει όλα τα µηνύµατα και αποτελέσµατα µε τον τρόπο που σας περιγράφουµε. Για να µπορέσετε να ελέγξετε την ορθότητα θα σας δώσουµε ενδεικτικά αρχεία εισόδου και εξόδου. Υπάρχει ένας εύκολος τρόπος να συγκρίνετε τα δικά σας αποτελέσµατα µε τα δικά µας: Ας υποθέσουµε ότι το εκτελέσιµο πρόγραµµά σας λέγεται scanner, το ενδεικτικό αρχείο εισόδου λέγεται input1.txt και το αντίστοιχο αρχείο εξόδου που σας έχουµε δώσει λέγεται stdout1.txt Η εντολή:./scanner < input1.txt > myout1.txt εκτελεί το πρόγραµµά σας µε την ενδεικτική είσοδο input1.txt και αποθηκεύει τα αποτελέσµατα στο αρχείο εξόδου myout1.txt Η εντολή diff -b myout1.txt stdout1.txt συγκρίνει το δικό σας αρχείο εξόδου µε το δικό µας. Αν υπάρχουν διαφορές, τις εµφανίζει (γραµµή-γραµµή). Αν δεν υπάρχουν διαφορές, δεν κάνει τίποτα. Για περισσότερες πληροφορίες δείτε το σχετικό παράρτηµα στο τέλος του φυλλαδίου. Πρέπει το πρόγραµµα που θα µας παραδώσετε να παράγει έξοδο που δεν έχει διαφορές από τη δική µας. Προσθέστε σε σχόλια στην αρχή του αρχείου τα πλήρη ονόµατα και ΑΜ των µελών της οµάδας. Παρακαλούµε να γράφετε τα σχόλια ΜΟΝΟ µε λατινικούς χαρακτήρες. Αρχείο προς παράδοση: scanner.c

Πώς να παραδώσετε τη δουλειά σας (Ακολουθείστε τις οδηγίες ακριβώς αλλιώς µπορεί να µη δούµε τα αρχεία σας) Κατασκευάστε ένα φάκελο µε όνοµα epwnumo1_am1_epwnumo2_am2 και αντιγράψτε µέσα σε αυτόν το decoder.c και το scanner.c Πηγαίνετε στο φάκελο µέσα στον οποίο βρίσκεται το κατασκευάσατε και γράψτε την παρακάτω εντολή: tar czf epwnumo1_am1_epwnumo2_am2.tgz epwnumo1_am1_epwnumo2_am2 που epwnumo1_am1_epwnumo2_am2 Στείλτε email: στη διεύθυνση ce120lab@gmail.com αντίγραφο (CC) στον άλλο µέλος της οµάδας σας θέµα (subject) CE120 hw1 και επικολληµένο αρχείο το epwnumo1_am1_epwnumo2_am2.tgz Το πρόγραµµά σας θα βαθµολογηθεί ως προς: ορθότητα υπολογισµών σωστή επιλογή τύπων σωστή επιλογή και χρήση δοµών ελέγχου κι επανάληψης σωστή χρήση πινάκων αναγνωσιµότητα (ονόµατα, στοίχιση, σχολιασµός, µορφή κώδικα) φορµαρισµένη είσοδος/έξοδος και συµµόρφωση µε τις προδιαγραφές.

Παράρτηµα Α: Ανακατεύθυνση στο Linux Μέχρι στιγµής, έχετε δεί πως να γράφετε ένα πρόγραµµα που διαβάζει από το πληκτρολόγιο και γράφει στην οθόνη. Αυτό που συµβαίνει στην πραγµατικότητα είναι ότι το πρόγραµµα διαβάζει από το λεγόµενο standard input (stdin, προκαθορισµένη είσοδος) και γράφει στο λεγόµενο standard output (stdout, προκαθορισµένη έξοδος). Τυπικά, το standard input είναι συνδεδεµένο µε το πληκτρολόγιο και το standard output µε την οθόνη. Στην πρώτη άσκηση του σηµερινού εργαστηρίου θέλουµε να διαβάσουµε από το πληκτρολόγιο µέχρι 1024 χαρακτήρες. Αυτό είναι αρκετά µεγάλο νούµερο - θα ήταν πιο πρακτικό αν είχαµε αυτούς τους χαρακτήρες σε ένα αρχείο και διαβάζαµε από το αρχείο. Το Linux µας επιτρέπει να επιτύχουµε κάτι τέτοιο µε την "ανακατεύθυνση". Όταν το πρόγραµµα θέλει να διαβάσει είσοδο, µπορούµε να την ανακατευθύνουµε ώστε να γίνεται από αρχείο, αντί από το πληκτρολόγιο. Οµοίως, όταν το πρόγραµµα παράγει έξοδο, µπορούµε να την ανακατευθύνουµε από την οθόνη σε ένα αρχείο. Για να ανακατευθύνουµε την είσοδο χρησιµοποιούµε το ειδικό σύµβολο < Παράδειγµα:./myprogram < input Το πρόγραµµα myprogram παίρνει την είσοδό του από το αρχείο input αντί για το πληκτρολόγιο Για να ανακατευθύνουµε την έξοδο χρησιµοποιούµε το ειδικό σύµβολο > Παράδειγµα:./myprogram > output Το πρόγραµµα myprogram γράφει την έξοδό του στο αρχείο output αντί για την οθόνη Τέλος, µπορούµε να ανακατευθύνουµε και την είσοδο και την έξοδο ταυτόχρονα: Παράδειγµα:./myprogram < input > output Το πρόγραµµα myprogram παίρνει την είσοδό του από το αρχείο input και γράφει την έξοδό του στο αρχείο output. Γράψτε σε ένα αρχείο µε όνοµα data.c το παρακάτω πρόγραµµα: #include<stdio.h> int main(int argc, char *argv[]) { int i; for (i=0; i<120; i++) { printf( %d\n, i); } return 0; } Κάντε compile κι εκτελέστε το. Θα δείτε να τυπώνει στην οθόνη 120 αριθµούς. Τώρα, εκτελέστε το µε ανακατεύθυνση εξόδου προς ένα αρχείο µε όνοµα numbers.txt:./data > numbers.txt Δε θα εµφανιστεί τίποτα στην οθόνη, αλλά αν ανοίξετε το numbers.txt θα δείτε µέσα τους 120 ακεραίους.

Παράρτηµα Β: Σύγκριση αρχείων Η εντολή diff του Linux χρησιµοποιείται για να ελέγχουµε αν δυο αρχεία είναι ίδια. Δοκιµάστε τη! Φτιάξτε ένα αντίγραφο του αρχείου data.c από το προηγούµενο παράρτηµα και ονοµάστε το data2.c. Μετά, στη γραµµή εντολής γράψτε: diff -b data.c data2.c Δε θα βγεί τίποτα γιατί τα αρχεία είναι ίδια. Τώρα, κάντε κάποιες αλλαγές στο data2.c και ξαναδοκιµάστε. To diff θα παρουσιάσει όλες τις διαφορές ανάµεσα στα δύο προγράµµατα (ανά γραµµή) Μπορείτε να χρησιµοποιείτε ανακατεύθυνση για να εκτυπώνετε την έξοδο ενός προγράµµατός σας σε αρχείο, να κάνετε το ίδιο και για την έξοδο του εκάστοτε εκτελέσιµου που σας δίνουµε και µετά να χρησιµοποιήσετε diff για να δείτε αν τα αποτελέσµατα είναι ίδια. Με τον ίδιο τρόπο θα ελέγχουµε κι εµείς τα αποτελέσµατα των προγραµµάτων σας όποτε είναι δυνατό.