dim94 Δημοσ. 6 Ιανουαρίου 2013 Δημοσ. 6 Ιανουαρίου 2013 Καλησπερα,αντιμετωπιζω προβλημα με το παρακατω κομματι κωδικα που αφορα την μετατροπη ενος τυχαιου αριθμου σε κωδικα 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; } } } } Ευχαριστω εκ των προτερων
Directx Δημοσ. 6 Ιανουαρίου 2013 Δημοσ. 6 Ιανουαρίου 2013 Πριν αρκετό καιρό είχε ζητηθεί κάτι παρόμοιο εδώ, ίσως σε βοηθήσει.
dim94 Δημοσ. 6 Ιανουαρίου 2013 Μέλος Δημοσ. 6 Ιανουαρίου 2013 ευχαριστω πολυ,αν και δεν γνωριζω 'δομες' ακομα γι αυτο και προσπαθησα να το κανω ετσι..
bird Δημοσ. 6 Ιανουαρίου 2013 Δημοσ. 6 Ιανουαρίου 2013 Δοκίμασε το switch(str[i]) να γίνει switch(str[i]-'0') το str είναι char οπότε μπορεί να κολλάει εκεί...
dim94 Δημοσ. 6 Ιανουαρίου 2013 Μέλος Δημοσ. 6 Ιανουαρίου 2013 Δοκίμασε το 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: Δηλαδη τωρα δεν μου βγαζει το'----' ,μου βγαζει απλως το τελευταιο μνμ χωρις παλι να διαβαζω
bird Δημοσ. 6 Ιανουαρίου 2013 Δημοσ. 6 Ιανουαρίου 2013 Βάλε κάτω από τη scanf το παρακάτω (όπου το c θα το δηλωσεις στην αρχή σαν int) while ( (c=getchar()) != '\n' && c!=EOF); (Μένει το '\n' από την scanf και το διαβάζει παρακάτω η gets() )
dim94 Δημοσ. 6 Ιανουαρίου 2013 Μέλος Δημοσ. 6 Ιανουαρίου 2013 τωρα μπορω και διαβαζω αριθμο αλλα μ εμφανιζει τον κωδικα morse μονο του πρωτου στοιχειου απ τον αριθμο που δινω(πχ: 123,μου εμφανιζει τον Morse του 1). Ευχαριστω πολυ παντως!
defacer Δημοσ. 6 Ιανουαρίου 2013 Δημοσ. 6 Ιανουαρίου 2013 Γιατί δεν απλοποιείς λίγο τον κώδικά σου; Ας πούμε αυτό: 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'?
bird Δημοσ. 6 Ιανουαρίου 2013 Δημοσ. 6 Ιανουαρίου 2013 Γιατί δεν το γράφεις απλά 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', εκτυπώνει όλον τον πίνακα...
dim94 Δημοσ. 6 Ιανουαρίου 2013 Μέλος Δημοσ. 6 Ιανουαρίου 2013 Γιατί δεν απλοποιείς λίγο τον κώδικά σου; Ας πούμε αυτό: 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' που χρησιμευει?
bird Δημοσ. 6 Ιανουαρίου 2013 Δημοσ. 6 Ιανουαρίου 2013 τρεχει το πργραμμα,σας ευχαριστω! μια διευκρυνηση μονο, το - '0' που χρησιμευει? Στον πίνακα αποθηκεύονται οι χαρακτήρες '0', '1', '2', κτλ... οι οποίοι αντιστοιχούν σε κάποιυς συνεχόμενους integers στο ASCII. Για παράδειγμα 48,49,50, κτλ... οπότε αν αφαιρέσεις από έναν χαρακτήρα το '0' έχουμε για παράδειγμα '2'-'0' = 50-48=2
defacer Δημοσ. 6 Ιανουαρίου 2013 Δημοσ. 6 Ιανουαρίου 2013 (επεξεργασμένο) και σε εμενα το ιδιο,εκτυπωνει ολον τον πινακα..με προλαβες! ευχαριστω,ειναι πολυ πιο απλο ετσι τρεχει το πργραμμα,σας ευχαριστω! μια διευκρυνηση μονο, το - '0' που χρησιμευει? Ναι, δεν πρόσεξα το πώς ορίζεις τον πίνακα. "Θα έπρεπε" να τον ορίζεις ως char *mo[] = { "-----", ".----", ... }; (δηλαδή σαν πίνακα από char*, όχι σαν πίνακα από char[]) και μετά θα δουλεύει όπως πρέπει χωρίς να χρειάζεται να βάλεις μόνος σου \0 στο τέλος (βάσει των κανόνων της C το βάζει ο compiler μόνος του). Edit: το παρακάτω δεν ισχύει, για περισσότερες πληροφορίες δείτε επόμενο post. Για το άλλο που λες, αυτό το κόλπο που κάνουμε με το ch - '0' αν θυμάμαι καλά σύμφωνα με το standard δεν είναι εγγυημένο ότι θα δουλέψει θεωρητικά, και αυτό που θα έπρεπε να κάνουμε για 100% θεωρητική σιγουριά θα κάτι εντελώς αντίστοιχο με το switch(something) { case '0': // προσοχή, άλλο αυτό κι άλλο το case 0 χωρίς εισαγωγικά (κι άλλο με διπλά!) case '1': // κλπ } Στην πράξη όμως δε θα συναντήσεις καμία αρχιτεκτονική υπολογιστή όπου αυτό το κολπάκι δεν δουλεύει. Επεξ/σία 8 Ιανουαρίου 2013 από defacer
migf1 Δημοσ. 6 Ιανουαρίου 2013 Δημοσ. 6 Ιανουαρίου 2013 Δεν υπάρχει 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] ); ...
dim94 Δημοσ. 7 Ιανουαρίου 2013 Μέλος Δημοσ. 7 Ιανουαρίου 2013 Δεν υπάρχει 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); } } } } Αλλα σαν εξοδο παιρνω λαθος αποτελεσματα
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα