[C] Dichiarazione funzione in ANSI C

Messaggioda Zyzzoy » 09/01/2019, 22:12

Ciao ragazzi, non riesco a capire come farlo.La richiesta è questa:

Si consideri la seguente famiglia di rette descritta dal parametro c e
dalla costante r0 = 2
y = c*x + r0*(sqrt(c*c+1));

che deve essere scritta come una funzione in ANSI C, in modo esteso dichiarando una
variabile locale che `e restituita dal return. Alla funzione devono ovviamente essere passati
tre argomenti: l’ascissa x, il parametro c e la costante r0.

Io non ho mia visto una cosa del genere , 10 errori mi da il programma. Di solito per gli altri esercizi facevo:

Codice:
double funz (double x);

 poi in fondo a tutto

double funz (double x) {
double y;
y=c[i]*x+r0*(sqrt(c[i]*c[i]+1));
return y;}


Devono essere passati 3 argomenti dice il testo,cercando su internet ho trovato sta forma

Codice:
double funz (double x,double c, int r0) {


Ma poi non so che proseguire o cosa fare.Non ho ben capito come funziona questo tipo di dichiarazione in C. Qualcuno sa qualcosa? La c deve essere c[i] perchè poi devo metterla nel problema in questo modo per trovare il fascio di rette.
Zyzzoy
Junior Member
Junior Member
 
Messaggio: 6 di 324
Iscritto il: 06/01/2019, 17:36

Re: [C] Dichiarazione funzione in ANSI C

Messaggioda vict85 » 10/01/2019, 09:59

È esattamente come nel caso con un solo parametro. Semplicemente hai 3 parametri invece che uno. Nella chiamata della funzione dovrai inserire 3 valori invece che uno solo.

Separare dichiarazione e inizializzazione di una variabile la ritengo una cattiva prassi. Puoi tra l'altro avere una espressione dopo il return.
vict85
Moderatore
Moderatore
 
Messaggio: 9453 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C] Dichiarazione funzione in ANSI C

Messaggioda Anacleto13 » 10/01/2019, 10:02

Codice:
double func (double x,double c, int r0) {
    double y = 0;
    y = c*x + r0*(sqrt(c*c+1));
    return y;
}


Fondamentalmente facendo così stai solo ritornano il valore di $y$, se quello è il tuo testo completo non leggo che devi ritornare i valori dei fasci di rette, se è così devi lavorare con gli array.
Avatar utente
Anacleto13
Average Member
Average Member
 
Messaggio: 280 di 598
Iscritto il: 20/03/2017, 19:20
Località: Den Haag

Re: [C] Dichiarazione funzione in ANSI C

Messaggioda Zyzzoy » 10/01/2019, 12:13

Forse l'ansi c chiede questo formato, io non lo so il prof non spiega, il double funz(double y) pensavo andasse bene ovunque, ormai lo facevo in modo automatico, l ho preso da un suo esercizio e funziona in tutti tranne in questo. Dopo un periodo di smarrimento ho trovato come dichiarare le altre variabili tra parentesi, ma come continuare sotto non lo so proprio.

Quando torno a casa poi metto il ciclo array per il calcolo del fascio di rette. In pratica prima con un ciclo for ho inizializzato tutti i c[i] che mi servono, poi con un altro for ho calcolato la coppia x[i], y[i] con y[i]=funz(x[i]) e funz la funzione che avrei dovuto dichiarare. Mettendo nel ciclo direttamente y=c[i]*x+2*(sqrt(c[i]*c[i]+1)) il problema è risolto, ma lui vuole che dichiaro la funzione e uso x=funz (x[i]) per tirarla in ballo.

Non so se mi son spiegato bene, probabilmente non si capirà nulla di quello che ho scritto. Faccio ingegneria meccanica e quest'esame per me è demoniaco.
Zyzzoy
Junior Member
Junior Member
 
Messaggio: 8 di 324
Iscritto il: 06/01/2019, 17:36

Re: [C] Dichiarazione funzione in ANSI C

Messaggioda vict85 » 10/01/2019, 14:35

Anacleto13 ha scritto:
Codice:
double func (double x,double c, int r0) {
    double y = 0;
    y = c*x + r0*(sqrt(c*c+1));
    return y;
}


Fondamentalmente facendo così stai solo ritornano il valore di $y$, se quello è il tuo testo completo non leggo che devi ritornare i valori dei fasci di rette, se è così devi lavorare con gli array.


Dichiarare la variabile a 0 e poi associarne un valore successivamente non ha molto senso. Il C89 (ovvero il datato standard C redatto 30 anni fa che alcuni professori universitari amano senza alcun motivo) non vieta di scrivere qualcosa come
Codice:
double funzione( double x, double c, int r0 ) {
    double y = c * x + r0 * sqrt( c * c + 1 );
    return y;
}
o addirittura
Codice:
double funzione( double x, double c, int r0 ) {
    return c * x + r0 * sqrt( c * c + 1 );
}


Vi assicuro inoltre che i compilatori considerano questi due codici come esattamente la stessa cosa e dare un nome a quella espressione non aumenta la leggibilità. Tra l'altro, trovo avesse a quel punto più senso scrivere qualcosa come:
Codice:
double funzione( double x, double c, int r0 ) {
    double k = c * c + 1;
    double q = r0 * r0 * sqrt( k );
    return c * x + q;
}


Comunque per chiamarla devi semplicemente fare y[j] = funzione( x[j], c[i], r0 );. Nota che la soluzione originale richiedeva di dichiarare tutto come variabili globali, mentre con la nuova non è più necessario.
vict85
Moderatore
Moderatore
 
Messaggio: 9454 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C] Dichiarazione funzione in ANSI C

Messaggioda Zyzzoy » 10/01/2019, 15:06

Questo è l'esercizio risolto barando

a=-3.;
b=5.;
c[0]=-2;
incr=0.5;
for (i=1;i<5;i++) {
c[i]=c[i-1]+incr; }



h=(b-a)/6;
for (i=0;i<5;i++) {
for (j=0;j<=5;j++) {
x=a+j*h;
y=c[i]*x+2*(sqrt(1+c[i]*c[i]));
fprintf(fp,"%12.6f %12.6f\n",x,y); }
fprintf(fp,"\n");
}


al posto di y=c[i]*x+2*(sqrt(1+c[i]*c[i])); devo mettere y=funz(x),e la funz la devo dichiarare fuori dall int main (void). Provo a smanettare un po con le formule da te scritte,la seconda mi sembra la più semplice
Zyzzoy
Junior Member
Junior Member
 
Messaggio: 9 di 324
Iscritto il: 06/01/2019, 17:36

Re: [C] Dichiarazione funzione in ANSI C

Messaggioda Zyzzoy » 10/01/2019, 15:34

Codice:
double funz (double x,double c,double r0) {
                      return c * x + r0 * sqrt( c * c + 1 );}
               


Facendo in questo modo mi dice

Codice:
e.c: In function ‘main’:
e.c:35:25: error: too few arguments to function ‘funz’
                       y=funz (x);
                         ^~~~
e.c:7:8: note: declared here
 double funz (double x,double c,double r0);
        ^~~~
e.c:13:38: warning: variable ‘r0’ set but not used [-Wunused-but-set-variable]
     double h,c[5],a,b,x,y,incr,d,e,t,r0;
                                      ^~



Però senza gli indici [i] come fa a risolvere il problema?
Zyzzoy
Junior Member
Junior Member
 
Messaggio: 10 di 324
Iscritto il: 06/01/2019, 17:36

Re: [C] Dichiarazione funzione in ANSI C

Messaggioda Anacleto13 » 10/01/2019, 20:24

Zyzzoy ha scritto:Forse l'ansi c chiede questo formato, io non lo so il prof non spiega, il double funz(double y) pensavo andasse bene ovunque, ormai lo facevo in modo automatico, l ho preso da un suo esercizio e funziona in tutti tranne in questo. Dopo un periodo di smarrimento ho trovato come dichiarare le altre variabili tra parentesi, ma come continuare sotto non lo so proprio..


Giusto per curiosità, che corso è?
Zyzzoy ha scritto:Non so se mi son spiegato bene, probabilmente non si capirà nulla di quello che ho scritto. Faccio ingegneria meccanica e quest'esame per me è demoniaco.

Stessa cosa quando gli informatici fanno qualche corso di meccanica :-D
Avatar utente
Anacleto13
Average Member
Average Member
 
Messaggio: 281 di 598
Iscritto il: 20/03/2017, 19:20
Località: Den Haag

Re: [C] Dichiarazione funzione in ANSI C

Messaggioda Zyzzoy » 10/01/2019, 20:46

fondamenti di informatica T Ingegneria meccanica. Linguaggio C e analisi numerica. Beh dai la meccanica si capiscono bene le basi. Io per imparare i cicli e le cosette base del c ho dovuto sputare sangue e ancora non so nulla praticamente (e non voglio nemmeno sapere nulla, avrei preferisto studiare il turco che informatica, ma purtroppo lo devo dare)
Zyzzoy
Junior Member
Junior Member
 
Messaggio: 11 di 324
Iscritto il: 06/01/2019, 17:36

Re: [C] Dichiarazione funzione in ANSI C

Messaggioda vict85 » 11/01/2019, 17:17

Ecco qualcosa di simile a quel che stai cercando. Nota che, se dovessi risolvere una cosa del genere, non userei questo approccio, perché ti trovi a valutare il seno ogni qual volta vuoi calcolare il valore della funzione.
Codice:
#include <math.h>
#include <stdio.h>

/**
 * Data la famiglia di rette
 *     \[\{ f_{c,\ r} = cx + r\sin(c^2 + 1) \colon c, r \in \mathbf{R} \},\]
 * questa funzione calcola il valore della funzione $f_{c,r}$ nel punto $x$.
 */
double funzione( double x, double c, double r );

int main( void )
{
    const double r0 = 2.0;
    const int NUM_RETTE = 5;
    const int NUM_SEGMENTI = 10;
    double c = 0.1;
    int i = 0;
    for( ; i != NUM_RETTE; ++i )
    {
        double x = 0.0;
        const double d = 1.0 / NUM_SEGMENTI;
        int j = 0;
        for( ; j != NUM_SEGMENTI + 1; ++j )
        {
            x = ( d * j );
            double y = funzione( x, c, r0 );
            printf( "c=%f, r=%f, x=%f, y=%f\n", c, r0, x, y );
        }
        c += 0.1;
    }
}

double funzione( double x, double c, double r )
{
    return x * c + r * sin( c * c + 1 );
}

Avrei verosimilmente fatto qualcosa di questo tipo:
Codice:
#include <math.h>
#include <stdio.h>

struct Retta {
    double m;
    double q;
};

void calcola_funzione( struct Retta * retta, double c, double r );
double valuta_funzione( struct Retta const * retta, double x );

int main( void )
{
    const double r0 = 2.0;
    const int NUM_RETTE = 5;
    const int NUM_SEGMENTI = 10;
    double c = 0.1;
    int i = 0;
    for( ; i != NUM_RETTE; ++i )
    {
        struct Retta retta;
        calcola_funzione( &retta, c, r0 );
        const double d = 1.0 / NUM_SEGMENTI;
        double x = 0.0;
        int j = 0;
        for( ; j != NUM_SEGMENTI + 1; ++j )
        {
            x = ( d * j );
            double y = valuta_funzione( &retta, x );
            printf( "c=%f, r=%f, x=%f, y=%f\n", c, r0, x, y );
        }
        c += 0.1;
    }
}

void calcola_funzione( struct Retta * retta, double c, double r )
{
    retta->m = c;
    retta->q = r * sin( c * c + 1 );
}

double valuta_funzione( struct Retta const * retta, double x )
{
    return retta->m * x + retta->q;
}


Comunque secondo me sbagli approccio e sentimento. Finché studierai pensando che "non voglio nemmeno sapere nulla, avrei preferisto studiare il turco che informatica, ma purtroppo lo devo dare" il tuo cervello continuerà a non farti capire alcun concetto di informatica. Ti assicuro che il turco è una lingua molto più complessa (e ambigua) del C.

Il compilatore ti stava comunque dicendo espressamente cosa non andava. Cosa non capivi dei suoi errori?
vict85
Moderatore
Moderatore
 
Messaggio: 9455 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite