Wpis z mikrobloga

#naukaprogramowania #cpp #programowanie

Mirki, byłby ktoś tak dobry i wytłumaczył mi dlaczego ten kod działa:

int mait();
{
unsigned t,p,w;
for(cin>>t;t--;cout<<((int)pow(p%10,1+(3+w)%4))%10<>p>>w;

return 0;
}

t - liczba testów, p - podstawa potęgi, w - wykładnik. Jestem początkujący. Jest to jedno z zadań ze SPOJa ale konkretna treść nie ma znaczenia. I stety/niestety szukając pomocy trafiłem na gotowe rozwiązanie. Do sedna. Próbuje w 100% zrozumieć działanie tej pętli. Bo wygląda ona nieco "dziwnie" w porównaniu do tych podstawowych. Próbuję ją napisać po swojemu - też nie idzie. A nie wrzucę przecież tego na SPOJa żeby mieć zaliczone zadanie :D
  • 14
wytłumaczył mi dlaczego ten kod działa


@idler: a dlaczego miałby nie działać? Zobacz sobie co się wsadza do pętli for i porównaj z tym co jest napisane w tym programie.

for (instrukcja_inicjalizująca ; warunek ; instrukcja wykonywania po każdej iteracji)
@qweasdqweasd: @PanWitold: No właśnie chodzi mi o tę nieczytelność. Na drugim miejscu jest warunek (według definicji for), a w tym kodzie, który wstawiłem jest instrukcja wykonywania po każdej pętli - w tym przypadku dekrementacja t. Na trzecim jest wynik, który chcę otrzymać. I nie ma go w instrukcji pętli tylko "w niej". Dlatego ciężko mi to rozkminić.
Na drugim miejscu jest warunek (według definicji for), a w tym kodzie, który wstawiłem jest instrukcja wykonywania po każdej pętli - w tym przypadku dekrementacja t.


@idler: dekrementacja, która jest również warunkiem
Czyli teraz rozumiem to tak: pętla startuje od wprowadzonego t. Następnie po każdym wykonaniu te maleje o jeden i wyświetlany jest wynik. A gdzie warunek kończący wykonywanie się pętli?
@PanWitold: Pewnie, że czytałem. Już zanim to wrzuciłem tutaj. "Porozciągałem" to sobie żeby zrozumieć:

int main()
{
unsigned t,p,w;
cin>>t;
for (t;t--;)
{
cin>>p>>w;
cout<<((int)pow(p%10,1+(3+w)%4))%10<0; t--;) to też działa ale przy (t; t>=0; t--;) pętla hula w nieskończoność. :D
według definicji nie ma tutaj warunku kończącego pętlę


@idler: no to źle przeczytałeś, bo jest warunek.

ale przy (t; t>=0; t--;) pętla hula w nieskończoność. :D


bo masz unsigned
@idler:

1. W for możesz pominąć dowolny element, po prostu go nie wstawiając. I tak np. for(;;) będzie pętlą nieskończoną. Natomiast int i = 4; for(;--i;); ma takie samo działanie jak for(int i = 4; --i;). Różnica jest taka, że w drugim przypadku scope (zakres) zmiennej i jest tylko wewnątrz ciała pętli.
2. for (int i = 5; --i;) wywoła pętle for aż warunek stopu, czyli środkowy element for-a (do
@virgoerns: Czyli w moim przypadku warunkiem kończącym pracę pętli jest t--, a pętla się przerywa kiedy t osiągnie wartość 0. Dzięki :D
A drugie pytanie: jak to jest z tym umieszczeniem cout'a w nagłówku pętli zamiast w ciele skoro ma to być niejako wynikiem działania pętli? Tego jeszcze do końca nie rozumiem.
@idler: Formalnie pętlę for możemy zapisać tak: attr for (init ; condition ; expr) statement
(Pomijamy to, czym jest attr, ale jeśli chcesz doczytać, to proszę bardzo: http://en.cppreference.com/w/cpp/language/attributes

"expr" - ostatni element nagłówka for-a (czyli ten cout) jest po prostu wyrażeniem, które ma się wykonać po ciele pętli określonej przez "statement". Innymi słowy, takiego for-a możemy zapisać w postaci równoważnej pętli while:

{
init ;
while (condition)
{
statement
expr ;
@virgoerns: Dzięki wielkie. Właśnie z powodu tego, że nie widziałem o tym co napisałeś nie mogłem zrozumieć tej pętli bo na pierwszy rzut oka była napisana "dziwnie" względem tej najbardziej elementarnej i pokazywanej w przykładach.