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

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

Δημοσ.

Καλησπερα,αντιμετωπιζω προβλημα με το παρακατω κομματι κωδικα που αφορα την μετατροπη ενος τυχαιου αριθμου σε κωδικα Morse αφου ο,τι αριθμο και να βαλλω η εξοδος ειναι παντα '-----' .

 

 

#include<stdio.h>
#include<string.h>
main()
{
int ar,ar2,i,meg;
char ch,mo[10][5]= {
"-----",
".----",
"..---",
"...--",
"....-",
".....",
"-....",
"--...",
"---..",
"----." };
 
printf("Pathste 1 gia artithmo se kwdika Morse\nPieste 2 gia kwdika Morse se arithmo\n0 gia eksodo");
scanf("%d",&ar);
 
if(ar==1){
printf("Dwste megethos arithmou pou thelete na dwsete: ");
scanf("%d",&meg);
 
char str[meg];
 
printf("Dwste arithmo gia metatroph se kwdika Morse: ");
gets(str);
 
for(i=0; i<meg; i++){
 
switch(str){
 
case 0:
 for(i=0; i<5; i++) printf("%c",mo[0]);
 break;
.
.
.

case 9:
 for(i=0; i<5; i++) printf("%c",mo[9]);
 break;
}
}
}
}

Ευχαριστω εκ των προτερων
  • Απαντ. 36
  • Δημ.
  • Τελ. απάντηση

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

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

Δημοσ.

Δοκίμασε το

switch(str[i]) να γίνει  switch(str[i]-'0')

το str είναι char οπότε μπορεί να κολλάει εκεί...

Δημοσ.

Δοκίμασε το

switch(str[i]) να γίνει  switch(str[i]-'0')

το str είναι char οπότε μπορεί να κολλάει εκεί..

Συγγνωμη στο πρωτο μου post ειπα πως ο,τι αριθμο και να βαλλω μου βγαζει '-----'. Το διορθωνω, δεν μου επιτρεπει καν να διαβασω αριθμο,απλα μου βγαζει '----'. Kανοντας την αλλαγη που μου ειπες μου βγαζει :

 

Pathste 1 gia artithmo se kwdika Morse

Pieste 2 gia kwdika Morse se arithmo
0 gia eksodo1:1
Dwste megethos arithmou pou thelete na dwsete: 2
Dwste arithmo gia metatroph se kwdika Morse:

Δηλαδη τωρα δεν μου βγαζει το'----' ,μου βγαζει απλως το τελευταιο μνμ χωρις παλι να διαβαζω

 

Δημοσ.

Βάλε κάτω από τη scanf το παρακάτω (όπου το c θα το δηλωσεις στην αρχή σαν int)

while ( (c=getchar()) != '\n' && c!=EOF);

(Μένει το '\n' από την scanf και το διαβάζει παρακάτω η gets() )

Δημοσ.

τωρα μπορω και διαβαζω αριθμο αλλα μ εμφανιζει τον κωδικα morse μονο του πρωτου στοιχειου απ τον αριθμο που δινω(πχ: 123,μου εμφανιζει τον Morse του 1). Ευχαριστω πολυ παντως!

Δημοσ.

Γιατί δεν απλοποιείς λίγο τον κώδικά σου;

 

Ας πούμε αυτό:

 

 

switch(str[i]){


case 0:
 for(i=0; i<5; i++) printf("%c",mo[0][i]);
 break;
.
.
.
case 9:
 for(i=0; i<5; i++) printf("%c",mo[9][i]);
 break;
}

 

Γιατί δεν το γράφεις απλά

 

 

printf("%s", mo[str[i] - '0']);


Ενδεχομένως με ένα if που να ελέγει ότι str είναι >= '0' και <= '9'?

Δημοσ.

Γιατί δεν το γράφεις απλά

 

 

printf("%s", mo[str[i] - '0']);

 

Ενδεχομένως με ένα if που να ελέγει ότι str είναι >= '0' και <= '9'?

Επειδή πήγα να το προτείνω κι εγώ αυτό, θα πρέπει να αλλάξει και τον πίνακα mo σε:

char ch,mo[10][6]= {
"-----\0",
".----\0",
"..---\0",
"...--\0",
"....-\0",
".....\0",
"-....\0",
"--...\0",
"---..\0",
"----.\0" };

γιατί, τουλάχιστον σε εμένα στο Dev-C++, αν δεν βάλεις τα '\0', εκτυπώνει όλον τον πίνακα...

Δημοσ.

Γιατί δεν απλοποιείς λίγο τον κώδικά σου;

 

Ας πούμε αυτό:

 

 

switch(str[i]){


case 0:
 for(i=0; i<5; i++) printf("%c",mo[0][i]);
 break;
.
.
.
case 9:
 for(i=0; i<5; i++) printf("%c",mo[9][i]);
 break;
}

 

Γιατί δεν το γράφεις απλά

 

 

printf("%s", mo[str[i]

 

Επειδή πήγα να το προτείνω κι εγώ αυτό, θα πρέπει να αλλάξει και τον πίνακα mo σε:

char ch,mo[10][6]= {
"-----\0",
".----\0",
"..---\0",
"...--\0",
"....-\0",
".....\0",
"-....\0",
"--...\0",
"---..\0",
"----.\0" };

γιατί, τουλάχιστον σε εμένα στο Dev-C++, αν δεν βάλεις τα '\0', εκτυπώνει όλον τον πίνακα...

 

]);

 

Ενδεχομένως με ένα if που να ελέγει ότι str είναι >= '0' και <= '9'?

 

και σε εμενα το ιδιο,εκτυπωνει ολον τον πινακα..με προλαβες!

ευχαριστω,ειναι πολυ πιο απλο ετσι

 

τρεχει το πργραμμα,σας ευχαριστω! μια διευκρυνηση μονο, το - '0' που χρησιμευει?

Δημοσ.

τρεχει το πργραμμα,σας ευχαριστω! μια διευκρυνηση μονο, το - '0' που χρησιμευει?

Στον πίνακα αποθηκεύονται οι χαρακτήρες '0', '1', '2', κτλ... οι οποίοι αντιστοιχούν σε κάποιυς συνεχόμενους integers στο ASCII.

Για παράδειγμα 48,49,50, κτλ... οπότε αν αφαιρέσεις από έναν χαρακτήρα το '0' έχουμε για παράδειγμα '2'-'0' = 50-48=2

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

και σε εμενα το ιδιο,εκτυπωνει ολον τον πινακα..με προλαβες!

ευχαριστω,ειναι πολυ πιο απλο ετσι

 

τρεχει το πργραμμα,σας ευχαριστω! μια διευκρυνηση μονο, το - '0' που χρησιμευει?

 

Ναι, δεν πρόσεξα το πώς ορίζεις τον πίνακα. "Θα έπρεπε" να τον ορίζεις ως

 

char *mo[] = { "-----", ".----", ... };

(δηλαδή σαν πίνακα από char*, όχι σαν πίνακα από char[])

 

και μετά θα δουλεύει όπως πρέπει χωρίς να χρειάζεται να βάλεις μόνος σου \0 στο τέλος (βάσει των κανόνων της C το βάζει ο compiler μόνος του).

 

Edit: το παρακάτω δεν ισχύει, για περισσότερες πληροφορίες δείτε επόμενο post.

 

Για το άλλο που λες, αυτό το κόλπο που κάνουμε με το ch - '0' αν θυμάμαι καλά σύμφωνα με το standard δεν είναι εγγυημένο ότι θα δουλέψει θεωρητικά, και αυτό που θα έπρεπε να κάνουμε για 100% θεωρητική σιγουριά θα κάτι εντελώς αντίστοιχο με το

 

switch(something) {
    case '0': // προσοχή, άλλο αυτό κι άλλο το case 0 χωρίς εισαγωγικά (κι άλλο με διπλά!)
    case '1':
    // κλπ
}

 

Στην πράξη όμως δε θα συναντήσεις καμία αρχιτεκτονική υπολογιστή όπου αυτό το κολπάκι δεν δουλεύει.

Επεξ/σία από defacer
Δημοσ.

Δεν υπάρχει C compiler (τουλάχιστον από ANSI και μετά) που να χρειάζεται να μπουν χειροκίνητα τα NUL bytes στα τέλη των string-literals (ούτε καν πριν από ANSI νομίζω).

 

Το πρόβλημα του αρχικού κώδικα στο 1ο ποστ είναι πως ορίζει έως 5 το μέγεθος των strings αλλά αρχικοποιεί τον πίνακα με strings που έχουν 6 χαρακτήρες μήκος, μιας και το NUL byte στο τέλος το βάζει αυτόματα ο compiler. Χώρια ότι ο compiler βγάζει warnings, τα οποία προφανώς ο φίλος μας τα έχει απενεργοποιημένα.

 

Το μόνο που χρειάζεται είναι να αλλάξει το 5 σε 6 ...

...
char mo[10][6]= {
	"-----",
	".----",
	"..---",
	"...--",
	"....-",
	".....",
	"-....",
	"--...",
	"---..",
	"----."
};

for (i=0; i < 10; i++)
	puts( mo[i] );
...
Δημοσ.

 

Δεν υπάρχει C compiler (τουλάχιστον από ANSI και μετά) που να χρειάζεται να μπουν χειροκίνητα τα NUL bytes στα τέλη των string-literals (ούτε καν πριν από ANSI νομίζω).

 

Το πρόβλημα του αρχικού κώδικα στο 1ο ποστ είναι πως ορίζει έως 5 το μέγεθος των strings αλλά αρχικοποιεί τον πίνακα με strings που έχουν 6 χαρακτήρες μήκος, μιας και το NUL byte στο τέλος το βάζει αυτόματα ο compiler. Χώρια ότι ο compiler βγάζει warnings, τα οποία προφανώς ο φίλος μας τα έχει απενεργοποιημένα.

 

Το μόνο που χρειάζεται είναι να αλλάξει το 5 σε 6 ...

...
char mo[10][6]= {
	"-----",
	".----",
	"..---",
	"...--",
	"....-",
	".....",
	"-....",
	"--...",
	"---..",
	"----."
};

for (i=0; i < 10; i++)
	puts( mo[i] );
...

Ναι μαλλον θα ειναι απενεργοποιημενα γιατι εμενα δεν μου εβγαλε κανενα warning εκτος απ αυτο που λεει να αποφευγω την χρηση της gets..

 

Tωρα οσον αφορα το αναποδο,δηλαδη να δινει ο χρηστης κωδικα morse και να εμφανιζει τα νουμερα,συνεχισα τον παραπανω αλγοριθμο ως εξης:

 

 

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[j+i]==mo[k][j]) pl=pl+1;
  if(pl%5==0) printf("%d",k);
  }
 }
}
}
 
Αλλα σαν εξοδο παιρνω λαθος αποτελεσματα

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

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

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

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

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

Σύνδεση

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

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

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