migf1 Δημοσ. 18 Οκτωβρίου 2012 Δημοσ. 18 Οκτωβρίου 2012 Τι ακριβως θες να σου πω? να δωσω σχολια με τον κωδικα επειδη δεν τον θυμάσαι? Ο κώδικας δεχοταν μια προταση και έκανε αντιστροφη των λεξεων της. Αλλα ετσι οπως ηταν φτιαγμενος δεχοταν και χαρακτηρες οι οποιοι ήταν σημεια στίξης πχ ο ^ και τους εκτυπωνε και αυτους. Πχ αν έδινες hello man^^^ θα σου έδινε man^^^ hello τα ^^^ δεν τα ηθελα και ειπα να κανω κάποιες διορθώσεις. ΟΙ διορθώσεις αυτες βρισκονται στις γραμμές 27 - 33 . Κατα ποσο θεωρείται εντάξει να μειώνεις τον μετρητη μέσα στο loop? Οπως κανω εγω και μετα να αυξάνεται παλι. Μας αναφέρεις τις γραμμές που έχεις διορθώσει από τον αρχικό κώδικα χωρίς να μας δίνεις ούτε καν link προς τον αρχικό κώδικα (κανονικά θα περίμενα να τον παράθετες μέσα στο ίδιο ποστ). Οπότε δεν μπορούμε να αξιολογήσουμε τις όποιες διορθώσεις στις οποίες αναφέρεσαι.
vinso Δημοσ. 18 Οκτωβρίου 2012 Δημοσ. 18 Οκτωβρίου 2012 Αν δεν έχεις πρόβλημα με το for τότε το πρόγραμμα σου είναι οκ αφού κάθε φορά που αφαιρείς --i στην if μετά ξαναμπαίνει στη for και αυξάνει πάλι το i επομένως μένει στην ίδια τιμή(θέση) που θές . Αλλά προσωπικά θεωρώ είναι καλύτερα με while επειδή αυξάνεις όποτε χρειαστείς το i.Δεν το αυξάνεις και μετά το ξανααφαιρείς και τούμπαλιν. Αποφεύγεις τις πολλές πράξεις. και για την inspunct έχεις δίκιο == 0 ήθελε στο if.
Star_Light Δημοσ. 18 Οκτωβρίου 2012 Δημοσ. 18 Οκτωβρίου 2012 Αν δεν έχεις πρόβλημα με το for τότε το πρόγραμμα σου είναι οκ αφού κάθε φορά που αφαιρείς --i στην if μετά ξαναμπαίνει στη for και αυξάνει πάλι το i επομένως μένει στην ίδια τιμή(θέση) που θές . Αλλά προσωπικά θεωρώ είναι καλύτερα με while επειδή αυξάνεις όποτε χρειαστείς το i.Δεν το αυξάνεις και μετά το ξανααφαιρείς και τούμπαλιν. Αποφεύγεις τις πολλές πράξεις. και για την inspunct έχεις δίκιο == 0 ήθελε στο if. Ναι έχεις δικιο σε αυτο. Παρολο που το for το είχα δοκιμάσει και έπαιζε κανονικα αλλα δεν μ αρεσε γιατι ειναι πολυπλοκο ενω αυτο που προτεινες ειναι απλο στην προσεγγιση οποτε το επιλεγουμε τελος... αλλα εχω την εντυπωση οτι παιζει και spaghetti σε αυτον που εβαλα πρωτα - πρωτα εχεις διαβάσει καθολου σχετικα με αυτο? @migf1 παρεθεσα τον κώδικα και ειπα... ΜΟΝΟ οι ταδε γραμμές εχουν αλλαχθει. Επομενως ειναι αυτουσιος εκτος απο τις άλλες.... σε ρωτησα αν θες και σχολια να τον θυμηθεις. P.S Επισης καλο ειναι να μην κολλαμε και στην for να εναλλασουμε με while για να μην ξεχναμε και αυτο το loop κτλπ... ποικιλια
migf1 Δημοσ. 18 Οκτωβρίου 2012 Δημοσ. 18 Οκτωβρίου 2012 Έχεις πρόχειρο τον αρχικό κώδικα, να τον αντιπαραβάλουμε;
Star_Light Δημοσ. 18 Οκτωβρίου 2012 Δημοσ. 18 Οκτωβρίου 2012 Έχεις πρόχειρο τον αρχικό κώδικα, να τον αντιπαραβάλουμε; > #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <ctype.h> #define MAXLEN (200+1) void phrase_rev( char []); void phrase_fill( char []); int main( void ) { char input[ MAXLEN ] = {'\0'}; printf(" Give a sentence: "); phrase_fill(input); phrase_rev(input); return 0; } void phrase_fill( char input[]) { int c ; int i ; for (i=0; i < MAXLEN-1 && '\n' != (c = getchar()) && c != '.' && c != '?'; i++) input[i] = c; input[i] = '\0'; } void phrase_rev( char input[]) { int i ; bool onspace = false; //int c; printf(" The reversal of the sentence: "); for (i= MAXLEN-1 ; i > -1; i--) { if ( isspace(input[i]) && !onspace ) { /* Σε σημείο κενού */ printf( "%s%c", &input[i+1] , input[i]); input[i] = '\0'; onspace = true; } else if ( isspace( input[i] ) ) /* space-area has >1 chars*/ putchar( input[i] ); /* For two consecutive spaces*/ else /* Σε περιοχη που δεν εχει κενό */ onspace = false; } printf("%s" , input ); // printf αντι της puts επειδη η τελευταία προσαρτά και έναν χαρακτήρα αλλαγής γραμμής. //putchar(c); } //---------------------------------------------------------------------------------------------- Btw προτιμώ μια strlen εδω > phrase_rev : for(i= strlen(input) - 1 ........ ) αντι για MAXLEN - 1 που αρχιζει απο το 201 ενω ο χρηστης μπορει να έχει δωσει προταση που μετα βιας φτάνει τους 20 χαρακτηρες μαζι με τα κενά και τον '\0' . Μετά σχετικά με τον 2ο κώδικα αν εχει χρονο κανεις να τον δει μηπως υπάρχει κάποιο λάθος απλα έλυσα αυτον που υπάρχει στην σελιδα 256 την 4 που θελει να κανεις τον κώδικα της 234 αλλα περνώντας δείκτες και καταργόντας τις global. http://ideone.com/6fy1Y κάτι που δεν μ αρεσε στο βιβλιο του King char ch , rank_ch , suit_ch σαν επιστρεφομενες τιμές απο την getchar() που έχει int return type οπως εχουμε πει. Τελοςπαντων...
migf1 Δημοσ. 18 Οκτωβρίου 2012 Δημοσ. 18 Οκτωβρίου 2012 Ok, τον βρήκα εγώ: Post #212 > #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <ctype.h> #define MAXINPUT (256+1) /*********************************************************//** * ************************************************************* */ int main( void ) { char c, input[ MAXINPUT ] = {'\0'}; int i = 0; bool onspace = false; /* read phrase */ for (i=0; i < MAXINPUT-1 && '\n' != (c = getchar()) && c != '.' && c != '?'; i++) input[i] = c; input[i] = '\0'; /* reverse words, keep same spaces in between */ for (; i > -1; i--) { if ( isspace(input[i]) && !onspace ) { /* on space-area */ printf( "%s%c", &input[i+1], input[i] ); input[i+1] = '\0'; onspace = true; } else if ( isspace( input[i] ) ) /* space-area has >1 chars */ putchar( input[i] ); else /* on non-space area */ onspace = false; } puts( input ); exit( EXIT_SUCCESS ); } Είχες βρει κι ένα bug με το i, που δεν το θυμάμαι τώρα απ΄έξω. ... κάτι που δεν μ αρεσε στο βιβλιο του King char ch , rank_ch , suit_ch σαν επιστρεφομενες τιμές απο την getchar() που έχει int return type οπως εχουμε πει. Τελοςπαντων... Κατά πάσα πιθανότητα στο context που το χρησιμοποιεί να μην υπάρχει κανένα πρόβλημα.
Star_Light Δημοσ. 18 Οκτωβρίου 2012 Δημοσ. 18 Οκτωβρίου 2012 Ναι αν θυμάμαι καλα ξέφευγε ενα παραπάνω κενό αναμεσα στις 2 λέξεις καλα και τωρα μπορει να ξεφεύγουν κάποια αλλα απο την αρχη ή το τελος αλλα δεν θα κατσω να το ψάξω άλλο... ελεος btw θα δω λιγο τον άλλο κωδικα του King... νομιζω αν βάλω την συνάρτηση tolower θα γλιτωσω και απο πολλα προσθετα cases που περιλαμβάνουν κεφαλαια... μπορω να δηλώσω τις μεταβλητες που σου ειπα πιο πάνω σαν int ετσι? αυτες που εχει σαν char ωστε να βάλω και ελεγχο για EOF μεσα. p.s Οντως υπάρχει θεμα οταν δοθουν κενά αλλα στην αρχη της πρότασης αλλα ΔΕΝ ΜΕ ΝΟΙΑΖΕΙ ΚΑΘΟΛΟΥ το αφηνω ετσι > Give a sentence: man man The reversal of: man man kostas@kostas-SSL:~/PROGRAMS$ ./word_reverse Give a sentence: man man The reversal of: man man kostas@kostas-SSL:~/PROGRAMS$
imitheos Δημοσ. 18 Οκτωβρίου 2012 Δημοσ. 18 Οκτωβρίου 2012 > for (i=0; i < MAXINPUT-1 && '\n' != (c = getchar()) && c != '.' && c != '?'; i++) Από τα προηγούμενα μηνύματα που το είδα πρώτη φορά ήθελα να το σχολιάσω αλλά είπα να περιμένω να λυθούν οι απορίες πρώτα. Το παραπάνω μόνο εγώ το βρίσκω άθλιο ? Γιατί να μην σπάσει σε πολλές δηλώσεις και να είναι απείρως πιο ευανάγνωστο ? Ακόμη και για τον π..τσο να είναι ο compiler και να μην παράξει τον ίδιο κώδικα, η διαφορά στη ταχύτητα θα είναι μηδαμινή. Insult to injury προσθέτει και η "ανάποδη" γραφή. Είναι γνωστό ότι δεν την πάω αλλά ειδικά σε μια τόσο μεγάλη δήλωση φαίνεται (σε μένα τουλάχιστον) τρομερά αφύσικη και δυσνόητη.
vinso Δημοσ. 18 Οκτωβρίου 2012 Δημοσ. 18 Οκτωβρίου 2012 Το while που είπα πρίν ήταν κάτι υποκειμενικό , αλλά καλά έκανες και το έβαλες.ΑΛΛΑ θα σου ξαναπώ (όπως πρίν με το FOR) , εδώ εχεις μεγαλύτερο πρόβλημα τώρα, 1ον δε χρείαζεται να βαλεις μέσα στη while ( && c != '.' && c != '?') επειδή μόλις βρείς ένα απο αυτά θα σταμματησει και εάν έχεις κι'άλλο κείμενο δε θα το διαβάσει , και 2ον τι δουλειά που κάνει το c != '.' c != '?' τη κάνει η συνάρτηση ispunct();. εκτός αν θέλει ο κώδικας να σταμματάει μόλις βρεί ερωτιματικό η τελεία και δεν το είδα κάπου.
migf1 Δημοσ. 18 Οκτωβρίου 2012 Δημοσ. 18 Οκτωβρίου 2012 Από τα προηγούμενα μηνύματα που το είδα πρώτη φορά ήθελα να το σχολιάσω αλλά είπα να περιμένω να λυθούν οι απορίες πρώτα. Το παραπάνω μόνο εγώ το βρίσκω άθλιο ? Γιατί να μην σπάσει σε πολλές δηλώσεις και να είναι απείρως πιο ευανάγνωστο ? Ακόμη και για τον π..τσο να είναι ο compiler και να μην παράξει τον ίδιο κώδικα, η διαφορά στη ταχύτητα θα είναι μηδαμινή. Insult to injury προσθέτει και η "ανάποδη" γραφή. Είναι γνωστό ότι δεν την πάω αλλά ειδικά σε μια τόσο μεγάλη δήλωση φαίνεται (σε μένα τουλάχιστον) τρομερά αφύσικη και δυσνόητη. Όλα είναι θέμα συνήθειας και χρήσης idioms. Το μόνο που με χαλάει εμένα είναι πως την έχω ασυνεπώς γραμμένη... θέλει με αναποδη γραφή και τις συγκρίσεις του c με τα ΄.΄ και ΄?΄. Το while που είπα πρίν ήταν κάτι υποκειμενικό , αλλά καλά έκανες και το έβαλες.ΑΛΛΑ θα σου ξαναπώ (όπως πρίν με το FOR) , εδώ εχεις μεγαλύτερο πρόβλημα τώρα, 1ον δε χρείαζεται να βαλεις μέσα στη while ( && c != '.' && c != '?') επειδή μόλις βρείς ένα απο αυτά θα σταμματησει και εάν έχεις κι'άλλο κείμενο δε θα το διαβάσει , και 2ον τι δουλειά που κάνει το c != '.' c != '?' τη κάνει η συνάρτηση ispunct();. εκτός αν θέλει ο κώδικας να σταμματάει μόλις βρεί ερωτιματικό η τελεία και δεν το είδα κάπου. Υποθέτω το πήρε από τον δικό μου αρχικό κώδικα, και δεν το ψαξε παραπάνω στην μετατροπή που έκανε
Star_Light Δημοσ. 18 Οκτωβρίου 2012 Δημοσ. 18 Οκτωβρίου 2012 Το άφησα ως έχει λογω εκφώνησης της άσκησης. (τοτε) Έμεινε αναλοίωτο και διαχρονικό..... αναμεσα στα chapters που ακολούθησαν
vinso Δημοσ. 18 Οκτωβρίου 2012 Δημοσ. 18 Οκτωβρίου 2012 Το ποιό απλό πράγμα είναι να βάλεις ενα EOF μέσα στη while ενώ διαβάζει και μετά μέσα σε μία if να ελέγχεις με ispunct() και να συμπληρώσεις το πίνακα. Σχετικα με το διάβασμα.
migf1 Δημοσ. 19 Οκτωβρίου 2012 Δημοσ. 19 Οκτωβρίου 2012 Γνωρίζει κανείς αν ο \t παράγει πάντα 8 χαρακτήρες στο stdout? Ορίζεται από το πρότυπο? Όπου το έχω δοκιμάσει παράγει 8 χαρακτήρες, αλλά είναι στάνταρ? Έχω μια συνάρτηση που μετράω το μήκος της μεγαλύτερης γραμμής μέσα σε οποιοδήποτε c-string, και χρειάζομαι να μετράει τα tabs expanded. Αν ισχύουν στάνταρ οι 8 χαρακτήρες να καταργήσω αν είναι το όρισμα tabSize... > /*********************************************************//** * @par Prototype: * int s_maxLineLen( const char *s, int tabSize ); * @brief Calc the length of the largest line inside a c-string. * @param[in] s The c-string to be examined. * @param[in] tabSize The # of chars a tab character accounts for. * @return The total count of characters in the largest line found inside \a s, * \b without counting the nul-terminating character. * On error, the function returns -1. * @note If \a tabSize is passed with a value less than 1, it defaults to 8. ************************************************************* */ int s_maxLineLen( const char *s, int tabSize ) { int i=0,j=0, maxLineLen = 0; if ( !s ) return -1; if ( !*s ) return 0; if ( tabSize < 1 ) tabSize = 8; // count len of largest line in s for (i=0,j=0; '\0' != s[i] && EOF != (int)(s[i]); i++) { if ( '\n' == s[i] ) { if ( j > maxLineLen ) maxLineLen = j; j = 0; continue; } j = ('\t' == s[i]) ? j+tabSize : j+1; } if ( j > maxLineLen ) maxLineLen = j; return maxLineLen; }
imitheos Δημοσ. 19 Οκτωβρίου 2012 Δημοσ. 19 Οκτωβρίου 2012 Γνωρίζει κανείς αν ο \t παράγει πάντα 8 χαρακτήρες στο stdout? Ορίζεται από το πρότυπο? Όπου το έχω δοκιμάσει παράγει 8 χαρακτήρες, αλλά είναι στάνταρ? > FILE *f; f = fopen("tmplalala", "w"); fputc('\t', f); fclose(fp); Με το παραπάνω μπορείς να δεις πως ο '\t' είναι ο TAB χαρακτήρας δηλαδή ο ASCII 9. Το πόσες spaces παράγονται εξαρτάται από τον terminal driver. Από τη μάνα τους σχεδόν όλοι οι οδηγοί δουλεύουν με 8άρι tabsize αλλά θα πρέπει να μιλήσεις με τον οδηγό για να το ξέρεις στα σίγουρα. Σε *nix μπορείς να μιλήσεις με termcap ή καλύτερα terminfo. Edit: Εφόσον θέλεις να ξέρεις το μέγεθος της "expanded" γραμμής, αρκεί να προσθέτεις το tabsize ? Δεν θα πρέπει στον κώδικα να λαμβάνεις υπόψη και την τιμή του j ?
migf1 Δημοσ. 19 Οκτωβρίου 2012 Δημοσ. 19 Οκτωβρίου 2012 Αυτό ήθελα να αποφύγω, thanks για την απάντηση. Προφανώς είναι ο tab χαρακτήρας o '\t', εξού και το tabSize. Δεν ξέρω αν η διατύπωση μου έδινε την εντύπωση ότι ρωτάω ποιος χαρακτήρας είναι ο '\t', αλλά δεν ήταν αυτή η πρόθεσή μου.
Προτεινόμενες αναρτήσεις