IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.
Avatar
ngo.andrej
Člen
Avatar
ngo.andrej:27.4.2013 18:46

Dobrý den,
mám za úkol převrátit větu tzn. "Ahoj, Tomáši. Jak se máš. Já dobře. Ty také?" -> "Ty také? Já dobře. Jak se máš. Ahoj, Tomáši."
Všechno by bylo jednoduché kdyby jako zakončení věty byla jen tečka. Ale bohužel je tam ještě možnost vykřičníku a otazníku. To podle mě taky nebyl problém,
ale po napsání kódu program stále nejde. (neprovede se nic).
Díky za každou pomoc.

textBox2.Text = "";
                                int PocetTecek = 0;
                                string vety = textBox1.Text;
                                string Skladani = "";
                                int Pozice = 0;
                                //string znak = ".?!";
                                for (int R = 0; R <= textBox1.Text.Length - 1; R++)
                                {
                                        if (textBox1.Text[R] == '.' || textBox1.Text[R] == '!' || textBox1.Text[R] == '?')
                                                {
                                                        PocetTecek++;
                                                }
                                }


                                string[] Pole = new string[PocetTecek];
                                        for (int R = 0; R <= textBox1.Text.Length - 1; R++)
                                        {
                                                if (textBox1.Text[R] != '.' || textBox1.Text[R] != '!' || textBox1.Text[R] != '?')
                                                {
                                                        Skladani += textBox1.Text[R].ToString();
                                                }
                                                else
                                                {
                                                        Pole[Pozice] = (Skladani);
                                                        Skladani = "";
                                                        Pozice++;
                                                }
                                }
                                if (PocetTecek % 2 == 0)
                                {
                                        for (int i = 0; i < Pole.Length / 2; i++)
                                        {
                                                string prehaz = Pole[i];
                                                Pole[i] = Pole[Pole.Length - i - 1];
                                                Pole[Pole.Length - i - 1] = prehaz;
                                        }
                                        foreach (string veta in Pole)
                                        {
                                                textBox2.Text += veta;
                                        }
                                }
                                else
                                {
                                }
 
Odpovědět
27.4.2013 18:46
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na ngo.andrej
Petr Nymsa:27.4.2013 18:54

Tento celý kód máš vložený kde ? V metodě po kliknutí na tlačítko ? V konstruktoru ? Nebo jsi to prsknul někam ? Pod pojmem "program stále nejde" si můžeme představit cokoliv. Nezapne se ? Nezobrazí výsledek ? Přehází věty špatně ? Program padá ? Bohužel opět vedení dalo všechny věštecké nástroje vyčistit :). Popiš prosím více problém a pokusíme se poradit. Jen tak pro začátek. Proč tam máš prázdný blok else ?

Nahoru Odpovědět
27.4.2013 18:54
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na ngo.andrej
Michal Žůrek - misaz:27.4.2013 18:55

Ten kód tady vypadá blbě, proč je tam tolik mezer?

1.) Rozděl podle teček, vytvoř si kolekci věty<string>
2.) věty rozdělené podle teček rozděl podle ?
3.) věty rozdělené podle teček rozděl podle !
4.) věty rozdělené podle ? rozděl podle !

Myslím si že by to mělo stačit.

 
Nahoru Odpovědět
27.4.2013 18:55
Avatar
Odpovídá na Petr Nymsa
Michal Žůrek - misaz:27.4.2013 18:56

On asi neumí používat debuger.

 
Nahoru Odpovědět
27.4.2013 18:56
Avatar
ngo.andrej
Člen
Avatar
ngo.andrej:27.4.2013 18:57

ano je to po kliknutí na tlačítko. Program po kliknutí neprovede nic.
Prázdné else tam je prozatím, jelikož přesné zadání je: "Program spočítá počet vět. Pokud jich je sudý počet vypíše věty v opačném pořadí. Pokud bude počet lichý, vypíše nejdříve věty v lichém pořadí (1., 3., 5. atd.) a teprve po nich věty v pořadí sudé (2., 4., 6. atd.).
např: Ahoj, Tomáši. Jak se máš. Já dobře. Ty také? -> Ty také? Já dobře. Jak se máš. Ahoj, Tomáši."
a else má být potom na lichý počet vět.

 
Nahoru Odpovědět
27.4.2013 18:57
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na ngo.andrej
Petr Nymsa:27.4.2013 19:03

Program neudělá nic ... co udělá ? Běží dál bez spadnutí ? Pokud ano, není metoda registrovaná na tlačítko. Nejrychlejší cesta jak to zjistit je v Designeru kliknout na tlačítko a v properties najít záložku Events (ikona blesku) , najít si řádek Click a ujistit že tam je ta metoda napsaná, pokud ne, 2x klepnout do toho řádku a metoda se vygeneruje.

Nahoru Odpovědět
27.4.2013 19:03
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
ngo.andrej
Člen
Avatar
Odpovídá na Michal Žůrek - misaz
ngo.andrej:27.4.2013 19:03

Promiň, jsem v programování amatér. Mohl bys to popsat víc pro blbce? :D

 
Nahoru Odpovědět
27.4.2013 19:03
Avatar
Odpovídá na ngo.andrej
Michal Žůrek - misaz:27.4.2013 19:04

3 je liché

:D

možná proto to nic neudělá :)

Editováno 27.4.2013 19:04
 
Nahoru Odpovědět
27.4.2013 19:04
Avatar
ngo.andrej
Člen
Avatar
Odpovídá na Petr Nymsa
ngo.andrej:27.4.2013 19:06

Běží bez spadnutí. Ale to není tímhle... Když smažu z podmínky if ostatní podmínky tzn. že nechám jen: "if (textBox1.Text[R] == '.')" tak funguje. Ale když tam dám další podmínky s OR (||) tak nic neprovede...

 
Nahoru Odpovědět
27.4.2013 19:06
Avatar
Odpovídá na ngo.andrej
Michal Žůrek - misaz:27.4.2013 19:08

No nevím na co konkrétně potřebuješ podmínky, ale za minutu jsem seplácal toto:

string dlouhyText = Console.ReadLine();
//string dlouhyText = "Ahoj, Tomáši. Jak se máš. Já dobře. Ty také?";
char[] poleRozdelovacu = { '.', '!', '?' };
string[] vety = dlouhyText.Split(poleRozdelovacu);
for (int i = vety.Length - 1; i > 0; i--)
{
    Console.WriteLine(vety[i]);
}
Console.ReadKey();
 
Nahoru Odpovědět
27.4.2013 19:08
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na ngo.andrej
Petr Nymsa:27.4.2013 19:12

Podívej se na zdejší tutoriály o práci se stringy, nalezneš velmi užitečnou metodu Split. Jinak, neousivís to přímo s programem, zápis kódu je šílený. Proměnné (privátní) by měly být vždy malým písmenem. Vždy !

Nahoru Odpovědět
27.4.2013 19:12
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Neaktivní uživatel:27.4.2013 19:28

upřesním, aby to ngo.andrej pochopil správně - první písmeno má být malé :) Poté můžeš využít pro "oddělení" slov dva způsoby zápisu, ten co tu používáš - velbloudí, to znamená že budeš mít:

int mojeKrasnaPromnenna

nebo použiješ podtržítkový zápis:

int moje_krasna_promnenna

To už je na tobě :)

Editováno 27.4.2013 19:29
Nahoru Odpovědět
27.4.2013 19:28
Neaktivní uživatelský účet
Avatar
ngo.andrej
Člen
Avatar
Odpovídá na Michal Žůrek - misaz
ngo.andrej:27.4.2013 19:34

No jo, ale zase to napíše zase takhle př. Ahoj, Tomáši. Jak se máš. Já dobře. Ty také? -> Ahoj, Tomáši. Jak se máš. Já dobře. ?ékat yT .eřbod áJ .šám es kaJ .išámoT ,johA
a to já nechci.

 
Nahoru Odpovědět
27.4.2013 19:34
Avatar
Odpovídá na ngo.andrej
Neaktivní uživatel:27.4.2013 19:39

Prosímtě o co ti teda jde, chceš
a)

vstup = "Babička Karkulky ráda skotačí s vlky";
výstup = "vlky s skotačí ráda Karkulky Babička";

nebo b)

vstup = "Babička Karkulky ráda skotačí s vlky";
výstup = "yklv s íčatoks adár yklukraK akčibaB";

?

Nahoru Odpovědět
27.4.2013 19:39
Neaktivní uživatelský účet
Avatar
Honza Bittner
Tvůrce
Avatar
Nahoru Odpovědět
27.4.2013 19:41
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Odpovídá na ngo.andrej
Neaktivní uživatel:27.4.2013 19:43

Tak v tom případě je misazovo řešení správné, až na to že tam nepřidává zpátky ty otazníky, tečky a vykříčníky. A chybí tam poslední slovo, místo i > 0 bude i >= 0;

Nahoru Odpovědět
27.4.2013 19:43
Neaktivní uživatelský účet
Avatar
ngo.andrej
Člen
Avatar
ngo.andrej:27.4.2013 19:49

Omlouvám se, dobrý už to funguje. Ale problém ještě v tom aby mi to otisklo stejnou interpunkci. Nevíte někdo, jak to aplikovat?

 
Nahoru Odpovědět
27.4.2013 19:49
Avatar
Odpovídá na ngo.andrej
Michael Olšavský:27.4.2013 19:56

co třeba zkontrolavat, jestli se v dane casti vety vyskytuje carka a tu pak presunout na konec ;-)

 
Nahoru Odpovědět
27.4.2013 19:56
Avatar
Odpovídá na ngo.andrej
Neaktivní uživatel:27.4.2013 20:02

Nejlepší to bude projít cyklem, ukládat si postupně všechny čárky, tečky a tyhle blbosti třeba do zásobníku který by pro to byl úplně ideální, nebo do listu, a při výpisu je dávat mezi ty jednodlivý položky :)

Nahoru Odpovědět
27.4.2013 20:02
Neaktivní uživatelský účet
Avatar
ngo.andrej
Člen
Avatar
Odpovídá na Neaktivní uživatel
ngo.andrej:27.4.2013 20:20

No já to stejně nechápu, jak bych to poté vyvolal přesně na to stejné místo, kam to patří? To mi vrtá hlavou..

 
Nahoru Odpovědět
27.4.2013 20:20
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na ngo.andrej
Petr Nymsa:27.4.2013 20:25

Použiješ zásobník :). Zásobník tak , že oc jde první tam, dje poslední ven. Tj nejdříve projedeš cyklem větu, naházíš do zásobníku charů znaky, poté použiješ Misazuv příklad -> rozplituješ na pole větu, projedeš opět cyklem a za každou část (resp. každý index) vyndáš prvek ze zásobníku a hotovo :)

Nahoru Odpovědět
27.4.2013 20:25
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na ngo.andrej
Petr Nymsa:27.4.2013 20:39

Sice to nedělám moc rád, ale posílám funkční řešení. Pokus se pochopit jak to funguje ;) A ty další záležitosti zvládneš :)

Stack<char> znaky = new Stack<char>();
           string veta = "Ahoj jak se jmenuješ ? Jmenuji se Tomáš ! Já také.";
           char[] set = new char[3] { '.', '!', '?' };

           foreach (char p in veta)
           {
               if (p == '.' || p == '!' || p == '?')
                   znaky.Push(p);
           }

           string[] pole = veta.Split(set,StringSplitOptions.RemoveEmptyEntries);
           string output = "";
           for (int i = pole.Length-1; i >= 0; i--)
           {
               if (znaky.Count > 0)
                   output += pole[i] + znaky.Pop();
               else output += pole[i];
           }

           Console.WriteLine(output);
Nahoru Odpovědět
27.4.2013 20:39
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
ngo.andrej
Člen
Avatar
Odpovídá na Petr Nymsa
ngo.andrej:27.4.2013 20:52

Páni. Tleskám, a velké DÍKY!

 
Nahoru Odpovědět
27.4.2013 20:52
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na ngo.andrej
Petr Nymsa:27.4.2013 20:54

Rádo se stalo

Nahoru Odpovědět
27.4.2013 20:54
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na ngo.andrej
Neaktivní uživatel:27.4.2013 20:57

Nechci rejpat, ale hezčí v tom vypisovacím foru místo

if(znaky.Count > 0)
  output += pole[i] + znaky.Pop();
else output += pole[i];

bude toto:

output += pole[i];
if (znaky.Count > 0) output += znaky.Pop();

Jenom aby ten kód byl 130% dokonalý :D

Nahoru Odpovědět
27.4.2013 20:57
Neaktivní uživatelský účet
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 25 zpráv z 25.