ADA - ayuda con ejercicio de ada 2005

 
Vista:
sin imagen de perfil

ayuda con ejercicio de ada 2005

Publicado por sergi (1 intervención) el 06/01/2015 19:51:44
hola, necesito hacer un programa corto en ada 2005 no soy capaz de hacerlo, ¿alguien podria ayudarme a hacerlo?, os lo agradeceria mucho, lo tengo q entregar dentro de 6 dias.

os dejo el enunciado para que lo leais:
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

Simulación de comportamiento en una central nuclear

Publicado por Alejandro (155 intervenciones) el 03/07/2023 17:45:02
Aquí tienes un ejemplo de cómo podrías implementar la simulación del comportamiento de una central nuclear en Ada 2005. Recuerda que es importante analizar y entender el enunciado para realizar una implementación adecuada y eficiente.

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
with Ada.Text_IO;
with Ada.Calendar;
with Ada.Real_Time;
 
procedure Central_Nuclear is
   type Temperatura is range 0 .. 2000;  -- Rango de temperaturas posibles
   type Estado_Reactor is (Activo, Apagado);  -- Estados del reactor
   type Reactor is record
      Temp: Temperatura;
      Actuador_Activo: Boolean;
   end record;
 
   type Coordinador is record
      Reactor: Reactor;
      Ultimo_Mensaje: Ada.Calendar.Time;
   end record;
 
   -- Función para generar un número aleatorio en un rango determinado
   function Aleatorio return Integer is
      Seed: Ada.Real_Time.Time;
   begin
      Seed := Ada.Real_Time.Clock;
      return Aleatorio.Random(Seed);
   end Aleatorio;
 
   -- Función para actualizar la temperatura de un reactor
   procedure Actualizar_Temperatura(Reactor: in out Reactor) is
   begin
      if Reactor.Temp < 1500 then
         -- No hacer nada
         null;
      else
         -- Abrir compuerta y bajar temperatura
         Reactor.Temp := Reactor.Temp - 50;
      end if;
   end Actualizar_Temperatura;
 
   -- Función para imprimir una alarma en un fichero
   procedure Imprimir_Alarma(Reactor: Reactor) is
      Fichero: Ada.Text_IO.File_Type;
      Mensaje: String := "ALARMA: Reactor " & Reactor'Image' & " - Temperatura: " & Reactor.Temp'Image';
   begin
      Ada.Text_IO.Open(File => Fichero, Mode => Ada.Text_IO.Append_File, Name => "alarma.txt");
      Ada.Text_IO.Put_Line(File => Fichero, Item => Mensaje);
      Ada.Text_IO.Close(File => Fichero);
   exception
      when Ada.Text_IO.Name_Error =>
         Ada.Text_IO.Put_Line("Error al abrir el fichero de alarma.");
   end Imprimir_Alarma;
 
   -- Proceso principal de la simulación
   procedure Simular_Central_Nuclear is
      Reactores: array(1 .. 3) of Reactor;
      Coordinadores: array(1 .. 3) of Coordinador;
      Temperatura_Inicial: Temperatura := 1450;
   begin
      -- Inicializar los reactores
      for I in Reactores'Range' loop
         Reactores(I).Temp := Temperatura_Inicial;
         Reactores(I).Actuador_Activo := False;
      end loop;
 
      -- Inicializar los coordinadores
      for I in Coordinadores'Range' loop
         Coordinadores(I).Reactor := Reactores(I);
         Coordinadores(I).Ultimo_Mensaje := Ada.Calendar.Clock;
      end loop;
 
      -- Simulación de los muestreos de temperatura
      loop
         -- Actualizar la temperatura de cada reactor
         for I in Reactores'Range' loop
            Actualizar_Temperatura(Reactores(I));
 
            -- Verificar si se supera la temperatura límite
            if Reactores(I).Temp > 1750 then
               Imprimir_Alarma(Reactores(I));
            end
 
 if;
         end loop;
 
         -- Mandar mensaje al hilo coordinador indicando que está vivo
         for I in Coordinadores'Range' loop
            Coordinadores(I).Ultimo_Mensaje := Ada.Calendar.Clock;
         end loop;
 
         -- Verificar si algún hilo coordinador no ha recibido mensajes
         for I in Coordinadores'Range' loop
            if Ada.Calendar.Clock - Coordinadores(I).Ultimo_Mensaje > 3.0 then
               Ada.Text_IO.Put_Line("Alerta: No se ha recibido mensaje del hilo coordinador " & I'Image');
            end if;
         end loop;
 
         -- Esperar 2 segundos antes del siguiente muestreo
         delay 2.0;
      end loop;
   end Simular_Central_Nuclear;
 
begin
   Simular_Central_Nuclear;
exception
   when others =>
      Ada.Text_IO.Put_Line("Error en la simulación: " & Ada.Exceptions.Exception_Message(Ada.Exceptions.Exception_Name));
end Central_Nuclear;

Este es un ejemplo básico de cómo podrías implementar la simulación de una central nuclear utilizando los mecanismos de sincronización necesarios para controlar el acceso a los datos y garantizar el correcto funcionamiento de los hilos coordinadores y los reactores. Recuerda que este código es solo una guía y puedes adaptarlo según tus necesidades.

Espero que esta solución te sea útil y que puedas entregar tu proyecto a tiempo. ¡Buena suerte con tu proyecto en Ada!
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