koutsijunior Δημοσ. 25 Νοεμβρίου 2010 Δημοσ. 25 Νοεμβρίου 2010 ΑΜΑ ΞΕΡΕΙ ΚΑΝΕΙΣ ΑΣ ΠΕΙ ΚΑΜΙΑ ΑΠΟΨΗ ΠΩΣ ΝΑ ΚΑΝΩ ΑΥΤΗ ΤΗΝ ΑΣΚΗΣΗ.ΕΥΧΑΡΙΣΤΩ!! Να γραφεί πρόγραμμα σε C το οποίο θα έχει ως σκοπό την παραγωγή ενός πηγαίου κώδικα χωρίς σχόλια. Το πρόγραμμα θα πρέπει να παίρνει σαν παράμετρο ένα όνομα αρχείου πηγαίου κώδικα σε C (έστω ask.c) και θα μετράει το συνολικό του μέγεθος (init_size). Έπειτα θα δημιουργεί (init_size/50 + 1) διεργασίες (όπου "/" είναι ακέραια διαίρεση) δηλαδή αν το μέγεθος του αρχείου είναι 134 χαρακτήρες, θα δημιουργεί (134/50 + 1 = 2 + 1 = 3 διεργασίες). Κάθε διεργασία θα επεξεργάζεται και διαφορετικό κομμάτι του κώδικα, το οποίο θα έχει μέγεθος το πολύ 50 χαρακτήρων. Δηλαδή στο συγκεκριμένο παράδειγμα, η πρώτη διεργασία θα επεξεργαστεί το κομμάτι του αρχείου στο διάστημα [0...49] (δηλαδή από την θέση 0 έως και την θέση 49), η δεύτερη το κομμάτι [50...99] και η τρίτη το [100...133]. Από την αρχική επεξεργασία θα παράγεται ένα αρχείο (έστω ask.c.tmp) το οποίο θα έχει ίδιο μέγεθος με το αρχικό (ask.c) αλλά στη θέση των σχολίων θα υπάρχουν κάποιοι ειδικοί χαρακτήρες. Τα σχόλια στη C συμβολίζονται ως "/* ..... */" ή "// .... \\n" (όπου "\\n" είναι το τέλος της γραμμής). Οι ειδικοί χαρακτήρες αντικατάστασης των σχολίων, μπορούν να είναι είτε σταθεροί χαρακτήρες (π.χ. "@") είτε δυναμικοί στους οποίους να υπάρχει και η πληροφορία του μήκους του σχολίου (π.χ. _C8, ^8 (σχόλιο μήκους 8 χαρακτήρων)). Όλες οι διεργασίες εκτελούνται "ταυτόχρονα" (εναλλαγή των διεργασιών πριν ολοκληρώσουν την επεξεργασία τους) αλλά το διάβασμα από το αρχικό αρχείο και το γράψιμο στο τελικό θα πρέπει να "προστατεύεται" από δύο σημαφόρους, έναν για το διάβασμα και έναν για το γράψιμο. Κάθε διεργασία θα προσπαθεί αρχικά να κάνει down() το σημαφόρο του διαβάσματος, θα πηγαίνει τον κέρσορα στο επόμενο χαρακτήρα από αυτόν που είχε διαβάσει (στο αρχικό αρχείο), θα τον διαβάζει, θα κάνει up() τον σημαφόρο του διαβάσματος και έπειτα θα κάνει down() το σημαφόρο του γραψίματος, θα πηγαίνει τον κέρσορα στην ίδια θέση με αυτή από την οποία διάβασε τον χαρακτήρα (στο αρχείο tmp), θα γράφει το γράμμα (ή τον ειδικό χαρακτήρα αν αυτό που διάβασε είναι σχόλιο) και τέλος θα κάνει up() το σημαφόρο γραψίματος. Εφόσον ολοκληρωθούν όλες οι διεργασίες, η αρχική διεργασία θα δημιουργεί σε δεύτερο στάδιο επεξεργασίας το τελικό αρχείο (έστω ask_bare.c) το οποίο θα δημιουργείται με βάση το ask.c.tmp αλλά χωρίς να περιέχει τους ειδικούς χαρακτήρες με τους οποίους είχαν αντικατασταθεί τα σχόλια. Προφανώς το μέγεθος αυτού του αρχείου (final_size) θα είναι ίσο ή μικρότερο από το αρχικό. Οπότε μετά το τέλος της δημιουργίας αυτού του αρχείου, θα εκτυπώνεται το ποσοστό συμπίεσης σε σχέση με το αρχικό αρχείο ((final_size-init_size)/init_size). Παρακάτω υπάρχουν παραδείγματα κατανόησης. *** ask.c *** #include <stdio.h> /* to prwto mou programma */ main(){ printf("Hello world!!!\\n"); // ektypwsi } *** ask.c.tmp (σταθερός χαρακτήρας) *** #include <stdio.h> @@@@@@@@@@@@@@@@@@@@@@@@@@@@ main(){ printf("Hello world!!!\\n"); @@@@@@@@@@@ } ή *** ask.c.tmp (δυναμική αναπαράσταση) *** #include <stdio.h> _C28 main(){ printf("Hello world!!!\\n"); _C11 } (όπου η αλληλουχία "_C" δεν υπάρχει μέσα στον κώδικα) ή *** ask.c.tmp (δυναμική αναπαράσταση) *** #include <stdio.h> ^28 main(){ printf("Hello world!!!\\n"); ^11 } (όπου "^" ειδικός χαρακτήρας ο οποίος δεν υπάρχει μέσα στον κώδικα) *** ask_bare.c *** #include <stdio.h> main(){ printf("Hello world!!!\\n"); }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.