tonybest Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 (επεξεργασμένο) char c; scanf("%c",&c); if(c==' ') { printf("Vrika keno"); } else { printf("c den einai keno"); } Θέλω να ελέγξω αν ο c είναι κενό(space) ή όχι. Αλλά όταν στη scanf δίνω κενό(πατάω space) στο terminal(ubuntu έχω) με πάει μια σειρά κάτω και περιμένει μέχρι εγώ κάτι να δώσω. Όμως εγώ θέλω να δώσω κενό... Πως το κάνω; Και άμα το καταφέρω(δηλαδή βοηθήσει κάποιος) η if είναι σωστή(ελέγχω σωστά άμα c==κενό); Επεξ/σία 29 Οκτωβρίου 2011 από tonybest
migf1 Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 ή θα γράψεις: char c; ή int c; ... int char c; δεν κάνει καν compile.
tonybest Δημοσ. 29 Οκτωβρίου 2011 Μέλος Δημοσ. 29 Οκτωβρίου 2011 ή θα γράψεις: char c; ή int c; ... int char c; δεν κάνει καν compile. Καταλάθος έβαλα το int. Αλλά και πάλι δε γίνεται.
migf1 Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 Σε μένα δουλεύει κανονικά, αν και υποφέρει από το κλασικό θέμα των έξτρα σκουπιδιών στη κύρια είσοδο (το ENTER σε αυτή τη περίπτωση). Όπως και να έχει, αυτά που γράφω στο link είναι ο ενδεδειγμένος τρόπος διαβάσματος της κύριας εισόδου στη C. Εδώ και από το επίσημο FAQ της γλώσσας: http://c-faq.com/stdio/scanfprobs.html.
tonybest Δημοσ. 29 Οκτωβρίου 2011 Μέλος Δημοσ. 29 Οκτωβρίου 2011 Σε μένα δουλεύει κανονικά, αν και υποφέρει από το κλασικό θέμα των έξτρα σκουπιδιών στη κύρια είσοδο (το ENTER σε αυτή τη περίπτωση). Όπως και να έχει, αυτά που γράφω στο link είναι ο ενδεδειγμένος τρόπος διαβάσματος της κύριας εισόδου στη C. Εδώ και από το επίσημο FAQ της γλώσσας: http://c-faq.com/std...canfprobs.html. { int n,i,j; char str[100]; char final[100]; int count; int z; int countX; int flag2=1; int flag=0; printf("Give the number of words (or sentences)\nthat you would like to check if they are palindromes: "); scanf("%d", &n); for(i=0 ; i<n ; i++) { flag=0; flag2=1; count=0; countX=0; printf("Give word(or sentence) %d: ", i+1); scanf("%s" , str); for (j=0 ; j<strlen(str) ; j++) { if(str[j]!=' ') { final[count]=str[j]; count++; }int count; } countX=count; final[count]='\0'; if(count%2==0) {int y=0; for(z=0 ; z<count/2 ; z++) { if((final[y]==final[countX-1]) && (flag2==1)) {flag=1; y++; countX--; } else {flag2=0;} } } else {int y=0; for(z=0 ; z<count/2 ; z++) { if((final[y]==final[countX-1]) && flag2==1) {flag=1; y++; countX--; } else{flag2=0;} } } if((flag==1 && flag2!=0 ) || strlen(str)==1) { printf("Input is a palindrome\n"); } else { printf("Input is not a palindrome\n"); } } return 0; } Στη γραμμή 14 είναι το πρόβλημα μου. Καν' το compile και θα τρέξ' το. Του δίνεις μια λέξη ή πρόταση και λέει άμα είναι παλίνδρομο(διαβάζεται και ανάποδα). Άμα δώσεις "maoam" θα πει ότι είναι, άμα του δώσεις 'neveroddoreven" το ίδιο, αλλά άμα δώσεις "never odd or even" θα πει όχι(επειδή θα κρατήσει την πρώτη μόνο λέξη και μετά το space τίποτα). Δηλαδή άμα δώσεις "maoam huifsdhuhsai" θα σου πει ότι είναι διότι θα ελέγξει μόνο το "maoam".
migf1 Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 Βάζε τον κώδικα μέσα σε [ code ] .. [ /code ] tags (χωρίς τα κενά) γιατί έτσι δεν διαβάζεται! ΥΓ. Αυτή και αρκετές άλλες συναρτήσεις διαχείρισης strings μπορείς να βρεις μαζί με τον πηγαίο κώδικα σε μια βιβλιοθήκη που έχω ξεκινήσει να φτιάχνω (δεν είναι ακόμα έτοιμη, αλλά ήδη περιέχει αρκετές χρήσιμες συναρτήσεις). Η συνάρτηση που θέλεις είναι η: s_ispalindrome( const char *s ); με τον παρακάτω κώδικα: > /* ------------------------------------------------------------------------------- * int s_ispalindrome( const char *s ) * * ------------------------------------------------------------------------------- */ int s_ispalindrome( const char *s ) { register char *cp1 = NULL, *cp2 = NULL; if ( !s || !*s ) /* early exit */ return 0; cp2 = (char *)s + strlen(s) - 1; /* set cp2 at end of s */ for (cp1=(char *)s; cp1 < cp2 && *cp1 == *cp2; cp1++, cp2--) ; return (cp1 >= cp2); } Αν θες να δουλεύει αγνοώντας τα κενά ανάμεσα στις λέξεις, μπορείς να την χρησιμοποιήσεις σε συνδυασμό με την s_stripspaces( char *s ); Π.χ.: > int boolean = s_ispalindrome( s_stripspaces( string ) );
tonybest Δημοσ. 29 Οκτωβρίου 2011 Μέλος Δημοσ. 29 Οκτωβρίου 2011 Βάζε τον κώδικα μέσα σε [ code ] .. [ /code ] tags (χωρίς τα κενά) γιατί έτσι δεν διαβάζεται! ΥΓ. Αυτή και αρκετές άλλες συναρτήσεις διαχείρισης strings μπορείς να βρεις μαζί με τον πηγαίο κώδικα σε μια βιβλιοθήκη που έχω ξεκινήσει να φτιάχνω (δεν είναι ακόμα έτοιμη, αλλά ήδη περιέχει αρκετές χρήσιμες συναρτήσεις). Η συνάρτηση που θέλεις είναι η: s_ispalindrome( const char *s ); με τον παρακάτω κώδικα: > /* ------------------------------------------------------------------------------- * int s_ispalindrome( const char *s ) * * ------------------------------------------------------------------------------- */ int s_ispalindrome( const char *s ) { register char *cp1 = NULL, *cp2 = NULL; if ( !s || !*s ) /* early exit */ return 0; cp2 = (char *)s + strlen(s) - 1; /* set cp2 at end of s */ for (cp1=(char *)s; cp1 < cp2 && *cp1 == *cp2; cp1++, cp2--) ; return (cp1 >= cp2); } Αν θες να δουλεύει αγνοώντας τα κενά ανάμεσα στις λέξεις, μπορείς να την χρησιμοποιήσεις σε συνδυασμό με την s_stripspaces( char *s ); Π.χ.: > int boolean = s_ispalindrome( s_stripspaces( string ) ); Επειδή το έχω ως άσκηση και δεν έχουμε μάθει κάποια από αυτά που λες, υπάρχει άλλος τρόπος, πιο απλός; Αλλά γιατί να μην δέχεται το space ως χαρακτήρα, αφου χαρακτήρας είναι, πρέπει sony και καλά να δώσω κάποιον άλλο.
migf1 Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 Βάλε τον κώδικά σου μέσα σε [ code ] tags στο προηγούμενο post σου για να μπορέσω να τον διαβάσω, γιατί έτσι θα βγάλω τα μάτια μου (και δεν είμαι σε τέτοια φάση τώρα )
tonybest Δημοσ. 29 Οκτωβρίου 2011 Μέλος Δημοσ. 29 Οκτωβρίου 2011 Βάλε τον κώδικά σου μέσα σε [ code ] tags στο προηγούμενο post σου για να μπορέσω να τον διαβάσω, γιατί έτσι θα βγάλω τα μάτια μου (και δεν είμαι σε τέτοια φάση τώρα ) > #include <stdio.h> #include <string.h> int main(void) { int n,i,j; char str[100]; char final[100]; int count; int z; int countX; int flag2=1; int flag=0; printf("Give the number of words (or sentences)\nthat you would like to check if they are palindromes: "); scanf("%d", &n); for(i=0 ; i<n ; i++) { flag=0; flag2=1; count=0; countX=0; printf("Give word(or sentence) %d: ", i+1); scanf("%s" , str); for (j=0 ; j<strlen(str) ; j++) { if(str[j]!=' ') { final[count]=str[j]; count++; }int count; } countX=count; final[count]='\0'; if(count%2==0) {int y=0; for(z=0 ; z<count/2 ; z++) { if((final[y]==final[countX-1]) && (flag2==1)) {flag=1; y++; countX--; } else {flag2=0;} } } else {int y=0; for(z=0 ; z<count/2 ; z++) { if((final[y]==final[countX-1]) && flag2==1) {flag=1; y++; countX--; } else{flag2=0;} } } if((flag==1 && flag2!=0 ) || strlen(str)==1) { printf("Input is a palindrome\n"); } else { printf("Input is not a palindrome\n"); } } return 0; }
migf1 Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 Φίλε tonybest, γίνεται ένας χαμός εκεί μέσα... απορώ πως βγάζεις άκρη κι εσύ ο ίδιος (ακαταλαβίστικα ονόματα μεταβλητών, κυκεώνας από if-else, σχόλια πουθενά, κλπ) Τέσπα, το 1ο σου πρόβλημα είναι η scanf()... σου έχω δώσει ήδη 2 σχετικά links για το πως να διαβάζεις την κύρια είσοδο στη C χωρίς τη scanf() ... στην προκειμένη περίπτωση, το πρόβλημα σου είναι πως η scanf() έτσι όπως την έχεις δεν διαβάζει κενά διαστήματα μέσα στο str (τα απορρίπτει)... βασικά διαβάζει μόνο την 1η λέξη (ένα από τα πολλά "προβλήματα" με τη scanf() ) Το 2ο σου πρόβλημά είναι ο αχρείαστα πολύπλοκος αλγόριθμος ! Για να βρεις αν ένα string είναι παλινδρομικό ή όχι, αρκεί να βάλεις έναν δείκτη στην αρχή του κι έναν δεύτερο στο τέλος του (αν δεν έχετε μάθει δείκτες, μπορείς να το κάνεις με 2 ακέραιους μετρητές, π.χ. i και j). Κατόπιν αρχίζεις να αυξάνεις τον 1ο και να μειώνεις τον 2ο μέχρι να συναντηθούν ή μέχρι να μην περιέχουν ίδιους χαρακτήρες ΥΓ1. Btw, ο τρέχων κώδικάς σου, το string "aabb" το δίνει εσφαλμένα ως μη-παλινδρομικό.
tonybest Δημοσ. 29 Οκτωβρίου 2011 Μέλος Δημοσ. 29 Οκτωβρίου 2011 Φίλε tonybest, γίνεται ένας χαμός εκεί μέσα... απορώ πως βγάζεις άκρη κι εσύ ο ίδιος (ακαταλαβίστικα ονόματα μεταβλητών, κυκεώνας από if-else, σχόλια πουθενά, κλπ) Τέσπα, το 1ο σου πρόβλημα είναι η scanf()... σου έχω δώσει ήδη 2 σχετικά links για το πως να διαβάζεις την κύρια είσοδο στη C χωρίς τη scanf() ... στην προκειμένη περίπτωση, το πρόβλημα σου είναι πως η scanf() έτσι όπως την έχεις δεν διαβάζει κενά διαστήματα μέσα στο str (τα απορρίπτει)... βασικά διαβάζει μόνο την 1η λέξη (ένα από τα πολλά "προβλήματα" με τη scanf() ) Το 2ο σου πρόβλημά είναι ο αχρείαστα πολύπλοκος αλγόριθμος ! Για να βρεις αν ένα string είναι παλινδρομικό ή όχι, αρκεί να βάλεις έναν δείκτη στην αρχή του κι έναν δεύτερο στο τέλος του (αν δεν έχετε μάθει δείκτες, μπορείς να το κάνεις με 2 ακέραιους μετρητές, π.χ. i και j). Κατόπιν αρχίζεις να αυξάνεις τον 1ο και να μειώνεις τον 2ο μέχρι να συναντηθούν ή μέχρι να μην περιέχουν ίδιους χαρακτήρες ΥΓ1. Btw, ο τρέχων κώδικάς σου, το string "aabb" το δίνει εσφαλμένα ως μη-παλινδρομικό. aabb και bbaa διαφέρουν. μήπως ξέρεις τι να κάνω με τη scanf; Μη σε πειράζει ο μακρύς κώδικας μου, αφού σωστός είναι...
migf1 Δημοσ. 29 Οκτωβρίου 2011 Δημοσ. 29 Οκτωβρίου 2011 aabb και bbaa διαφέρουν. μήπως ξέρεις τι να κάνω με τη scanf; Ουπς, σωστά... μάλλον τα 'παιξα από το πολύ coding Για την scanf() σου έχω δώσει links σε προηγούμενο post μου Μη σε πειράζει ο μακρύς κώδικας μου, αφού σωστός είναι... Το "σωστός" είναι σχετικό, διότι είναι τελείως inefficient ... μπορεί να τρέχει και 1000 φορές πιο αργά από τον νορμάλ αλγόριθμο που σου έγραψα (μόνο και μόνο που υπολογίζεις το strlen(str) μέσα στο 1o for-loop σε κάθε επανάληψη, δηλαδή για κάθε χαρακτήρα του str, καταλαβαίνεις τι γίνεται... αν π.χ. δώσεις λέξη με 15 γράμματα, μόνο & μόνο για να της αφαιρέσεις τα κενά, κάνεις 15 *15 επαναλήψεις !!!!!!!!!!!!!!
tonybest Δημοσ. 30 Οκτωβρίου 2011 Μέλος Δημοσ. 30 Οκτωβρίου 2011 Ουπς, σωστά... μάλλον τα 'παιξα από το πολύ coding Για την scanf() σου έχω δώσει links σε προηγούμενο post μου Το "σωστός" είναι σχετικό, διότι είναι τελείως inefficient ... μπορεί να τρέχει και 1000 φορές πιο αργά από τον νορμάλ αλγόριθμο που σου έγραψα (μόνο και μόνο που υπολογίζεις το strlen(str) μέσα στο 1o for-loop σε κάθε επανάληψη, δηλαδή για κάθε χαρακτήρα του str, καταλαβαίνεις τι γίνεται... αν π.χ. δώσεις λέξη με 15 γράμματα, μόνο & μόνο για να της αφαιρέσεις τα κενά, κάνεις 15 *15 επαναλήψεις !!!!!!!!!!!!!! Σε αυτό το σημείο που βρισκόμαστε δε μας πειράζει...
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα