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

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

Δημοσ.

Τι ακριβως θες να σου πω? να δωσω σχολια με τον κωδικα επειδη δεν τον θυμάσαι?

Ο κώδικας δεχοταν μια προταση και έκανε αντιστροφη των λεξεων της. Αλλα ετσι οπως ηταν φτιαγμενος

δεχοταν και χαρακτηρες οι οποιοι ήταν σημεια στίξης πχ ο ^ και τους εκτυπωνε και αυτους.

 

Πχ αν έδινες hello man^^^ θα σου έδινε man^^^ hello τα ^^^ δεν τα ηθελα και ειπα να κανω κάποιες διορθώσεις.

ΟΙ διορθώσεις αυτες βρισκονται στις γραμμές 27 - 33 . Κατα ποσο θεωρείται εντάξει να μειώνεις τον μετρητη μέσα στο loop? Οπως κανω εγω και μετα να αυξάνεται παλι.

 

Μας αναφέρεις τις γραμμές που έχεις διορθώσει από τον αρχικό κώδικα χωρίς να μας δίνεις ούτε καν link προς τον αρχικό κώδικα (κανονικά θα περίμενα να τον παράθετες μέσα στο ίδιο ποστ). Οπότε δεν μπορούμε να αξιολογήσουμε τις όποιες διορθώσεις στις οποίες αναφέρεσαι.

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

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

Δημοσ.

Αν δεν έχεις πρόβλημα με το for τότε το πρόγραμμα σου είναι οκ αφού κάθε φορά που αφαιρείς --i στην if μετά ξαναμπαίνει στη for και αυξάνει πάλι το i επομένως μένει στην ίδια τιμή(θέση) που θές . Αλλά προσωπικά θεωρώ είναι καλύτερα με while επειδή αυξάνεις όποτε χρειαστείς το i.Δεν το αυξάνεις και μετά το ξανααφαιρείς και τούμπαλιν. Αποφεύγεις τις πολλές πράξεις.

 

και για την inspunct έχεις δίκιο == 0 ήθελε στο if.

Δημοσ.

Αν δεν έχεις πρόβλημα με το for τότε το πρόγραμμα σου είναι οκ αφού κάθε φορά που αφαιρείς --i στην if μετά ξαναμπαίνει στη for και αυξάνει πάλι το i επομένως μένει στην ίδια τιμή(θέση) που θές . Αλλά προσωπικά θεωρώ είναι καλύτερα με while επειδή αυξάνεις όποτε χρειαστείς το i.Δεν το αυξάνεις και μετά το ξανααφαιρείς και τούμπαλιν. Αποφεύγεις τις πολλές πράξεις.

 

και για την inspunct έχεις δίκιο == 0 ήθελε στο if.

 

Ναι έχεις δικιο σε αυτο. Παρολο που το for το είχα δοκιμάσει και έπαιζε κανονικα αλλα δεν μ αρεσε γιατι ειναι πολυπλοκο ενω αυτο που προτεινες ειναι απλο στην προσεγγιση οποτε το επιλεγουμε τελος... αλλα εχω την εντυπωση οτι παιζει και spaghetti σε αυτον που εβαλα πρωτα - πρωτα εχεις διαβάσει καθολου σχετικα με αυτο?

 

@migf1 παρεθεσα τον κώδικα και ειπα... ΜΟΝΟ οι ταδε γραμμές εχουν αλλαχθει. Επομενως ειναι αυτουσιος εκτος απο τις άλλες.... σε ρωτησα αν θες και σχολια να τον θυμηθεις.

 

P.S Επισης καλο ειναι να μην κολλαμε και στην for να εναλλασουμε με while για να μην ξεχναμε και αυτο το loop κτλπ... ποικιλια :P

Δημοσ.

Έχεις πρόχειρο τον αρχικό κώδικα, να τον αντιπαραβάλουμε;

 

>

#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 οπως εχουμε πει. Τελοςπαντων...

Δημοσ.

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 που το χρησιμοποιεί να μην υπάρχει κανένα πρόβλημα.

Δημοσ.

Ναι αν θυμάμαι καλα ξέφευγε ενα παραπάνω κενό αναμεσα στις 2 λέξεις

καλα και τωρα μπορει να ξεφεύγουν κάποια αλλα απο την αρχη ή το τελος αλλα δεν θα κατσω να το ψάξω άλλο... ελεος :P

 

btw θα δω λιγο τον άλλο κωδικα του King... νομιζω αν βάλω την συνάρτηση tolower θα γλιτωσω και απο πολλα

προσθετα cases που περιλαμβάνουν κεφαλαια... μπορω να δηλώσω τις μεταβλητες που σου ειπα πιο πάνω σαν int ετσι? αυτες που εχει σαν char ωστε να βάλω και ελεγχο για EOF μεσα.

 

p.s Οντως υπάρχει θεμα οταν δοθουν κενά αλλα στην αρχη της πρότασης αλλα ΔΕΝ ΜΕ ΝΟΙΑΖΕΙ ΚΑΘΟΛΟΥ :P

το αφηνω ετσι

 

>

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$

Δημοσ.

>
for (i=0; i < MAXINPUT-1 && '\n' != (c = getchar()) && c != '.' && c != '?'; i++)

 

Από τα προηγούμενα μηνύματα που το είδα πρώτη φορά ήθελα να το σχολιάσω αλλά είπα να περιμένω να λυθούν οι απορίες πρώτα.

 

Το παραπάνω μόνο εγώ το βρίσκω άθλιο ? Γιατί να μην σπάσει σε πολλές δηλώσεις και να είναι απείρως πιο ευανάγνωστο ? Ακόμη και για τον π..τσο να είναι ο compiler και να μην παράξει τον ίδιο κώδικα, η διαφορά στη ταχύτητα θα είναι μηδαμινή.

 

Insult to injury προσθέτει και η "ανάποδη" γραφή. Είναι γνωστό ότι δεν την πάω αλλά ειδικά σε μια τόσο μεγάλη δήλωση φαίνεται (σε μένα τουλάχιστον) τρομερά αφύσικη και δυσνόητη.

Δημοσ.

Το while που είπα πρίν ήταν κάτι υποκειμενικό , αλλά καλά έκανες και το έβαλες.ΑΛΛΑ θα σου ξαναπώ (όπως πρίν με το FOR) , εδώ εχεις μεγαλύτερο πρόβλημα τώρα, 1ον δε χρείαζεται να βαλεις μέσα στη while ( && c != '.' && c != '?') επειδή μόλις βρείς ένα απο αυτά θα σταμματησει και εάν έχεις κι'άλλο κείμενο δε θα το διαβάσει , και 2ον τι δουλειά που κάνει το c != '.' c != '?' τη κάνει η συνάρτηση ispunct();.

 

εκτός αν θέλει ο κώδικας να σταμματάει μόλις βρεί ερωτιματικό η τελεία και δεν το είδα κάπου.

Δημοσ.

 

 

Από τα προηγούμενα μηνύματα που το είδα πρώτη φορά ήθελα να το σχολιάσω αλλά είπα να περιμένω να λυθούν οι απορίες πρώτα.

 

Το παραπάνω μόνο εγώ το βρίσκω άθλιο ? Γιατί να μην σπάσει σε πολλές δηλώσεις και να είναι απείρως πιο ευανάγνωστο ? Ακόμη και για τον π..τσο να είναι ο compiler και να μην παράξει τον ίδιο κώδικα, η διαφορά στη ταχύτητα θα είναι μηδαμινή.

 

Insult to injury προσθέτει και η "ανάποδη" γραφή. Είναι γνωστό ότι δεν την πάω αλλά ειδικά σε μια τόσο μεγάλη δήλωση φαίνεται (σε μένα τουλάχιστον) τρομερά αφύσικη και δυσνόητη.

 

Όλα είναι θέμα συνήθειας και χρήσης idioms. Το μόνο που με χαλάει εμένα είναι πως την έχω ασυνεπώς γραμμένη... θέλει με αναποδη γραφή και τις συγκρίσεις του c με τα ΄.΄ και ΄?΄.

 

 

Το while που είπα πρίν ήταν κάτι υποκειμενικό , αλλά καλά έκανες και το έβαλες.ΑΛΛΑ θα σου ξαναπώ (όπως πρίν με το FOR) , εδώ εχεις μεγαλύτερο πρόβλημα τώρα, 1ον δε χρείαζεται να βαλεις μέσα στη while ( && c != '.' && c != '?') επειδή μόλις βρείς ένα απο αυτά θα σταμματησει και εάν έχεις κι'άλλο κείμενο δε θα το διαβάσει , και 2ον τι δουλειά που κάνει το c != '.' c != '?' τη κάνει η συνάρτηση ispunct();.

 

εκτός αν θέλει ο κώδικας να σταμματάει μόλις βρεί ερωτιματικό η τελεία και δεν το είδα κάπου.

 

Υποθέτω το πήρε από τον δικό μου αρχικό κώδικα, και δεν το ψαξε παραπάνω στην μετατροπή που έκανε ;)

Δημοσ.

Το άφησα ως έχει λογω εκφώνησης της άσκησης. (τοτε)

 

Έμεινε αναλοίωτο και διαχρονικό..... αναμεσα στα chapters που ακολούθησαν :P

Δημοσ.

Το ποιό απλό πράγμα είναι να βάλεις ενα EOF μέσα στη while ενώ διαβάζει και μετά μέσα σε μία if να ελέγχεις με ispunct() και να συμπληρώσεις το πίνακα. Σχετικα με το διάβασμα.

Δημοσ.

Γνωρίζει κανείς αν ο \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;
}

 

 

Δημοσ.

Γνωρίζει κανείς αν ο \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 ?

Δημοσ.

Αυτό ήθελα να αποφύγω, thanks για την απάντηση.

 

 

 

Προφανώς είναι ο tab χαρακτήρας o '\t', εξού και το tabSize. Δεν ξέρω αν η διατύπωση μου έδινε την εντύπωση ότι ρωτάω ποιος χαρακτήρας είναι ο '\t', αλλά δεν ήταν αυτή η πρόθεσή μου.

 

 

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

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