ADA - problemon

 
Vista:

problemon

Publicado por Carlos (2 intervenciones) el 23/12/2006 21:57:07
Se tiene un fichero de texto conteniendo información sobre personas. La información de cada persona ocupa tres líneas del fichero, tal y como en el siguiente ejemplo:
54637827/25
Pedro Antonio/Pérez/Arteaga
4/12/31/25/14
• La primera línea contiene el nº de DNI y la edad de la persona separadas por '/'. Se supone que un mismo DNI no aparece más de una vez en el fichero.
• La segunda línea contiene el nombre y los dos apellidos separados por '/'. Ni el nombre ni cada uno de los apellidos superan por separado los 25 caracteres.
• La tercera línea contiene una secuencia de números enteros separados por '/', de los cuales el primero indica cuantos números más hay en la línea y los restantes números representan niveles de diferentes habilidades de la persona en relación con un determinado videojuego. No hay más de 10 habilidades por persona (puede haber cero). El valor de cada habilidad está entre 0 y 99.
Se desea desarrollar un procedimiento que lea la información de este fichero y la use para crear otro de componentes uniformes cuyos registros tengan la siguiente estructura:
• Campo 1: una ristra fija de 10 caracteres representando el NIF correspondiente al DNI, con la letra al final y separada del número por un guión ("54637827-Q").
• Campos 2, 3 y 4: respectivamente, nombre, primer apellido y segundo apellido, todos representados como ristras de tamaño limitado a 25 caracteres.
• Campo 5: la edad, representada como un rango de números naturales entre 1 y 199.
• Campo 6: un número real representando la habilidad promedio (promedio de las habilidades) de la persona (si no hay habilidades se escribirá como media el valor 0.0).
• Campo 7: un número natural indicando el número de habilidades de la persona cuyo valor es mayor o igual que su promedio.
El orden de los registros en este fichero será el mismo que tienen los datos en el fichero original.
El procedimiento ha de generar además un segundo fichero de componentes uniformes que servirá de índice para la información almacenada en el fichero descrito en el punto anterior y que tendrá la siguiente estructura:
• Campo 1: una ristra fija de 10 caracteres representando el NIF correspondiente al DNI, con la letra al final y separada del número por un guión ("54637827-Q").
• Campo 2: un número natural indicando la posición que ocupa en el primer fichero el registro cuyo NIF coincide con el del campo 1.
Para facilitar su localización, los registros de este segundo fichero deberán estar ordenados según valores crecientes del NIF.
El procedimiento tendrá como único parámetro una ristra de tamaño dinámico que representa el nombre del fichero de texto a tratar. Los ficheros resultantes tendrán el mismo nombre, pero con las extensiones "dat" para el primero (el de datos) e "ind" para el segundo (el índice). Estas extensiones sustituirán a la que tenga el fichero original (si el fichero original no tiene extensión, igualmente se añadirán estas extensiones a los ficheros generados).
Si existen problemas para abrir el fichero de texto original el procedimiento lanzará la excepción "Ex_Fichero_Inexistente". Ante cualquier otro problema que impida el funcionamiento normal del procedimiento se lanzará la excepción "Ex_Problemas". Estas excepciones están declaradas en el procedimiento principal de prueba "prueba_base.adb".
El nombre del procedimiento será "Prac01" y estará almacenado en un fichero llamado "prueba-prac01.adb" como procedimiento separado (separate) del procedimiento "Prueba" definido en "prueba_base.adb".
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
Imágen de perfil de Alejandro

Procesamiento de fichero de datos y generación de ficheros de componentes uniformes e índice

Publicado por Alejandro (155 intervenciones) el 30/06/2023 17:58:55
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
-- Importar los módulos necesarios
with Ada.Text_IO;
with Ada.IO_Exceptions;
 
procedure Prac01(File_Name : in String) is
   -- Definir tipos de registros
   type Person_Record is record
      NIF : String(1 .. 10);
      Name : String(1 .. 25);
      LastName1 : String(1 .. 25);
      LastName2 : String(1 .. 25);
      Age : Natural range 1 .. 199;
      Avg_Hability : Float;
      Greater_Habilities : Natural;
   end record;
 
   -- Declarar excepciones personalizadas
   Ex_Fichero_Inexistente : exception;
   Ex_Problemas : exception;
 
   -- Declarar variables locales
   Input_File : Ada.Text_IO.File_Type;
   Output_File : Ada.Text_IO.File_Type;
   Index_File : Ada.Text_IO.File_Type;
   Line : String(1 .. 80);
   Person : Person_Record;
   Index_Record : String(1 .. 12);
   Position : Natural := 1;
   Counter : Natural := 0;
begin
   -- Abrir el fichero de texto original
   begin
      Ada.Text_IO.Open(File => Input_File,
                       Mode => Ada.Text_IO.In_File,
                       Name => File_Name);
   exception
      when Ada.IO_Exceptions.Name_Error =>
         raise Ex_Fichero_Inexistente;
      when others =>
         raise Ex_Problemas;
   end;
 
   -- Crear los ficheros de componentes uniformes e índice
   begin
      Ada.Text_IO.Create(File => Output_File,
                         Mode => Ada.Text_IO.Out_File,
                         Name => File_Name & ".dat");
 
      Ada.Text_IO.Create(File => Index_File,
                         Mode => Ada.Text_IO.Out_File,
                         Name => File_Name & ".ind");
   exception
      when others =>
         Ada.Text_IO.Close(Input_File);
         raise Ex_Problemas;
   end;
 
   -- Leer y procesar cada línea del fichero original
   while not Ada.Text_IO.End_Of_File(Input_File) loop
      -- Leer la información de la persona
      Ada.Text_IO.Get_Line(File => Input_File,
                           Item => Line);
      Person.NIF := Line(1 .. 10);
      Person.Age := Natural'Value(Line(12 .. 13))';
 
      Ada.Text_IO.Get_Line(File => Input_File,
                           Item => Line);
      Person.Name := Line(1 .. 25);
      Person.LastName1 := Line(27 .. 51);
      Person.LastName2 := Line(53 .. 77);
 
      Ada.Text_IO.Get_Line(File => Input_File,
                           Item => Line);
      Person.Greater_Habilities := Natural'Value(Line(1 .. 1))';
      if Person.Greater_Habilities > 0 then
         Person.Avg_Hability := Float'Value(Line(3 .. 4 * Person.Greater_Habilities + 2))'
                                / Float(Person.Greater_Habilities);
      else
         Person.Avg_Hability := 0.0;
      end if;
 
      -- Escribir el registro en el fichero de datos
      Ada.Text_IO.Put(Output_File, Person.NIF & "-" & Person.Name & "-"
                                   & Person.LastName1 & "-" & Person.LastName2 & "-"
                                   & Person.Age'Image & "-" & Person.Avg_Hability'Image & "-"
                                   & Person.Greater_Habilities'Image');
      Ada.Text_IO.New_Line(Output_File);
 
      -- Escribir el registro en el fichero de índice
 
 
      Counter := Counter + 1;
      Index_Record := Person.NIF & "-" & Counter'Image';
      Ada.Text_IO.Put(Index_File, Index_Record);
      Ada.Text_IO.New_Line(Index_File);
   end loop;
 
   -- Cerrar los ficheros
   Ada.Text_IO.Close(Input_File);
   Ada.Text_IO.Close(Output_File);
   Ada.Text_IO.Close(Index_File);
exception
   when Ex_Fichero_Inexistente =>
      Ada.Text_IO.Put_Line("Error: El fichero de texto no existe.");
   when Ex_Problemas =>
      Ada.Text_IO.Put_Line("Error: Se produjo un problema durante el procesamiento del fichero.");
end Prac01;

Para utilizar este procedimiento, deberás crear un archivo llamado "prueba-prac01.adb" y agregar el código anterior en él. Luego, puedes llamar al procedimiento "Prac01" con el nombre del fichero de texto que deseas procesar. Los ficheros de componentes uniformes e índice se generarán con la extensión ".dat" y ".ind" respectivamente, utilizando el mismo nombre base que el fichero de texto original.

Recuerda que esta solución asume que el formato del fichero de texto es consistente con la descripción proporcionada en la consulta. Asegúrate de adaptarla si el formato de tu fichero difiere. Además, ten en cuenta que esta solución utiliza la biblioteca estándar de Ada, por lo que no se requiere ninguna biblioteca adicional.
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