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