All pastes #1422477 Raw Edit

Inf II Aufg. 2.3.1.c Rev. 3

public text v1 · immutable
#1422477 ·published 2009-05-14 08:51 UTC
rendered paste body
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
with Ada.Text_IO.Unbounded_IO; use Ada.Text_IO.Unbounded_IO;

procedure Aufg_2_3_i_c is
   
   --  Die Eingabevariable.
   Dat_Wort : Unbounded_String;

   --  L_1 = {a^nb^m|n,m in N_0 mit n >= 0, m >= 3}   
   --  Ueberrueft, ob das Wort in L_1  enthalten ist.
   function Check_L1 (Wort : String)
                     return Boolean is
      A, B : Natural := 0;
   begin
      for i in Wort'First .. Wort'Length loop
         --  ein "a" darf nich' hinter 'nem 'b' vorkommen
         if (i + 1 <= Wort'Length) then
            if (Wort (i) = 'b') and (Wort (i + 1) = 'a') then
               return False;
            end if;
         end if;
         
         if (Wort (i) /= 'a') and (Wort (i) /= 'b') then
            return False;
         end if;
         
         
         --  zaelt "a"'s
         if Wort (i) = 'a' then
            A := A + 1;
         end if;
         
         --  zaelt "b"'s
         if Wort (i) = 'b' then
            B := B + 1;
         end if;
      end loop;
      
      --  prueft, ob das Wort so viele "a"'s und "b"s' wie in der 
      --  Mengencharakterisierung angegeben.
      if (B >= 3) then
         return True;
      end if;
      
      return False;
   end Check_L1;
   
   --  L_2 = {a^nb^m|n,m in N_0 mit n >= 2, m >= 0}
   --  Ueberrueft, ob das Wort in L_2  enthalten ist.
   function Check_L2 (Wort : String)
                     return Boolean is
      A, B : Natural := 0;
   begin
      for i in Wort'First .. Wort'Length loop
         --  ein "a" darf nich' hinter 'nem 'b' vorkommen
         if (i + 1 <= Wort'Length) then
            if (Wort (i) = 'b') and (Wort (i + 1) = 'a') then
               return False;
            end if;
         end if;

         if (Wort (i) /= 'a') and (Wort (i) /= 'b') then
            return False;
         end if;

         --  zaelt "a"'s
         if Wort (i) = 'a' then
            A := A + 1;
         end if;
         
         --  zaelt "b"'s
         if Wort (i) = 'b' then
            B := B + 1;
         end if;
      end loop;
      
      --  prueft, ob das Wort so viele "a"'s und "b"s' wie in der 
      --  Mengencharakterisierung angegeben.
      if (A >= 2) then
         return True;
      end if;
      
      return False;
   end Check_L2;

begin
   --  Zeigt dem user die sprachen, fragt von ihm das Wort ab und ueberrueft, 
   --  ob es in L1 und/oder L1 enthalten ist und gibt das Ergebnis aus.
   New_Line;
   Put_Line ("L_1 = {a^nb^m|n,m in N_0 mit n >= 0, m >= 3}");
   Put_Line ("L_2 = {a^nb^m|n,m in N_0 mit n >= 2, m >= 0}");
   New_Line;
   Put_Line ("Bitte geben Sie das Wort ein und das Programm prueft, ob es" &
   " in L1 oder in L2 enthalten ist.");
   New_Line;
   Get_Line (Dat_Wort);
   New_Line;
   
   if Check_L1 (To_String (Dat_Wort)) then
      Put_Line ("Das Wort ist in L1 enthalten.");
   end if;
   
   if Check_L2 (To_String (Dat_Wort)) then
      Put_Line ("Das Wort ist in L2 enthalten.");
   end if;
   
   if not Check_L1 (To_String (Dat_Wort)) and
      not Check_L2 (To_String (Dat_Wort)) then
      Put_Line ("Das Wort ist weder in L1 noch in L2 enhalten.");
   end if;
end Aufg_2_3_i_c;