johnykim Δημοσ. 23 Μαΐου 2010 Δημοσ. 23 Μαΐου 2010 Καλησπέρα σε όλους. έχω ένα θεματάκι με αποτελέσματα κάποιων πράξεων. >#include <stdio.h> #include <stdlib.h> #include <math.h> #define P 3.14 main() { float x,y; int am=0; printf("Dwse timh tou x gia ypologismo tou y\n"); printf("\nOi times tou x tha prepei na einai apo -23.45 ews 52.00\n"); printf("\n X Y \n"); while(am<30000) { am++; scanf("%f",&x); if(x>-23.45 && x<=-12.33) { y=3*sin(x/12); printf("\n %0.2f %0.2f\n",x,y); } else if (x>-12.33 && x<=-1.63) { y=6*cos(3*x/P); printf("\n %0.2f %0.2f\n",x,y); } else if (x>-1.63 && x<=6.38) { y=(3*pow(x,2))+ (7*x) -12.5; printf("\n %0.2f %0.2f\n",x,y); } else if (x>6.38 && x<=12.53) { y=(3*x)/((2.3+x)*(pow(x,4)+1.5)); printf("\n %0.2f %0.2f\n",x,y); } else if (x>12.53 && x<=52.00) { y=3.5*log(x/32); printf("\n %0.2f %0.2f\n",x,y); } else printf("\nLathos timh tou x\n"); }//while system("PAUSE"); return 0; } Όπως βλέπετε έχω κάποια αποτελέσματα y ,ανάλογα με την τιμή χ.Δεν μπορώ να βρω που είναι το λάθος ,και σε κάποια αποτελέσματα το y είναι 0.. Για παράδειγμα όταν το χ είναι 6 ή 7 ή 8 ή 9.. Τα αποτελέσματα του Y, αντίστοιχα ,που πρέπει να φτιάξω είναι αυτά : Υ = 3ημ(χ/12) Υ = 6συν(3χ/π) Υ = 3 επί χ στο τετράγωνο + 7χ –12,5 Υ = 3χ/[(2,3+χ)(χ στην τετάρτη+1,5)] Υ = 3,5λογ(χ/32)
Mp0u Δημοσ. 23 Μαΐου 2010 Δημοσ. 23 Μαΐου 2010 αντι για 0.2f βαλε σκετο .2f και κανε ενα compile+run και πες τι σου εμφανιζει edited: επισης σε καθε συναρτηση της y δωστην ως float ... πχ : y=(float)3*sin(x/12); re-edited: checkara τον κωδικα σου και τον ετρεξα με την τιμη x=7 .... το προβλημα βρισκεται εδω >else if (x>6.38 && x<=12.53) { y=(3*x)/((2.3+x)*(pow(x,4)+1.5)); printf("\n %0.2f %0.2f\n",x,y); } αμα κανεις τις πραξεις στο calculator θα δεις οτι τα 2 πρωτα δεκαδικα ψηφια ειναι μηδεν και για αυτον τον λογο σου βγαινει 0. Για να σου λυθει το προβλημα υπαρχουν 2 τροποι: a) το κανεις σαν %.8f ή %e , που σημαινει πραγματικός κινητής υποδιαστολής. > else if (x>6.38 && x<=12.53) { y=(float)(3*x)/((2.3+x)*(pow(x,4)+1.5)); printf("\n %.2f %e\n",x,y); } καλο επισης θα ηταν το y να το δηλωσεις σαν double και οχι σαν float για μεγαλυτερη ευκρινια αποτελεσματων. Λογικα τωρα πρεπει να δουλευει
V.I.Smirnov Δημοσ. 23 Μαΐου 2010 Δημοσ. 23 Μαΐου 2010 @johnykim Λοιπόν, δες τι γίνεται. Τα αποτελέσματα υπολογίζονται σωστά, απλώς δεν τα βλέπεις. Όταν τα τυπώνεις χρησιμοποιείς ανεπαρκές πλήθος ψηφίων με αποτέλεσμα να εκτυπώνονται στογγυλευμένα στον πλησιέστερο αριθμό για να χωρέσουν. Π.χ. αν προκύπτει .0008 και το τυπώσεις με δύο δεκαδικά, θα δείξει 0 διότι θα χρησιμοποιήσει μόνον τα δύο πρώτα. Στις printf αντί 0.2f θέσε 12.8f για να υπάρχει επαρκές περιθώριο. Εξάλλου, να σηματοδοτείς τους πραγματικούς θέτοντας το f πίσω τους ή την τελεία. Π.χ. μην γράφεις y=6*cos(3*x/P); αλλά y=6.0f*cos(3.0f*x/P); Τέλος, επειδή το 1 είναι η εφαπτομένη του π/4, το π μπορεί να υπολογιστεί ως pi = 4.*atan(1.) οπότε η ακρίβεια είναι η μέγιστη δυνατή. Άντε, πες μας αν τα κατάφερες....
johnykim Δημοσ. 23 Μαΐου 2010 Μέλος Δημοσ. 23 Μαΐου 2010 @Mp0u, τα ίδια μου εμφανίζει. @V.I.Smirnov , θέλω όμως το αποτέλεσμα να είναι σε δύο δεκαδικά. Παιδιά εντάξει, αυτό που με ενδιαφέρει είναι να εμφανίζει σωστά τα y.Μην είχα δηλαδή κάποιο λάθος στον τρόπο λύσης της y.Τώρα με τα δεκαδικά, αφού πρέπει να έχω δύο, δεν νομίζω ότι μπορώ να κάνω κάτι στην περίπτωση μικρών αριθμών. Σας ευχαριστώ
Mp0u Δημοσ. 23 Μαΐου 2010 Δημοσ. 23 Μαΐου 2010 τα 2 πρωτα δεκαδικα ψηφια στο διαστημα 6.38 μεχρι 12.53 ειναι παντα 0. Ο μονος τροπος για να εμφανισεις ενα αποτελεσμα ειναι το y να το δωσεις ως y.kati * 10^-4 .... αν με καταλαβαινεις... παντως και οι 2 λυσεις που σου δωσαμε δουλευουν
V.I.Smirnov Δημοσ. 23 Μαΐου 2010 Δημοσ. 23 Μαΐου 2010 Δεν μπορεί να τυπωθεί με δυο δεκαδικά εφόσον είναι μικρότερο. Ο μόνος τρόπος είναι να γραφεί σε εκθετική μορφή. Π.χ. το .00087654 να τυπωθεί ως 8.76Ε-4.
Mp0u Δημοσ. 24 Μαΐου 2010 Δημοσ. 24 Μαΐου 2010 Ο μόνος τρόπος είναι να γραφεί σε εκθετική μορφή. Π.χ. το .00087654 να τυπωθεί ως 8.76Ε-4. αυτο εννοουσα και γινεται με το %e αλλα βγαινει καπως μακριναρι....
johnykim Δημοσ. 24 Μαΐου 2010 Μέλος Δημοσ. 24 Μαΐου 2010 Με φλομώσατε στα edit , τα οποία δεν είχα δει. Όλα εντάξει παιδιά! Σας ευxαριστώ
V.I.Smirnov Δημοσ. 24 Μαΐου 2010 Δημοσ. 24 Μαΐου 2010 Ε, αν γράψει π.χ. 6.2f το .00087654 τυπώνεται ως 8.76Ε-4. Αυτό που δεν έχει η C++ (ή δεν ξέρω πώς γίνεται) είναι να μπορείς να κάνεις scaling τον αριθμό κατά την εκτύπωσή του μετακινώντας την υποδιαστολή όσες θέσεις θέλεις δεξιά ή αριστερά (και ο εκθέτης της δύναμης να ρυθμίζεται αυτόματα). Π.χ. το .00087654 εγώ μπορεί να θέλω να τυπώνεται σε εκθετική μορφή ως 87.654Ε-5. Στη fortran εξ ορισμού η εκθετική γραφή θέτει το πρώτο ψηφίο μετά την υποδιαστολή, δηλ. σε εκθετική μορφή το γράφει 0.87654Ε-3. Αλλά επιπλέον, η υποδιαστολή μπορεί να μετακινηθεί κατά βούληση και να γραφεί ως 87.654Ε-5 . Αυτό θα γινόταν πχ. με την μορφοποίηση (2p,e12.3) . Αντίστοιχα στην C++, εξ ορισμού η εκθετική γραφή θέτει το πρώτο ψηφίο πριν την υποδιαστολή δηλ. το τυπώνει ως 8.765Ε-4 ή 8.7654Ε-4 . Αλλά μόνον αυτό, δυστυχώς, δηλ. η υποδιαστολή είναι πάντα μετά το πρώτο ψηφίο χωρίς δυνατότητα μετακίνησης. Όποιος ξέρει αν και πώς γίνεται (αυτόματα μέσω της printf ή της cout) ας μας το πει...
jstark Δημοσ. 24 Μαΐου 2010 Δημοσ. 24 Μαΐου 2010 > if(x>-23.45 && x<=-12.33) Αυτοί οι έλεγχοι είναι λίγο επικίνδυνοι. Να τους προσέχεις και γενικά να τους αποφεύγεις όσο μπορείς, τουλάχιστον σε αυτή τη μορφή. Μιλάω γενικά και όχι για το συγκεκριμένο πρόγραμμα.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.