Matematické Fórum

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

#1 25. 01. 2011 13:17

myrek
Příspěvky: 223
Reputace:   
 

pascal morseovka

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

  • (téma jako vyřešené označil(a) gladiator01)

#2 25. 01. 2011 14:08 — Editoval gladiator01 (02. 11. 2012 10:51)

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: pascal morseovka

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.

Code:

//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):

Code:

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

Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson