fork download
  1. with Ada.Text_IO; use Ada.Text_IO;
  2. with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
  3. with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
  4. with Ada.Containers.Vectors; use Ada.Containers;
  5. with Ada.Finalization; use Ada.Finalization;
  6.  
  7. procedure jdoodle is
  8. type Phone_Number is range 0 .. 9_999_999_999; -- 10‑digit numbers only
  9.  
  10. type Phone_Entry is record
  11. Name : Unbounded_String;
  12. Number : Phone_Number;
  13. end record;
  14.  
  15. package Entry_Vectors is new Ada.Containers.Vectors
  16. (Index_Type => Positive,
  17. Element_Type => Phone_Entry);
  18. use Entry_Vectors;
  19.  
  20. type Safe_Entry_List is new Controlled with record
  21. List : Entry_Vectors.Vector;
  22. end record;
  23.  
  24. overriding procedure Finalize (Obj : in out Safe_Entry_List) is
  25. begin
  26. Clear (Obj.List);
  27. end Finalize;
  28.  
  29. Phone_Book_Entries : Safe_Entry_List;
  30.  
  31. function Get_Line return Unbounded_String is
  32. Line : String (1 .. 200);
  33. Last : Natural;
  34. begin
  35. Get_Line (Line, Last);
  36. return To_Unbounded_String (Line (1 .. Last));
  37. end Get_Line;
  38.  
  39. procedure Add_Entry (Name : Unbounded_String; Number : Phone_Number) is
  40. begin
  41. Append (Phone_Book_Entries.List,
  42. Phone_Entry'(Name => Name, Number => Number));
  43. end Add_Entry;
  44.  
  45. procedure Show_All is
  46. begin
  47. Put_Line ("--- Phone Book ---");
  48. for C of Phone_Book_Entries.List loop
  49. Put_Line (To_String (C.Name) & " : " &
  50. Phone_Number'Image (C.Number));
  51. end loop;
  52. end Show_All;
  53.  
  54. begin
  55. Put_Line ("Enter three contacts (name + 10‑digit number).");
  56.  
  57. for I in 1 .. 3 loop
  58. Put ("Name: ");
  59. declare
  60. Name_In : constant Unbounded_String := Get_Line;
  61. Number_Str : String(1..20);
  62. Last : Natural;
  63. begin
  64. Put ("Number (0..9999999999): ");
  65. Get_Line(Number_Str, Last);
  66. declare
  67. Num_In : Phone_Number := Phone_Number'Value(Number_Str(1..Last));
  68. begin
  69. Add_Entry (Name_In, Num_In);
  70. exception
  71. when Constraint_Error =>
  72. Put_Line ("Number out of range – entry skipped.");
  73. end;
  74. end;
  75. end loop;
  76.  
  77. New_Line;
  78. Show_All;
  79. end jdoodle;
  80.  
Success #stdin #stdout 0s 5320KB
stdin
Alex
2020
John
1945
Bridget
1917
stdout
Enter three contacts (name + 10‑digit number).
Name: Number (0..9999999999): Name: Number (0..9999999999): Name: Number (0..9999999999): 
--- Phone Book ---
Alex :  2020
John :  1945
Bridget :  1917