[C]programma per rapporti
Buongiorno,
sto cercando di risolvere il seguente problema:
"Progettare un algoritmo che effettui la lettura da tastiera di una serie di coppie di valori numerici.
L’algoritmo deve calcolare e stampare il rapporto tra il valore minore e quello maggiore dei due. Il
programma termina quando uno dei due valori o entrambi sono uguali a zero."
Ecco la mia soluzione, mi sembra corretta, ma stampa sempre e in ogni caso uno 0 ! perche'?
sto cercando di risolvere il seguente problema:
"Progettare un algoritmo che effettui la lettura da tastiera di una serie di coppie di valori numerici.
L’algoritmo deve calcolare e stampare il rapporto tra il valore minore e quello maggiore dei due. Il
programma termina quando uno dei due valori o entrambi sono uguali a zero."
Ecco la mia soluzione, mi sembra corretta, ma stampa sempre e in ogni caso uno 0 ! perche'?
int main(void) { int a,b; float rapporto; printf("Inserire coppia di valori numerici: \n"); scanf("%i %i",&a,&b); if (a!=0 | b!=0) { if( a<b){ rapporto=a/b; printf("\nIl rapporto (a/b) vale %f\n",rapporto); } else { rapporto=b/a; printf("\nIl rapporto (b/a) vale %f\n",rapporto); } } else printf("\nProgramma terminato!\n"); }
Risposte
Ciao,
da una prima occhiata vedo che questa riga
è sbagliata: l'OR si fa con ||. In ogni caso sarebbe sbagliato anche questo...
Il testo ti dice che l'algoritmo deve terminare quando O uno O entrambi sono uguali a zero, quindi ciò significa che il programma deve proseguire a fare il calcolo quando ENTRAMBI sono diversi da zero.
Di conseguenza la condizione corretta è
da una prima occhiata vedo che questa riga
if (a!=0 | b!=0) {
è sbagliata: l'OR si fa con ||. In ogni caso sarebbe sbagliato anche questo...

Il testo ti dice che l'algoritmo deve terminare quando O uno O entrambi sono uguali a zero, quindi ciò significa che il programma deve proseguire a fare il calcolo quando ENTRAMBI sono diversi da zero.
Di conseguenza la condizione corretta è
if(a != 0 && b != 0)...

ciao, vero che si deve mettere il doppio operatore! Grazie..
ma il problema resta...con ogni valore inserito mi restituisce 0
ma il problema resta...con ogni valore inserito mi restituisce 0

Il fatto è che un rapporto tra int è un int, quindi 0.xxx viene troncato a $0$.
Questo è il codice funzionante: guarda la differenza e se hai altri dubbi ci fai sapere.
Questo è il codice funzionante: guarda la differenza e se hai altri dubbi ci fai sapere.
#include <stdio.h> #include <stdlib.h> int main(void) { int a,b; float rapporto; printf("Inserire coppia di valori numerici: \n"); scanf("%i %i",&a,&b); if (a!=0 && b!=0) { if( a<b) { rapporto=(float)a/(float)b; printf("\nIl rapporto (a/b) vale %f\n",rapporto); } else { rapporto=(float)b/(float)a; printf("\nIl rapporto (b/a) vale %f\n",rapporto); } } else printf("\nProgramma terminato!\n"); return 0; }

grazie!
due cose sole:
1) La perchè la includi?
2)Cosa significa formalemente mettere un float tra parentesi prima delle variabili $a$ e $b$ nel calcolo del rapporto?
Significa che potrei ometterlo nel caso dichiarassi gia' $a$ o $b$ come variabili float?
grazie!
due cose sole:
1) La
2)Cosa significa formalemente mettere un float tra parentesi prima delle variabili $a$ e $b$ nel calcolo del rapporto?
Significa che potrei ometterlo nel caso dichiarassi gia' $a$ o $b$ come variabili float?
grazie!
"frab":
1) Laperchè la includi?
2)Cosa significa formalemente mettere un float tra parentesi prima delle variabili $a$ e $b$ nel calcolo del rapporto?
Significa che potrei ometterlo nel caso dichiarassi gia' $a$ o $b$ come variabili float?
1. più che altro per abitudine. Nel tuo caso se ne può fare a meno.
2. quel float tra parentesi significa fare il cast verso un altro tipo, cioè imporre che $a$ venga trattato come un float. In questo modo il rapporto tra due float è un float. Se tu dichiari $a$ come float allora non ce n'è alcun bisogno.
Grazie! Ho capito allora come funziona il cast anche! ciao!
Bene!

È sufficiente un solo cast, il secondo viene fatto implicitamente. Un modo alternativo per fare il cast, anche se per certi versi meno chiaro è sommare alla variabile 0.0f (il secondo zero è opzionale, se vuoi la conversione a double devi togliere la f).
Volendo potresti addirittura leggere i due valori come dei float direttamente.
Volendo potresti addirittura leggere i due valori come dei float direttamente.
Grazie vict!
Infatti se io dichiarassi le variabili già come float non dovrei passare dal casting.
Infatti se io dichiarassi le variabili già come float non dovrei passare dal casting.
