Rucno rjesavanje petlji?

poruka: 3
|
čitano: 1.126
|
moderatori: XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
neaktivan
offline
Rucno rjesavanje petlji?

Evo ovako. Zadatak je da rucno rijesimo for i do-while petlje gdje ja uvijek zapnem u odredjenim. Konkretni primjeri:

 

char s[ ] = "RAST";

int k = 1;

do {

cout << s[k];

k = (k + 2)%5;

} while (s[k] != '\0');

 

Rjesenje ovdje je ATRS. Kontam za ATR. Jednostavno, 1%5=A, 3%5=T, 4%5=R, ali ne kontam kako se dobije ovo S na kraju.

 

Sljedeca koju ne kontam je ova:

 

char s[ ] = "RAST";

char *p = s;

for (int k=0; k<2; k=k+1) {

cout << p;

p = p + 1;

Kako se dodje do rjesenja RASTAST?

 

Ili neku od ovih:

 

int a[] = {1,7,4,2};

int *p = a;

p = p + *p;

*p = 47;

int i=0;

for (; i<4; i=i+1)

cout << a[i];

 

Rjesenje: 14742

 

char s[] = "STAND";

int k, n;

for (k=0; k<2; k=k+1)

for (n=4; s[n]!=s[k]; n=n-1)

cout << s[n];

cout << k;

cout << n;

 

Rjesenje: DNATDNA21

 

 

Znaci, ako neko, bilo ko, zna objasniti korak po korak postupak kako se dodje do ovih rjesenja, bio bih mu puno zahvalan, jer mi se zaista ne uci ovo napamet, a cijeli dan rjesavam bezbroj petlji, ali na ovim nemam ideje kako ovi rezultati (ili jedan dio rezultata, kako gdje).

 

 

Loyal to the game
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Re: Rucno rjesavanje petlji?
Simon Ghost Riley kaže...

char s[ ] = "RAST";

int k = 1;

do {

cout << s[k];

k = (k + 2)%5;

} while (s[k] != '\0');

 

Rjesenje ovdje je ATRS. Kontam za ATR. Jednostavno, 1%5=A, 3%5=T, 4%5=R, ali ne kontam kako se dobije ovo S na kraju.

k=1
s[1]='A'

k=(1+2)%5   -> k=3
s[3]='T'

k=(3+2)%5   -> k=0
s[0]='R'

k=(0+2)%5   -> k=2
s[0]='S'

k=(2+2)%5   -> k=4
s[4]='\0'

 

Simon Ghost Riley kaže...

char s[ ] = "RAST";

char *p = s;

for (int k=0; k<2; k=k+1) {

cout << p;

p = p + 1;

Kako se dodje do rjesenja RASTAST?

p=s
*p="RAST"

*p+1="AST"

 

Simon Ghost Riley kaže...

int a[] = {1,7,4,2};

int *p = a;

p = p + *p;

*p = 47;

int i=0;

for (; i<4; i=i+1)

cout << a[i];

 

Rjesenje: 14742

p=a   //p pokazuje na prvi element polja 'a'

p=p+1 //pokazivač se uveća za vrijednost na koju pokazuje, a to je prvi element
      //polja 'a' odnosno broj 1. Dakle 'p' se uveća za jedan čime pokazuje na
      //drugi element polja 'a'
     
*p=47 //drugi element polja 'a' dobiva vrijednost 47

//dakle sada polje 'a' ima ove vrijednosti:
a[0]=1
a[1]=47
a[2]=4
a[3]=2

//jasnije sada odakle dolazi "14742"?

 

Simon Ghost Riley kaže...

char s[] = "STAND";

int k, n;

for (k=0; k<2; k=k+1)

for (n=4; s[n]!=s[k]; n=n-1)

cout << s[n];

cout << k;

cout << n;

 

Rjesenje: DNATDNA21

------------
k=0
n=4

s[k] nije jednako s[n]
s[4]='D'
------------
k=0
n=n-1 -> n=3

s[k] nije jednako s[n]
s[3]='N'
------------
k=0
n=n-1 -> n=2

s[k] nije jednako s[n]
s[2]='A'
------------
k=0
n=n-1 -> n=1

s[k] nije jednako s[n]
s[1]='T'
------------
k=0
n=n-1 -> n=0

s[k] je jednak s[n]
kraj unutarnje petlje
------------
k=k+1 -> k=1
n=4

s[k] nije jednako s[n]
s[4]='D'
------------
k=1
n=n-1 -> n=3

s[k] nije jednako s[n]
s[3]='N'
------------
k=1
n=n-1 -> n=2

s[k] nije jednako s[n]
s[2]='A'
------------
k=1
n=n-1 -> n=1

s[k] je jednak s[n]
kraj unutarnje petlje
------------
k=k+1 -> k=2

k nije manji od 2
kraj vanjske petlje
------------
k = 2
n = 1

 

Obično praćenje toka petlje u glavi. Trebaš samo malo koncentracije i poznavanje jednog dijela jezika (konretnije petlje, polja i pokazivači).

 

Ako ti je baš tako teško, pokreni debugger i varaj... :P

0xBADC0DE
15 godina
neaktivan
offline
Re: Rucno rjesavanje petlji?
@rustweaver
Da, jednostavno sam malo bio premoren, pa mi se cinilo komlikovano puno. Jutros sam uranio da malo sve ponovim, i znao sam i ono sto nisam mislio da znam, i evo dobio sam rezultate testa. 80% bodova cime sam vrlo zadovoljan. Hvala na odgovoru u svakom slucaju.
Loyal to the game
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice