• Lunes 16 de Diciembre de 2019, 15:11

Autor Tema:  Funcion convertir STRING a REAL  (Leído 5686 veces)

baldur

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Funcion convertir STRING a REAL
« en: Jueves 22 de Enero de 2009, 23:09 »
0
Hola, estoy haciendo una práctica en PASCAL, pero este tiene que ser ISO PASCAL 1026, que viene pelado vamos...sin nada...xD

Lo que necesito es crearme unas funciones o función que me permita el cambio de string a real, además de las típicas de sacar acentos y esas pijadas... pero como el pascal lo he utilizado muy poco, pues no soy capaz.
Si me podeis hechar una mano os lo agradezco.

Un Saludo y Gracias!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Funcion convertir STRING a REAL
« Respuesta #1 en: Viernes 23 de Enero de 2009, 09:15 »
0
Pues vas a tener que recorrer la cadena de caracteres e ir procesándola sobre una variable Real que tengas declarada. Por ejemplo, fijarte dónde está la coma decimal, por cuánto multiplicar la cifra que halles en la cadena dependiendo de su posición, etc...

Suerte y salud

SergioyoPlayer

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Re: Funcion convertir STRING a REAL
« Respuesta #2 en: Sábado 24 de Enero de 2009, 21:07 »
0
El procedimiento VAL te lo hace ^^
VAL(cadena_a_convertir:STRING,VAR número_que_devuelve:BYTE/WORD/INTEGER/LONGINT/REAL,etc.,VAR error:BYTE - indica la posición del STRING donde hay un caracter erróneo)

La puedes ver en la carpeta "FPC/versión/DOC/rtl.pdf
Y en el pdf, en la unidad SYSTEM (es la que viene "por defecto" con los mínimos para programar). Concretamente, en el apartado "Procedures and Functions".

Suerte ;)

baldur

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Funcion convertir STRING a REAL
« Respuesta #3 en: Sábado 24 de Enero de 2009, 21:55 »
0
Cita de: "SergioyoPlayer"
El procedimiento VAL te lo hace ^^
VAL(cadena_a_convertir:STRING,VAR número_que_devuelve:BYTE/WORD/INTEGER/LONGINT/REAL,etc.,VAR error:BYTE - indica la posición del STRING donde hay un caracter erróneo)

La puedes ver en la carpeta "FPC/versión/DOC/rtl.pdf
Y en el pdf, en la unidad SYSTEM (es la que viene "por defecto" con los mínimos para programar). Concretamente, en el apartado "Procedures and Functions".

Suerte ;)


Estamos hablando de PASCAL, versión ISO 1026...viene pelao, sin esas funciones.... te comento que hasta te tienes que crear una función para enlazar con ficheros...xD(no existe la assing)...xD

SergioyoPlayer

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Re: Funcion convertir STRING a REAL
« Respuesta #4 en: Domingo 25 de Enero de 2009, 00:58 »
0
Juas!
Pues lo que dijeron arriba
Quita todos los caracteres que no sean números o punto.
Verifica que solo hay aun punto
Y a partir de ahí, tendrás 2 cadenas (salvo que no haya punto, que tendrás una).
La "de la izquierda", multiplicas por 10^n, y la "de la derecha", por 10^(-n) y yatá
(lo de ^-n, es por 0.1, 0.01, 0.001, etc.)

Suerte ^^

baldur

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Funcion convertir STRING a REAL
« Respuesta #5 en: Domingo 25 de Enero de 2009, 03:14 »
0
Muchas gracias por responder.
He tenido que crear 3 funciones. Una que me convierta un CHAR a un INTEGER, otra que me calcule las pontencias, y por último la global de StringAreal.
Pero tengo un problema y no logro solucionarlo. Y es que me convierte todo bien excepto los múltiplos de 10, osea los que tienen un 0 en el lugar de las unidades.
Por ejemplo, 9.5 o 11.1 o 2.4 me los convierte bien, pero si pongo 10 me devuelve 1, si pongo 20.5 me devuelve 2.5, osea que no guarda el 0 de las unidades.... os pongo aquí todo lo que he hecho, a ver si me podeis hechar una mano... Un Saludo y Gracias!

Código: Text
  1.  
  2. Function CharToInt (caracter: char) : integer;
  3. Begin
  4.     CharToInt:=Ord(caracter)-48;{Devuelve un integer correspondiente con el número guardado en char}
  5. End;
  6.  
  7. FUNCTION potencia( numero, exponente : integer ) : real;
  8. VAR resultado:integer VALUE 0;
  9.     expNeg:boolean;
  10. begin
  11.     resultado := 1;
  12.     If exponente<0 then
  13.     begin
  14.         exponente:=-(exponente);
  15.         expNeg:=true;
  16.     end;
  17.     while exponente > 0 do
  18.     begin
  19.     resultado := resultado*numero;
  20.     exponente:=exponente-1;
  21.     end;
  22.     If Not expNeg Then potencia:=resultado
  23.     Else
  24.         potencia:=1/resultado;
  25. end;
  26.  
  27. FUNCTION StringToReal(cadenaNum:tCadenaFuncion):real;
  28. VAR cadenaEntera:string(length(cadenaNum)); 
  29.     cadenaDecimal:string(length(cadenaNum));   
  30.     parteEntera:real VALUE 0;
  31.     AuxEntero:real VALUE 0;
  32.     parteDecimal:real VALUE 0;
  33.     AuxDecimal:real VALUE 0;
  34.     puntoEncontrado:boolean VALUE FALSE;
  35.     i:integer VALUE 0;
  36. BEGIN
  37.     cadenaEntera:='';
  38.     cadenaDecimal:='';
  39.     For i:=1 To length(cadenaNum) Do
  40.     begin
  41.         If (cadenaNum[i]='.') then puntoEncontrado:=TRUE
  42.         Else
  43.         begin
  44.             If Not puntoEncontrado Then cadenaEntera:=cadenaEntera+cadenaNum[i]
  45.             Else
  46.                 cadenaDecimal:=cadenaDecimal+cadenaNum[i];
  47.         end;           
  48.     end;
  49.  
  50.     For i:=length(cadenaEntera) downto 1 Do
  51.     begin
  52.         AuxEntero:=parteEntera;
  53.         parteEntera:=(CharToInt(cadenaEntera[i])*potencia(10,(i-1)))+AuxEntero;   
  54.     end;
  55.     If puntoEncontrado Then
  56.     begin
  57.         For i:=1 To length(cadenaDecimal) Do
  58.         begin
  59.             AuxDecimal:=parteDecimal;
  60.             parteDecimal:=(CharToInt(cadenaDecimal[i])*potencia(10,(-i)))+AuxDecimal;   
  61.         end;
  62.         StringToReal:=parteEntera+parteDecimal;
  63.     end
  64.     Else
  65.         StringToReal:=parteEntera;
  66. END;
  67.  
  68.  

SergioyoPlayer

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Re: Funcion convertir STRING a REAL
« Respuesta #6 en: Domingo 25 de Enero de 2009, 11:41 »
0
Mira; te puedes guiar por la "distancia" hasta la "coma" o fin de subcadena:

Pongamos 20.5:
la parte de la derecha dices que no tienes problema; la omito (yo la haría simétricamente al bucle de abajo)

Empleo la subcadena subcadena:=COPY(cadena,1,POS('.',cadena));

(si no tienes la función COPY, pues la haces a mano con un WHILE)

por ahora tenemos 0.5;

Luego, haces:

FOR i:=LENGTH(subcadena) DOWNTO 1 DO
 BEGIN
  numero:=numero+ChartoINT(subcadena)*Potencia(10,LENGTH(cadena)-i);
 END;

Que quedaría (por pasadas de bucle):
0.5+0*10^(2-2)=0.5+0*1=0.5
0.5+2*10^(2-1)=0.5*2*10^1=0.5+20=20.5

Espero no haberme equivocado :s

baldur

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Funcion convertir STRING a REAL
« Respuesta #7 en: Domingo 25 de Enero de 2009, 12:10 »
0
Tío, muchiiiisimas GRACIAS!, me has salvado... :D

Pues yo tenía en que el exponente era i-1 y cambiadolo por lo que tu dices, length(cadenaEntera)-i ya rula...xD

Al final me han quedado así los dos bulces:

Código: Text
  1.  
  2.         For i:=length(cadenaEntera) downto 1 Do
  3.     begin
  4.         AuxEntero:=parteEntera;
  5.         parteEntera:=(CharToInt(cadenaEntera[i])*potencia(10,length(cadenaEntera)-i))+AuxEntero;    
  6.     end;
  7.  
  8.  

Código: Text
  1.  
  2.         For i:=1 To length(cadenaDecimal) Do
  3.         begin
  4.             AuxDecimal:=parteDecimal;
  5.             parteDecimal:=(CharToInt(cadenaDecimal[i])*potencia(10,(-i)))+AuxDecimal;   
  6.         end;
  7.  
  8.  

En la potencia de los decimales, mando como exponente la posición de la i pero negativa(para que de 0.1,0.2...etc), no sé si está correcto....es decir, por ahora me funciona, pero no sé si en algún caso puede cascar...

Gracias por todo y un Saludo!

SergioyoPlayer

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Re: Funcion convertir STRING a REAL
« Respuesta #8 en: Domingo 25 de Enero de 2009, 23:21 »
0
La primera asignación se puede omitir, poniendo en la segunda esto (dentro del FOR, me refiero):
   parteDecimal:=(CharToInt(cadenaDecimal)*potencia(10,(-i)))+ParteDecimal;

Esto es porque primero resuelve la función algebraica de la derecha, y el resultado lo mueve a la parte izquierda de la asignación. Sabiendo esto, te ahorras un paso omisible (inútil) como es el crear una variable auxiliar, y estar haciendo una asignacón por pasada de bucle.

Ánimo  :good: