Προς το περιεχόμενο

Απορία στις Συναρτήσεις στην C


wakas

Προτεινόμενες αναρτήσεις

Δημοσ.

Δες λίγο κάτι πρόχειρο που έκανα.Δουλεύει σωστά εκτός κι αν δεν κατάλαβα καλά και θές κάτι άλλο.

>#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;
}

Αυτό βέβαια υπολογίζει μόνο πραγματικές ρίζες.

Δημοσ.

Δεν μπορώ να το κάνω compile αυτή τη στιγμή.

Δείχνει σωστό αλλά μερικά θέματα παραμένουν.

 

Εσύ τυπώνεις πάντα δύο τιμές.

Αν το τριώνυμο έχει μια διπλή ρίζα ή δεν έχει καθόλου πρέπει να τυπώνονται μία ή καμία τιμές.

Συνεπώς πρέπει να επιστρέφεις και το πλήθος των ριζών.

Και για πολλά τριώνυμα θα πρέπει επίσης να το κρατάς σε πίνακα.

 

Εφόσον χειρίζεσαι με βρόγχο πολλά τριώνυμα, έστω Ν, μπορείς να ορίσεις έναν νέο πίνακα στο κύριο πρόγραμμα με

τρία στοιχεία ανά τριώνυμο : roots[Ν][3], όπου για το k τριώνυμο τα roots[k][0],roots[k][1] θα είναι οι ρίζες και roots[k][2] η πολλαπλότητα (2,1,καμία).

Σε αυτόν θα αποθηκεύεις τα στοιχεία του pinrizwn. Έτσι ξέρεις πόσες ρίζες έχει κάθε τριώνυμο κλπ

 

Εξαρτάται τι θέλεις βέβαια...

 

-

Δημοσ.
>Δηλαδή κάπως έτσι

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;
   
}

Δημοσ.

αυτο που ειπε ο αποπανω , δηλαδη :

>
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;
  }
  

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...