[C]programma per rapporti

frab1
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'?
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
minomic
Ciao,
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... :-D
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)...


:smt039

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

minomic
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.

#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;
}


:smt039

frab1
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!

minomic
"frab":

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?


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.

frab1
Grazie! Ho capito allora come funziona il cast anche! ciao!

minomic
Bene!

:smt039

vict85
È 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.

frab1
Grazie vict!
Infatti se io dichiarassi le variabili già come float non dovrei passare dal casting. :-)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.