thebegginer Δημοσ. 10 Δεκεμβρίου 2017 Δημοσ. 10 Δεκεμβρίου 2017 Έχω μία ερώτηση σχετικά με την c. Πώς μπορώ να αποσυμπιέσω μία συμπιεσμένη συμβολοσειρά που εισάγει ο χρήστης απο το πληκτρολόγιο;;; Δηλαδή ο χρήστης να εισάγει 2t3d και εγώ να πρέπει να του εμφανίζω την συμβολοσειρά tttddd. Σκέφτομαι οτι μπορεί να πάιζει κάτι με τις συναρτήσεις isalpha και isdigit.Προσπάθησα λίγο με αυτά. Μήπως έχει κανείς καμία ιδέα επί του θέματος ή έναν τρόπο σκέψης που θέλει να μοισραστεί μπας και δουλέψει το πρόγραμμα;;; Ευχαριστώ guyss!!
GReaperEx Δημοσ. 10 Δεκεμβρίου 2017 Δημοσ. 10 Δεκεμβρίου 2017 Δεν χρειάζεσαι τα isdigit/isalpha καθόλου. Η μορφή των δεδομένων που σου δίνεται είναι συγκεκριμένη. Μια ακολουθία από ζευγάρια αριθμών και χαρακτήρων, Ο αριθμός σου λέει πόσες φορές να επαναλάβεις τον χαρακτήρα. Δες εδώ αν θες περισσότερες λεπτομέρειες επάνω σ' αυτή την μέθοδο συμπίεσης, αν και είναι εξαιρετικά απλή. https://en.wikipedia.org/wiki/Run-length_encoding
thebegginer Δημοσ. 10 Δεκεμβρίου 2017 Μέλος Δημοσ. 10 Δεκεμβρίου 2017 Επειδή είμαι καινούργια ,σκέφτομαι πολλόυς τροπους με αποτέλεσμα το ευκολο να το κάνω δυσκολο και να μπερδευομαι απο μονη μου . Το isalpha και το isdigit το σκεφτηκα γιατι λεει αν δεν υπαρχει ψηφίο μπροστα εμφανίζεται μία φορα ο χαρακτήρας. Θα προσπαθήσω να σκεφτω λίγο πιο απλά και αν δω οτι δεν ,θα παραθέσω τον κώδικα μου ! Thanks !
GReaperEx Δημοσ. 10 Δεκεμβρίου 2017 Δημοσ. 10 Δεκεμβρίου 2017 Δηλαδή θες κάτι που να δουλεύει μόνο με αλφαβητικούς χαρακτήρες? Ρωτάω επειδή αν κάνεις τη χρήση των αριθμών προαιρετική, χάνεις τη δυνατότητα να μπορείς να αντιπροσωπεύσεις όλους τους χαρακτήρες. Για παράδειγμα, το παρακάτω δε μπορεί να συμπιεστεί, επειδή περιλαμβάνει και αριθμούς: dssssjjjjj1000000w γίνεται: 1d4s5j11601w εξαρτάται βέβαια πώς θες να αποθηκεύσεις αυτές τις πληροφορίες.
thebegginer Δημοσ. 10 Δεκεμβρίου 2017 Μέλος Δημοσ. 10 Δεκεμβρίου 2017 Μπερδεψα τον εαυτο μου ,τωρα θα μπερδεψω και σένα . Εγω θέλω να αποσυμπιέσω μία συμβολοσειρά η οποία μπορεί να είναι του τυπου 3t4d και να μου εμφανίσει tttdddd ή μπορει να είναι 3t4dk και να πρεπει να μου εμφανισει tttddddk .Μπροστα απο το k δνε έχει αριθμο αρα πρεπει να το εμφανίσει μόνο μία φορα. Και λέω πωωωωως θα ελεγξω αν έχει μπροστά ψηφίο,χμμμ isdigit και καταμπερδευτηκαααα... Anyways μου έστειλες το run length encoding και το ψάχνω τώρα ,να πειραματιστώ λίγο και αν δεν βγαίνει θα παραθέσω κώδικα και όποιος το δει ,βοηθάει !
newnick Δημοσ. 10 Δεκεμβρίου 2017 Δημοσ. 10 Δεκεμβρίου 2017 Σκέφτηκες ότι ο αριθμός μπορεί να είναι και διψήφιος;;;;; (πχ r23kd4rt) Γενικά ο αλγόριθμος είναι ο εξής times μια μεταβλητή που θα έχει το ποσες φορές θα τυπώσει τον χαρακτήρα Αν διαβαζω χαρακτήρα και το times είναι μηδέν τυπώνω τον χαρακτήρα μια φορά αλλιώς Αν διαβάζω χαρακτήρα και το times είναι διαφορετικό από το μηδέν τυπώνω χαρακτήρα times φορές κάνω το times μηδεν αλλιως Αν διαβάζω ψηφίο αν το times είναι μηδέν κάνω το times όσο με το ψηφίο αλλιώς κάνω το times = 10 * (το παλιο times) + το ψηφίο αλλιώς τερματίζω Καλό κώδικα!
thebegginer Δημοσ. 11 Δεκεμβρίου 2017 Μέλος Δημοσ. 11 Δεκεμβρίου 2017 Τον προσπάθησα τον κώδικα που μου έδωσες όμως ειναι κάθε φορά για έναν χαρακτήρα. Εγώ θέλω ολόκληρο το string ! Απ 'οτι έψαξα η C δεν δέχεται strings.Δημιουργώντας για παράδειγμα έναν πίνακα λοιπόν τύποθ char str []=" "; έχω το εξής πρόβλημα. Αν ήξερα το μέγεθος του πίνακα ,καθώς η συμβολοσειρά δινεται απο τον χρήστη θα μπορούσα να στοιχείο το στοιχείο ,θέση τη θέση ,να ελεγξω αν προκειται για χαρακτήρα ή αριθμό. Πιστεύετε εσείς οτι θα έπρεπε να χρησιμοποιήσω strlen για να πάρω το μέγεθος ή είναι ανώφελο ; :/ Όσον αφορά τώρα για το run length encoding θεωρώ πως δεν με βοηθάει γιατί 1ον εγώ προσπαθώ να κάνω decoding και 2ον είμαι πολύ αρχάρια για να μπορέσω να το φτιάξω πάνω στα μέτρα μου και να δουλέψει . Δεν θέλω λύση της άσκησης απλά να μου πείτε πως μπορώ σε έναν πίνακα να διαβάσω χαράκτηρα-χαρακτήρα ;εφαγα τα νιάτα μου να ψάχνω στο ίντερνετ ! Ευχαριστώ για την ανταπόκριση btw guys !
newnick Δημοσ. 12 Δεκεμβρίου 2017 Δημοσ. 12 Δεκεμβρίου 2017 Αρχικά θα σου πρότεινα να θεωρήσεις ότι το μέγιστο μήκος της συμβολοσειράς το γνωρίζεις πχ 1024. Οπότε διαβάζεις την είσοδο σε έναν πίνακα char και από εκεί ελέγχεις ένα έναν τους χαρακτήρες. Αν δεν μπορείς να διαβάσεις έναν έναν τους χαρακτήρες από τον πίνακα, τότε μάλλον δεν έχεις διαβάσει για το μάθημα Δες Site: ΕΔΩ πως μπορείς να το κάνεις Όταν το κάνεις αυτό τότε μελετάς πως να δεσμεύσεις δυναμικά χώρο για τον πίνακα όπως για παράδειγμα προτείνει Site: ΕΔΩ
k33theod Δημοσ. 12 Δεκεμβρίου 2017 Δημοσ. 12 Δεκεμβρίου 2017 (επεξεργασμένο) Χρειάστηκε να θυμηθώ πολλά για να το κάνω #include <stdio.h> int main(void){ int sum=0 ; char ch; printf("Enter the sequence :"); scanf("%c", &ch); while (ch!= '\n') { if (ch>='A' && sum==0) printf("%c", ch); else if (ch>='A' && sum!=0 ){ for (int i=0;i<sum;i++) printf("%c", ch); sum=0;} else sum=sum*10+(ch-'0'); scanf("%c", &ch); } return 0; } Επεξ/σία 15 Δεκεμβρίου 2017 από k33theod 6
thebegginer Δημοσ. 13 Δεκεμβρίου 2017 Μέλος Δημοσ. 13 Δεκεμβρίου 2017 #include <stdio.h> #include <string.h> int main () { int i,j,length; int times; char str[]=" "; gets(str); length=strlen(str); for (i=0;i<=length;i++) { if(str>='a'&& str<='z') { printf("%c",str); } else if(str>='1' && str<='9') { times=(int) str; } for(i=0;i<=times;i++) printf("%c",times*str); } } Ο κωδικας που σας παράθεσα είναι λάθος αλλα τουλαχιστον τώρα εμαθα !! Σας ευχαριστω !!
newnick Δημοσ. 14 Δεκεμβρίου 2017 Δημοσ. 14 Δεκεμβρίου 2017 το times = (int) str; είναι λάθος γιατί μετατρέπει τον χαρακτήρα στον ASCII κωδικό του. πχ το '5' το κάνει 53 ένας τρόπος είναι να εκμεταλευτείς ότι τα ψηφια είναι διαδοχικά στον ASCII και να γράψεις times = (int)str - int('0');
GReaperEx Δημοσ. 14 Δεκεμβρίου 2017 Δημοσ. 14 Δεκεμβρίου 2017 Ενημερωτικά, δε χρειάζεται να castάρετε τους χαρακτήρες, μετατρέπονται σε int από μόνοι τους όταν κάνετε πράξεις μ' αυτούς. times = str[i] - '0';
thebegginer Δημοσ. 16 Δεκεμβρίου 2017 Μέλος Δημοσ. 16 Δεκεμβρίου 2017 Σας ευχαριστώ όλους για τις απαντήσεις σας . Μπορεί να μην κατάφερα να την λύσω 100% την άσκηση όμως εφτασα σε ενα αρκετα καλό σημειο με την βοηθεια σας και ειμαι ικανοποιημενη αν και αρχαρια !!
παπι Δημοσ. 17 Δεκεμβρίου 2017 Δημοσ. 17 Δεκεμβρίου 2017 Δες και μια πιο ετσι προσεγγση int decode(const char* input, char* output, int szOutput); int encode(const char* input, char* output, int szOutput); void print(const char* s); void fillRandomRepeat(char* input, int len, const char* palet); int main(int, char**) { char buf[512] = { 0 }; char buf1[512] = { 0 }; char *it; int ret,i; fillRandomRepeat(buf, 511, "abcdefg"); printf("random data\n"); print(buf); ret = encode(buf, buf1, 511); printf("encoded data\n"); print(buf1); ret = decode(buf1, buf, 511); printf("decoded data\n"); print(buf); return 0; } int decode(const char* input, char* output, int szOutput) { int len = 0; const char* it = input; int charCount; for (; { charCount = atoi(it); if (!charCount) charCount = 1; //default; for (; !isalpha(*it) && *it; ++it); len += charCount + 1; if (szOutput < len && output) return -1; if (output) for (; charCount > 0; charCount--) *output++ = *it; if (*it++ == NULL) break; } return len; } int encode(const char* input, char* output, int szOutput) { const char* it = input; int len = 0; char buf[128]; int counter = 1; char currentChar = *it; if (strlen(input) < 2) return -1; do { it++; if (currentChar != *it) { if (counter > 1) { itoa(counter, buf, 10); len += strlen(buf); if (len > szOutput) return -1; strcpy(output, buf); output += strlen(buf); } if (len++ > szOutput) return -1; counter = 0; *output++ = currentChar; currentChar = *it; } counter++; } while (*it != NULL); return len; } void print(const char* s) { printf("======= data begin ==========\n%s\n========= data end ============\n", s); } void fillRandomRepeat(char* input, int len,const char* palet) { int i, paletSize; char r = *palet; paletSize = strlen(palet); for (i = 0; i < len; i++) { if (rand() % 100 < 30) r = palet[rand() % paletSize]; input[i] = r; } }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα