1

getの後に入力が残っていると思うので、キーボードバッファをクリアする関数を作成しましたが、入力を永久に取得しているだけです。

これがget(String(1..10)です

--getString10--
procedure getString10(s : in out string10) is
   Last: Integer;
begin
   s := (others => ' ');
   Get_Line(S, Last);
end getString10;

これが私が作成したフラッシュです。キーボードバッファのクリアに関するウィキからほとんどコピーされています。

--flush--
procedure flush is
   char : character;
   more : boolean;
begin
   loop
      get_immediate(char, more);
      exit when not more;
   end loop;
end flush;      

フラッシュが呼び出されるたびに、プログラムを終了するまで、入力した内容が画面に出力されます。

また、私のgetString10関数は、常にユーザー入力を待機するとは限りません。たとえば、私が持っている場合

put("Enter a name: ");
getString10(name);
put("Enter a number: ");
getString10(number);

出力は次のようになります

Enter a name: Enter a number: exampleinput

GnatProgrammingStudioでAda2005を使用しています。

メイン全体で更新:

with Ada.Text_IO, Ada.Integer_Text_IO, BinarySearchTree;
use Ada.Text_IO, Ada.Integer_Text_IO;

procedure lab4 is

   subtype String10 is String(1..10);

   -- function "<"--
   function "<"(TheKey: in String10; ARecord: in String10) return Boolean is
   begin
      for i in integer range 1..10 loop
         if TheKey(i) <= ARecord(i) then
            return true;
         else
            return false;
         end if;
              end loop;

      return false;

   end "<";

   -- function ">"--
   function ">"(TheKey: in String10; ARecord: in String10) return Boolean is
   begin
      for i in integer range 1..10 loop
         if TheKey(i) >= ARecord(i) then
            return true;
         else
            return false;
         end if;
      end loop;

      return false;
   end ">";

   -- function "="--
   function "="(TheKey: in String10; ARecord: in String10) return Boolean is
   begin
      for i in integer range 1..10 loop
         if TheKey(i) /= ARecord(i) then
            return false;
             end if;
      end loop;

      return true;
   end "=";

   --getString10--
   procedure getString10(s : in out string10) is
      Last: Integer;
   begin
          s := (others => ' ');
      Get_Line(S, Last);
   end getString10;

   --flush--
   procedure flush is
      char : character;
      more : boolean;
   begin
      loop
         get_immediate(char, more);
         exit when not more;
      end loop;
   end flush;      

   package BST is new BinarySearchTree(String10, String10, "<", ">", "=");

   Root, found : BST.BinarySearchTreePoint;
   choice : integer;
   nameTemp, phoneTemp : String10;
begin
   BST.setRoot(Root);

   loop
      new_line;
      put_line("Options:");
      put_line("1 - Insert a record");
      put_line("2 - Find a person iteratively and print their phone number");
      put_line("3 - Find a person recursively and print their phone number");
      put_line("4 - Traverse the tree from a person to a person");
      put_line("0 - Quit program");
      put("Choose an option: ");
      get(choice); put(choice, 0); new_line;

      case choice is
         --case 1
         when 1 =>
            put("Enter the name: ");
            get(nameTemp); put(nameTemp); new_line;

            put("Enter the phone number : ");
            get(phoneTemp); put(phoneTemp); new_line;

            BST.InsertBinarySearchTree(root, nameTemp, phoneTemp);
         --case 2
         when 2 =>
            put("Enter the name of the person to find: ");
            get(nameTemp); put(nameTemp);
            BST.FindCustomerIterative(root, nameTemp, found);

            if BST.isNull(found) then
               new_line;
               put("Customer not found!");
            else
               new_line;
               put("The phone number is: ");
               put(BST.CustomerPhone(found));
            end if;
         --case 3
         when 3 =>
            put("Enter the name of the person to find: ");
            get(nameTemp); put(nameTemp);
            BST.FindCustomerRecursive(root, nameTemp, found);

            if BST.isNull(found) then
               new_line;
               put_line("Customer not found!");
            else
               new_line;
               put("The phone number is: ");
               put(BST.CustomerPhone(found));
            end if;
            new_line;

         --case 4
         when 4 =>
            put("Enter of the name of the person to start traversal at: ");
            get(nameTemp); put(nameTemp);
            BST.FindCustomerRecursive(root, nameTemp, found);

            put("Enter then name of the person to stop traversal at: ");
            get(phoneTemp); put(phoneTemp); --using phoneTemp for a name here

            BST.FindCustomerRecursive(Root, nameTemp, found);
            while BST.isNull(found) /= true loop
               put_line("Name = " & BST.CustomerName(found));
               BST.setNode(found, BST.InOrderSuccessor(found));
            end loop;

         --case 0
         when 0 =>
            exit;
         --others
         when others =>
            put_line("Invalid choice!"); new_line;
      end case;

   end loop;

end lab4;

スレッド化された二分探索木をデバッグしようとしているため、すべてのgetString10()をget()に切り替えました。私は入力ファイルを使用しているので、今のところは問題ありません。他の方法が機能しない理由を理解することができます。nameTempおよびphoneTempのすべてのget呼び出しは、getString10()呼び出しである必要があります。

4

1 に答える 1

1

キーボード バッファを自動的にクリアする get_line() 関数を使用できます。

with ADA.TEXT_IO;                use ADA.TEXT_IO;
with ADA.TEXT_IO.UNBOUNDED_IO;   use ADA.TEXT_IO.UNBOUNDED_IO;
with ADA.STRINGS.UNBOUNDED;      use ADA.STRINGS.UNBOUNDED;

procedure MAIN is

   type STRING_10 is new STRING(1..10);

   procedure GET_STRING_10(S : in out STRING_10) is
      BUF   :  UNBOUNDED_STRING;
   begin
      BUF := GET_LINE;

      for I in STRING_10'range loop
         if I <= LENGTH(BUF) then
            S(I) := ELEMENT(BUF, I);
         else
            S(I) := ' ';
         end if;
      end loop;
   end GET_STRING_10;

   S : STRING_10;

begin

   GET_STRING_10(S);
   PUT_LINE(STRING(S));

end MAIN;

メイン全体を読んだ後に編集: SKIP_LINE;afterを挿入する必要がありGET(CHOICE);ます。次に、さまざまなケースでeveryGETを aに置き換えることができます。GETSTRING10

一般に、get の後には常に skip_line が続く必要があります。get_line でこれを行う必要はないため、getstring10 プロシージャを変更する必要はありません。

于 2012-12-07T08:43:50.383 に答える