El post que buscas se encuentra eliminado, pero este también te puede interesar

Programando Archivos de Tipo en Pascal [apunte]


Hola Taringa, hoy les traigo un programa en pascal que hicimos en clases...quizas alguno que estudia informatica le sirva este codigo que esta hecho enteramente en pascal ya que es el lenguaje que usamos para resolver los ejercisios, aclaro que a este codigo se lo puede pasar a cualquier otro lenguaje, lo que importa aca es la logica del programa, ya que muchos diran seguramente que pascal ya no se usa, pero la verdad es que para aprender esta bueno por la sintaxis que tiene y por eso se lo usa en la UNSa para eneseñar a programar....

Antes que nada voy a dejar el ejercisio propuesto para que se entienda lo que se hizo:

Ejercicio 4: Escribir un programa con un menú que permita:

a) Crear un archivo Alumnos.dat con información de los Alumnos de 1er año:
• DNI
• Nombre
• Domicilio
• Nota Introducción a la Matemática
• Nota Elementos de Computación
• Nota Introducción a la Programación
• Nota ALGA
• Nota Análisis Matemático I.

Donde la LU (libreta universitaria) es la clave de acceso y se corresponde con el nro
de registro.

b) Agregar los datos de un nuevo alumno.

c) Mostrar los datos del alumno con LU: 6.

d) Modificar el domicilio del alumno con DNI 31.123.456

e) Obtener el promedio de notas de todos los alumnos en Introducción a la
Programación.

f) Eliminar el registro del alumno con LU: 12.

g) Generar un archivo de nombre AlumnosProgramacion que contenga solo el DNI
Nombre y Domicilio de los alumnos que aprobaron Introducción a la Programación

h) Generar un archivo índice (Alumnos.Ind) para permitir el acceso directo al archivo
ALUMNOS por el campo DNI.

i) Una vez creados ambos archivos: (Alumnos.dat y Alumnos.ind)
• Modificar la Nota de ALGA del alumno con DNI = 17.522.312.
• Agregar los datos de un nuevo alumno.
• Eliminar los registros de los alumnos que no aprobaron todas las materias.



La verdad es que se zarparon con este ejercisio los profes!!!
En total el codigo de este programa tiene 360 y pico de lineas, si lo quieren ejecutar copien el codigo, pegen el codigo en dev-pascal, turbo pascal, free pascal o lo que usen y ejecuten (nota: primero hay que realizar la carga del archivo que sale en el menu)



program alumnos_unsa;
uses crt;
type
alumnos=record
dni:integer;
nombre:string;
domicilio:string;
notmatematicas:0..100;
notelementos:0..100;
notprogramacion:0..100;
notalga:0..100;
notanalisis:0..100;
end;
programacion=record
dni:integer;
nombre:string;
domicilio:string;
end;
indice=record
numreg:integer;
dni:integer;
end;

vector=array[1..1000] of indice;

archivo=file of alumnos; archivo2= file of programacion; archivo3=file of indice;
var
f:archivo; opc:integer; f2:archivo2; v:vector; f3:archivo3; n:integer;

procedure asignacion(var a:archivo);
begin
assign(a,'Alumnos.dat');
end;

procedure carga(var a:archivo);
var
reg:alumnos; op:char;
begin
rewrite(a);
repeat
clrscr;
writeln(' Ingrese los datos: ');
writeln(' ****************** ');
writeln;
writeln(' Ingrese DNI: ');readln(reg.dni);
writeln(' Ingrese nombre: ');readln(reg.nombre);
writeln(' Ingrese domicilio: ');readln(reg.domicilio);
writeln(' Ingrese nota Matematicas: ');readln(reg.notmatematicas);
writeln(' Ingrese nota Elementos: ');readln(reg.notelementos);
writeln(' Ingrese nota Programacion: ');readln(reg.notprogramacion);
writeln(' Ingrese nota ALGA: ');readln(reg.notalga);
writeln(' Ingrese nota Analisis: ');readln(reg.notanalisis);
writeln;
write(a,reg);
writeln(' Desea agregar mas datos? S/N ');
readln(op);
until upcase(op)='N';
close(a);
end;
procedure mostrar(var a:archivo);
var
reg:alumnos;
begin
reset(a);
while not eof(a) do
begin
read(a,reg);
writeln(' ****************** ');
writeln(' DNI: ',reg.dni);
writeln(' Nombre: ',reg.nombre);
writeln(' Domicilio: ',reg.domicilio);
writeln(' Nota Matematicas: ',reg.notmatematicas);
writeln(' Nota Elementos: ',reg.notelementos);
writeln(' Nota Programacion: ',reg.notprogramacion);
writeln(' Nota ALGA: ',reg.notalga);
writeln(' Nota Analisis ',reg.notanalisis);
writeln;
end;
close(a);
end;
procedure agregar(var a:archivo);
var reg:alumnos; pos:integer;
begin
reset(a);
pos:=filesize(a);
seek(a,(pos-1));
read(a,reg);
writeln(' Ingrese los datos: ');
writeln(' ****************** ');
writeln;
writeln(' Ingrese DNI: ');readln(reg.dni);
writeln(' Ingrese nombre: ');readln(reg.nombre);
writeln(' Ingrese domicilio: ');readln(reg.domicilio);
writeln(' Ingrese nota Matematicas: ');readln(reg.notmatematicas);
writeln(' Ingrese nota Elementos: ');readln(reg.notelementos);
writeln(' Ingrese nota Programacion: ');readln(reg.notprogramacion);
writeln(' Ingrese nota ALGA: ');readln(reg.notalga);
writeln(' Ingrese nota Analisis: ');readln(reg.notanalisis);
writeln;
write(a,reg);
close(a);
end;
procedure mostrar_libreta(var a:archivo);
var reg:alumnos; lu:integer;
begin
clrscr;
reset (a);
writeln(' Ingrese LU a buscar: '); readln(lu);
if (lu>=0) and (lu< filesize(a)) then
begin
seek(a,lu);
read(a, reg);
writeln(' ****************** ');
writeln(' DNI: ',reg.dni);
writeln(' Nombre: ',reg.nombre);
writeln(' Domicilio: ',reg.domicilio);
writeln(' Nota Matematicas: ',reg.notmatematicas);
writeln(' Nota Elementos: ',reg.notelementos);
writeln(' Nota Programacion: ',reg.notprogramacion);
writeln(' Nota ALGA: ',reg.notalga);
writeln(' Nota Analisis ',reg.notanalisis);
end
else
writeln(' No se encontro LU!!! ');

close(a);
end;
procedure modificar_dni(var a:archivo);
var reg:alumnos; dni,b,pos,dninuevo:integer;
begin
reset(a); b:=0;
writeln(' Ingrese DNI que quiere modificar: '); readln(dni);
while (not eof(a)) and (b=0) do
begin
read(a,reg);
if reg.dni=dni then
begin
pos:=filepos(a);
b:=1;
end
else
b:=0;
end;
if b=1 then
begin
writeln(' Ingrese el nuevo DNI: ');readln(dninuevo);
seek(a,(pos-1));
reg.dni:=dninuevo;
write(a,reg);
end
else
writeln(' No se encontro el DNI !!! ');
close(a);
end;

procedure promedio( var a:archivo);
var reg:alumnos; prom:real; c:integer;
begin
clrscr;
reset(a); prom:=0; c:=0;
while not eof(a) do
begin
read(a,reg);
prom:=prom+reg.notprogramacion;
c:=c+1;
end;
prom:=prom/c;
writeln(' La nota Promedio de todos los alumnos de Programacion es: ');
writeln(' ---- ');
writeln(' ',prom:2:2);
writeln(' ---- ');
writeln;
close(a);
end;
procedure asignacion2(var a2:archivo2); {asigno el nombre de archivo de alumnos programacion}
begin
assign(a2,'AlumnosProgramacion.dat');

end;

procedure archivoprogramacion(var a:archivo; var a2:archivo2);
var reg:alumnos;
reg2:programacion;
begin
reset (a); rewrite(a2);
while not eof(a) do
begin
read(a,reg);
if reg.notprogramacion>=40 then
begin

reg2.dni:=reg.dni;
reg2.nombre:=reg.nombre;
reg2.domicilio:=reg.domicilio;
write(a2,reg2);
end;
end;
close(a);
close(a2);
end;

procedure mostrar_archivo2(var a2:archivo2);
var reg2:programacion;
begin
reset (a2);
writeln(' El Archivo de Programacion contiene los siguientes datos: ');
while not eof(a2) do
begin
read(a2,reg2);writeln;
writeln(' DNI: ',reg2.dni);
writeln(' Nombre: ',reg2.nombre);
writeln(' Domicilio: ',reg2.domicilio);
writeln(' ********** ');
end;

close(a2);
end;
procedure bajafisica(var a:archivo);
var
reg:alumnos; dni:integer; g:archivo;
begin
writeln(' Ingrese N° DNI para dar de baja: '); readln(dni);
reset(a);
assign(g,'Copia.dat');
rewrite(g);
while not eof (a) do
begin
read(a,reg);
if reg.dni<>dni then
write(g,reg);
end;
close(a);
close(g);
erase(f);
rename(g,'Alumnos.dat');
end;

procedure bajalogica(var a:archivo);
var
reg:alumnos; nom:string; pos,b:integer;
begin
b:=0;
writeln(' Ingrese el nombre del Alumno: ');
readln(nom);
reset(a);
while (not eof (a)) and (b=0) do
begin
read(a,reg);
if nom=reg.nombre then
begin
pos:=filepos(a)-1;
b:=1;
end;
end;
if b=1 then
begin
seek(a,pos);
reg.nombre:='*';
write(a,reg);
end
else
writeln(' No fue encontrado el Alumno ',nom);
close(a);
end;
procedure vectorindice(var a:archivo; var v:vector; var n:integer);
var
reg:alumnos; i,k,j:integer;
aux:indice;
begin
reset(a); i:=0;
while not eof(a) do
begin
i:=i+1;
read(a,reg);
v.numreg:= filepos(a)-1;
v.dni:=reg.dni;
{cargo el vector indice}
end;
close(a);

for j:=1 to (i-1) do
begin
for k:=(j+1) to i do
begin
if v[j].dni > v[k].dni then
begin
aux:=v[j];
v[j]:=v[k];
v[k]:=aux;
end;
end;
end;
writeln(' el vector es: ');
for j:=1 to i do
begin
writeln(' numero registro: ',v[j].numreg);
writeln(' dni: ',v[j].dni);
end;
n:=i;
end;

procedure asignacionf3(var a3:archivo3);
begin
assign(a3,'alumnos.ind');
end;

procedure archivoindice(var v:vector; var a3:archivo3; n:integer);
var i:integer;
reg:indice;
begin
rewrite(a3);
for i:=1 to n do {cargo el nuevo archivo indice}
begin
reg.numreg:=v.numreg;
reg.dni:=v.dni;
write(a3,reg);
end;
close (a3);
reset(a3);
writeln(' El Archivo indice es: ');
while not eof (a3) do
begin
read(a3,reg);
writeln(' Numero de registro: ',reg.numreg); {muestro el archivo indice}
writeln(' Dni: ',reg.dni);
end;
close(a3);
end;
procedure modificarnotaALGA(var a3:archivo3; var a:archivo);
var
reg3:indice; reg:alumnos; pos,nota,dni:integer;
begin
writeln(' Ingrese DNI del Alumno: ');
readln(dni); pos:=0;
reset(a);reset(a3);
while not eof(a3) do
begin
read(a3,reg3);
if reg3.dni=dni then
pos:=reg3.numreg;
end;
if pos<>0 then
begin
writeln(' La posicon es: ',pos);
seek(a,pos);
read(a,reg);
writeln(' Ingrese nueva nota de ALGA '); readln(nota);
reg.notalga:=nota;
seek(a,pos);
write(a,reg);
end
else
writeln(' No existe el DNI !!! ');

close(a);
close(a3);
end;

procedure bajafisica_desaprobados(var a:archivo);
var
b:archivo; reg:alumnos;
begin
assign(b,'nuevo.dat'); rewrite(b);
reset(a);
while not eof(a) do
begin
read(a,reg);
if (reg.notmatematicas>=40) and (reg.notelementos>=40) and (reg.notprogramacion>=40) and(reg.notalga>=40) and (reg.notanalisis>=40)
then
write(b,reg);
end;
close(a);
close(b);
erase(a);
rename(b,'Alumnos.dat');
end;

begin
{programa principal con menu}
asignacion(f);
asignacion2(f2);
archivoprogramacion(f,f2);
vectorindice(f,v,n);
asignacionf3(f3);
repeat
writeln(' _________________ ');
writeln(' Seleccione Opcion:');
writeln(' _________________ ');
writeln(' 1: Cargar ');
writeln(' 2: Mostrar ');
writeln(' 3: Agregar Alumno ');
writeln(' 4: Buscar por LU ');
writeln(' 5: Modificar DNI ');
writeln(' 6: Promedio ');
writeln(' 7: Mostrar Archivo de Programacion ');
writeln(' 8: Baja Fisica ');
writeln(' 9: Baja Logica ');
writeln(' 10: Archivo Indice ');
writeln(' 11: Modificar nota de ALGA ');
writeln(' 12: Depurar Archivo (elimina los que desaprobaron todas las materias) ');
writeln(' 0: Salir ');
readln(opc);
case opc of
1:carga(f);
2:mostrar(f);
3:begin
agregar(f);
vectorindice(f,v,n);
archivoindice(v,f3,n);
end;
4:mostrar_libreta(f);
5:modificar_dni(f);
6:promedio(f);
7:mostrar_archivo2(f2);
8:bajafisica(f);
9:bajalogica(f);
10:archivoindice(v,f3,n);
11:modificarnotaALGA(f3,f);
12:begin
bajafisica_desaprobados(f);
vectorindice(f,v,n);
archivoindice(v,f3,n);
end;
end;
until opc=0;

end.


Espero que les haya gustado y que le sea util a los que estan con la materia programacion y sobre todo a los que estan usando un compilador en pascal....saludos gente y dejen su comentario!!!

Fuentes de Información - Programando Archivos de Tipo en Pascal [apunte]

Dar puntos
18 Puntos
Votos: 4 - T!score: 4.5/10
  • 0 Seguidores
  • 7.731 Visitas
  • 9 Favoritos

Comentarios Destacados

@matiastamaltodo Hace más de 3 años +8
C12H22O11 dijo:No se mucho de informatica, pero por lo poco que hice, odiaba Pascal XD

Sirve para algo en si?

si, para aprender a usar la logica y el el desarrollo en la solucion de problemas de el tipo que plantee, una vez que aprendes la logica es mucho mas facil y te podes pasar tranquilamente a lenguajes como python, c, c++, java, java script, o el lenguaje que quieras...

14 comentarios - Programando Archivos de Tipo en Pascal [apunte]

@C12H22O11 Hace más de 3 años -2
No se mucho de informatica, pero por lo poco que hice, odiaba Pascal XD

Sirve para algo en si?
@matiastamaltodo Hace más de 3 años +8
C12H22O11 dijo:No se mucho de informatica, pero por lo poco que hice, odiaba Pascal XD

Sirve para algo en si?

si, para aprender a usar la logica y el el desarrollo en la solucion de problemas de el tipo que plantee, una vez que aprendes la logica es mucho mas facil y te podes pasar tranquilamente a lenguajes como python, c, c++, java, java script, o el lenguaje que quieras...
@trackman Hace más de 3 años
aaaaaaaah pascal... good ol' days of pascal... me hace recordar cuando era niño XD
@CMM777 Hace más de 3 años
matiastamaltodo dijo:
C12H22O11 dijo:No se mucho de informatica, pero por lo poco que hice, odiaba Pascal XD Sirve para algo en si?
si, para aprender a usar la logica y el el desarrollo en la solucion de problemas de el tipo que plantee, una vez que aprendes la logica es mucho mas facil y te podes pasar tranquilamente a lenguajes como python, c, c++, java, java script, o el lenguaje que quieras...

En la UTN de La Plata todavia enseñan con Pascal.
Muy simple el lenguaje, y divertido para hacer boludeces. Si no me equivoco, en la FRBA hicieron un tetris en pascal
@Zetzerg Hace más de 3 años
yo programo en c++ y es un huevo igual XD
@MusicaTotal09 Hace más de 3 años
justo el que vamos a empezar a hacer mañana en la clase de progr.
@0Lezz0 Hace más de 3 años
todavia enseñan con pascal?... en la UnLaM enseñan C (medio parchero, depende el profesor que te toque t da ANSI puro o algunos usan las librerias de borland)
a mi me parecio facil aprender la logica usando C, pero C++ me parece mucho mas entendible, el paradigma de objetos simplifica mucho las cosas...(al menos para mi)
@repitta1881 Hace más de 2 años
exelente para aprender todo el tema de archivos en pascal! +100000!!! me ayudaste un monton!
@852isaac Hace más de 1 año
ERROR....!!!!!!! jajajjajajaja esta mal algo jajajajaja
@hatakejuany Hace más de 1 año
uhhhh no… esos ejercicios de RPA, son fáciles pero larguísimos
@VictorDNC Hace más de 11 meses -1
Acabo de ver esto y hay un gran error...

No se asusten que no es nada complejo.
aqui los puntos erroneos.
cito:


-"indice=record
numreg:integer;
dni:integer;
end;
"-
-" procedure vectorindice(var a:archivo; var v:vector; var n:integer);
var
reg:alumnos; i,k,j:integer;
aux:indice;
begin
reset(a); i:=0;
while not eof(a) do
begin
i:=i+1;
read(a,reg);
v.numreg:= (filepos(a)-1); AQUÍ
v.dni:=reg.dni; AQUÍ
{cargo el vector indice}
end;
close(a);

for j:=1 to (i-1) do
begin
for k:=(j+1) to i do
begin
if v[j].dni > v[k].dni then
begin
aux:=v[j];
v[j]:=v[k];
v[k]:=aux;
end;
end;
end;
writeln(' el vector es: ');
for j:=1 to i do
begin
writeln(' numero registro: ',v[j].numreg);
writeln(' dni: ',v[j].dni);
end;
n:=i;
end;
"-


y en

-"
procedure archivoindice(var v:vector; var a3:archivo3; n:integer);
var i:integer;
reg:indice;
begin
rewrite(a3);
for i:=1 to n do {cargo el nuevo archivo indice}
begin
reg.numreg:=v.numreg; AQUÍ
reg.dni:=v.dni; AQUÍ
write(a3,reg);
end;
close (a3);
reset(a3);
writeln(' El Archivo indice es: ');
while not eof (a3) do
begin
read(a3,reg);
writeln(' Numero de registro: ',reg.numreg); {muestro el archivo indice}
writeln(' Dni: ',reg.dni);
end;
close(a3);
end; "-


El hecho de usar -" v.variable" es incorrecto. (donde "v" es un vector) ya que no se admite esa sintaxis.

En caso de que hayas querido interpretar el contenido del vector se utiliza la siquiente sintaxis:

V[n]; Donde "V" es la variable VECTOR, y "n" es un número entero, dentro del rango del vector.
Por lo que: si mal no interpreto, querés utilizar el vector de registro.

-"reg.numreg:=v.numreg;
reg.dni:=v.dni;
"-

-"v.numreg:= (filepos(a)-1);
v.dni:=reg.dni;
"-

donde "numreg" y "dni" corresponden a campos de registro. para utilizar estos campos se debe espeficar el registro de referencia. "reg.dni;" es correcto. pero en "v.numreg" NO. deberia ser v["vaiable_indice".numreg] aquí, la sintaxis es correcta.

Pero ahora surge otro problema: que el numero de dni es muy largo para el tamaño del vector. Puesto que los numeros de dni constan de mas de 6 digitos y el vector solo admite hasta la ubicacion 1000. Por lo que el numero correspondiente da como resultado un error.

La longitud del vector; y reg.dni deben ser iguales. o la longitud del vector ser mayor.

En "v.numreg:= (filepos(a)-1" sucede lo mismo con la sintaxis del vector. y además "filepos(a)-1" hace referencia a la ante ultima posicion del archivo "a", que da como resultado un longitud variable de 0 a infinito(teorico).

En " reg.numreg:=v.numreg; " es incorrecto. por los puntos mencionados arriva y ademas el registro "reg" (del tipo "alumnos" no admite el nombre de campo "numreg".


SOLUCIÓN PROPUESTA:

Sustituir el tipo del vector.
Utilizar banderas y variables locales a modo de contador u/o posicionamiento (índice eficiente) para sustituir el uso de las lineas con el consecuente "AQUÍ".
@enzohorquin Hace más de 3 meses
En la facultad de UNICEN Tandil, todavia enseñan pascal en primer año, ( segundo cuatrimestre) , muy util este codigo! Muchas gracias!!
@martinokp Hace más de 2 meses
utn la plata tambien
@DalembertCauchy Hace 8 días
En la UBA también
@DalembertCauchy Hace 8 días
@enzohorquin @martinokp En la uba también