Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Σε c λογικά δεν θα κάνει compile το παραπάνω, γιατί δεν θα βρει την stricmp(). Είτε απλοποίησε τη συνθήκη τερματισμού, είτε χρησιμοποίησε τον κώδικα που ήδη έχεις για να μετατρέψεις μια πρόταση σε κεφαλαία και κάνε ένα strcmp() με τα κεφαλαία.

 

Κατά τα άλλα έχεις πολλά θέματα στον κώδικά σου που πρέπει να προσέξεις. Προσπάθησα να επισημάνω μερικά.

σε ευχαριστώ για τις υποδείξεις φίλε μου..:)

  • Απαντ. 46
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Η άσκηση είναι πονηρούλα. Έκατσα να τη λύσω υπολογίζοντας πως δεν θα με πάρει πάνω από 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 λούπες συνολικά την άσκηση συμπεριλαμβανομένης και χειροκίνητης εισόδου, αλλά δεν έχει νόημα νομίζω σε αυτή τη φάση να ασχοληθούμε, γιατί μάλλον θα σε μπερδέψει αντί να σε βοηθήσει.

  • Like 2
Δημοσ.

Για να σε βοηθήσω και εγώ λίγο απο το λινκ που σου έδωσε ο migf1 πιστεύω πρέπει να χρησιμοποιήσεις τις.

int   islower(int);
int   isspace(int);
int   isupper(int);
int   toascii(int);
int   toupper(int)

Έχει δίκιο όταν λέει ότι λύνεις την άσκηση κατά 80%. :-D

  • Like 1
Δημοσ. (επεξεργασμένο)

Από περιέργεια την έλυσα με ένα while & for και ένα πίνακα char για την αποθήκευση της εξόδου, συμφωνώ πως είναι ενδιαφέρον ως ζητούμενο.

 

--EDIT: +1 for :)

Επεξ/σία από Directx
  • Like 2
Δημοσ.

Από περιέργεια την έλυσα με ένα while και ένα πίνακα char για την αποθήκευση της εξόδου, συμφωνώ πως είναι ενδιαφέρον ως ζητούμενο.

 

Με κούφανες φίλε xdir! Πώς σου έφτασε μονάχα ένα while και για είσοδο και για validation και για έξοδο και για επανάληψη μέχρι να δοθεί "THIS IS THE END";

  • Like 1
Δημοσ.

Με κούφανες φίλε xdir! Πώς σου έφτασε μονάχα ένα while και για είσοδο και για validation και για έξοδο και για επανάληψη μέχρι να δοθεί "THIS IS THE END";

Αυτό θα ήθελα να το δω και εγώ.

Θα μπορούσε για παράδειγμα να βάλει μια while και να λέει όσο το Σύνολο της φράσης σε ascii code THIS IS THE END δεν είναι ο αριθμός 1004 τότε δώσε τις παρακάτω εντολές αλλιώς βγες απο το λούπ και βγες από το  πρόγραμμα.

THIS IS THE END = 1004

Δημοσ.

Αυτό θα ήθελα να το δω και εγώ.

Θα μπορούσε για παράδειγμα να βάλει μια while και να λέει όσο το Σύνολο της φράσης σε ascii code THIS IS THE END δεν είναι ο αριθμός 1004 τότε δώσε τις παρακάτω εντολές αλλιώς βγες απο το λούπ και βγες από το  πρόγραμμα.

THIS IS THE END = 1004

 

Εκτός του ότι είναι εξαιρετικό απίθανο (έως αδύνατον) να φτιάξουμε unique hascode για κάθε πιθανό string, είναι κι εξαιρετικά πολύπλοκο να το επιχειρήσουμε on the fly μαζί με άλλους άσχετους ελέγχους, ακόμα κι αν είναι bounded.

 

(σε πιο απλούς όρους,  το 1004 ως σούμα ascii βγαίνει και με διαφορετικούς συνδυασμούς χαρακτήρων)

  • Like 1
Δημοσ.

Με κούφανες φίλε 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 και πάμε πάλι από την αρχή.

  • Like 1
Δημοσ.

Ε με 2 λούπες ρε συ, είπα κ εγώ (και μια η fgets() τρεις)! Έτσι μάλιστα :)

χμ.. μεταξύ μας γίνεται (με μια πολύ γρήγορη σκέψη) και με ένα μόνο while.. αλλά θα είναι αρκετά ugly κώδικας, θα γεμίσουμε με ifs (nah με ένα switch είναι καλύτερα [states])  :D

Δημοσ.

Λογικά γίνεται και ως εξής:

 

μια λούπα η ατέρμονη

μια λούπα που διαβάζει με getchar(), ελέγχει το char κι αν είναι valid το βάζει μαζί με το απαιτούμενο αστεράκι μέσα στο string

μια λούπα (η strcmp()) που συγκρίνει αν το string ισούται με "* T * H * I * S * * I * S * * T * H * E * * E * N * D *"

μια λούπα (η puts() ) που τυπώνει το string

 

ΥΓ. Με ένα μόνο ατέρμονο while? χλωμό μου ακούγεται, αλλά ποτέ δεν ξέρεις :)

  • Like 1
Δημοσ.

Λογικά γίνεται και ως εξής:

 

μια λούπα η ατέρμονη

μια λούπα που διαβάζει με getchar(), ελέγχει το char κι αν είναι valid το βάζει μαζί με το απαιτούμενο αστεράκι μέσα στο string

μια λούπα (η strcmp()) που συγκρίνει αν το string ισούται με "* T * H * I * S * * I * S * * T * H * E * * E * N * D *"

μια λούπα (η puts() ) που τυπώνει το string

 

ΥΓ. Με ένα μόνο ατέρμονο while? χλωμό μου ακούγεται, αλλά ποτέ δεν ξέρεις :)

Γίνεται (το υλοποίησα λίγο γρήγορα σε C [χμ.. τελικά ο κώδικας δεν φαίνεται ugly :D]) ως εξής: Κρατάμε ένα 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.

 

Υ.Γ.

Μιας και το παιδί προσπαθεί να λύσει την άσκηση, δεν αναρτώ κώδικα ;)

Δημοσ.

Όταν μπορέσεις στείλτο με π.μ. Λίγο για την έξοδο δεν το κατάλαβα. Τυπώνεις on the fly? Αν όχι, δεν θέλεις και 2η λούπα για το τύπωμα; Αν ναι, το κάνουμε visually 80s style ( :lol:) στα errors?... δηλαδή τυπώνουμε on the fly κι ότι είναι λάθος, το σβήνουμε πάλι on-the-fly με backspace?


EDIT:

 

Τώρα που το ξανασκέφτομαι, ούτε πως ελέγχεις χωρίς λούπα το ending-condition έχω καταλάβει :(

 

EDIT2:

 

Για το ending-condition, μήπως το κρατάς σε ξεχωριστό string και ελέγχεις on-the-fly τα i του συγκρινόμενα με το εκάστοτε getchar() κατά την είσοδο?

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...