Δημοσιεύτηκε: 03 Ιούλ 2011, 19:56
Star_Light έγραψε:
[snip]
καπου ο δασκαλος migf1 (ας μου επιτρεψει αυτο τον χαρακτηρισμο μιας και ειναι καλλιτεχνης) ειπε για το αν θα πρεπει να συνεχισει η οχι..... βασικα η δικια μου αποψη ειναι λιγο πιο σιγα ειναι πολυ ενδιαφεροντα ολα αυτα και τα διαβαζω σιγα σιγα και με προσοχη οπως και αλλα μελη ...
[snip]
Όντως, σαν να έπεσαν πολλά μαζεμένα!!!
Λέω πριν προχωρήσουμε παρακάτω να προσπαθήσετε να φτιάξετε ένα μικρό πρόγραμμα, ως crash-test των όσων έχουμε πει μέχρι στιγμής. Ένα πρόγραμμα δηλαδή που για να το φέρετε εις πέρας θα προϋποθέτει πως όντως έχετε εμπεδώσει αυτά που έχουμε πει μέχρι τώρα.
Γράψτε ένα πρόγραμμα που θα διαβάζει από το πληκτρολόγιο τυχαίο πλήθος λέξεων (μια λέξη ανά γραμμή) και σε τυχαία σειρά μέχρι να διαβάσει τη λέξη "stop".
Θα τις μετατρέπει σε πεζά γράμματα κι ανάλογα με το γράμμα από το οποίο αρχίζει η κάθε λέξη θα την αποθηκεύει σε μια από 26 απλά συνδεδεμένες λίστες, με την κάθε λίστα από αυτές να αντιστοιχεί σε ένα από τα 26 πεζά γράμματα της λατινικής αλφαβήτου. Δηλαδή όσες λέξεις ξεκινάνε με το γράμμα a θα αποθηκεύονται στη λίστα που αντιστοιχεί στο a, όσες ξεκινάνε από b θα αποθηκεύονται στη λίστα που αντιστοιχεί στο b, κλπ.
Η σειρά των λέξεων στην κάθε λίστα θα πρέπει να είναι χρονολογικά αντίστροφη (δηλαδή οι πιο πρόσφατα πληκτρολογημένες λέξεις να εμφανίζονται πρώτες στη λίστα τους).
Για λιγότερο κώδικα, η λέξη "stop" θα αποθηκεύεται κι αυτή στη λίστα του s. Αν μια λέξη αρχίζει από χαρακτήρα με ASCII code μικρότερο του 'a' θα μπαίνει στη λίστα του a, ενώ αν αρχίζει από χαρακτήρα με ASCII code μεγαλύτερο του 'z' θα μπαίνει στη λίστα του z.
Πριν τερματίσει το πρόγραμμα θα τυπώνει τα περιεχόμενα (λέξεις) μόνο όσων λιστών δεν είναι άδειες, καθώς και το σε ποιο γράμμα αντιστοιχούν και πόσες λέξεις περιέχουν. Στο τέλος θα τυπώνει το συνολικό πλήθος των λέξεων που περιέχονται σε όλες τις λίστες.
Το παραπάνω πρόγραμμα σίγουρα δεν θα το χαρακτήριζα εύκολο για αρχάριους, αλλά αν έχετε κατανοήσει όσα έχουμε πει μέχρι τώρα είναι απόλυτα εφικτό!. Τεστάρει όχι μόνο λίστες, αλλά και πίνακες και strings και χαρακτήρες. Είναι πολύ καλή άσκηση που θα σας βοηθήσει να ξεκαθαρίσετε πάρα πολλά πράγματα αν την καταφέρετε μόνοι σας!
Τις βασικές δομές και συναρτήσεις που θα χρειαστείτε για την διαχείριση των λιστών (εισαγωγή κόμβων, πλήθος κόμβων, τύπωμα λιστών, καταστροφή λιστών) τις έχουμε ήδη γράψει σε κώδικα. Hint: Αποφασίστε όμως αν, σύμφωνα με την εκφώνηση, τις εισαγωγές κόμβων πρέπει να τις κάνετε με την list_append() ή με την list_prepend()

Ιδανικά, για να είναι το πρόγραμμα πιο δομημένο και άρα πολύ πιο εύκολο να του προσθέσουμε κι άλλες λειτουργίες μελλοντικά, θα πρέπει να γραφτεί με τις δομές που αναλύω στο 5ο μέρος του tutorial, αν και προϋποθέτει ακόμα μεγαλύτερη κατανόηση των εννοιών που έχουμε αναλύσει (μπορεί όμως κάλλιστα να υλοποιηθεί και με όσα έχουν αναλυθεί μέχρι και το 3ο μέρος).
Με τον τρόπο του 5ου μέρους, ο κώδικας (χωρίς σχόλια) μου πήρε 160 γραμμές συνολικά, χρησιμοποιώντας 9 συναρτήσεις + την main()... 3 συναρτήσεις για διαχείριση strings (διάβασμα, μετατροπή σε πεζά κι αντιγραφή) και 5 για διαχείριση λιστών (αρχικοποίηση, έλεγχο για κενή λίστα, εισαγωγή κόμβων, τύπωμα κόμβων και καταστροφή λίστας). Επίσης, για μεγαλύτερη απλότητα στον κώδικα, δεν κάνει έλεγχο για το αν η κάθε γραμμή εισόδου περιέχει περισσότερες από μια λέξεις (αν περιέχει, τότε τις διαβάζει όλες μαζί σαν μια λέξη).
Η υλοποίησή μου δίνει την παρακάτω έξοδο:

Τον κώδικα του προγράμματος θα τον ποστάρω μόνο αν μου τον ζητήσετε (εννοώ για να σας δώσω όσο χρόνο θέλετε για να το φτιάξετε μόνοι σας).
HINTS:
- Για τις 26 λίστες, χρησιμοποιήστε έναν πίνακα από λίστες... π.χ.: List alphabet[26]; Ενημερωτικά, αυτό είναι ένα απλοϊκό hash-table (απλά το αναφέρω ως πληροφορία, δεν υπονοώ δηλαδή πως χρειάζεται να διαβάσετε περί hash-tables για να φτιάξετε τον παραπάνω πίνακα).
- Φτιάξτε οπωσδήποτε μια συνάρτηση (π.χ. init_alphabet(List alphabet[] ) ) που θα αρχικοποιεί τα πεδία head (=NULL), tail (=NULL) και len (=0) ΟΛΩΝ των λιστών του πίνακα, πριν ξεκινήσετε να κάνετε οτιδήποτε άλλο με τις λίστες.
- Εκμεταλλευτείτε το γεγονός πως στη στάνταρ C οι char αντιστοιχούν σε ASCII codes, ώστε όταν εξετάζετε το 1ο γράμμα της κάθε λέξης να αντιστοιχήσετε το ASCII code του 'a' στο 0, ... το ASCII code του 'z' σε 25 , προκειμένου να βρείτε σε ποιο στοιχείο του πίνακα είναι η λίστα στην οποία πρέπει να μπει η λέξη.
- Θυμηθείτε πως στη C αν s είναι ένα string, τότε *s ή s[0] είναι ο πρώτος χαρακτήρας του.
ΥΓ. Όχι και δάσκαλος, απλά πιο έμπειρος
