2017-02-03 2 views
-2

J'ai posté l'autre jour ici parce que j'étais confus derrière la syntaxe de Fortran et j'ai eu une réponse qui m'a beaucoup aidé. Mais maintenant je suis coincé dans le même cornichon, mais avec Ada cette fois.Conversion en code Morse en Ada

Voici l'essentiel de mon programme. J'essaie de lire une phrase de l'utilisateur et de convertir chaque personnage en code morse.

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

... Et le problème est? – John3136

+2

Vous avez eu un -1 à votre question Fortran parce qu'il n'y avait aucune preuve de recherche de votre côté. Ce n'est pas parce qu'un bon utilisateur a tout arrangé pour vous que cela n'est pas acceptable. Et maintenant tu le fais encore. Regardez les messages d'erreur de votre compilateur, essayez de les corriger (si vous ne pouvez pas les comprendre, utilisez Internet), et * puis *, si vous êtes bloqué sur une certaine erreur, vous pouvez demander à ce sujet sur SO . – flyx

Répondre

0

je ne devrais probablement pas, mais les problèmes ici vont bien au-delà de simples erreurs de syntaxe donc voici quelques conseils à une approche plus semblable à Ada. Les mots en gras méritent d'être lus plus en détail dans un bon livre d'Ada. D'abord, arrêtez de penser à un niveau si bas. Les chaînes sont des tableaux de caractères, et les tableaux dans Ada offrent des fonctionnalités telles que le tableau attributs pour simplifier la programmation - et surtout la maintenance du programme.

Les tableaux sont de longueur fixe lorsque vous les créez, mais cette longueur n'a pas à être déterminée jusque là. Donc, vous pouvez déclarer un tableau et l'initialiser avec un appel de fonction - il prend sa taille à partir du résultat de l'appel de la fonction.

Utilisez cette fonction et supprimez size comme une entité distincte. Lorsque le bloc declare se termine, le tableau est hors champ, il est donc libéré automatiquement et, s'il se trouve dans une boucle, l'appel de fonction peut renvoyer une chaîne de taille différente, de sorte que les limites du tableau peuvent être différentes à chaque fois. problème.

Nous devons faire une boucle sur tous les caractères du tableau, mais nous ne connaissons pas sa taille ... alors demandez-le simplement, par exemple via son attribut range.

Et plutôt que d'écrire chaque test deux fois, utilisez une fonction du package Ada.Characters.Handling pour vous assurer que nous ne traitons que les minuscules.

En outre, si déclarations sont un mauvais choix pour cette tâche, une déclaration cas est plus simple et plus court - je l'ai montré à la fois ci-dessous

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; 

Il y a aussi bondis et sans bornes des chaînes dont vous n'avez pas besoin dans cet exemple simple. Ils sont un peu fastidieux à utiliser parfois, vous avez besoin de conversions de type entre eux et les chaînes simples.

+1

J'envisagerais sérieusement de faire un tableau de chaînes bornées ou non contenant toutes les traductions de code Morse. Ce tableau doit être indexé par la valeur de caractère correspondante afin que la réponse soit une recherche de tableau et non une déclaration de cas très longue. –

+1

Je suis d'accord. J'ai esquissé cela aussi, mais j'ai décidé de ne pas l'ajouter à la réponse. –