Kody znaków o zmiennej długości- alfabet Morse'a
Poniższy materiał dotyczy zakodowania alfabetu łacińskiego alfabetem (ciągiem znaków kropka- kreska) Morse'a. Utworzona aplikacja przedstawi ciąg zakodowanego tekstu znakami kodu Morse'a z dodatkiem efektu dźwiękowego w postaci uruchamiania standardowego głośnika wbudowanego w komputerze.
Reguła dźwiękowa alfabetu Morse'a
- jedna kreska trwa tyle, co dwie kropki
- odstęp pomiędzy elementami znaku trwa jedną kropkę
- odstęp pomiędzy poszczególnymi znakami trwa trzy kropki
- odstęp pomiędzy grupami znaków (słowami) to trzy kreski
Działanie algorytmu jest stosunkowo proste. Kolejne znaki alfabetu łacińskiego wraz z ich odpowiednikiem znaków kodu Morse'a przechowywane są w tablicy dwuwymiarowa. Pierwszy element to znak łaciński, drugi to zestaw kodu kropek i kresek. Na przykład
{"A",".-"},{"B","-..."}, itd.Program w pętli przegląda znak po znaku tekstu przeznaczonego do zakodowania. Następnie w drugiej pętli wewnętrznej odszukuje w tablicy znaków przypisany kod Morse'a. Wypisuje na ekranie zestaw kropek i kresek oraz wydaje odpowiednie dźwięki.
Instrukcja wydająca dźwięk
Z poziomu kodu aplikacji desktopowej można wywołać dźwięk o zadanej częstotliwości i czasie trwania używając funkcji dwuargumentowej Beep(int arg1, int arg2) klasy Console. Możesz to sprawdzić podpinając w zdarzeniu Click kontrolki Button poniższy kod
Wskazówka:
private void button1_Click(object sender, EventArgs e)
{
//kreska trwa tyle co dwie kropki
//odstep pomiedzy elementami znaku trwa tyle co jedna kropka
//odstep pomiedzy kolejnymi znakami trwa tyle co trzy kropki
Console.Beep(1000, 200);
Thread.Sleep(400);
Console.Beep(1000, 600);
}
Instrukcja Thread.Sleep(400); wywołuje wątek bezczynności na czas podany w milisekundach
Tablica zestawu znaków alfabetu Morse'a
Wskazówka:
String[,] alfabet = new String[60, 2]
{
{"A",".-"},{"B","-..."},{"C","-.-."},{"D","-.."},{"E","."},
{"F","..-."},{"G","--."},{"H","...."},{"I",".."},{"J",".---"},
{"K","-.-"},{"L",".-.."},{"M","--"},{"N","-."},{"O","---"},
{"P",".--."},{"Q","--.-"},{"R",".-."},{"S","..."},{"T","-"},
{"U","..-"},{"V","...-"},{"W",".--"},{"X","-..-"},{"Y","-.--"},
{"Z","--.."},{"Ą",".-.-"},{"Ć",".-..."},{"Ę","..-.."},{"Ł",".-..-"},
{"Ń","--.--"},{"Ó","---."},{"Ś","...-..."},{"Ź","--..-."},{"Ż","--..-"},
{"1",".----"},{"2","..---"},{"3","...--"},{"4","....-"},{"5","....."},
{"6","-...."},{"7","--..."},{"8","---.."},{"9","----."},{"0","-----"},
{".",".-.-.-"},{",","--..--"},{"'",".----."},{"\"",".-..-."},{"+","..--.-"},
{":","---..."},{";","-.-.-."},{"?","..--.."},{"!","-.-.--"},{"-","-....-"},
{"+",".-.-."},{"/","-..-."},{"(","-.--."},{")","-.--.-"},{"=","-...-"}
};
Funkcja imitująca dźwięk nadawania morse'm
Kod proponowanej funkcji bezparametrowaje wydającej sygnał dźwiękowy zapisany jest poniżej
Wskazówka:
void znakDzwiek(String tekst,int f, int t)
{
//f to czestotliwosc
//t to czas trwania kropki
//kreska trwa tyle co dwie kropki
//odstep pomiedzy elementami znaku trwa tyle co jedna kropka
//odstep pomiedzy kolejnymi znakami trwa tyle co trzy kropki
for(int i = 0; i < tekst.Length; i++)
{
switch (tekst[i])
{
case '.': Console.Beep(f, t);break;
case '-': Console.Beep(f, 3*t); break;
}
}
//skonczył sie znak morse'a to milcz tyle ile trwa kropka
Thread.Sleep(t);
}
W rozwiązaniu przyjęto, że funkcja ta jest o trzech argumentach. Pierwszy argument to tekst- zestaw ciągu kropek i kresek przypisany do danego znaku alfabetu łacińskiego. Drugi argument to częstotliwość dźwięku. Trzeci argument to czas trwania dźwięku kropki podany w milisekundach. W kodzie programu częstotliwość i czas trwania dźwięku kropki zapisany jest w stałych typu całkowitego
Wskazówka:
public partial class Form1 : Form
{
//ustawienie częstotliwości dźwięku i czasu trwania kropki
const int _f = 1000, _t = 200;
Schemat algorytmu kodowania alfabetem Morse'a
Przykładowy kod programu zapisany w języku C# wywołany w zdarzeniu Click kontrolki Button. Uwaga: Tekst do zakodowania pobierany jest z kontrolki TextBox, a po zakodowaniu wysyłany jest do kolejnej kontrolki TextBox
Wskazówka:
private void button2_Click(object sender, EventArgs e)
{
textBox2.Clear();
for (int i = 0; i < textBox1.Text.Length; i++)
{
//pusty znak kodu morsea
String kodMorsea = "";
//szukaj znaku
for (int j = 0; j < 60; j++)
{
if (textBox1.Text.Substring(i, 1).ToUpper() == alfabet[j, 0])
{
kodMorsea = alfabet[j, 1];
//pokaz zakodowany znak
textBox2.AppendText(kodMorsea + " ");
//daj dzwiek
znakDzwiek(kodMorsea, _f, _t);
break;
}
else
if (textBox1.Text.Substring(i, 1).ToUpper() == " ")
{
//wpisz znak separatora końca słowa
textBox2.AppendText("|");
Thread.Sleep(3 * _t);
break;
}
}
}
}
Odkodowanie tekstu zapisanego alfabetem Morse'a
Instrukcja dekodująca znaki alfabetu Morse'a działa na tych samych zasadach co kodująca. Wykorzystywana jest ta sam tablica dwuwymiarowa. Z tą różnica, że do porównania brany jest element drugi, a wypisywany jest element pierwszy.
Wskazówka:
private void button3_Click(object sender, EventArgs e)
{
String znak = "";
//odkoduj tekst alabetu Morse'a z kontrolki textBox2
//odkodowany tekst wpisz do textBox3
textBox3.Clear();
for (int i = 0; i < textBox2.Text.Length; i++)
{
if(textBox2.Text.Substring(i,1)!=" "
&& textBox2.Text.Substring(i, 1) != "|")
znak += textBox2.Text.Substring(i, 1);
//szukaj odpowiednika litery
else for (int j = 0; j < 60; j++)
if (znak == alfabet[j, 1])
{
textBox3.AppendText(alfabet[j, 0]);
znak = "";
break;
}
//wstaw spację gdy trafisz na przyjęty znak separatora wyrazów
if(textBox2.Text.Substring(i, 1)== "|")
textBox3.AppendText(" ");
}
}
Przykładowa aplikacja desktopowa wykorzystująca algorytm kodowania alfabetem Morse'a
Pełny kod klasy Form dla formatki utworzonej aplikacji
Form1.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;
namespace _25AlgAlfabetMorsa
{
public partial class Form1 : Form
{
//ustawienie częstotliwości dźwięku i czasu trwania kropki
const int _f = 1000, _t = 200;
String[,] alfabet = new String[60, 2]
{
{"A",".-"},{"B","-..."},{"C","-.-."},{"D","-.."},{"E","."},
{"F","..-."},{"G","--."},{"H","...."},{"I",".."},{"J",".---"},
{"K","-.-"},{"L",".-.."},{"M","--"},{"N","-."},{"O","---"},
{"P",".--."},{"Q","--.-"},{"R",".-."},{"S","..."},{"T","-"},
{"U","..-"},{"V","...-"},{"W",".--"},{"X","-..-"},{"Y","-.--"},
{"Z","--.."},{"Ą",".-.-"},{"Ć",".-..."},{"Ę","..-.."},{"Ł",".-..-"},
{"Ń","--.--"},{"Ó","---."},{"Ś","...-..."},{"Ź","--..-."},{"Ż","--..-"},
{"1",".----"},{"2","..---"},{"3","...--"},{"4","....-"},{"5","....."},
{"6","-...."},{"7","--..."},{"8","---.."},{"9","----."},{"0","-----"},
{".",".-.-.-"},{",","--..--"},{"'",".----."},{"\"",".-..-."},{"+","..--.-"},
{":","---..."},{";","-.-.-."},{"?","..--.."},{"!","-.-.--"},{"-","-....-"},
{"+",".-.-."},{"/","-..-."},{"(","-.--."},{")","-.--.-"},{"=","-...-"}
};
public Form1()
{
InitializeComponent();
}
void znakDzwiek(String tekst,int f, int t)
{
//f to czestotliwosc
//t to czas trwania kropki
//kreska trwa tyle co dwie kropki
//odstep pomiedzy elementami znaku trwa tyle co jedna kropka
//odstep pomiedzy kolejnymi znakami trwa tyle co trzy kropki
for(int i = 0; i < tekst.Length; i++)
{
switch (tekst[i])
{
case '.': Console.Beep(f, t);break;
case '-': Console.Beep(f, 3*t); break;
}
}
//skonczył sie znak morse'a to milcz tyle ile trwa kropka
Thread.Sleep(t);
}
private void button1_Click(object sender, EventArgs e)
{
//kreska trwa tyle co dwie kropki
//odstep pomiedzy elementami znaku trwa tyle co jedna kropka
//odstep pomiedzy kolejnymi znakami trwa tyle co trzy kropki
Console.Beep(1000, 200);
Thread.Sleep(400);
Console.Beep(1000, 600);
}
private void button2_Click(object sender, EventArgs e)
{
textBox2.Clear();
for (int i = 0; i < textBox1.Text.Length; i++)
{
//pusty znak kodu morsea
String kodMorsea = "";
//szukaj znaku
for (int j = 0; j < 60; j++)
{
if (textBox1.Text.Substring(i, 1).ToUpper() == alfabet[j, 0])
{
kodMorsea = alfabet[j, 1];
//pokaz zakodowany znak
textBox2.AppendText(kodMorsea + " ");
//daj dzwiek
znakDzwiek(kodMorsea, _f, _t);
break;
}
else
if (textBox1.Text.Substring(i, 1).ToUpper() == " ")
{
//wpisz znak separatora końca słowa
textBox2.AppendText("|");
Thread.Sleep(3 * _t);
break;
}
}
}
}
private void button3_Click(object sender, EventArgs e)
{
String znak = "";
//odkoduj tekst alabetu Morse'a z kontrolki textBox2
//odkodowany tekst wpisz do textBox3
textBox3.Clear();
for (int i = 0; i < textBox2.Text.Length; i++)
{
if(textBox2.Text.Substring(i,1)!=" "
&& textBox2.Text.Substring(i, 1) != "|")
znak += textBox2.Text.Substring(i, 1);
//szukaj odpowiednika litery
else for (int j = 0; j < 60; j++)
if (znak == alfabet[j, 1])
{
textBox3.AppendText(alfabet[j, 0]);
znak = "";
break;
}
//wstaw spację gdy trafisz na przyjęty znak separatora wyrazów
if(textBox2.Text.Substring(i, 1)== "|")
textBox3.AppendText(" ");
}
}
}
}