Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Pouze tento týden sleva až 80 % na e-learning týkající se C a C++. Zároveň využij akce až 80 % zdarma při nákupu e-learningu - více informací.
c week

Lekce 11 - Textové řetězce v C# do třetice - Split a Join

V předešlém cvičení, Řešené úlohy k 10. lekci C# .NET, jsme si procvičili nabyté zkušenosti z předchozích lekcí.

Dnes si vysvětlíme další metody na řetězci, které jsem vám záměrně zatajil, protože jsme nevěděli, že string je vlastně pole :)

Na řetězci můžeme používat mnoho metod, které známe z pole. Jsou to např: First(), Last(), IndexOf() a další.

Když si vytvoříme libovolnou proměnnou a napíšeme za ni tečku, Visual Studio nám zobrazí nabídku všech metod a vlastností (a také proměnných, ale k tomu se dostaneme až u objektů), které na ni můžeme volat. Tomuto nástroji se říká IntelliSense a zpříjemní nám práci s kódem, který za nás doplňuje. Zkusme si to:

Metody na textovém řetězci string ve Visual Studio

Tu samou nabídku lze vyvolat také stiskem Ctrl + Mezerník v případě, že textový kurzor umístíme na tečku. Samozřejmě to platí pro všechny proměnné i třídy a budeme toho využívat stále častěji. Metody jsou řazené abecedně a můžeme jimi listovat pomocí kurzorových šipek. VS nám zobrazuje popis metod (co dělají) a jaké vyžadují parametry.

Řekněme si o následucících metodách a ukažme si je na jednoduchých příkladech:

Další metody na řetězci

Insert()

Vloží podřetězec do řetězce na určitou pozici. Parametry jsou pozice v řetězci a podřetězec.

Console.WriteLine("Punk's dead".Insert(7, "not "));

Výstup:

Konzolová aplikace
Punk's not dead

Remove()

Vymaže znaky od dané pozice do konce. Parametrem je číselná pozice. Můžeme zadat druhý parametr, kterým je počet znaků, které chceme vymazat.

Console.WriteLine("Michael Jackson".Remove(7, 5));

Výstup:

Konzolová aplikace
Michaelson

Substring()

Vrátí podřetězec od dané pozice do konce řetězce. Můžeme zadat druhý parametr, kterým je délka podřetězce.

Console.WriteLine("Wolfgang Amadeus Mozart".Substring(9, 7));

Výstup:

Konzolová aplikace
Amadeus

CompareTo()

Umožňuje porovnat dva řetězce podle abecedy. Vrací -1 pokud je první řetězec před řetězcem v parametru, 0 pokud jsou stejné a 1 pokud je za ním:

Console.WriteLine("Argentina".CompareTo("Barbados"));
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Výstup:

Konzolová aplikace
-1

Pojďme se nyní podívat na 2 další metody na stringu, které jsou opravdu velmi užitečné.

Split() a Join()

Z předchozího tutoriálu víme, že parsování řetězce po znaku může být někdy docela složité a to jsme dělali poměrně jednoduchý příklad. S řetězci se samozřejmě budeme setkávat stále, a to jak na vstupu od uživatele (např. z konzole nebo z polí v okenních aplikacích), tak v souborech TXT a XML. Velmi často máme zadán jeden delší string (řádek souboru nebo řádek konzole), ve kterém je více hodnot, oddělených tzv. separátory, např. čárkou. V tomto případě hovoříme o formátu CSV (Comma-Separated Values, tedy hodnoty oddělené čárkou). Abychom si byli jisti, že víme, o čem hovoříme, ukažme si nějaké ukázkové řetězce:

Jan,Novák,Dlouhá 10,Praha 3,130 00
.. ... .-.. .- -. -.. ... --- ..-. -
(1,2,3;4,5,6;7,8,9)
  • První řetězec je očividně nějaký uživatel, takto bychom mohli např. realizovat uložení uživatelů do CSV souboru, každý na jeden řádek.
  • Druhý řetězec jsou znaky Morseovy abecedy, separátor (oddělovač) je zde mezera.
  • Třetí řetězec je matice o 3 sloupcích a 3 řádcích. Oddělovač sloupců je čárka, řádků středník.

Na stringu můžeme volat metodu Split(), která bere jako parametr separátor (typu char), případně dokonce pole separátorů. Následně původní řetězec rozdělí podle separátorů na pole podřetězců, které vrátí. To nám velmi ulehčí práci při rozdělování hodnot v řetězci.

Metoda Join() se volá přímo na typu string a umožňuje nám naopak pole podřetězců spojit oddělovačem do jediného řetězce, parametry jsou oddělovač a pole. Výstupem metody je výsledný řetězec.

Jelikož neumíme tvořit objekty (uživatele) a ani pracovat s vícerozměrnými poli (matice), zkusíme si naprogramovat dekodér zpráv z Morseovy abecedy.

Dekodér Morseovy abecedy

Pojďme si opět připravit strukturu programu. Budeme potřebovat 2 řetězce se zprávou, jeden se zprávou v Morseově abecedě, druhý zatím prázdný, do kterého budeme ukládat výsledek našeho snažení. Dále budeme jako v případě samohlásek potřebovat nějaký vzor písmen. K písmenům samozřejmě vzor jejich znaku v morzeovce. Písmena můžeme opět uložit do pouhého stringu, protože mají jen jeden znak. Znaky Morseovy abecedy mají již znaků více, ty musíme dát do pole.

Struktura našeho programu by nyní mohla vypadat následovně:

// řetězec, který chceme dekódovat
string s = ".-.. . --- -. .- .-. -.. ---";
Console.WriteLine("Původní zpráva: {0}", s);
// řetězec s dekódovanou zprávou
string zprava = "";

// vzorová pole
string abecedniZnaky = "abcdefghijklmnopqrstuvwxyz";
string[] morseovyZnaky = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
"..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
"...-", ".--", "-..-", "-.--", "--.."};

Můžete si potom přidat další znaky jako čísla a interpunkční znaménka, my je zde vynecháme.

Rozdělení řetězce na pole metodou Split()

Nyní si řetězec s rozbijeme metodou Split() na pole podřetězců, obsahujících jednotlivé znaky morzeovky. Splitovat budeme podle znaku mezery. Pole následně proiterujeme cyklem foreach:

// rozbití řetězce na znaky morzeovky
string[] znaky = s.Split(' ');

// iterace znaky morzeovky
foreach (string morseuvZnak in znaky)
{

}

Nalezení odpovídajícího písmena

V cyklu se pokusíme najít aktuálně čtený znak morzeovky v poli morseovyZnaky. Bude nás zajímat jeho index, protože když se podíváme na ten samý index v poli abecedniZnaky, bude tam odpovídající písmeno. To je samozřejmě z toho důvodu, že jak pole tak řetězec obsahují stejné znaky, seřazené dle abecedy. Umístěme do těla cyklu následující kód:

char abecedniZnak = '?';
int index = Array.IndexOf(morseovyZnaky, morseuvZnak);
if (index >= 0) // znak nalezen
    abecedniZnak = abecedniZnaky[index];
zprava += abecedniZnak;

Kód nejprve do abecedního znaku uloží '?', protože se může stát, že znak v naší sadě nemáme. Následně se pokusíme zjistit jeho index. Pokud se to podaří, dosadíme do abecedniZnak znak z abecedních znaků pod tímto indexem. Nakonec znak připojíme ke zprávě. Operátor += nahrazuje zprava = zprava + abecedniZnak.

Dokončení

Závěrem samozřejmě zprávu vypíšeme a přidáme ReadKey():

Console.WriteLine("Dekódovaná zpráva: {0}", zprava);
Console.ReadKey();

Výsledek:

Konzolová aplikace
Původní zpráva: .-.. . --- -. .- .-. -.. ---
Dekódovaná zpráva: leonardo

StringSplitOptions

Ideálně bychom se měli nějak vypořádat s případy, kde uživatel zadá např. více mezer mezi znaky (to uživatelé rádi dělají). Split() poté vytvoří o jeden řetězec v poli více, který bude prázdný. U metody Split() můžeme jako druhý parametr předat StringSplitOptions.RemoveEmptyEntries, díky kterému se ve vráceném poli nebudou nacházet prázdné řetězce. V tomto případě však musíme separátor v prvním parametru předávat jako pole. Splitování by tedy vypadalo takto:

string[] znaky = s.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries);

Hotovo! Za úkol máte si naprogramovat program opačný, který naopak zakóduje řetězec do morzeovky, kód bude velmi podobný. Se Split() a Join() se potkáme během C# kurzu ještě několikrát.

Speciální znaky a escapování

Textový řetězec může obsahovat speciální znaky, které jsou předsazené zpětným lomítkem \. Je to zejména znak \n, který kdekoli v textu způsobí odřádkování a poté \t, kde se jedná o tabulátor.

Zpětné lomítko \ napíšeme na české klávesnici stiskem Pravého Alt + Q:

Zpětné lomítko na české klávesnici

Pojďme si to vyzkoušet:

Console.WriteLine("První řádka\nDruhá řádka");
Console.ReadKey();

Znak \ označuje nějakou speciální sekvenci znaků v řetězci a je dále využíván např. k psaní unicode znaku jako \uxxxx, kde xxxx je kód znaku.

Problém může nastat ve chvíli, když chceme napsat samotné \, musíme ho tzv. odescapovat:

Console.WriteLine("Toto je zpětné lomítko: \\");

Stejným způsobem můžeme odescapovat např. uvozovku tak, aby ji C# nechápal jako konec řetězce:

Console.WriteLine("Toto je uvozovka: \"");

Problém může být, když chceme zapsat nějakou delší cestu k souboru, kde máme velké množství zpětných lomítek. I na to v Microsoftu mysleli a zavedli modifikátor @.

Jak již asi víte, na klávesnici zavináč napíšeme pomocí Pravého Alt + V:

Zavináč

Díky tomuto modifikátoru C# automaticky escapuje celý námi napsaný řetězec v kódu:

Console.WriteLine(@"C:\Users\sdraco\Dropbox\itnetwork");

Vstupy z konzole a polí v okenních aplikacích se samozřejmě escapují sami, aby uživatel nemohl zadat \n a podobně. V kódu to má programátor povoleno a musí na to myslet.

V následujícím cvičení, Řešené úlohy k 11. lekci C# .NET, si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 1255x (133.2 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

Předchozí článek
Řešené úlohy k 10. lekci C# .NET
Všechny články v sekci
Základní konstrukce jazyka C# .NET
Přeskočit článek
(nedoporučujeme)
Řešené úlohy k 11. lekci C# .NET
Článek pro vás napsal David Čápka
Avatar
Uživatelské hodnocení:
150 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity

 

 

Komentáře

Avatar
Daniel Vítek
Redaktor
Avatar
Daniel Vítek:1.6.2012 11:54

Tam u toho vkládání a mazání,jak se počítá ta pozice ?

Odpovědět
1.6.2012 11:54
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Daniel Vítek
David Čápka:1.6.2012 11:59

Co parametry znamenají tam máš napsané, pozice je pozice znaku od začátku řetězce, první znak má pozici 0, druhý 1 atd.

Odpovědět
1.6.2012 11:59
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Daniel Vítek
Redaktor
Avatar
Odpovídá na David Čápka
Daniel Vítek:1.6.2012 12:02

No ale já to požítal a nějak mi to nevychází...

Odpovědět
1.6.2012 12:02
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Daniel Vítek
David Čápka:1.6.2012 12:03

To jsi počítal špatně :) Máš tam ukázky vše je tu vysvětlené, popsané, kódy i s výstupy, nevím co víc bys chtěl :)

Odpovědět
1.6.2012 12:03
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
skokanpeter3
Člen
Avatar
skokanpeter3:14.7.2012 22:43

skveli clanok. ale mozem sa spytat mam problem s textom namiesto medzeri je tam napisane [space] namiesto enter [enter] a podobne.
neda sa to splitnut na zaklade celeho retazca [enter] alebo podobne?? potrebujem nahradit vlastne space medzerou a eter dalsim riadkom a neviem sa k tomu dopracovat dakujem :)
takto som to riesil no neviem preco mi to nezmaze prakticky nic :/

string peter = "ahoj [ jano ] nas";
          for (int i = 0; i < peter.Length; i++)
          {
              if (peter[i] == Convert.ToChar("["))
              {
                  for (int ii = i; ii < peter.Length; ii++)
                  {
                      if (peter[ii] == Convert.ToChar("]"))
                      {
                          break;
                          i = ii;
                      }
                      else
                      {
                          peter.Remove(ii, 1);
                      }
                  }
              }
              textBox1.Text = peter;
 
Odpovědět
14.7.2012 22:43
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na skokanpeter3
David Čápka:14.7.2012 22:52

Koukni na metodu replace - http://www.itnetwork.cz/index.php?…

Měl by sis seriál přečíst od začátku :)

Odpovědět
14.7.2012 22:52
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
skokanpeter3
Člen
Avatar
skokanpeter3:16.7.2012 16:28

Dakujem moc replace pomohlo moc :) som este len zaciatocnik tak mam dost problemou :) mam C# este len jeden semester ale moc ma to bavi a webi ako tento su proste perfektne CZ / SK je toto asi naj web na C# . deste raz dik za pomoc;)

 
Odpovědět
16.7.2012 16:28
Avatar
Raiper34
Redaktor
Avatar
Odpovídá na Daniel Vítek
Raiper34:3.8.2012 22:52

NEvychádza lebo tam má sdraco chybu ;) počítam počítam a nechápem, tak som to skopíroval do Studia iba spustil a vyhodilo to posunuté nie na pozíciu akú by to malo mať ale na pozíciu 21 :)

Odpovědět
3.8.2012 22:52
Posledná vydaná hra: http://www.islandsoft.cz/index.php?art=hra-akcna-space-resistance
Avatar
Daniel Vítek
Redaktor
Avatar
Odpovídá na Raiper34
Daniel Vítek:4.8.2012 8:07

Takže tam má chybu ? :O

Odpovědět
4.8.2012 8:07
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Raiper34
David Čápka:4.8.2012 21:42

Který kód přesně nefunguje?

Odpovědět
4.8.2012 21:42
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Raiper34
Redaktor
Avatar
Odpovídá na David Čápka
Raiper34:4.8.2012 22:57

Nie že nefunguje,ale je to zle vypočítané ;)

 Console.WriteLine("Já bych všechny ty internety zakázala.".Insert(21, "ne"));
Výstup:

Já bych všechny ty internety nezakázala.

miesto 21 tam má byť 29

Odpovědět
4.8.2012 22:57
Posledná vydaná hra: http://www.islandsoft.cz/index.php?art=hra-akcna-space-resistance
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Raiper34
David Čápka:4.8.2012 23:35

Jo, to je pravda, opravím, dík ;-)

Odpovědět
4.8.2012 23:35
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar

Člen
Avatar
:30.8.2012 14:23

Ahoj,
zkoušel jsem si naprogramovat tu morseovku opačně, ale nějak to nefunguje.
Lámu si s tím hlavu hodiny, ale fakt nevím ...

string puvodniRetezec = "Morseova abeceda";
Console.WriteLine("Původní zpráva: {0}", puvodniRetezec);
// výsledná zpráva
string konecnyRetezec = "";
// vzory
string abecedniZnaky1 = "abcdefghijklmnopqrstuvwxyz";
string[] morseovyZnaky1 = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
                          "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
                          "...-", ".--", "-..-", "-.--", "--.."};

puvodniRetezec = puvodniRetezec.ToLower();
foreach (char pism in puvodniRetezec) // Přidám za každý znak mezeru, abych mohl porovnávat
{
    puvodniRetezec += pism+" ";
}
string[] pismena = puvodniRetezec.Split(' ');
foreach (string pismeno in pismena)
{
    string abecedniZnak = "?";
    int index = abecedniZnaky1.IndexOf(pismeno);
    if (index >= 0) // znak nalezen
        abecedniZnak = morseovyZnaky1[index]+" "; // Vypisuji s mezerou, pro lepší čitelnost
    konecnyRetezec += abecedniZnak;
}
Console.WriteLine("Dekódovaná zpráva: {0}", konecnyRetezec);

Program vyhodí konečnou zprávu v morseovce, ale:

  1. Na začátku má být -- --- atd., ale je tam ??---
  2. Je tam navíc pár a (.-) -> zhruba uprostřed a na konci -> možná to je přebytečnými mezerami?

Toť vše.
Díky za radu a skvělé tutoriály ... snad se taky časem naučím programovat a lépe programátorsky myslet :/

 
Odpovědět
30.8.2012 14:23
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na
David Jančík:30.8.2012 14:56

Moc složitě to děláš. Čti moje komentáře:

// pojmenovávej proměnné tak aby jsi se v nich vyznal
string vstup = "Morseova abeceda";
Console.WriteLine("Původní zpráva: {0}", vstup);
// výsledná zpráva
string vystup = "";
// vzory
string abecedniZnaky = "abcdefghijklmnopqrstuvwxyz";
string[] morseovyZnaky = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
                          "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
                          "...-", ".--", "-..-", "-.--", "--.."};

// převedu na malá odstraním mezery a zavolám trim ten zařídí aby tam nebyly nějaké white-space znaky
vstup = vstup.ToLower().Replace(" ", "").Trim();

// takto jednoduše můžeš převést na pole. Pokud chceš cyklus pak tam nedávej na konec " " mezeru jinak pak budeš mít v poli prázdnou hodnotu
char[] poleZnakuVstupu = vstup.ToCharArray();

foreach (char pismeno in poleZnakuVstupu)
{
        string abecedniZnak = "?";
        int index = abecedniZnaky.IndexOf(pismeno);
        if (index >= 0) // znak nalezen
                abecedniZnak = morseovyZnaky[index] + " "; // Vypisuji s mezerou, pro lepší čitelnost
        vystup += abecedniZnak;
}
Console.WriteLine("Dekódovaná zpráva: {0}", vystup);
Console.Read();

Pokud budeš chtít něco vysvětlit podrobněji nebo máš nějaký jiný dotaz ptej se :)

Odpovědět
30.8.2012 14:56
Zapomeň, že je to nemožné a udělej to ;)
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na
David Jančík:30.8.2012 15:01

Ještě vysvětlím co jsi tam měl špatně.

foreach (char pism in puvodniRetezec) // Přidám za každý znak mezeru, abych mohl porovnávat
{
    puvodniRetezec += pism+" ";
}

Přičítal jsi k tomu vstupnímu slovu jeho znaky
tzn bylo tam "morseova abeceda m o r s e "....

Proto ty první dva znaky byly "??" protože ty dvě slova v tom poli se znaky nebyly.

A když si to takhle uděláš tak ti vznikne řetězec oddělenej mezerama. Ale musíš si dát pozor na poslední mezeru "a b e c e d a " protože když pak zavoláš split tak ono ti to hodí do pole ale v tom posledním nic nebude. Tzn tu mezeru musíš pak odečíst. Ale je lepší použít ToCharArray()

Je dobré si to vypisovat abys na to přišel. Vyzkoušej Debug.Write to píše do toho debug okénka dole ve VS studiu tzn. nebudeš to mtí v konzoli ;)

Odpovědět
30.8.2012 15:01
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Kit
Redaktor
Avatar
Odpovídá na
Kit:30.8.2012 23:14

V původním článku je chyba. Je tam použit jeden string a jedno pole. Správně je místo toho použít jeden slovník. Když to uděláš obráceně, bude to také fungovat.

Odpovědět
30.8.2012 23:14
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:31.8.2012 10:30

To je samozřejmě proto, že slovníky se probírají až dále. Nenazýval bych to chybou, není to špatně, jen to jde napsat lépe, až bude člověk pokročilejší.

Odpovědět
31.8.2012 10:30
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Daniel Vítek
Redaktor
Avatar
Daniel Vítek:25.10.2012 16:15

Dá se nějak zjistit, na které pozici je nějaký znak ?

Odpovědět
25.10.2012 16:15
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Avatar
Daniel Vítek
Redaktor
Avatar
Odpovídá na Daniel Vítek
Daniel Vítek:25.10.2012 16:20

ajo už to vidím v programech se zdrojaky

Odpovědět
25.10.2012 16:20
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Avatar
matesax
Redaktor
Avatar
Odpovídá na Daniel Vítek
matesax:25.10.2012 16:21

Ale tak to jsou základy... :) Navíc to tu je. (Někde v tutoriálech.)

IndexOf
 
Odpovědět
25.10.2012 16:21
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Jančík
matesax:25.10.2012 16:41

Proč rovnou neudělat slovník?

 
Odpovědět
25.10.2012 16:41
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na matesax
David Jančík:25.10.2012 16:54

Jednak není potřeba a hlavní důvod je, že komentář se nachází v tutoriálu pro začátečníky na pozici, kde ještě kolekce nejsou vysvětlené. Jen jsem mu řekl, kde má chybu v kódu. Nebudu ho plést a říkat mu, že to má celé předělat a tím spíš mu nepřepíšu celý kód, aby to nepochopil.

Odpovědět
25.10.2012 16:54
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Daniel Vítek
Redaktor
Avatar
Odpovídá na matesax
Daniel Vítek:25.10.2012 21:20

tak já to nikdy nepotřeboval... A ano, již jsem to tu našel ;)

Odpovědět
25.10.2012 21:20
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Avatar
matesax
Redaktor
Avatar
Odpovídá na Daniel Vítek
matesax:25.10.2012 21:23

No je to součástí každého pole i listu. (string je pole :) )

 
Odpovědět
25.10.2012 21:23
Avatar
j.oo
Člen
Avatar
j.oo:14.1.2013 14:35

super články :) zatim to jakz takz stiham ikdyz obcas nejaky kroky nechapu ale to je spis nezkusenosti, hlavne v tom kde se delaji ktery zavorky,uvozovky a apostrovy

 
Odpovědět
14.1.2013 14:35
Avatar
Petr Laštovička
Super redaktor
Avatar
Petr Laštovička:21.4.2013 15:48

Při dekódování morseovky lze snadno vyřešit případ, kdy vstupní řetězec obsahuje mezi znaky více mezer.

string[] znaky = s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
 
Odpovědět
21.4.2013 15:48
Avatar
Libor Šimo (libcosenior):2.6.2013 17:40

Text je napr. takýto:
"Jano, chod do hory! Preco by som tam chodil? Nechce sa mi."
Dá sa použiť metóda Split na rozdelenie na vety? Ak áno, ako?

Odpovědět
2.6.2013 17:40
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Čápka:2.6.2013 17:48

Ano, do argumentu dáš pole s tečkou, čárkou, vykričníkem a otazníkem.

Odpovědět
2.6.2013 17:48
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Libor Šimo (libcosenior):2.6.2013 17:56

Ok, dík. Teda bez čiarky. :D

Editováno 2.6.2013 17:57
Odpovědět
2.6.2013 17:56
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Petr Čech
Redaktor
Avatar
Petr Čech:29.6.2013 13:38

Našel jsem malou chybičku.V "Vstupy z konzole a polí v okenních aplikacích se samozřejmě escapují sami, aby uživatel nemohl zadat \n a podobně. V kódu to má programátor povoleno a musí na to myslet." by mělo být escapují samy

Odpovědět
29.6.2013 13:38
the cake is a lie
Avatar
Johny Hiawa
Neregistrovaný
Avatar
Johny Hiawa:26.8.2013 13:44

Chtěl jsem uděla něco podobného, akorát s tím, že z latinky ty jednotlivé znaky převede do azbuky/cyrilice, ale bohužel mi to vždy vypíše samé otazníky. Netušíte, kde je problém?

Console.WriteLine("Zadejte jakékoliv slovo či jakoukoliv větu");
            string slovo = Console.ReadLine();
            slovo = slovo.ToLower().Trim();
            string vysledek = "";

            string ceskaAbeceda = "abcdefgijklmnoprstuvyz ";
            string ruskaAbeceda = "абцдэфгийклмнопрстувыз ";

            char[] poleCeskychZnaku = slovo.ToCharArray();

            foreach (char ceskeAbecedy in poleCeskychZnaku)
            {

                char ruskyZnak = '?';
                int index = ceskaAbeceda.IndexOf(ceskeAbecedy);
                Console.WriteLine(index);
                if (index >= 0)
                    ruskyZnak = ruskaAbeceda[index];
                vysledek += ruskyZnak;

            }
            Console.WriteLine(vysledek);
            Console.ReadLine();
 
Odpovědět
26.8.2013 13:44
Avatar
fejjaaas
Člen
Avatar
fejjaaas:22.2.2014 12:46

U příkladu na metodu Remove není výstupem: Kdo se směje, ten je admin. Správný výstup je: Kdo se směje ten je admin. :) To jen tak, kdyby to někoho mátlo.

 
Odpovědět
22.2.2014 12:46
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na fejjaaas
David Čápka:21.3.2014 17:22

Díky, opraveno.

Odpovědět
21.3.2014 17:22
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
fatst
Člen
Avatar
fatst:22.4.2015 19:09

Prosím o vysvětlení. Mám následující kód, který tu je a funguje, ale stále nechápu použití IndexOf():

            // převedu na malá odstraním mezery a zavolám trim ten zařídí aby tam nebyly nějaké white-space znaky
            vstup = vstup.ToLower().Replace(" ", "").Trim();
            // převod na pole
            char[] poleZnakuVstupu = vstup.ToCharArray();
            foreach (char pismeno in poleZnakuVstupu)
            {
                   string abecedniZnak = "?";
                   int index = abecedniZnaky.IndexOf(pismeno);
                   if (index >= 0) // znak nalezen
                           abecedniZnak = morseovyZnaky[index] + " "; // Vypisuji s mezerou, pro lepší čitelnost
                   vystup += abecedniZnak;
            }
            Console.WriteLine("Dekódovaná zpráva: {0}", vystup);
        // řetězec, který chceme kódovat
        string s = vystup;
        Console.WriteLine ();
        Console.WriteLine ("=========== Kódování =============");
        Console.WriteLine ("Původní zpráva:{0}", s);
        // řetězec s kódovanou zprávou
        string zprava = "";
        // rozbití řetězce na znaky morzeovky
        string[] znaky = s.Split(' ');
        // iterace znaků morzeovky
        foreach (string morseuvZnak in znaky)
        {
            char abecedniZnak = '?';
            int index = Array.IndexOf(morseovyZnaky, morseuvZnak);
            if (index >= 0) // znak nalezen
                abecedniZnak = abecedniZnaky[index];
            zprava += abecedniZnak;
        }
Console.WriteLine("Dekódovaná zpráva: {0}", zprava);

Prosím tedy o vysvětlení, proč jednou má IndexOf jen jeden parametr

int index = abecedniZnaky.IndexOf(pismeno);

a podruhé je tam Array a dva parametry:

int index = Array.IndexOf(morseovyZnaky, morseuvZnak);

.
Navíc jednou je to za proměnnou a podruhé ne. Nějak se mi z toho motá šiška.
Díky moc.

 
Odpovědět
22.4.2015 19:09
Avatar
fik...
Člen
Avatar
Odpovídá na fatst
fik...:22.4.2015 19:35

Jde vlastně o dvě různé metody se stejným názvem. V prvním případě voláš metodu přímo na proměnné a tak už v nemusíš proměnnou psát znovu do parametrů metody. Ve druhém případě jde ale o statickou metodu(volá se na třídě Array a ne na proměnné) a tak tam musíš proměnou napsat jako parametr, ale výsledek bude stejný. Více se dozvíš v tutoriálu o OOP. Snad ti to trochu pomohlo.:)

 
Odpovědět
22.4.2015 19:35
Avatar
fatst
Člen
Avatar
Odpovídá na fik...
fatst:22.4.2015 21:52

Díky moc za vysvětlení. Zatím jsem zmaten, ale jestli je to dále, pokračuji. Ještě si to 5x přečtu... :-)

 
Odpovědět
22.4.2015 21:52
Avatar
Lukáš Fusek
Redaktor
Avatar
Lukáš Fusek:22.6.2015 0:11

Ahoj.
Mám problém s převedením textu do Morseovy abecedy.

Console.WriteLine("Zadej text, který chceš zakódovat do Morseovy abecedy");
string vstup = Console.ReadLine();  //načte vstupní text z konzole
vstup = vstup.ToLower().Trim();  //převede vstupní text na malé písmena a odstraní mezery na začátku a konce řetězce
string zakodovanytext = ""; //vysledny zakódovaný text do morseovky

//vzorová pole
string abecedniZnaky = "abcdefghijklmnopqrstuvwxyz";
string[] morseovyZnaky = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};

//iterace abecedních znaků
foreach (char abecedniZnak in vstup)
{
    string morseuvZnak = "?";
    int index = Array.IndexOf(abecedniZnaky, abecedniZnak);
    if (index >= 0)  //znak nalezen
        morseuvZnak = morseovyZnaky[index];
    zakodovanytext += morseuvZnak;
}
Console.WriteLine("Dekódovaná zpráva: " + zakodovanytext);
Console.ReadKey();

Program nelze spustit.
Kompilátor říká:
Error 1 The best overloaded method match for 'System.Array­.IndexOf<char>(ch­ar[], char)' has some invalid arguments
Error 2 Argument 1: cannot convert from 'string' to 'char[]'

Prosím o radu. Předem děkuji. :)

Editováno 22.6.2015 0:12
 
Odpovědět
22.6.2015 0:11
Avatar
Ondřej Štorc
Redaktor
Avatar
Odpovídá na Lukáš Fusek
Ondřej Štorc:22.6.2015 8:26
int index = Array.IndexOf(abecedniZnaky.ToCharArray(), abecedniZnak);

Takhle by to mělo fungovat. Ty totiž dáváš do parametru metody string a ono tam má být pole charů

Odpovědět
22.6.2015 8:26
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Migi
Redaktor
Avatar
Migi:7.12.2015 19:06

Ahoj,
zkusil jsem napsat opacny kod, ktere prevede text na morseovku.

string abecedniZnaky = "abcdefghijklmnopqrstuvwxyz";
            string abecedniZnaky1 = "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";

            string[] abeceda = abecedniZnaky1.Split();

            string[] morseovyZnaky = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....","..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
                "...-", ".--", "-..-", "-.--", "--.."};

Console.WriteLine("Zadej text k prekladu:");
            string zprava1 = Console.ReadLine();
            string prekodovana_zprava = "";
            foreach (char c in zprava1)
                if (zprava1[0] == c)
                    prekodovana_zprava = c + " ";
                else

                    prekodovana_zprava = prekodovana_zprava + c + " ";
            prekodovana_zprava = prekodovana_zprava.TrimEnd();

            string[] policko = prekodovana_zprava.Split();

            string dekodovana = "";

            foreach (string pisemko in policko)
            {
                int pozice1 = Array.IndexOf(abeceda, pisemko);
                if (pozice1>=0)
                    if (dekodovana.Length == 0)
                        dekodovana = morseovyZnaky[pozice1];
                    else
                        dekodovana = dekodovana + " " + morseovyZnaky[pozice1];

            }
            Console.WriteLine(dekodovana);
            Console.ReadLine();

Chtel jsem se zeptat, zda me reseni neni zbytecne slozity? Jak funguje to, nejsou osetreny mezery mezi slovy... ale neslo mi cist vstupni text po znacich, ktery pak hledam pomoci Array.IndexOf v poli :-( Znaky abebecedy jsem mel taky jako string pole[] a hledal jsem v tom char a to se bortilo, tak jsem to obesel ze jsi kazdy znak prolozim mezerou a nakonci natrimuju, pak Split a dostanu onez pole pro Array.IndexOf a pak uz to jelo 8-)

Diky

Editováno 7.12.2015 19:08
Odpovědět
7.12.2015 19:06
I ta nejhorsi hodina v zivote trva jen 60 minut...
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Migi
Redaktor
Avatar
Odpovídá na Migi
Migi:7.12.2015 19:13

No proc to psat jednoduse, kdyz to jde slozite %P Viz vyse. Tohle je to cistejsi reseni, predpokladam.

string abecedniZnaky = "abcdefghijklmnopqrstuvwxyz";
string[] morseovyZnaky = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....","..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
                "...-", ".--", "-..-", "-.--", "--.."};
Console.WriteLine("Zadej text k prekladu:");
            string zprava1 = Console.ReadLine();

            string dekodovana = "";

            foreach (char pisemko in zprava1)
            {
                int pozice1 = Array.IndexOf(abecedniZnaky.ToCharArray(), pisemko);
                if (pozice1 >= 0)
                    if (dekodovana.Length == 0)
                        dekodovana = morseovyZnaky[pozice1];
                    else
                        dekodovana = dekodovana + " " + morseovyZnaky[pozice1];

            }
            Console.WriteLine(dekodovana);
            Console.ReadLine();
Odpovědět
7.12.2015 19:13
I ta nejhorsi hodina v zivote trva jen 60 minut...
Avatar
Martin K--a
Člen
Avatar
Martin K--a:22.3.2016 10:36

už do toho asi koukám moc dlouho a nevidím kde je ta chyba. :-D

Odpovědět
22.3.2016 10:36
Člověk jako jedinec je inteligentní a racionálně myslící bytost, lidstvo jako celek je stádo nemyslících zvířat
Avatar
Odpovídá na Martin K--a
Neaktivní uživatel:28.1.2017 22:00

Moc malé nejde přečíst musel jsem si to najít ve zdrojáku stránky (http://www.itnetwork.cz/…8301_image_0)

Odpovědět
28.1.2017 22:00
Neaktivní uživatelský účet
Avatar
Marek Kaczmarczyk:23.5.2017 15:25

Moje zpetne zakodovani:

Editováno 23.5.2017 15:27
 
Odpovědět
23.5.2017 15:25
Avatar
Marek Kaczmarczyk:23.5.2017 15:26

Moje zpetne zakodovani:

Console.WriteLine("Dekodovana zprava : {0}: ", zprava);
Console.ReadKey();

string kodovani = "";

foreach(char c in zprava)
{
string morseuvZnak = "?";
int cislopismene = Array.IndexOf(abecedniZnaky.ToCharArray(), c);
if (cislopismene >= 0)//znak nalezen
morseuvZnak = morseovyZnaky[cislopismene];
kodovani += morseuvZnak+" | ";
}
Console.WriteLine("kodovani : {0}: ", kodovani);
Console.ReadKey();
 
Odpovědět
23.5.2017 15:26
Avatar
František Hejský:31.8.2017 20:16

Nejde to, jako převedený text do abecedy (naší) mi to ukáže otazník. Mam tam něco špatně? Koukněte:

string s = ".. - -. . - .-- --- .-. -.-";
            Console.WriteLine("Původní zpráva: {0}", s);

            string zprava = "";


            string abecedniZnaky = "abcdefghijklmnopqrstuvwxyz";
            string[] morseovyZnaky = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
"..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
"...-", ".--", "-..-", "-.--", "--.."};
            string[] znaky = s.Split(' ');


            foreach (string morseuvZnak in znaky)
            {

            }
            char abecedniZnak = '?';
            int index = Array.IndexOf(morseovyZnaky, morseuvZnak);
            if (index >= 0)
                abecedniZnak = abecedniZnaky[index];
            zprava += abecedniZnak;

            Console.WriteLine("Dekódovaná zpráva: {0}", zprava);
            Console.ReadKey();
 
Odpovědět
31.8.2017 20:16
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na František Hejský
David Čápka:31.8.2017 20:17

Špatně je už na první pohled ten prázdný cyklus :) V článku máš kód řešení, v příloze máš kód řešení. Oprav si to.

Odpovědět
31.8.2017 20:17
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
 
Odpovědět
31.8.2017 20:19
Avatar
Jirka Kouba
Člen
Avatar
Jirka Kouba:14.2.2018 21:38

Mohl by mi někdo prosím vysvětlit funkci Substring() ? Z toho co se tu píše jsem moc nepochopil co se myslí tím podřetězcem.

 
Odpovědět
14.2.2018 21:38
Avatar
Martin Petrovaj
Redaktor
Avatar
Odpovídá na Jirka Kouba
Martin Petrovaj:14.2.2018 21:58

Podreťazec (angl. substring) je jednoducho časť pôvodného reťazca.

Príkaz Substring s jedným parametrom (celým číslom, indexom) funguje tak, že vezme pôvodný reťazec na ktorom ho voláš a vráti časť reťazca od daného indexu až po koniec reťazca. Napr. Substring na reťazci "Ahoj svet!" s parametrom 1 (štartovací index, od ktorého sa bude začínať nami chcený podreťazec) vráti podreťazec "hoj svet!".

S dvoma parametrami (index a dĺžka podreťazca, oba parametre celočíselné) funguje v podstate rovnako, len nevytvorí podreťazec od zadaného indexu až po koniec, ale zahrnie len nejakých x znakov (kde x je ten druhý parameter, ktorý sme práve pridali). Opäť, pre "Ahoj svet!" by s parametrami 1 (štartovací index) a 3 (dĺžka zostavovaného podreťazca) by Substring vrátil "hoj".

Ďalšie príklady v článku.

Odpovědět
14.2.2018 21:58
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Petr Zajac
Člen
Avatar
Odpovídá na Marek Kaczmarczyk
Petr Zajac:25.2.2018 18:09

Netuším proč přiřazení "int cislopismene = Array.IndexOf(a­becedniZnaky.ToCha­rArray(), c);"
děláš opakovaně "rozsekání proměnné abecedníZnaky" na jednotlivá písena v cyklu na typ pole a nemáš to nad cyklem přiřazené do pole pojmenovaného např abeceda?

 
Odpovědět
25.2.2018 18:09
Avatar
Dušan Kovářík:8.6.2018 0:11

Kódování do Morseovy abecedy jsem udělal v podstatě jen úpravou kódu pro jeho dekódování. Místo cyklu

foreach

jsem použil

for

, v němž jsem si uložil Morseovy znaky kódované zprávy do prvků pole

string

ů, abych si mohl následně vyzkoušet metodu Join().

// řetězec, který chceme zakódovat
string zprava = "itnetwork";
Console.WriteLine("Původní zpráva: {0}", zprava);

// vzorová pole
string abecedniZnaky = "abcdefghijklmnopqrstuvwxyz";
string[] morseovyZnaky = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
    "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
    "...-", ".--", "-..-", "-.--", "--.."};

// pole znaků pro zakódovanou zprávu v morzeovce
string[] znaky = new string[zprava.Length];

// iterace abecedních znaků
int index;
for (int i = 0; i < zprava.Length; i++)
{
    znaky[i] = "?";
    index = abecedniZnaky.IndexOf(zprava[i]);
    if (index >= 0) // znak nalezen
        znaky[i] = morseovyZnaky[index];
}

// spojení pole znaků se zakódovanou zprávou do jednoho řetězce
string s = String.Join(" ", znaky);

Console.WriteLine("Zakódovaná zpráva: {0}", s);
Console.ReadKey();
 
Odpovědět
8.6.2018 0:11
Avatar
Odpovídá na Dušan Kovářík
Dušan Kovářík:8.6.2018 1:09

Omlouvám se za rozsekaný text na začátku před kódem :)

 
Odpovědět
8.6.2018 1:09
Avatar
Odpovídá na Marek Kaczmarczyk
Tibor Galloš:23.10.2018 15:13

Presne tak isto som to napísal aj ja :)

Odpovědět
23.10.2018 15:13
Všetko je možné.
Avatar
David Hirka
Člen
Avatar
David Hirka:16.11.2018 11:35

Moje zpětné zakódování. Pro hledání indexu jsem použil pole. Asi trochu složitější ale funguje mi i dvojitá mezera mezi slovy:

                        // řetězec, který chceme dekódovat
            Console.WriteLine("Zadejte zprávu k zakódování:");
            string s = Console.ReadLine().ToLower();
            Console.WriteLine("Původní zpráva: {0}", s);
            // řetězec s dekódovanou zprávou
            string zprava = "";

            // vzorová pole
            char[] abecedniZnaky = { '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', ' ' };
            string[] morseovyZnaky = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
"..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
"...-", ".--", "-..-", "-.--", "--..", " "};

            foreach(char morseuvZnak in s)
            {
                string abecedniZnak = "?";
                int index = Array.IndexOf(abecedniZnaky, morseuvZnak);
                if (index >= 0) // znak nalezen
                    abecedniZnak = morseovyZnaky[index];
                zprava += abecedniZnak;
                zprava += " ";
            }
            Console.WriteLine("Zakódovaná zpráva: {0}", zprava);
            Console.ReadKey();
Editováno 16.11.2018 11:38
 
Odpovědět
16.11.2018 11:35
Avatar
Jan Křížek:21.11.2018 18:47

Zpětné zakódování do morseovi abecedy jsem zapsal takto:

// řetězec se zakódovanou zprávou
string[] znaky = new string[s.Length];

// iterace znaků morseovky
int i = 0;
foreach (char Znak in s)
{
string morseZnak = "?";
int index = alfabeta.Inde­xOf(Znak);
if (index >= 0) // znak nalezen
morseZnak = morse[index];
znaky[i] += morseZnak;
i++;
}
// slepení řetězce na znaky morseovky
Console.Write­Line($"Dekódo­vaná zpráva: {string.Join(" ",znaky)}");

A funguje bez problému :)

 
Odpovědět
21.11.2018 18:47
Avatar
Patrik Pastor:31.12.2018 15:47

Jaky datovy typ bere metoda s.Join() do argumntu? Používám ji u pole, ale pořd mi vyskakuje že je nulové přetíženi. Díky z odpoved.

 
Odpovědět
31.12.2018 15:47
Avatar
Odpovědět
31.12.2018 17:37
Neaktivní uživatelský účet
Avatar
Patrik Pastor:1.1.2019 1:56

Hezký den, chtěl jsem se zeptat, nevíte proč se mi nic nezobrazí (kód pro převedení z slova na morseův znak):

string s = "patrik";
string zprava = "";
string [] abeceda = { "abcdefghijklmnop­qrstuvwxyz" };
string[] morseovka = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
"..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
"...-", ".--", "-..-", "-.--", "--.."};
string[] znak = s.Split(' ');

foreach (string AB in znak)
{
string morseuvznak = "";
int index = Array.IndexOf(a­beceda, AB);
if (index >= 0)
morseuvznak = morseovka[index];
zprava += morseuvznak;
}
Console.Write­Line(zprava);
Console.ReadKey();

Dík za odpověď

 
Odpovědět
1.1.2019 1:56
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Patrik Pastor
pocitac770:1.1.2019 6:53

Používáš pole stringů, kde na první pozici máš celou abecedu. To je oním problémem. Hledáš konkrétní znak v onom poli, ale ten tam nenajdeš, protože tam... Není.
Můžeš na to jít buď tak, že budeš mít pole charů jednotlivých znaků abecedy, kde budeš hledat onen znak a pak ho připisovat, nebo použiješ samostatný string, a následně hledat znak na pozici x ve stringu

 
Odpovědět
1.1.2019 6:53
Avatar
Odpovídá na Patrik Pastor
Neaktivní uživatel:1.1.2019 10:58

A krom toho co psal pocitac770 jsi asi chtěl použít <code>s.ToCha­rArray()</code>.

Odpovědět
1.1.2019 10:58
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Patrik Pastor:1.1.2019 15:48

dik moc lidi, dávám si dohromady ty datove typy, protože tam nejvic chybuju. Nejspiš jsem moc nepochopil ten začatek s tim, nebo to bylo huře napsano, nicmeně si na to budu davat větší pozor. Dík

 
Odpovědět
1.1.2019 15:48
Avatar
Odpovídá na Neaktivní uživatel
Patrik Pastor:1.1.2019 15:49

A ještě, co znamená metodaa ToCharArray()? neznám ji, tak kdyby mi někdo řekl, co bere za argumenty. Díik

 
Odpovědět
1.1.2019 15:49
Avatar
Jurajs
Člen
Avatar
Odpovídá na Patrik Pastor
Jurajs:1.1.2019 16:05

Zkus to vygooglit, bez google se neobejdeš, jako programátor... Tady to máš ale příště zkus použít google, než se ptát na každou věc kterou si lze najít na google - https://docs.microsoft.com/….tochararray?…

Editováno 1.1.2019 16:07
 
Odpovědět
1.1.2019 16:05
Avatar
Odpovídá na Patrik Pastor
Neaktivní uživatel:1.1.2019 16:08

Zkus hledat… nebo uvažovat… jako argumenty nebere nic, nebo začátek a délku části, kterou chceš vrátit. Vrací prostě jednotlivé znaky v poli.
https://docs.microsoft.com/….tochararray?…

Edit: ajjj, duplikovaná odpověď…

Editováno 1.1.2019 16:09
Odpovědět
1.1.2019 16:08
Neaktivní uživatelský účet
Avatar
Patrik Pastor:1.1.2019 23:49

Mám to napsané uplně stejně jako předloha, ale stejně mi program ukaže :

Zadaný argument je mimo rozsah platných hodnot.
Název parametru: startIndex

u tohoto řádku

veta = veta.Insert(pozice + 1, " " + smajlici[smajlik]);

Console.Write­Line("Napište nějaké věty.");

string veta = Console.ReadLine();
char[] interpunkce = { '!', '.', '?' };
string[] smajlici = { ":)", ":D", ":P" };
int pozice = 0;
int smajlik = 0;
while (pozice < veta.Length)
{
if (interpunkce.Con­tains(veta[po­zice]))
{
if (veta[pozice] == '.')
{
veta.Remove(pozice, 1);
pozice--;
}
pozice++;
veta = veta.Insert(pozice + 1, " " + smajlici[smajlik]);

smajlik++;
if (smajlik > smajlici.Length - 1)
smajlik = 0;
}
pozice++;
}
Console.Write­Line(veta);
Console.ReadKey();
.

 
Odpovědět
1.1.2019 23:49
Avatar
Odpovídá na Patrik Pastor
Neaktivní uživatel:2.1.2019 10:43

Jsi si jistý tím zvětšováním <code>pozice</code> (dokonce dvojitým)?

pozice++;
veta = veta.Insert(pozice + 1, " " + smajlici[smajlik]);
Odpovědět
2.1.2019 10:43
Neaktivní uživatelský účet
Avatar
Čus Peťan
Člen
Avatar
Čus Peťan:8.3.2019 18:54

Zdravim,mám problém s převedením slova na morseův znak. Mohl by někdo poradit?

string s = "itnetwork";

            Console.WriteLine("zpráva: {0}", s);
            string zzp = "";


            string[] morseovyZnaky = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
"..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
"...-", ".--", "-..-", "-.--", "--.."};

            char[] abecedniZnaky = { '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' };

            string[] znak = s.Split('?');
            foreach (string abeceda in znak)
            {
                string morseuvZnak = "";
                int index = Array.IndexOf(abecedniZnaky, abeceda);
                if (index >= 0)
                    morseuvZnak = morseovyZnaky[index];
                zzp += morseuvZnak.ToCharArray();
            }
            Console.WriteLine("zpráva: {0}", zzp);
            Console.ReadKey();
 
Odpovědět
8.3.2019 18:54
Avatar
Odpovídá na Čus Peťan
Neaktivní uživatel:8.3.2019 21:15

Víš přesně, s čím máš problém?

slova … znak

Už tohle zní trochu divně, tak snad je to jenom chybná formulace…

Odpovědět
8.3.2019 21:15
Neaktivní uživatelský účet
Avatar
David H.
Člen
Avatar
David H.:12.3.2020 22:40

Díky za článek. ;-)

 
Odpovědět
12.3.2020 22:40
Avatar
Marek Vajčner:28.3.2020 12:15

Bezva, další zajímavé metody. Tak tedy jdu na další úlohy. Jsem zvědav jak moc ty řetězce v polích "zvořu".

 
Odpovědět
28.3.2020 12:15
Avatar
Odpovídá na Čus Peťan
Petr Šenfeld:26.6.2020 15:21

asi hodně pozdní odpověď ale myslím, že by to mělo jít po této úprávě:

string[] znak = s.Split('?');

  • bych smazal, není potřeba splitovat slovo a už vůbec ne podle '?'

string morseuvZnak = "";

  • bys měl doplnit "?", jinak pokud znak nenajde tak nic nedoplní.

zzp += morseuvZnak.ToCha­rArray();

  • bych předělal na zzp += (morseuvZnak + " ");

mohu se mýlit, taky se vzdělávám :-)

Editováno 26.6.2020 15:23
 
Odpovědět
26.6.2020 15:21
Avatar
popo49
Člen
Avatar
popo49:14.12.2020 17:08

Překlad do Morseovky po mém :-)

// zjistím pozici znaku v datovém typu string
       static int PoziceZnaku(string znaky, char c)
       {
           int pozice = 0;
           for (int j = 0; j < znaky.Length; j++)
           {
               if (c == znaky[j])
               {
                   pozice = j;
                   break;
               }
               else
                   pozice = 0;
           }
           return pozice;
       }
       static void Main(string[] args)
       {
           string s = "morseova abeceda"; //string k překladu
           Console.WriteLine(s);
           s = s.ToLower(); //převod na malá písmena
           string[] preklad = new string[s.Length]; //pole pro ukládáni morseovych znaků
           // definované znaky
           string abecedniZnaky = "abcdefghijklmnopqrstuvwxyz";
           string[] morseovyZnaky = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
                   "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-",
                   "...-", ".--", "-..-", "-.--", "--.."};
           char odelovac = ','; //použití v konečném výpisu (pro oddělení znaků)
           int i = 0; //iterace překládaných znaků
           int j = 0; //iterace nedefinovaných znaků

           //průchod vetou pro překlad po znacích
           foreach (char c in s)
           {
               if (abecedniZnaky.Contains(c)) //kontrola zda je znak definován
               {
                   int index = PoziceZnaku(abecedniZnaky, c); //nešel použít IndexOf() - proto použita vlastní metoda
                   preklad[i] = morseovyZnaky[index];
                   if ((i+1) < (s.Length - j)) //ve výpise chci oddělit jednotlivé znaky ',' - za posledním znakem oddělovač nechci
                       Console.Write("{0}{1}", preklad[i], odelovac);
                   else
                       Console.Write("{0}", preklad[i]);
                   i++;
               }
               else
                   j++; //pokud není definovaný
           }
           Console.WriteLine();
           Console.ReadKey();
       }
 
Odpovědět
14.12.2020 17:08
Avatar
Tereza Kalivodová:15.4.2021 21:50

Mám dotaz k StringSplitOp­tions.RemoveEm­ptyEntries. V článku píšete, že musíme první parametr předávat jako pole, tedy:
string[] znaky = s.Split(new char[]{' '}, StringSplitOp­tions.RemoveEm­ptyEntries);
ale mě funguje i tento zápis:
string[] znaky = s.Split((' '), StringSplitOp­tions.RemoveEm­ptyEntries);
Proč to tedy komplikovat, když funguje jednoduchá verze?

 
Odpovědět
15.4.2021 21:50
Avatar
Alesh
Překladatel
Avatar
Odpovídá na Tereza Kalivodová
Alesh:15.4.2021 23:56

Pokud se nepletu, tak ten druhý zápis je možný až od vyšší verze .NET, doma ti to fungovat bude, ale tady ne, schválně si vyzkoušej obě možnosti v některé z těch konzolí v článku, kde se demonstruje nějaký kód. Prostě do toho klikni, kód pak můžeš libovolně upravovat. Čili pak bacha, pokud to bude ve cvičeních k této lekci, tak zapisovat jedině tím prvním způsobem. ;-)

 
Odpovědět
15.4.2021 23:56
Avatar
Vaclav Klimes:2.6.2021 9:29

Ahoj, můžete mně někdo pomoci pochopit, co dělám špatně? Níže uvedený kód při běžném spuštění (F5) se zastaví na prvním řádku s chybou "System.NullRe­ferenceExcepti­on: Odkaz na objekt není nastaven na instanci objektu.", ale při krokovém (F11) bez obtíží funguje..Moc díky.

string[] pozice = lokace.message.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
                    place = pozice[0];
                    popis = pozice[2];
                    nazev = pozice[1];
                    for (int i = pozice.Length - 1; i > 2; i--)
                        smery += pozice[i] + " ";
                    Console.WriteLine("Můžeš jít na {0}", smery);
                    Console.WriteLine("Zadej příkaz: ");
                    choice = Console.ReadLine().ToLower().Trim();
 
Odpovědět
2.6.2021 9:29
Avatar
Luboš Marvan
Člen IT Redactor Gang
Avatar
Luboš Marvan:29.10.2021 9:30

Ahoj,
v úvodu je pojednání o metodách First(), Last(), IndexOf() stejných na polích a stringu. Mě ale připadá, že IndexOf() není. Ve stringu volám metodu na proměnné (instanci), zatímco u pole to volám na třídě Array a proměnná pole je jako parametr.
Nebo dělám někde chybu?
Luboš

Odpovědět
29.10.2021 9:30
Jsi tam, kde jsou tvoje myšlenky
Avatar
Eva Šimerková:21.11.2021 17:54

Chybí mi zde řešení úkolu na program, který zakóduje řetězec do morseovky...

 
Odpovědět
21.11.2021 17:54
Avatar
Ladislav SKOKAN:2. ledna 15:55

pokud někomu nefunguje IndexOff, zkuste upravit druhý parametr
index = Array.IndexOf(a­becedniZnaky, vstup[i].ToStrin­g());

 
Odpovědět
2. ledna 15:55
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 78 zpráv z 78.