Cyklus - vysvětlete mi to – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Cyklus - vysvětlete mi to – C / C++ – Fórum – Programujte.comCyklus - vysvětlete mi to – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Ondra
~ Anonymní uživatel
236 příspěvků
11. 7. 2012   #1
-
0
-

Takže to já chápu takto:

#include <iostream>
#include <cstring>
const int ArSize = 20;
int main()
{
    using namespace std;
    cout << "Zadejte slovo: ";
    string word;
    cin >> word;
    
    // fyzicky modifikuje pole
    char temp;
    int i, j;
    for (j=0, i = word.size() - 1; j < i; --i, ++j)
    {
        temp = word[i];
        word[i] = word[j];
        word[j] = temp;
    }
    cout << word << "\nKonec\n";
    
    system("PAUSE");
    return 0;
}

Zadám třebas slovo CISLO

Takže j se nastaví na nulu a i se nastaví na (5-1) čtyři, poračujeme k vyhodnocování:

j < i, to znamená že 0 < 4, je to pravda, takže se provede příkaz v cyklu, pokračujeme dál:

i se zmenší o jeden, takže i teď bude 3 a j bude 1, vyhodnocení:

1 < 3, souhlasí, provede se tělo cyklu, i se opět zmenší o jeden a k jéčku se připočte jednička, takže

2 < 2, nesouhlasí, konec cyklu.

Celkem se tedy provedou 2 cykly, jenže to na převrácení slova nestačí, protože slovo CISLO obsahuje 5 písmen.

Nahlásit jako SPAM
IP: 88.101.233.–
Reklama
Reklama
Ondra
~ Anonymní uživatel
236 příspěvků
11. 7. 2012   #2
-
0
-

a to const int ArSize = 20; ---- toho si nevšímejte, to je tam asi navíc úplně zbytečně

Nahlásit jako SPAM
IP: 88.101.233.–
vitamin+8
Grafoman
11. 7. 2012   #3
-
+2
-
Zajímavé

"CISLO" ma 5 pismen, co je neparny pocet. Takze prostredne pismeno by si musel prehodit same zo sebou co je zbitocne, ale ak to chces tak mozes pouzit:

 j <= i

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Ondra
~ Anonymní uživatel
236 příspěvků
11. 7. 2012   #4
-
-3
-
Otravné

#3 vitamin
Noaco že je to nepatrný počet. Na počtu vůbec nezáleží ty ňoumo jeden. Radši buď sticha.

Nahlásit jako SPAM
IP: 88.101.233.–
ingiraxo+15
Grafoman
11. 7. 2012   #5
-
0
-

Hlavně ten cyklus vymyslel nějakej ****, to je zbytečně složitý.. halvně cyklus musí projít 2x, (jak psal vitamin) pokud vstup je CISLO, protože prohazuješ poslední s prvnim a ten se zveda o 1 (poslední se snižuje o 1), takže se jeden průchod vlastně zvedne o 2 jakoby.. jinak cyklus by měl vypadat...

string str = "CISLO";

for (int i = 0; i < str.length() / 2; i++)
{
    char tmp = str[i];
    str[i] = str[str.length() - i - 1];
    str[str.length() - i - 1] = tmp;
}

a jestli délka textu je sudá nebo lichá, na tom vůbec nezáleží

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Ondra
~ Anonymní uživatel
236 příspěvků
11. 7. 2012   #6
-
0
-

#5 ingiraxo
No fajn, ale jakto že program slovo CISLO převrátil celé?

Nahlásit jako SPAM
IP: 88.101.233.–
Ondra
~ Anonymní uživatel
236 příspěvků
11. 7. 2012   #7
-
0
-

#5 ingiraxo
To je jen takovej ukázkovej program abych se to naučil, mě je ukradený jestli to jde líp.

Nahlásit jako SPAM
IP: 88.101.233.–
vitamin+8
Grafoman
11. 7. 2012   #8
-
+1
-
Zajímavé

#7 Ondra
Tvoj program funguje ako ma, podla mna je lepsi ako ten od ingiraxo-na lbo nemusis v kazdom cykle robit posuvanie indexov. 

V kazdom cykle sa vymenia 2 pismena, takze ak mas "CISLO", tak sa ti za 2 cykli vymenia 4 pismena a ostane 1 nezmenene, preto som do toho plietol parnost...

inak staci napisat toto a vykaslat sa na cykly:

word = string ( word.rbegin(), word.rend() );

A ňouma si ty  

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ingiraxo+15
Grafoman
11. 7. 2012   #9
-
0
-

#8 vitamin
můj cyklus je jednodušší, on používá jeden int "j" zbytečně, když stačí jeden a indexy se posouvaj vždy ;)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
yaqwsx+9
Posthunter
11. 7. 2012   #10
-
0
-

#4 Ondra
I ty ňoumo jeden; nepárný znamená ve slovenštině lichý...

Nahlásit jako SPAM
IP: 85.160.50.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
TheOndrap+2
Super člen
11. 7. 2012   #11
-
0
-

:D mě fascinuje, že chce něco vysvětlit, čemu nerozumí a bude tady nazývat "stálý členy", kteří neváhají invertovat svůj čas na vysvětlování leckdy banalit, ňoumama :D

Nahlásit jako SPAM
IP: 88.102.250.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
TheOndrap+2
Super člen
11. 7. 2012   #12
-
0
-

btw já teda se nechci nějak vnucovat, ale podle mě máš chybu už v položené otázce. Kolik bys chtěl iterací na prohození písmen? Podle mě je to počet_pismen/2 zaokrouhleno dolu. Takže pro "CISLO" = zaokr_dolu(5/2) = 2, "KAMENI" = zaokr_dolu(6/2) = 3.

A cyklus který si napsal ty a ingiraxo jsou v podstatě uplně stejný a ten tvůj je asi i lepší. Jde tam o to, že inkrementace i,j bude vždycky lepší, než v každé iteraci přepočítávat str.lenght(), jako to dělá ingiraxo.

Nebo myslíš že ne?

Nahlásit jako SPAM
IP: 88.102.250.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
ingiraxo+15
Grafoman
12. 7. 2012   #13
-
0
-

#12 TheOndrap
samozřejmě jsem si nad cyklem mohl uchovat velikost pole, abych nemusel stále zjišťovat délku, ale to uz jsou detaily optimalizace, šlo mi spíš o princip, že lepší je délka/2 místo 2 proměnných pro preikrementaci a predekrementaci v cyklu

a imho str.length()/size() pouze vytáhne velikost z ukazatele kde se uchovává velikost pole (tvoří se s polem na pozadí), takže nepřepočitává celý pole, to by bylo dost neefektivní, aby pro pole s velikosti 1M prvků to prošlo celý pole jen kvůli zjištění dělky a tím chci říst, že by to na výkonu nemělo ztácet

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
TheOndrap+2
Super člen
12. 7. 2012   #14
-
0
-

#13 ingiraxo
To máš určitě pravdu.

Odběhneme-li od tématu, tak to ale určitě je funkce a ty určitě víš, co všechno se musí vykonat pro to když program začne vykonávat funkci (že to má nějakej overhead).

Ale samozřejmě máš pravdu, velikost pole (stringu) je uložený číslo, nepřepočítává se :)

Nahlásit jako SPAM
IP: 88.102.250.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
vitamin+8
Grafoman
12. 7. 2012   #15
-
0
-

Ked uz sa zaoberate takymi detailami tak extremne setrenie miesta na lokalnom stacku je zbytocne. Miesto pouzitia jedneh intu "navyse" musis pouzit na indexaciu vyraz: 

str.length() - i - 1

Ktory aj ked bude prekladacom super optimalizovany tak si vytvori minimalne 1 pomocnu premennu ako vysledok.

Tak ci tak nic neusetris :)

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ofice
~ Anonymní uživatel
1 příspěvek
12. 7. 2012   #16
-
0
-

#9 ingiraxo
Myslim si ze tvuj kod neni o moc lepsi i kdyz je citelnejsi. Urcite by bylo lepsi si vydeleni delky pole a taky samotnou delku pole dat do promenne pred cyklus, aby se porad nemusela vykonavat stejna operace.

Nahlásit jako SPAM
IP: 85.207.17.–
ingiraxo+15
Grafoman
12. 7. 2012   #17
-
0
-

#16 ofice
napřed si přečti co se tu psalo než něco napíšeš... pokud zjištění dělky dáš před nebo do cyklu, je jedno, na rychlosti se nic nemění a výsledek js srovnatelnej.. jen já dělim délku textu 2 a on použivá 2 proměnný...

a myslim, že bych to uzavřel, téma dávno vyřešeno =)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 112 hostů

Podobná vlákna

While vysvetlete — založil Hranicarrr

Cyklus — založil Elendor

Cyklus while — založil pep

Cyklus for — založil vojta

Cyklus — založil Mike

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý