Pascal/Turbo Pascal - Programa: lectura de datos en archivo de texto

 
Vista:

Programa: lectura de datos en archivo de texto

Publicado por nacho (2 intervenciones) el 20/10/2007 19:52:29
Que tal gente, vengo a pedir ayuda con un programa que me mandaron a hacer. Es así: en un archivo de texto hay datos de una cuenta bancaria, en formato:

Reglón en blanco
A 300
D 1200
R 800
I 20
D 200
R 400
I 40
...
F

Donde A es el saldo anterior, D es el depósito, R es el retiro de dinero, e I es el interés al saldo anterior, y la F indica el final del programa. Pueden haber muchos retiros, o muchos depósitos, por eso los puntos suspensivos al final, el algoritmo tiene que ser general para un número indeterminado de retiros, depositos, etc. El saldo de la cuenta tiene que agregarse en el final de ese archivo. Alguien me da una mano que soy medio de madera con algoritmos? El problema es que no se como hacer una estructura de repetición que lea indefinidamente y clasifique los datos como A D R o I, hasta que se encuentra con una F y termine la lectura.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Programa: lectura de datos en archivo de texto

Publicado por M@rceloL (25 intervenciones) el 21/10/2007 01:19:38
Hola, Nacho. La cosa es más o menos así:

var Linea:String;
Archivo:Text;

function Evaluar(const Linea:String; var Dato:integer):char;
var Aux2:integer;
begin
...Val(Copy(Linea,3,length(Linea)-2),Dato,Aux2);
...Evaluar:=Linea[1];
end;

var Info:integer;

begin
...Assign(Archivo,'c:\prueba.txt'); <----Asignamos el archivo
...Reset(Archivo); <---Abrimos el archivo
...repeat
.....ReadLn(Archivo,Linea); <----Leemos una línea del archivo
.....case Evaluar(Linea,Info) of
........'D': writeln('Depósito de ',Info);
........'R': writeln('Retiro de ',Info);
.....end;
...until Linea[1]='F';
...Close(Archivo);
end.

El archivo se declara de tipo Text. Lo recorremos con el ciclo repeat-until. Que va a ejecutar lo que tiene adentro hasta que la primera letra de la línea sea F.

Un String es como un arreglo de tipo char, de ahí que Linea[1] nos dé la primera letra de lo que se leyó.

Evaluar devuelve la primera letra del string y en Dato nos devuelve el valor integer de la segunda parte de la línea.

La función Val es la que convierte de String a integer.

Espero se entienda. Cualquier cosa preguntá.

PD: Ojo, no sé si tendrás que verificar por posibles errores, porque el archivo podría tener letras en minúsculo o números equivocados y este ejemplo fallaría miserablemente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Programa: lectura de datos en archivo de texto

Publicado por nacho (2 intervenciones) el 21/10/2007 02:09:31
M@rcelol, muchas gracias por responder. El problema es (y perdón que me olvide de aclarar) que tengo que usar operaciones básicas, como Case, Repeat, etc. No puedo incluir funciones. Te muestro lo que había hecho yo, es parecido, pero en vez de cada linea tratarla como una cadena, por cada línea asigno 2 variables: una es "tipo", y la otra "num", donde tipo es un carácter, y num es el numero correspondiente a ese carácter, y luego hago un case of tipo. El programa que hice es así:

{Sección Declarativa}
Program Ej2Modulo1; {se nombra al programa}

Uses
Crt; {subprograma de manejo de pantalla}
Var
saldoant,deposito,retiro,interes,saldofinal: real; {estos datos son números reales}
nomarch: string[20]; {representa el nombre del archivo de texto}
datos: text; {reperesenta al archivo de texto de donde se leen los datos}
tipo: char; {la letra que identifica la operación en el archvio de texto es un carácter}
num: real; {el numero siguiente al tipo de operación es un real}
{Sección Algorítmica}
Begin {inicio del programa}
{Prólogo}
ClrScr; {limpieza de pantalla}
WriteLn('CÁLCULO DEL SALDO DE UNA CUENTA BANCARIA'); {escribe en la pantalla}
WriteLn; {deja una linea blanco}
WriteLn('Ingrese el nombre del archivo de texto con los datos de la cuenta:'); {escribe en la pantalla}
ReadLn(nomarch); {asigna el valor agregado por teclado a la variable nomarch}
Assign(datos,nomarch); {asociación del archivo dodne se encuentran los datos a la variable datos}
Reset(datos); {preparación de datos para lectura}

{Lectura de datos}
ReadLn(datos); {se comienza a leer desde la segunda linea del archivo de texto}
saldoant:=0; {inicialmente, estas variables tienen valor 0}
deposito:=0;
retiro:=0 ;
interes:=0 ;
Repeat
ReadLn(datos,tipo,num) ; {se lee desde el archivo de texto la letra y el número, y se los vinculan con las variables tipo y num}
Case tipo of
'A':saldoant:=saldoant+num ; {si la primera letra es una A, se le suma el valor a saldoant}
'D':deposito:=deposito+num ; {si la primera letra es una D, se le suma el valor a deposito}
'R':retiro:=retiro+num ; {si la primera letra es una R, se le suma el valor a retiro}
'I':interes:=interes+num ; {si la primera letra es una I, se le suma el valor a interes}
end;
Until tipo='F'; {cuando se lee una F, se termine la lectura de datos}
Close(datos); {cierre del archivo de texto}

{Resolución}
saldofinal:=(saldoant*interes)+deposito-retiro; {se cálcula el valor del saldo final}

{Epílogo} {disposición de datos en el mismo archivo de texto}
Append(datos); {permite agregar información en el archivo}
WriteLn(datos); {deja un renglón en blanco en el archivo}
WriteLn(datos,'El Saldo de la cuenta es de',saldofinal); {escribe en el archivo de texto}
Close(datos); {cierre del archivo de texto}
WriteLn('El saldo se agregó a ',nomarch); {escribe en la pantalla}
WriteLn('Fin del programa'); {escribe en la pantalla}
ReadLn {se genera una pausa};
End.

El problema es que cuando lo corro, me tira error exitcode = 106, un problema que tiene que ver con el nombre del archivo de texto en el cual están almacenados los datos, asique no hay manera de que pueda comprobar si el programa es correcto. Podrías revisar y ver porqué es que me tira exitcode = 106, o si ves algo posible para corregir?

Muchas gracias, nacho.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Programa: lectura de datos en archivo de texto

Publicado por Mariano (57 intervenciones) el 21/10/2007 02:42:54
Hola!!
Mira, tu error, es cuando lees el txt, que pones ReadLn(datos,tipo,num) , el archivo de texto se lee asi readln(archivo, linea), donde linea lo tene sq definir de tipo string, y dps, con una funcion, tomar x un lado el caracter y por otro lado los numeros.
No podes asignar dos variables como haces vos, x eso es que surge el error de tipo (error 106 en tiempo de ejecucion).

tenes q hacer asi:
readln(archivo, linea);
tipo:=linea[1];
y dps hacer una func, para q te tire los numeros que hay en linea, y q represente el valor numerico.

Cualquier cosa , preguntaa :)

un abrazoo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

CONSULTA

Publicado por federico (4 intervenciones) el 27/10/2007 03:03:15
Hola q tal?
tengo una duda con un programa que estoy haciendo en programacion pascal
cuando leo un archivo, previamente definido el mismo
Readln(arch, rarch);
m salta un error Nº 63 invalid file tipe
lo lei muchas veces el programa y no encuntro el error
Te agradeceria si te contactases con migo mediante el mail, como para facilitarme una ayuda!!
desde ya muchas gracias

[email protected]
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CONSULTA

Publicado por Mariano (57 intervenciones) el 27/10/2007 03:09:21
Hola!!, mira el problema es el siguiente, si es que entendi tu problema. Vos queres leer con readln un archivo de tipo binario, cuando lo tenes que leer con read nada mas.
por que pasa esto?? la sentencia readln lo que hace es leer, hasta encontrar el fin de linea, los archivos binarios, a diferencia de los archivos de texto, son escritos todoo de corrido, por lo que no existe eofln (marca de fin de linea).
Es por eso que te salta el error, porque lee hasta encontrar la marca de fin de linea que nunk encuentra

Cualquier cosa, volveee a preguntar :)
Avisaa si te sirvio!

un abrazo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Programa: lectura de datos en archivo de texto

Publicado por ELVER AMAYA (1 intervención) el 05/03/2008 17:26:11
NO LO HE PROBADO PERO SI HAY UN ERROR TE LOS HAGO SABER CON LA SENTENCIA QUE TINEN EL PRONBLEMA OK
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar