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
- Lectura i escriptura d'arxius: Aprendre a gestionar arxius per llegir dades d'entrada i escriure resultats de sortida.
- Processament de dades: Implementar algorismes per processar les dades llegides.
- Modularitat: Dividir el projecte en diversos mòduls per millorar la claredat i mantenibilitat del codi.
- 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:
- Main: Punt d'entrada del programa.
- File_IO: Gestió de la lectura i escriptura d'arxius.
- Data_Processing: Funcions per processar les dades.
- Statistics: Càlcul de les estadístiques.
Diagrama de Mòduls
Implementació
- 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;
- 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;
- Data_Processing
Aquest mòdul contindrà les funcions per processar les dades.
- 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
- Ampliació del Sistema: Modifica el sistema per calcular altres estadístiques com la moda i el rang.
- Gestió d'Errors: Implementa una millor gestió d'errors per manejar casos com arxius buits o dades no numèriques.
- 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.
Curs de Programació en Ada
Mòdul 1: Introducció a Ada
Mòdul 2: Conceptes Bàsics
- Variables i Tipus de Dades
- Operadors i Expressions
- Estructures de Control
- Bucles en Ada
- Subprogrames: Procediments i Funcions
Mòdul 3: Tipus de Dades Avançats
Mòdul 4: Programació Modular
Mòdul 5: Concurrència i Programació en Temps Real
Mòdul 6: Temes Avançats
Mòdul 7: Millors Pràctiques i Optimització
- Estil de Codi i Millors Pràctiques
- Depuració i Proves
- Optimització del Rendiment
- Consideracions de Seguretat