nikopoul Δημοσ. 4 Μαρτίου 2011 Δημοσ. 4 Μαρτίου 2011 γεια σας παιδια ειχα ξαναγραψει αυτο το μηνυμα χθες αλλα μαλλον το εβαλα σε λαθος θεμα γιαυτο το παραθετω εδω, θα ηθελα αν μπορειτε να με βοηθησετε σε μια ασκηση που εχω, η εκφωνηση ειναι : "Για την αποθήκευση κάθε γραμμής εισόδου θα πρέπει να χρησιμοποιείσετε τη συνάρτηση readline η οποία περιέχεται στον κώδικα pattern.c. Θυμηθείτε ότι ο πίνακας χαρακτήρων που αποθηκεύει τη γραμμή εισόδου περιέχει το χαρακτήρα αλλαγής γραμμής ‘\n’ και, φυσικά, το χαρακτήρα ‘\0’. Υποθέτουμε ότι κάθε γραμμή αποτελείται μόνο από γράμματα (πεζά ή/και κεφαλαία) και σημεία στίξης. 2. Κάθε γραμμή εισόδου ελέγχεται αν είναι παλινδρομική, δηλαδή αν διαβάζεται το ίδιο από τ’ αριστερά προς τα δεξιά και από τα δεξιά προς τ’ αριστερά. Σε αυτή την περίπτωση το πρόγραμμά σας θα πρέπει να τυπώνει το μήνυμα “the line is palindromic”. Προσέξτε όμως ότι το πρόγραμμα θα πρέπει να τυπώνει το παραπάνω μήνυμα όχι μόνο στην περίπτωση που η είσοδος είναι π.χ., το αλφαριθμητικό “anna” αλλά και στην περίπτωση που η γραμμή εισόδου είναι “Anna” ή ακόμα και “A man, a plan, a canal–Panama!”. Υλοποιήστε τον έλεγχο αυτό στη συνάρτηση int ispalindromic(char s[]) η οποία επιστρέφει ένα αν το κείμενο στον πίνακα χαρακτήρων s είναι παλινδρομικό, μη- δέν διαφορετικά. Για τη συνάρτηση αυτή θα σας φανούν χρήσιμες οι συναρτήσεις του αρχείου–επικεφαλίδα ctype.h." ο κωδικας του pattern.c ειναι αυτος #include <stdio.h> #define MAXLINE 1000 /* Function prototypes */ int readline(char s[], int lim); int strindex(char s[], char t[]); int main() { char line[MAXLINE], pattern[] = "ould"; int found = 0; while (readline(line, MAXLINE) > 0) { if (strindex(line, pattern) >= 0) { printf("%s", line); found++; } } return found; } int readline(char s[], int lim) { int c, i = 0; while (--lim > 0 && (c = getchar()) != EOF && c != '\n') s[i++] = c; if (c == '\n') s[i++] = c; s = '\0'; return i; } int strindex(char s[], char t[]) { int i, j, k; for (i = 0; s != '\0'; i++) { for (j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++); if (k > 0 && t[k] == '\0') return i; } return -1; } θα μπορουσε κανεις να μου δωσει ιδεες πως να τη λυσω?? Ειδικα το δευτερο ερωτημα που θελει να κανουμε τον ελεγχο , θα πρεπει να χρησιμοποιησω τιμες απο τον πινακα ASCCI ή να χρησιμοποιήσω την strcmp,η strcmp θεωρει διαφορετικο ενα γραμμα μικρο απο ενα κεφαλαιο ? Ακομα στο πρωτο ερωτημα την readline για να τη χρησιμοποιησω πρεπει να κανω include ολοκληρο το αρχειο ή απλο copy paste? ευχαριστω και συγνωμη για το μεγεθος του μηνυματος ,καθε προταση εκπροσδεκτη.
fotis4u Δημοσ. 4 Μαρτίου 2011 Δημοσ. 4 Μαρτίου 2011 Σχετικά με την strcmp ρίξε μια ματιά στον ακόλουθο σύνδεσμο. Η strcmp συγκρίνει τα Strings σύμφωνα με το μέγεθος με βάση τους χαρακτήρες που αποτελείτε το κάθε String. Εάν θελήσεις να χρησιμοποιήσεις την strcmp θα πρέπει να σπάσεις το String σου στην μέση και κατ' επέκταση να το αντιστρέψεις και να κάνεις την σύγκριση. Διαφορετικά μπορείς να τοποθετήσεις το String σου σε έναν πίνακα και να κάνεις το έλεγχο του πρώτου και του τελευταίου και goes on.
nikopoul Δημοσ. 4 Μαρτίου 2011 Μέλος Δημοσ. 4 Μαρτίου 2011 σε αυτον τον ελεγχο που μου προτηνεις αρκει το == ? Δλδ για παραδειγμα ο ελεγχος if (σ[1]==σ[2]) οπου ο πινακας σ ειναι πινακας αλφαριθμητικων λειτουργει οπως και με τους αριθμους? Αν εχουμε να ελεξουμε πχ χ==Χ το θεωρει ιδιο ή διαφορετικο?
V.I.Smirnov Δημοσ. 4 Μαρτίου 2011 Δημοσ. 4 Μαρτίου 2011 Παρόμοια θέματα έχουν τεθεί εδώ πολλές φορές στο παρελθόν. Θυμάμαι ήδη δυο ή τρία, ψάξε εδώ μέσα και θα βρεις όλο το υλικό να το κάνεις. Αναλυτικά τα βήματα για το δεύτερο ερώτημα (ένας τρόπος) : α) Βρες μια συνάρτηση που γράφει ένα string καρκινικά. (Έχουν παρουσιαστεί ένα σωρό τρόποι εδώ στο insomnia παλιότερα - κι' εγώ έχω δώσει.) β) Πάρε το string που δίνει ο χρήστης και βάλτο σ' ένα άλλο προσωρινό, έστω s1. γ) Κάνε το s1 να έχει μόνο μικρά ή κεφαλαία για να λυθεί το ζήτημα case-sensitive κατά την σύγκριση. (Επίσης έχουν παρουσιαστεί τρόποι εδώ. Υπάρχουν και έτοιμες συναρτήσεις όπως η touppers. δ) Γράψε το s1 καρκινικά με την συνάρτηση που έχεις από το α) και βάλε το σε ένα άλλο προσωρινό string s2. ε) Kάνε και το s2 μόνον μικρά ή κεφαλαία για να λυθεί και εδώ το ζήτημα case-sensitive. ζ) Σύγκρινε τα δυο stringς s1 και σ2. Και γι' αυτό υπάρχει έτοιμη συνάρτηση (strcmp ή κάτι τέτοιο) αν δεν θέλεις να κάνεις δική σου.. Στο ερώτημα σου, post#3, όπως βλέπεις από τα γ), ε) υπάρχει διαχωρισμός πεζών κεφαλαίων : το Χ δεν είναι ίδιο με το x. Καλή επιτυχία...
Evgenios1 Δημοσ. 5 Μαρτίου 2011 Δημοσ. 5 Μαρτίου 2011 Φτιαχνεις δυο αρχεια (name.h name.c) name.h > #ifndef NAME_H #define NAME_H #include <string> #include <ctype.h> #include <stdio.h> void readline(const char *str); int ispalind(const char *str); #endif βλεπε http://en.wikipedia.org/wiki/Include_guard name.c > #include "name.h" void readline(const char *str) { scanf("%[^\n]s",str); } int ispalind(const char *str) { int f = 0,e = strlen(str)-1 , t = e / 2; for(; f < t ; f++,e--) if(tolower(str[f]) != tolower(str[e])) return 0; return 12341234; } τελος στη main σου, χρησιμοποιεις τις συναρτησεις readline ispalind που ειναι στο name.h ( βαζεις #include "name.h" και κανεις compile τη main.c και name.c)
virxen75 Δημοσ. 5 Μαρτίου 2011 Δημοσ. 5 Μαρτίου 2011 1) πρώτα από όλα θα πρέπει να δημιουργήσεις ένα νέο string αφαιρώντας από αυτό που ελέγχεις ότι δεν είναι γράμμα (isalpha) και όλα τα κεφαλαία γράμματα να τα κάνεις πεζά (tolower) Λύσεις =========== 1) strrev,strcmp:αντιστρέφεις το string και ελέγχεις την ισότητα του με το αρχικό 2) με for : ελέγχεις το πρώτο με το τελευταίο,το δευτερο με το προτελευταίο ......αν όλα ίσα τότε είναι καρκινικό 3) με αναδρομή
nikopoul Δημοσ. 8 Μαρτίου 2011 Μέλος Δημοσ. 8 Μαρτίου 2011 ευχαριστω παιδια το ελυσα! Αλλα θα ηθελα να ρωτησω στο post#6 τον Ευγενιο στην name.h εκει που κανει include to string γιατι το κανει? Μηπως ειναι ο pointer που αποθηκευσε το αλφαριθμητικο? ευχαριστω και παλι!!
virxen75 Δημοσ. 9 Μαρτίου 2011 Δημοσ. 9 Μαρτίου 2011 ευχαριστω παιδια το ελυσα! Αλλα θα ηθελα να ρωτησω στο post#6 τον Ευγενιο στην name.h εκει που κανει include to string γιατι το κανει? Μηπως ειναι ο pointer που αποθηκευσε το αλφαριθμητικο? ευχαριστω και παλι!! Link
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.