virxen75 Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 το όλο προβλημα εντοπίζεται στην λύση η λύση προϋποθέτει την ύπαρξη συμμετρίας όχι μόνο στους χαρακτήρες αλλά και στα σημεία στίξης για να το αποφύγεις και να δουλέψει πρέπει να δημιουργήσεις μία νέα συμβολοσειρά απαλλαγμένη από τα σημεία στίξης κάτι τέτοιο δηλαδή > int palindrome(char String[],int n){ char String2[n+1]; int end; int count=0,i,flag=-1; for (i=0;i<n;i++) if (String[i]>='a' && String[i]<='z') String[i]=String[i]-32; for (i=0;i<n;i++) if (String[i]>='A' && String[i]<='Z') String2[count++]=String[i]; String2[count]='\0'; printf("\nme simeia stiksis=%s\n",String); printf("\nxoris simeia stiksis=%s\n",String2); end=count; for(i=0; i< (end+1)/2; i++){ if(String2[i] == String2[end - (i+1)]){ flag = 0; } else{ flag = 1; break; } } return flag; }
wakas Δημοσ. 1 Νοεμβρίου 2010 Μέλος Δημοσ. 1 Νοεμβρίου 2010 Δεν είναι δυνατόν να κάνουμε το πρόγραμμα χωρίς να κατασκεβάσουμε το ανάστροφο του string; Προσωπικά πιστεύω οτί γίνεται και γι αυτό ψάχνω το ΛΟΓΙΚΟ λάθος στις συνθήκες το for.
V.I.Smirnov Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 @wakas To θέμα δεν είναι αν μπορεί να γίνει - προφανώς μπορεί. Αλλά ότι εσύ ΔΕΝ έχεις την εξοικοίωση να το κάνεις όσο κι' αν μοιάζει απλό. Γι αυτό σου είπα από την αρχή φτιάξε ένα ξεχωριστό ανάστροφο και σύγκρινε τα δύο : επειδή έτσι μπορείς να εξετάσεις το πρόβλημα πιο μεθοδικά. Αν το είχες κάνει με αυτόν τον μεθοδικό τρόπο θα ήξερες πού και τι δεν δουλεύει. Και ο Virxen ουσιωδώς αυτό λέει στο post #31. -
wakas Δημοσ. 1 Νοεμβρίου 2010 Μέλος Δημοσ. 1 Νοεμβρίου 2010 το όλο προβλημα εντοπίζεται στην λύση η λύση προϋποθέτει την ύπαρξη συμμετρίας όχι μόνο στους χαρακτήρες αλλά και στα σημεία στίξης για να το αποφύγεις και να δουλέψει πρέπει να δημιουργήσεις μία νέα συμβολοσειρά απαλλαγμένη από τα σημεία στίξης κάτι τέτοιο δηλαδή > int palindrome(char String[],int n){ char String2[n+1]; int end; int count=0,i,flag=-1; for (i=0;i<n;i++) if (String[i]>='a' && String[i]<='z') String[i]=String[i]-32; for (i=0;i<n;i++) if (String[i]>='A' && String[i]<='Z') String2[count++]=String[i]; String2[count]='\0'; printf("\nme simeia stiksis=%s\n",String); printf("\nxoris simeia stiksis=%s\n",String2); end=count; for(i=0; i< (end+1)/2; i++){ if(String2[i] == String2[end - (i+1)]){ flag = 0; } else{ flag = 1; break; } } return flag; } Σωστός ο Οφιτζής!! Να σαι καλά φίλε!! 3 μέρες τώρα ψάχνουμε αυτή τη βλακεία. Ευχαριστώωωωωωωωωωωωωωωωω!!!!
bokarinho Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 το όλο προβλημα εντοπίζεται στην λύση η λύση προϋποθέτει την ύπαρξη συμμετρίας όχι μόνο στους χαρακτήρες αλλά και στα σημεία στίξης για να το αποφύγεις και να δουλέψει πρέπει να δημιουργήσεις μία νέα συμβολοσειρά απαλλαγμένη από τα σημεία στίξης κάτι τέτοιο δηλαδή > int palindrome(char String[],int n){ [color="red"]char String2[n+1];[/color] int end; int count=0,i,flag=-1; for (i=0;i<n;i++) if (String[i]>='a' && String[i]<='z') String[i]=String[i]-32; for (i=0;i<n;i++) if (String[i]>='A' && String[i]<='Z') String2[count++]=String[i]; String2[count]='\0'; printf("\nme simeia stiksis=%s\n",String); printf("\nxoris simeia stiksis=%s\n",String2); end=count; for(i=0; i< (end+1)/2; i++){ if(String2[i] == String2[end - (i+1)]){ flag = 0; } else{ flag = 1; break; } } return flag; } Αυτό είναι C99? Γιατί κανονικά δεν πρέπει να περνάει...
wakas Δημοσ. 1 Νοεμβρίου 2010 Μέλος Δημοσ. 1 Νοεμβρίου 2010 Αυτό είναι C99? Γιατί κανονικά δεν πρέπει να περνάει... Δεν καταλαβαίνω τι εννοείς;
bokarinho Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 Αυτό είναι C99? Γιατί κανονικά δεν πρέπει να περνάει... Πήρα την απάντηση μου, variable length arrays, είναι C99 στοιχείο, νέες μόδες...
Evgenios1 Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 Πήρα την απάντηση μου, variable length arrays, είναι C99 στοιχείο, νέες μόδες... Επικινδυνες μοδες. Με το ενα ποδι στο stackoverflow ειναι.
bujar Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 Πήρα την απάντηση μου, variable length arrays, είναι C99 στοιχείο, νέες μόδες... Επικινδυνες μοδες. Με το ενα ποδι στο stackoverflow ειναι. Μοιραστειτε την γνωση ρε παιδια. Τι εννοειται? Απο που το καταλαβες και γιατι δεν περναει? Επισης γιατι ειναι επικινδυνο? Ευχαριστω εκ των προτερων για την οποια απαντηση (Απλα για να μαθαινουμε οι νεοι)
Evgenios1 Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 Μοιραστειτε την γνωση ρε παιδια. Τι εννοειται? Απο που το καταλαβες και γιατι δεν περναει?Επισης γιατι ειναι επικινδυνο? Ευχαριστω εκ των προτερων για την οποια απαντηση (Απλα για να μαθαινουμε οι νεοι) Στο παραπανω βλεπεις πως καθεται ενα προγρμμα C στη μνημη. Στο κομματι που λεει stack μπαινουν οι μεταβλητες της συναρτησης. Οταν φτιαχνεις ενα static array τοτε αυτο μπαινει μεσα στη stack, αρα η stack σου μεγαλωνει. Το θεμα ειναι οτι η stack δεν ειναι για να κραταει μαζες απο δεδομενα, αλλα ενα περιορισμενο αριθμο απο δεδομενα τα οποια ειναι για επεξεργασια (πχ οταν θα κανεις convert μια ταινια, αυτη τη ταινια δεν θα τη ανεβασεις ολη πανω στη μνημη αλλα κομματι κομματι, αρα εχεις εναν περιορισμο της μνημης σε σχεση του δικου. Το ιδιο γινεται και στη μνημη που χωριζεται σε καποια κομματια. Εχεις λιγη stack και αρκετη heap) Εαν θες να κανεις κατι πρακτικο, φτιαξε ενα static array με μεγεθος 10mb (char a[1024*1024*10] και θα δεις οτι θα σου κρασαρει το προγραμμα. Αλλος τροπος για να προκαλεσεις stackoverflow ειναι η χρηση της αναδρομικης συνρτησης.
Haldol Δημοσ. 2 Νοεμβρίου 2010 Δημοσ. 2 Νοεμβρίου 2010 Όπως αναφέρθηκε και προηγουμένως, δεν χρειάζεται να αντιστρέψεις το string. Μπορείς να κάνεις κάτι σαν: >int ValidChar = 1; for (i = 0; i < Length; i++) { if (string[i] != string[Length-i]) { ValidChar = 0; break; } } if (ValidChar = 1) { printf("Είναι καρκινικό"); } else { printf("Μπα..."); } Όπου Length είναι η επιστροφή της strlen() για το string που περιέχει τη λέξη, και string[] το char array που έχει μέσα τη λέξη μας.
virxen75 Δημοσ. 2 Νοεμβρίου 2010 Δημοσ. 2 Νοεμβρίου 2010 Όπως αναφέρθηκε και προηγουμένως, δεν χρειάζεται να αντιστρέψεις το string. Μπορείς να κάνεις κάτι σαν: >int ValidChar = 1; for (i = 0; i < Length; i++) { if (string[i] != string[Length-i]) { ValidChar = 0; break; } } if (ValidChar = 1) { printf("Είναι καρκινικό"); } else { printf("Μπα..."); } Όπου Length είναι η επιστροφή της strlen() για το string που περιέχει τη λέξη, και string[] το char array που έχει μέσα τη λέξη μας. το for σου είναι λάθος δες το ξανά δες τον κώδικα που έχω στείλει ήδη
Haldol Δημοσ. 2 Νοεμβρίου 2010 Δημοσ. 2 Νοεμβρίου 2010 Έχεις δίκιο, ελέγχω και το terminating character έτσι. Θέλει Length-1 στη for και string[(Length-1)-i] στην if. Το συγκεκριμένο το δοκίμασα και λειτουργεί όπως πρέπει πάντως.
virxen75 Δημοσ. 2 Νοεμβρίου 2010 Δημοσ. 2 Νοεμβρίου 2010 Έχεις δίκιο, ελέγχω και το terminating character έτσι. Θέλει Length-1 στη for και string[(Length-1)-i] στην if. Το συγκεκριμένο το δοκίμασα και λειτουργεί όπως πρέπει πάντως. ο τρόπος λειτουργίας είναι ελέγχω το πρώτο με το τελευταίο το 2ο με το προτελευταίο ....... άρα πρόκειται για ζευγάρια άρα θες το μισό for από αυτό που χρησιμοποιεις για να το καταλάβεις βάλε μία printf να σου δείχνει τι συγκρίνει με τι.
bujar Δημοσ. 3 Νοεμβρίου 2010 Δημοσ. 3 Νοεμβρίου 2010 Στο παραπανω βλεπεις πως καθεται ενα προγρμμα C στη μνημη. Στο κομματι που λεει stack μπαινουν οι μεταβλητες της συναρτησης. Οταν φτιαχνεις ενα static array τοτε αυτο μπαινει μεσα στη stack, αρα η stack σου μεγαλωνει. Το θεμα ειναι οτι η stack δεν ειναι για να κραταει μαζες απο δεδομενα, αλλα ενα περιορισμενο αριθμο απο δεδομενα τα οποια ειναι για επεξεργασια (πχ οταν θα κανεις convert μια ταινια, αυτη τη ταινια δεν θα τη ανεβασεις ολη πανω στη μνημη αλλα κομματι κομματι, αρα εχεις εναν περιορισμο της μνημης σε σχεση του δικου. Το ιδιο γινεται και στη μνημη που χωριζεται σε καποια κομματια. Εχεις λιγη stack και αρκετη heap) Εαν θες να κανεις κατι πρακτικο, φτιαξε ενα static array με μεγεθος 10mb (char a[1024*1024*10] και θα δεις οτι θα σου κρασαρει το προγραμμα. Αλλος τροπος για να προκαλεσεις stackoverflow ειναι η χρηση της αναδρομικης συνρτησης. Ευχαριστω πολυ για την απαντηση. Την πρωτη φορα δεν παρατηρησα οτι ειχε σημειωσει με κοκκινο το σημειο στο οποιο αναφερεται, και τωρα με την δικια σου (πληρεστατη) εξηγηση πιστευω σχηματισα μια καλη εικονα για το τι συμβαινει. Μια τελευταια ερωτηση (αν δεν σε κουραζω), αυτου του ειδους η δηλωση πινακα δεν ηταν και στο C89?
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.