Passa al tema normale
Discussioni su argomenti di Informatica

Regole del forum

Consulta il nostro regolamento e la guida per scrivere le formule
Rispondi al messaggio

[C] Dichiarazione funzione in ANSI C

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.

Re: [C] Dichiarazione funzione in ANSI C

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.

Re: [C] Dichiarazione funzione in ANSI C

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.

Re: [C] Dichiarazione funzione in ANSI C

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.

Re: [C] Dichiarazione funzione in ANSI C

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.

Re: [C] Dichiarazione funzione in ANSI C

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

Re: [C] Dichiarazione funzione in ANSI C

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?

Re: [C] Dichiarazione funzione in ANSI C

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

Re: [C] Dichiarazione funzione in ANSI C

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)

Re: [C] Dichiarazione funzione in ANSI C

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?
Rispondi al messaggio


Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000— Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.