Timonkaipumpa Δημοσ. 25 Απριλίου 2014 Δημοσ. 25 Απριλίου 2014 Άρα θες να δεις πώς γίνεται το διάβασμα αρχείων; Δες εδώ: http://www.cplusplus.com/doc/tutorial/files/ Και προσπάθησε να μην χρησιμοποιήσεις πρακτικές από C αλλά μόνο ό,τι σου δίνει η C++. Επίσης θα σου χρειαστεί (σχεδόν σίγουρα) και αυτό: http://www.cplusplus.com/reference/sstream/stringstream/ 1
khr1s Δημοσ. 25 Απριλίου 2014 Μέλος Δημοσ. 25 Απριλίου 2014 Άρα θες να δεις πώς γίνεται το διάβασμα αρχείων; Δες εδώ: http://www.cplusplus.com/doc/tutorial/files/ Και προσπάθησε να μην χρησιμοποιήσεις πρακτικές από C αλλά μόνο ό,τι σου δίνει η C++. Επίσης θα σου χρειαστεί (σχεδόν σίγουρα) και αυτό: http://www.cplusplus.com/reference/sstream/stringstream/ Σε ευχαριστω !
tr3quart1sta Δημοσ. 25 Απριλίου 2014 Δημοσ. 25 Απριλίου 2014 Το πρόγραμμά σας δε θα πρέπει να διαβάζει τίποτε από το πληκτρολόγιο. Οι εντολές εισαγωγής και διαγραφής συνδέσμων καθώς και η εντολή ανάγνωσης του αρχείου εισόδου και παραγωγής του αρχείου εξόδου θα βρίσκονται μέσα στο αρχείο commands.txt που θα περιέχει τις εντολές: READ_DATA, WRITE_INDEX, INSERT_LINK, DELETE_LINK (κεφαλαία γράμματα). Δίνεται ένα παράδειγμα του αρχείου αυτού: READ_DATA input.txt INSERT_LINK 1 2 INSERT_LINK 5 6 DELETE_LINK 3 4 INSERT_LINK 6 7 WRITE_INDEX output.txt Προσέξτε ότι η εντολή READ_DATA θα υπάρχει μία φορά στην αρχή και η εντολή WRITE_INDEX μία φορά στο τέλος. Οι άλλες εντολές μπορεί να είναι είτε INSERT_LINK x y είτε DELETE_LINK x y. Αν κατά την INSERT_LINK η ακμή υπάρχει ήδη, τότε δεν εισάγεται τίποτα. Επίσης, αν η ακμή που πάμε να διαγράψουμε με ην εντολή DELETE_LINK δεν υπάρχει, τότε δε συμβαίνει τίποτε και το πρόγραμμα συνεχίζει κανονικά. το input.txt τι εχει μεσα? τις εντολες με το κοκκινο?
gon1332 Δημοσ. 25 Απριλίου 2014 Δημοσ. 25 Απριλίου 2014 Οχι ρε συ. Σε λεει, στο commands.txt Έχω την εντύπωση ότι στο command.txt έχει τα READ_DATA, WRITE_INDEX.. Το input.txt απ'ό,τι κατάλαβα έχει τα INSERT_LINK, DELETE_LINK..
defacer Δημοσ. 25 Απριλίου 2014 Δημοσ. 25 Απριλίου 2014 Θα πω συνοπτικά κάποια high-level πράγματα και αν θες τα ψάχνεις ένα ένα με την ησυχία σου. Το συστήνω γιατί όλα μαζί θα πέσουν βαριά. Χρειάζεσαι: Να καθορίσεις τη "γραμματική" στην οποία υπακούει η είσοδός σου (επιλογή καθορισμένη από τα παραδείγματα που δίνεις) Έναν parser που να διαβάζει την είσοδο βάσει των κανόνων της γραμματικής Μια μορφή αναπαράστασης των αποτελεσμάτων του parser (αυθαίρετα επιλεγμένη) Μια στρατηγική "εκτέλεσης" των αποτελεσμάτων του parser (όπου και θα γίνεται η πραγματική δουλειά) Γραμματική Η περίπτωσή σου είναι απλή, οπότε μπορείς να πεις π.χ. (με πλάγια γράμματα ορισμοί που δημιουργώ on the fly): Ένα πρόγραμμα αποτελείται από μηδέν ή περισσότερες εντολές. Μια εντολή αποτελείται από ένα όνομα ακολουθούμενο από μηδέν ή περισσότερες παραμέτρους και στη συνέχεια από το χαρακτήρα newline. Το όνομα και οι παράμετροι διαχωρίζονται μεταξύ τους από ένα ή περισσότερα κενά. Ένα όνομα μπορεί να περιλαμβάνει τους χαρακτήρες Α-Ζ και _. Μια παράμετρος μπορεί να περιλαμβάνει οποιοδήποτε χαρακτήρα εκτός από το κενό. Τα ζητούμενα από τον ορισμό που θα δώσεις στη γραμματική είναι 2: Να περιγράφει την είσοδο (δηλαδή, αν πάρεις ένα από τα παραδείγματά σου και το παράδειγμα γραμματικής που δίνω, θα πρέπει να μπορείς να καταλάβεις αν κάτι είναι εντολή, όνομα, παράμετρος, κλπ. Να είναι μονοσήμαντη (δηλαδή, να μη μπορείς να ερμηνεύσεις την ίδια είσοδο με παραπάνω από ένα διαφορετικούς αλλά σύμφωνους με τους κανόνες της γραμματικής τρόπους) Parser Αυτό θα το υλοποιήσεις ως finite state machine aka DFA. Το οποίο είναι επιστημονικός τρόπος για να περιγράψεις στην απλούστερη περίπτωση το παρακάτω: enum class State { EXPECT_COMMAND_OR_EOF, EXPECT_PARAMETER_OR_EOL }; State state = EXPECT_COMMAND_OR_EOF; while (διάβασε το επόμενο τμήμα της εισόδου) { switch (state) { case EXPECT_COMMAND_OR_EOF: if (eof) { break; } else if (αυτό που διάβασες αποτελείται από A-Z η/και _) { σημείωσε_κάπου_το_όνομα_της_τρέχουσας_command; state = EXPECT_PARAMETER_OR_EOL; } else { parse_error_λόγω_εσφαλμένης_εισόδου; } continue; case EXPECT_PARAMETER_OR_EOL: if (το τμήμα ήταν ο χαρακτήρας \n) { σημείωσε_κάπου_την_command_που_μόλις_ολοκληρώσαμε; state = EXPECT_COMMAND_OR_EOF; } else { πρόσθεσε_στην_τρέχουσα_command_την_παράμετρο; } continue; } } Αναπαράσταση Χρειαζόμαστε ένα τρόπο να αναπαριστούμε μια command και ένα program. KISS: struct Command { string name; vector<string> arguments; }; struct Program { vector<Command> commands; }; Εκτέλεση Είναι ο κώδικας που παίρνει ένα Program και "κάνει τη δουλειά". Στην πιο απλή (και το εννοώ αυτό ταυτόχρονα και με την καλή αλλά και με την κακή έννοια) εκδοχή του: void run(Program p) { vector<Command>::iterator it = p.commands.begin(); while (it++ != p.commands.end()) { string name = (*it).name; if (name == "INSERT_LINK") { } else if (name == "DELETE_LINK") { } // κλπ κλπ } } Όλα αυτά που έχω γράψει εδώ είναι, για να χρησιμοποιήσω τεχνική ορολογία, μπακαλιές αν τα δεις με αντικειμενικά κριτήρια και υπάρχουν πολύ καλύτεροι από software engineering άποψη τρόποι για να γίνει το κάθε ένα τους. Επίσης υπάρχει και computer science θεωρία με την οποία μπορούμε να τα περιγράψουμε "μαθηματικά" και όχι με μπλα μπλα όπως έκανα εγώ. Επομένως αυτή η "λύση" απέχει πάαααααρα πολύ από μια όμορφη, σωστή, elegant λύση του προβλήματος. Αλλά από κάπου πρέπει να ξεκινήσεις, και νομίζω ο δρόμος αυτός δεν είναι κι άσχημος. Αν θες μπορείς να ρίξεις μια ματιά σ' αυτό, που είναι το source αλλά και έτοιμο binary για demo μιας ανάλογης εργασίας που είχα γράψει κάποτε. Εκεί η είσοδος έχει αυτή τη μορφή: polygon [ colour 1 1 1 num_vert 4 -1.0 1.0 0.0 1.0 1.0 0.0 1.0 -1.0 0.0 -1.0 -1.0 0.0 ] translate [ -3.0 3.0 0.0 ] circle [ colour 1 0 0 radius 1.2 num_segments 5 ] translate [ 3.0 0.0 0.0 ] circle [ colour 0 1 0 radius 1.2 num_segments 10 ] translate [ 3.0 0.0 0.0 ] circle [ colour 0 0 1 radius 1.2 num_segments 20 ] translate [ -3.0 -6.0 0.0 ] scale [ 4.0 1.0 1.0 ] polygon [ colour 1 1 1 num_vert 4 -1.0 1.0 0.0 1.0 1.0 0.0 1.0 -1.0 0.0 -1.0 -1.0 0.0 ] Το demo τρέχει είτε ως ood <filename> οπότε διαβάζει από εκεί, είτε με σκέτο ood οπότε πληκτρολογείς την είσοδο κατευθείαν. Επισης, it's kind of lame. Διαβάζω το source τώρα και σε κάποια σημεία γελάω. Γελάστε και σεις ελεύθερα. 6
khr1s Δημοσ. 26 Απριλίου 2014 Μέλος Δημοσ. 26 Απριλίου 2014 Θα πω συνοπτικά κάποια high-level πράγματα και αν θες τα ψάχνεις ένα ένα με την ησυχία σου. Το συστήνω γιατί όλα μαζί θα πέσουν βαριά.... Φιλε χιλια ευχαριστω που εγραψες ολο αυτο το κατεβατο θα τα διαβασω ολα ! Πραγματικα μπραβο που υπαρχουν τετοια ατομα σε Ελληνικα forum ! 1
παπι Δημοσ. 26 Απριλίου 2014 Δημοσ. 26 Απριλίου 2014 Έχω την εντύπωση ότι στο command.txt έχει τα READ_DATA, WRITE_INDEX.. Το input.txt απ'ό,τι κατάλαβα έχει τα INSERT_LINK, DELETE_LINK.. Ελα βρε, ειναι ξεκαθαρη η εκφωνηση (περιεργο για ελληνικο τει/αει). Το commands.txt περιεχει μονο "εντολες" (aka script) και τα input output.txt εχουν μονο data.
defacer Δημοσ. 26 Απριλίου 2014 Δημοσ. 26 Απριλίου 2014 Φιλε χιλια ευχαριστω που εγραψες ολο αυτο το κατεβατο θα τα διαβασω ολα ! Πραγματικα μπραβο που υπαρχουν τετοια ατομα σε Ελληνικα forum ! Να 'σαι καλά. Το καλύτερο ευχαριστώ που μπορείς να μου πεις είναι να τα διαβάσεις και να τα μάθεις σε βάθος και αργότερα να τα μεταδώσεις σε άλλους με τη σειρά σου. 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα