En aquest estudi de cas, desenvoluparem un sistema de processament de dades utilitzant Ada. Aquest projecte ens permetrà aplicar molts dels conceptes apresos al llarg del curs, incloent la gestió d'arxius, l'ús de tipus de dades avançats, la programació modular i la gestió d'excepcions.

Objectius del Projecte

  1. Lectura i escriptura d'arxius: Aprendre a gestionar arxius per llegir dades d'entrada i escriure resultats de sortida.
  2. Processament de dades: Implementar algorismes per processar les dades llegides.
  3. Modularitat: Dividir el projecte en diversos mòduls per millorar la claredat i mantenibilitat del codi.
  4. Gestió d'excepcions: Manejar errors i excepcions que puguin sorgir durant l'execució del programa.

Descripció del Sistema

El sistema de processament de dades que desenvoluparem llegirà un arxiu de text amb dades numèriques, calcularà estadístiques bàsiques (com la mitjana, la mediana i la desviació estàndard) i escriurà els resultats en un altre arxiu de text.

Estructura del Projecte

El projecte es dividirà en els següents mòduls:

  1. Main: Punt d'entrada del programa.
  2. File_IO: Gestió de la lectura i escriptura d'arxius.
  3. Data_Processing: Funcions per processar les dades.
  4. Statistics: Càlcul de les estadístiques.

Diagrama de Mòduls

Main
 ├── File_IO
 ├── Data_Processing
 └── Statistics

Implementació

  1. Main

El mòdul principal serà el punt d'entrada del programa i coordinarà les crides als altres mòduls.

with Ada.Text_IO;
with File_IO;
with Data_Processing;
with Statistics;

procedure Main is
   Input_File  : constant String := "input.txt";
   Output_File : constant String := "output.txt";
   Data        : Data_Processing.Data_Array;
   Mean        : Float;
   Median      : Float;
   Std_Dev     : Float;
begin
   -- Llegir dades de l'arxiu
   Data := File_IO.Read_Data(Input_File);

   -- Processar dades
   Mean := Statistics.Calculate_Mean(Data);
   Median := Statistics.Calculate_Median(Data);
   Std_Dev := Statistics.Calculate_Std_Dev(Data);

   -- Escriure resultats a l'arxiu
   File_IO.Write_Results(Output_File, Mean, Median, Std_Dev);

   Ada.Text_IO.Put_Line("Processament completat. Resultats guardats a " & Output_File);
exception
   when others =>
      Ada.Text_IO.Put_Line("S'ha produït un error durant l'execució.");
end Main;

  1. File_IO

Aquest mòdul s'encarregarà de la lectura i escriptura d'arxius.

with Ada.Text_IO;
with Ada.Float_Text_IO;

package body File_IO is

   procedure Read_Data(File_Name : in String; Data : out Data_Processing.Data_Array) is
      File : Ada.Text_IO.File_Type;
      Value : Float;
      Index : Integer := 1;
   begin
      Ada.Text_IO.Open(File => File, Mode => Ada.Text_IO.In_File, Name => File_Name);
      while not Ada.Text_IO.End_Of_File(File) loop
         Ada.Float_Text_IO.Get(File => File, Item => Value);
         Data(Index) := Value;
         Index := Index + 1;
      end loop;
      Ada.Text_IO.Close(File);
   exception
      when others =>
         Ada.Text_IO.Put_Line("Error llegint l'arxiu " & File_Name);
         raise;
   end Read_Data;

   procedure Write_Results(File_Name : in String; Mean, Median, Std_Dev : in Float) is
      File : Ada.Text_IO.File_Type;
   begin
      Ada.Text_IO.Create(File => File, Mode => Ada.Text_IO.Out_File, Name => File_Name);
      Ada.Text_IO.Put_Line(File, "Mitjana: " & Float'Image(Mean));
      Ada.Text_IO.Put_Line(File, "Mediana: " & Float'Image(Median));
      Ada.Text_IO.Put_Line(File, "Desviació Estàndard: " & Float'Image(Std_Dev));
      Ada.Text_IO.Close(File);
   exception
      when others =>
         Ada.Text_IO.Put_Line("Error escrivint l'arxiu " & File_Name);
         raise;
   end Write_Results;

end File_IO;

  1. Data_Processing

Aquest mòdul contindrà les funcions per processar les dades.

package Data_Processing is
   type Data_Array is array (1 .. 100) of Float;
end Data_Processing;

  1. Statistics

Aquest mòdul s'encarregarà del càlcul de les estadístiques.

with Ada.Numerics.Elementary_Functions;

package body Statistics is

   function Calculate_Mean(Data : Data_Processing.Data_Array) return Float is
      Sum : Float := 0.0;
      Count : Integer := 0;
   begin
      for Value of Data loop
         Sum := Sum + Value;
         Count := Count + 1;
      end loop;
      return Sum / Float(Count);
   end Calculate_Mean;

   function Calculate_Median(Data : Data_Processing.Data_Array) return Float is
      Sorted_Data : Data_Processing.Data_Array := Data;
      Middle : Integer := Data'Length / 2;
   begin
      Ada.Containers.Generic_Array_Sort(Sorted_Data);
      if Data'Length mod 2 = 0 then
         return (Sorted_Data(Middle) + Sorted_Data(Middle + 1)) / 2.0;
      else
         return Sorted_Data(Middle + 1);
      end if;
   end Calculate_Median;

   function Calculate_Std_Dev(Data : Data_Processing.Data_Array) return Float is
      Mean : Float := Calculate_Mean(Data);
      Sum_Squares : Float := 0.0;
      Count : Integer := 0;
   begin
      for Value of Data loop
         Sum_Squares := Sum_Squares + (Value - Mean) ** 2;
         Count := Count + 1;
      end loop;
      return Ada.Numerics.Elementary_Functions.Sqrt(Sum_Squares / Float(Count));
   end Calculate_Std_Dev;

end Statistics;

Exercicis Pràctics

  1. Ampliació del Sistema: Modifica el sistema per calcular altres estadístiques com la moda i el rang.
  2. Gestió d'Errors: Implementa una millor gestió d'errors per manejar casos com arxius buits o dades no numèriques.
  3. Optimització: Optimitza el codi per millorar el rendiment, especialment en la lectura i escriptura d'arxius grans.

Conclusió

Aquest estudi de cas ha demostrat com es poden aplicar diversos conceptes de programació en Ada per desenvolupar un sistema de processament de dades. Hem vist com gestionar arxius, processar dades i calcular estadístiques, tot mantenint una estructura modular i manejant excepcions de manera adequada. Aquest projecte serveix com a base per a aplicacions més complexes i pot ser ampliat segons les necessitats específiques.

© Copyright 2024. Tots els drets reservats