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

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

Schemat algorytmu kodowania alfabetem Morse?a. Visual studio C#

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

aplikacja desktopowa wykorzystująca algorytm kodowania alfabetem Morse'a. Visual studio C#

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(" ");
            }
        }

    }
}
Alkomat- wirtualny test

Alkomat- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Olinowanie stałe- kalkulator średnic

Olinowanie stałe- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
przepis na gogfry

Przepis na gofry

zobacz
przepis na bitą śmietanę

Przepis na bitą śmietanę

zobacz