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

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

Δημοσ.

Σκέψου τι γίνεται όταν str[i+j] != mo[k][j] ...

Θα πρέπει να μηδενίζεις το pl και να αυξάνεται το k (να κοιτάζει τον επόμενο αριθμό...)

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

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

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

Δημοσ.

Σκέψου τι γίνεται όταν str[i+j] != mo[k][j] ...

Θα πρέπει να μηδενίζεις το pl και να αυξάνεται το k (να κοιτάζει τον επόμενο αριθμό...)

 

ναι εχεις δικιο το ειχα παραβλεψει τελειως αυτο..τωρα μηδενιζω το πληθος και κανω break ωστε να βγαινει απο τον βρογχο του j και να πηγαινει σε νεο k..(η τουλαχιστον αυτο θα ηθελα :P) Tωρα δινω σε morse πχ: ---..----- και μου εμφανιζει μονο τον πρωτο πχ: 8

 

for(i=0;i<meg;i+=5){

 for(k=0;k<10;k++){
  for(j=0;j<5;j++){
   if(str[j+i]==mo[k][j]){
    pl=pl+1;
   }else{
    pl=0;
    break;}
if(pl%5==0) printf("%d",k);
  }
 }
}

Σορρυ αν εχω γινει κουραστικος αλλα την προσπαθω ακομα..

Δημοσ.

Θεωρητικα το :

int x = ch - '0' ;
δεν ειναι  σωστο συμφωνα με το προτυπο? γιατι ?

 

 

 

 

Το έψαξα και τελικά είναι και θεωρητικά σωστό -- αλλά (θεωρητικά) ισχύει μόνο για τα αριθμητικά ψηφία.

 

Both the basic source and basic execution character sets shall have the following members:

 

the 26 uppercase letters of the Latin alphabet [τα αναφέρει ένα προς ένα με τη σειρά]

the 26 lowercase letters of the Latin alphabet [τα αναφέρει ένα προς ένα με τη σειρά]

the 10 decimal digits [τα αναφέρει ένα προς ένα με τη σειρά]

the following 29 graphic characters [έχει ένα πίνακα με σύμβολα]

the space character, and control characters representing horizontal tab, vertical tab, and form feed.

 

The representation of each member of the source and execution basic character sets shall fit in a byte. In both the source and execution basic character sets, the value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous.

 

Επομένως οποιοσδήποτε conformant compiler θα πρέπει να πει ότι '1' - '0' == 1, αλλά όχι απαραίτητα ότι 'b' - 'a' == 1.

Δημοσ.

 

ναι εχεις δικιο το ειχα παραβλεψει τελειως αυτο..τωρα μηδενιζω το πληθος και κανω break ωστε να βγαινει απο τον βρογχο του j και να πηγαινει σε νεο k..(η τουλαχιστον αυτο θα ηθελα :P) Tωρα δινω σε morse πχ: ---..----- και μου εμφανιζει μονο τον πρωτο πχ: 8

 

for(i=0;i<meg;i+=5){

 for(k=0;k<10;k++){

  for(j=0;j<5;j++){

   if(str[j+i]==mo[k][j]){

    pl=pl+1;

   }else{

    pl=0;

    break;}

if(pl%5==0) printf("%d",k);

  }

 }

}

 

Σορρυ αν εχω γινει κουραστικος αλλα την προσπαθω ακομα..

 

Για δοκίμασε λίγο ανάποδα, δηλαδή:

 

for ( i =0; i < meg; i +=5 )
	for ( k = 0; k < 10; k++ )	
		for ( j = 0; j < 5; j++)
                 {
			if ( str[i+j] != mo[k][j])
				break;
			if( j == 4 ) printf("%d",k);
		 }
	
Edit: Αν και σε μένα, με τον κώδικά σου, τα δείχνει όλα τα νούμερα...

Αν θέλεις βάλε όλον τον κώδικα μήπως κάτι ξεφεύγει... (δες μήπως δε μηδενίζεις το pl πριν)

Δημοσ.

 

 

Για δοκίμασε λίγο ανάποδα, δηλαδή:

 

for ( i =0; i < meg; i +=5 )
	for ( k = 0; k < 10; k++ )	
		for ( j = 0; j < 5; j++)
                 {
			if ( str[i+j] != mo[k][j])
				break;
			if( j == 4 ) printf("%d",k);
		 }
	
Edit: Αν και σε μένα, με τον κώδικά σου, τα δείχνει όλα τα νούμερα...

Αν θέλεις βάλε όλον τον κώδικα μήπως κάτι ξεφεύγει... (δες μήπως δε μηδενίζεις το pl πριν)

και παλι μονο τον πρωτο μου εμφανιζει..οριστε και ο κωδικας μου:

 

 

 

 

#include<stdio.h>
#include<string.h>
main()
{
int j,k,c,ar,ar2,i,meg;
char ch,mo[10][6]= {
"-----",
".----",
"..---",
"...--",
"....-",
".....",
"-....",
"--...",
"---..",
"----." };
 
printf("Pathste 1 gia artithmo se kwdika Morse\nPathste 2 gia kwdika Morse se arithmo\nPathste 0 gia eksodo");
scanf("%d",&ar);
 
if(ar==1){
printf("Dwste megethos arithmou pou thelete na dwsete: ");
scanf("%d",&meg);
while ( (c=getchar()) != '\n' && c!=EOF);
 
char str[meg];
 
printf("Dwste arithmo gia metatroph se kwdika Morse: ");
gets(str);
for(i=0; i<meg; i++)printf("%s ", mo[str-'0']);
}
 
if(ar==2){
printf("Dwste megethos stoixeiwn kwdika morse pou thelete na dwsete: ");
scanf("%d",&meg);
 
char str[meg];
 
printf("Dwste kwdika Morse gia metatroph se arithmo");
while ( (c=getchar()) != '\n' && c!=EOF);
 
gets(str);
 
int pl=0;
 
for(i=0;i<meg;i+=5){
 for(k=0;k<10;k++){
  for(j=0;j<5;j++){
   if ( str[i+j] != mo[k][j])
    break;
   if( j == 4 ) printf("%d",k);
  }
 }
}
}
if(ar==0) printf("eksodos");
}
 
Δημοσ.

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

 

Δεν σου δίνω επίτηδες διορθωμένο τον δικό σου κώδικα, για να σε βγάλω από το "comfort zone" σου, θεωρώντας πως έτσι (εφόσον σε ενδιαφέρει) θα σου είναι πολύ πιο εποικοδομητικό ;)

 

Σημείωσε όμως πως δεν του έχω κάνει εξαντλητικές δοκιμές, οπότε ενδέχεται να έχει κάνα bug...

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZ_INPUT		(255+1)	/* dual purpose: user input + result */
#define SIZ_MORSECODE		(5+1)	/* size of any morse code in bytes (+1 for NUL) */
#define N_MORSECODES		10	/* # of known morse codes */

/* ----------------------------------------------------
 * Read a c-string from stdin, flushing any extra characters.
 */
char *s_getsflushed( char *s, size_t ssize )
{
	register int c;
	register size_t i;

	/* sanity checks */
	if ( !s ) {
		return NULL;
	}
	if ( ssize < 1 ) {
		return s;
	}

	/* read chars from stdin */
	for (i=0; i < ssize-1 && '\n' != (c=getchar()) && EOF != c; i++)
		s[i] = c;

	if ( s[i] && s[i] != '\n' ) {		/* ssize reached without '\n' ? */
		while ( getchar() != '\n' )	/* flush any remaining chars */
			/* void */ ;
	}
	s[i] = '\0';				/* nul-terminate s */

	return s;
}

/* ----------------------------------------------------
 * Given an array charArr[] of arbitrary count of characters, compare its first
 * SIZ_MORSECODE-1 characters against every member in the array of fixed-size
 * cstrings morse[N_MORSECODES][SIZ_MORSECODE]. Return the slot in morse where
 * the first match occurred, or -1 on no match.
 */
int morse_lookup( char morse[N_MORSECODES][SIZ_MORSECODE], const char charArr[] )
{
	int i = 0;

	/* sanity checks */
	if ( !morse || !charArr ) {
		fputs( "*** internal error: invalid pointer\n", stderr );
		return -1;
	}

	for (i=0; i < N_MORSECODES; i++)
		if ( 0 == memcmp(morse[i], charArr, SIZ_MORSECODE-1) )
			return i;

	return -1;
}

/* -------------------------------------- */
int main( void )
{
	int  i = 0, digit = -1;
	char *cp = NULL, *cpStop = NULL;
	char input[MAXSIZ_INPUT] = {'\0'};
	char morse[N_MORSECODES][SIZ_MORSECODE]= {
		"-----",
		".----",
		"..---",
		"...--",
		"....-",
		".....",
		"-....",
		"--...",
		"---..",
		"----."
	};

	printf( "Enter morse code (up to %d characters): ", MAXSIZ_INPUT-1);
	s_getsflushed(input, MAXSIZ_INPUT);

	/*
	 * scan input by groups of SIZ_MORSECODE-1 bytes,
	 * and store the digit that corresponds to each group
	 * back to input (break the loop if a group is not a
	 * valid morse code)
	 */
	cpStop = input + strlen(input);
	for (cp=input, i=0; cp < cpStop; i++, cp += SIZ_MORSECODE-1)
	{
		digit = morse_lookup(morse, cp);
		if ( -1 == digit ) {
			break;
		}
		input[i] = '0' + digit;
	}

	if ( -1 == digit )
		puts( "invalid morse code" );
	else {
		input[i] = '\0';		/* NUL terminate result */
		puts( input );
	}

	system( "pause" );			/* Windows only */
	return 0;
}

 

Δημοσ.

 

Το έψαξα και τελικά είναι και θεωρητικά σωστό -- αλλά (θεωρητικά) ισχύει μόνο για τα αριθμητικά ψηφία.

 

Επομένως οποιοσδήποτε conformant compiler θα πρέπει να πει ότι '1' - '0' == 1, αλλά όχι απαραίτητα ότι 'b' - 'a' == 1.

 

Nαι το ξερω για τους χαρακτηρες οτι ειναι γενικα λαθος να τους χρησιμοποιει καποιος σαν αριθμους μιας και δεν ειναι

σιγουρο οτι θα έχουν συνεχομενους κωδικους οπως στο ASCII. Άλλωστε καθε μηχανημα μπορει να εχει διαφορετικο σετ χαρακτηρων.

Δημοσ.

 

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

 

Δεν σου δίνω επίτηδες διορθωμένο τον δικό σου κώδικα, για να σε βγάλω από το "comfort zone" σου, θεωρώντας πως έτσι (εφόσον σε ενδιαφέρει) θα σου είναι πολύ πιο εποικοδομητικό ;)

 

Σημείωσε όμως πως δεν του έχω κάνει εξαντλητικές δοκιμές, οπότε ενδέχεται να έχει κάνα bug...

 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZ_INPUT		(255+1)	/* dual purpose: user input + result */
#define SIZ_MORSECODE		(5+1)	/* size of any morse code in bytes (+1 for NUL) */
#define N_MORSECODES		10	/* # of known morse codes */

/* ----------------------------------------------------
 * Read a c-string from stdin, flushing any extra characters.
 */
char *s_getsflushed( char *s, size_t ssize )
{
	register int c;
	register size_t i;

	/* sanity checks */
	if ( !s ) {
		return NULL;
	}
	if ( ssize < 1 ) {
		return s;
	}

	/* read chars from stdin */
	for (i=0; i < ssize-1 && '\n' != (c=getchar()) && EOF != c; i++)
		s[i] = c;

	if ( s[i] && s[i] != '\n' ) {		/* ssize reached without '\n' ? */
		while ( getchar() != '\n' )	/* flush any remaining chars */
			/* void */ ;
	}
	s[i] = '\0';				/* nul-terminate s */

	return s;
}

/* ----------------------------------------------------
 * Given an array charArr[] of arbitrary count of characters, compare its first
 * SIZ_MORSECODE-1 characters against every member in the array of fixed-size
 * cstrings morse[N_MORSECODES][SIZ_MORSECODE]. Return the slot in morse where
 * the first match occurred, or -1 on no match.
 */
int morse_lookup( char morse[N_MORSECODES][SIZ_MORSECODE], const char charArr[] )
{
	int i = 0;

	/* sanity checks */
	if ( !morse || !charArr ) {
		fputs( "*** internal error: invalid pointer\n", stderr );
		return -1;
	}

	for (i=0; i < N_MORSECODES; i++)
		if ( 0 == memcmp(morse[i], charArr, SIZ_MORSECODE-1) )
			return i;

	return -1;
}

/* -------------------------------------- */
int main( void )
{
	int  i = 0, digit = -1;
	char *cp = NULL, *cpStop = NULL;
	char input[MAXSIZ_INPUT] = {'\0'};
	char morse[N_MORSECODES][SIZ_MORSECODE]= {
		"-----",
		".----",
		"..---",
		"...--",
		"....-",
		".....",
		"-....",
		"--...",
		"---..",
		"----."
	};

	printf( "Enter morse code (up to %d characters): ", MAXSIZ_INPUT-1);
	s_getsflushed(input, MAXSIZ_INPUT);

	/*
	 * scan input by groups of SIZ_MORSECODE-1 bytes,
	 * and store the digit that corresponds to each group
	 * back to input (break the loop if a group is not a
	 * valid morse code)
	 */
	cpStop = input + strlen(input);
	for (cp=input, i=0; cp < cpStop; i++, cp += SIZ_MORSECODE-1)
	{
		digit = morse_lookup(morse, cp);
		if ( -1 == digit ) {
			break;
		}
		input[i] = '0' + digit;
	}

	if ( -1 == digit )
		puts( "invalid morse code" );
	else {
		input[i] = '\0';		/* NUL terminate result */
		puts( input );
	}

	system( "pause" );			/* Windows only */
	return 0;
}

 

ευχαριστω για τον ετοιμο κωδικα,αλλα δεν κατεχω ακομα τις γνωσεις για να μπορω να τον παρουσιασω! παρολ αυτα στο τελευταιο μου post θεωρω πως ο κωδικας μου δεν εχει λαθη..ομως μου εμφανιζει μονο τον πρωτο αριθμο οπως εχω αναφερει και πιο πανω.. ενω στον χρηστη  'bird' του τρεχει κανονικα..  thanks παντως

Δημοσ.

και παλι μονο τον πρωτο μου εμφανιζει..οριστε και ο κωδικας μου:

τον έκανα copy-paste και compile και μου τρεχει κανονικά!!!

Μήπως όταν το τρέχεις και σου ζητάει "μέγεθος στοιχείων κώδικα morse:" βάζεις λάθος νούμερο;

 

Αν για παράδειγμα θέλεις να σου μεταφράσει το ---..--... εκει θα πρέπει να του πεις 10 (2 αριθμοι * 5 στοιχεια ο κάθε αριθμός)

(μήπως βάζεις ας πούμε 2 οπότε όντως σου βγάζει μόνο το 8 αντι για 87)

Δημοσ.

τον έκανα copy-paste και compile και μου τρεχει κανονικά!!!

Μήπως όταν το τρέχεις και σου ζητάει "μέγεθος στοιχείων κώδικα morse:" βάζεις λάθος νούμερο;

 

Αν για παράδειγμα θέλεις να σου μεταφράσει το ---..--... εκει θα πρέπει να του πεις 10 (2 αριθμοι * 5 στοιχεια ο κάθε αριθμός)

(μήπως βάζεις ας πούμε 2 οπότε όντως σου βγάζει μόνο το 8 αντι για 87)

εγω εβαζα 2 με την εννοια οτι ειναι 2 αριθμοι...ποπο τσαμπα κοπος τοση ωρα..να σαι καλα!

Δημοσ.

εγω εβαζα 2 με την εννοια οτι ειναι 2 αριθμοι...ποπο τσαμπα κοπος τοση ωρα..να σαι καλα!

 

Αν θες να το κάνεις έτσι απλά μετά που θα διαβάσεις το meg κάνε ένα meg *= 5; (πρίν τη δήλωση του char str[meg];)

Δημοσ.

Αν θες να το κάνεις έτσι απλά μετά που θα διαβάσεις το meg κάνε ένα meg *= 5; (πρίν τη δήλωση του char str[meg] ;)

το εκανα ηδη,απλα τοοοση ωρα εδινα τετοιους αριθμους απο συνηθεια..ξεχαστηκα τελειως..ευχαριστω!  :-D

Δημοσ.

 

ευχαριστω για τον ετοιμο κωδικα,αλλα δεν κατεχω ακομα τις γνωσεις για να μπορω να τον παρουσιασω! παρολ αυτα στο τελευταιο μου post θεωρω πως ο κωδικας μου δεν εχει λαθη..ομως μου εμφανιζει μονο τον πρωτο αριθμο οπως εχω αναφερει και πιο πανω.. ενω στον χρηστη  'bird' του τρεχει κανονικα..  thanks παντως

Παρακαλώ, αλλά τον κώδικα δεν στον έδωσα για να τον παρουσιάσεις για δικό σου. Στον έδωσα για να τον συγκρίνεις με τον δικό σου, και να διορθώσεις τον δικό σου.

 

Ο κώδικάς σου έχει σίγουρα λάθη διαχείρισης του λεγόμενου bad input, όπως διαπίστωσες "the hard-way" μετά την τελευταία παρατήρηση του bird. Η χρήση της gets() είναι εξορισμού πρόβλημά σε οποιονδήποτε κώδικα, για αυτό και καταργήθηκε από την γλώσσα στην αναθεώρηση C11, ενώ ήταν ήδη χαρακτηρισμένη ως "depreciated" (δηλαδή "προς κατάργηση") από την αναθεώρηση C99 (εδώ και 2 δεκαετίες δηλαδή).

 

Η χρήση της fgets() (ακολουθούμενη ή όχι από την sscanf(), ανάλογα το αναμενόμενο input) είναι η συνηθέστερη αντικατάσταση της gets(). Στον κώδικα που σου έδωσα, σου έχω γράψει την s_getsflushed() ως ασφαλή αντικατάσταση της gets(), και προφανώς μπορείς να την χρησιμοποιείς σε οποιοδήποτε πρόγραμμά σου (αν κι εφόσον εμπίπτει στην ύλη σας, αλλιώς fgets() με ή χωρίς sscanf()... ποτέ gets() ).

 

Ένα άλλο πρόβλημα στον κώδικά σου είναι πως ζητάς από τον χρήστη να ορίσει το μέγιστο μήκος του input που θα σου δώσει, το οποίο θεωρείται και είναι κακή πρακτική (bad practice). Σε συνδυασμό μάλιστα με την χρήση της gets() σου είναι αδύνατον να αντιδράσεις προγραμματιστικά στην περίπτωση που σου δώσει για input περισσότερους χαρακτήρες από ότι σου όρισε. Στην καλύτερη περίπτωση θα παραχθεί segmentation fault, και στην χειρότερη το πρόγραμμά σου θα χακαριστεί σε χρόνο ντε-τε, από όποιον το θελήσει.

 

Η καλή πρακτική είναι να ορίζεις εσύ μέσα στο πρόγραμμά σου το μέγιστο πλήθος χαρακτήρων που αναμένεις ως input, κι αν σου δώσει ο χρήστης παραπάνω να μην σκάει το πρόγραμμά σου (ιδανικά πρέπει να ειδοποιεί τον χρήστη ή μπορεί απλώς να κρατάει μόνο τους μέγιστους αναμενόμενους χαρακτήρες σιωπηλά και να συνεχίζει). Αυτό ακριβώς κάνει ο κώδικας που σου έδωσα, ορίζοντας ως μέγιστο αναμενόμενο πλήθος χαρακτήρων στην είσοδο τους (255+1) και χρησιμοποιώντας κατόπιν την s_getsflushed() για την ανάγνωση.

 

Αν ο κώδικας της s_getsflushed() είναι εκτός ύλης, τότε πρέπει να χρησιμοποιήσεις την fgets(). Είτε η μια είτε η άλλη παίρνουν ως όρισμα το αναμενόμενο μέγιστο πλήθος χαρακτήρων εισόδου, οπότε σε προστατεύουν από σκασίματα του προγράμματός σου. Επίσης, σε απελευθερώνουν από το να χρησιμοποιείς VLA για τον ορισμό του input, το οποίο πλέον δεν χρειάζεται να οριστεί δυναμικά.

 

Τέλος, σε ότι αφορά την ύλη που έχετε καλύψει, μια τέτοια άσκηση προϋποθέτει πως κατ' ελάχιστον έχετε καλύψει πίνακες χαρακτήρων, c-strings και ρουτίνες διαχείρισης των c-strings (είτε πρόκειται για το input/output τους, είτε για την διαχείρισή τους). Κανονικά θα έπρεπε να έχετε καλύψει και δείκτες, τουλάχιστον δείκτες χαρακτήρων και τη χρησιμότητά τους στη διαχείριση των c-strings, αλλά ξέρω πως δεν είναι καθόλου απίθανο να μην σας τους έχουν διδάξει ακόμα.

 

Με αυτά τα δεδομένα στο μυαλό μου,συν ότι έχετε μάθει και συναρτήσεις, σου έδωσα τον παραπάνω κώδικα ;)

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

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

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

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

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

Σύνδεση

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

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

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