wakas Δημοσ. 1 Νοεμβρίου 2010 Μέλος Δημοσ. 1 Νοεμβρίου 2010 Γιατί αν βάλουμε απλά strlen τότε θα κάνει τον έλεγχο 2 φορές.! Με strlen/2 ελέγχει το πρώτο με το τελευταίο , το δεύτερο με το προτελευταίο , μέχρι το μεσαίο. Το θέμα είναι οτί και πάλι μπερδεύει.
Evgenios1 Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 Και γιατι να το κανεις; Εσυ θελεις να δεις αν ενα string περιεχει χαρακτηρες με στιγματα (η μη χαρακτηρες) σωστα; πχ !@#$%^ ji etc..
macabre_sunsets Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 for((count=0, countback = end); count<=(end/2); ++count,--countback) Για ποιο λόγο το κάνεις έτσι; Το countback είναι ίδιο με το (end - count).
wakas Δημοσ. 1 Νοεμβρίου 2010 Μέλος Δημοσ. 1 Νοεμβρίου 2010 Όχι θέλω να δω αν απ όποια μεριά κι αν το διαβάσεις σου βγαίνει το ίδιο. Το θέμα με τις τελείς κτλ το έχω λύσει. Το πρόβλημα είναι η συνθήκη στο for.
virxen75 Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 λύση με reverse εδώ http://www.laynetworks.com/C%20Program_Palindrome.htm λύση με for εδώ http://stackoverflow.com/questions/3471076/checking-for-palindrome-string-in-c/3471326#3471326 λύση με αναδρομή εδώ http://www.daniweb.com/forums/post369552.html#post369552
wakas Δημοσ. 1 Νοεμβρίου 2010 Μέλος Δημοσ. 1 Νοεμβρίου 2010 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <ctype.h> int palindrome(char [],int); void ceasar(char [] , int); int epil; char String[100]; main() { int z,N,key; int p; printf("Please enter a string(100 characters max): \n"); gets(String); N=strlen(String); printf("\n (1) Check if the string is palindrome. \n (2) Encrypt the string using Ceasar 's cipher. \n (3) Exit. \n"); scanf("%d",&epil); if (epil==1) { z=palindrome(String,N); if (z==0) { printf ("H sumboloseira einai karkiniki"); } else if (z==1) { printf ("H sumboloseira den einai karkiniki"); } } else if (epil==2) { printf("Please enter the key:"); scanf("%d",&key); ceasar(String,key); } else{ exit; } system ("PAUSE"); } int palindrome(char String[],int n) { int count; int countback; int end; int i; for (i=0;i<=n;i++) { if (String>='a' && String<='z') { String=String-32; } } printf("\n%s\n",String); /*if ((n%2)==1) end=n-1; else end=n;*/ end=n-1; for((count=0, countback = end); count<=(end/2); ++count,--countback) { if ((String[count]>='A')&&(String[count]<='Z')) { if((String[countback]>='A')&&(String[countback]<='Z')) { if(String[count]!=String[countback]) { return(1); } return(0); } else { countback--; } } else { count++; } }} void ceasar(char String[], int key) { int i; char t; int met; t='Y'-21; printf("%c",t); while (String!='\0'){ if ((String>='A')&&(String<='Z')) { if (key+'String'>='Z') { met=26-key; String=String-'Z'; } } else if (String>='a' && String<='z'){ } } printf("\n %s \n",String); }
virxen75 Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 > #include <string.h> και int palindrome(char String[],int n) { int count; int countback; int end; int i; for (i=0;i<=n;i++) //βγάλε το ίσον
virxen75 Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 Και πάλι λάθος! το λάθος που είναι? στο compile? σε κάποια επιλογή του προγράμματος? που το εντοπίζεις?
wakas Δημοσ. 1 Νοεμβρίου 2010 Μέλος Δημοσ. 1 Νοεμβρίου 2010 Τρέξε το πρόγραμμα όπως θεωρείς εσύ σωστό και πάτα τη λέξη anra και θα δεις οτί θα σου βγάλει λάθος. Θα σου βγάλει οτί είναι καρκινική ενώ δεν είναι. ---------- Προσθήκη στις 17:54 ---------- Προηγούμενο μήνυμα στις 17:41 ---------- Παιδιά το λάθος δεν είναι συντακτικό αλλά ΛΟΓΙΚΟ και το πιθανότερο είναι στις συνθήκες..
virxen75 Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 > int palindrome(char String[],int n){ int end; int i,flag=-1; for (i=0;i<n;i++) if (String[i]>='a' && String[i]<='z') String[i]=String[i]-32; printf("\n%s\n",String); end=n; for(i=0; i< (end+1)/2; i++){ if (String[i]>='A' && String[i]<='Z' && String[end - (i+1)]>='A' && String[end - (i+1)]<='Z') { if(String[i] == String[end - (i+1)]){ flag = 0; } else{ flag = 1; break; } } } return flag; }
wakas Δημοσ. 1 Νοεμβρίου 2010 Μέλος Δημοσ. 1 Νοεμβρίου 2010 > int palindrome(char String[],int n){ int end; int i,flag=-1; for (i=0;i<n;i++) if (String[i]>='a' && String[i]<='z') String[i]=String[i]-32; printf("\n%s\n",String); end=n; for(i=0; i< (end+1)/2; i++){ if (String[i]>='A' && String[i]<='Z' && String[end - (i+1)]>='A' && String[end - (i+1)]<='Z') { if(String[i] == String[end - (i+1)]){ flag = 0; } else{ flag = 1; break; } } } return flag; } Αν βάλεις τη συμβολοσειρά .,.,po.,,,ik..,ven.,.nevkiop σου βγάζει οτί δεν είναι καρκινική ενώ είναι!!
V.I.Smirnov Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 @wakas Δεν δουλεύεις το θέμα σωστά. Πρέπει να χειριστείς τα μέρη του ένα ένα. α) αποφασίζεις πώς θα χειρίζεσαι το ανάστροφο string. Δύο τρόποι υπάρχουν : i) Εν διαβάσει, δηλ. την ώρα που κάνεις τον έλεγχο (χωρίς να φτιάξεις πραγματικά το ανάστροφο). ii) Φτιάχνεις το ανάστροφο και έχεις να συγκρίνεις δύο strings. Γινεται είτε με έτοιμες συναρτήσεις είτε με ιδιοκατασκευή. Για μεθοδική αντιμετώπιση τo πιο σαφές είναι το ii) . Έστω ότι αυτό κάνεις. Ελέγχεις ότι το ανάστροφο string φτιάχνεται σωστά. β) Έχοντας φτιάξει το α) ii), συγκρίνεις τα δύο stings. Και αυτό γίνεται είτε με έτοιμες συναρτήσεις είτε με ιδιοκατασκευή. Εφόσον και το β) δουλέψει, προχωράς στο γ) γ) Γράφεις την ρουτίνα που καθαρίζει το string από τους ανεπιθύμητους χαρακτήρες. Αυτό το κάνεις τελευταίο αλλά προφανώς θα το βάλεις στο πρόγραμμα πριν εκτελεστούν τα α) , β). Π.χ. ορίζεις ένα νέο string που είναι το φιλτραρισμένο με το οποίο τροφοδοτούνται οι ρουτίνες στα α) , β). Ή όλους τους ανεπιθύμητους χαρακτήρες τους αντικαθιστάς με κενό. Ή... Δηλ. το γ) είναι το λιγότερο σημαντικό και το γράφεις τελευταίο. Θα το μπει στο πρόγραμμα αφού γράψεις τα α), β) και ελένξεις ότι είναι σωστά. Το πρόβλημα το λύνεις αφού το χωρίσεις σε μέρη, εξασφαλίσεις ότι το καθένα λειτουργεί και προχωράς βήμα -βήμα από το ένα στο άλλο. Έτσι ξέρεις και πού ακριβώς είναι το τυχόν λαθος (στη σύγκριση των δύο strings, στην κατασκευή του ανάστροφου, στο 'φιλτράρισμα' ...) Ψάχνεις μόνον το συγκεκριμένο βήμα και μόνο αφού είναι σωστό προχωράς παρακάτω. Αυτό που έχεις κάνει μόνο μεθοδικό δεν είναι και δεν σε βοηθά... -
macabre_sunsets Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 Το: >if (String[i]>='a' && String[i]<='z') String[i]=String[i]-32; και το: >if(String[i] == String[end - (i+1)]){ μπορεί να αντικατασταθούν από το: >if(stricmp(String[i], String[end - (i+1)) == 0]){ Επίσης το end μπορεί να τεθεί ίσο με n-1 και το: >String[end - (i+1) να γίνει: >String[end - i για περισσότερη ευκολία.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.