Spiroslp Δημοσ. 21 Δεκεμβρίου 2010 Δημοσ. 21 Δεκεμβρίου 2010 Καλησπέρα. Θέλω όποιος ξέρει να με βοηθήσει σε ένα πρόβλημα που έχω και το παλεύω ΠΑΡΑ πολλές ώρες χωρίς να ξέρω τι έχω κάνει λάθος. Την άσκηση δεν την έχω τελειώσει ακόμα. Ξέρω τι πρέπει να κάνω στην συνέχεια αλλά κολλάω παρακάτω. Σκοπός είναι να φτιάξεις υποπρογράμματα για να βρίσκεις Περίμετρο, εμβαδο κ.τ.λ και μετά να τα καλέις στην Main. Το πρόβλημα που συναντάω είναι στο εμβαδό. Ο κώδικας ῀πυ εχω γράψει μέχρι στιγμής είναι αυτός: >#include <stdio.h> #include <stdlib.h> char Title[20]; float a, b, c,yp,Per,Em; void EisagogiTimwn() { printf ("Dose titlo trigonoy\n"); scanf("%s",Title); loop1: printf ("Dose thn pleyra a toy trigonou\n"); scanf("%f",&a); if ((a<0) || (a==0)) { printf("Dose timh pano apo 0\n"); goto loop1; } loop2: printf ("Dose thn pleyra b tou trigonoy\n"); scanf("%f",&; if ((b<0) || (b==0)) { printf("Dose timh pano apo 0\n"); goto loop2; } loop3: printf ("Dose thn pleyra c tou trigonou\n"); scanf("%f",&c); if ((c<0) || (c==0)) { printf("Dose timh pano apo 0\n"); goto loop3; } loop4: printf ("Dose to ypsos tou trigonou\n"); scanf("%f",&yp); if (yp<=0) { printf("Dose timh pano apo 0\n"); goto loop4; } } int Perimetros(float a, float b, float c) { Per=a+b+c; printf ("H Perimetros toy trigonoy einai %f\n",Per); return Per; } int Embadon (float a, float b, float c , float yp) { char x; printf("Dialekse pleyra gia na ypolgogistei to Embado\n(a, b or c)\n"); scanf("%c",&x); if (x=='a') { Em=1/2*a*yp; printf("To Embado toy trigonoy gia pleyra a einai %f\n",Em); } else if (x=='b') { Em=1/2*b*yp; printf("To Embado toy trigonoy gia pleyra b einai %f\n",Em); } else if(x=='b') { Em=1/2*c*yp; printf("To Embado toy trigonoy gia pleyra c einai %f\n",Em); } else printf("Dialekse anamesa se a, b h' c\n"); return Em; } int main() { EisagogiTimwn(); Perimetros(a,b,c); Embadon(a,b,c,yp); return 0; } Εκεί που κολλάει είναι στο εμβαδό όπου όταν το τρέχω μου βγάζει αυτό: Όπου όταν πάει στο Εμβαδό γράφει κανονικά το printf και πάει κατευθείαν στο τελευταίο else και μετά τελειώνει το πρόγραμμα. Την έχω κάνει και με Switch και πάλι πάει στο default χωρίς να δώσω κάτι εγώ. Άμα την καλέσω πρώτη στην main μου το τρέχει κανονικά. Ξέρετε τι μπορεί να φταίει; Σας ευχαριστώ πολύ.
fotis4u Δημοσ. 22 Δεκεμβρίου 2010 Δημοσ. 22 Δεκεμβρίου 2010 Καλησπέρα, πρώτα απ'όλλα γιατί χρησιμοποιείς την LOOP στο κώδικά σου, και δεύτερον όταν γράφεις κώδικα να επιλέγεις πριν το ποστάρεις το πλαίσιο "εισαγωγή αποσπάσματος κώδικα" >#include <stdio.h> #include <stdlib.h> char Title[20]; float a, b, c,yp,Per,Em; void EisagogiTimwn() { printf ("Dose titlo trigonoy\n"); scanf("%s",Title); loop1: printf ("Dose thn pleyra a toy trigonou\n"); scanf("%f",&a); if ((a<0) || (a==0)) { printf("Dose timh pano apo 0\n"); goto loop1; } loop2: printf ("Dose thn pleyra b tou trigonoy\n"); scanf("%f",&; if ((b<0) || (b==0)) { printf("Dose timh pano apo 0\n"); goto loop2; } loop3: printf ("Dose thn pleyra c tou trigonou\n"); scanf("%f",&c); if ((c<0) || (c==0)) { printf("Dose timh pano apo 0\n"); goto loop3; } loop4: printf ("Dose to ypsos tou trigonou\n"); scanf("%f",&yp); if (yp<=0) { printf("Dose timh pano apo 0\n"); goto loop4; } } int Perimetros(float a, float b, float c) { Per=a+b+c; printf ("H Perimetros toy trigonoy einai %f\n",Per); return Per; } int Embadon (float a, float b, float c , float yp) { char x; printf("Dialekse pleyra gia na ypolgogistei to Embado\n(a, b or c)\n"); scanf("%c",&x); if (x=='a') { Em=1/2*a*yp; printf("To Embado toy trigonoy gia pleyra a einai %f\n",Em); } else if (x=='b') { Em=1/2*b*yp; printf("To Embado toy trigonoy gia pleyra b einai %f\n",Em); } else if(x=='b') { Em=1/2*c*yp; printf("To Embado toy trigonoy gia pleyra c einai %f\n",Em); } else printf("Dialekse anamesa se a, b h' c\n"); return Em; } int main() { EisagogiTimwn(); Perimetros(a,b,c); Embadon(a,b,c,yp); return 0; }
Spiroslp Δημοσ. 22 Δεκεμβρίου 2010 Μέλος Δημοσ. 22 Δεκεμβρίου 2010 Loop χρησιμοποιώ έτσι ώστε άμα δώσει μια τιμή που δεν θέλω να ξαναπηγαίνει με το goto πάνω και να ξαναζητάει τιμή.
gtroza Δημοσ. 22 Δεκεμβρίου 2010 Δημοσ. 22 Δεκεμβρίου 2010 >int Embadon (float a, float b, float c , float yp) { char x; printf("Dialekse pleyra gia na ypolgogistei to Embado\n(a, b or c)\n"); scanf("%c",&x); if (x=='a') { Em=1/2*a*yp; printf("To Embado toy trigonoy gia pleyra a einai %f\n",Em); } else if (x=='b') { Em=1/2*b*yp; printf("To Embado toy trigonoy gia pleyra b einai %f\n",Em); } else if(x=='b') { Em=1/2*c*yp; printf("To Embado toy trigonoy gia pleyra c einai %f\n",Em); } else printf("Dialekse anamesa se a, b h' c\n"); return Em; } }; /*μήπως λείπει ; */ int main() { } /*μήπως λείπει ; */ άσχετα: όταν ξέρουμε τις 3 πλευρές του τριγώνου, είναι γνωστό και το εμβαδόν > τύπος του Ήρωνα ένα ισόπλευρο έχει ύψος μικρότερο απο την πλευρά του .
virxen75 Δημοσ. 22 Δεκεμβρίου 2010 Δημοσ. 22 Δεκεμβρίου 2010 δες τις αλλαγές που χρειάζονται για να δουλέψει σωστά και να μην θυμίζει ο κώδικας.....gw-basic! > #include <stdio.h> #include <stdlib.h> char Title[20]; float a, b, c,yp,Per,Em; void EisagogiTimwn(){ printf ("Dose titlo trigonoy\n"); scanf("%s",Title);getchar(); a=0; while (a<0 || a==0){ printf ("Dose thn pleyra a toy trigonou\n"); scanf("%f",&a);getchar(); if (a<0 || a==0) printf("Dose timh pano apo 0\n"); } b=0; while (b<0 || b==0){ printf ("Dose thn pleyra b tou trigonoy\n"); scanf("%f",&;getchar();//b oxi B if (b<0 || b==0) printf("Dose timh pano apo 0\n"); } c=0; while (c<0 || c==0){ printf ("Dose thn pleyra c tou trigonou\n"); scanf("%f",&c);getchar(); if (c<0 || c==0) printf("Dose timh pano apo 0\n"); } yp=0; while (yp<=0){ printf ("Dose to ypsos tou trigonou\n"); scanf("%f",&yp);getchar(); if (yp<=0) printf("Dose timh pano apo 0\n"); } } float Perimetros(float a, float b, float c){//float oxi int Per=a+b+c; printf ("H Perimetros toy trigonoy einai %f\n",Per); return Per; } float Embadon (float a, float b, float c , float yp){//float oxi int char x='1'; while(x!='a' && x!='b' && x!='c'){ printf("Dialekse pleyra gia na ypolgogistei to Embado\n(a, b or c)\n"); scanf("%c",&x);getchar(); if (x=='a'){ Em=1/2*a*yp; printf("To Embado toy trigonoy gia pleyra a einai %f\n",Em); }else if (x=='b'){ Em=1/2*b*yp; printf("To Embado toy trigonoy gia pleyra b einai %f\n",Em); }else if(x=='c'){//c oxi b Em=1/2*c*yp; printf("To Embado toy trigonoy gia pleyra c einai %f\n",Em); }else printf("Dialekse anamesa se a, b h' c\n"); } return Em; } int main(){ EisagogiTimwn(); Perimetros(a,b,c); Embadon(a,b,c,yp); getchar(); return 0; } Υ.Γ. όπως σου έχουν υποδείξει και παραπάνω πρέπει να υπάρχουν κανονικά και κάποιοι έλεγχοι π.χ. το ύψος σε σχέση με τις πλευρές αλλά και αν με τα μήκη των πλευρών που δίνει ο χρήστης όντως σχηματίζουν τρίγωνο.
gtroza Δημοσ. 22 Δεκεμβρίου 2010 Δημοσ. 22 Δεκεμβρίου 2010 και αν με τα μήκη των πλευρών που δίνει ο χρήστης όντως σχηματίζουν τρίγωνο. σωστό ! αλλά μάλλον κώδικας δεν "στοχεύει" στη γεωμετρία αλλά στην εξάσκηση στη C .gw-basic! πού την θυμήθηκες ! .
fotis4u Δημοσ. 22 Δεκεμβρίου 2010 Δημοσ. 22 Δεκεμβρίου 2010 Αν και αρκετοί φίλοι σε έχουν βοηθήσει με την λύση της, εγώ θα μου επιτρέψεις να σταθώ στην LOOP που χρησιμοποίησες, θα σου πρότεινα να την αποφεύγεις (φιλικά πάντα μιλώντας), υπάρχουν πολύ καλύτεροι τρόποι, και παρουσιάζονται σε παραπάνω posts.
Spiroslp Δημοσ. 22 Δεκεμβρίου 2010 Μέλος Δημοσ. 22 Δεκεμβρίου 2010 Σας ευχαριστώ όλους παιδιά. Virxen75 το getchar() τί είναι. Που βρέθηκε. fotis4u ναι το ξέρω ότι πρέπει να την αποφεύγω αλλά αυτή μου ήρθε πρώτη στο μυαλό. Επίσης ότι νούμερο και να βάλω το εμβαδό 0 μου βγαίνει :/ (έβγαλα τα getchar()) Επίσης πως βάζουμε spoiler να σας βάλω μέσα την άσκηση.
gtroza Δημοσ. 22 Δεκεμβρίου 2010 Δημοσ. 22 Δεκεμβρίου 2010 Επίσης πως βάζουμε spoiler να σας βάλω μέσα την άσκηση. "["spoiler] Επίσης πως βάζουμε spoiler να σας βάλω μέσα την άσκηση. βγάλε τα εισαγωγικά .
V.I.Smirnov Δημοσ. 22 Δεκεμβρίου 2010 Δημοσ. 22 Δεκεμβρίου 2010 To εμβαδόν προκύπτει 0 διότι διαιρείς δυο ακεραίους : 1/2 = 0 Κάντο .5f και θα δουλέψει. Ο τρόπος υπολογισμού που εφαρμόζεις είναι ο χειρότερος δυνατός. Τις συντεταγμένες των κορυφών έπρεπε να δίνεις : A(x1,y1), B(x2,y2), C(x3,y3) Όλα τα ζητούμενα (περίμετρος, εμβαδόν) υπολογίζονται από αυτές με απλούς τύπους. Τέλος σου θυμίζω τον τύπο του Ήρωνα : E = sqrt(τ(τ-α)(τ-β)(τ-γ)) όπου τ είναι η ημιπερίμετρος του τριγώνου : τ=.5(α+β+γ) Έτσι λαμβάνεται κατευθείαν το εμβαδόν από τα μήκη των πλευρών, δίχως την άμεση εμπλοκή του ύψους. Όλα αυτά που κάνεις για το ύψος είναι άχρηστα ! @virxen Tρεις πλευρές πάντα σχηματίζουν τρίγωνο αν ισχύει η τριγωνική ανισότητα. Το θέμα είναι ότι δίνει ένα ύψος που δεν εξάγεται από αυτές και μπορεί να είναι λάθος. Το ύψος λαμβάνεται από τα μήκη των πλευρών πάλι από τον τύπο του Ήρωνα αλλά εδώ είναι άχρηστο διότι το εμβαδόν βρίσκεται δίχως αυτό. @gtroza Bλέπω η τελεία καλά κρατεί !!! -
Spiroslp Δημοσ. 22 Δεκεμβρίου 2010 Μέλος Δημοσ. 22 Δεκεμβρίου 2010 To εμβαδόν προκύπτει 0 διότι διαιρείς δυο ακεραίους : 1/2 = 0 Κάντο .5f και θα δουλέψει. Τέλος, ο τρόπος υπολογισμού που εφαρμόζεις είναι ο χειρότερος δυνατός. Τις συντεταγμένες των κορυφών έπρεπε να δίνεις : A(x1,y1), B(x2,y2), C(x3,y3) Όλα τα ζητούμενα (περίμετρος εμβαδόν) υπολογίζονται από αυτές με απλούς τύπους. Τέλος σου θυμίζω τον τύπο του Hρωνα : E = sqrt(τ(τ-α)(τ-β)(τ-γ)) όπου τ είναι η ημιπερίμετρος του τριγώνου : τ=.5(α+β+γ) Έτσι λαμβάνεται κατευθείαν το εμβαδόν από τα μήκη των πλευρών, δίχως την άμεση εμπλοκή του ύψους. Όλα αυτά που κάνεις για το ύψος είναι άχρηστα ! - Πως ακριβώς εφαρμόζουμε το 5f στον τύπο; Έβαλα δυο μηδενικά στο καθένακαι δούλεψε αλλά πως το βάζουμε αυτό μέσα στην εξίσωση. Δεν θυμάμαι. Επίσης. Το θέμα είναι να κάνουμε εξάσκηση στην C. Δεν καταλαβαίνω καν τι μου λες με συντεταγμένες και έτσι. Δεν λέει κάτι τέτοιο η εκφώνηση. Άντε και γράφουμε εξάμηνο τον Ιανουάριο και μετά πάμε σε C++ 3 μήνες C από την αρχή μας έχουν πέσει μαζεμένα όλα.
gtroza Δημοσ. 22 Δεκεμβρίου 2010 Δημοσ. 22 Δεκεμβρίου 2010 Tρεις πλευρές πάντα σχηματίζουν τρίγωνο. αν η μία είναι μεγαλύτερη απο το άθροισμα των άλλων δύο, δεν σχηματίζεται τρίγωνο αλλά ο φίλος κάνει εξάσκηση στη C Το θέμα είναι να κάνουμε εξάσκηση στην C. Δεν καταλαβαίνω καν τι μου λες με συντεταγμένες και έτσι. Δεν λέει κάτι τέτοιο η εκφώνηση. διαβάζουν κι άλλοι το θέμα ! .
V.I.Smirnov Δημοσ. 22 Δεκεμβρίου 2010 Δημοσ. 22 Δεκεμβρίου 2010 @gtroza Έχεις δίκιο (τριγωνική ανισότητα), το διορθώνω. -
V.I.Smirnov Δημοσ. 22 Δεκεμβρίου 2010 Δημοσ. 22 Δεκεμβρίου 2010 Εξάσκηση δεν είναι μόνον η εκμάθηση της σύνταξης αλλά και η σωστή υλοποίηση/οργάνωση της μεθόδου σε πρόγραμμα. Όσο καλά κι' αν μάθεις την σύνταξη, αν δεν ξέρεις πώς και τι τύπους να εφαρμόσεις, το πρόγραμμα θα είναι χάλια όπως αυτό εδώ. Π.χ. κάνεις έλεγχο αν δίνει a,b,c και δεν ελέγχεις αν όντως σχηματίζουν τρίγωνο. Δηλ. αν έχουν νόημα οι εισαχθείσες τιμές που είναι σημαντικότερο. -
gtroza Δημοσ. 22 Δεκεμβρίου 2010 Δημοσ. 22 Δεκεμβρίου 2010 @gtrozaΈχεις δίκιο (τριγωνική ανισότητα), το διορθώνω*. - < συνέπεια στη σύνταξη ! * και στη χρήση κασμά, ισχύει αυτή η τριγωνική ανισότητα ! χρόνια πολλά καλή χρονιά χρόνια πολλά σε όλους ! .
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.