2017-02-03 2 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

포트란 질문에 -1이 붙었습니다. 왜냐하면 당신쪽에 대한 연구 증거가 부족했기 때문입니다. 단지 좋은 사용자가 당신을 위해 모든 것을 고쳤다 고해서 이것이 받아 들일만한 행동이라는 것을 의미하지는 않습니다. 그리고 지금 당신은 이것을 다시하고 있습니다. 컴파일러의 오류 메시지를보고 문제를 해결하고 (인터넷을 사용할 수없는 경우) 인터넷을 사용하십시오. * 그리고 * 특정 오류가 발생하면 SO에 대해 물어보십시오 . – flyx

답변

0

여기서는 문제가 단순한 구문 오류를 훨씬 뛰어 넘으므로 여기에 Ada와 유사한 접근 방법에 대한 몇 가지 지침이 있습니다.

굵게 표시된 단어는 좋은 에이다 책에서 더 자세히 읽을 가치가 있습니다.

먼저 낮은 수준에서 생각을 그만 두십시오. 문자열은 배열 문자 배열 배열 속성과 같은 Ada 제공 시설에서 프로그래밍을 단순화하기 위해 - 특히 프로그램 유지 관리가 필요합니다.

배열은 만들 때 길이가 고정되지만 그 길이는 그때까지 결정할 필요가 없습니다. 따라서 을 배열로 선언하고 함수 호출로 초기화 할 수 있습니다. 함수 호출 결과에서 크기를 취합니다.

이 기능을 사용하여 size을 별도로 모두 제거하십시오.

선언 블록이 끝나면 배열은 범위를 벗어나서 자동으로 해제되고 루프에 있으면 함수 호출이 다른 크기의 문자열을 반환하여 배열 경계가 매번 달라질 수 있습니다. 문제.

배열의 모든 문자를 반복해야하지만 크기는 알지 못합니다. 예를 들어 범위 속성을 통해 입력하십시오.

모든 테스트를 두 번 작성하는 대신 Ada.Characters.Handling패키지의 함수를 사용하여 소문자 만 처리하도록하십시오.

또한, 경우 문은이 작업에 대한 잘못 선택하는 경우 문이 간단하고 짧은입니다 - 나는 보여준 두

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; 

이하도 이 경계하는억제 할 수없는이 간단한 예제에서는 필요없는 문자열입니다. 그들은 때로는 사용하기에는 지루하고, 그들과 평범한 문자열 사이에서 타입 변환이 필요합니다.

+1

나는 모든 모스 코드 번역을 담고있는 묶여 있거나 묶이지 않은 문자열의 배열을 진지하게 고려할 것이다. 해당 배열은 해당 문자 값에 의해 색인화되어야하므로 응답은 배열 조회이며 매우 긴 경우는 아닙니다. –

+1

동의합니다. 나는 그것을 밖으로 스케치했지만 대답에 추가하는 것에 반대했다. –