christian-ago Δημοσ. 8 Μαρτίου 2010 Δημοσ. 8 Μαρτίου 2010 Αυτο που θελω να κανω στο προγραμμα ειναι να διαβαζει μια συμβολοσειρα που δινει ο χρηστης και αν αυτη περιέχει χαρακτήρα διάφορο του 'x' ή του 'y' να τον πληροφορει οτι ειναι λαθος. Αν παλι, ειναι σωστη η συμβολοσειρά, μια συναρτηση θα μετραει τις εμφανισεις του y. Και αν ειναι ζυγος ο αριθμος των εμφανισεων, να εκτυπωνει μηνυμα επιτυχιας. Το προβλημα δεν το εχω, νομιζω, στη συμβολοσειρα, οσο στο οτι καλειται η παραπανω συναρτηση ακομα και αν η συμβολοσειρα ειναι λαθος. Eγω θελω να καλειται μονον οταν η συμβολοσειρα ειναι σωστη, δηλαδη περιεχει x ή y. Εχω τροποποιησει δεκαδες φορες τον κωδικα, πραγματικα δεν ξερω τι φταιει. >#include <iostream> #include <string> using namespace std; void even (int number); int main(int argc, char *argv[]) { int i=0, k=0, n=0; string temp; cout<<"Please insert a string :"<<"\n"; getline (cin, temp); i = temp.length(); for (n; n<i; n++) { if ((temp.at(n)!='x') && (temp.at(n)!='y')) cout<<"Error"<<endl; break; } for (n; n<i; n++) if (temp.at(n)=='y') k++; even(k); } void even (int number) { if (number%2==0) cout<<"Sucess"<<endl; else cout<<"Failure"<<endl; }
papalive Δημοσ. 8 Μαρτίου 2010 Δημοσ. 8 Μαρτίου 2010 Με μια ματια στον κωδικα σου μπορω να πω οτι κουραστηκα. Ο αινσταιν ειπε:κανε τα πραγματα απλα ...πιο απλα αλλα μέχρι εκει. Αυτο που σου λέω εγω είναι να απλοποιησεις τον κώδικα γιατι σε ενα ευκολο πρόβλημα ψάχνεις δυσκολες λύσεις. Και δεν ειναι σωστο να καλεις κάθε φορά την function.Τρώς χρόνο. Απλά όσο πιο απλά γίνεται.
parsifal Δημοσ. 8 Μαρτίου 2010 Δημοσ. 8 Μαρτίου 2010 > for (n; n<i; n++) { if ((temp.at(n)!='x') && (temp.at(n)!='y')) cout<<"Error"<<endl; break; } Έχεις λογικό λάθος εδώ. Σύμφωνα με την εκφώνησή σου, αν φτάσεις στο "Error", το πρόγραμμά σου θα έπρεπε και να τερματίσει. Εσύ όμως κάνεις απλά break από το for loop, οπότε το πρόγραμμα θα συνεχίσει και θα εκτελεστούν και όλες οι επόμενες εντολές (2ο for loop κλπ). Κανονικά, θα ήθελες κάτι σαν το παρακάτω: > for (n; n<i; n++) if ((temp.at(n)!='x') && (temp.at(n)!='y')) { cout << "Error" << endl; return 1; } Επίσης: 1. Γιατί δύο for loops; Αυτό που θέλεις να κάνεις βγαίνει πολύ εύκολα και με ένα 2. Το indentation στη γραμμή όπου καλείς τη συνάρτηση even είναι λίγο off. Μπέρδεψες και τον φίλο papalive που νόμισε ότι καλείται πολλές φορές
christian-ago Δημοσ. 8 Μαρτίου 2010 Μέλος Δημοσ. 8 Μαρτίου 2010 Θελω το προγραμμα να πληροφορει το χρηστη οτι η συμοβoλοσειρα που εδωσε ειναι λαθος και να σταματαει εκει, στο μηνυμα λαθους, δεν θελω να κανει εξοδο απο το προγραμμα. Κι επισης αυτο που λες, η συναρτηση even θελω να καλειται μια φορα μονο, οταν η συμβολοσειρα ειναι σωστη. Ειναι μοιραια τα λαθη μου αλλα καταλαβετε οτι ειναι ουτε ενας μηνας που μαθαινω C++.
virxen75 Δημοσ. 8 Μαρτίου 2010 Δημοσ. 8 Μαρτίου 2010 αν κατάλαβα καλά τι θες πρέπει να είναι αυτό > #include <iostream> #include <string> using namespace std; void even (int number); int main(int argc, char *argv[]){ int i=0, k=0, n=0; int error=0; string temp; cout<<"Please insert a string :"<<"\n"; getline (cin, temp); i = temp.length(); for (n=0;n<i;n++){ if ((temp.at(n)!='x') && (temp.at(n)!='y')){ cout<<"Error you must suply string with x,y only."<<endl; error=1; break; } } if (error==0){ for (n=0; n<i; n++) if (temp.at(n)=='y') k++; even(k); } getchar();getchar(); } void even (int number){ if (number%2==0) cout<<"Sucess"<<endl; else cout<<"Failure"<<endl; }
christian-ago Δημοσ. 8 Μαρτίου 2010 Μέλος Δημοσ. 8 Μαρτίου 2010 Ναι αυτο ακριβως ειναι, virxen75, πραγματικα με εχεις βοηθησει παρα πολυ. Απ' οτι καταλαβα ειναι παντα καλο να αρχικοποιουμε τις μεταβλητες. Τι αλλα λαθη τραγικα ειχα γιατι ανησυχω μηπως τα ξανακανω. Ευχαριστω και παλι.
parsifal Δημοσ. 8 Μαρτίου 2010 Δημοσ. 8 Μαρτίου 2010 Θελω το προγραμμα να πληροφορει το χρηστη οτι η συμοβoλοσειρα που εδωσε ειναι λαθος και να σταματαει εκει, στο μηνυμα λαθους, δεν θελω να κανει εξοδο απο το προγραμμα. Το «να σταματάει εκεί» που γράφεις δε βγάζει και πολύ νόημα! Να σταματάει μέχρι ο χρήστης να κάνει τί; Να πατήσει κάποιο πλήκτρο; Δεν καταλαβαίνω τη λογική πίσω από αυτό. Μήπως εκτελείς το πρόγραμμά σου μέσα από κάποιο IDE (ολοκληρωμένο περιβάλλον ανάπτυξης) και το παράθυρο κονσόλας κλείνει αμέσως μετά τον τερματισμό του προγράμματος, γι' αυτό και «τσίνισες» μόλις διάβασες τη λέξη «τερματισμός»; Επειδή θεωρείς ότι θα κλείσει το παράθυρο πριν προλάβει ο χρήστης να διαβάσει το μήνυμα λάθους; Αν ναι, τότε χρησιμοποιείς σε εκείνο το σημείο τις δύο διαδοχικές getchar που έχει βάλει και ο virxen75. Ή έναν system-specific τρόπο για το «πάγωμα» της εκτέλεσης (π.χ. σε περιβάλλον Windows μπορείς με system("pause"); )
virxen75 Δημοσ. 9 Μαρτίου 2010 Δημοσ. 9 Μαρτίου 2010 Το «να σταματάει εκεί» που γράφεις δε βγάζει και πολύ νόημα! Να σταματάει μέχρι ο χρήστης να κάνει τί; Να πατήσει κάποιο πλήκτρο; Δεν καταλαβαίνω τη λογική πίσω από αυτό. Μήπως εκτελείς το πρόγραμμά σου μέσα από κάποιο IDE (ολοκληρωμένο περιβάλλον ανάπτυξης) και το παράθυρο κονσόλας κλείνει αμέσως μετά τον τερματισμό του προγράμματος, γι' αυτό και «τσίνισες» μόλις διάβασες τη λέξη «τερματισμός»; Επειδή θεωρείς ότι θα κλείσει το παράθυρο πριν προλάβει ο χρήστης να διαβάσει το μήνυμα λάθους; Αν ναι, τότε χρησιμοποιείς σε εκείνο το σημείο τις δύο διαδοχικές getchar που έχει βάλει και ο virxen75. Ή έναν system-specific τρόπο για το «πάγωμα» της εκτέλεσης (π.χ. σε περιβάλλον Windows μπορείς με system("pause"); ) εγώ πάντως κατάλαβα ότι θέλει να εντοπίσει το λάθος ότι δηλαδή δεν είναι όλοι οι χαρακτήρες χ ή y και να προσπεράσει τον κώδικα που λέει αν τα y είναι ζυγά χωρίς να τερματίσει το πρόγραμμα (π.χ. exit(1); , return 0;) θέλει με απλά λόγια να δημιουργήσει ένα goto . Προφανώς μετά από αυτό θα υπάρχει και άλλος κώδικας να εκτελεστεί τον οποίο δεν αναφέρει εδώ.
parsifal Δημοσ. 9 Μαρτίου 2010 Δημοσ. 9 Μαρτίου 2010 Προφανώς μετά από αυτό θα υπάρχει και άλλος κώδικας να εκτελεστεί τον οποίο δεν αναφέρει εδώ. Αν ισχύει κάτι τέτοιο, πάω πάσο!
christian-ago Δημοσ. 9 Μαρτίου 2010 Μέλος Δημοσ. 9 Μαρτίου 2010 Δεν ανεφερα τον κωδικα για το pause στην οθονη, το: > system("PAUSE"); return EXIT_SUCCESS; Αλλα δεν ηταν αυτο το σημαντικο. Αυτο που ηθελα στην ουσια ειναι να φευγει απο το πρωτο loop, γιατι τη βαση του προγραμματος την ειχα φταξει. Αρχικα δοκιμασα, goto, exit() κλπ. αλλα τελικα ηταν η θεση των μπλοκς.
parsifal Δημοσ. 9 Μαρτίου 2010 Δημοσ. 9 Μαρτίου 2010 OK, καλά το υποπτεύθηκε ο virxen75 τότε. Και η χρήση του "error" flag μπορεί να σε βοηθήσει και στα κατοπινά σημεία του κώδικά σου, αν χρειαστεί ξανά (μετά τη μέτρησης των y) να λάβεις «αποφάσεις» βάσει της «λανθασμένης» ή μη εισόδου.
papalive Δημοσ. 9 Μαρτίου 2010 Δημοσ. 9 Μαρτίου 2010 Σε ενα λάθος μην χτίζεις σωστα πράγματα.Ενημερώστε το παιδί πως είναι λάθος ολα.Απο την στιγμή που ξέρει 5 πράγματα οδηγειστε τον σε δρόμους αντικειμενοστρεφείς.Τωρα καθεστε και του λετε ξέχασα το pause και χεστηκε η φοραδα στο αλονι.Κανει την προσπαθεια του ο νεαρος ξερω αλλα εμαθε το αλφαβητο, ξέρει να λεει Α Β Γ Δ Ε Ζ Η Τ Ι Κ Λ Μ Ν Ξ Ο Π Ρ ... μην του λέτε λέξεις τυπου ΔΕΒΓΖΣ. Στο λάθος σωστο δεν χτιζεται εσεις οι νεαροι παραπανω.Καταλαβατε νεαροι??????????????
parsifal Δημοσ. 9 Μαρτίου 2010 Δημοσ. 9 Μαρτίου 2010 Δείξε κώδικα φίλε να σε νιώσουμε ή έστω, γράψε σε φυσική γλώσσα τον αλγόριθμο που έχεις στο μυαλό σου για τη λύση του προβλήματος του topic starter με πιο απλό/σωστό τρόπο. Καλά τα Αϊνστάινεια δόγματα περί «απλότητας» και οι «Δρόμοι της Αντικειμενοστρέφειας», αλλά ως τώρα δύο μηνύματα έγραψες και τίποτα δεν είπες. Μας τη λες κι από πάνω, ότι βάλαμε τη φοράδα να τα κάνει στο αλώνι και μπερδέψαμε τον topic starter!
papalive Δημοσ. 9 Μαρτίου 2010 Δημοσ. 9 Μαρτίου 2010 Για να μου λες ολα αυτα παει να πει πως δεν καταλαβες τι ηθελα να πω.Με τα δυο μηνυματα αφου δεν καταλαβες τι θελω να πω παει να πει πως εχεις βλαβη.Δεν πειραζει. Κωδικα δεν ξέρω.Τι ειναι ο κωδικας?? Τι ειναι τα διαγραμματα???? ( Καλυτερα που εχω πρόβατα και τα βοσκαω παρα να κάθομαι να postaro τις μαλ..... σου στον ανθρωπο ) Ο δρομος που του δειχνεις νεαρε ειναι λάθος. Μην κάνεις POST γιατι δεν εισαι καλος οδηγος.Θα το τραυματισεις το παιδι.Αρχισε να περνας πλακακια. ΚΑΙ ΔΕΝ ΣΕ ΧΑΡΙΖΩ ΝΕΑΡΕ ΜΟΥ ΤΙΠΟΤΑ.ΕΙΣΑΙ ΝΕΑΡΟΣ ΓΛΥΣΤΡΑΣ ΠΑΝΩ ΣΤΑ ΛΑΔΙΑ ΚΑΙ ΠΑΤΑΣ PAUSE. Σε φυσικη γλωσσα ετσι και αλλιως δεν μπορω να τα γραψω γιατι εισαι καλωδιο και δεν θα καταλαβεις.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.