2017-04-12 15 views

答えて

3

標準入力から単語を読み込みます。関数として記述されます。 (テストされていません。)

function Next_Word return String is 
    package Latin_1 renames Ada.Characters.Latin_1; 

    subtype Whitespace is Character 
    with Static_Predicate => Whitespace in ' ' | Latin_1.HT; 

    use all type Ada.Strings.Unbounded.Unbounded_String; 

    Word : Ada.Strings.Unbounded.Unbounded_String; 
    Next : Character; 
begin 
    Skip_Leading_Space: 
    loop 
     Ada.Text_IO.Get (Next); 
     exit when not (Next in Whitespace); 
    end loop Skip_Leading_Space; 

    Read_Word: 
    loop 
     Word := Word & Next; 
     Ada.Text_IO.Get (Next); 
     exit when Next in Whitespace; 
    end loop Read_Word; 

    return To_String (Word); 
end Next_Word; 
2
Skip_Leading_Space: 
loop 
    Next := Ada.Text_IO.Get; 
    exit when not Next in Whitespace; 
end loop Skip_Leading_Space; 

Read_Word: 
loop 
    Word := Word & Next; 
    Next := Ada.Text_IO.Get; 
    exit when Next in Whitespace; 
end loop Read_Word; 
+2

ラベルはコードを明確にするためのもので、in、out、outパラメータを使用してプロシージャを作成できます。関数を作成することもできますが、使用するAdaリビジョンによっては、すべての型のパラメータ渡しモードを使用できないことがあります。 –

+1

私は初めに完全な解決策を教えるのはあまりにも先生です。 ;-) –

+2

ソースを読みやすくするために、ラベルを絶対にドロップしません。 –

2

あなたはスキャンするので、それは、この目的のためにエイダ標準ライブラリで提供されたものを使用するのが最善です。 1つの候補はAda.Strings.Fixed.Find_Tokenです。

with Ada.Strings.Fixed, Ada.Strings.Maps.Constants, Ada.Text_IO; 
use Ada.Text_IO, Ada.Strings; 

procedure Read_Word is 
    Text : constant String := Get_Line; 
    First : Positive; 
    Last : Natural; 
    White : Maps.Character_Set := Maps.To_Set (" "); 
begin 
    Fixed.Find_Token 
     (Source => Text, 
     Set => White, 
     Test => outside, 
     First => First, 
     Last => Last); 
    Put_Line ("word is: " & Text (First .. Last) & '.'); 
end Read_Word; 
関連する問題