Pokaż wyniki 1 do 3 z 3

Temat: Dekoder alfabetu Morse'a

  1. #1

    Domyślnie Dekoder alfabetu Morse'a

    O ile poradziłem sobie z zakodowywaniem alfabetu Morse'a to mam problem z napisaniem skryptu który by go odkodowywał
    Tak zamieniam tekst na alfabet Morse'a
    <SCRIPT LANGUAGE="JAVASCRIPT">
    <!--


    var charCodes=new Array(36); charCodes["a"]=".-.";
    charCodes["b"]="--.";
    //itd,,,
    var temp=''

    function encode() {
    document.morsecode.codebox.value="";
    temp=''
    var chars=document.morsecode.chars.value.split("");

    for (a=0; a<chars.length; a++) {
    if (chars[a]!=" ") {
    if (window.charCodes[chars[a]]) {
    document.morsecode.codebox.value+=charCodes[chars[a]]+"";
    temp+=chars[a]+"="+charCodes[chars[a]]+"\n";
    }
    else
    temp+=chars[a]+"=(None)\n";
    }
    else temp+="\n";
    }
    }
    // -->
    </SCRIPT>

    <FORM NAME="morsecode">
    <INPUT TYPE="TEXT" NAME="chars" size="28" value="Tutaj wpisz tekst"> <INPUT TYPE="BUTTON" VALUE="Zakoduj" onClick="encode()"><BR><BR>
    <TEXTAREA NAME="codebox" cols="50" rows="11" style="width:70%" wrap="virtual"> </TEXTAREA><br /><INPUT TYPE="BUTTON" VALUE="Kopjuj do schowka" onClick="document.morsecode.codebox.select(); document.execCommand('Copy');">
    </FORM>
    I chciałbym go w podobny sposób odkodować
    np tak
    charCodes[".-."]="a";
    Co mam zmienić w skrypcie żeby wszystko działało , (bo nie działa w ten sposób)
    Z góry dzięki za odpowiedź ,ja już chyba nic nie wymyśle bo siedzę nad tym prawie cały dzień

  2. #2

    Domyślnie

    Jeżeli chcesz użyć drugiej tablicy (bardziej to na hash wygląda) zawierającą jako klucze - kody Morse'a, a jako wartości - litery alfabetu, to wystarczy nieznacznie zmodyfikować Twoją funkcję:
    1. Ponieważ kody Morse'a mają więcej niż 1 znak, funkcja split() musi rozróżniać jeden kod od drugiego. Dlatego trzeba podać jakiś znak, który będzie oddzielać kody (np. spacja). W Twojej funkcji nie było żadnego znaku (łańcuch pusty), więc był rozdzielany każdy znak.
    2. Ponieważ został zmieniony znak rozdzielający w funkcji split(), to trzeba zmienić warunek bo żaden znak z tablicy chars nie będzie zawierał teraz znaku spacji. Nawet jeśli będą dwie spacje obok siebie, to do elementu z tablicy chars zostanie przypisany łańcuch pusty. I właśnie ten łańcuch pusty musi być w warunku. Oto przykładowy kod:

    Kod:
    var charCodes = new Array(36);
    charCodes[".-"] = "a";
    charCodes["-..."] = "b";
    charCodes["-.-."] = "c";
    charCodes["-.."] = "d";
    //itd.
    
    function decode() {
      document.morsecode.codebox.value = "";
      var temp = "";
      var chars = document.morsecode.chars.value.split(" ");
    
      for (a = 0; a < chars.length; a++) {
        if (chars[a] != "") {
          if (window.charCodes[chars[a]]) {
            document.morsecode.codebox.value += charCodes[chars[a]];
            temp += chars[a] + "=" + charCodes[chars[a]] + "\n";
          } else temp += chars[a] + "=(None)\n"; //brak kodu w tablicy
        } else temp += "\n"; //input "chars" zawiera co najmniej dwie spacje obok siebie
      }
    }
    A jeżeli chcemy aby była użyta tylko jedna tablica (ta gdzie klucz stanowi litera alfabetu, a wartość - kod Morse'a), to można tego dokonać lekko modyfikując poprzednią funkcję oraz dodając nową w taki sposób:

    Kod:
    var charCodes = new Array(36);
    charCodes["a"] = ".-";
    charCodes["b"] = "-...";
    charCodes["c"] = "-.-.";
    charCodes["d"] = "-..";
    //itd.
    
    function decode() {
      document.morsecode.codebox.value = "";
      var temp = "";
      var chars = document.morsecode.chars.value.split(" ");
    
      for (a = 0; a < chars.length; a++) {
        if (chars[a]!="") {
          document.morsecode.codebox.value += get_key(chars[a]);
          temp += chars[a] + "=" + get_key(chars[a]) + "\n";
        } else temp += "\n"; //input "chars" zawiera co najmniej dwie spacje obok siebie
      }
    }
    
    function get_key(value) {
      for (var j in charCodes) {
        if (charCodes[j] == value) return j;
      }
      return "(None)"; //brak kodu w tablicy
    }
    Dodatkowa funkcja przeszukuje cały hash i w przypadku znalezienia wartości, zwraca klucz. Gdy nie znajdzie, zostaje zwrócona informacja o braku kodu w tablicy (warunek ten został "przerzucony" z funkcji decode()). Wadą tego rozwiązania jest to, że funkcja przeszukuje cały hash, aż do napotkania odpowiedniego kodu.

  3. #3

    Domyślnie

    Naprawdę wielkie dzięki , ten skrypt to jest część większej całości bez której nie mogłem dalej ruszyć , możesz być pewien że umieszczę cię w credits

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj