Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Dobry den,
mam tady ulohu do programovani na dekodovani morseovy abecedy.
napada me toto:
mel bych promennou string a promennou char
na pocatku by vzdy ve stringu nic nebylo postupne bych nacital chary a pridaval ke stringu dokud bych nenactl /
pak bych ale musel string porovnat s celou abecedou tedy if string = .- then write(´a´) else if string=-... then write(´b´) atd
slo by to i jinak nebo je to moje korektni?
dekuji za odpovedi.
Offline

Uděláš si dvě pole - v jednom bude latinka a ve druhém morseovka -
1. budeš procházet řetězec znak po znaku dokud nenarazíš na / - když budou // vytiskneš mezeru
3. Podřetěz si uložíš do pomocné proměnné
2. příslušný podřetěz vždycky vyhledáš v poli s morseovkou (porovnáš ten znak s polem)
3. vytiskneš (nebo někam uložíš) znak z druhého pole (s latinkou), který je na stejné pozici
kód v javascriptu - převod z latinky do morseovky - ty to budeš dělat naopak.
//převod do morseovky
function preved(form) {
znaky =
["0","1","2","3","4","5","6","7","8","9",
"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",
"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",
".",",","?",":",";","-","!","/"];
morseovka =
["-----",".----","..---","...--","....-", ".....","-....","--...","---..","----.",
".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",
".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",
"/","--..--","/","---...","-.-.-.", "-....-","/","-..-."];
var vstup = form.vstup.value;
var vystup = "";
form.vystup.value = vystup;
for(poradi = 0; poradi < vstup.length; poradi++)
{
znak = vstup.charAt(poradi); //charAt vrátí entý znak počítáno od nuly
for (i = 0; i < znaky.length; i++)
{
if (znak == znaky[i])
{
vystup += morseovka[i] + "/"; break;
}
else if (znak == " " || znak == "_")
{
vystup += "/"; break;
}
}
}
form.vystup.value = vystup;
}Dešifrování v c++ builder (winapi):
vector<int> delkaZ; //delka znaku v morseovce
vector<int> pozice; //pozice lomítek ve zdrojovém textu
vector<int> text; //zdrojový text
//proměnná inkrementující se při nalezení lomítka a zápisu do vectoru pozice
//(počet lomítek (resp. celých znaků v morseovce v zdrojovém textu)
int poz;
UnicodeString znaky[] = {
"", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "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", "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", ".", ",", "?", ":", ";", "-", "!", "/"};
UnicodeString morseovka[] = {
"", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...",
"---..", "----.", ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
"..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.",
"...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".-", "-...",
"-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..",
"--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--",
"-..-", "-.--", "--..", "/", "--..--", "/", "---...", "-.-.-.", "-....-",
"/", "-..-."};
char *vzor = "/";
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
// alokace minimálního místa pro vektory (zatím neznáme délku textu)
pozice.resize(1);
delkaZ.resize(1);
text.resize(1);
}
// ---------------------------------------------------------------------------
// alokace místa pro vektory pri zmene zdrojoveho textu
void TForm1::alocateVectors() {
try {
pozice.resize(4*Form1->Zdroj->Text.Length() + 1);
delkaZ.resize(4*Form1->Zdroj->Text.Length() + 1);
text.resize(Form1->Zdroj->Text.Length() + 1);
} // přetečení
catch (ERangeError &e) {
ShowMessage("Text je příliš dlouhý!");
}
}
// odstranění diakritiky
UnicodeString zOstatni =
";\n\r !,¨´~`@#$%^&*()_=+\\|{[}]\"'<>§()ˇ°0123456789abcdefghijklmnopqrstuvwxyzáäčďéěíĺľňóôőöŕšťúůűüýřž";
void TForm1::odstranNeznameZnaky() {
UnicodeString znakd, vstupSdiak;
vstupSdiak = Form1->Zdroj->Text.LowerCase();
for (int a = 1; a <= vstupSdiak.Length(); a++) {
if (zOstatni.Pos(vstupSdiak.SubString(a, 1)) > 0) {
znakd += "";
}
else if (zOstatni.Pos(vstupSdiak.SubString(a, 1)) == 0) {
znakd += vstupSdiak.SubString(a, 1);
}
}
Form1->Zdroj->Text = znakd;
}
/* !
nalezení všech lomítek a zjištějní délky jednotlivých řetězců
Karp-Rabinův algoritmus hledání podřetězce v textu
*/
void TForm1::hledejLomitka(UnicodeString text2) {
const int z = 131; // lze pouzit libovolne velke prvocislo
// i,j,k - proměnné pro cykly, souhlas - lomitko nalezeno,
int i, j, k, souhlas;
//
unsigned long hv, ht, mz;
// uložíme nulu na první pozici, abychom mohli zjistit délku prvního znaku
pozice[0] = 0;
poz = 0;
mz = 1;
hv = 0;
ht = 0;
// zdrojový text zkopírume do vectoru text pro jednoduší manipulaci
for (int p = 1; p <= text2.Length(); p++) {
text[p - 1] = text2[p];
}
// delka vzorku, textu
int m = strlen(vzor), n = text.size();
// priprava
for (j = 0; j < m; j++) {
mz = mz * z;
hv = hv * z + vzor[j];
ht = ht * z + text[j];
}
// vlastni hledani
j = m - 1;
while (j < n) {
if (hv == ht) {
souhlas = 1;
for (i = j, k = m - 1; k >= 0; k--, i--) {
if (vzor[k] != text[i])
souhlas = 0;
}
if (souhlas == 1) {
poz++;
}
}
if (poz > 0) {
pozice[poz] = i + 2; // pozice lomitek ulozime do pole pozice
}
j++;
ht = ht * z - text[j - m] * mz + text[j];
}
for (int p = 0; p < poz; p++) {
delkaZ[p] = (pozice[p + 1] - pozice[p]); // vypocitame delku znaku
}
delkaZ[poz] = 0; // delka posledniho znaku (/) je nula
}
/**
Sifrovani textu
Text rozparsujeme na znaky (retezce mezi lomitky) a ty porovname s polem
morseovka. Pri shode vypiseme prislusny znak s pole znaky.
*/
void TForm1::sifruj() {
int delka = 0;
UnicodeString vstup, znak;
UnicodeString vystup = "";
int delkaZnaky = sizeof(znaky) / sizeof(UnicodeString); // delka pole znaky
odstranNeznameZnaky(); // odstranit nepovolene znaky
vstup = Form1->Zdroj->Text; // zdrojový text z textového pole Zdroj
hledejLomitka(vstup); // vyhledani lomitek
for (int zP = 0; zP <= poz; zP++) {
// zdrojový text parsujeme na jednotlivé řetězce mezi lomítky
if (zP == 0) {
znak = vstup.SubString(pozice[zP], delkaZ[zP] - 1);
}
else {
if ((delkaZ[zP] - 1) != 0)
znak = vstup.SubString(pozice[zP] + 1, delkaZ[zP] - 1);
}
// porovnáme z polem morseovka a uložíme pro zobrazení na výstupu
for (int i = 0; i < delkaZnaky; i++) {
if (znak == morseovka[i]) {
vystup += znaky[i];
break;
}//dve lomitka = mezera
if (delkaZ[zP] == 1 && delkaZ[zP + 1] != 1) {
vystup += " ";
break;
}//tri lomitka = tecka
if (delkaZ[zP] == 1 && delkaZ[zP + 1] == 1) {
vystup += ".";
break;
}
}
}
// zobrazení cílového textu v textovém poli Cil
Form1->Cil->Text = vystup;
}
// ---------------------------------------------------------------------------
/**
OnClick tlacitka DesifrujMorseovku
Provede se zasifrování
*/
void __fastcall TForm1::DesifrujMorseovkuClick(TObject *Sender) {
sifruj();
}
// ---------------------------------------------------------------------------
/**
Pri zmene delky textu se realokuji prislusne vektory, aby nedoslo k preteceni
*/
void __fastcall TForm1::ZdrojChange(TObject *Sender)
{ // realokace dostatečného místa pro vektory (známe délku textu)
alocateVectors();
}
// ---------------------------------------------------------------------------Offline