2017-02-03 7 views
-2

私はFortranの構文の後ろで混乱していて、多くの助けをした答えを得たので、もう一日ここに投稿しました。しかし、今私は同じ漬け物に詰まっていますが、今回はアダと一緒です。Adaでのモールスコードへの変換

以下は私のプログラムの要点です。私はユーザーから文章を読み込み、その中の各文字をモールス符号に変換しようとしています。

with Ada.Text_IO; 
with Ada.Strings; 
with Ada.Strings.Unbounded; 
with Ada.Strings.Unbounded; 
with Ada.Command_Line; 
use Ada.Text_IO; 

procedure MorseCode is 
    tempSentence : array(1 .. 20) of string; 
    last : Integer; 
    size : Integer; 
    i : Integer; 
begin 

Put("Enter the size of your sentence: "); 
Get(size); 
Put("Enter the sentence you would like to convert to morse code: "); 
Get_Line(tempSentence, last); 
Put_Line(tempSentence); 

While_Loop : 
while i < size loop 

if tempSentence(i .. i) = 'A' or tempSentence(i) = 'a' then 
    Put(".- "); 
elsif tempSentence(i .. i) = 'B' or tempSentence(i) = 'b' then 
    Put("-... "); 
elsif tempSentence(i) = 'C' or tempSentence(i) = 'c' then 
    Put("-.-. "); 
end if; 
end loop While_Loop; 

end; 
+0

...そして問題は? – John3136

+2

あなたの側で研究の証拠がないので、Fortranの質問に-1があります。ちょうど良いユーザーがあなたのためにすべてを修正したからといって、これが受け入れ可能な動作であるとは限りません。そして今、あなたはこれをもう一度やっています。あなたのコンパイラのエラーメッセージを見て、それらを修正しようとします(それらを理解できない場合はインターネットを使用してください)。そして* then *、もし特定のエラーを抱えていたら、SO 。 – flyx

答えて

0

ここでの問題は単純な構文エラーをはるかに超えているので、ここではよりエイダ風のアプローチへのいくつかの指針があります。

大胆な言葉は、良いAdaの本で詳細に読む価値があります。

まず、このような低レベルで考えをやめてください。 文字列は、配列の配列の配列属性のようなAdaの施設では、プログラミングを簡単にするため、特にプログラムのメンテナンスを行います。

アレイは作成時に長さが固定されますが、その長さはそれまでに決定される必要はありません。だから配列を宣言し、それを関数呼び出しで初期化することができます。関数呼び出しの結果からサイズを取得します。

この機能を使用して、別のものとしてsizeを完全に削除します。

宣言ブロックが終了すると、配列はスコープから外れて自動的に解放され、ループ内にあれば関数呼び出しは異なるサイズの文字列を返すことができるため、配列の境界は毎回異なります問題。

配列内のすべての文字をループする必要がありますが、サイズはわかりません。たとえば、の範囲属性などを使用してください。

すべてのテストを2回書くのではなく、Ada.Characters.Handlingパッケージの関数を使用して、小文字しか扱わないようにしてください。

また、 if文は、この作業には適していません、場合文が単純で短い - 私はもあり、両方

with Ada.Text_IO; 
use Ada.Text_IO; 
with Ada.Characters.Handling; 


procedure MorseCode is 

begin 
    Put("Enter the sentence you would like to convert to morse code: "); 

    declare 
     Sentence : String := Get_Line; 
    begin 
     Put_Line(Sentence); 

     for i in Sentence'range loop 

     if Ada.Characters.Handling.To_Lower(Sentence(i)) = 'a' then 
      Put(".- "); 
     -- elsif etc ... not very nice 
     end if; 

     case Ada.Characters.Handling.To_Lower(Sentence(i)) is 
     when 'b' => Put("-..."); 
     when 'c' => Put("-.-."); 
     when others => null; 
     end case; 

     end loop; 
    end; 
end; 

の下に示してきたがを有界と非有界この単純な例では不要な文字列です。彼らは時には少し面倒ですが、あなたはそれらと普通のStringsとの間の型変換が必要です。

+1

私は真剣にすべてのモールスのコードの翻訳を含む有界または無制限の文字列の配列を作ることを検討します。その配列は対応する文字値でインデックスを付けて、応答が配列検索であり、非常に長い文ではないようにする必要があります。 –

+1

私は同意します。私はそれをスケッチしましたが、答えに追加することにしました。 –