Επισκέπτης Δημοσ. 10 Νοεμβρίου 2010 Δημοσ. 10 Νοεμβρίου 2010 Δες λίγο κάτι πρόχειρο που έκανα.Δουλεύει σωστά εκτός κι αν δεν κατάλαβα καλά και θές κάτι άλλο. >#include <stdio.h> #include <stdlib.h> #include <math.h> float *upol_rizwn(float a, float b, float c); int main(){ float *p,a,b,c; int j; p=malloc(2*sizeof(float)); printf("Eisagete tous syntelestes ths defterovathmias ekshswshs(ax^2+bx+c):"); scanf("%f %f %f",&a,&b,&c); p=upol_rizwn(a, b, c); for(j=0;j<2;j++) printf("%f ",p[j]); free(p); } float *upol_rizwn(float a, float b, float c) { float d,riza1_2,riza1,riza2; float *pin_rizwn; int i=0; pin_rizwn=malloc(2*sizeof(float)); d = (b*-(4*a*c); if (d>0){ riza1=(-b+sqrt(d))/(2*a); riza2=(-b-sqrt(d))/(2*a); pin_rizwn[i] = riza1; pin_rizwn[i+1] = riza2 ; } else if (d==0) { riza1_2=-b/(2*a); pin_rizwn[i]=riza1_2; pin_rizwn[i+1]=riza1_2; } else printf("H ekshswsh den exei pragmatikes rizes\n"); return pin_rizwn; } Αυτό βέβαια υπολογίζει μόνο πραγματικές ρίζες.
V.I.Smirnov Δημοσ. 10 Νοεμβρίου 2010 Δημοσ. 10 Νοεμβρίου 2010 Δεν μπορώ να το κάνω compile αυτή τη στιγμή. Δείχνει σωστό αλλά μερικά θέματα παραμένουν. Εσύ τυπώνεις πάντα δύο τιμές. Αν το τριώνυμο έχει μια διπλή ρίζα ή δεν έχει καθόλου πρέπει να τυπώνονται μία ή καμία τιμές. Συνεπώς πρέπει να επιστρέφεις και το πλήθος των ριζών. Και για πολλά τριώνυμα θα πρέπει επίσης να το κρατάς σε πίνακα. Εφόσον χειρίζεσαι με βρόγχο πολλά τριώνυμα, έστω Ν, μπορείς να ορίσεις έναν νέο πίνακα στο κύριο πρόγραμμα με τρία στοιχεία ανά τριώνυμο : roots[Ν][3], όπου για το k τριώνυμο τα roots[k][0],roots[k][1] θα είναι οι ρίζες και roots[k][2] η πολλαπλότητα (2,1,καμία). Σε αυτόν θα αποθηκεύεις τα στοιχεία του pinrizwn. Έτσι ξέρεις πόσες ρίζες έχει κάθε τριώνυμο κλπ Εξαρτάται τι θέλεις βέβαια... -
virxen75 Δημοσ. 10 Νοεμβρίου 2010 Δημοσ. 10 Νοεμβρίου 2010 >Δηλαδή κάπως έτσι upol_rizwn(a,b,c,pin_rizwn,i); Και η συνάρτηση είναι float upol_rizwn(int a, int b, int c,float pin_rizwn[],int i) { int d,tupriz,riza1_2,riza1,riza2; d = (b*-(4*a*c); if (d>0){ tupriz=2; riza1=(-b+sqrt(d))/(2*a); riza2=(-b-sqrt(d))/(2*a); pin_rizwn[i]=riza1; pin_rizwn[i++]= riza2 ; i = i +2; } else if (d==0) { tupriz=1; riza1_2=-b/(2*a); pin_rizwn[i]=riza1_2; i++; } return; } ΥΠΑΡΧΕΙ ΛΑΘΟΣ?? σαφώς και υπάρχει λάθος. το λάθος είναι το return; αφού ορίζεις ότι η συνάρτηση σου επιστρέφει float. μία λύση θα μπορούσε να είναι > #include <stdio.h> #include <math.h> int ypologise(int,int,int,float []); int main(){ float riza[2]; int poses=ypologise(2,6,4,riza); switch (poses){ case 0: printf("\n i eksisosi exei migadikes rizes"); break; case 1: printf("\n i eksisosi exei diplh riza thn %f",riza[0]); break; case 2: printf("\n i eksisosi exei riza1=%f kai riza2=%f",riza[0],riza[1]); break; } getchar(); return 0; } int ypologise(int a,int b,int c,float riza[]){ int poses=0; float d = (b*-(4*a*c); if (d>0){ riza[0] = (-b+sqrt(d))/(2*a); riza[1] = (-b-sqrt(d))/(2*a); poses=2; } else if (d==0) { riza[0]=-b/(2*a); riza[1]=-b/(2*a); poses=1; } return poses; }
NewProject Δημοσ. 10 Νοεμβρίου 2010 Δημοσ. 10 Νοεμβρίου 2010 αυτο που ειπε ο αποπανω , δηλαδη : > struct riza { float a; float b; }; riza upol_rizes(...); int main(){ riza apotelesmata[9999]; for(unsigned int i=0;i<9999;i++){ apotelesmata[i] = upol_rizes(...); if(apotelesmata[i].a==apotelesmata[i].{ // διπλη ριζα } } return 0; }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.