gl_xristos Δημοσ. 15 Φεβρουαρίου 2011 Δημοσ. 15 Φεβρουαρίου 2011 Καλησπερα.Εχω στησει το Netbeans με mingw και προσπαθω να μαθω την C. Εχω το βιβλιο των Κ&R και προσπαθω να κανω την ασκηση 2.5. Ο σκοπος ειναι να επιστρεφει την πρωτη θεση του αλφαριθμητικου s1 οπου υπαρχει οποιοσδηποτε απο τους χαρακτηρες του s2 ή την τιμη -1 αν δεν υπαρχει κανενας.Υπαρχει ετοιμη εντολη αλλα δεν μου κανει αφενος γιατι επιστρεφει δεικτη που δειχνει στη θεση αυτη και αφετερου γιατι πρεπει το φτιαξω εγω.Το προβλημα ειναι οτι το προγραμμα ελεγχει μονο τον τελευταιο χαρακτηρα αν εχει πολλους. Δηλαδη αν στο s2 βαλω ik. Θα βγαλει -1 και ας υπαρχει το i μεσα. Οριστε το προγραμμα μου. Ευχαρηστω εκ των προτερων. #include <stdio.h> #include <stdlib.h> int any(char s1[],char s2[]); int main(int argc, char** argv) { int c; c = any("geia","ia"); if (c==-1) printf(" %d ",c); else printf(" %c ",c); return (EXIT_SUCCESS); } int any(char s1[],char s2[]) { int i,j; for (j=0;s2[j]!='\0';j++) for(i=0; s1!=s2[j] && s1!= '\0';i++) ; if (s1=='\0') return -1; else return s1; }
MeTaXaS4 Δημοσ. 15 Φεβρουαρίου 2011 Δημοσ. 15 Φεβρουαρίου 2011 μέσα στην any στο else return επιστρέφεις char και όχι int που θα έπρεπε μιας και αυτό περιμένει το πρόγραμμα για κάτι άλλο δεν κοίταξα αν θέλεις κάτι άλλο ξανά λες..
gl_xristos Δημοσ. 16 Φεβρουαρίου 2011 Μέλος Δημοσ. 16 Φεβρουαρίου 2011 Οι char ειναι μικροι ακεραιοι και στις αριθμητικες παραστασεις οι μεταβλητες και οι σταθερες char ειναι ιδιες με int. Οταν ειχα βαλει την any σαν char δεν μπορσουσα να δωσω αποτελεσμα -1. Ετσι σκεφτηκα να τις περασω σε int και αναλογα το ορισμα στην printf να παρω το καταλληλο αποτελεσμα. Χωρις να ειμαι σιγουρος. Διορθωσε με αν κανω καπου λαθος. Ειτε δηλωσω την any ως char ειτε ως int ελεγχει μονο τον τελευταιο χαρακτηρα (δεν ξερω γιατι). Δεν αλλαζει κατι. Εκτος αν μου προτεινες κατι αλλο που δεν καταλαβα. Ευχαρηστω.
mezger Δημοσ. 16 Φεβρουαρίου 2011 Δημοσ. 16 Φεβρουαρίου 2011 for (j=0;s2[j]!='\0';j++)for(i=0; s1!=s2[j] && s1!= '\0';i++) ; Ξέχασες μερικά {}, τα for εκτελούνται διαδοχικά όπως το έχεις γράψει. Και να τα βάλεις δε θα δουλέψει όπως θες, αφού ζητάει την πρώτη θέση του s1 που θα βρεθεί match, πρέπει να το αλλάξεις λίγο. Επίσης άρχισε από τώρα να παίζεις με τον debugger, δηλαδή να προχωράς βήμα βήμα το πρόγραμμα και να κοιτάς κάθε στιγμή τις τιμές των μεταβλητών σου (με breakpoints και watches), θα σε βοηθήσει πολύ.
gl_xristos Δημοσ. 16 Φεβρουαρίου 2011 Μέλος Δημοσ. 16 Φεβρουαρίου 2011 Καταλαβα οτι κατι με τις επαναλαψεις παιζει αλλα δεν το ελυσα ακομα. Το εχω γραψει με διαφορους τροπους αλλα δεν πετυχαινει. Θα μπορουσες να κανεις την διορθωση και να μου πεις γιατι. Ευχαρηστω.
virxen75 Δημοσ. 16 Φεβρουαρίου 2011 Δημοσ. 16 Φεβρουαρίου 2011 εγώ θα το έγραφα έτσι.... > #include <stdio.h> #include <stdlib.h> int any(char s1[],char s2[]); int main(int argc, char** argv) { int c; c = any("geiiaa","ai"); if (c==-1) printf(" %d ",c); else printf(" %d ",c); getchar(); return (EXIT_SUCCESS); } int any(char s1[],char s2[]){ int i,j,min=-1; if (s1==NULL || s2==NULL) return -1; for (j=0;s2[j]!='\0';j++) for(i=0;s1[i]!='\0';i++){ if (s1[i]==s2[j]){ if (min==-1) min=i; else if (i<min) min=i; break; } } return min; }
gl_xristos Δημοσ. 17 Φεβρουαρίου 2011 Μέλος Δημοσ. 17 Φεβρουαρίου 2011 Σας ευχαρηστω ολους για τις απαντησεις σας. Και σ' ευχαρηστω virxen75 για την διορθωση.
dimitris_pa Δημοσ. 22 Φεβρουαρίου 2011 Δημοσ. 22 Φεβρουαρίου 2011 Σας ευχαρηστω ολους για τις απαντησεις σας. Και σ' ευχαρηστω virxen75 για την διορθωση. ελυσες το προβλημα σου ?
gl_xristos Δημοσ. 6 Μαρτίου 2011 Μέλος Δημοσ. 6 Μαρτίου 2011 ελυσες το προβλημα σου ? Ναι το προβλημα λυθηκε. Ευχαρηστω για το ενδιαφερον. Συγνωμη που αργησα να απαντησω τωρα το ειδα.
migf1 Δημοσ. 8 Μαΐου 2011 Δημοσ. 8 Μαΐου 2011 Αν και πολύ καθυστερημένα (σήμερα ανακάλυψα αυτό το υπο-φόρουμ) παραθέτω τη δική μου λύση, υλοποιημένη με pointers (ίσως έχεις φτάσει ήδη στο κεφάλαιο των pointers). Η λογική μοιάζει πολύ με τη δική σου υλοποίηση, αλλά διορθώνω με τη μεταβλητή found το λάθος που κάνεις με τα return στο if-else statement της any() (τα οποία εξαναγκάζουν τη συνάρτηση να τερματίσει μετά από τον έλεγχο μόνο του 1ου χαρακτήρα στο s1). Επίσης, χρησιμοποιώ τη συμπτυγμένη μορφή ( ? : )του if-else, επειδή εκτελείται πιο γρήγορα. Και τέλος, επειδή δεν χρησιμοποιώ integer μετρητές, τη θέση του χαρακτήρα στο s1 σε περίπτωση επιτυχίας την υπολογίζω απευθείας με pointer arithmetic (cp1-s1) Ελπίζω να φανεί χρήσιμο σε κάποιους > #include <stdio.h> // --------------------------------------------------- // επιστρέφει την θέση του πρώτου *s1 που υπάρχει μέσα στο s2, αλλιώς -1 // int any(const char *s1, const char *s2) { const char *cp1, *cp2; int found = -1; if ( !s1 || !s2 ) return -1; for (cp1=s1; *cp1 && found == -1; cp1++) { for (cp2=s2; *cp2 && *cp2 != *cp1; cp2++) ; found = *cp2 ? (cp1-s1) : -1; } return found; } // -------------------------------- int main( void ) { printf("%d", any("geiiaa","ia")); getchar(); return 0; }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.