• Viernes 8 de Noviembre de 2024, 19:11

Autor Tema:  Problema con doble validacion  (Leído 1679 veces)

alvaritoCABJ

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Problema con doble validacion
« en: Sábado 31 de Marzo de 2012, 04:02 »
0
Hola soy nuevo en el foro.
Estoy haciendo un programa, y tengo un pequeño problema:
El programa consiste de un vector de 11 elementos, al cual se le ingresan valores menores que 1. Entonces valido con while, que todo valor que se ingrese, debe ser menor que 1 o si no el programa vuelve a pedir ese elemento del vector LIQST. Hasta ahí funciona bien, después la siguiente validación consiste en que la sumatoria de los elementos del vector LIQST, debe ser igual a 1.
Esto funciona para distintas casos. Ejemplo:


LIQST[0]=0.2
LIQST[1]=0.2
LIQST[2]=0
LIQST[3]=0
LIQST[4]=0
LIQST[5]=0.2
LIQST[6]=0.2
LIQST[7]=0
LIQST[8]=0
LIQST[9]=0
LIQST[10]=0.2

Y el resto de convinaciones.
pero no me funciona para una en particular:

LIQST[0]=0.1
LIQST[1]=0.1
LIQST[2]=0.1
LIQST[3]=0.1
LIQST[4]=0.1
LIQST[5]=0.1
LIQST[6]=0.1
LIQST[7]=0.1
LIQST[8]=0.1
LIQST[9]=0.1
LIQST[10]=0.0

La sumatoria es igual a 1

Sin importar Donde se ponga el valor igual a 0, el programa no pasa cuando se le ingresan esos datos. No solo sucede con esa combinacion, tambien pasa con otras mas  :ayuda:
No se si sea el compilador que uso, u otra cosa. Por cierto uso Dev-C++
Aqui el programa

Código: [Seleccionar]
#include<iostream.h>
#include<string.h>
int main()
{float GASSEP[11],GASST[11],LIQST[11],M=0,V=0,c, PMA[11],SGC7,VM[11],D,SG,API,Densidades[11]={50.032,51.044,19.98,29.34,31.62,35.11,36.42,38.9 6,39.36,41.40,53.11};
short i,j,k,PM[11]={34,44,16,30,44,58,58,72,72,86};
char comp[11][15]={"CO2","H2S","C1","C2","C3","iC4","nC4","iC5","nC 5","C6","C7+"};

cout<<"DATOS DEL STOK TANK\nComposicion liqido:\n";
do{for(i=0;i<=10;i++)
{cout<<comp[i]<<"\t";
cin>>LIQST[i];
while(LIQST[i]>1)
{cout<<comp[i]<<"\t";
cin>>LIQST[i];}
while(LIQST[i]>1);}
system ("cls");
c=0;
for(j=0;j<=10;j++)
c=c+LIQST[j];
cout<<"\n";}
while(c!=1);
system ("pause");
}

Si alguien me puede ayudar.
Cualquier comentario o ayuda es util, la verdad no se que pasa.
gracias

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Problema con doble validacion
« Respuesta #1 en: Sábado 31 de Marzo de 2012, 21:13 »
0
El problema viene de la falta de precision de los numeros de punto flotante, aunque tu no lo veas a simple vista, cuando tu guardas un numero de punto flotante siempre habra un error de redondeo, al haber un error de redondeo  entonces cuando tu preguntas while(c!=1); si c no es exactamente uno, la condicion sera verdadera y seguira ejecutando el ciclo. En tu caso usando los valores que pones, la suma de 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.0 me dio internamente 1.00000011920928960000, que como puedes ver no es exactamente el numero uno.

Hay varias soluciones para este problema, la mas sencilla que veo en tu caso es sacar el valor absoluto de la diferencia c-1.0 y utilizar un valor de "tolerancia" para determinar hasta que digito consideras que el numero es igual o diferente.

Dicho de otro modo deberas cambiar la condicion de tu do..while:

Código: [Seleccionar]
while(c!=1);

por:

Código: [Seleccionar]
while(fabs(c-1.0) > 0.1);

Si deseas una menor tolerancia, simplemente modifica el 0.1 por el valor que consideres que seria el mas adecuado para tu caso (0.01, 0.001, 0.0001, etc.)

Saludos =)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

alvaritoCABJ

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re:Problema con doble validacion
« Respuesta #2 en: Sábado 31 de Marzo de 2012, 21:55 »
0
Muchas gracias ProfesorX  :bravo:, voy a ver si me funciona!.
Edito: Lamentablemente no me funciono. Empiezo a creer que es el compilador que uso.
Si alguien sabe de alguno que no tenga este inconveniente. Le agradeceria.
Edito por segunda vez: Probando y mirando con detenimiento, ahora si se sale del bucle, pero lo hace cuando ingreso por segunda vez los datos, es decir a la primera me marca error, pero cuando digito los mismos datos por segunda vez si se ejecuta como deberia.
Estuve mirando. y cuando c=10 va a salirs del bucle, entonces ya no cumple la condicion.
Nuevamente, muchisimas gracias ProfesorX.
« última modificación: Domingo 1 de Abril de 2012, 16:42 por alvaritoCABJ »