Title: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 10, 2012, 17:45:51 pm Συζήτηση και απορίες για την πέμπτη εργασία
Να γραφεί το πρόγραμμα στο οποίο να ορίζεται η συνάρτηση nroot(…) η οποία, μέσα από μια αναδρομική (recursive) διαδικασία, υπολογίζει μια πραγματική ρίζα της εξίσωσης f(x)=0 προσεγγίζοντας την με την αναδρομική σχέση xi+1=xi-f(xi)/f’(xi). Από τη σχέση αυτή παράγεται μία ακολουθία τιμών η οποία, κάτω από ορισμένες προϋποθέσεις, συγκλίνει προς μια πραγματική ρίζα της f(x)=0. Σε διαφορετική περίπτωση η ακολουθία αποκλίνει ή οι τιμές της παλινδρομούν. Ως αρχική τιμή για το x0 δίνεται ένας τυχαίος αριθμός. Στο ίδιο πρόγραμμα να οριστεί και η συνάρτηση froot(…) η οποία να υπολογίζει, μέσα από μια αναδρομική (recursive) διαδικασία, μια πραγματική ρίζα της εξίσωσης f(x)=0 προσεγγίζοντας την με την αναδρομική σχέση xi+1 = xi-(xi-xi-1)f(xi)/(f(xi-f(xi-1)). Από τη σχέση αυτή παράγεται μία ακολουθία τιμών η οποία, κάτω από ορισμένες προϋποθέσεις, συγκλίνει προς μια πραγματική ρίζα της f(x)=0. Σε διαφορετική περίπτωση η ακολουθία αποκλίνει ή οι τιμές της παλινδρομούν. Και για τις δύο συναρτήσεις η διαδικασία σταματά όταν θα ισχύει η σχέση |xi+1-xi |<e, όπου e ένας πολύ μικρός θετικός αριθμός που δηλώνει την ακρίβεια της μεθόδου. Ως αρχικές τιμές για το x0 και το x1 δίνονται τυχαίοι αριθμοί. Για να συγκριθούν οι ταχύτητες σύγκλησης προς τη ρίζα των δύο συναρτήσεων, η συνάρτηση main του προγράμματος να τις καλεί για να υπολογίσουν, η κάθε μια χωριστά, τη ρίζα μιας εξίσωσης. Η main να τυπώνει τη ρίζα και τον αριθμό των επαναλήψεων που έκανε η κάθε συνάρτηση για να την προσεγγίσει με την ίδια ακρίβεια e. Η main να τυπώνει ακόμη και τα κατάλληλα μηνύματα στις περιπτώσεις που, για τη συγκεκριμένη εξίσωση, δε μπορεί να εφαρμοστεί ο αλγόριθμός ή η αντίστοιχη ακολουθία δε συγκλείνει προς τη ρίζα. Βοηθητικές παρατηρήσεις: Να μη χρησιμοποιηθούν πουθενά γενικές μεταβλητές. Οι συναρτήσεις να μη διαβάζουν δεδομένα και να μην εκτυπώνουν μηνύματα ή αποτελέσματα Επειδή στην περίπτωση πού δε μπορεί να υπολογιστεί μια πραγματική ρίζα από τις πιο πάνω αναδρομικές σχέσεις η διαδικασία θα συνεχίζεται επ’ άπειρο, να διαβάζεται ένας μέγιστος αριθμός επαναλήψεων για την εφαρμογή του κάθε αλγόριθμου. Η έκφραση f’(xi) είναι η παράγωγος της f(x) για x ίσον με xi Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Utrion on May 11, 2012, 15:37:41 pm Το πρόγραμμα θα πρέπει να γραφεί για να μπορεί να δέχεται οποιαδήποτε πολυωνυμική συνάρτηση ή σε κάποια συγκεκριμένη που έχει μάλλον ξεχαστεί να αναφερθει ποια ειναι ?....
Edit: προφανως ο δεύτερος τύπος είναι xi+1 = xi-(xi-xi-1)f(xi)/(f(xi)-f(xi-1))??. στην εκφωνηση στον παρανομαστή εχει ξεχαστει μια παρένθεση μαλλον Title: Re: [Δομημένος Πρ.] Εργασία E Post by: pap2 on May 11, 2012, 21:30:18 pm την f(x) μας τη δίνει η πρέπει να λύσουμε τη διαφορική από το πρώτο ερώτημα στην nroot???
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: nastia on May 14, 2012, 12:46:48 pm παιδια πως θα ξερουμε ποια ειναι η f(x) και η f '(x)??
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 14, 2012, 13:45:11 pm παιδια πως θα ξερουμε ποια ειναι η f(x) και η f '(x)?? Διαλέγεις εσύ μια συνάρτηση. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: New_Entry on May 15, 2012, 10:30:30 am παιδια πως θα ξερουμε ποια ειναι η f(x) και η f '(x)?? Διαλέγεις εσύ μια συνάρτηση. ^super^ Title: Re: [Δομημένος Πρ.] Εργασία E Post by: gt on May 15, 2012, 11:59:02 am Nαι μαλλον τα παιδια εννοουν αν εμεις θα δινουμε το f(xi) και το f'(xi) η θα πρεπει το προγραμμα να υπολογιζει τις τιμες αυτες πραγμα το οποιο θεωρω λιγο δυσκολο ειδικα για 2ο εξαμηνο...
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Sub-Zero on May 15, 2012, 14:49:47 pm Εκτός αν η άσκηση αναφέρεται σε πολυωνιμικές συναρτήσεις και ο χρήστης δίνει αυτός μέγιστο βαθμό και συντελεστές που θα αποθηκεύονται σε 4 πίνακες, 2 για την συνάρτηση και 2 για την παράγωγο
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: gt on May 15, 2012, 16:27:29 pm Εκτός αν η άσκηση αναφέρεται σε πολυωνιμικές συναρτήσεις και ο χρήστης δίνει αυτός μέγιστο βαθμό και συντελεστές που θα αποθηκεύονται σε 4 πίνακες, 2 για την συνάρτηση και 2 για την παράγωγο Eτσι ειναι αλλα δεν χρειαζονται 4 πινακες...2 ειναι αρκετοι..Επισης παιδια ξερει κανεισ ποια ειναι η συναρτηση της δυναμης...???Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 15, 2012, 18:33:10 pm Εκτός αν η άσκηση αναφέρεται σε πολυωνιμικές συναρτήσεις και ο χρήστης δίνει αυτός μέγιστο βαθμό και συντελεστές που θα αποθηκεύονται σε 4 πίνακες, 2 για την συνάρτηση και 2 για την παράγωγο Eτσι ειναι αλλα δεν χρειαζονται 4 πινακες...2 ειναι αρκετοι..Επισης παιδια ξερει κανεισ ποια ειναι η συναρτηση της δυναμης...???Από τη math.h -> pow(x,y) υπολογισμός του x^y. ---------------------------------------------------- Λοιπόν. Θα διαλέξετε εσείς μια συνάρτηση f και θα υπολογίσετε μόνοι σας την παράγωγό της. Από εκεί και πέρα θα υπολογίζετε τις τιμές της, όπου χρειάζονται. Για παράδειγμα, αν ήθελα να χρησιμοποιήσω τη συνάρτη 3x + 2, θα έκανα το εξής: double f(float x){ return 3*x + 2; } και έπειτα μπορώ να την καλώ για όποια τιμή του x θέλω. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: zidan on May 15, 2012, 21:59:00 pm πως γινεται η συναρτηση να γυριζει δυο τιμες ταυτοχρονα??
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Exomag on May 15, 2012, 22:05:53 pm πως γινεται η συναρτηση να γυριζει δυο τιμες ταυτοχρονα?? Μέσω pointers Title: Re: [Δομημένος Πρ.] Εργασία E Post by: zidan on May 15, 2012, 22:09:50 pm δηλαδη βαζω return σε pointer??
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 15, 2012, 22:13:04 pm δηλαδη βαζω return σε pointer?? H return μπορεί να επιστρέψει μόνο μια τιμή. Αυτό που πρέπει να κάνεις είναι να περάσεις ως ορίσματα της συνάρτησης 2 διευθύνσεις στις οποίες θα αποθηκεύσεις τα αποτελέσματά σου.Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Exomag on May 15, 2012, 22:13:16 pm δηλαδη βαζω return σε pointer?? Αν θες, για παράδειγμα, να αλλάξεις την τιμή ενός counter θα πρέπει να δώσεις στην συνάρτηση τη διεύθυνση του counter και μέσα στην συνάρτηση να αλλάζεις κατευθείαν την τιμή που δείχνει αυτή η διεύθυνση... πχ Code: main { Title: Re: [Δομημένος Πρ.] Εργασία E Post by: alexpaxi on May 16, 2012, 00:41:14 am paidia poia einai h sunarthsh pou theloume na broume tis rizes ths?emeis epilegoume poia tha xrhsimopoihsoume?
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Exomag on May 16, 2012, 00:43:59 am paidia poia einai h sunarthsh pou theloume na broume tis rizes ths?emeis epilegoume poia tha xrhsimopoihsoume? Ναι, όποια θες εσύ... ΥΣ: Να βλέπετε και τα προηγούμενα posts ;) Title: Re: [Δομημένος Πρ.] Εργασία E Post by: alexpaxi on May 16, 2012, 00:46:48 am Τα ειδα αλλα δεν εβγαλα ακρη..thanks anyway..:)
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: jthois on May 16, 2012, 11:34:54 am Παιδιά, εκτός από την f(x), θα δώσουμε και την f '(x);
Γιατί αλλιώς θα πρέπει να την υπολογίσουμε. :-\ Title: Re: [Δομημένος Πρ.] Εργασία E Post by: thanospr on May 16, 2012, 12:03:45 pm Γινεται να το κανουμε με define η οχι? :-[
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Exomag on May 16, 2012, 12:15:15 pm Γινεται να το κανουμε με define η οχι? :-[ Αυτό που θα πρέπει να κάνεις είναι να ορίσεις δύο (μια για την f(x) και μια για την παράγωγο της) δικιές σου συναρτήσεις που να επιστρέφουν τιμές...πχ Code: float f(float x) { Title: Re: [Δομημένος Πρ.] Εργασία E Post by: manos on May 16, 2012, 13:38:29 pm Μήπως η αναδρομική σχέση για την froot θα έπρεπε να είναι xi+1 = xi-(xi-xi-1)f(xi)/(f(xi)-f(xi-1)) και όχι
xi+1 = xi-(xi-xi-1)f(xi)/(f(xi-f(xi-1))? Title: Re: [Δομημένος Πρ.] Εργασία E Post by: thanospr on May 16, 2012, 13:45:56 pm Αμα το κανω μεσα στις nroot και froot πειραζει?
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 16, 2012, 14:11:33 pm Αμα το κανω μεσα στις nroot και froot πειραζει? Δεν νομίζω να υπάρχει πρόβλημα... Αλλά ο τρόπος που λέει ο exomag είναι ο προτεινόμενος από Κορτέσιο και είναι και γενικά καλύτερος από άποψη οργάνωσης του κώδικα. Αλλά όπως και να το κάνεις πιστεύω δεν θα ενοχλήσει κανέναν. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Exomag on May 16, 2012, 14:20:54 pm Αμα το κανω μεσα στις nroot και froot πειραζει? Σκέψου μετά, για παράδειγμα, να θες να αλλάξεις την συνάρτηση f(x). Θα πρέπει να ψάξεις όλο τον κώδικα για να βρεις που (μέσα στις nroot και froot) έχει γράψει τη σχέση της f(x). Ενώ με τον τρόπο που εξήγησα (δήλωση ως ξεχωριστή συνάρτηση) είναι πιο εύκολο/γρήγορο... Μήπως η αναδρομική σχέση για την froot θα έπρεπε να είναι xi+1 = xi-(xi-xi-1)f(xi)/(f(xi)-f(xi-1)) και όχι Ναι, είναι τυπογραφικό...xi+1 = xi-(xi-xi-1)f(xi)/(f(xi-f(xi-1))? Title: Re: [Δομημένος Πρ.] Εργασία E Post by: thanospr on May 16, 2012, 15:12:18 pm Μα εγω ειπα να το κανω με define για να μπορω να αλλαξω μονο τους συντελεστες.Για παραδειγμα 5χ να μπορω να το κανω 3χ.Εσεις αυτο το λετε για να μπορω να αλλαξω την συναρτηση και να βαλω οποια θελω μετα?
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Exomag on May 16, 2012, 15:16:44 pm Μα εγω ειπα να το κανω με define για να μπορω να αλλαξω μονο τους συντελεστες.Για παραδειγμα 5χ να μπορω να το κανω 3χ.Εσεις αυτο το λετε για να μπορω να αλλαξω την συναρτηση και να βαλω οποια θελω μετα? Ναι, εγώ αυτό που λέω είναι για να αλλάξεις εύκολα όλη την συνάρτηση. Βεβαίως και μπορείς να κάνεις define τους συντελεστές που θα χρησιμοποιήσεις στη συνάρτηση για να μπορείς να τους αλλάζεις ευκολότερα... Title: Re: [Δομημένος Πρ.] Εργασία E Post by: thanospr on May 16, 2012, 15:17:57 pm Οκ.Ευχαριστω.
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 16, 2012, 23:29:21 pm Παιδιά, καλό θα ήταν να δείτε και αυτό(ο κώδικας παρακάτω): http://alexander.ee.auth.gr:8083/eTHMMY/archive/102/downloadFile/4471/pr22.cpp
Code: /* Επίλυση της εξίσωσης f(x)=0 με τη μέθοδο Regula-falsi */ Είναι από τα παραδείγματα του Κορτέσιου στο ethmmy. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Exomag on May 16, 2012, 23:43:42 pm Παιδιά, καλό θα ήταν να δείτε και αυτό(ο κώδικας παρακάτω): http://alexander.ee.auth.gr:8083/eTHMMY/archive/102/downloadFile/4471/pr22.cpp Code: /* Επίλυση της εξίσωσης f(x)=0 με τη μέθοδο Regula-falsi */ Είναι από τα παραδείγματα του Κορτέσιου στο ethmmy. Απλά εδώ υλοποιεί την διαδικασία χωρίς αναδρομή, ενώ η εκφώνηση της εργασίας Ε ζητάει ρητά αναδρομή... Title: Re: [Δομημένος Πρ.] Εργασία E Post by: nastia on May 17, 2012, 14:46:25 pm παιδια την f(x) θα την γραψω μεσα στη main??
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Mr K on May 17, 2012, 21:29:34 pm παιδια την f(x) θα την γραψω μεσα στη main?? Καλυτερα μεσα σε μια αλλη συναρτηση (τριτη) για να μπορεις να την αλλαζεις ευκολα αμα θελεις. Ομοιως για την παραγωγο. Αλλα αν δεν σε πολυενδιαφερει ο μελλοντικος χρηστης του προγραμματος σου να διευκολυνεται (!) πετα την στην main.. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Sub-Zero on May 17, 2012, 23:40:47 pm Παίζει κάποιο λάθος στις σχέσεις που δίνει στην εκφώνηση; Δεν βγάζυν και πολύ νόημα...Τα xo και x1 που αναφέροναι;
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Exomag on May 17, 2012, 23:45:52 pm Παίζει κάποιο λάθος στις σχέσεις που δίνει στην εκφώνηση; Δεν βγάζυν και πολύ νόημα...Τα xo και x1 που αναφέροναι; Πέρα απο μια παρένθεση που δεν έκλεισε ο Κορτέσης, δεν έχει λάθος. Τα x0 και x1 αναφέρονται στις τυχαίες αρχικες τιμες που θα δοθούν στην συνάρτηση froot για να ξεκινήσει η αναδρομική διαδικασία... Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Sub-Zero on May 17, 2012, 23:47:44 pm Παίζει κάποιο λάθος στις σχέσεις που δίνει στην εκφώνηση; Δεν βγάζυν και πολύ νόημα...Τα xo και x1 που αναφέροναι; Πέρα απο μια παρένθεση που δεν έκλεισε ο Κορτέσης, δεν έχει λάθος. Τα x0 και x1 αναφέρονται στις τυχαίες αρχικες τιμες που θα δοθούν στην συνάρτηση froot για να ξεκινήσει η αναδρομική διαδικασία... Ναι μλκια μου, βασικα είχα μπερδευτεί με τα +-1 στους τυπους, αλλα προφανως αναφερονται στους δεικτες... Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 18, 2012, 00:06:55 am Ναι.. Βασικά η εργασία υπάρχει και σε .doc στο ethmmy αν μπερδεύεσαι με τους δείκτες.
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: vagus on May 19, 2012, 04:37:30 am Tην f(x) την βαζουμε εμεις στον κωδικα εξ'αρχης ή θα πρεπει με καποιο τροπο να την ζηταει το προγραμμα ;
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Exomag on May 19, 2012, 12:35:25 pm Tην f(x) την βαζουμε εμεις στον κωδικα εξ'αρχης ή θα πρεπει με καποιο τροπο να την ζηταει το προγραμμα ; Εσύ, εξ' αρχής... ΥΣ: Μα καλά, κανείς δεν διαβάζει τα προηγούμενα posts; :o Title: Re: [Δομημένος Πρ.] Εργασία E Post by: vagus on May 19, 2012, 13:40:30 pm Τα διαβασα ενα προς ενα, θελω την απολυτη διευκρινηση για να ειμαι σιγουρος.
Οποιος βαριεται, δεν απαντα. Συνταγματικα κατοχυρωμενο. Σ ευχαριστω για την απαντηση. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Exomag on May 19, 2012, 13:53:59 pm Τα διαβασα ενα προς ενα, θελω την απολυτη διευκρινηση για να ειμαι σιγουρος. Οποιος βαριεται, δεν απαντα. Συνταγματικα κατοχυρωμενο. Σ ευχαριστω για την απαντηση. Σαν συμβουλή το είπα, δεν ήθελα να σε αποπάρω ;) Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Niobe on May 19, 2012, 16:42:35 pm ξερει κανεις αν υπαρχει συναρτηση για παραγωγη τυχαιων αριθμων ??
οχι οτι εχει ιδιαιτερη σημασια απλα ετσι να πουλησουμε λιγο μουρη στον κορτεση :D :D :D :D Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Exomag on May 19, 2012, 16:46:40 pm ξερει κανεις αν υπαρχει συναρτηση για παραγωγη τυχαιων αριθμων ?? οχι οτι εχει ιδιαιτερη σημασια απλα ετσι να πουλησουμε λιγο μουρη στον κορτεση :D :D :D :D Η συνάρτηση παραγωγής ψευδο-τυχαίων αριθμών είναι η rand(), που περιέχεται στην stdlib.h, και για την οποία θα πρέπει να κάνεις seed πρώτα με τη συνάρτηση srand(). Για λεπτομέρειες και παράδειγμα δες εδώ: http://www.cplusplus.com/reference/clibrary/cstdlib/rand/ Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Niobe on May 19, 2012, 18:35:10 pm α)exomag ur my hero
β)πρεπει να διαχωρισουμε την κατασταση που δεν συγκλινουν οι τιμες και την περιπτωση που παλινδρομουν?? (και να τυπωθουν αντιστοιχα στην μαιν)... αα if(ισχυει το β) πως σκατα γινεται ?? Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 19, 2012, 19:04:38 pm α)exomag ur my hero β)πρεπει να διαχωρισουμε την κατασταση που δεν συγκλινουν οι τιμες και την περιπτωση που παλινδρομουν?? (και να τυπωθουν αντιστοιχα στην μαιν)... αα if(ισχυει το β) πως σκατα γινεται ?? Όχι ρε. Βάλε ένα μήνυμα ότι δεν βρήκε ρίζα. Θα ήταν πάρα πολύ δύσκολο αλλιώς. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Niobe on May 19, 2012, 19:15:52 pm α)exomag ur my hero β)πρεπει να διαχωρισουμε την κατασταση που δεν συγκλινουν οι τιμες και την περιπτωση που παλινδρομουν?? (και να τυπωθουν αντιστοιχα στην μαιν)... αα if(ισχυει το β) πως σκατα γινεται ?? Όχι ρε. Βάλε ένα μήνυμα ότι δεν βρήκε ρίζα. Θα ήταν πάρα πολύ δύσκολο αλλιώς. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: autos.gr on May 19, 2012, 22:32:28 pm Η χ0 είναι o τυχαίος αριθμός που θα εισάγουμε η χ1 γιατι χρειάζετε?Είναι η αντίστοιχη αρχική τιμή της froot? :-\
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 19, 2012, 22:34:30 pm Η χ0 είναι o τυχαίος αριθμός που θα εισάγουμε η χ1 γιατι χρειάζετε?Είναι η αντίστοιχη αρχική τιμή της froot? :-\ Για την froot χρειάζεσαι 2 αρχικές τιμές. xi+1 = xi-(xi-xi-1)f(xi)/(f(xi)-f(xi-1)) υπάρχει η xi και η x(i-1) (απλώς δεν φαίνεται εδώ, καλύτερα να δεις την εκφώνηση από τα αρχεία εργασιών στο ethmmy) Title: Re: [Δομημένος Πρ.] Εργασία E Post by: autos.gr on May 19, 2012, 22:44:05 pm Ναι το είδα απο εκεί ευχαριστώ!
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Luffy on May 19, 2012, 23:43:23 pm Ερωτηση: Αφου δε μου επιτρεπει η εκφωνηση να εκτυπωσω μηνυμα μεσα στις συναρτησεις, πως μπορω να εκτυπωσω αυτα τα μηνυματα στη main ?
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 19, 2012, 23:56:45 pm Από τις συναρτήσεις σου θα περνάς στην main κάτι σαν σημαία που θα σου δείχνει αν η συνάρτηση βρήκε ρίζα ή όχι. Ανάλογα με την τιμή της σημαίας θα εκτυπώνεις το μήνυμά σου.
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Exomag on May 20, 2012, 00:02:43 am Ερωτηση: Αφου δε μου επιτρεπει η εκφωνηση να εκτυπωσω μηνυμα μεσα στις συναρτησεις, πως μπορω να εκτυπωσω αυτα τα μηνυματα στη main ? Από τις συναρτήσεις σου θα περνάς στην main κάτι σαν σημαία που θα σου δείχνει αν η συνάρτηση βρήκε ρίζα ή όχι. Ανάλογα με την τιμή της σημαίας θα εκτυπώνεις το μήνυμά σου. Ή απλά φτιάχνεις μια άλλη συνάρτηση που να εκτυπώνει τα κατάλληλα μηνύματα, για να σπάσεις τα νεύρα του Κορτέση :DTitle: Re: [Δομημένος Πρ.] Εργασία E Post by: Luffy on May 20, 2012, 00:05:56 am Δεν καταλαβα ακριβως τι εννοεις αλλα σκεφτηκα κατι αλλο.Μπορεις να κανεις return μια printf με το μηνυμα που θες ή ειναι το ιδιο πραγμα?
Αν μπορεις να μου δωσεις και πληροφοριες για αυτο που λες θα ηταν καλο. :) Και κατι τελευταιο. Η αναδρομη στις συγκεκριμενες συναρτησεις μπορει να γινει αν αλλαζεις το χο σε χ1 και το χ1 σε χ ή ειναι απαραιτητο η συναρτηση να καλει τον εαυτο της ? Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Exomag on May 20, 2012, 00:22:38 am Δεν καταλαβα ακριβως τι εννοεις αλλα σκεφτηκα κατι αλλο.Μπορεις να κανεις return μια printf με το μηνυμα που θες ή ειναι το ιδιο πραγμα? Αν μπορεις να μου δωσεις και πληροφοριες για αυτο που λες θα ηταν καλο. :) Και κατι τελευταιο. Η αναδρομη στις συγκεκριμενες συναρτησεις μπορει να γινει αν αλλαζεις το χο σε χ1 και το χ1 σε χ ή ειναι απαραιτητο η συναρτηση να καλει τον εαυτο της ? Δεν υφίσταται το "να κάνεις return μια printf". Μάλλον δε καταλαβαίνω τι ακριβώς εννοείς... Και, ο ορισμός της αναδρομής είναι μια συνάρτηση που καλεί τον εαυτό της. Οπότε για να είσαι σίγουρος (άλλωστε ποιος ξέρει τι ακριβώς θέλει ο Κορτέσης) κάντο με αυτόν τον τρόπο... Τώρα για το πως να εκτυπώνεις το κατάλληλο μήνυμα, ο καλύτερος τρόπος είναι αυτός που πρότεινε ο c0ndemn3d. Δηλαδή έστω ότι η συνάρτηση επιστρέφει εναν int. Τότε εφόσον βρει τη σωστή ρίζα (θα το ελέγξεις με μια αντίστοιχη συνθήκη) τότε θα επιστρέφει, για παράδειγμα, την τιμή 0. Αλλιώς θα επιστρέφει την τιμή 1. Μετά στην main ανάλογα με την επιστρεφόμενη τιμή (0 ή 1) θα εκτυπώνεις το αντίστοιχο μήνυμα (επιτυχίας ή αποτυχίας εύρεσης ρίζας). Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 20, 2012, 00:26:39 am Λοιπόν θα προσπαθήσω να σου δώσω ένα παράδειγμα. Θέλουμε να βρουμε το πρόσημο ενός αριθμού μέσω μιας συνάρτησης η οποία δεν εκτυπώνει αποτελέσματα.
Code: #include <stdio.h> Οπως βλέπεις, από τη συνάρτηση number, επειδή δεν μπορώ εκεί να εκτυπώσω αποτελέσματα, περνάω έναν αριθμό που μου δείχνει το πρόσημο του x. Ελπίζω να βοηθάω με αυτό το παράδειγμα. Δεν μπορείς να κάνεις return την printf καθώς η printf είναι συνάρτηση και όχι τιμή. Πριν καλέσεις τη συνάρτηση για αναδρομή, θα πρέπει να αλλάξεις τα χ1 και χ0. Το ότι η συνάρτηση θα καλεί τον εαυτό της δεν σημαίνει ότι οι τιμές που θα δίνονται σαν ορίσματα θα είναι πάντα ίδιες. Code: x = x1-((x1-x0)*p(x1)/(p(x1)-p(x0))); Ελπίζω να μην σε μπέρδεψα παραπάνω. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Luffy on May 20, 2012, 00:34:34 am Ευχαριστω αγορινα. Τα κανες αρκετα πιο λιανα. ^beer^
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Sub-Zero on May 20, 2012, 01:25:12 am Ρε παιδιά το ίδιο δεν είναι να βάλουμε fabs(x-x1)<e αντί για (x1<x?x-x1:x1-x)<e ???
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 20, 2012, 01:27:42 am Ρε παιδιά το ίδιο δεν είναι να βάλουμε fabs(x-x1)<e αντί για (x1<x?x-x1:x1-x)<e ??? Ναι. Υπάρχουν πολλοί τρόποι. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Marco on May 20, 2012, 17:04:49 pm " Επειδή στην περίπτωση πού δε μπορεί να υπολογιστεί μια πραγματική ρίζα από τις πιο πάνω αναδρομικές σχέσεις η διαδικασία θα συνεχίζεται επ’ άπειρο, να διαβάζεται ένας μέγιστος αριθμός επαναλήψεων για την εφαρμογή του κάθε αλγόριθμου. "
Αυτό γίνεται με exit(0); Code: if(num_rep=100) Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 20, 2012, 17:08:34 pm " Επειδή στην περίπτωση πού δε μπορεί να υπολογιστεί μια πραγματική ρίζα από τις πιο πάνω αναδρομικές σχέσεις η διαδικασία θα συνεχίζεται επ’ άπειρο, να διαβάζεται ένας μέγιστος αριθμός επαναλήψεων για την εφαρμογή του κάθε αλγόριθμου. " H exit θα τερματίσει τη λειτουργία του προγράμματος. Άρα δεν είναι σωστή λύση. Αυτό που πρέπει να κάνεις είναι, αν βρεις ότι οι επαναλήψεις ξεπέρασαν το όριο, να αλλάζεις την τιμή μιας σημαίας την οποία θα ορίσεις και να επιστρέψεις στη main και κάνοντας χρήση της τιμής αυτής της σημαίας να εκτυπώσεις ότι δεν βρέθηκε ρίζα.Αυτό γίνεται με exit(0); Code: if(num_rep=100) Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 20, 2012, 17:30:18 pm Επειδή έχω μπερδευτεί λίγο!!Επειδή θέλουμε αναδρομική διαδικασία αντί για while όπως στο παραπάνω παράδειγμα απλά θα καλούμε ξανά τη ιδια συνάρτηση?? Ναι. Κάθε φορά θα ελέγχεις αν έχεις βρει ρίζα για την εξίσωση και, αν όχι, θα καλείς ξανά τη συνάρτηση για διαφορετικά, όμως, x0 και x1. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: anchelon on May 20, 2012, 17:32:52 pm Επειδή έχω μπερδευτεί λίγο!!Επειδή θέλουμε αναδρομική διαδικασία αντί για while όπως στο παραπάνω παράδειγμα απλά θα καλούμε ξανά τη ιδια συνάρτηση?? Ναι. Κάθε φορά θα ελέγχεις αν έχεις βρει ρίζα για την εξίσωση και, αν όχι, θα καλείς ξανά τη συνάρτηση για διαφορετικά, όμως, x0 και x1. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Marco on May 20, 2012, 17:50:08 pm " Επειδή στην περίπτωση πού δε μπορεί να υπολογιστεί μια πραγματική ρίζα από τις πιο πάνω αναδρομικές σχέσεις η διαδικασία θα συνεχίζεται επ’ άπειρο, να διαβάζεται ένας μέγιστος αριθμός επαναλήψεων για την εφαρμογή του κάθε αλγόριθμου. " H exit θα τερματίσει τη λειτουργία του προγράμματος. Άρα δεν είναι σωστή λύση. Αυτό που πρέπει να κάνεις είναι, αν βρεις ότι οι επαναλήψεις ξεπέρασαν το όριο, να αλλάζεις την τιμή μιας σημαίας την οποία θα ορίσεις και να επιστρέψεις στη main και κάνοντας χρήση της τιμής αυτής της σημαίας να εκτυπώσεις ότι δεν βρέθηκε ρίζα.Αυτό γίνεται με exit(0); Code: if(num_rep=100) Το πως θα επιστρέψω στη main είναι το θέμα. πχ σαν flag χρησιμοποιώ την *num_rep που μετράει επαναλήψεις Code: if(*num_rep==100) Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 20, 2012, 17:55:50 pm H σημαία σου δεν θα είναι η *num_rep. Αν έχεις ορίσει μια συνάρτηση double που θα επιστρέφει τη ρίζα κάνε το εξής:
if(*num_rep==100) /* *num_rep είναι ο μετρητής των αναδρομών και χρειάζεται να επιστρέφεται */ { *flag=1; /*εκχωρώ μια τιμη η οποία συμβολίζει ότι δεν βρέθηκε ρίζα*/ return 0;/*επιστρέφω μια αυθαίρετη τιμή*/ } Αν τη συνάρτησή σου την έχεις ορίσει ως void απλά γράψε return; και μετά στη main: if(*flag == 1) { ... printf("Could not find a root"); } Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Marco on May 20, 2012, 18:19:52 pm H σημαία σου δεν θα είναι η *num_rep. Αν έχεις ορίσει μια συνάρτηση double που θα επιστρέφει τη ρίζα κάνε το εξής: if(*num_rep==100) /* *num_rep είναι ο μετρητής των αναδρομών και χρειάζεται να επιστρέφεται */ { *flag=1; /*εκχωρώ μια τιμη η οποία συμβολίζει ότι δεν βρέθηκε ρίζα*/ return 0;/*επιστρέφω μια αυθαίρετη τιμή*/ } Αν τη συνάρτησή σου την έχεις ορίσει ως void απλά γράψε return; και μετά στη main: if(*flag == 1) { ... printf("Could not find a root"); } Η συνάρτηση μου είναι void Αν εννοείς αυτό τότε δεν τερματίζει απλά με ένα return... if(*num_rep==100) { return; } Όσο για τη main έτσι πως είναι το πρόγραμμα δε νομίζω να χρειάζεται flag. if(repetitions!=100) { ........} else { printf("nroot function cant calculate roots"); printf("froot function cant calculate roots"); } Τέλος πάντων….. μάλλον θα το στείλω έτσι. thx anyway :) Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Locke on May 20, 2012, 18:23:23 pm Όταν θα θέλω η nroot π.χ. να καλέσει τον εαυτό της, μέσα στο σώμα της συνάρτησης που θα ξαναγράψω την nroot, τι θα βάλω σαν όρισμα στη θέση της συνάρτησης f που θέλω να χρησιμοποιήσω;
παράδειγμα αν είναι float nroot(float (*p)(float x), int κτλπ ... ) { μπλα μπλα μπλα nroot( <--- εδώ τι βάζουμε σαν όρισμα; το p; Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Marco on May 20, 2012, 18:30:10 pm Όταν θα θέλω η nroot π.χ. να καλέσει τον εαυτό της, μέσα στο σώμα της συνάρτησης που θα ξαναγράψω την nroot, τι θα βάλω σαν όρισμα στη θέση της συνάρτησης f που θέλω να χρησιμοποιήσω; παράδειγμα αν είναι float nroot(float (*p)(float x), int κτλπ ... ) { μπλα μπλα μπλα nroot( <--- εδώ τι βάζουμε σαν όρισμα; το p; ναι αλλά νομίζω το float (*p)(float x) πρέπει να το αλλάξεις με float (*p)(float) Title: Re: [Δομημένος Πρ.] Εργασία E Post by: anchelon on May 20, 2012, 18:51:37 pm ξέρει κανείς τι σημαίνει το εξής:" warning: passing arg 7 of `froot' from incompatible pointer type"??δν μπορώ να βρω κάποιο λάθος...
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 20, 2012, 18:57:51 pm Όταν θα θέλω η nroot π.χ. να καλέσει τον εαυτό της, μέσα στο σώμα της συνάρτησης που θα ξαναγράψω την nroot, τι θα βάλω σαν όρισμα στη θέση της συνάρτησης f που θέλω να χρησιμοποιήσω; Εξαρτάται από την περίπτωση. Αν θες στείλε μου τα ορίσματα της nroot από τη main και τα ορίσματα της nroot όταν την ορίζεις και θα σου πω :)παράδειγμα αν είναι float nroot(float (*p)(float x), int κτλπ ... ) { μπλα μπλα μπλα nroot( <--- εδώ τι βάζουμε σαν όρισμα; το p; -------------------------------------------------------------- alex, από ότι νομίζω, πρέπει να επιστρέψεις διαφορετικό μήνυμα στις περιπτώσεις που ο αλγόριθμος δεν μπορεί να εφαρμοστεί και που μπορεί να εφαρμοστεί αλλά δεν βρίσκει ρίζα. Και μόνο για αυτό θα χρειαζόσουν σημαία. Αλλά έστω ότι στην nroot σε μια επανάληψη βρίσκεις ότι η παράγωγος του x0 βγαίνει 0. Τότε πρέπει να επιστρέψεις στη main χωρίς να έχεις βρει ρίζα και με τον έλεγχό σου το πρόγραμμα θα συμπεριφερθεί σαν να έχει βρει ρίζα. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 20, 2012, 18:59:44 pm ξέρει κανείς τι σημαίνει το εξής:" warning: passing arg 7 of `froot' from incompatible pointer type"??δν μπορώ να βρω κάποιο λάθος... Στο έβδομο όρισμα της froot ο τύπος της μεταβλητής που περνάς σαν όρισμα όταν την καλείς είναι διαφορετικός από αυτόν με τον οποίο έχεις ορίσει τη συνάρτηση. Έτσι νομίζω τουλάχιστον. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: sexycowboy on May 20, 2012, 19:02:34 pm Μου επιστρέφει ότι η ρίζα είναι 1.#QNAN0 γνωρίζει κανείς τι είδους λάθος είναι αυτό; Στον compiler ενός φίλου τρέχει σωστά.. :o
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Marco on May 20, 2012, 19:03:47 pm ξέρει κανείς τι σημαίνει το εξής:" warning: passing arg 7 of `froot' from incompatible pointer type"??δν μπορώ να βρω κάποιο λάθος... στο 7ο στοιχείο υπάρχει λάθος.αν δεν το βρεις γράψε την froot.πχ : void froot(double (*p)(double),double x0,double x1,double e,int *num_rep,double *root) froot(p,x1,x2,e,num_rep,root); μάλλον όταν την καλείς στη θεση πχ froot(p,x1,x2,e,num_rep,root) βάζεις froot(p,x1,x2,e,num_rep,*root) Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Marco on May 20, 2012, 19:05:57 pm Μου επιστρέφει ότι η ρίζα είναι 1.#QNAN0 γνωρίζει κανείς τι είδους λάθος είναι αυτό; Στον compiler ενός φίλου τρέχει σωστά.. :o NAN= not a number Title: Re: [Δομημένος Πρ.] Εργασία E Post by: sexycowboy on May 20, 2012, 19:07:36 pm Μου επιστρέφει ότι η ρίζα είναι 1.#QNAN0 γνωρίζει κανείς τι είδους λάθος είναι αυτό; Στον compiler ενός φίλου τρέχει σωστά.. :o NAN= not a number αυτό μόλις το βρήκα και εγώ σε ένα φόρουμ αλλά δεν μπορώ να καταλάβω πώς προκύπτει και κυρίως γιατί στον άλλο compiler τρέχει κανονικά.. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: c0ndemn3d on May 20, 2012, 19:10:21 pm Καμιά διαίρεση με 0 μήπως; Τις ίδιες τιμές έδωσες και στις 2 περιπτώσεις;
Title: Re: [Δομημένος Πρ.] Εργασία E Post by: sexycowboy on May 20, 2012, 19:15:32 pm Καμιά διαίρεση με 0 μήπως; Τις ίδιες τιμές έδωσες και στις 2 περιπτώσεις; για διάφορες τιμές. Στον έναν compiler τρέχει ενώ στον άλλο όχι..το πρόβλημα θα πρεπε να εμφανίζεται εφόσον η f'(x0) είναι 0, αλλά εμφανίζεται και σε άλλες περιπτώσεις.. Title: Re: [Δομημένος Πρ.] Εργασία E Post by: Thunderjohn on May 20, 2012, 21:49:57 pm Ξέρει κανείς αν χρειάζεται να βάλουμε τις f και f ', σαν ορίσματα των nroot και froot για να μπορούμε να τις χρησιμοποιήσουμε και αν ναι πως ακριβώς γίνεται αυτό?
|