Pagina 1 di 1

la direttiva #define in C

MessaggioInviato: 22 set 2016, 20:10
da huyol
ciao a tutti,

sto preparando un programma che acquisisca un numero float che rappresenti il raggio di un cerchio e ne restituisca il valore dell'area.
Ho deciso di utilizzare la direttiva #define (so che esiste la parola chiave const per dichiarare una costante, ma sarà oggetto del mio studio successivamente).
Il compilatore non restituisce warning, ma stampa la cifra 3 qualsiasi sia il valore impostato come raggio.
Ancora non sto usando un debugger...perché cerco di trovare autonomamente gli errori.
In questo caso però non riesco a capire dove sia l'errore....mi sembra che dal punto di vista sintattico sia tutto ok....forse l'errore è di tipo logico???

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#define  PI 3,141593

main ()

{
float raggio;
float areacerchio;

printf ("PROGRAMMA PER IL CALCOLO DELL'AREA DI UN CERCHIO DATO IL RAGGIO r \n");
printf ("DIGITARE IL VALORE DEL RAGGIO DEL CERCHIO: \n");

scanf ("%f", &raggio);                 //ACQUISISCE IL VALORE DEL RAGGIO
areacerchio = PI * raggio * raggio;     //CALCOLA L'AREA DEL CERCHIO
printf ("AREA = %f \n", areacerchio);      //STAMPA A VIDEO L'AREA DEL CERCHIO

return 0;
}


Codice: Seleziona tutto
franco@HP-15-Notebook-PC:~/Scrivania$ ./areacerchio
PROGRAMMA PER IL CALCOLO DELL'AREA DI UN CERCHIO DATO IL RAGGIO r
DIGITARE IL VALORE DEL RAGGIO DEL CERCHIO:
10
AREA = 3.000000
franco@HP-15-Notebook-PC:~/Scrivania$ ./areacerchio
PROGRAMMA PER IL CALCOLO DELL'AREA DI UN CERCHIO DATO IL RAGGIO r
DIGITARE IL VALORE DEL RAGGIO DEL CERCHIO:
20
AREA = 3.000000
franco@HP-15-Notebook-PC:~/Scrivania$


Re: la direttiva #define in C

MessaggioInviato: 22 set 2016, 20:20
da simo85
Codice: Seleziona tutto
#define  PI 3.141593


Poi vedi anche l'header math.h.

Re: la direttiva #define in C

MessaggioInviato: 22 set 2016, 20:32
da huyol
scusami Simo85, non riesco a capire, nell'ambito del file header math.h, quale sia la funzione che possa fare al caso del calcolo dell'area del cerchio......forse ldexp operazione in virgola mobile?

Re: la direttiva #define in C

MessaggioInviato: 22 set 2016, 20:58
da DirtyDeeds
Foto Utentesimo85 ti ha scritto come devi correggere il programma, tenendo conto che in C il separatore dei decimali è il punto e non la virgola, io provo a spiegarti perché non ti dà né errore né warning, e perché ottieni quel risultato.

In C, in alcune espressioni, la virgola funziona da operatore. Gli effetti di questo operatore sono due. Il primo è che la virgola introduce un ordinamento nella valutazione delle espressioni: in A, B, l'espressione A viene valutata prima di B. Il secondo effetto è che in un'espressione del tipo (A1, A2,...,An) vengono valutati in sequenza tutti gli A1,...,An, ma solo il valore dell'ultima espressione viene mantenuto, e la parentesi assume il valore An.

Ora, la direttiva

Codice: Seleziona tutto
#define PI 3,141593


dice al compilatore di sostituire a ogni PI, l'espressione 3,141593. Questa operazione di sostituzione viene fatta prima dell'effettiva compilazione. Quindi al momento della compilazione, la riga

Codice: Seleziona tutto
areacerchio = PI * raggio * raggio;


è già stata trasformata in

Codice: Seleziona tutto
areacerchio = 3,141593 * raggio * raggio;


Per maggiore chiarezza, riscriviamo la riga così:

Codice: Seleziona tutto
areacerchio = 3, 141593 * raggio * raggio;


Il compilatore quindi valuta prima l'espressione

Codice: Seleziona tutto
areacerchio = 3


e poi valuta l'espressione

Codice: Seleziona tutto
141593 * raggio * raggio;


ma questo valore non viene assegnato da nessuna parte, e viene scartato.

Il risultato è che la variabile areacerchio ha sempre valore 3, qualunque sia il raggio.

Re: la direttiva #define in C

MessaggioInviato: 22 set 2016, 21:06
da MassimoB
qui trovi la libreria standard di C

Re: la direttiva #define in C

MessaggioInviato: 22 set 2016, 21:07
da simo85
Foto Utentehuyol, ti ho suggerito di dare un' occhiata all' header math.h perché racchiude le dichiarazioni di costanti e funzioni matematiche che ti potranno essere utili, come appunto M_PI e pow.

http://pubs.opengroup.org/onlinepubs/79 ... ath.h.html

Re: la direttiva #define in C

MessaggioInviato: 22 set 2016, 21:10
da huyol
perfetta la spiegazione di cui ti ringrazio DirtyDeeds.....un attimo prima di leggere il tuo posto avevo trovato l'errore....proprio la virgola al posto del punto decimale...adesso funziona sia con la direttiva #define sia con const!!

Re: la direttiva #define in C

MessaggioInviato: 22 set 2016, 21:14
da DirtyDeeds
Foto UtenteMassimoB quella pagina è ormai datata, e il C è cambiato molto (e molte funzioni sono state aggiunte alla libreria) ;-) Un riferimento aggiornato lo puoi trovare qui:

http://en.cppreference.com/w/c

E qui puoi trovare l'ultimo draft dello standard:

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

Re: la direttiva #define in C

MessaggioInviato: 22 set 2016, 21:16
da simo85
Mitico Foto UtenteDirtyDeeds sempre aggiornato !