Guest User

Untitled

a guest
May 14th, 2018
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 20.47 KB | None | 0 0
  1. --  ---------------------------------------------------------------------------
  2. --  @Main: Geschenkeverwaltung.adb
  3. --
  4. --  @Project: PSE, Sheet 10, Problem 3
  5. --  @Version: 1.0
  6. --  @Created: 19.12.2011
  7. --  @Author: Alexander Miller
  8. --
  9. --  @Description: Programm zur Verwaltung einer Wunschliste.
  10. --
  11. --  @Modifications:
  12. --  
  13. --  @Notes : Es passiert manchmal ohne jeden ersichtloichen Grund, dass die
  14. --    Formatierung der Wunschliste streikt und bei den Stadtnamen zB
  15. --    ï»¿-Bad Liebenzell eingelesen wird.
  16. --  ---------------------------------------------------------------------------
  17.  
  18. with Ada.Text_IO;
  19. with Ada.Strings.Unbounded;
  20. with Ada.Strings.Unbounded.Text_IO;
  21.  
  22. use Ada.Text_IO;
  23. use Ada.Strings.Unbounded;
  24. use Ada.Strings.Unbounded.Text_IO;
  25.  
  26. procedure Geschenkeverwaltung is
  27.  
  28.    --  Variablen folgender Typen werden im weiteren Verlauf des Programmes
  29.    --  durchgehend als G wie Geschenke, K wie Kind und S wie Stadt bezeichnet
  30.    type Geschenke;
  31.    type Ref_Geschenke is access Geschenke;
  32.    type Geschenke is record
  33.       Name : Unbounded_String;
  34.       Next : Ref_Geschenke;
  35.    end record;
  36.    
  37.    type Kind;
  38.    type Ref_Kind is access Kind;
  39.    type Kind is record
  40.       Name        : Unbounded_String;
  41.       Zu_Schenken : Ref_Geschenke;
  42.       Next        : Ref_Kind;
  43.    end record;
  44.  
  45.    type Stadt;
  46.    type Ref_Stadt is access Stadt;
  47.    type Stadt is record
  48.       Name   : Unbounded_String;
  49.       Kinder : Ref_Kind;
  50.       Next   : Ref_Stadt;
  51.    end record;
  52.    
  53.    type Anker;
  54.    type Ref_Anker is access Anker;
  55.    type Anker is record
  56.       First : Ref_Stadt;
  57.    end record;
  58.    
  59.    Liste : Ref_Anker;
  60.  
  61.    --  ------------------------------------------------------------------------
  62.    --  @Procedure: Wunschliste_Einlesen
  63.    --
  64.    --  @Description: Liest eine Wunschliste aus einer Textdatei ein und legt
  65.    --   eine entsprechende Kammliste an.
  66.    --
  67.    --  @Parameter: -
  68.    procedure Wunschliste_Einlesen is
  69.  
  70.       Quelle            : File_Type;
  71.       Gelesen           : Unbounded_String;
  72.       --  Hilfszeiger, die jeweils die Einfuegeprozeduren wissen lassen, wohin
  73.       --  ein  neues Element hinzuzufuegen ist
  74.       Jetzige_Stadt     : Ref_Stadt;
  75.       Jetziges_Kind     : Ref_Kind;
  76.       Jetziges_Geschenk : Ref_Geschenke;
  77.  
  78.       --  ---------------------------------------------------------------------
  79.       --  @Procedure: Insert_Stadt
  80.       --
  81.       --  @Description: Fuegt eine neue Stadt an das Ende der bestehenden Kamm-
  82.       --   liste hinzu.
  83.       --
  84.       --  @Parameter:
  85.       --   +L: Anker der Liste.
  86.       --   +Name: Der Name der einzufuegenden Stadt.
  87.       procedure Insert_Stadt
  88.       (S    : in Ref_Stadt;
  89.        Name : in Unbounded_String) is
  90.       begin
  91.          --  Einfuegen der Stadt an die erste Stelle und entsprechende Aende-
  92.          --  rung des Ankers im Fall einer leeren Liste
  93.          if S = null then
  94.             Liste.First       := new Stadt'(Delete (Name, 1, 1), null, null);
  95.             Jetzige_Stadt     := Liste.First;
  96.          else
  97.             S.Next        := new Stadt'(Delete (Name, 1, 1), null, null);
  98.             Jetzige_Stadt := S.Next;
  99.          end if;
  100.       end Insert_Stadt;
  101.  
  102.       --  ---------------------------------------------------------------------
  103.       --  @Procedure: Insert_Kind
  104.       --
  105.       --  @Description: Fuegt ein neues Kind an das Ende der bestehenden Kamm-
  106.       --   liste hinzu.
  107.       --
  108.       --  @Parameter:
  109.       --   +S: Die Stadt, zu der das Kind zugefuegt werden soll.
  110.       --   +Name: Der Name des einzufuegenden Kindes.
  111.       procedure Insert_Kind
  112.       (S    : in Ref_Stadt;
  113.        K    : in Ref_Kind;
  114.        Name : in Unbounded_String) is
  115.       begin
  116.          --  Einfuegen des Kindes an die erste Stelle im Fall einer leeren
  117.          --  Liste
  118.          if S.Kinder = null then      
  119.             S.Kinder      := new Kind'(Delete (Name, 1, 1), null, null);
  120.             Jetziges_Kind := S.Kinder;
  121.          else
  122.             K.Next        := new Kind'(Delete (Name, 1, 1), null, null);
  123.             Jetziges_Kind := K.Next;
  124.          end if;
  125.       end Insert_Kind;
  126.  
  127.       --  ---------------------------------------------------------------------
  128.       --  @Procedure: Insert_Geschenk
  129.       --
  130.       --  @Description: Fuegt ein neues Geschenk an das Ende der bestehenden
  131.       --   Kammliste hinzu.
  132.       --
  133.       --  @Parameter:
  134.       --   +K: Das Kind, zu dem das Kind zugefuegt werden soll.
  135.       --   +Name: Der Name des einzufuegenden Geschenkes.
  136.       procedure Insert_Geschenk
  137.       (K    : in Ref_Kind;
  138.        G    : in Ref_Geschenke;
  139.        Name : in Unbounded_String) is
  140.       begin
  141.          --  Einfuegen des Geschenkes an die erste Stelle im Fall einer leeren
  142.          --  Liste
  143.          if K.Zu_Schenken = null then
  144.             K.Zu_Schenken     := new Geschenke'(Delete (Name, 1, 1), null);
  145.             Jetziges_Geschenk := K.Zu_Schenken;
  146.          else
  147.             G.Next            := new Geschenke'(Delete (Name, 1, 1), null);
  148.             Jetziges_Geschenk := G.Next;
  149.          end if;
  150.       end Insert_Geschenk;
  151.  
  152.    begin
  153.  
  154.       Liste := new Anker;
  155.       Open (Quelle, In_File, "wunschliste.txt");
  156.  
  157.       while not End_Of_File (Quelle) loop
  158.          Gelesen := Get_Line (Quelle);
  159.          case (Element (Gelesen, 1)) is
  160.             when '-'    => Insert_Stadt
  161.                            (Jetzige_Stadt, Gelesen);
  162.             when '+'    => Insert_Kind
  163.                            (Jetzige_Stadt, Jetziges_Kind, Gelesen);
  164.             when '*'    => Insert_Geschenk
  165.                            (Jetziges_Kind, Jetziges_Geschenk, Gelesen);
  166.             when others => null;
  167.          end case;
  168.       end loop;
  169.      
  170.       Close (Quelle);
  171.    
  172.    end Wunschliste_Einlesen;
  173.  
  174.    --  ------------------------------------------------------------------------
  175.    --  @Procedure: Menue
  176.    --
  177.    --  @Description: Stellt eine simple Benutzeroberflaeche fuer die Verwaltung
  178.    --   der Wunschliste zur Verfuegung.
  179.    --
  180.    --  @Parameter: -
  181.    procedure Menue is
  182.  
  183.       Schalter : Boolean := False;
  184.       Eingabe  : Unbounded_String;
  185.       S        : Ref_Stadt := Liste.First;
  186.    
  187.       --  ---------------------------------------------------------------------
  188.       --  @Procedure: Geschenke_Zeigen
  189.       --
  190.       --  @Description: Zeigt, nachdem Stadt und Kind gewaehlt wurden,
  191.       --   saemtliche Geschenke des Kindes an.
  192.       --
  193.       --  @Parameter:
  194.       --   +K: Kind, dessen Geschenke gezeigt werden sollen.
  195.       procedure Geschenke_Zeigen
  196.       (K : in Ref_Kind) is
  197.          G       : Ref_Geschenke := K.Zu_Schenken;
  198.          Eingabe : Unbounded_String;
  199.       begin
  200.          New_Line;
  201.          Put ("Liste aller Geschenke fuer " & K.Name & " :");
  202.          while G /= null loop
  203.             New_Line;
  204.             Put ("-" & G.Name);
  205.             G := G.Next;
  206.          end loop;
  207.          New_Line;
  208.          New_Line;
  209.          Put ("Zum Fortfahren Enter druecken.");
  210.          New_Line;
  211.          Eingabe := Get_Line;
  212.          New_Line;
  213.       end Geschenke_Zeigen;
  214.  
  215.       --  ---------------------------------------------------------------------
  216.       --  @Procedure: Kind_Waehlen
  217.       --
  218.       --  @Description: Gibt eine Liste aller Kinder in der gewaehlten Stadt
  219.       --   aus und laesst eines davon auswaehlen, um seine Geschenke zu zeigen.
  220.       --
  221.       --  @Parameter:
  222.       --   +S: Die Stadt aus der ein Kind zu waehlen ist.
  223.       procedure Kind_Waehlen
  224.       (S : in Ref_Stadt) is
  225.  
  226.          Eingabe  : Unbounded_String;
  227.          Schalter : Boolean  := False;
  228.          Gefunden : Boolean  := False;
  229.          K        : Ref_Kind := S.Kinder;
  230.      
  231.       begin
  232.          New_Line;
  233.          Put ("Liste aller Kinder in " & S.Name & ":");
  234.          New_Line;
  235.          while K /= null loop
  236.             Put (" -" & K.Name);
  237.             New_Line;
  238.             K := K.Next;
  239.          end loop;
  240.          
  241.          while not Schalter loop
  242.             --  resetten der Hilfsvariablen fuer den Fall, dass die Schleife
  243.             --  neu startet
  244.             K := S.Kinder;
  245.             Gefunden := False;
  246.  
  247.             Put ("Wessen Geschenke sollen angezeigt werden?");
  248.             New_Line;
  249.             Put ("('return' eingeben, um zum vorherigen Menue zu gelangen.)");
  250.             New_Line;
  251.             Eingabe := Get_Line;
  252.            
  253.             --  durch Eingabe von return wird der Schalter, der die gesamte
  254.             --  Eingabeschleife laufen laesst, umgelegt, d.h. das Unterprogramm
  255.             --  beendet sich und das Menue kehrt zur Eingabe der Stadt zurueck
  256.             if
  257.             Eingabe = "return" or Eingabe = "Return" or Eingabe = "RETURN" then
  258.                Schalter := True;
  259.                New_Line;
  260.             else
  261.                --  die Liste wird nach dem eingegebenen Namen durchsucht, wird
  262.                --  er gefunden, so werden die Geschenke angezeigt
  263.                while K /= null and not Gefunden loop
  264.                   if K.Name = Eingabe then
  265.                      Gefunden := True;
  266.                      Geschenke_Zeigen (K);
  267.                   end if;
  268.                   K := K.Next;
  269.                end loop;
  270.                
  271.                if not Gefunden then
  272.                      New_Line;
  273.                      Put ("------------------------------------- ");
  274.                      New_Line;
  275.                      Put ("Fehler: Das Kind wurde nicht gefunden.");
  276.                      New_Line;
  277.                      Put ("Eingabe muss wiederholt werden.       ");
  278.                      New_Line;
  279.                      Put ("------------------------------------- ");
  280.                      New_Line;
  281.                      New_Line;
  282.                end if;
  283.             end if;
  284.          end loop;  
  285.       end Kind_Waehlen;
  286.  
  287.       --  ---------------------------------------------------------------------
  288.       --  @Procedure: Stadt_Waehlen
  289.       --
  290.       --  @Description: Gibt eine Liste aller Stadte  aus und laesst eine davon
  291.       --   auswaehlen, um ihre Kinder anzuzeigen.
  292.       --
  293.       --  @Parameter: -
  294.       procedure Stadt_Waehlen is
  295.          
  296.          Eingabe  : Unbounded_String;
  297.          Gefunden : Boolean   := False;
  298.          Schalter : Boolean   := False;
  299.          S        : Ref_Stadt := Liste.First;
  300.          
  301.       begin
  302.          while not Schalter loop
  303.             --  resetten der Hilfsvariablen fuer den Fall, dass die Schleife
  304.             --  neu startet
  305.             Gefunden := False;
  306.             S        := Liste.First;
  307.             Put ("Liste aller Staedte auf der Wunschliste:");
  308.             New_Line;
  309.             S := Liste.First;
  310.             while S /= null loop
  311.                Put (" -" & S.Name);
  312.                S := S.Next;
  313.                New_Line;
  314.             end loop;
  315.             Put ("Die Liste der Kinder in welcher Stadt soll gezeigt werden?");
  316.             New_Line;
  317.             Put ("'return' eingeben, um zum vorherigen Menue zu gelangen.");
  318.             New_Line;
  319.             Eingabe := Get_Line;
  320.  
  321.             if Eingabe = "return"
  322.             or Eingabe = "Return"
  323.             or Eingabe = "RETURN"
  324.             then
  325.                Schalter := True;
  326.             else
  327.                --  resetten der Hilfsvariablen fuer den Fall, dass die Schleife
  328.                --  neu startet
  329.                Gefunden := False;
  330.                S    := Liste.First;
  331.                --  die Liste wird nach dem eingegebenen Namen durchsucht, wird
  332.                --  er gefunden, so werden alle Kinder in der eingegebenen Stadt
  333.                --  angezeigt
  334.                while S /= null and not Gefunden loop
  335.                   if S.Name = Eingabe then
  336.                      Gefunden := True;
  337.                      Kind_Waehlen (S);
  338.                   end if;
  339.                   S := S.Next;
  340.                end loop;
  341.  
  342.                if not Gefunden then
  343.                   New_Line;
  344.                   Put ("-------------------------------------- ");
  345.                   New_Line;
  346.                   Put ("Fehler: Die Stadt wurde nicht gefunden.");
  347.                   New_Line;
  348.                   Put ("Eingabe muss wiederholt werden.        ");
  349.                   New_Line;
  350.                   Put ("-------------------------------------- ");
  351.                   New_Line;
  352.                   New_Line;
  353.                end if;
  354.             end if;
  355.          end loop;
  356.  
  357.       end Stadt_Waehlen;
  358.    
  359.       --  ---------------------------------------------------------------------
  360.       --  @Procedure: Geschenk_Zaehlen
  361.       --
  362.       --  @Description: Laesst einen Namen eines Geschenkes eingeben und findet
  363.       --   dann heraus wie oft dieses Geschenk insgesamt auf der Wunschliste
  364.       --   steht.
  365.       --
  366.       --  @Parameter: --
  367.       procedure Geschenk_Zaehlen is
  368.          Eingabe  : Unbounded_String;
  369.          Gelesen  : Unbounded_String;
  370.          Zaehler  : Natural   := 0;
  371.          Gefunden : Boolean   := False;
  372.          Quelle   : File_Type;
  373.       begin
  374.          New_Line;
  375.          Put ("Welches Geschenk soll gezaehlt werden?");
  376.          New_Line;
  377.          Eingabe := Get_Line;
  378.          Eingabe := "*" & Eingabe;
  379.          New_Line;
  380.  
  381.          Open (Quelle, In_File, "wunschliste.txt");
  382.          while not End_Of_File (Quelle) loop
  383.             Gelesen := Get_Line (Quelle);
  384.             if Gelesen = Eingabe then
  385.                Gefunden := True;
  386.                Zaehler := Zaehler + 1;
  387.             end if;
  388.          end loop;
  389.          Close (Quelle);
  390.  
  391.          if Gefunden then
  392.             Put (Delete (Eingabe, 1, 1) & " steht insgesamt" & Zaehler'Img);
  393.             Put (" auf der Wunschliste.");
  394.             New_Line;
  395.             New_Line;
  396.          else
  397.             Put ("Dieses Geschenk kommt in der Wunschliste nicht vor.");
  398.             New_Line;
  399.             New_Line;
  400.          end if;
  401.       end Geschenk_Zaehlen;
  402.  
  403.       --  ---------------------------------------------------------------------
  404.       --  @Procedure: Geschenke_Einer_Stadt
  405.       --
  406.       --  @Description: Laesst eine Stadt eingeben und gibt dann aus, welche
  407.       --   Geschenke, wie oft, in dieser Stadt vorkommen
  408.       --
  409.       --  @Parameter: -
  410.       procedure Geschenke_Einer_Stadt is
  411.      
  412.          --  neuer Typ fuer eine Liste, der mit angibt, wie oft ein Geschenk
  413.          --  vorgekommen ist
  414.          type Zaehler;
  415.          type Ref_Zaehler is access Zaehler;
  416.          type Zaehler is record
  417.             Name   : Unbounded_String;
  418.             Anzahl : Natural;
  419.             Next   : Ref_Zaehler;
  420.          end record;
  421.  
  422.          type Zaehler_Anker;
  423.          type Ref_Zaehler_Anker is access Zaehler_Anker;
  424.          type Zaehler_Anker is record
  425.             First : Ref_Zaehler;
  426.          end record;
  427.          
  428.          Zaehl_Liste   : Ref_Zaehler_Anker;
  429.          Z             : Ref_Zaehler;
  430.          S             : Ref_Stadt := Liste.First;
  431.          K             : Ref_Kind;
  432.          Eingabe       : Unbounded_String;
  433.          Gefunden      : Boolean := False;
  434.  
  435.          --  ------------------------------------------------------------------
  436.          --  @Procedure: Zaehl_Liste_Erstellen
  437.          --
  438.          --  @Description: Wird genutzt, um festzustellen, wie oft welche Ge-
  439.          --   schenke  bei einem gegeben Kind vorkommen.
  440.          --
  441.          --  @Parameter:
  442.          --   +K: Das Kind deseen Geschenke zu zaehlen sind.
  443.          procedure Zaehl_Liste_Erstellen
  444.          (K : in Ref_Kind) is
  445.             G        : Ref_Geschenke := K.Zu_Schenken;
  446.             Z        : Ref_Zaehler   := Zaehl_Liste.First;
  447.             Gefunden : Boolean       := False;
  448.          begin
  449.             --  iterieren durch die Liste aller Geschenke des Kindes und Ein-
  450.             --  fuegen in die Zaehlliste
  451.             while G /= null loop
  452.                Gefunden := False;
  453.                Z := Zaehl_Liste.First;
  454.                --  einfuegen eines Geschenkes falls die Zaehlliste leer ist
  455.                if Z = null then
  456.                   Zaehl_Liste.First := new Zaehler'(G.Name, 1, null);
  457.                else
  458.                   --  sonst wird die Zaehlliste durchsucht, sollte ein Element
  459.                   --  den gleichen Namen haben wie das jetzige Geschenk, so
  460.                   --  die Anzahl dieses Elementes um 1 erhoeht
  461.                   while Z /= null and not Gefunden loop
  462.                      if G.Name = Z.Name then
  463.                         Z.Anzahl := Z.Anzahl + 1;
  464.                         Gefunden := True;
  465.                      end if;
  466.                      Z := Z.Next;
  467.                   end loop;
  468.                   --  wenn der Name des Geschenkes in der Liste bisher nicht
  469.                   --  vorkommt wird entsprechend ein neues Element mit Anzahl 1
  470.                   --  hinzugefuegt
  471.                   if not Gefunden then
  472.                      Z := Zaehl_Liste.First;
  473.                      while Z.Next /= null loop
  474.                         Z := Z.Next;
  475.                      end loop;
  476.                      Z.Next := new Zaehler'(G.Name, 1, null);
  477.                   end if;
  478.                end if;
  479.                G := G.Next;
  480.             end loop;
  481.          end Zaehl_Liste_Erstellen;
  482.      
  483.       begin
  484.          while not Gefunden loop
  485.             S := Liste.First;
  486.             K := S.Kinder;
  487.  
  488.             Put ("Liste aller Staedte auf der Wunschliste:");
  489.             New_Line;
  490.             while S /= null loop
  491.                Put (" -" & S.Name);
  492.                S := S.Next;
  493.                New_Line;
  494.             end loop;
  495.             S := Liste.First;
  496.             Zaehl_Liste := new Zaehler_Anker;
  497.  
  498.             Put ("Eine Liste der Geschenke welcher Stadt soll");
  499.             Put (" angezeigt werden?");
  500.             New_Line;
  501.             Eingabe := Get_Line;
  502.             --  die Wunschliste wird nach der eingegebenen Stadt durchsucht,
  503.             --  wurde sie gefunden, so wird die Zaehlliste um die Geschenke
  504.             --  von jedem Kind dieser Stadt erweitert, wenn die Stadt nicht ge-
  505.             --  funden wurde muss die Eingabe wiederholt werden
  506.             while not Gefunden and S /= null loop
  507.                if Eingabe = S.Name then
  508.                   Gefunden := True;
  509.                   K := S.Kinder;
  510.                   while K /= null loop
  511.                      Zaehl_Liste_Erstellen (K);
  512.                      K := K.Next;
  513.                   end loop;
  514.                end if;
  515.                S := S.Next;
  516.             end loop;
  517.    
  518.             if not Gefunden then
  519.                New_Line;
  520.                Put ("-------------------------------------- ");
  521.                New_Line;
  522.                Put ("Fehler: Die Stadt wurde nicht gefunden.");
  523.                New_Line;
  524.                Put ("Eingabe muss wiederholt werden.        ");
  525.                New_Line;
  526.                Put ("-------------------------------------- ");
  527.                New_Line;
  528.                New_Line;
  529.             end if;
  530.          end loop;
  531.          
  532.          New_Line;
  533.          Put ("Geschenke fuer " & Eingabe & ":");
  534.          New_Line;
  535.          Z := Zaehl_Liste.First;
  536.          while Z /= null loop
  537.             Put (" -" & Z.Anzahl'Img & "x " & Z.Name);
  538.             New_Line;
  539.             Z := Z.Next;
  540.          end loop;
  541.          
  542.       end Geschenke_Einer_Stadt;
  543.    
  544.    begin
  545.       while not Schalter loop
  546.          Put ("-------------------------------------------------------------");
  547.          Put ("------------");
  548.          New_Line;
  549.          Put ("'1' eingeben, um die Geschenke eines einzelnen Kindes");
  550.          Put (" einzusehen.");
  551.          New_Line;
  552.          Put ("'2' eingeben, um alle Geschenke einer einzelnen Stadt");
  553.          Put (" anzeigen zu lassen.");
  554.          New_Line;
  555.          Put ("'3' eingeben, um anzeigen zu lassen, wie oft ein bestimmtes ");
  556.          New_Line;
  557.          Put ("    Geschenk auf der Wunschliste steht.");
  558.          New_Line;
  559.          Put ("'exit' eingeben, um das Programm zu beenden.");
  560.          New_Line;
  561.          Put ("-------------------------------------------------------------");
  562.          Put ("------------");
  563.          New_Line;
  564.          Eingabe := Get_Line;
  565.          if Eingabe = "1" then
  566.             Stadt_Waehlen;
  567.          elsif Eingabe = "2" then
  568.             Geschenke_Einer_Stadt;
  569.          elsif Eingabe = "3" then
  570.             Geschenk_Zaehlen;
  571.          elsif Eingabe = "exit" or Eingabe = "Exit" or Eingabe = "EXIT" then
  572.             Schalter := True;
  573.          else
  574.             New_Line;
  575.             Put ("Eingabe war ungueltig und muss wiederholt werden.");
  576.             New_Line;
  577.             New_Line;
  578.          end if;
  579.       end loop;
  580.    end Menue;
  581.  
  582. begin
  583.  
  584.    Wunschliste_Einlesen;
  585.    Menue;
  586.  
  587. end Geschenkeverwaltung;
Add Comment
Please, Sign In to add comment