Guest User

Untitled

a guest
Apr 14th, 2012
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 5.65 KB | None | 0 0
  1. -- Bei den Vergleichsangaben sind die Werte fuer die Ueberpruefungen
  2. -- ob die Liste leer ist nicht mit eingerechnet. Genauso sind die
  3. -- Ueberpruefungen fuer die "exit when" Bedingungen nicht mit
  4. -- eingerechnet, da diese nicht fuer den Abgleich der Elemente unter-
  5. -- einander wichtig sind.
  6.  
  7. with Ada.Text_Io; use Ada.Text_Io;
  8. with Ada.Integer_Text_Io; use Ada.Integer_Text_Io;
  9.  
  10. procedure Info_Blatt9_Aufgabe5 is
  11.  
  12.   type Item;
  13.   type Ref_Item is access Item;
  14.  
  15.   -- Next is right
  16.   -- Prev is left
  17.   type Item is record
  18.     Value: Integer;
  19.     Next: Ref_Item;
  20.     Prev: Ref_Item;
  21.   end record;
  22.  
  23.   -- returns an empty list
  24.   -- 0 Vergleiche
  25.   function Empty return Ref_Item is
  26.   begin
  27.     return null;
  28.   end Empty;
  29.  
  30.  
  31.   -- checks whether a list is empty or not
  32.   -- 1 Vergleich
  33.   function Isempty (List: Ref_Item) return Boolean is
  34.   begin
  35.     return List = null;
  36.   end Isempty;
  37.  
  38.   -- removes a given element from a list
  39.   -- n Vergleiche bei (if P.Value = Item).
  40.   function Remove (Item: Integer; List: Ref_Item) return Ref_Item is
  41.     P: Ref_Item := List;
  42.   begin
  43.     if List /= null and then List.Prev /= null then
  44.       loop
  45.         if P.Value = Item then
  46.           P.Prev.Next := P.Next;
  47.           P.Next.Prev := P.Prev;
  48.         end if;
  49.  
  50.         exit when P = List.Prev;
  51.        
  52.         P := P.Next;
  53.       end loop;
  54.     end if;
  55.  
  56.     return P;
  57.   end Remove;
  58.  
  59.   -- prints all member elements of a list
  60.   -- 0 Vergleiche
  61.   procedure Print (List: Ref_Item) is
  62.     P: Ref_Item := List;
  63.   begin
  64.     if List /= null and then List.Prev /= null then
  65.       loop
  66.         Put (P.Value'Img & ",");
  67.         exit when P = List.Prev;
  68.         P := P.Next;
  69.       end loop;
  70.     end if;
  71.   end Print;
  72.  
  73.   -- checks whether a list contains a given element or not
  74.   -- n Vergleiche bei (P.Value = Item).
  75.   function Contain (Item: Integer; List: Ref_Item) return Boolean is
  76.     P: Ref_Item := List;
  77.   begin
  78.     if List /= null and then List.Prev /= null then
  79.       loop
  80.         if P.Value = Item then
  81.           return true;
  82.         end if;
  83.        
  84.         exit when P = List.Prev;
  85.        
  86.         P := P.Next;
  87.       end loop;
  88.     end if;
  89.  
  90.     return false;
  91.   end Contain;
  92.  
  93.   -- inserts an element into a list if it isn't already included
  94.   -- 1 Vergleich
  95.   function Enter (Elem: Integer; List: Ref_Item) return Ref_Item is
  96.     List_Next_Item: Ref_Item;
  97.   begin
  98.     if not Contain (Elem, List) and then List /= null then
  99.       List_Next_Item := List.Next;
  100.       List.Next := new Item'(Elem, List_Next_Item, List);
  101.       List_Next_Item.Prev := List.Next;
  102.     elsif not Contain (Elem, List) and List = null then
  103.       List_Next_Item := new Item'(Elem, null, null);
  104.       List_Next_Item.Next := List_Next_Item;
  105.       List_Next_Item.Prev := List_Next_Item;
  106.       return List_Next_Item;
  107.     end if;
  108.    
  109.     return List;
  110.   end Enter;
  111.  
  112.   -- calculates the union of two lists
  113.   -- 0 Vergleiche
  114.   function Union (List1, List2: Ref_Item) return Ref_item is
  115.     P: Ref_Item := List1;
  116.     Result: Ref_Item := Empty;
  117.   begin
  118.     if List1 /= null and then List1.Prev /= null then
  119.       loop
  120.         Result := Enter (P.Value, Result);
  121.         exit when P = List1.Prev;
  122.         P := P.Next;
  123.       end loop;
  124.     end if;
  125.    
  126.     P := List2;
  127.    
  128.     if List2 /= null and then List2.Prev /= null then
  129.       loop
  130.         Result := Enter (P.Value, Result);
  131.         exit when P = List2.Prev;
  132.         P := P.Next;
  133.       end loop;
  134.     end if;
  135.    
  136.     return Result;
  137.   end Union;
  138.  
  139.   -- calculates the intersection of two lists
  140.   -- n Vergleiche
  141.   function Intersection (List1, List2: Ref_Item) return Ref_Item is
  142.     P: Ref_Item := List1;
  143.     Result: Ref_Item := Empty;
  144.   begin
  145.     loop
  146.       if Contain (P.Value, List2) then
  147.         Result := Enter (P.Value, Result);
  148.       end if;
  149.    
  150.       exit when P = List1.Prev;
  151.  
  152.       P := P.Next;
  153.     end loop;
  154.  
  155.     return Result;
  156.   end Intersection;
  157.  
  158.   Anchor : Ref_Item;
  159.   Anchor2: Ref_Item;
  160. begin
  161.   Anchor := Empty;
  162.   Anchor2 := Empty;
  163.  
  164.   -- initialize list 1
  165.   Anchor           := new Item'(2, null, null);
  166.   Anchor.Next      := new Item'(3, null, null);
  167.   Anchor.Prev      := new Item'(1, Anchor, Anchor.Next);
  168.   Anchor.Next.Next := Anchor.Prev;
  169.   Anchor.Next.Prev := Anchor;
  170.  
  171.   -- initialize list 2
  172.   Anchor2           := new Item'(4, null, null);
  173.   Anchor2.Next      := new Item'(5, null, null);
  174.   Anchor2.Prev      := new Item'(6, Anchor2, Anchor2.Next);
  175.   Anchor2.Next.Next := Anchor2.Prev;
  176.   Anchor2.Next.Prev := Anchor2;
  177.  
  178.   Put_Line ("Dies ist die erste Liste:");
  179.   Print (Anchor);
  180.  
  181.   New_Line;
  182.   New_Line;
  183.  
  184.   Put_Line ("Dies ist die zweite Liste:");
  185.   Print (Anchor2);
  186.  
  187.   New_Line;
  188.   New_Line;
  189.  
  190.   Put_Line ("Der ersten Liste wurde das Element '4' hinzugefuegt:");
  191.   Anchor := Enter (4, Anchor);
  192.   Print (Anchor);
  193.  
  194.   New_Line;
  195.   New_Line;
  196.  
  197.   Put_Line ("Ueberpruefung ob das Element '2' in der ersten Liste ist:");
  198.   Put (Contain (2, Anchor)'Img);
  199.  
  200.   New_Line;
  201.   New_Line;
  202.  
  203.   Put_Line ("Ueberpruefung ob die erste Liste leer ist:");
  204.   Put (Isempty (Anchor)'Img);
  205.  
  206.   New_Line;
  207.   New_Line;
  208.  
  209.   Put_Line ("Das Element '2' aus der ersten Liste entfernt:");
  210.   Anchor := Remove (2, Anchor);
  211.   Print (Anchor);
  212.  
  213.   New_Line;
  214.   New_Line;
  215.  
  216.   Put_Line ("Ueberpruefung ob das Element '2' in der ersten Liste ist:");
  217.   Put (Contain (2, Anchor)'Img);
  218.  
  219.   New_Line;
  220.   New_Line;
  221.  
  222.   Put_Line ("Die Vereinigungsmenge beider Listen ist:");
  223.   Print (Union (Anchor, Anchor2));
  224.  
  225.   New_Line;
  226.   New_Line;
  227.  
  228.   Put_Line ("Die Schnittmenge beider Listen ist:");
  229.   Print (Intersection (Anchor, Anchor2));
  230. end Info_Blatt9_Aufgabe5;
Advertisement
Add Comment
Please, Sign In to add comment