ΔημητρηςΦου Δημοσ. 24 Νοεμβρίου 2013 Μέλος Δημοσ. 24 Νοεμβρίου 2013 Σε c λογικά δεν θα κάνει compile το παραπάνω, γιατί δεν θα βρει την stricmp(). Είτε απλοποίησε τη συνθήκη τερματισμού, είτε χρησιμοποίησε τον κώδικα που ήδη έχεις για να μετατρέψεις μια πρόταση σε κεφαλαία και κάνε ένα strcmp() με τα κεφαλαία. Κατά τα άλλα έχεις πολλά θέματα στον κώδικά σου που πρέπει να προσέξεις. Προσπάθησα να επισημάνω μερικά. σε ευχαριστώ για τις υποδείξεις φίλε μου..
migf1 Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Η άσκηση είναι πονηρούλα. Έκατσα να τη λύσω υπολογίζοντας πως δεν θα με πάρει πάνω από 10 λεπτά και τελικά με πήρε μισή ώρα. Λοιπόν, θα σου γράψω με λίγα λόγια έναν τρόπο επίλυσής της, ελπίζοντας πως θα σε βοηθήσω να τη λύσεις τελικά μόνος σου. Διάβασε την είσοδο σε ένα string. Κατόπιν σε μια λούπα, για κάθε χαρακτήρα του string αν δεν είναι ούτε κενό ούτε λατινικό γράμμα βγάλε μήνυμα σφάλματος, σπάσε τη λούπα και ξανά ζήτα είσοδο από την αρχή. Αλλιώς μετέτρεψε τον χαρακτήρα σε κεφαλαίο, επιτόπου μέσα στο string. Αν το string τελικά ισούται με "THIS IS THE END" τερμάτισε το πρόγραμμα, αλλιώς σε μια νέα λούπα πιάσε ξανά έναν-έναν τους χαρακτήρες του κι ανάλογα με το αν είναι κενό ή γράμμα τύπωσε τα αστεράκια που ζητάει η άσκηση. Κατόπιν ξανα ξεκίνα από την αρχή ζητώντας νέα είσοδο. Αν δεν το έχεις ήδη πιάσει, συνολικά θέλεις 3 λούπες: 2 που διατρέχουν το string σε διαφορετικές στιγμές, οι οποίες λούπες βρίσκονται μέσα σε μια 3η κεντρική λούπα που ζητάει είσοδο από τον χρήστη. Αν την είσοδο την κάνεις χειροκίνητα με getchar() αντί για fgets(), τότε είναι κι αυτή έξτρα λούπα (δηλαδή 4 συνολικά... βασικά και η fgets()/gets() λούπες είναι, οπότε έτσι κι αλλιώς 4 θα κάνεις). Δεν ξέρω αν κάνω καλά, αλλά σου παραθέτω το κομμάτι που τυπώνει μορφοποιημένους με αστεράκια τους χαρακτήρες του τελικού string (είπες έχετε κάνει δείκτες και strings)... ... for (char *cp=input; *cp; cp++) { if ( isspace(*cp) ) { printf( "* " ); } else { printf( "* %c ", *cp ); } } puts("*\n"); ... ΥΓ1. Τα σέβη μου στον καθηγητή σας (δεν τον γνωρίζω, αλλά δείχνει να κάνει καλή δουλειά ) ΥΓ2. Εγώ την έκανα με 3 λούπες συνολικά την άσκηση συμπεριλαμβανομένης και χειροκίνητης εισόδου, αλλά δεν έχει νόημα νομίζω σε αυτή τη φάση να ασχοληθούμε, γιατί μάλλον θα σε μπερδέψει αντί να σε βοηθήσει. 2
Χάρης Μυλωνίδης Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Για να σε βοηθήσω και εγώ λίγο απο το λινκ που σου έδωσε ο migf1 πιστεύω πρέπει να χρησιμοποιήσεις τις. int islower(int); int isspace(int); int isupper(int); int toascii(int); int toupper(int) Έχει δίκιο όταν λέει ότι λύνεις την άσκηση κατά 80%. 1
migf1 Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Σε περίπτωση που βοηθάει περισσότερο, εγώ χρησιμοποίησα: isspace(), isalpha() και toupper(). 2
Directx Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 (επεξεργασμένο) Από περιέργεια την έλυσα με ένα while & for και ένα πίνακα char για την αποθήκευση της εξόδου, συμφωνώ πως είναι ενδιαφέρον ως ζητούμενο. --EDIT: +1 for Επεξ/σία 24 Νοεμβρίου 2013 από Directx 2
migf1 Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Από περιέργεια την έλυσα με ένα while και ένα πίνακα char για την αποθήκευση της εξόδου, συμφωνώ πως είναι ενδιαφέρον ως ζητούμενο. Με κούφανες φίλε xdir! Πώς σου έφτασε μονάχα ένα while και για είσοδο και για validation και για έξοδο και για επανάληψη μέχρι να δοθεί "THIS IS THE END"; 1
Χάρης Μυλωνίδης Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Με κούφανες φίλε xdir! Πώς σου έφτασε μονάχα ένα while και για είσοδο και για validation και για έξοδο και για επανάληψη μέχρι να δοθεί "THIS IS THE END"; Αυτό θα ήθελα να το δω και εγώ. Θα μπορούσε για παράδειγμα να βάλει μια while και να λέει όσο το Σύνολο της φράσης σε ascii code THIS IS THE END δεν είναι ο αριθμός 1004 τότε δώσε τις παρακάτω εντολές αλλιώς βγες απο το λούπ και βγες από το πρόγραμμα. THIS IS THE END = 1004
migf1 Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Αυτό θα ήθελα να το δω και εγώ. Θα μπορούσε για παράδειγμα να βάλει μια while και να λέει όσο το Σύνολο της φράσης σε ascii code THIS IS THE END δεν είναι ο αριθμός 1004 τότε δώσε τις παρακάτω εντολές αλλιώς βγες απο το λούπ και βγες από το πρόγραμμα. THIS IS THE END = 1004 Εκτός του ότι είναι εξαιρετικό απίθανο (έως αδύνατον) να φτιάξουμε unique hascode για κάθε πιθανό string, είναι κι εξαιρετικά πολύπλοκο να το επιχειρήσουμε on the fly μαζί με άλλους άσχετους ελέγχους, ακόμα κι αν είναι bounded. (σε πιο απλούς όρους, το 1004 ως σούμα ascii βγαίνει και με διαφορετικούς συνδυασμούς χαρακτήρων) 1
Directx Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Με κούφανες φίλε xdir! Πώς σου έφτασε μονάχα ένα while και για είσοδο και για validation και για έξοδο και για επανάληψη μέχρι να δοθεί "THIS IS THE END"; Φίλε migf1, στήνω ένα ατέρμον while μέσω του οποίου λαμβάνω την είσοδο (fgets) του χρήστη (αποθηκεύεται σε ένα τοπικό char[]), ύστερα γεμίζω με κενά ένα πίνακα char (μεγαλύτερου μεγέθους από το μήκος της εισόδου) και ξεκινώ να επεξεργάζομαι (με ένα for) την είσοδο και να ελέγχω παράλληλα για το εάν κάθε χαρακτήρας από την είσοδο πληρεί τις απαραίτητες προϋποθέσεις (να είναι γράμμα [Α-Ζ] ή κενό [spc]) [oops εδώ ίσως θα έπρεπε να αναφέρω ότι η δουλεία γίνεται με ένα while & for -τώρα που το βλέπω εκ νέου!]). Αν δεν πληρούνται οι προϋποθέσεις αυτές διακόπτω το for και ενημερώνω ανάλογα τον χρήστη δίχως εκτύπωση της ημιτελούς εξόδου. Σε διαφορετική περίπτωση συνεχίζω να χτίζω την απαιτούμενη έξοδο (εφαρμόζοντας τους υπόλοιπους κανόνες), αν αυτή είναι "* T * H * I * S * * I * S * * T * H * E * * E * N * D *" τότε διακόπτω το while δίχως να εκτυπώσω τίποτε στην έξοδο, διαφορετικά εκτυπώνω το string και πάμε πάλι από την αρχή. 1
migf1 Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Ε με 2 λούπες ρε συ, είπα κ εγώ (και μια η fgets() τρεις)! Έτσι μάλιστα 1
Directx Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Ε με 2 λούπες ρε συ, είπα κ εγώ (και μια η fgets() τρεις)! Έτσι μάλιστα χμ.. μεταξύ μας γίνεται (με μια πολύ γρήγορη σκέψη) και με ένα μόνο while.. αλλά θα είναι αρκετά ugly κώδικας, θα γεμίσουμε με ifs (nah με ένα switch είναι καλύτερα [states])
migf1 Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Λογικά γίνεται και ως εξής: μια λούπα η ατέρμονη μια λούπα που διαβάζει με getchar(), ελέγχει το char κι αν είναι valid το βάζει μαζί με το απαιτούμενο αστεράκι μέσα στο string μια λούπα (η strcmp()) που συγκρίνει αν το string ισούται με "* T * H * I * S * * I * S * * T * H * E * * E * N * D *" μια λούπα (η puts() ) που τυπώνει το string ΥΓ. Με ένα μόνο ατέρμονο while? χλωμό μου ακούγεται, αλλά ποτέ δεν ξέρεις 1
ΔημητρηςΦου Δημοσ. 24 Νοεμβρίου 2013 Μέλος Δημοσ. 24 Νοεμβρίου 2013 ευχαριστώ παιδιά για την βοήθειά σας..προσπαθώ να την διορθώσω..
Directx Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Λογικά γίνεται και ως εξής: μια λούπα η ατέρμονη μια λούπα που διαβάζει με getchar(), ελέγχει το char κι αν είναι valid το βάζει μαζί με το απαιτούμενο αστεράκι μέσα στο string μια λούπα (η strcmp()) που συγκρίνει αν το string ισούται με "* T * H * I * S * * I * S * * T * H * E * * E * N * D *" μια λούπα (η puts() ) που τυπώνει το string ΥΓ. Με ένα μόνο ατέρμονο while? χλωμό μου ακούγεται, αλλά ποτέ δεν ξέρεις Γίνεται (το υλοποίησα λίγο γρήγορα σε C [χμ.. τελικά ο κώδικας δεν φαίνεται ugly ]) ως εξής: Κρατάμε ένα while και το χωρίζουμε σε 4 διαφορετικά states (INPUT, PROCESS, OUTPUT, QUIT) μέσω μιας πχ. switch(State). Το INPUT το αν είναι επιτυχές οδηγεί στο PROCESS, αν δεν είναι επιτυχές τότε οδηγεί εκ νέου το while μας στο INPUT. Το PROCESS επεξεργάζεται και χτίζει την έξοδο μας και οδηγεί στο OUTPUT. Αν το PROCESS βρει σφάλμα ενημερώνει τον χρήστη και οδηγεί στο INPUT. Το OUTPUT εκτυπώνει το αποτέλεσμα του PROCESS, αν το OUTPUT ανιχνεύσει το "* T * H * I * S * * I * S * * T * H * E * * E * N * D *" οδηγεί σε QUIT δίχως εκτύπωση οπότε το while τερματίζει (πχ. while(State != QUIT)) διαφορετικά οδηγεί εκ νέου στο INPUT (και πάλι από την αρχή). Έτσι λοιπόν κρατάμε ένα while το οποίο κατευθύνουμε μέσω states όπου επιθυμούμε εξαλείφοντας το for. Υ.Γ. Μιας και το παιδί προσπαθεί να λύσει την άσκηση, δεν αναρτώ κώδικα
migf1 Δημοσ. 24 Νοεμβρίου 2013 Δημοσ. 24 Νοεμβρίου 2013 Όταν μπορέσεις στείλτο με π.μ. Λίγο για την έξοδο δεν το κατάλαβα. Τυπώνεις on the fly? Αν όχι, δεν θέλεις και 2η λούπα για το τύπωμα; Αν ναι, το κάνουμε visually 80s style ( ) στα errors?... δηλαδή τυπώνουμε on the fly κι ότι είναι λάθος, το σβήνουμε πάλι on-the-fly με backspace? EDIT: Τώρα που το ξανασκέφτομαι, ούτε πως ελέγχεις χωρίς λούπα το ending-condition έχω καταλάβει EDIT2: Για το ending-condition, μήπως το κρατάς σε ξεχωριστό string και ελέγχεις on-the-fly τα i του συγκρινόμενα με το εκάστοτε getchar() κατά την είσοδο?
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα