frazioni in c

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
macisamuele
Prode Principiante
Messaggi: 162
Iscrizione: giovedì 8 marzo 2007, 22:44

Re: frazioni in c

Messaggio da macisamuele »

andrea88 tu x caso hai quelke idea a proposito???cioè hai qualke idea su come separere da un numero la parte intera e quella decimale???
macisamuele
Avatar utente
danilo84
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 929
Iscrizione: lunedì 27 novembre 2006, 9:24
Località: Taranto

Re: frazioni in c

Messaggio da danilo84 »

Vedi se questo ti va bene:

Codice: Seleziona tutto

#include <stdio.h>

main() {

char numero[20];
int j=0;
for (j=0;j<20;j++)
	numero[j]='\0';

scanf("%s",&numero);
int intero=0, decimale=0,i;
int flag=1;
for (i=0;i<20;i++) {
	if ((numero[i]==',')||(numero[i]=='.'))
		flag=0;		
	if (flag==1)
		intero = (intero * 10) + (numero[i] - '0');
	else if (numero[i] >= '0' && numero[i] <='9') 
		decimale = (decimale * 10) + (numero[i] - '0');

}	
printf("NUMERO: %d  %d",intero,decimale);
}
Avatar utente
bite
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3798
Iscrizione: sabato 19 maggio 2007, 22:10

Re: frazioni in c

Messaggio da bite »

macisamuele ha scritto: si ok...ma come faccio a contare i numeri dopo la virgola???
mmh... mi sa che qualcosa ti manca. Che vuol dire contare i numeri dopo la virgola?
Un numero reale ha sempre infinite cifre dopo la virgola; poi ci sono dei numeri particolari, i razionali (un sottoinsieme dei reali) per i quali le cifre sono tutte nulle da un certo punto in avanti, almeno in una certa base; in altre basi risultano periodici.
Esempi:
razionale 1/2 = 0.5000000...
razionale 1/3 = 0.3333333... periodico, ma in base 3 si scrive 0.100000...
razionale 1/7 = 0.142857142857... periodico, ma in base 7 si scrive 0.100000...
irrazionale sqrt(2) = 1.41421356... non periodico, e non esiste una base intera in cui tutte le cifre siano zero da un certo punto in avanti.
Dal momento che si lavora con precisione finita, il numero di cifre significative è limitato dalla precisione. Secondo lo standard IEEE 754, un double ha 64 bit, di cui 1 riservato al segno 's', 11 all'esponente 'e'  e 52 alla mantissa 'm'; il numero, se non è zero, viene rappresentato (in base binaria) come (-1)^s * 1.m * 2^e, cioé con un 1 implicito prima del punto decimale; quindi i bit significativi della mantissa sono in realtà 53 (ho intenzionalmente trascurato una cosa che si chiama bias ed è concettualmente inessenziale).
Esempio: 1/2 viene rappresentato con s=0 (positivo), m=0, e=-1, cioé (-1)^0 * 1.0 * 2^(-1)

Il numero di cifre di un intero n in base b è int(log_b(n))+1; ad esempio, log_10(3456) = 3.539, e infatti 3456 ha int(3.539)+1=4 cifre.
Quindi se la mantissa ha 53 cifre binarie, il massimo numero intero che può contenere è 2^53, e il numero di cifre decimali significative è int(log_10(2^53))+1=16.
Quindi non c'è bisogno di contare le cifre... sono sempre 16

Quello che potresti fare è stabilire il tuo livello di precisione desiderato, diciamo ad esempio 3 cifre decimali.
Moltiplichi il numero per 10^3 e ne prendi la parte intera: quello è il tuo numeratore; 10^3 è il tuo denominatore.
Ad esempio int(3.141592653... * 1000) = 3141, e quindi la frazione è 3141/1000
Poi dovresti avere una funzioncina per semplificare quando possibile numeratore e denominatore come ti ha proposto danilo84.
Avatar utente
danilo84
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 929
Iscrizione: lunedì 27 novembre 2006, 9:24
Località: Taranto

Re: frazioni in c

Messaggio da danilo84 »

Prova cosi...ho unito i due codici che ti ho dato. Chiede i numeri come unico numero e non prima la parte intere e poi la parte decimale. Alla fine ti mostra la frazione. Se lo vuoi fare tu da solo non lo vedere...potrà essere utile per altri...chi lo sa  :)

Codice: Seleziona tutto

#include <stdio.h>

main() {
int intero=0,decimale=0,numeratore=0,denominatore=1,i=0,cont=0,app=0;

char numero[20];
int j=0;
for (j=0;j<20;j++)
	numero[j]='\0';

printf("\n Inserire il numero nel formato (x.y) oppure (x,y): ");
scanf("%s",&numero);
int flag=1;
for (i=0;i<20;i++) {
	if ((numero[i]==',')||(numero[i]=='.'))
		flag=0;		
	if (flag==1)
		intero = (intero * 10) + (numero[i] - '0');
	else if (numero[i] >= '0' && numero[i] <='9') 
		decimale = (decimale * 10) + (numero[i] - '0');

}
if (numeratore==0) numeratore=1;

app=decimale;

while(app>10) {  
   app=app/10;
   cont++;
}

for (i=0;i<cont+1;i++) {
    intero*=10;
    denominatore*=10;
}

numeratore=intero+decimale;

int num=computeGCD(numeratore,denominatore);
do {
  numeratore=numeratore/num;
  denominatore=denominatore/num;
  num=computeGCD(numeratore,denominatore);
} while(num!=1);


printf("\n La frazione e': %d/%d\n",numeratore,denominatore);

}

int computeGCD(long n, long d)
{
 	long temp = 0;
	while (d > 0) {
		temp = d;
		d = n % d;
		n = temp;
	}
	return n;
}
Avatar utente
macisamuele
Prode Principiante
Messaggi: 162
Iscrizione: giovedì 8 marzo 2007, 22:44

Re: frazioni in c

Messaggio da macisamuele »

mi fareste capire cosa non va in questo rpogramma...perchè dopo che mi dice la frazione non semplificata si blocca e non continua +???(praticamente si blocca intorno al secondo ciclo while)

Codice: Seleziona tutto

#include<stdio.h>

main()
{
	float a,ndv;
	int npi,ndvi,den,e;
	printf("INSERISCI IL NUMERO DA CUI RICAVARE LA FRAZIONE:\t");
	scanf("%f",&a);
	npi=(int)a;
	ndv=a-npi;
	ndvi=(int)ndv;
	den=1;
	printf("parte intera\t\t\t%d\nparte dopo la virgola\t\t%f\n",npi,ndv);
	if (ndv==0)
		printf("LA FRAZIONE DEL NUMERO E' %.0f/1 -> %.0f\n",a,a);
	else {
	while (ndv-ndvi!=0) {
		npi*=10;
		ndv*=10;
		ndvi=(int)ndv;
		den*=10;
	}
	printf("LA FRAZIONE NON SEMPLIFICATA E': %d/%d\n",npi+ndvi,den);
	e=1;
	while (a*e-npi*e!=0) {
		e++;
	}
	printf("%.0f/%d\n",a*e,e);
	}
	return 0;
}
vi prego aiutatemi perchè io sto cercando di farmi questo benedetto programma, che eseguendolo a penna su 1 bel foglietto funziona..., ma compilandolo si blocca...cosa devo fare???grazie

macisamuele
macisamuele
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti