• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Domanda Domanda sulle variabili

Sasca

Nuovo utente
Autore del topic
16 Ottobre 2017
1
1
Miglior risposta
0
salve mi sono approcciato da poco come autodidatta all'informatica per il piacere di programmare, sono ancora agli inizi però ho provato a fare uno dei tanti esercizi trovati in rete e mi sono bloccato...
l'esercizio è banale: media di due numeri.

int a, b;
float media;
printf("inserisci il primo numero: \n");
scanf("%d", &a);
printf("inserisci il secondo numero: \n");
scanf("%d", &b);
media = ( a + b ) / 2;
printf("la media tra i due numeri è %f\n\n\n", media);

questo è quello scritto da me che però come risultato non esce un decimale, se invece modifico le variabili a e b non come interi ma come decimali funziona come dovrebbe.
come mai ?
Cioè due numeri (interi) la cui somma da un numero (intero) il quale diviso due da un secondo numero (decimale) perché non è corretto ?

Se invece volessi lasciare le variabili a e b intere, funziona inserendo un quarta variabile (somma) che però deve essere decimale... come può la somma di due numeri interi essere decimali? solo se intendo quei due numeri come x.0 e y.0... auto :emoji_slight_frown:(
grazie in anticipo!!
 
Succede perché in realtà l'operatore / non è unico ma sono tanti diversi (con lo stesso nome). Questo perché in hardware fare un'operazione tra due numeri decimali o due numeri interi cambia (sono anche due istruzioni assembler diverse). Quindi a + b è un intero, 2 è un intero e il risultato che otterrai sarà un intero, nello specifico l'intero arrotondato per difetto (es: (2 + 3) / 2 = 2).

Morale della favola, devi fare un cast a float (o a double):
C:
Perfavore, Entra oppure Registrati per vedere i codici!
Nota anche il . dopo il 2, questo dice al compilatore di associare a 2 il valore decimale 2.0 e non l'intero 2 (potrebbe non essere necessario, ma giusto per comodità / leggibilità del codice). In sostanza stai dicendo al compilatore di trattare a+b come un float, e quindi il risultato sarà correttamente un float.
 
  • Like
Reactions: Sasca
Il problema nasce dal fatto che in c esistono molti operatori che pur avendo la stessa forma e sintassi, differiscono nella semantica.
Quando tu esegui un operazione del tipo 2 + 5, il compilatore durante la fase di compilazione interpreta quel '+' come una somma tra numeri interi, e nel codice finale, quello che sarà dato in pasto al computer conterrà il codice che permette di eseguire una somma tra interi. Ovviamente ciò vale per ogni operazione, quando il compilatore analizza l'espressione (a + b) / 2 la trasforma in una somma d'interi che restituisce un intero ed una divisione tra interi che restituisce un intero. In C come in ogni altro linguaggio di programmazione, esiste una gerarchia dei tipi di dati, questa gerarchia viene comoda quando si devono eseguire delle operazioni dove esistono operandi che appartengono ad insiemi differenti. Quando ciò accade infatti tutti gli operandi che prendono parte all'espressione vengono convertiti implicitamente (coercion) attraverso meccanismi di conversione di tipo al tipo presente nell'espressione chè si trova più in alto nella gerarchia. Nel tuo caso comunque prendevano parte all'espressione solo interi, il motivo per il quale se definisci a e b come reali il programma funziona è perchè i float si trovano più in alto nella gerarchia e il 2 intero viene trasformato in reale e viene restituito un reale. In C si possono inserire numeri direttamente e farli interpretare come reali concatenando il numero con '.0' Es.. 2.0 che però di default viene considerato come un double, per restringerlo a float si usa la sintassi 2.0f. Adesso quindi l'espressione risulta essere (a + b) / 2.0f, ed essendo 2.0f float, una volta eseguita la somma di interi il risultato viene convertito in float e viene fatta una divisione tra float che restituisce un float.
Spero di esserti stato d'aiuto.
 
Ciao , il tuo è un problema dato dai tipi delle variabili in gioco.
Aggiungerei oltre a ciò che hanno detto gli altri che quando hai problemi di questo tipo in cui magari vuoi lavorare con variabili di un determinato tipo (nel tuo caso gli interi) però vuoi ottenere un float puoi anche effettuare un casting, che altro non è che una conversione del tipo in un altro tipo (detto in parole povere)
In questo caso mi pare un pò eccessiva come soluzione però puoi risolvere facendo così:

int a, b;
float media;
printf("inserisci il primo numero: \n");
scanf("%d", &a);
printf("inserisci il secondo numero: \n");
scanf("%d", &b);
media = ((float) a +(float) b ) / 2;
printf("la media tra i due numeri C( %f\n\n\n", media);