Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

"objasnjenje code-a"

[es] :: C/C++ programiranje :: C/C++ za početnike :: "objasnjenje code-a"

[ Pregleda: 1675 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

sammo

Član broj: 127354
Poruke: 64
78.104.132.*



Profil

icon "objasnjenje code-a"18.11.2010. u 22:40 - pre 163 meseci
#include <iostream>
using namespace std;
char str[]="FELD";
int f(int k) {
if (str[k]=='\0')
return 0;
cout << str[k];
int res = 2+f((k+2)%5);
cout << str[k];
return res;
}
int main() {
cout << f(1);
return 0;
}
rezultat: EDFLLFDE8

molim za objasnjenje code , razumijem ga jednim djelom a to je dok ne ispise EDFL , a nakon ovo sto je u IF postaje true onda ide na return 0; sta se tad desava ,
hvala.
 
Odgovor na temu

sammo

Član broj: 127354
Poruke: 64
78.104.132.*



Profil

icon Re: "objasnjenje code-a"18.11.2010. u 23:03 - pre 163 meseci
#include <iostream>
using namespace std;
char arr[] = "STRING";
void out(int pos) {
if (!arr[pos]) {
return;
}
else {
out(pos + 2);
cout << arr[pos];
}
}
int main()
{
out (0);
return 0;
}
rezultat: NRS
kao i ovaj , sta se zapravo tu desava???
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
212.200.65.*

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: "objasnjenje code-a"19.11.2010. u 08:17 - pre 163 meseci
U ovom kodu, koji je ocigledno rekurzija:
Citat:

Code:

#include <iostream>
using namespace std;
char str[]="FELD";
int f(int k) {
if (str[k]=='\0')
return 0;
cout << str[k];
int res = 2+f((k+2)%5);
cout << str[k];
return res;
}
int main() {
cout << f(1); 
return 0;
}
rezultat: EDFLLFDE8


... treba da zapazis par detalja:
1. ispis (cout) u samoj rekurzivnoj funkciji, pre ulaska u rekurziju (int res = 2+f((k+2)%5);)
2. ispis (cout) u samoj rekurzivnoj funkciji, posle rekurzije
3. konacno, ispis (cout) u main funkciji

Tako da se tvoj rezultat moze rasclaniti na 3 segmenta:EDFL LFDE 8, pa je lakse da razumes sta se i kada desava.

Uslov za "izlazak" iz prvog segmenta je (str[k]=='\0'), nakon cega se ide na deo ispod samog poziva rekurzije u funkciji (drugi segment). S obzirom da je ispis IDENTICAN, razlika ce biti samo u OBRNUTOM redosledu (EDFL <---> LFDE).

Treci segment, osmica (2 + 2 + 2 + 2) je: Broj ciklusa (4) * konstanta (2).

Zapazi da izmedju konstante % 5 i char str[]="FELD" postoji veza ( 5 == strlen(str) + 1), pa je to bolje sistemski resavati, a ne ovako "magicnim brojevima"


Ako ne mozes da pratis rekurziju, napravi sebi neki define makro (MY_TRACE), pa testiraj. Kada ne zelis makro, samo ga preimenuj MY_TRACE -> MY_TRACE1, i nece se videti suvisno.

Code:

#include <iostream>
using namespace std;
char str[]="FELD";

#define MY_TRACE

#ifdef MY_TRACE
int brojac_prolaza=0;
#endif

int f(int k)
{
#ifdef MY_TRACE
    cout << endl << ++brojac_prolaza << ". prolaz" << endl;
    cout << "FUNKCIJA f(" << k << ")" << endl;
    if (str[k]=='\0')
    {
        cout << "str[" << k << "]=='\\0'" << endl;
        cout << endl << "povratak, ispis je isti (cout << str[k]), samo ide unazad" << endl << endl;
    }
#endif

    if (str[k]=='\0')
        return 0;

#ifdef MY_TRACE
    cout << "PRVI cout() : ";
#endif
    cout << str[k];
#ifdef MY_TRACE
    cout << endl;
#endif

    int res = 2 + f((k+2)%5);
#ifdef MY_TRACE
    cout << "RES = 2 + f((" << k << "+2)%5) = " << res << endl ;
#endif

#ifdef MY_TRACE
    cout << "DRUGI cout() : ";
#endif
    cout << str[k];
#ifdef MY_TRACE
    cout << endl << endl;
#endif

    return res;
}
int main()
{
    cout << f(1);
    return 0;

}
//rezultat: EDFLLFDE8



 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: "objasnjenje code-a"

[ Pregleda: 1675 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.