wakas Δημοσ. 31 Οκτωβρίου 2010 Δημοσ. 31 Οκτωβρίου 2010 Θα θέλαμε κάποιος αν μπορεί να μας βοηθήσει. Αντιμετοπίζουμε ένα πρόβλημα στη συνάρτηση που ελέγχει αν μία συμβολοσειρά είναι καρκινική ή όχι(θα είναι όταν διαβάζεται με τον ίδιο τρόπο τόσο από δεξιά προς τα αριστερά όσο και το αντίθετο). Τα κενά , τα σημεία στίξης ή ότι άλλο δεν πρέπει να λαμβάνονται υπόψη. Δηλαδή η συμβολοσειρά avon sees nova είναι καρκινική ενώ η avon sies nova δεν είναι! Ευχαριστούμε πολύ προκαταβολικά!!
V.I.Smirnov Δημοσ. 31 Οκτωβρίου 2010 Δημοσ. 31 Οκτωβρίου 2010 Δηλαδή το κύριο πρόβλημά σας είναι η απαλλαγή από τα σημεία στίξης. Να μια ιδέα που θα εφάρμοζα εγώ : Μετατρέπεις την συμβολοσειρά σε μικρά (ή κεφαλαία) με μια συνάρτηση όπως η toupper ή η tolow. Tα μικρά (ή κεφαλαία) βρίσκονται σε συγκεκριμένη περιοχή του πίνακα ASCII, μόνα τους χωρίς άλλα σύμβολα ενδιάμεσά τους. Κατόπιν ανιχνεύεις την συμβολοσειρά ανά χαρακτήρα και λαμβάνεις μόνον αυτούς που βρίσκονται στο διάστημα των μικρών (ή κεφαλαίων). Αν υπάρχουν αριθμοί λαμβάνεται μέριμνα επίσης για το τμήμα του πίνακα ASCII που τους περιέχει. Έτσι έχεις μόνον τα γράμματα (μικρά ή κεφαλαία) και τους αριθμούς. Από εδώ και έπειτα ο έλεγχος της καρκινικότητας γίνεται με διάφορους τρόπους... -
wakas Δημοσ. 31 Οκτωβρίου 2010 Μέλος Δημοσ. 31 Οκτωβρίου 2010 Εκεί κολλάμε , στον έλεγχο. Όλα τα έχουμε κάνει! Το μόνο πρόβλημα είναι ότι πχ στην περιπτωση που δώσουμε τη λέξη anra τότε μας βγάζει ότι είναι καρκινική ενώ δεν είναι. Δηλαδή το λάθος είναι οτί δε μπορούμε να ελέγξουμε τα δύο μεσαία γράμματα..
V.I.Smirnov Δημοσ. 31 Οκτωβρίου 2010 Δημοσ. 31 Οκτωβρίου 2010 To δύσκολο είναι η απαλλαγή από τα σύμβολα που δεν είναι γράμματα (και αριθμοί). Αν το κάνατε αυτό τα υπόλοιπα είναι τετριμμένα. Π.χ. ένας τρόπος είναι να σαρώνετε το string από το τέλος προς την αρχή και να φτιάξετε τo ανάστροφό του. Μετά ελέγχετε αν τα δύο string είναι ταυτόσημα κλπ. Η κατασκευή ενός ανάστροφου string γίνεται με πολλούς τρόπους. Και ο έλεγχος αν δύο string συμπίπτουν επίσης. Οι προφανείς τρόποι είναι με έτοιμες συναρτήσεις της <string.h> ή της STL... -
wakas Δημοσ. 31 Οκτωβρίου 2010 Μέλος Δημοσ. 31 Οκτωβρίου 2010 Σωστόςςς!! Έχεις δίκιο αυτό με την αναστροφή δεν το είχα σκεφτεί!!
bujar Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 Επισης μπορειτε, αφου εχετε απαλλαγει απο τα περιττα συμβολα, να μετρατε το μεγεθος της γραμματοσειρας, αν αρτιος, το κοβετε στην μεση (πχ συνολο 4 χαρακτηρες) μετρατε αν χαραστηρας στην θεση 1 ειναι ιδιος με τον 4 2 με τον 3 αν περιττος παλι το ιδιο αφου πχ για 5 χαρακτηρες, ο χαρακτηρας στην θεση 3 ειναι ιδιο και για τις 2, αρα 1 - 5, 2 - 4 (η αναστροφη ειναι καλυτερη, αλλα το σκεφτηκα και ειπα να πω την ιδεα μου και ας μην κανει)
wakas Δημοσ. 1 Νοεμβρίου 2010 Μέλος Δημοσ. 1 Νοεμβρίου 2010 @ Bujar Έτσι το είχα κάνει αλλά κάτι δε δουλεύει σωστά. Έτσι δε μπορούσε να ελέγξει τα 2 μεσαία γράμματα! Πάντως σας ευχαριστώ πάρα πολύ όλους για την άμμεση και πραγματικά πολύ χρήσιμη βοήθεια σας!!
macabre_sunsets Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 Εφόσον ένα string είναι ένας πίνακας χαρακτήρων για πιο λόγο να φτιαχτεί το ανάστροφο string; Μπορεί μέσα σε ένα for να γίνεται έλεγχος το πρώτο γράμμα με το τελευταίο, το δεύτερο με το πρότελευταίο και πάει λέγοντας. Βέβαια αυτό αφού θα έχουν απαλειφθεί όλοι οι «ασήμαντοι» χαρακτήρες. Έτσι πχ/ έχουμε κάτι σαν το παρακάτω (δεν είναι δοκιμασμένο αν δουλεύει): >k = string.length; for (int i=k/2; i<k; i++) { if (string[i] != string[k-1]) return false; return true; } edit: Επίσης, αντι να γίνει χρήση των toupper ή tolower μπορεί να τροποποιηθεί το πρόγραμμα κάπως έτσι: >k = string.length; for (int i=k/2; i<k; i++) { if (stricmp(string[i], string[k-1]) != 0) return false; return true; }
Directx Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 @ Bujar Έτσι το είχα κάνει αλλά κάτι δε δουλεύει σωστά. Έτσι δε μπορούσε να ελέγξει τα 2 μεσαία γράμματα! Πάντως σας ευχαριστώ πάρα πολύ όλους για την άμμεση και πραγματικά πολύ χρήσιμη βοήθεια σας!! Φρόντισε ο έλεγχος των χαρακτήρων (σε ένα υποθετικό for για παράδειγμα) να λαμβάνει υπόψη τους πως το μέγεθος του String σου είναι "<= (Μέγεθος Str - 1) / 2" και όχι "< (Μέγεθος Str - 1) / 2" και δεν θα έχεις πρόβλημα με την φράση. Αν δεν τα καταφέρεις ευχαρίστως αναρτώ κώδικα - αλλά σε συμβουλεύω να το παλέψεις μιας και υποθέτω ότι πρόκειται για κάποια άσκηση.
parsifal Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 Εφόσον ένα string είναι ένας πίνακας χαρακτήρων για πιο λόγο να φτιαχτεί το ανάστροφο string; Μπορεί μέσα σε ένα for να γίνεται έλεγχος το πρώτο γράμμα με το τελευταίο, το δεύτερο με το πρότελευταίο και πάει λέγοντας. Βέβαια αυτό αφού θα έχουν απαλειφθεί όλοι οι «ασήμαντοι» χαρακτήρες. Ή τους απαλείφεις "en passé" μέσα στο ένα και μοναδικό loop σου, με την χρήση κάποιου char * index και ++ operator (ή -- για το τμήμα του string που βρίσκεται μετά τον διάμεσο χαρακτήρα).
bujar Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 > size = strlen(array); for (i=0; i<size/2; i++) { if (array[i] != array[size-i]) printf("den einai karkiniko\n"); } Ειναι και για περιττο και για αρτιο μηκος συμβολοσειρας. Απλα στους περιττους δεν ελεγχει το μεσαιο στοιχειο αφου θα ειναι ιδιο και για τα δυο μισα.
macabre_sunsets Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 [...] Εφόσον βρεις 2 διαφορετικούς χαρακτήρες δεν υπάρχει λόγος να συνεχίσεις το ψάξιμο. Επίσης, με τον παραπάνω κώδικα για μια λέξη 10 χαρακτήρων ( για παράδειγμα αβγδεζηθικ) θα πάρεις το μήνυμα "den einai karkiniko" 5 φορές.
bujar Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 Εφόσον βρεις 2 διαφορετικούς χαρακτήρες δεν υπάρχει λόγος να συνεχίσεις το ψάξιμο. Επίσης, με τον παραπάνω κώδικα για μια λέξη 10 χαρακτήρων ( για παράδειγμα αβγδεζηθικ) θα πάρεις το μήνυμα "den einai karkiniko" 5 φορές. Εχεις δικιο, απλα ηθελα να περιγραψω το loop απο εκει και περα, μπορει να κανει οσες βελτιωσεις θελει (break, return, οτι θελει). Την καλημερα μου σε ολους.
wakas Δημοσ. 1 Νοεμβρίου 2010 Μέλος Δημοσ. 1 Νοεμβρίου 2010 for((count=0, countback = end); count<=(end/2); ++count,--countback) αυτή η συνθήκη δε λειτουργεί σωστά όμως end=(str len) - 1
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.