Pascal/Turbo Pascal - Ayuda en la comprensión de arch de longitud fija y variable

 
Vista:
sin imagen de perfil

Ayuda en la comprensión de arch de longitud fija y variable

Publicado por Diego (98 intervenciones) el 11/04/2014 22:02:28
Buenas tardes, estoy tratando de entender bien los archivos de longitud fija y variable, pero primero que nada no logro entender como es que se usa un case dentro de un type, segundo tampoco entiendo bien la declaración de archivos de longitud variable, nos dieron una fotocopia con ejemplos y explicaciones, pero no hay mucha información y busque en internet pero solo encuentro descripciones generales y ninguna que tenga declaraciones y explicaicones en. pascal.
Les dejo adjunto un pdf con la practica, de ese pdf no entiendo bien como realizar las primitivas del punto 6 de la pagina 30(última pagina); se que se hacen con un tad, pero no logro saber como hacerlas.


Les agradezco su tiempo.
Parece que solo acepta archivos comprimidos, ahora lo comprimo en un .rar sin contraseña
tambien les dejo el tad que armé, auque no creo que esté bien, en especial las primitivas primero y siguiente debido a un comentario que me hicieron los ayudantes de la cátedra.

"Esta primitiva (cargar) se usa sólo para la carga inicial del archivo, e implica tener los registros validados en cuanto a su unicidad. La prueba del trabajo se hace con la secuencia:
1. Crear y cargar el archivo tomando datos de un archivo de texto y con la primitiva de carga
2. Exportar el archivo a un archivo de texto y verificar que los datos exportados coincidan con los de carga
3. Realizar un alta, una baja y una modificación y volver a exportar el archivo a uno de texto para comprobar se hayan realizado correctamente
4. Buscar un registro por DNI
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

Ayuda en la comprensión de arch de longitud fija y variable

Publicado por ramon (2158 intervenciones) el 15/04/2014 11:44:44
Me puedes aclarar un poco esto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type
    tPersona = Record
      DNI: Longword;
      Apellido: String[20];
      Nombres: String[20];
      FechaNac: Longword;
      valido : boolean;
    end;
 
    arch_personas = file of tPersona;
    lista = ^nodo;
      nodo = record
        elemen : Longword;
        dir_sig : lista;
      end;
 
    ctrl_personas = record
      persona : tPersona;
      a_persona : arch_personas;
      E_libre : lista;
      ok : boolean;
    end;

Dime para que empleas el registro nodo ya que no tiene nada que ver con el registro tpersona,
intentas trabajar con punteros y pilas o solo registros tpersona.
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
sin imagen de perfil

Ayuda en la comprensión de arch de longitud fija y variable

Publicado por Diego (98 intervenciones) el 15/04/2014 18:51:16
La intención era manejar los espacios libres con una listas pero al final empezé de 0 y trabajé los libres con un archivo de longword.
Pero si leiste un poco del pdf, ¿podrías decirme cómo es que trabaja ese case dentro del type y cómo se usa en un programa?, ya que no logro comprender el porque de ese case dentro del type.

Coloco el programa y el tad que ya realizé, aunque no esta muy bien hecho, ya que ayer con las prisas lo hize para que trabajara bien, pero solo si se va de la opción 1 a la 10 del menú, pudiendo haber repeticiones de la misma opción.
Tad:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
unit
  tad_fijo;
interface
  type
    tPersona = Record
      DNI: Longword;
      Apellido: String[20];
      Nombres: String[20];
      FechaNac: Longword;
    end;
    arch_persona = file of tPersona;
    arch_libre = file of longword;
    ctrl_pers = record
      ok : boolean;
      persona : tPersona;
      a_persona : arch_persona;
      a_libre : arch_libre;
    end;
  procedure crear (var arch: arch_persona; nom : string[15]);
  procedure cargar(var control : ctrl_pers);
  procedure primero(var control : ctrl_pers);
  procedure siguiente(var control : ctrl_pers);
  procedure recuperar(var control : ctrl_pers; dni: integer);
  procedure exportar(var a_persona : arch_persona; var arch_texto : text);
  procedure insertar(var control : ctrl_pers);
  procedure eliminar(var control : ctrl_pers; dni : longword);
  procedure modificar(var control : ctrl_pers);
  procedure respaldar(var control: ctrl_pers; var backup : arch_persona);
implementation
  procedure crear (var arch: arch_persona; nom : string[15]);
    begin
      assign(arch, nom);
      rewrite(arch);
      close(arch);
    end;
  procedure cargar(var control : ctrl_pers);
    begin
      reset(control.a_persona);
      seek(control.a_persona, filesize(control.a_persona));
      write(control.a_persona, control.persona);
      close(control.a_persona);
    end;
  procedure primero(var control : ctrl_pers);
    begin
      reset(control.a_persona);
      if (filesize(control.a_persona) = 0) then
        begin
          control.ok := false;
        end
      else
        begin
          read(control.a_persona, control.persona);
          control.ok := true;
        end;
    end;
  procedure siguiente(var control : ctrl_pers);
    begin
      if (filepos(control.a_persona) = filesize(control.a_persona)) then
        begin
          control.ok := false;
          close(control.a_persona);
        end
      else
        begin
          read(control.a_persona, control.persona);
          control.ok := true;
        end;
    end;
  procedure recuperar(var control : ctrl_pers; dni: integer);
    begin
      reset(control.a_persona);
      if (filesize(control.a_persona) = 0) then
        begin
          control.ok := false;
        end
      else
        begin
          control.ok := false;
          while ((not eof(control.a_persona)) and (control.ok <> true)) do
            begin
              read(control.a_persona, control.persona);
              if (control.persona.DNI = dni) then
                control.ok := true;
            end;
        end;
      close(control.a_persona);
    end;
  procedure exportar(var a_persona : arch_persona; var arch_texto : text);
    var
      buffer : tPersona;
    begin
      reset(a_persona);
      rewrite(arch_texto);
      if (filesize(a_persona) = 0) then
        begin
        end
      else
        begin
          while (not eof(a_persona)) do
            begin
              read(a_persona, buffer);
              writeln(arch_texto, buffer.DNI , '#', buffer.Apellido, '#', buffer.Nombres, '#', buffer.FechaNac, + #10 + #13);
            end;
        end;
      close(a_persona);
      close(arch_texto);
    end;
  procedure insertar(var control : ctrl_pers);
    var
      buffer : tPersona;
    begin
      reset(control.a_persona);
      if (filesize(control.a_persona) = 0) then
        begin
          control.ok := false;
        end
      else
        begin
          control.ok := false;
          while ((not eof(control.a_persona)) and (control.ok <> true)) do
            begin
              read(control.a_persona, buffer);
              if (buffer.DNI = control.persona.DNI) then
                begin
                  control.ok := true;
                end;
            end;
          if (control.ok) then
            begin
              control.ok := false;
            end
          else
            begin
              write(control.a_persona, control.persona);
              control.ok := true;
            end;
        end;
      close(control.a_persona);
    end;
  procedure eliminar(var control : ctrl_pers; dni : longword);
    var
      posicion : longword;
    begin
      reset(control.a_persona);
      if (filesize(control.a_persona) = 0) then
        begin
          control.ok := false;
        end
      else
        begin
          control.ok := false;
          while ((not eof(control.a_persona)) and (control.ok <> true)) do
            begin
              read(control.a_persona, control.persona);
              if (control.persona.DNI = dni) then
                begin
                  control.ok := true;
                end;
            end;
          if (control.ok) then
            begin
              reset(control.a_libre);
              seek(control.a_libre, filesize(control.a_libre));
              seek(control.a_persona, filepos(control.a_persona)-1);
              posicion := filepos(control.a_persona);
              write(control.a_libre, posicion);
              control.persona.DNI := 0;
              write(control.a_persona, control.persona);
              close(control.a_libre);
            end;
        end;
      close(control.a_persona);
    end;
  procedure modificar(var control : ctrl_pers);
    var
      buffer : tPersona;
    begin
      reset(control.a_persona);
      if (filesize(control.a_persona) = 0) then
        begin
          control.ok := false;
        end
      else
        begin
          control.ok := false;
          while ((not eof(control.a_persona)) and (control.ok <> true)) do
            begin
              read(control.a_persona, buffer);
              if (buffer.DNI = control.persona.DNI) then
                begin
                  control.ok := true;
                end;
            end;
          if (control.ok) then
            begin
              seek(control.a_persona, filepos(control.a_persona)-1);
              write(control.a_persona, control.persona);
            end;
        end;
      close(control.a_persona);
    end;
  procedure respaldar(var control: ctrl_pers; var backup : arch_persona);
    begin
      reset(control.a_persona);
      reset(backup);
      if (filesize(control.a_persona) = 0) then
        begin
          control.ok := false;
        end
      else
        begin
          while (not eof(control.a_persona)) do
            begin
              read(control.a_persona, control.persona);
              if (control.persona.DNI <> 0) then
                write(backup, control.persona);
            end;
          control.ok := true;
        end;
      close(control.a_persona);
      close(backup);
    end;
end.

programa:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
program ejercicio6;
uses
    tad_fijo, sysutils;
procedure leer_info(var reg : tPersona);
  var
    ok : char;
  begin
      repeat
        begin
          write('Ingrese un número de DNI: ');
          readln(reg.DNI);
          write('Ingrese el apellido: ');
          readln(reg.Apellido);
          write('Ingrese los nombres: ');
          readln(reg.Nombres);
          write('Ingrese la fecha de nacimiento {AAAAMMDD}: ');
          readln(reg.FechaNac);
          writeln();
          write('¿Los datos ingresados son correctos? (s/n): ');
          readln(ok);
        end
      until ((ok = 's') or (ok = 'S'));
      writeln();
  end;
procedure crear_archivo(var control: ctrl_pers);
  var
    nom: string [15];
  begin
    write('Escriba el nombre del archivo a crear (máximo 15 caracteres): ');
    readln(nom);
    while (FileExists(nom)) do
      begin
        writeln('El nombre ingresado ya pertenece a un archivo, por favor ingrese otro nombre: ');
        readln(nom);
      end;
    crear(control.a_persona, nom);
    assign(control.a_libre, 'libres');
    rewrite(control.a_libre);
    close(control.a_libre);
    writeln();
  end;
procedure cargar_archivo(var control : ctrl_pers);
  var
    ok : char;
  begin
    leer_info(control.persona);
    cargar(control);
    write('¿Desea continuar la carga?(s/n): ');
    readln(ok);
    while ((ok = 's') or (ok = 'S')) do
      begin
        leer_info(control.persona);
        insertar(control);
        if (control.ok = false) then
          writeln('Carga fallida; la persona ya existe');
        write('¿Desea continuar la carga?(s/n): ');
        readln(ok);
      end;
    writeln();
  end;
procedure recorrer_archivo(var control: ctrl_pers);
  var
    opc : char;
  begin
    primero(control);
    if (control.ok = false) then
      begin
        writeln('No existe un primero; archivo vacio');
        close(control.a_persona);
      end
    else
      begin
        writeln('    DNI               Apellido           Nombres         Fecha de nacimiento');
        writeln('============================================================================');
        writeln(control.persona.DNI: 11, control.persona.Apellido: 20, control.persona.Nombres: 20, control.persona.FechaNac:10);
        write('¿Desea ver la siguiente persona?(s/n): ');
        readln(opc);
        while ((opc = 's') or (opc = 'S')) do
          begin
            siguiente(control);
            if (control.ok = false) then
              begin
                write('No hay un siguiente; se acabaron las personas del archivo');
                opc := 'n';
              end
            else
              begin
                writeln(control.persona.DNI: 11, control.persona.Apellido: 20, control.persona.Nombres: 20, control.persona.FechaNac:10);
                write('¿Desea ver la siguiente persona?(s/n): ');
                readln(opc);
              end;
          end;
      end;
    writeln();
  end;
procedure generar_txt(var control : ctrl_pers; var arch_texto: text);
  var
    nom : string[15];
  begin
    write('Ingrese el nombre seguido de .txt (nombre.txt): ');
    readln(nom);
    assign(arch_texto, nom);
    exportar(control.a_persona, arch_texto);
    writeln('¡TXT generado!');
    writeln();
  end;
procedure alta(var control: ctrl_pers);
  begin
    writeln('Ingrese los datos de la persona a dar de alta');
    leer_info(control.persona);
    insertar(control);
    if (control.ok = false) then
      begin
        writeln('No se pudo realizar el alta; la persona ya se encuentra en el archivo');
      end
    else
      begin
        writeln('¡Dado de alta!');
      end;
    writeln();
  end;
procedure baja(var control: ctrl_pers);
  var
    dni : longword;
  begin
    write('Ingrese el dni de la persona a dar de baja: ');
    readln(dni);
    eliminar(control, dni);
    if (control.ok = false) then
      begin
        writeln('No se pudo realizar la baja; la persona no está en el archivo');
      end
    else
      begin
        writeln('¡Eliminada!');
      end;
    writeln();
  end;
procedure modificar_archivo(var control: ctrl_pers);
  begin
    writeln('Ingrese los datos de la persona');
    leer_info(control.persona);
    modificar(control);
    if (control.ok = false) then
      begin
        writeln('No se pudo modificar; persona no encontrada');
      end
    else
      begin
        writeln('¡Modificación realizada!');
      end;
  end;
procedure buscar_persona(var control: ctrl_pers);
  var
    dni : longword;
  begin
    write('Ingrese el dni de la persona que desea buscar: ');
    readln(dni);
    recuperar(control, dni);
    if (control.ok = false) then
      begin
        writeln('El dni ingresado no se encuentra en el archivo');
      end
    else
      begin
        writeln('    DNI               Apellido           Nombres         Fecha de nacimiento');
        writeln('============================================================================');
        writeln(control.persona.DNI: 11, control.persona.Apellido: 20, control.persona.Nombres: 20, control.persona.FechaNac:10);
      end;
    writeln();
  end;
procedure respaldar_archivo(var control: ctrl_pers; var backup : arch_persona; var arch_texto : text);
  var
    nom : string[15];
    opc : char;
  begin
    write('Escriba el nombre del archivo a crear (máximo 15 caracteres): ');
    readln(nom);
    while (FileExists(nom)) do
      begin
        writeln('El nombre ingresado ya pertenece a un archivo, por favor ingrese otro nombre: ');
        readln(nom);
      end;
    crear(backup, nom);
    writeln();
    respaldar(control, backup);
    writeln('¿Desea crear un .txt con todas las personas del respaldo?(s/n): ');
    readln(opc);
    if ((opc = 's') or (opc = 'S')) then
      begin
        writeln('Ingrese el nombre que desea darle al respaldo seguido de .txt (nombre.txt): ');
        readln(nom);
        while (FileExists(nom)) do
          begin
            writeln('El nombre ingresado ya pertenece a un archivo, por favor ingrese otro nombre: ');
            readln(nom);
          end;
        assign(arch_texto, nom);
        exportar(backup, arch_texto);
      end;
    writeln();
  end;
var
  control : ctrl_pers;
  backup : arch_persona;
  arch_texto: text;
  respaldo_texto : text;
  opc : longword;
begin
  repeat
  writeln('Opciones del programa: ');
  writeln('==============================X=======================================');
  writeln('(1)---Crear un archivo de personas');
  writeln('(2)---Cargar un archivo de personas vacio');
  writeln('(3)---Generar un .txt con todos los elementos de un archivo de personas');
  writeln('(4)---Recorrer el archivo de personas');
  writeln('(5)---Realizar una alta');
  writeln('(6)---Realizar una baja');
  writeln('(7)---Realizar una modificación');
  writeln('(8)---Realizar una busqueda');
  writeln('(9)---Realizar una copia de seguridad de un archivo de personas');
  writeln('(10)--Salir');
  writeln('==============================X=======================================');
  write('¿Qué opción desea realizar? ');
  readln(opc);
  case opc of
    1:  begin
          crear_archivo(control);
        end;
    2:  begin
          cargar_archivo(control);
        end;
    3:  begin
          generar_txt(control, arch_texto);
        end;
    4:  begin
          recorrer_archivo(control);
        end;
    5:  begin
          alta(control);
        end;
    6:  begin
          baja(control);
        end;
    7:  begin
          modificar_archivo(control);
        end;
    8:  begin
          buscar_persona(control);
        end;
    9:  begin
          respaldar_archivo(control, backup, respaldo_texto);
        end;
    end;
    until (opc = 10);
    readln();
    readln();
end.
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

Ayuda en la comprensión de arch de longitud fija y variable

Publicado por Lucas (1 intervención) el 28/04/2014 16:24:57
hola como va? che si queres pasame lo que tengas hecho de longitud variable que te lo corrijo!! saludos
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