Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

la direttiva #define in C

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[1] la direttiva #define in C

Messaggioda Foto Utentehuyol » 22 set 2016, 20:10

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$

Avatar utente
Foto Utentehuyol
120 2 5
Frequentatore
Frequentatore
 
Messaggi: 203
Iscritto il: 30 gen 2011, 19:24

2
voti

[2] Re: la direttiva #define in C

Messaggioda Foto Utentesimo85 » 22 set 2016, 20:20

Codice: Seleziona tutto
#define  PI 3.141593


Poi vedi anche l'header math.h.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: la direttiva #define in C

Messaggioda Foto Utentehuyol » 22 set 2016, 20:32

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?
Avatar utente
Foto Utentehuyol
120 2 5
Frequentatore
Frequentatore
 
Messaggi: 203
Iscritto il: 30 gen 2011, 19:24

5
voti

[4] Re: la direttiva #define in C

Messaggioda Foto UtenteDirtyDeeds » 22 set 2016, 20:58

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.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

1
voti

[5] Re: la direttiva #define in C

Messaggioda Foto UtenteMassimoB » 22 set 2016, 21:06

qui trovi la libreria standard di C
MCSA Windows Server 2012 R2
Cisco CCNA R&S - Cisco CCNA Security - Cisco CCNA Cyber Ops
CompTia A+ - CompTia Linux+ - CompTIA Systems Support Specialist CSSS
CompTia Pentest+ LPIC-1 - VCP VMware - Cisco CCNP Enterprise
Avatar utente
Foto UtenteMassimoB
14,2k 6 12 13
Expert free
 
Messaggi: 3163
Iscritto il: 28 ott 2012, 9:56
Località: Milano

0
voti

[6] Re: la direttiva #define in C

Messaggioda Foto Utentesimo85 » 22 set 2016, 21:07

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
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[7] Re: la direttiva #define in C

Messaggioda Foto Utentehuyol » 22 set 2016, 21:10

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!!
Avatar utente
Foto Utentehuyol
120 2 5
Frequentatore
Frequentatore
 
Messaggi: 203
Iscritto il: 30 gen 2011, 19:24

3
voti

[8] Re: la direttiva #define in C

Messaggioda Foto UtenteDirtyDeeds » 22 set 2016, 21:14

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
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

1
voti

[9] Re: la direttiva #define in C

Messaggioda Foto Utentesimo85 » 22 set 2016, 21:16

Mitico Foto UtenteDirtyDeeds sempre aggiornato !
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59


Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 11 ospiti