Autor |
Mensaje |
dedosveloces
Nivel 3
Edad: 38
Registrado: 07 Feb 2006
Mensajes: 20
Ubicación: Pilar, Bs As
Carrera: Informática
|
|
hola, tengo un problema con pascal. estoy haciendo un tp y por alguna razon q desconozco no me funciona correctamente y la verdad me esta volviendo loco. por eso acudo al templo del saber donde esta lleno de sabios programadores q seguro saben mas q yo q recien empiezo en el tema.
el ejercicio es asi. tengo un archivo en el q ingreso registros de solicitudes de autos en los q consta el nro de solicitud, el titular, la marca, el modelo, y el color. y otro archivo donde ingreso bajas de dichas solicitudes, cancelaciones, y en estos registros consta el nro de baja y la causa de la misma. la idea es q el programa cree un 3er archivo con las solicitudes finales, osea, sacando las q figuraban en el archivo de bajas, comparando nro de solicitud con el nro de baja.
aca va el programas...
Código:
|
program tp2;
uses crt;
const
dirsolicitud='c:\sol.dat';
dirbajasolicitud='c:\bajsol.dat';
dirsolicitudfinal='c:\solfinal.dat';
type
trsolicitud=record
nrosolicitud:integer;
titular:string[40];
marca:string[20];
modelo:char;
color:integer;
end;
tarsolicitud=file of trsolicitud;
trbajasolicitud=record
nrobajasolicitud:integer;
causa:char;
end;
tarbajasolicitud=file of trbajasolicitud;
var
solicitud:tarsolicitud; {archivo secuencial ordenado ascendentemente por nrosolicitud}
bajasolicitud:tarbajasolicitud; {archivo secuencial ordenado ascendentemente por nrobajasolicitud}
solicitudfinal:tarsolicitud;
chevrolet,ford,fiat,renault,vw,peugeot,honda,torino,ferrari,mercedezbenz,bmw,toyota:integer;
cantrsolicitud,cantrbajasolicitud,cantrsolicitudfinal:integer;
procedure cargarsolicitud (var solicitud:tarsolicitud; var cantrsolicitud:integer);
var
r:trsolicitud;
k:integer;
begin
reset (solicitud);
clrscr;
writeln ('Las marcas con las cuales trabajamos son: ');
write (' (al ingresar la marca debera hacerlo de la manera en la cual');
writeln (' aparecen listadas a continuacion) ');
writeln ('- BMW');
writeln ('- Chevrolet');
writeln ('- Ferrari');
writeln ('- Fiat');
writeln ('- Ford');
writeln ('- Honda');
writeln ('- Mercedezbenz');
writeln ('- Peugeot');
writeln ('- Renault');
writeln ('- Torino');
writeln ('- Toyota');
writeln ('- VW');
readkey;
write ('Ingrese la cantidad de registros para el archivo de solicitudes: ');
readln (cantrsolicitud);
for k:=1 to cantrsolicitud do
begin
writeln ('Solicitud N§ ',k);
r.nrosolicitud:=k;
write ('Ingrese nombre del titular: ');
readln (r.titular);
repeat
write ('Ingrese marca: ');
readln (r.marca);
until ((r.marca)='ford') or ((r.marca)='vw') or ((r.marca)='torino')
or ((r.marca)='fiat') or ((r.marca)='mercedezbenz') or ((r.marca)='bmw')
or ((r.marca)='renault') or ((r.marca)='peugeot') or ((r.marca)='ferrari')
or ((r.marca)='honda') or ((r.marca)='toyota') or ((r.marca)='chevrolet');
write ('Ingrese modelo (A/B/C/D): ');
readln (r.modelo);
write ('Ingrese color (1-8): ');
readln (r.color);
write (solicitud,r);
end;
end;
procedure cargarbajasolicitud (var bajasolicitud:tarbajasolicitud; var cantrbajasolicitud:integer);
var
r:trbajasolicitud;
k:integer;
begin
write ('Ingrese la cantidad de registros para el archivo de bajas de solicitudes: ');
readln (cantrbajasolicitud);
for k:=1 to cantrbajasolicitud do
begin
write ('Ingrese numero de baja de solicitud: ');
readln (r.nrobajasolicitud);
write ('Causa de la baja (R/F/O): ');
readln (r.causa);
write (bajasolicitud,r);
end;
end;
procedure mostrarsolicitud (var solicitud:tarsolicitud);
var
r:trsolicitud;
begin
reset (solicitud);
read (solicitud,r);
while (not eof (solicitud)) do
begin
write ('- Solicitud N§:',r.nrosolicitud,', titular: ',r.titular,', marca: ',r.marca,', modelo: ',r.modelo);
writeln (', color: ',r.color);
read (solicitud,r);
end;
write ('- Solicitud N§:',r.nrosolicitud,', titular: ',r.titular,', marca: ',r.marca,', modelo: ',r.modelo);
writeln (', color: ',r.color);
end;
procedure mostrarbajasolicitud (var bajasolicitud:tarbajasolicitud);
var
r:trbajasolicitud;
begin
reset (bajasolicitud);
read (bajasolicitud,r);
while (not eof (bajasolicitud)) do
begin
writeln ('- ',r.nrobajasolicitud,', ',r.causa);
read (bajasolicitud,r);
end;
writeln ('- ',r.nrobajasolicitud,', ',r.causa);
end;
procedure dardebaja2 (var solicitud,solicitudfinal:tarsolicitud; var bajaregistro:tarbajasolicitud);
var
rs:trsolicitud;
rb:trbajasolicitud;
begin
reset (solicitud);
read (solicitud,rs);
reset (bajasolicitud);
read (bajasolicitud,rb);
while (not eof (bajasolicitud)) do
begin
if ((rb.nrobajasolicitud)=(rs.nrosolicitud)) then
begin
read (bajasolicitud,rb);
read (solicitud,rs);
end
else
begin
write (solicitudfinal,rs);
read (solicitud,rs);
end;
end;
while (not eof (solicitud)) do
begin
write (solicitudfinal,rs);
read (solicitud,rs);
end;
end;
begin
assign (solicitud,dirsolicitud);
rewrite (solicitud);
cargarsolicitud (solicitud,cantrsolicitud);
mostrarsolicitud (solicitud);
readkey;
assign (bajasolicitud,dirbajasolicitud);
rewrite (bajasolicitud);
cargarbajasolicitud (bajasolicitud,cantrbajasolicitud);
mostrarbajasolicitud (bajasolicitud);
readkey;
assign (solicitudfinal,dirsolicitudfinal);
rewrite (solicitudfinal);
dardebaja2 (solicitud,solicitudfinal,bajasolicitud);
mostrarsolicitud (solicitudfinal);
readkey;
end.
|
les doy un ejemplo de lo q devuelve el programa. si ingreso 4 registros al archivo de solicitudes y pido q se bajen el 2do y 3ro, el resultado q me devuelve es un archivo con 2 registros (eso lo hace bien) pero en vez de ser el 1ro y el 4to me devuelve el 1ro y el 2do. osea, en vez de borrar los q tenia q borrar me borra los ultimos.
si alguien puede ayudarme se lo agradeceria eternamente! tal vez es una boludes, no creo q sea un error groso de concepto y sino estoy frito pero la cosa es q no me funciona. por eso OH GRANDES SABIOS!!! AYUDENME!!!
Muchas gracias, saludos
eduar
pd: es una cagada q me pega todo sobre el margen izq pero no se como hacerlo de otra manera, les dejo el .pas por las dudas.
/edit: renombré. A.
\mod: Puse el código entre los tags de code. Fhran.
|
|
|
|
|
|
|
|
|
Mariano
Ex-Staff
Edad: 38
Registrado: 25 Ago 2005
Mensajes: 344
Carrera: Sistemas
|
|
Ufff... hace bastamte que no toco pascal... pero creo que entendí lo que estás haciendo más o menos.
Hay un par de problemitas menores, pero prefiero enfocarme primero en lo que hace que no te ande el código:
La carga del archivo de Solicutudes y de Bajas está bastante bien (en el código parece bien, y por lo que decís, anda). El tema es cuando vas a compararlos, y ahí estás metiendo la pata.
Lo que yo haría sería indexar las bajas (por número de solicitud que se dio de baja) y luego ir recorriendo el archivo de Solicitudes. Te escribo el pseudo-código para que veas la idea:
Código:
|
Indexar bajas (podría ser un vector de números de solicitud, ordenánadolos con algún método de ordenamiento que te hayan enseñado)
Abrir archivo de Solicitudes
Por cada solicitud{
Si el número NO está en el índice de bajas, escribirlo al archivo de salida (acá usás alguno de los métodos de búsqueda que seguramente te habrán enseñado)
}
El procedimiento termina y aprobás el TP
|
Espero haberte aclarado un poco... cualquier cosa volvé a postear o mandá MP
EDIT: Hipótesis: Estás en Algo I o en Computación y te enseñaron Ordenamiento y Búsqueda y NO usan memoria dinámica
|
|
|
|
_________________ El conocimiento es SÓLO UNA de las representaciones de la existencia
|
|
|
|
|
dedosveloces
Nivel 3
Edad: 38
Registrado: 07 Feb 2006
Mensajes: 20
Ubicación: Pilar, Bs As
Carrera: Informática
|
|
Buenas! antes que nada gracias tanto a Fhran por editar como a Mariano por responder.
me olvide de dar algunos datos. jeje. los archivos son secuenciales y estan ordenados. me parece q en ese caso el indexarlos o no, no deberia de cambiar la forma en la cual se procede para dar las bajas. en cuanto a lo q me dijiste q debia hacer, eso es lo q intente programar . yo lo hice en base a seguir el archivo de bajas, pero al reves seria lo mismo, igual lo hice en base al archivo de solicitudes y tampoco anda bien. la cosa es asi. leo la primer solicitud y la primer baja. si son iguales, vuelvo a leer tanto solicitud como baja (ahi lo estaria dando de baja porq no lo grabe). si no son iguales grabo la solicitud y leo la q sigue. asi volveria a comparar la baja q tenia. siempre teniendo en cuenta q los dos archivos estan ordenados por nro de solicitud o de baja y que todas las bajas q ingrese existen. de esa manera creo q deberia funcionar. teniendo en cuenta q estan ordenados. sin embargo cuando pongo dos solicitudes y una baja (para q borre la primer solicitud) el resultado final es la primersolicitud (borro la segunda en vez de la primera).
la verdad en este momento ya no se me ocurre nada, si pueden ayudarme se los agradeceria...
Saludos! eduar
PD: tu hipotesis es correcta. curse algo i con garcia (terrible error) y trate de aprender todo lo q pude de internet y libros. se busquedas y ordenamiento y no tengo idea de la memoria dinamica.
|
|
|
|
|
|
|
|
|
Mariano
Ex-Staff
Edad: 38
Registrado: 25 Ago 2005
Mensajes: 344
Carrera: Sistemas
|
|
Uhhhhh, García... yo cometí el mismo error. Pero bueh... hay que seguir adelante.
Bueno, en primer lugar te comento que si bien los archivos están ordenados, siempre que puedas hacer una solución que no dependa de esa condición es mucho mejor (en caso de un tp tenés que pesar si hacer que no dependa de la condición te va a tomar MUCHO más tiempo... si no te lo toma, hacela!... esa es la diferencia entre un TP aprobado y un TP bien hecho ) Acá estás tomadno dos hipótesis que te conviene evitar:
Los archivos están ordenados
Todas las bajas fueron altas
Si vos lográs que tu programa funcione independientemente de eso... MEJOR.
En casos cuando tengo que hacer un ABM yo pienso en el segundo archivo (el de bajas de solicitudes, en tu caso) como un filtro. Vos tenés que agarrar los actuales, y "filtrarlos"... si pasan el filtro, entran al archivo final. Si vos pasás sólo por el primer elemento del filtro... no va a andar bien en caso de que no esté ordenado.
Ahora volvamos a tu caso... en el código no encuentro errores, hice un seguimiento a mano y me da que tendría que funcionar... la verdad no sé que decirte. Hay veces que cuando algo no anda conviene empezar de 0 por otro lado, en lugar de buscar el error en algo que te parece que está bien.
Probá el sistema de armarte un vector con todos los códigos de bajas pedidas, y cada vez que leas un registro de las solicitudes, buscá su código ahí (una búsqueda binaria te va a andar joya para eso).
Temas para la próxima clase:
ENUMERADOS
until ("variable" IN "conjunto posible");
Edit: Justo escribió elPadrino que tiene más fresco Pascal... hacele caso!
|
|
|
|
_________________ El conocimiento es SÓLO UNA de las representaciones de la existencia
Última edición por Mariano el Jue Jul 20, 2006 12:05 pm, editado 1 vez
|
|
|
|
|
Stoma
Nivel 8
Edad: 36
Registrado: 06 Jul 2006
Mensajes: 510
Carrera: Informática
|
|
Bue... encontre un par de errores.
El primero y principal y causa de que no te anda, es que cursaste con García. Te entiendo, no sabias. A mi me pasó lo mismo (y si cursabas los lunes ibas conmigo).
Segundo error: hiciste lo que hizo Elena a la hora de leer archivos:
reset (solicitud);
read (solicitud,rs);
reset (bajasolicitud);
read (bajasolicitud,rb);
while (not eof (bajasolicitud)) do
es al reves, tenes que leer adentro del while. Cuando le das reset, le asigna valor a EOF. Si el archivo esta vacío, pone EOF en true. Si le das reset a un archivo vacio y despues lo lees (sin fijarte si es EOF como hiciste)... estas leyendo algo que no existe. Esto puede llegar a ocasionar que tu computadore explote volando en 10000 pedazos (fue una exageración nomas). El sistema es completamente al reves. Primero me fijo si termino el archivo. Si no terminó el archivo, entonces hay algo para leer y leo, si terminó... que voy a leer? Lo que hace despues no lo vi, pero Pascal funciona al verres y ahi es donde radica tu error. De la forma que lo dijo Elena es muchisimo mas facil... pero no funciona de esa manera...
Ahora me voy a comer, despues te pongo un codigo como ayuda para que lo puedas hacer
Saludos
|
|
|
|
_________________
Si yo te digo carnaval...
|
|
|
|
|
Stoma
Nivel 8
Edad: 36
Registrado: 06 Jul 2006
Mensajes: 510
Carrera: Informática
|
|
esta me pareció una manera piola de hacerlo:
esta hecho de modo qe permite que haya una baja de una solicitud que no existe (obviamente no procesa la baja, sino que dice que la solicitud a bajar es inexistente)
Código:
|
leerSol:=true;
leerBaja:=true;
while ((not eof(archSolicitudes)) and (not EOf(archBajas))) do
begin
if leerSol then
read(ArchSolicitudes,rSol);
if leerBaja then
read(ArchBajas,rBaja);
{una vez que leyo, compruebo datos}
if rSol.nroSolicitud < rBaja.nroSolicitudBaja then
begin
{no tiene baja}
write(archNuevo,rSol);
leerSol:=true;
leerBaja:=false;
end
else if rSol.nroSolicitud > rBaja.nroSolicitudBaja then
begin
{registro a bajar inexistente}
causaBaja:='el registro a bajar es inexistente';
printBajaRechazada(BajasRechazadas,causaBaja,rBaja);
{printBaja es un procedimiento encargado de tirarte el error}
{si se va cuando termina archBajas hay un registro que no procesa}
if eof(archBajas) then
begin
write(archNuevo,rSol);
cargarVecDatos(rSol,vecDatos);
end;
leerSol:=false;
leerBaja:=true;
end
else {son iguales}
begin
{causaValida es una funcion booleana que analiza si la causa es valida}
if causaValida(rBaja) then
{procesarBaja}
begin
leerSol:=true;
leerBaja:=true;
end
else
{causa inv lida}
begin
leerSol:=false;
leerBaja:=true;
causaBaja:='la causa para bajar el registro es inv lida';
printBajaRechazada(BajasRechazadas,causaBaja,rBaja);
end;
end;
end; {end while grande}
{pongo en nuevo los registros que quedan}
while not eof(ArchSolicitudes) do
begin
read(ArchSolicitudes,rSol);
if rSol.nroSolicitud <> rBaja.nroSolicitudBaja then
write(archNuevo,rSol);
else
begin
leerBaja:=true;
if causaValida(rBaja) then
{procesar baja}
{no hago nada}
else
begin
causaBaja:='la causa para bajar el registro es inv lida';
printBajaRechazada(BajasRechazadas,causaBaja,rBaja);
end;
end;
end;
if eof(archBajas) and (not leerBaja) then
{la ultima baja no se tuvo en cuenta}
{si despues de ver todas las solicitudes leerBaja queda en false,
entonces reg inexistente}
begin
causaBaja:='el registro a bajar es inexistente';
printBajaRechazada(BajasRechazadas,causaBaja,rBaja);
end;
{si quedan bajas pendientes}
while not eof(ArchBajas) do
begin
read(ArchBajas,rBaja);
if rBaja.nroSolicitudBaja <> rSol.nroSolicitud then
{registro inexistente}
begin
causaBaja:='el registro a bajar es inexistente';
printBajaRechazada(BajasRechazadas,causaBaja,rBaja);
end
else
begin
if causaValida(rBaja) then
{procesar baja}
{no hago nada, que siga leyendo}
else
begin
causaBaja:='la causa para bajar el registro es inv lida';
printBajaRechazada(BajasRechazadas,causaBaja,rBaja);
end;
end;
end;
Este codigo (con algunas cosas mas en el medio, por ejemplo un contador de los registros leidos y un par de huevadas mas) fue el que use para el mismo TP (si no me equivoco es el ejercicio 11 de la guia), asi que si hay algo que no entiendas, preguntame y listo.
Saludos
|
|
|
|
|
_________________
Si yo te digo carnaval...
|
|
|
|
|
- = DIEGO = -
Nivel 5
Edad: 39
Registrado: 09 Jul 2006
Mensajes: 197
Ubicación: San Telmo!!
Carrera: Informática
|
|
Revivo este tema xq tengo un tp en Pascal y algunas dudas...
1) Alguien se acuerda como se hace para pasar argumentos x linea de comando (c:\carpeta\tp.exe prueba.txt). Encontre algo de q se pone entre parentesis al lado del program de arriba de todo pero no se bien como se usa
2) Necesito redondear un double a una cantidad dada de digitos. Para esto se me habia ocurrido usar la funcion div q hace una division y te deja la parte entera solamente. Con esto hiba como piña... el problema es q div solo funca para integers... Asi q estoy al horno, la verdad q no tengo ganas de implementar una division de doubles q solo me devuelva la parte entera... si alguien conoce una funcion asi u otra manera de hacer esto le agradeceria una mano.
|
|
|
|
_________________ "Pienso, luego existo", pese a una frase célebre del gran Sirne: "Usted no piense, si piensa se equivoca"
|
|
|
|
|
Fhran
Administrador
Edad: 39
Registrado: 25 Ago 2005
Mensajes: 3123
Ubicación: En la rama de un árbol... entre locos.
Carrera: Electrónica y Informática
|
|
**********
- = DIEGO = - escribió:
|
2) Necesito redondear un double a una cantidad dada de digitos. Para esto se me habia ocurrido usar la funcion div q hace una division y te deja la parte entera solamente. Con esto hiba como piña... el problema es q div solo funca para integers... Asi q estoy al horno, la verdad q no tengo ganas de implementar una division de doubles q solo me devuelva la parte entera... si alguien conoce una funcion asi u otra manera de hacer esto le agradeceria una mano.
|
Si mal no recuerdo estaban "Round" y "Trunc". La primera redondea y la segunda devuelve solo la parte entera. Buscalas en la ayuda para ver los parámetros.
Lo de pasar argumentos por consola nunca lo hice.
**********
|
|
|
|
_________________
El horóscopo del ingeniero es un poco más amplio. Se compone de Amor, Dinero, Salud, Simetría y Linealidad Causa-Efecto.
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
|
|
|
- = DIEGO = -
Nivel 5
Edad: 39
Registrado: 09 Jul 2006
Mensajes: 197
Ubicación: San Telmo!!
Carrera: Informática
|
|
Pero esas redondean y truncan de una...
Yo necesito una division. Asi a mi funcion le paso la cantidad de cifras a las q quiero q redondee.
Ejemplo:
Redondear(3.12546,3)
da 3.16
Redondear(3.12546,5)
da 3.1254
Salvo q eso sean lo q hagan
(la ayuda de pascal no me anda, tipico de mi pc, voy a ver si me la puedo bajar y ver q hacen bien esas funciones)
Gracias Fhran!!
|
|
|
|
_________________ "Pienso, luego existo", pese a una frase célebre del gran Sirne: "Usted no piense, si piensa se equivoca"
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
Para lo del redondeo, con saber redondear números a enteros te alcanza;
simplemente multiplicá por , siendo n el número de dígitos que querés conservar, y después de truncar a 0 decimales, volvés a dividir por .
|
|
|
|
_________________
|
|
|
|
|
- = DIEGO = -
Nivel 5
Edad: 39
Registrado: 09 Jul 2006
Mensajes: 197
Ubicación: San Telmo!!
Carrera: Informática
|
|
Esa era masomenos la idea SS, te falta lo del redonde q es fijarse el sig y sumar si es mayor q 5.
Tambien me sirvio lo de los arg x linea de comnado.
Muchas gracias
|
|
|
|
_________________ "Pienso, luego existo", pese a una frase célebre del gran Sirne: "Usted no piense, si piensa se equivoca"
|
|
|
|
|
- = DIEGO = -
Nivel 5
Edad: 39
Registrado: 09 Jul 2006
Mensajes: 197
Ubicación: San Telmo!!
Carrera: Informática
|
|
Odio pascal...
Le di una vueltita y parece q ya anda peeeeeeeeeero, tengo este error:
...
Function Aplicargrilla(var coeficiente: double; mant: integer): double;
...
re := Aplicargrilla(3.141618,3);
...
El error dice: call by var statemente have to match exactly; GOT S80real (supongo q es un double), expected S65real
puto puto pascal puto
Ayuda x favor...
|
|
|
|
_________________ "Pienso, luego existo", pese a una frase célebre del gran Sirne: "Usted no piense, si piensa se equivoca"
|
|
|
|
|
Don Gato
Nivel 0
Registrado: 07 Sep 2007
Mensajes: 1
|
|
- = DIEGO = - escribió:
|
Odio pascal...
Le di una vueltita y parece q ya anda peeeeeeeeeero, tengo este error:
...
Function Aplicargrilla(var coeficiente: double; mant: integer): double;
...
re := Aplicargrilla(3.141618,3);
...
El error dice: call by var statemente have to match exactly; GOT S80real (supongo q es un double), expected S65real
puto puto pascal puto
Ayuda x favor...
|
Pascal no es puto, sólo es un poco estricto, je.
Si definís el primer parámetro para pasaje por referencia, sólo podés pasar variables, y luego no podés pasar constantes, expresiones ni literales (como es el caso de "3.131618").
Ese es el problema.
|
|
|
|
|
|
|
|
|
Rada
Moderador
Edad: 37
Registrado: 10 Abr 2006
Mensajes: 2728
Ubicación: Caballito
Carrera: Informática
|
|
|
|
|
|
|
Ver tema siguiente
Ver tema anterior
Podés publicar nuevos temas en este foro No podés responder a temas en este foro No podés editar tus mensajes en este foro No podés borrar tus mensajes en este foro No podés votar en encuestas en este foro No Podéspostear archivos en este foro No Podés bajar archivos de este foro
|
Todas las horas son ART, ARST (GMT - 3, GMT - 2 Horas)
Protected by CBACK CrackerTracker365 Attacks blocked.
|