2017-02-03 6 views
-2

Я отправил на днях сюда, потому что я был смущен за синтаксисом Фортрана и получил ответ, который помог многим. Но теперь я застрял в том же рассоле, но с Адой на этот раз.Преобразование в код Морзе в Аде

Ниже приведена суть моей программы. Я пытаюсь прочитать предложение от пользователя и преобразовать каждый символ в него в код Морзе.

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 для вашего вопроса Fortran, потому что у него не было никаких доказательств исследований на вашей стороне. Просто потому, что какой-то хороший пользователь исправил все для вас, это не значит, что это приемлемое поведение. И теперь вы делаете это снова. Посмотрите на сообщения об ошибках своего компилятора, попытайтесь их исправить (если вы не можете их понять, используйте Интернет) и * then *, если вы застряли на определенной ошибке, вы можете спросить об этом на SO , – flyx

ответ

0

я, наверное, не стоит, но проблемы здесь выходят далеко за пределы простых ошибок синтаксиса, так вот несколько указателей на более 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

Согласен. Я тоже набросал это, но решил не добавлять его к ответу. –